z_user_bat.c

来自「ZIGBEE 2006协议栈 BAT测试代码 RADIO PULSE MG245」· C语言 代码 · 共 782 行 · 第 1/2 页

C
782
字号
		if(NWK2APS.NET_DISC_CON.NwkCount == 0)	return;

		// NWK-JOIN
		zPrintf(1, "\n [USER] NWK-JOIN.req");

		// Before beginning JOIN, PAN seleting is needed.
		// In here, first Descriptor is selected
		
		ZDO_CNF.NwkMode.BO = (NWK2APS.NET_DISC_CON.pZNET[0].SO_BO);
		ZDO_CNF.NwkMode.SO = (NWK2APS.NET_DISC_CON.pZNET[0].SO_BO & 0xF0) >> 4;
		memcpy(ZDO_CNF.NwkMode.EPID, APS2NWK.JOIN_REQ.EPID, 8);
		ZDO_CNF.NwkMode.ProVer = (NWK2APS.NET_DISC_CON.pZNET[0].BeaPayload.Z2006.Ver_Stack & 0xF0) >> 4;
		ZDO_CNF.NwkMode.StackProf = (NWK2APS.NET_DISC_CON.pZNET[0].BeaPayload.Z2006.Ver_Stack & 0x0F);			

		memcpy(APS2NWK.JOIN_REQ.EPID, NWK2APS.NET_DISC_CON.pZNET[0].BeaPayload.Z2006.EPID, 8);

		if( (ZDO_CNF.NodeDesc.Avail_Type & 0x07) == 0x01)	
				APS2NWK.JOIN_REQ.JoinAsRou = 1;
		else		APS2NWK.JOIN_REQ.JoinAsRou = 0;
		APS2NWK.JOIN_REQ.MACSecure = (ZDO_CNF.NodeDesc.MacCapa & 0x40) >> 6;
		APS2NWK.JOIN_REQ.PwrSrc = (ZDO_CNF.NodeDesc.MacCapa & 0x04) >> 2;
		APS2NWK.JOIN_REQ.Rejoin = 0;
		APS2NWK.JOIN_REQ.RxOnIdle = (ZDO_CNF.NodeDesc.MacCapa & 0x08) >> 3;
		APS2NWK.JOIN_REQ.ScanChan = ZDO_CNF.NwkMode.ChanList;
		APS2NWK.JOIN_REQ.ScanDur = 0x04;
		ZNWK_JOIN_REQ(&APS2NWK, &NWK2APS);
		zPrintf(1, " => STA=%02x",(short)NWK2APS.JOIN_CON.Sta);

		if(NWK2APS.JOIN_CON.Sta != nSTA_SUCCESS)	return;
		
		zPrintf(1, "\n PanID=%04x, ShortAddr=%04x",NWK2APS.JOIN_CON.PanID, NWK2APS.JOIN_CON.ShortAddr);			

		if(APS2NWK.JOIN_REQ.JoinAsRou)
		{
			// NWK-START-ROUTER
			zPrintf(1, "\n [USER] START-ROUTER.req");
			APS2NWK.START_ROU_REQ.BattExtend = ZDO_CNF.NwkMode.BattExt;
			APS2NWK.START_ROU_REQ.BO = ZDO_CNF.NwkMode.BO;
			APS2NWK.START_ROU_REQ.SO = ZDO_CNF.NwkMode.SO;
			ZNWK_START_ROUTE_REQ(&APS2NWK, &NWK2APS);
			
			NIB.nwkNetBroadDeliverTime = ZDO_CNF.NwkBroadDeliverTime;		// second
			NIB.nwkTransPersisTime = ZDO_CNF.NwkTransPersistTime;			// superframe

			ZDO_CNF.NodeDesc.Avail_Type &= ~0x07;		// bit[2:0]=0
			ZDO_CNF.NodeDesc.Avail_Type |= 0x01;		// I am ZR

			// NWK-PERMIT-JOIN
			ZDO_CNF.PermitJoinDuration = 0xFF;
			zPrintf(1, "\n [USER] NWK-PERMIT.req");
			APS2NWK.PERMIT_JOIN_REQ.PermitDur = ZDO_CNF.PermitJoinDuration;
			ZNWK_PERMIT_JOIN_REQ(&APS2NWK, &NWK2APS);
			zPrintf(1, " => STA=%02x",(short)NWK2APS.PERMIT_JOIN_CON.Sta);

			zPrintf(1, "\n => ZR-INIT Completed");
		}
		else
		{
			zPrintf(1, "\n => ZED-INIT Completed");
		}
					
		// END-DEVICE-ANNCE						
		APP_ASDU.ZDP.Seq = ++APP_DSN;
		APP_ASDU.ZDP.Msg.END_DEV_ANNCE.NwkAddr = NIB.nwkShortAddr;
		memcpy(APP_ASDU.ZDP.Msg.END_DEV_ANNCE.IEEEAddr, MPIB.IEEE_ExtendAddr, 8);
		APP_ASDU.ZDP.Msg.END_DEV_ANNCE.Capa = NIB.nwkCapaInfo;
		Swap_Buffer_2B( (UINT8 *)&(APP_ASDU.ZDP.Msg.END_DEV_ANNCE.NwkAddr), 0);
		
		APP2APS.DATA_REQ.asduLen = 12;						
		APP2APS.DATA_REQ.pasdu = APP_ASDU.Buff;
		APP2APS.DATA_REQ.ClusID = aCID_End_Device_Ann;
		APP2APS.DATA_REQ.DstAdd_U.Short = 0xFFFF;
		APP2APS.DATA_REQ.DstEP = EndpointZDO;
		APP2APS.DATA_REQ.DstMode = 0x02;
		APP2APS.DATA_REQ.ProfileID = ProfileZDP;
		APP2APS.DATA_REQ.Radius = USER_RADIUS;
		APP2APS.DATA_REQ.SrcEP = EndpointZDO;
		APP2APS.DATA_REQ.TxOption = 0;

		ZAPS_DATA_REQ(&APP2APS, &APS2APP);
		zPrintf(1, "\n END-Annce, STA=%02x",(short)APS2APP.DATA_CON.Sta);

		ZSYS_DATABASE_SAVE();
	}


	switch(MainPS)
	{
		case 0 :					
			if(NIB.DEVTYPE != 'N')
			{
				ZSYS_UserTimer16_SET(500);
				MainPS = 1;
			}
			break;
		case 1 :
			if(ZSYS_UserTimer16_GET() == 0)	MainPS = 2;
			break;
		case 2 :
			APS2NWK.SYNC_REQ.Track = 0;
			ZNWK_SYNC_REQ(&APS2NWK, &NWK2APS);
			zPrintf(1, "\n SYNC-REQ. Sta = %02x",(short)NWK2APS.SYNC_CON.Sta);

			if(NWK2APS.SYNC_CON.Sta == nSTA_SUCCESS)
			{
				ZSYS_UserTimer16_SET(100);
				MainPS = 3;
			}
			else
			{
				MainPS = 4;
			}
			break;
		case 3 :	if(ZSYS_UserTimer16_GET() == 0)	MainPS = 4;
			break;
		case 4 :
			zPrintf(1, "\n PowerDown");
			ZSYS_PowerDown(3, 1);			
			zPrintf(1, " ==> Wake");

			if(GP07 == 0)	MainPS = 5;
			else			MainPS = 2;
			break;
		case 5 :	
			zPrintf(1, "\n PowerDown is disabled for 5 sec");
			ZSYS_UserTimer16_SET(5000);	
			MainPS = 6;	
			break;
		case 6 : 
			if(INT_EXT1)
			{
				INT_EXT1 = 0;
				ZSYS_DATABASE_CLEAR();
				zPrintf(1, "\n INT_EXT");
			}

			if(ZSYS_UserTimer16_GET() == 0)	MainPS = 2;
			break;
			
			
		default : MainPS = 0;	break;
	}
	
}


void ZUSER_APS_CON(APSDME_PKT *pAPS2NWK, UINT8 Idx)
{
	pAPS2NWK = pAPS2NWK;
	Idx = Idx;
}

void ZUSER_NWK_CON(NLDME_PKT *pNWK2APS, UINT8 Idx)
{
	pNWK2APS = pNWK2APS;
	
	zPrintf(1, "\n");
	zPrintf(1, "\n [USER] NWK-CON. ID=%02x",(short)Idx);
}

void ZUSER_OOB_DATA_IND(MCPS_DATA_IND *pInd, UINT8 OobIndex)
{
	zPrintf(1, "\n");
	zPrintf(1, "\n [RX-USER-OOB] OOB=%02x",(short)OobIndex);
	zPrintf(1, "\n LEN = %02x, LQI = %02x",(short)pInd->msduLength,(short)pInd->msduLinkQuality);
	Display_Buffer(pInd->pmsdu, pInd->msduLength, 1);	
}

//- RETURN
//	1	: Processing is completed
//	0	: Not Processed.

//- FifoQ
//	0	: Low MAC RXFIFO. (0x00 ~ 0x7F)
//	1	: High MAC RXFIFO. (0x80 ~ 0xFF)

//- MsduIdx	: MRxFIFO pointer of 1st MSDU data
UINT8 ZUSER_OOB_RF_ISR(UINT8 OobCode, UINT8 FifoQ, UINT8 MsduRP)
{
	OobCode = OobCode;
	FifoQ = FifoQ;
	MsduRP = MsduRP;
	
	return	0;
}

void ZUSER_NWK_JOIN_IND(NLDME_PKT *pInd)
{
	zPrintf(1, "\n");
	zPrintf(1, "\n NWK-JOIN-IND, Addr=%04x",pInd->JOIN_IND.ShortAddr);

	ZSYS_DATABASE_SAVE();
}

void ZUSER_NWK_ROUTE_ERR_IND(NLDME_PKT *pInd)
{
	pInd = pInd;
	zPrintf(1, "\n");
	zPrintf(1, "\n NWK-ROUTE-ERR-IND");
}

void ZUSER_NWK_SYNC_IND(NLDME_PKT *pInd)
{
	pInd = pInd;
	zPrintf(1, "\n");
	zPrintf(1, "\n NWK-SYNC-IND");
}

void ZUSER_NWK_LEAVE_IND(NLDME_PKT *pInd)
{
	zPrintf(1, "\n");
	zPrintf(1, "\n NWK-LEAVE-IND. Addr[0]=%02x, Rejoin=%02x",
		(short)pInd->LEAVE_IND.DevAddr[0], (short)pInd->LEAVE_IND.Rejoin);

	ZSYS_DATABASE_SAVE();
}


void ZUSER_APS_DATA_IND(APSDME_PKT *pInd)
{

	ZCLS_HEAD	ZCL_HEAD;	
	UINT16	ClusID;
	UINT8	Endpoint;
	UINT16	ProfileID;
	UINT8	*pRspAsdu;		// Pointer to Response ASDU
	UINT8	RspAsduLen;		// Length of Response ASDU

	ATTRIBUTE_U8	OnOffAttribute;
	UINT8			ZH_LEN;

	ProfileID = pInd->DATA_IND.ProfileID;
	Endpoint = pInd->DATA_IND.DstEP;
	ClusID = pInd->DATA_IND.ClusID;

	zPrintf(1, "\n [USER] APS-DATA-IND(dBm=%02d) : asduLen=%02x",(short)pInd->DATA_IND.dBm, (short)pInd->DATA_IND.asduLen);
	zPrintf(1, "\n ProfileID=%04x, EP=%02x, ClusID=%04x",ProfileID, (short)Endpoint, ClusID);		

	pRspAsdu = APP_ASDU.Buff;		// Response ASDU
	RspAsduLen = 0;

	//-------------------------------------------------------------------------
	//	Check ProfileID/Endpoint with those of Simple Descriptors
	//-------------------------------------------------------------------------
	if(	(ZDO_CNF.SimpDesc[0].EnaSD)
	&&	(Endpoint == ZDO_CNF.SimpDesc[0].EP)
	&&	(ProfileID == ZDO_CNF.SimpDesc[0].AppProID) )
	{
		// Simple Descriptor - EP 0x01 - On/Off Door
		zPrintf(1, "\n SimpDesc No.0 - On/Off Door");

		ZCL_HEAD.FC.All = pInd->DATA_IND.pasdu[0];		
		if(ZCL_HEAD.FC.b.Manufact)		// Manufacturer Specific
		{
			ZCL_HEAD.ManuCode = (pInd->DATA_IND.pasdu[2] << 8) | pInd->DATA_IND.pasdu[1];
			ZCL_HEAD.SeqNum = pInd->DATA_IND.pasdu[3];
			ZCL_HEAD.CmdID = pInd->DATA_IND.pasdu[4];
			ZH_LEN = 5;
		}
		else
		{
			ZCL_HEAD.SeqNum = pInd->DATA_IND.pasdu[1];
			ZCL_HEAD.CmdID = pInd->DATA_IND.pasdu[2];
			ZH_LEN = 3;
		}


		//-------------------------------------------------------------------------------------
		//	Cluster Processing - OnOff
		//-------------------------------------------------------------------------------------
		if(ClusID == ZDO_CNF.SimpDesc[0].InClusList[0])		// ProfileHA_DevDoorLock_ClusOnOff
		{
			if(	(ZCL_HEAD.CmdID == ZCL_CMD_WRITE)	|| (ZCL_HEAD.CmdID == ZCL_CMD_WRITE_NORESPONSE)
			||	(ZCL_HEAD.CmdID == ZCL_CMD_WRITE_UNDIVIDE) )
			{
				OnOffAttribute.ID = (pInd->DATA_IND.pasdu[ZH_LEN+1] << 8) | (pInd->DATA_IND.pasdu[ZH_LEN]);
				OnOffAttribute.DType = pInd->DATA_IND.pasdu[ZH_LEN+2];
				OnOffAttribute.Value = pInd->DATA_IND.pasdu[ZH_LEN+3];			
			
				// Ignoring malformed packet
				if(pInd->DATA_IND.asduLen != (ZH_LEN+4) )
				{
					zPrintf(1, "\n ERROR : ASDU Length");
					return;
				}
				if(OnOffAttribute.DType != ProfileHA_DevDoorLock_ClusOnOff_AttOnOff_DTYPE)
				{
					zPrintf(1, "\n ERROR : Data Type");
					return;
				}

				// Action For Virtual Door
				if(OnOffAttribute.Value == ATT_OnOff_Off)
				{
					zPrintf(1, "\n DOOR-OFF(CLOSE)");
					ATT_OnOff.Value = ATT_OnOff_Off;
				}
				else if(OnOffAttribute.Value == ATT_OnOff_On)
				{
					zPrintf(1, "\n DOOR-ON(ON)");
					ATT_OnOff.Value = ATT_OnOff_On;
				}
				else if(OnOffAttribute.Value == ATT_OnOff_Toggle)
				{
					zPrintf(1, "\n DOOR-TOGGLE");
					ATT_OnOff.Value = !ATT_OnOff.Value;
				}
				else
				{
					RspAsduLen = 0;
					zPrintf(1, "\n ERROR : Attribute Data");
				}
				USER_DOOR = ATT_OnOff.Value;

				// Construct Response Packet
				if(ZCL_HEAD.CmdID != ZCL_CMD_WRITE_NORESPONSE)
				{
					// Make Response Packet
					memcpy(pRspAsdu, pInd->DATA_IND.pasdu, ZH_LEN);
					pRspAsdu[0] |= 0x10;		// Server To Client
					pRspAsdu[ZH_LEN-1] = ZCL_CMD_WRITE_RESPONSE;
					pRspAsdu[ZH_LEN+0] = zclSTA_SUCCESS;
					pRspAsdu[ZH_LEN+1] = OnOffAttribute.ID;
					pRspAsdu[ZH_LEN+2] = OnOffAttribute.ID >> 8;
					RspAsduLen = ZH_LEN + 3;
				}
			}			
			else if(ZCL_HEAD.CmdID == ZCL_CMD_READ)
			{
				OnOffAttribute.ID = (pInd->DATA_IND.pasdu[ZH_LEN+1] << 8) | (pInd->DATA_IND.pasdu[ZH_LEN]);
				if(pInd->DATA_IND.asduLen != (ZH_LEN+2) )
				{
					zPrintf(1, "\n ERROR : ASDU Length");
					return;	
				}

				zPrintf(1, "\n READ - AttributeValue = %02x",(short)ATT_OnOff.Value);
	
				// Construct Response Packet
				memcpy(pRspAsdu, pInd->DATA_IND.pasdu, ZH_LEN);
				pRspAsdu[ZH_LEN-1] = ZCL_CMD_WRITE_RESPONSE;
				pRspAsdu[0] |= 0x10;		// Server To Client
				pRspAsdu[ZH_LEN+0] = OnOffAttribute.ID;
				pRspAsdu[ZH_LEN+1] = OnOffAttribute.ID >> 8;
				pRspAsdu[ZH_LEN+2] = zclSTA_SUCCESS;
				pRspAsdu[ZH_LEN+3] = ProfileHA_DevDoorLock_ClusOnOff_AttOnOff_DTYPE;
				pRspAsdu[ZH_LEN+4] = ATT_OnOff.Value;				
				RspAsduLen = ZH_LEN + 5;
			}
			else
			{
				zPrintf(1, "\n ERROR : Unsupported Command");
			}		
		}		
		else
		{
			zPrintf(1, "\n ERROR : Invalid ClusterID");
		}
	}
	else
	{
		zPrintf(1, "\n ERROR : No Match Simple Descriptor");
	}

	//-------------------------------------------------------------------------
	//	Constructing APS-DATA-REQ primitive
	//-------------------------------------------------------------------------
	APP2APS.DATA_REQ.asduLen = RspAsduLen;
	APP2APS.DATA_REQ.pasdu = pRspAsdu;
	APP2APS.DATA_REQ.ClusID = pInd->DATA_IND.ClusID;
	APP2APS.DATA_REQ.DstEP = pInd->DATA_IND.SrcEP;
	APP2APS.DATA_REQ.DstMode = 2;
	APP2APS.DATA_REQ.DstAdd_U.Short = pInd->DATA_IND.SrcAdd_U.Short;
	APP2APS.DATA_REQ.ProfileID = pInd->DATA_IND.ProfileID;
	APP2APS.DATA_REQ.Radius = USER_RADIUS;
	APP2APS.DATA_REQ.SrcEP = pInd->DATA_IND.DstEP;
	APP2APS.DATA_REQ.TxOption = 0;

	if(RspAsduLen)
	{	
		zPrintf(1, "\n [USER] SEND-RSP");
		ZAPS_DATA_REQ(&APP2APS, &APS2APP);
		zPrintf(1, " => STA=%02x",(short)APS2APP.DATA_CON.Sta);
	}

	
		
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?