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