📄 zzdp.c
字号:
#include "INCLUDE_TOP.h"
#include "C_MAC/INCLUDE_MAC.h"
#include "C_NWK/INCLUDE_NWK.h"
#include "C_APS/INCLUDE_APS.h"
#include "C_Builder/ZZDO_CONF.h"
#include "C_Builder/ZZDO_TYPE.h"
#include "C_Builder/ZZDO.h"
#include "C_UTIL/UTIL.h"
S_ASDU ZDO_ASDU;
UINT8 ZZDP_PROC_BIND_REQ(UINT8 *pReqAsdu, UINT8 *pRspAsdu)
{
pReqAsdu = pReqAsdu;
pRspAsdu = pRspAsdu;
return 0;
}
void ZZDP_PROC_DEV_ANNCE_IND(UINT8 *pIndAsdu)
{
UINT8 i;
UINT8 Match;
for(i=0 ; i<APA.SIZE_AM ; i++)
{
Match = memcmp(AIB.papsAddrMap[i].IEEEAddr, &pIndAsdu[3], 8);
if( (AIB.papsAddrMap[i].EnaAM) && (Match==0) ) break;
}
if(i==APA.SIZE_AM) // No matched Address
{
for(i=0 ; i<APA.SIZE_AM ; i++)
{
if(AIB.papsAddrMap[i].EnaAM == 0) break;
}
if(i==APA.SIZE_AM)
{
}
else
{
AIB.papsAddrMap[i].EnaAM = 1;
AIB.papsAddrMap[i].NwkAddr = (pIndAsdu[2] << 8) | pIndAsdu[1];
memcpy(AIB.papsAddrMap[i].IEEEAddr, (pIndAsdu+3), 8);
}
}
else
{
AIB.papsAddrMap[i].NwkAddr = (pIndAsdu[2] << 8) | pIndAsdu[1];
}
}
UINT8 ZZDP_PROC_NWK_ADDR_REQ(UINT8 *pReqAsdu, UINT8 *pRspAsdu)
{
UINT8 N;
UINT8 i;
UINT8 ZdpLen;
UINT8 DevType;
ZDPS_PAY *pInZDP;
ZDPS_PAY *pOutZDP;
pInZDP = (ZDPS_PAY *)pReqAsdu;
pOutZDP = (ZDPS_PAY *)pRspAsdu;
// No swap is needed in pInZDP
pOutZDP->Seq = pInZDP->Seq;
pOutZDP->Msg.NWK_ADDR_RSP.Sta = zdpSTA_SUCCESS;
p_Qword2ByteArray(MPIB.IEEE_ExtendAddr, pOutZDP->Msg.NWK_ADDR_RSP.IEEEAddr);
pOutZDP->Msg.NWK_ADDR_RSP.NwkAddr = NIB.nwkShortAddr;
pOutZDP->Msg.NWK_ADDR_RSP.NumAssoDev = 0;
pOutZDP->Msg.NWK_ADDR_RSP.StartIdx = pInZDP->Msg.NWK_ADDR_REQ.StartIdx;
Swap_Buffer_2B((UINT8 *)&(pOutZDP->Msg.NWK_ADDR_RSP.NwkAddr), 0);
// Comare requested IEEE Address with My IEEE or IEEE list in the Discovery Cache
// In here, there is no Discovery Cache. So, compare to My IEEE
if(memcmp(pInZDP->Msg.NWK_ADDR_REQ.IEEEAddr, pOutZDP->Msg.NWK_ADDR_RSP.IEEEAddr, 8) )
{
return 0; // it means no response
}
ZdpLen = 12;
if(pInZDP->Msg.NWK_ADDR_REQ.ReqType == REQTYPE_SINGLE)
{
}
else if(pInZDP->Msg.NWK_ADDR_REQ.ReqType == REQTYPE_EXTEND)
{
N = 0;
DevType = ZDO_CNF.NodeDesc.Avail_Type & 0x07;
if( (pInZDP->Msg.NWK_ADDR_REQ.StartIdx < APA.SIZE_AM)
&& (DevType==0 || DevType==1) )
{
for(i=pInZDP->Msg.NWK_ADDR_REQ.StartIdx ; i<APA.SIZE_AM ; i++)
{
if(AIB.papsAddrMap[i].EnaAM)
{
pOutZDP->Msg.NWK_ADDR_RSP.NwkAddrAssoDevList[N] = AIB.papsAddrMap[i].NwkAddr;
Swap_Buffer_2B((UINT8 *) &(pOutZDP->Msg.NWK_ADDR_RSP.NwkAddrAssoDevList[N]), 0);
N++;
}
if(N == CONF_ZDO_MaxSize_AssoDevList) break;
}
}
if(N)
{
pOutZDP->Msg.NWK_ADDR_RSP.NumAssoDev = N;
ZdpLen = 2*N + 2; // NumAsso, StartIdx Field
}
else
{
ZdpLen++; // NumAsso Field
}
}
else
{
pOutZDP->Msg.NWK_ADDR_RSP.Sta = zdpSTA_INV_REQTYPE;
}
return ZdpLen;
}
UINT8 ZZDP_PROC_IEEE_ADDR_REQ(UINT8 *pReqAsdu, UINT8 *pRspAsdu)
{
UINT8 i;
UINT8 N;
UINT8 ZdpLen;
UINT8 DevType;
ZDPS_PAY *pInZDP;
ZDPS_PAY *pOutZDP;
pInZDP = (ZDPS_PAY *)pReqAsdu;
pOutZDP = (ZDPS_PAY *)pRspAsdu;
pOutZDP->Seq = pInZDP->Seq;
pOutZDP->Msg.IEEE_ADDR_RSP.Sta = zdpSTA_SUCCESS;
p_Qword2ByteArray(MPIB.IEEE_ExtendAddr, pOutZDP->Msg.IEEE_ADDR_RSP.IEEEAddr);
pOutZDP->Msg.IEEE_ADDR_RSP.NwkAddr = pInZDP->Msg.IEEE_ADDR_REQ.NwkAddr;
pOutZDP->Msg.IEEE_ADDR_RSP.NumAssoDev = 0;
pOutZDP->Msg.IEEE_ADDR_RSP.StartIdx = pInZDP->Msg.IEEE_ADDR_REQ.StartIdx;
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.IEEE_ADDR_REQ.NwkAddr), 0);
// Comare requested NWK Address with My NwkAddr or Child's Nwk Address
// In here, there is no Discovery Cache. So, compare to My IEEE
if(pInZDP->Msg.IEEE_ADDR_REQ.NwkAddr != NIB.nwkShortAddr)
{
return 0;
}
ZdpLen = 12;
if(pInZDP->Msg.IEEE_ADDR_REQ.ReqType == REQTYPE_SINGLE)
{
}
else if(pInZDP->Msg.IEEE_ADDR_REQ.ReqType == REQTYPE_SINGLE)
{
N = 0;
DevType = ZDO_CNF.NodeDesc.Avail_Type & 0x07;
if( (pInZDP->Msg.IEEE_ADDR_REQ.StartIdx < APA.SIZE_AM)
&& (DevType==0 || DevType==1) )
{
for(i=pInZDP->Msg.IEEE_ADDR_REQ.StartIdx ; i<APA.SIZE_AM ; i++)
{
if(AIB.papsAddrMap[i].EnaAM)
{
pOutZDP->Msg.IEEE_ADDR_RSP.NwkAddrAssoDevList[N] = AIB.papsAddrMap[i].NwkAddr;
Swap_Buffer_2B((UINT8 *) &(pOutZDP->Msg.IEEE_ADDR_RSP.NwkAddrAssoDevList[N]), 0);
N++;
}
if(N == CONF_ZDO_MaxSize_AssoDevList) break;
}
}
if(N)
{
pOutZDP->Msg.NWK_ADDR_RSP.NumAssoDev = N;
ZdpLen = 2*N + 2; // NumAsso, StartIdx Field
}
else
{
ZdpLen++; // NumAsso Field
}
}
else
{
pOutZDP->Msg.IEEE_ADDR_RSP.Sta = zdpSTA_INV_REQTYPE;
}
return ZdpLen;
}
UINT8 ZZDP_PROC_NODE_DESC_REQ(UINT8 *pReqAsdu, UINT8 *pRspAsdu)
{
UINT8 ZdpLen;
UINT8 DevType;
UINT8 MyChild;
UINT8 DescAvail;
ZDPS_PAY *pInZDP;
ZDPS_PAY *pOutZDP;
pInZDP = (ZDPS_PAY *)pReqAsdu;
pOutZDP = (ZDPS_PAY *)pRspAsdu;
pOutZDP->Seq = pInZDP->Seq;
pOutZDP->Msg.NODE_DESC_RSP.Sta = zdpSTA_SUCCESS;
pOutZDP->Msg.NODE_DESC_RSP.NwkAddr = pInZDP->Msg.NODE_DESC_REQ.NwkAddr;
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.NODE_DESC_REQ.NwkAddr), 0);
MyChild = 0;
DescAvail = 0;
ZdpLen = 4;
if(pInZDP->Msg.NODE_DESC_REQ.NwkAddr == NIB.nwkShortAddr)
{
memcpy(pOutZDP->Msg.NODE_DESC_RSP.DescBuf, (UINT8 *) &(ZDO_CNF.NodeDesc), sizeof(ZS_NodeDesc));
Swap_Buffer_2B(pOutZDP->Msg.NODE_DESC_RSP.DescBuf, 3);
Swap_Buffer_2B(pOutZDP->Msg.NODE_DESC_RSP.DescBuf, 6);
Swap_Buffer_2B(pOutZDP->Msg.NODE_DESC_RSP.DescBuf, 8);
ZdpLen += sizeof(ZS_NodeDesc);
}
else
{
DevType = ZDO_CNF.NodeDesc.Avail_Type & 0x07;
if(DevType==0 || DevType==1)
{
// Check REQ.NwkAddr is MyChild ???
if(MyChild)
{
// Check Node Descriptor for MyChid is Available ???
if(DescAvail)
{
// Copy Node Descriptor
}
else
{
pOutZDP->Msg.NODE_DESC_RSP.Sta = zdpSTA_NO_DESCRIPT;
}
}
else
{
pOutZDP->Msg.NODE_DESC_RSP.Sta = zdpSTA_DEV_NOT_FOU;
}
}
else
{
pOutZDP->Msg.NODE_DESC_RSP.Sta = zdpSTA_INV_REQTYPE;
}
}
return ZdpLen;
}
UINT8 ZZDP_PROC_POWER_DESC_REQ(UINT8 *pReqAsdu, UINT8 *pRspAsdu)
{
UINT8 ZdpLen;
UINT8 DevType;
UINT8 MyChild;
UINT8 DescAvail;
ZDPS_PAY *pInZDP;
ZDPS_PAY *pOutZDP;
pInZDP = (ZDPS_PAY *)pReqAsdu;
pOutZDP = (ZDPS_PAY *)pRspAsdu;
pOutZDP->Seq = pInZDP->Seq;
pOutZDP->Msg.POWER_DESC_RSP.Sta = zdpSTA_SUCCESS;
pOutZDP->Msg.POWER_DESC_RSP.NwkAddr = pInZDP->Msg.POWER_DESC_REQ.NwkAddr;
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.POWER_DESC_REQ.NwkAddr), 0);
MyChild = 0;
DescAvail = 0;
ZdpLen = 4;
if(pInZDP->Msg.POWER_DESC_REQ.NwkAddr == NIB.nwkShortAddr)
{
pOutZDP->Msg.POWER_DESC_RSP.DescBuf[0] = ZDO_CNF.PowerDesc.AvailPwrSrc_CurrPwrMode;
pOutZDP->Msg.POWER_DESC_RSP.DescBuf[1] = ZDO_CNF.PowerDesc.CurrPwrLevel_CurrPwrSrc;
ZdpLen += 2;
}
else
{
DevType = ZDO_CNF.NodeDesc.Avail_Type & 0x07;
if(DevType==0 || DevType==1)
{
// Check REQ.NwkAddr is MyChild ???
if(MyChild)
{
// Check Power Descriptor for MyChid is Available ???
if(DescAvail)
{
// Copy Power Descriptor
}
else
{
pOutZDP->Msg.POWER_DESC_RSP.Sta = zdpSTA_NO_DESCRIPT;
}
}
else
{
pOutZDP->Msg.POWER_DESC_RSP.Sta = zdpSTA_DEV_NOT_FOU;
}
}
else
{
pOutZDP->Msg.POWER_DESC_RSP.Sta = zdpSTA_INV_REQTYPE;
}
}
return ZdpLen;
}
UINT8 ZZDP_PROC_SIMP_DESC_REQ(UINT8 *pReqAsdu, UINT8 *pRspAsdu)
{
UINT8 i;
UINT8 N;
UINT8 k;
ZDPS_PAY *pInZDP;
ZDPS_PAY *pOutZDP;
pInZDP = (ZDPS_PAY *)pReqAsdu;
pOutZDP = (ZDPS_PAY *)pRspAsdu;
pOutZDP->Seq = pInZDP->Seq;
pOutZDP->Msg.SIMP_DESC_RSP.Sta = zdpSTA_SUCCESS;
pOutZDP->Msg.SIMP_DESC_RSP.NwkAddr = pInZDP->Msg.SIMP_DESC_REQ.NwkAddr;
pOutZDP->Msg.SIMP_DESC_RSP.Length = 0;
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.SIMP_DESC_REQ.NwkAddr), 0);
if(pInZDP->Msg.SIMP_DESC_REQ.NwkAddr != NIB.nwkShortAddr)
{
pOutZDP->Msg.SIMP_DESC_RSP.Sta = zdpSTA_DEV_NOT_FOU;
return 5;
}
for(i=0 ; i<CONF_ZDO_MaxSize_SimpDesc ; i++)
{
if( (ZDO_CNF.SimpDesc[i].EnaSD)
&& (ZDO_CNF.SimpDesc[i].EP == pInZDP->Msg.SIMP_DESC_REQ.EP) )
{
break;
}
}
if(i == CONF_ZDO_MaxSize_SimpDesc)
{
pOutZDP->Msg.SIMP_DESC_RSP.Sta = zdpSTA_INV_EP;
return 5;
}
N = 0;
memcpy( &(pOutZDP->Msg.SIMP_DESC_RSP.DescBuf[N]), (UINT8 *)&(ZDO_CNF.SimpDesc[i].EP), 6);
Swap_Buffer_2B(&(pOutZDP->Msg.SIMP_DESC_RSP.DescBuf[N]), 1);
Swap_Buffer_2B(&(pOutZDP->Msg.SIMP_DESC_RSP.DescBuf[N]), 3);
N += 6;
pOutZDP->Msg.SIMP_DESC_RSP.DescBuf[N+0] = ZDO_CNF.SimpDesc[i].NumInClus;
N++;
#if ( CONF_ZDO_MaxSize_SimpDescInClus)
for(k=0 ; k<ZDO_CNF.SimpDesc[i].NumInClus ; k++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -