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

📄 zzdp.c

📁 ZIGBEE 2006协议栈 BAT测试代码 RADIO PULSE MG2455
💻 C
📖 第 1 页 / 共 2 页
字号:


#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 + -