⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zzdp.c

📁 ZIGBEE 2006协议栈 BAT测试代码 RADIO PULSE MG2455
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 + -