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

📄 aps.h

📁 zigbee在cc2430下的演示程序。
💻 H
字号:
/*
 * "Copyright (c) 2006 Robert B. Reese ("AUTHOR")"
 * All rights reserved.
 * (R. Reese, reese@ece.msstate.edu, Mississippi State University)
 * IN NO EVENT SHALL THE "AUTHOR" BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE "AUTHOR"
 * HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * THE "AUTHOR" SPECIFICALLY DISCLAIMS ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE "AUTHOR" HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
 *
 *
 * This file makes use of Zigbee Alliance intellectual property in the
 * form of frame formats as specified in the Zigbee 1.0 standard.
 * The author consulted the
 * Zigbee standard when writing this file, and agreed to the terms
 * of conditions by the Zibee Alliance when downloading the standard.
 * As such, use of this file is governed by the Zigbee Trademarks,
 * Designations, and Logos policy. A paraphrase of this policy is
 * that free usage is granted for research, educational or personal
 * use. Commercial usage is restricted, see the policy for details.
 *
 * Please maintain this header in its entirety when copying/modifying
 * these files.
 *
 * Files in this software distribution may have different usage
 * permissions, see the header in each file. Some files have NO permission
 * headers since parts of the original sources in these files
 * came from vendor  sources with no usage restrictions.
 *
 */

/*
  V0.1 Initial Release   10/July/2006  RBR

*/




#ifndef APS_H
#define APS_H

#define APS_FRM_TYPE_DATA 0
#define APS_FRM_TYPE_CMD  1
#define APS_FRM_TYPE_ACK  2
#define APS_FRM_TYPE_RSV  3
#define APS_FRM_TYPE_MASK 3

#define APS_GET_FRM_TYPE(x) (x&APS_FRM_TYPE_MASK)

#define APS_IS_CMD(x) ((APS_GET_FRM_TYPE(x)) == APS_FRM_TYPE_CMD)
#define APS_IS_DATA(x) ((APS_GET_FRM_TYPE(x)) == APS_FRM_TYPE_DATA)
#define APS_IS_ACK(x) ((APS_GET_FRM_TYPE(x)) == APS_FRM_TYPE_ACK)
#define APS_IS_RSV(x) ((APS_GET_FRM_TYPE(x)) == APS_FRM_TYPE_RSV)



#define APS_FRM_DLVRMODE_NORMAL    0
#define APS_FRM_DLVRMODE_INDIRECT  (1<<2)
#define APS_FRM_DLVRMODE_BCAST     (2<<2)
#define APS_FRM_DLVRMODE_RSV       (3<<2)
#define APS_FRM_DLVRMODE_MASK      (3<<2)
#define APS_GET_FRM_DLVRMODE(x)    (x&APS_FRM_DLVRMODE_MASK)

//The indirect submode bit is used for indirect frames
//and distiguishes before and after the indirect binding is resolved.
//if the submode is '1', only the srcEP is included and the packet
//is traveling to the coordinator to get the binding resolved.
//If the submode is '1', only the dstEP is included and the packet
//is traveling to the destination EP.

#define APS_FRM_INDIRECT_SUBMODE_MASK      (1<<4)
#define APS_GET_FRM_INDIRECT_SUBMODE(x)    (x&(APS_FRM_INDIRECT_SUBMODE_MASK))
#define APS_FRM_SECURITY_MASK      (1<<5)
#define APS_GET_FRM_SECURITY(x)        (x&(APS_FRM_SECURITY_MASK))
#define APS_FRM_ACKREQ_MASK        (1<<6)
#define APS_GET_FRM_ACKREQ(x)        (x&(APS_FRM_ACKREQ_MASK))

#define AF_TRANS_COUNT_MASK  (0xF)
#define AF_GET_TRANS_COUNT(x) (x &(AF_TRANS_COUNT_MASK))

#define AF_FRM_TYPE_MASK   (0xF <<4)
#define AF_GET_FRM_TYPE(x) (x & (AF_FRM_TYPE_MASK))

#define AF_FRM_TYPE_KVP  (1 <<4)
#define AF_FRM_TYPE_MSG  (2<<4)

#define APS_RXBUFF_SIZE LRWPAN_MAX_INDIRECT_RX_PKTS




typedef struct _APS_RX_DATA {
	MACPKT orgpkt;
	BYTE apsOffset;
	BYTE afOffset;
	union _APS_RX_DATA_FLAGS{
		BYTE val;
		struct {
			unsigned srcEP:1;
			unsigned dstEP:1;
		}bits;
	}flags;
	//parse these out of the packet for reference
	BYTE dstEP;
	BYTE srcEP;
	BYTE cluster;
	UINT16 profile;
	SADDR dstSADDR;   //used for indirect msgs
	SADDR srcSADDR;
	BYTE af_fcf;
	BYTE aps_fcf;
//these fields are for AF MSG data
	BYTE   tsn;
	BYTE   *usrPload;
	BYTE   usrPlen;
}APS_RX_DATA;



typedef struct _APS_TX_DATA {
	BYTE aps_fcf;
	BYTE af_fcf;	
	BYTE dstEP;
	BYTE dstMode;
	SADDR dstSADDR;
	BYTE *dstLADDR;
	SADDR srcSADDR;
	BYTE cluster;
	BYTE srcEP;
	BYTE  tsn;
	BYTE aps_flen;  //used for retries.
	BYTE *aps_ptr;  //used for retries
	BYTE *usrPload;
	BYTE usrPlen;
}APS_TX_DATA;



typedef union _APS_ARGS {
//TBD
	struct {
	  BYTE dummy;
	}some_args;
}APS_ARGS;

typedef enum _APS_STATE_ENUM {
  APS_STATE_IDLE,
  APS_STATE_COMMAND_START,
  APS_STATE_GENERIC_TX_WAIT,
  APS_STATE_NWK_PASSTHRU_WAIT,
  APS_STATE_INDIRECT_GETDST,
  APS_STATE_INDIRECT_TX,
#ifdef LRWPAN_COORDINATOR
  APS_STATE_INJECT_INDIRECT,
#endif
  APS_STATE_ACK_SEND_START,
  APS_STATE_INDIRECT_TX_WAIT,
  APS_STATE_ZEP_WAIT_RXSTART,
  APS_STATE_ZEP_WAIT_RXFINISH,
  APS_STATE_INDIRECT_LOOPBACK
 } APS_STATE_ENUM;


typedef struct _APS_SERVICE {
  LRWPAN_SVC_ENUM cmd;
  APS_ARGS args;
  LRWPAN_STATUS_ENUM status;
}APS_SERVICE;


typedef struct _APS_PIB{
	union _APS_PIB_FLAGS{
		BYTE val;
		struct {
			unsigned indirectPending:1;
			unsigned ackPending:1;         //expecting an ACK
			unsigned ackSendPending:1;     //we need to send an APS ack!
			unsigned TxInProgress:1;       //TX in progress
			unsigned zepRxInProgress:1;    //handling a Zero Endpoint RX
			unsigned IsUsrBufferFree:1;
		}bits;
	}flags;
	UINT32 tx_start_time;
	BYTE apsTSN; //transaction sequence number
	UINT32 apscAckWaitDuration; // in mac TICs
	UINT16 apsAckWaitMultiplier;
	UINT16 apsAckWaitMultiplierCntr;
	BYTE apscMaxFrameRetries;
	BYTE currentAckRetries;
#ifdef LRWPAN_COORDINATOR
	BYTE rxCnt;          //number of packets currently in buffer
    BYTE rxTail;        //tail pointer for buffer
	BYTE rxHead;        //head pointer for buffer
	//fifo for RX pkts, holds LRWPAN_MAX_NWK_RX_PKTS
	APS_RX_DATA  rxBuff[APS_RXBUFF_SIZE];  //buffer for APS packets to be redirected
#endif

}APS_PIB;

extern APS_SERVICE a_aps_service;
extern APS_TX_DATA a_aps_tx_data;
void apsFSM(void);
void apsInit(void);
extern APS_STATE_ENUM apsState;
extern APS_PIB aps_pib;
extern APS_RX_DATA a_aps_rx_data;

extern BOOL apsRxBusy(void);
extern void apsRxHandoff(void);

extern void usrRxPacketCallback(void);


void aplShutdown(void);
void aplWarmstart(void);

#define apsIdle() (apsState == APS_STATE_IDLE)
#define apsBusy() (apsState != APS_STATE_IDLE)

#define apsDoService() \
   a_aps_service.status = LRWPAN_STATUS_APS_INPROGRESS;\
   apsState = APS_STATE_COMMAND_START;\
   apsFSM();

#define APS_DSTMODE_NONE          0
#define APS_DSTMODE_SHORT         1
#define APS_DSTMODE_LONG          2


void aplFmtSendMSG (BYTE dstMode,
				 LADDR_UNION *dstADDR,
				 BYTE dstEP,
				 BYTE cluster,
				 BYTE srcEP,
				 BYTE* pload,
				 BYTE  plen,
				 BYTE  tsn,
				 BYTE  reqack);

#define aplSendMSG(dstMode, dstADDR, dstEP, cluster,srcEP,pload, plen, tsn, reqack)\
	aplFmtSendMSG(dstMode, dstADDR, dstEP, cluster,srcEP,pload, plen, tsn, reqack);\
	apsDoService();

#define aplSendEndDeviceAnnounce()\
      while(apsBusy()) apsFSM();\
      a_aps_service.cmd = LRWPAN_SVC_APS_SEND_END_DEVICE_ANNOUNCE;\
      apsDoService();

#define aplPingParent()\
      while(apsBusy()) apsFSM();\
	  a_aps_service.cmd = LRWPAN_SVC_APS_PING_PARENT;\
	  apsDoService();


#ifdef LRWPAN_COORDINATOR
//only the coordinator can form a network
//example of a passthru from APS to NETWORK
#define aplFormNetwork()\
    while(apsBusy()) apsFSM();\
	a_aps_service.cmd = LRWPAN_SVC_APS_NWK_PASSTHRU;\
	a_nwk_service.cmd = LRWPAN_SVC_NWK_FORM_NETWORK;\
	a_nwk_service.args.form_network.ScanChannels = LRWPAN_DEFAULT_CHANNEL_MASK;\
	a_nwk_service.args.form_network.ScanDuration = LRWPAN_DEFAULT_CHANNEL_SCAN_DURATION;\
	a_nwk_service.args.form_network.PANid = LRWPAN_DEFAULT_PANID;\
	apsDoService();

#else
//router, RFDs can join a formed network
#define aplJoinNetwork()\
    while(apsBusy()) apsFSM();\
	a_aps_service.cmd = LRWPAN_SVC_APS_NWK_PASSTHRU;\
	a_nwk_service.cmd = LRWPAN_SVC_NWK_JOIN_NETWORK;\
	a_nwk_service.args.join_network.ScanChannels = LRWPAN_DEFAULT_CHANNEL_MASK;\
	a_nwk_service.args.join_network.ScanDuration = LRWPAN_DEFAULT_CHANNEL_SCAN_DURATION;\
	a_nwk_service.args.join_network.PANid = LRWPAN_DEFAULT_PANID;\
	a_nwk_service.args.join_network.RejoinNetwork = FALSE;\
	apsDoService();

#define aplRejoinNetwork()\
    while(apsBusy()) apsFSM();\
	a_aps_service.cmd = LRWPAN_SVC_APS_NWK_PASSTHRU;\
	a_nwk_service.cmd = LRWPAN_SVC_NWK_JOIN_NETWORK;\
	a_nwk_service.args.join_network.ScanChannels = LRWPAN_DEFAULT_CHANNEL_MASK;\
	a_nwk_service.args.join_network.ScanDuration = LRWPAN_DEFAULT_CHANNEL_SCAN_DURATION;\
	a_nwk_service.args.join_network.PANid = LRWPAN_DEFAULT_PANID;\
	a_nwk_service.args.join_network.RejoinNetwork = TRUE;\
	apsDoService();


#endif



UINT32 aplMacTicksToUs(UINT32 ticks);   //utility function

#define aplInit()               apsInit()
#define apsGenTSN()             (aps_pib.apsTSN++)

#define aplGetRxDstEp()         (a_aps_rx_data.dstEP)
#define aplGetRxCluster()       (a_aps_rx_data.cluster)
#define aplGetRxSrcEp()         (a_aps_rx_data.srcEP)
#define aplGetRxSrcSADDR()      (a_aps_rx_data.srcSADDR)
#define aplGetRxMsgLen()        (a_aps_rx_data.usrPlen)
#define aplGetRxMsgData()       (a_aps_rx_data.usrPload)
#define aplGetRxRSSI()          (a_aps_rx_data.orgpkt.rssi)

#define aplGetLastTxTime()     (phy_pib.txStartTime)


#define aplGetStatus()            (a_aps_service.status)
#define aplGetMyShortAddress()    (macGetShortAddr())
#define aplGetParentLongAddress() (&mac_pib.macCoordExtendedAddress)
#define aplGetParentShortAddress() (mac_pib.macCoordShortAddress)

#define aplSetMacMaxFrameRetries(x)  (mac_pib.macMaxAckRetries=x)
#define aplSetApsMaxFrameRetries(x)  (aps_pib.apscMaxFrameRetries=x) 

//indicates when the user buffer has been copied and is now free
#define aplIsUsrBufferFree()  (aps_pib.flags.bits.IsUsrBufferFree == 1)


#endif


⌨️ 快捷键说明

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