z_user_bat.c

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

C
782
字号


#include "INCLUDE_TOP.h"
#include "C_MAC/INCLUDE_MAC.h"
#include "C_NWK/INCLUDE_NWK.h"
#include "C_APS/INCLUDE_APS.h"

#include "C_HAL/UART.h"
#include "C_UTIL/UTIL.h"
#include "C_HAL/PHY.h"
#include "C_HAL/FLASH.h"
#include "C_HAL/TIMER.h"
#include "C_HAL/LCD.h"
#include "C_HAL/POWER.h"

#include "C_Builder/PROFILE.h"
#include "C_Builder/ZZDO_CONF.h"
#include "C_Builder/ZZDO_TYPE.h"
#include "C_Builder/ZZDO.h"
#include "Z_USER_DATA_CONF.h"
#include "Z_USER_DATA.h"

#define		USER_RADIUS	6
#define		USER_DOOR			GP34	// Virtual Door Lock. 0=OFF(Closed), 1=ON(Open)

typedef struct
{
	UINT16	ID;
	UINT8	DType;
	UINT8	Value;	
} ATTRIBUTE_U8;

	ATTRIBUTE_U8	ATT_OnOff;				// Refer to ZCL
		#define	ATT_OnOff_Off		0x00	// Refer to ZCL
		#define	ATT_OnOff_On		0x01	// Refer to ZCL
		#define	ATT_OnOff_Toggle	0x02	// Refer to ZCL
	
	UINT8	APP_DSN;
	S_ASDU	APP_ASDU;	
	UINT8	HIB_Enable;	

	HW_INFORMATION code 	HIB 			_at_ HIB_ADDRESS;
	FLASH_AREA		code		DATA_SAVE	_at_ INFO_ADDRESS;
	FLASH_AREA		DATA_COPY;

	extern	void ZSYS_TURBO_MODE_ENA(UINT8 TurboEna);
	extern	void ZSYS_SEC_MAC_CTR_SET(UINT8 Enable, UINT8 KeyNum, UINT8 *pKey, UINT8 *pNonceExtAddr);	
	extern	void ZSYS_UserTimer16_SET(UINT16 TickCount);
	extern	UINT16 ZSYS_UserTimer16_GET();

void ZSYS_DATABASE_READ()
{
	UINT16	Idx;	
	UINT16	MemSize;

	Idx = 0;

	// NIB
	memcpy( (UINT8 *)&(DATA_COPY.LayerInfo.NIB), (UINT8 *)&NIB, sizeof(NS_PIB));

	// MPIB
	memcpy( (UINT8 *)&(DATA_COPY.LayerInfo.MPIB), (UINT8 *)&MPIB, sizeof(MAC_INFORMATION_BASE));

	// PPIB
	memcpy( (UINT8 *)&(DATA_COPY.LayerInfo.PPIB), (UINT8 *)&PPIB, sizeof(PHY_INFORMATION_BASE));
	
	Idx += sizeof(NS_PIB) + sizeof(MAC_INFORMATION_BASE) + sizeof(PHY_INFORMATION_BASE);
	
	// NT
	MemSize = sizeof(NS_NT) * USER_SIZE_NWK_NT;
	memcpy(&DATA_COPY.BUFF[Idx], (UINT8 *)&(NPA.pnwkNT[0].IEEEAddr[0]), MemSize);
	Idx += MemSize;
	
	// RT
	MemSize = sizeof(NS_RT) * USER_SIZE_NWK_RT;
	memcpy(&DATA_COPY.BUFF[Idx], (UINT8 *)&(NPA.pnwkRT[0].DstAddr), MemSize);
	Idx += MemSize;

	// More data can be added to DATA_COPY to be saved.
	// But, the length of DATA_COPY is 512Bytes and data to be saved can't be overflowed.
}

void ZSYS_DATABASE_WRITE()
{
	UINT16	Idx;	
	UINT16	MemSize;

	Idx = 0;

	// NIB
	memcpy( (UINT8 *)&NIB, (UINT8 *)&(DATA_COPY.LayerInfo.NIB), sizeof(NS_PIB));

	// MPIB
	memcpy( (UINT8 *)&MPIB, (UINT8 *)&(DATA_COPY.LayerInfo.MPIB), sizeof(MAC_INFORMATION_BASE));

	// PPIB
	memcpy( (UINT8 *)&PPIB, (UINT8 *)&(DATA_COPY.LayerInfo.PPIB), sizeof(PHY_INFORMATION_BASE));
	
	Idx += sizeof(NS_PIB) + sizeof(MAC_INFORMATION_BASE) + sizeof(PHY_INFORMATION_BASE);
	
	// NT
	MemSize = sizeof(NS_NT) * USER_SIZE_NWK_NT;
	memcpy( (UINT8 *)&(NPA.pnwkNT[0].IEEEAddr[0]), &DATA_COPY.BUFF[Idx], MemSize);
	Idx += MemSize;
	
	// RT
	MemSize = sizeof(NS_RT) * USER_SIZE_NWK_RT;
	memcpy( (UINT8 *)&(NPA.pnwkRT[0].DstAddr), &DATA_COPY.BUFF[Idx], MemSize);
	Idx += MemSize;	
}


void ZSYS_DATABASE_SAVE()
{
	ZSYS_DATABASE_READ();
	ZHAL_FLASH_PAGE_WRITE(INFO_ADDRESS, DATA_COPY.BUFF);
}


void ZSYS_DATABASE_RECALL()
{
	UINT16	i;
	UINT8	code *pCodeBuf;
	UINT8	TempAddr[8];

	pCodeBuf = INFO_ADDRESS;
		
	for(i=0 ; i<512 ; i++)
	{
		DATA_COPY.BUFF[i] = pCodeBuf[i];
	}

	ZSYS_DATABASE_WRITE();

	// H/W Setting
	if(MPIB.EnablePanCoordi)
			ZHAL_MAC_CTRL_SET(0x1E);
	else		ZHAL_MAC_CTRL_SET(0x16);

	ZHAL_CHANNEL_SET(PPIB.phyCurrentChannel);
	ZHAL_PAN_ID_SET(MPIB.macPANId);
	ZHAL_TXPOWER_SET(PPIB.phyTransmitPower);	
	ZHAL_SHORT_ADDR_SET(MPIB.macShortAddr);

	p_Qword2ByteArray(MPIB.IEEE_ExtendAddr, TempAddr);	
	ZHAL_IEEE_ADDR_SET(TempAddr);
}

void ZSYS_DATABASE_CLEAR()
{
	ZNWK_RESET_REQ();
	ZSYS_DATABASE_READ();
	ZHAL_FLASH_PAGE_WRITE(INFO_ADDRESS, DATA_COPY.BUFF);
}


	
void ZUSER_HW_INIT()
{
	UINT8	HW_Mode_19MHz;
	UINT8	HW_Mode_VoltChange;

	//	HIB Copy
	if(ZSYS_HIB_COPY((UINT8 *)&DATA_COPY.DataHIB))
			HIB_Enable = 1;
	else		HIB_Enable = 0;

	HW_Mode_19MHz = 0;
	HW_Mode_VoltChange = 0;
	if(HIB_Enable)
	{
		// 19.2MHz XTAL Clock
		if(DATA_COPY.DataHIB.Reserved_1[0] & 0x01)	HW_Mode_19MHz = 1;
		
		if( (DATA_COPY.DataHIB.PowerID == 0x18) && (xCHIPID != 0x91) )		HW_Mode_VoltChange = 1;
		if( (DATA_COPY.DataHIB.PowerID == 0x15) && (xCHIPID == 0x91) )		HW_Mode_VoltChange = 1;
	}
	ZHAL_HW_INIT(HW_Mode_19MHz, HW_Mode_VoltChange);
	
}

void ZUSER_INIT()
{
	UINT16	Input;
	UINT16	RandomSeed;
	UINT8	UserKey0[16];
	UINT8	NonceExtAddr[8];

	ZSYS_RemoveWarning_UTIL_Function();

	// [STEP 1] Interrupt Enable/Disable
	ZHAL_UART1_SET(1, 1, 115200, 0x80);
	ZHAL_TIMER1_SET(1, 0, 1, 1);
	ZHAL_EXT0_INT_SET(1, 0, 1);
	ZHAL_EXT1_INT_SET(1, 0, 1);

	// [STEP 2] SET : GPIO IN/OUT Direction
	ZHAL_PORT3_INOUT_SET(4, 1);	GP34 = 0;	// Output
	ZHAL_PORT3_INOUT_SET(5, 1);	GP35 = 0;	// Output
	ZHAL_PORT3_INOUT_SET(6, 1);	GP36 = 0;	// Output
	ZHAL_PORT3_INOUT_SET(7, 1);	GP37 = 0;	// Output

	// [STEP 3] Initializing ZDO
	ZZDO_INIT_CONFIGURATION();

	// [STEP 4] Initializing APS
	ZAPS_RESET_PARAMETER();

	// [STEP 5] Initializing NWK
	ZNWK_RESET_REQ();
	NIB.nwkCapaInfo = ZDO_CNF.NodeDesc.MacCapa;
	NIB.nwkMaxDepth = ZDO_CNF.MaxAsso.Depth;	
	NIB.nwkMaxChildren = ZDO_CNF.MaxAsso.ZED + ZDO_CNF.MaxAsso.ZR;
	NIB.nwkMaxRouter = ZDO_CNF.MaxAsso.ZR;
	
	if(ZNWK_CHECK_NETWORK_TREE_PARAMETER())
	{
		zPrintf(1, "\n NETWORK PARAMETER ERROR");
		zPrintf(1, "\n nwkMaxDepth = %02x",(short)NIB.nwkMaxDepth);
		zPrintf(1, "\n nwkMaxChildren = %02x",(short)NIB.nwkMaxChildren);
		zPrintf(1, "\n nwkMaxRouter = %02x",(short)NIB.nwkMaxRouter);
		EA = 0;			// For WATCHDOG Reset
	}	

	// [STEP 6] Initializing ZCL Attribute by HA(Home Automation) Profile
	ATT_OnOff.ID = ProfileHA_DevDoorLock_ClusOnOff;
	ATT_OnOff.DType = ProfileHA_DevDoorLock_ClusOnOff_AttOnOff_DTYPE;
	ATT_OnOff.Value = ATT_OnOff_Off;

	// [STEP 7] Getting Information from HIB
	zPrintf(1, "\n HIB_COPY");
	if(ZSYS_HIB_COPY( (UINT8 *)&DATA_COPY.DataHIB))
	{
		zPrintf(1, " ==> OK");
		
		p_ByteArray2Qword(DATA_COPY.DataHIB.IEEE_ADDR, MPIB.IEEE_ExtendAddr);
		ZHAL_IEEE_ADDR_SET(DATA_COPY.DataHIB.IEEE_ADDR);
	}
	else
	{	
		zPrintf(1, " ==> FAIL(Input By User)");

		zPrintf(1, "\n Input ChanList_H : 0x");
		zScanf(1, &Input);
		ZDO_CNF.NwkMode.ChanList = Input;
		ZDO_CNF.NwkMode.ChanList <<= 16;
		zPrintf(1, "\n Input ChanList_L : 0x");
		zScanf(1, &Input);
		ZDO_CNF.NwkMode.ChanList |= Input;
	
		zPrintf(1, "\n Input IEEE[1:0] : 0x");
		zScanf(1, &Input);		
		DATA_COPY.DataHIB.IEEE_ADDR[7] = 0x00;
		DATA_COPY.DataHIB.IEEE_ADDR[6] = 0x15;
		DATA_COPY.DataHIB.IEEE_ADDR[5] = 0x51;
		DATA_COPY.DataHIB.IEEE_ADDR[4] = 0x00;
		DATA_COPY.DataHIB.IEEE_ADDR[3] = 0x00;
		DATA_COPY.DataHIB.IEEE_ADDR[2] = 0x00;
		DATA_COPY.DataHIB.IEEE_ADDR[1] = Input >> 8;
		DATA_COPY.DataHIB.IEEE_ADDR[0] = Input;
		
		p_ByteArray2Qword(DATA_COPY.DataHIB.IEEE_ADDR, MPIB.IEEE_ExtendAddr);
		ZHAL_IEEE_ADDR_SET(DATA_COPY.DataHIB.IEEE_ADDR);
	}


	// [STEP 8] Initialize Random Generator with SEED
// 	(case 1) Random SEED <== IEEE Address
	RandomSeed = MPIB.IEEE_ExtendAddr[0];
//				or				
//	(case 2) Current ED Value
//	RandomSeed = ZHAL_ED_LEVEL_GET() << 8;
//	ZSYS_UserTimer16_SET(10);
//	while(ZSYS_UserTimer16_GET());
//	RandomSeed |= ZHAL_ED_LEVEL_GET();

	ZSYS_RANDOM_GEN_SEED(RandomSeed);
	zPrintf(1, "\n Random : Seed=%04x, 1st=%04x",RandomSeed,ZSYS_RANDOM_GEN_GET(0xFFFF));

	// [STEP 9] Enable/Disable Optional Features(defined in PROJECT_OPTION.h)
	//	#define	ENABLE_TURBO_MODE	0	: Not Use Turbo Mode
	//	#define	ENABLE_TURBO_MODE	1	: Use Turbo Mode
	#if (ENABLE_TURBO_MODE)
		ZSYS_TURBO_MODE_ENA(1);	
	#endif

	//	#define	ENABLE_MAC_CTR_SECURE	0	: Not Use MAC-CTR Security
	//	#define	ENABLE_MAC_CTR_SECURE	1	: Use MAC-CTR Security
	#if (ENABLE_MAC_CTR_SECURE)
		for(i=0 ; i<16 ; i++)	UserKey0[i] = 0xA0 + i;				// Key is defined by User
		for(i=0 ; i<8 ; i++)	NonceExtAddr[i] = 0xC0 + i;			// NonceExtAddr is defined by User
		ZSYS_SEC_MAC_CTR_SET(1, 0, UserKey0, NonceExtAddr);
	#endif	


	// [STEP 10] Recall the saved data
	if(	(DATA_SAVE.LayerInfo.NIB.DEVTYPE == 'C')
	||	(DATA_SAVE.LayerInfo.NIB.DEVTYPE == 'R')
	||	(DATA_SAVE.LayerInfo.NIB.DEVTYPE == 'E') )
	{
		ZSYS_DATABASE_RECALL();	
	}

	zPrintf(1, "\n Application Start ...");	

	
}


////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

	extern	UINT8	INT_EXT0;
	extern	UINT8	INT_EXT1;

	UINT8	MainPS = 0;

void ZUSER_MAIN()
{
	UINT8	ib;
	UINT8	U8;
	ZCLS_HEAD	ZCL_HEAD;

	if(INT_EXT0)			// Local Switch for Door
	{
		INT_EXT0 = 0;

		// Action For Virtual Door
		ATT_OnOff.Value = !ATT_OnOff.Value;
		USER_DOOR = ATT_OnOff.Value;
		if(USER_DOOR)	zPrintf(1, "\n DOOR-OPEN");
		else				zPrintf(1, "\n DOOR-CLOSE");
			
		// Constructing APS Data Frame			
		ZCL_HEAD.FC.b.Direction = ZCL_DIR_Server2Client;
		ZCL_HEAD.FC.b.DisableRsp = ZCL_DefaultRsp_Disable;
		ZCL_HEAD.FC.b.FrameType = ZCL_FT_EntireCmd;
		ZCL_HEAD.FC.b.Manufact = 0;
		ZCL_HEAD.FC.b.rsv = 0;

		APP_ASDU.Buff[0] = ZCL_HEAD.FC.All;
		APP_ASDU.Buff[1] = ++APP_DSN;
		APP_ASDU.Buff[2] = ZCL_CMD_REPORT;
		APP_ASDU.Buff[3] = ATT_OnOff.ID;
		APP_ASDU.Buff[4] = ATT_OnOff.ID >> 8;
		APP_ASDU.Buff[5] = ATT_OnOff.DType;
		APP_ASDU.Buff[6] = ATT_OnOff.Value;
		
		APP2APS.DATA_REQ.asduLen = 7;
		APP2APS.DATA_REQ.pasdu = APP_ASDU.Buff;
		APP2APS.DATA_REQ.ClusID = 0x0006;
		APP2APS.DATA_REQ.DstEP = 0x10;
		APP2APS.DATA_REQ.DstMode = 2;
		APP2APS.DATA_REQ.DstAdd_U.Short = 0x0000;
		APP2APS.DATA_REQ.ProfileID = 0x0104;
		APP2APS.DATA_REQ.Radius = USER_RADIUS;
		APP2APS.DATA_REQ.SrcEP = 0x10;
		APP2APS.DATA_REQ.TxOption = 0;
		ZAPS_DATA_REQ(&APP2APS, &APS2APP);
		zPrintf(1, " => STA=%02x",(short)APS2APP.DATA_CON.Sta);
	}
	

	if(NIB.DEVTYPE == 'N')
	{
		// NWK-DISCOVERY
		zPrintf(1, "\n [USER] NWK-DISC.req");
		
		for(U8=0 ; U8<ZDO_CNF.NwkScanAttempt ; U8++)
		{
			APS2NWK.NET_DISC_REQ.ScanChan = ZDO_CNF.NwkMode.ChanList;
			APS2NWK.NET_DISC_REQ.ScanDur = 0x04;
			ZNWK_NETWORK_DISC_REQ(&APS2NWK, &NWK2APS);

			zPrintf(1, " => STA=%02x, NwkCnt=%02x",
					(short)NWK2APS.NET_DISC_CON.Sta,
					(short)NWK2APS.NET_DISC_CON.NwkCount);

			for(ib=0 ; ib<NWK2APS.NET_DISC_CON.NwkCount ; ib++)
			{
				Display_ZIGBEE_NET_ONE( &(NWK2APS.NET_DISC_CON.pZNET[ib]));
			}

			if(ZDO_CNF.NwkTimeBtwnScan & 0xC0)
					ZSYS_UserTimer16_SET(0xFFFF);
			else		ZSYS_UserTimer16_SET(ZDO_CNF.NwkTimeBtwnScan << 10);
			
			while(ZSYS_UserTimer16_GET());
				
		}

⌨️ 快捷键说明

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