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 + -
显示快捷键?