📄 zzdp.c
字号:
pOutZDP->Msg.SIMP_DESC_RSP.DescBuf[N+0] = ZDO_CNF.SimpDesc[i].InClusList[k];
pOutZDP->Msg.SIMP_DESC_RSP.DescBuf[N+1] = ZDO_CNF.SimpDesc[i].InClusList[k] >> 8;
N += 2;
}
#endif
pOutZDP->Msg.SIMP_DESC_RSP.DescBuf[N+0] = ZDO_CNF.SimpDesc[i].NumOutClus;
N++;
#if (CONF_ZDO_MaxSize_SimpDescOutClus)
for(k=0 ; k<ZDO_CNF.SimpDesc[i].NumOutClus ; k++)
{
pOutZDP->Msg.SIMP_DESC_RSP.DescBuf[N+0] = ZDO_CNF.SimpDesc[i].OutClusList[k];
pOutZDP->Msg.SIMP_DESC_RSP.DescBuf[N+1] = ZDO_CNF.SimpDesc[i].OutClusList[k] >> 8;
N += 2;
}
#endif
pOutZDP->Msg.SIMP_DESC_RSP.Length = N;
return (N+5);
}
UINT8 ZZDP_PROC_ACTIVE_EP_REQ(UINT8 *pReqAsdu, UINT8 *pRspAsdu)
{
UINT8 i;
UINT8 cnt;
UINT8 ZdpLen;
ZDPS_PAY *pInZDP;
ZDPS_PAY *pOutZDP;
pInZDP = (ZDPS_PAY *)pReqAsdu;
pOutZDP = (ZDPS_PAY *)pRspAsdu;
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.ACTIVE_EP_REQ.NwkAddr), 0);
pOutZDP->Seq = pInZDP->Seq;
pOutZDP->Msg.ACTIVE_EP_RSP.NwkAddr = pInZDP->Msg.ACTIVE_EP_REQ.NwkAddr;
pOutZDP->Msg.ACTIVE_EP_RSP.ActiveEpCnt = 0;
pOutZDP->Msg.ACTIVE_EP_RSP.Sta = zdpSTA_SUCCESS;
Swap_Buffer_2B( (UINT8 *) &(pOutZDP->Msg.ACTIVE_EP_RSP.NwkAddr), 0);
// (1) Check Cache list. In here, no cache and return ERROR
if(pInZDP->Msg.ACTIVE_EP_REQ.NwkAddr != NIB.nwkShortAddr)
{
pOutZDP->Msg.ACTIVE_EP_RSP.Sta = zdpSTA_DEV_NOT_FOU;
return 5;
}
cnt = 0;
for(i=0 ; i<CONF_ZDO_MaxSize_SimpDesc ; i++)
{
if(ZDO_CNF.SimpDesc[i].EnaSD)
{
pOutZDP->Msg.ACTIVE_EP_RSP.ActiveEpList[cnt] = ZDO_CNF.SimpDesc[i].EP;
cnt++;
}
if(cnt == CONF_ZDO_MaxSize_ActEPList) break;
}
pOutZDP->Msg.ACTIVE_EP_RSP.ActiveEpCnt = cnt;
ZdpLen = 5 + cnt;
return ZdpLen;
}
//-- RETURN : pOutZDP->Msg.MATCH_DESC_RSP.MatchLen
UINT8 MATCH_CRITERION(ZDPS_PAY *pInZDP, ZDPS_PAY *pOutZDP, UINT8 SimpDescNum)
{
UINT8 i;
UINT8 k;
UINT8 N;
UINT8 BigLoopOut;
pOutZDP->Msg.MATCH_DESC_RSP.MatchLen = 0;
if(pInZDP->Msg.MATCH_DESC_REQ.ProfileID != ZDO_CNF.SimpDesc[SimpDescNum].AppProID) return 0;
#if (CONF_ZDO_MaxSize_SimpDescInClus)
// Check InCluster
BigLoopOut = 0;
N = 0;
for(i=0 ; i<pInZDP->Msg.MATCH_DESC_REQ.NumInClus ; i++)
{
for(k=0 ; k<ZDO_CNF.SimpDesc[SimpDescNum].NumInClus ; k++)
{
if(pInZDP->Msg.MATCH_DESC_REQ.InClusList[i] == ZDO_CNF.SimpDesc[SimpDescNum].InClusList[k])
{
pOutZDP->Msg.MATCH_DESC_RSP.MatchList[N] = ZDO_CNF.SimpDesc[SimpDescNum].EP;
pOutZDP->Msg.MATCH_DESC_RSP.MatchLen++;
if(pOutZDP->Msg.MATCH_DESC_RSP.MatchLen==CONF_ZDO_MaxSize_MatchList)
{
BigLoopOut = 1;
break;
}
}
}
if(BigLoopOut) break;
}
if(pOutZDP->Msg.MATCH_DESC_RSP.MatchLen==CONF_ZDO_MaxSize_MatchList)
{
return pOutZDP->Msg.MATCH_DESC_RSP.MatchLen;
}
#endif
#if (CONF_ZDO_MaxSize_SimpDescOutClus)
// Check OutCluster
BigLoopOut = 0;
N = 0;
for(i=0 ; i<pInZDP->Msg.MATCH_DESC_REQ.NumOutClus ; i++)
{
for(k=0 ; k<ZDO_CNF.SimpDesc[SimpDescNum].NumInClus ; k++)
{
if(pInZDP->Msg.MATCH_DESC_REQ.InClusList[i] == ZDO_CNF.SimpDesc[SimpDescNum].InClusList[k])
{
pOutZDP->Msg.MATCH_DESC_RSP.MatchList[N] = ZDO_CNF.SimpDesc[SimpDescNum].EP;
pOutZDP->Msg.MATCH_DESC_RSP.MatchLen++;
if(pOutZDP->Msg.MATCH_DESC_RSP.MatchLen==CONF_ZDO_MaxSize_MatchList)
{
BigLoopOut = 1;
break;
}
}
}
if(BigLoopOut) break;
}
#endif
return pOutZDP->Msg.MATCH_DESC_RSP.MatchLen;
}
UINT8 ZZDP_PROC_MATCH_DESC_REQ(UINT8 *pReqAsdu, UINT8 *pRspAsdu)
{
UINT8 i;
UINT8 DevType;
UINT8 ZdpLen;
UINT8 MyChild;
UINT8 SimpDescAvail;
ZDPS_PAY *pInZDP;
ZDPS_PAY *pOutZDP;
pInZDP = (ZDPS_PAY *)pReqAsdu;
pOutZDP = (ZDPS_PAY *)pRspAsdu;
pOutZDP->Seq = pInZDP->Seq;
pOutZDP->Msg.MATCH_DESC_RSP.Sta = zdpSTA_SUCCESS;
pOutZDP->Msg.MATCH_DESC_RSP.NwkAddr = pInZDP->Msg.MATCH_DESC_REQ.NwkAddr;
pOutZDP->Msg.MATCH_DESC_RSP.MatchLen = 0;
//pOutZDP->Msg.MATCH_DESC_RSP.MatchList
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.MATCH_DESC_REQ.NwkAddr), 2);
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.MATCH_DESC_REQ.ProfileID), 2);
for(i=0 ; i<pInZDP->Msg.MATCH_DESC_REQ.NumInClus ; i++)
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.MATCH_DESC_REQ.InClusList[i]), 2);
for(i=0 ; i<pInZDP->Msg.MATCH_DESC_REQ.NumOutClus ; i++)
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.MATCH_DESC_REQ.OutClusList[i]), 2);
MyChild = 0;
SimpDescAvail = 0;
DevType = ZDO_CNF.NodeDesc.Avail_Type & 0x07;
ZdpLen = 4;
if(pInZDP->Msg.MATCH_DESC_REQ.NwkAddr == nBROAD_RXON)
{
// Match Criterion
ZdpLen = MATCH_CRITERION(pInZDP, pOutZDP, 0) + 5;
if(ZdpLen == 5) pOutZDP->Msg.MATCH_DESC_RSP.Sta = zdpSTA_NO_DESCRIPT;
if(DevType==0 || DevType==1)
{
// Match Criterion about NodeDescriptor for MyChild
}
}
else
{
if(pInZDP->Msg.MATCH_DESC_REQ.NwkAddr == NIB.nwkShortAddr)
{
// Match Criterion
ZdpLen = MATCH_CRITERION(pInZDP, pOutZDP, 0) + 5;
if(ZdpLen == 5) pOutZDP->Msg.MATCH_DESC_RSP.Sta = zdpSTA_NO_DESCRIPT;
}
else
{
if(DevType == 2)
{
pOutZDP->Msg.MATCH_DESC_RSP.Sta = zdpSTA_INV_REQTYPE;
}
else
{
if(MyChild)
{
if(SimpDescAvail)
{
// Match Criterion about NodeDescriptor for MyChild
}
else
{
pOutZDP->Msg.MATCH_DESC_RSP.Sta = zdpSTA_NO_DESCRIPT;
}
}
else
{
pOutZDP->Msg.MATCH_DESC_RSP.Sta = zdpSTA_DEV_NOT_FOU;
}
}
}
}
return ZdpLen;
}
UINT8 ZZDP_PROC_SYS_SERV_DISC_REQ(UINT8 *pReqAsdu, UINT8 *pRspAsdu)
{
UINT16 CompareMask;
ZDPS_PAY *pInZDP;
ZDPS_PAY *pOutZDP;
pInZDP = (ZDPS_PAY *)pReqAsdu;
pOutZDP = (ZDPS_PAY *)pRspAsdu;
Swap_Buffer_2B( (UINT8 *) &(pInZDP->Msg.SYS_SERV_DISC_REQ.ServerMask), 0);
CompareMask = ZDO_CNF.NodeDesc.ServerMask & pInZDP->Msg.SYS_SERV_DISC_REQ.ServerMask;
if(CompareMask)
{
pOutZDP->Seq = pInZDP->Seq;
pOutZDP->Msg.SYS_SERV_DISC_RSP.Sta = zdpSTA_SUCCESS;
pOutZDP->Msg.SYS_SERV_DISC_RSP.ServerMask = CompareMask;
Swap_Buffer_2B( (UINT8 *) &(pOutZDP->Msg.SYS_SERV_DISC_RSP.ServerMask), 0);
return 4;
}
else
{
return 0;
}
}
UINT8 Enable_ZDP_DATA_IND_For_Simulator = 0;
void ZZDP_APS_DATA_IND(APSDME_PKT *pInd)
{
APSDME_PKT L_ZDO2APS;
APSDME_PKT L_APS2ZDO;
UINT8 EnableRsp;
pInd = pInd;
if(Enable_ZDP_DATA_IND_For_Simulator)
{
memcpy(&UartOut.PKT.Arguments[0], (UINT8 *) &(pInd->DATA_IND.DstMode), 28);
if( (UartOut.PKT.Arguments[0]==1) || (UartOut.PKT.Arguments[0]==2) )
Swap_Buffer_2B(UartOut.PKT.Arguments, 1);
if( (UartOut.PKT.Arguments[10]==1) || (UartOut.PKT.Arguments[10]==2) )
Swap_Buffer_2B(UartOut.PKT.Arguments, 11);
Swap_Buffer_2B(UartOut.PKT.Arguments, 20);
Swap_Buffer_2B(UartOut.PKT.Arguments, 22);
memcpy(&UartOut.PKT.Arguments[28], pInd->DATA_IND.pasdu, pInd->DATA_IND.asduLen);
UartOut.PKT.Size = pInd->DATA_IND.asduLen + 28;
UartOut.LEN = UartOut.PKT.Size + 4;
UartOut.PKT.layer = APS_LAYER;
UartOut.PKT.Opcode = A_DATA_OPC;
UartOut.PKT.Type = IND_TYPE;
ZSYS_UART_API_SEND();
}
if(pInd->DATA_IND.ClusID & 0x8000) // Case : Rx-Response
EnableRsp = 0;
else EnableRsp = 1; // Case : Rx-Request
L_ZDO2APS.DATA_REQ.DstEP = pInd->DATA_IND.SrcEP;
L_ZDO2APS.DATA_REQ.DstMode = pInd->DATA_IND.SrcMode;
L_ZDO2APS.DATA_REQ.DstAdd_U.Short = pInd->DATA_IND.SrcAdd_U.Short;
L_ZDO2APS.DATA_REQ.pasdu = ZDO_ASDU.Buff;
L_ZDO2APS.DATA_REQ.ProfileID = pInd->DATA_IND.ProfileID;
L_ZDO2APS.DATA_REQ.Radius = 0;
L_ZDO2APS.DATA_REQ.SrcEP = pInd->DATA_IND.DstEP;
L_ZDO2APS.DATA_REQ.TxOption = 0;
switch(pInd->DATA_IND.ClusID)
{
//======================================================
case aCID_Nwk_Addr_Req :
L_ZDO2APS.DATA_REQ.ClusID = aCID_Nwk_Addr_Rsp;
L_ZDO2APS.DATA_REQ.asduLen = ZZDP_PROC_NWK_ADDR_REQ(pInd->DATA_IND.pasdu, &ZDO_ASDU.Buff);
if(L_ZDO2APS.DATA_REQ.asduLen == 0) EnableRsp = 0;
break;
case aCID_Nwk_Addr_Rsp :
break;
//======================================================
case aCID_IEEE_Addr_Req :
L_ZDO2APS.DATA_REQ.ClusID = aCID_IEEE_Addr_Rsp;
L_ZDO2APS.DATA_REQ.asduLen = ZZDP_PROC_IEEE_ADDR_REQ(pInd->DATA_IND.pasdu, &ZDO_ASDU.Buff);
if(L_ZDO2APS.DATA_REQ.asduLen == 0) EnableRsp = 0;
break;
case aCID_IEEE_Addr_Rsp :
break;
//======================================================
case aCID_Node_Desc_Req :
L_ZDO2APS.DATA_REQ.ClusID = aCID_Node_Desc_Rsp;
L_ZDO2APS.DATA_REQ.asduLen = ZZDP_PROC_NODE_DESC_REQ(pInd->DATA_IND.pasdu, &ZDO_ASDU.Buff);
break;
case aCID_Node_Desc_Rsp :
break;
//======================================================
case aCID_Power_Desc_Req :
L_ZDO2APS.DATA_REQ.ClusID = aCID_Power_Desc_Rsp;
L_ZDO2APS.DATA_REQ.asduLen = ZZDP_PROC_POWER_DESC_REQ(pInd->DATA_IND.pasdu, &ZDO_ASDU.Buff);
break;
case aCID_Power_Desc_Rsp :
break;
//======================================================
case aCID_Simp_Desc_Req :
L_ZDO2APS.DATA_REQ.ClusID = aCID_Simp_Desc_Rsp;
L_ZDO2APS.DATA_REQ.asduLen = ZZDP_PROC_SIMP_DESC_REQ(pInd->DATA_IND.pasdu, &ZDO_ASDU.Buff);
break;
case aCID_Simp_Desc_Rsp :
break;
//======================================================
case aCID_Active_EP_Req :
L_ZDO2APS.DATA_REQ.ClusID = aCID_Active_EP_Rsp;
L_ZDO2APS.DATA_REQ.asduLen = ZZDP_PROC_ACTIVE_EP_REQ(pInd->DATA_IND.pasdu, &ZDO_ASDU.Buff);
break;
case aCID_Active_EP_Rsp :
break;
//======================================================
case aCID_Match_Desc_Req :
L_ZDO2APS.DATA_REQ.ClusID = aCID_Active_EP_Rsp;
L_ZDO2APS.DATA_REQ.asduLen = ZZDP_PROC_MATCH_DESC_REQ(pInd->DATA_IND.pasdu, &ZDO_ASDU.Buff);
break;
case aCID_Match_Desc_Rsp :
break;
//======================================================
case aCID_Sys_Serv_Disc_Req :
L_ZDO2APS.DATA_REQ.TxOption = 0x04; // AckReq=1
L_ZDO2APS.DATA_REQ.ClusID = aCID_Sys_Serv_Disc_Rsp;
L_ZDO2APS.DATA_REQ.asduLen = ZZDP_PROC_SYS_SERV_DISC_REQ(pInd->DATA_IND.pasdu, &ZDO_ASDU.Buff);
if(L_ZDO2APS.DATA_REQ.asduLen == 0) EnableRsp = 0;
break;
case aCID_Sys_Serv_Disc_Rsp :
break;
//======================================================
case aCID_End_Device_Ann :
ZZDP_PROC_DEV_ANNCE_IND(pInd->DATA_IND.pasdu);
EnableRsp = 0;
break;
//======================================================
case aCID_End_Device_Bind_Req :
break;
case aCID_End_Device_Bind_Rsp :
break;
//======================================================
case aCID_Bind_Req :
L_ZDO2APS.DATA_REQ.ClusID = aCID_Bind_Rsp;
L_ZDO2APS.DATA_REQ.asduLen = ZZDP_PROC_BIND_REQ(pInd->DATA_IND.pasdu, &ZDO_ASDU.Buff);
break;
case aCID_Bind_Rsp :
break;
//======================================================
default : EnableRsp = 0; break;
//======================================================
}
if(EnableRsp)
{
ZAPS_DATA_REQ(&L_ZDO2APS, &L_APS2ZDO);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -