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

📄 mac.h

📁 本程序是基于Zigbee协议的无线温度传感器网络系统
💻 H
字号:
/*
 *2006/08/16 WXL 2.0
 *
 */

/*
V0.2 added PC-based binding         21/July/2006
V0.1 Initial Release                10/July/2006

*/



#ifndef MAC_H
#define MAC_H

#define aBaseSlotDuration 60
#define aNumSuperFrameSlots 16
#define aBaseSuperFrameDuration (aBaseSlotDuration*aNumSuperFrameSlots)
#define aMaxBE 5
#define aMinBE 0
#define aUnitBackoffPeriod 20        //in symbols
#define macMaxCSMABackoffs 4
#define aMaxBeaconOverhead 75
#define aMaxBeaconPayloadLength (aMaxPHYPacketSize-aMaxBeaconOverhead)
#define aMaxFrameOverhead 25
#define aMaxFrameResponseTime 1220
#define aMaxFrameRetries LRWPAN_MAC_MAX_FRAME_RETRIES
#define aMaxLostBeacons 4
#define aMaxMACFrameSize (aMaxPHYPacketSize-aMaxFrameOverhead)
#define aResponseWaitTime (32*aBaseSuperFrameDuration)

//default timeout on network responses
#ifdef LRWPAN_DEBUG
//give longer due to debugging output
#define MAC_GENERIC_WAIT_TIME      MSECS_TO_MACTICKS(100)
#define MAC_ASSOC_WAIT_TIME        MAC_GENERIC_WAIT_TIME
#define MAC_ORPHAN_WAIT_TIME       MAC_GENERIC_WAIT_TIME
#else
#define MAC_GENERIC_WAIT_TIME      MSECS_TO_MACTICKS(20)
#define MAC_ASSOC_WAIT_TIME        MAC_GENERIC_WAIT_TIME
#define MAC_ORPHAN_WAIT_TIME       MAC_GENERIC_WAIT_TIME
#endif



#define MAC_RXBUFF_SIZE LRWPAN_MAX_MAC_RX_PKTS+1

typedef struct _MAC_PIB {
	UINT32 macAckWaitDuration;
	union _MAC_PIB_flags {
		UINT32 val;
		struct {
			unsigned macAssociationPermit:1;
			unsigned macAutoRequest:1;
			unsigned macBattLifeExt:1;
			unsigned macGTSPermit:1;
			unsigned macPromiscousMode:1;
			unsigned macPanCoordinator:1;
			unsigned ackPending:1;
			unsigned TxInProgress:1;   //MAC TX FSM state
			unsigned GotBeaconResponse:1;      //set to a '1' when get Beacon Response
			unsigned WaitingForBeaconResponse:1; //set to '1' when waiting for Response
			unsigned macPending:1;       //mac CMD pending in the RX buffer
			unsigned macIsAssociated:1;
			unsigned WaitingForAssocResponse:1;
			unsigned GotOrphanResponse:1;
			unsigned WaitingForOrphanResponse:1;

		}bits;
	}flags;
	LADDR macCoordExtendedAddress;
	SADDR macCoordShortAddress;
	UINT16 macPANID;
	BYTE macDSN;
	BYTE depth;            //depth in the network
	BYTE macCapInfo;
    BYTE macMaxAckRetries;
	struct  {
		unsigned maxMaxCSMABackoffs:3;
		unsigned macMinBE:2;
	}misc;
	UINT32 tx_start_time;    //time that packet was sent
      UINT32 last_data_rx_time;    //time that last data rx packet was received that was accepted by this node

    BYTE bcnDepth;
	SADDR bcnSADDR;
	UINT16 bcnPANID;
	BYTE bcnRSSI;

	BYTE currentAckRetries;
	BYTE rxTail;             //tail pointer of rxBuff
    BYTE rxHead;             //head pointer of rxBuff
	//fifo for RX pkts, holds LRWPAN_MAX_MAC_RX_PKTS
	MACPKT  rxBuff[MAC_RXBUFF_SIZE];  //buffer for packets not yet processed

#ifdef LRWPAN_FFD
	//neighbor info
	UINT16 nextChildRFD;
	UINT16 nextChildRouter;
	BYTE   ChildRFDs;         //number of neighbor RFDs
	BYTE   ChildRouters;      //number of neighbor Routers
#endif


}MAC_PIB;


//used for parsing of RX data
typedef struct _MAC_RX_DATA {
	MACPKT *orgpkt;       //original packet
	BYTE fcflsb;
	BYTE fcfmsb;
	UINT16 DestPANID;
	LADDR_UNION DestAddr; //dst address, either short or long
	UINT16 SrcPANID;
	LADDR_UNION SrcAddr;  //src address, either short or long
	BYTE pload_offset;    //start of payload
}MAC_RX_DATA;

typedef struct _MAX_TX_DATA {
	UINT16 DestPANID;
	LADDR_UNION DestAddr; //dst address, either short or long
	UINT16 SrcPANID;
	SADDR SrcAddr;         //src address, either short or long, this holds short address version
	                       //if long is needed, then get this from HAL layer
	BYTE fcflsb;          //frame control bits specify header bits
	BYTE fcfmsb;
	union  {
		BYTE val;
		struct _MAC_TX_DATA_OPTIONS_bits {
			unsigned gts:1;
			unsigned indirect:1;
		}bits;
	}options;		
}MAC_TX_DATA;

typedef union _MAC_ARGS {
	struct {
		BYTE   LogicalChannel;
       //addressing, capinfo, security comes from mac_pib data.
	}assoc_req;
	struct {
		BYTE LogicalChannel;
	}beacon_req;
	struct {
       LRWPAN_STATUS_ENUM status;
	}error;
	struct {
		SADDR saddr;
	}ping_node;
}MAC_ARGS;

typedef enum _MAC_STATE_ENUM {
  MAC_STATE_IDLE,
  MAC_STATE_COMMAND_START,
  MAC_STATE_GENERIC_TX_WAIT,
  MAC_STATE_GENERIC_TX_WAIT_AND_UNLOCK,
  MAC_STATE_HANDLE_ORPHAN_NOTIFY,
  MAC_STATE_ORPHAN_WAIT1,
  MAC_STATE_ORPHAN_WAIT2,
  MAC_STATE_ASSOC_REQ_WAIT1,
  MAC_STATE_ASSOC_REQ_WAIT2,
  MAC_STATE_SEND_BEACON_RESPONSE,
  MAC_STATE_SEND_ASSOC_RESPONSE
 } MAC_STATE_ENUM;

typedef struct _MAC_SERVICE {
  LRWPAN_SVC_ENUM cmd;
  MAC_ARGS args;
  LRWPAN_STATUS_ENUM status;
}MAC_SERVICE;


extern MAC_PIB mac_pib;
extern MAC_SERVICE a_mac_service;
extern MAC_STATE_ENUM macState;
extern MAC_TX_DATA a_mac_tx_data;
extern MAC_RX_DATA a_mac_rx_data;


void macInit(void);
void macFSM(void);

LRWPAN_STATUS_ENUM macInitRadio(void);
LRWPAN_STATUS_ENUM macWarmStartRadio(void);
void macSetPANID(UINT16 panid);
void macSetChannel(BYTE channel);
void macSetShortAddr(UINT16 saddr);
//SADDR macGetShortAddr();
#define macGetShortAddr()   (mac_addr_tbl[0].saddr)

BOOL macRxBuffEmpty(void);
BOOL macRxBuffFull(void);
MACPKT *macGetRxPacket(void);
void macFreeRxPacket(BOOL freemem);

#ifdef LRWPAN_FFD
BOOL usrJoinVerifyCallback(LADDR *ptr, BYTE capinfo);
BOOL usrJoinNotifyCallback(LADDR *ptr);
#endif


#define macIdle() (macState == MAC_STATE_IDLE)
#define macBusy() (macState != MAC_STATE_IDLE)

#define macTXIdle() (!mac_pib.flags.bits.TxInProgress)
#define macTXBusy() (mac_pib.flags.bits.TxInProgress)
#define macSetTxBusy() mac_pib.flags.bits.TxInProgress = 1
#define macSetTxIdle() mac_pib.flags.bits.TxInProgress = 0

#define macDoService() \
	a_mac_service.status = LRWPAN_STATUS_MAC_INPROGRESS;\
	macState = MAC_STATE_COMMAND_START;\
	macFSM();\


#endif

⌨️ 快捷键说明

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