?? mac.h
字號:
WORD panId;
UINT8 srcAddrMode;
ADDRESS srcAddr;
UINT8 dstAddrMode;
ADDRESS dstAddr;
MAC_ENUM status;
} MLME_COMM_STATUS_INDICATION;
typedef struct{
LONG_ADDR Deviceaddr;
Node_Capability cap_info;
bool security_use;
uint8_t aclentry;
}MLME_ASSOCIATE_INDICATION;
//做掃描時候容忍最多保存記錄多少個PAN 描述符和 信道ED值,與實現(xiàn)相關的參數(shù),可由自己確定
#define MAC_MAX_PAN_DESCRIPTORS 5
#define MAC_MAX_ED_MEASUREMENT 16
typedef struct {
BYTE status;
BYTE scanType;
DWORD unscannedChannels;
UINT8 resultListSize;
union
{
int8_t pEnergyDetectList[MAC_MAX_ED_MEASUREMENT];
PAN_DESCRIPTOR pPANDescriptorList[MAC_MAX_PAN_DESCRIPTORS];
};
} MLME_SCAN_CONFIRM;
//--------------------------------------------------//
//---------下面為Zigbee中MAC層原語的函數(shù)聲明--------//
//--------------------------------------------------//
//原語函數(shù)聲明
//對于某些比較簡單的只返回狀態(tài)成功與否的confirm原語,可以放在request原語的返回值里面返回。
//對于GTS,zigbee協(xié)議里面沒有使用,故本版本的協(xié)議實現(xiàn)沒有實現(xiàn)GTS相關的原語。
//----------------------------------------------------------------------------------------------------------
// MCPS and MLME prototypes (ordered alphabetically)
void mcpsDataRequest(NODE_INFO dst, NODE_INFO src,UINT8 msduLength, BYTE *pMsdu, BYTE msduHandle, BYTE txOptions);
void mcpsDataConfirm(MAC_ENUM status, BYTE msduHandle);
//參數(shù)作為一個全局的數(shù)據(jù)結構體來訪問
void mcpsDataIndication(MCPS_DATA_INDICATION mcps_data_indication_info);
//沒有實現(xiàn)該原語
MAC_ENUM mcpsPurgeRequest(BYTE msduHandle);
void mlmeAssociateRequest(UINT8 logicalChannel, BYTE coordAddrMode, SHORT_ADDR coordPANId, ADDRESS pCoordAddress, Node_Capability capabilityInformation, bool securityEnable);
//void mlmeAssociateRequest(UINT8 logicalChannel, BYTE coordAddrMode, WORD coordPANId, ADDRESS *pCoordAddress, Node_Capability capabilityInformation, bool securityEnable);
void mlmeAssociateIndication(MLME_ASSOCIATE_INDICATION mlme_associate_indication_info);
void mlmeAssociateResponse(LONG_ADDR deviceAddress, SHORT_ADDR assocShortAddress, BYTE status, bool securityEnable);
void mlmeAssociateConfirm(SHORT_ADDR AssocShortAddress, BYTE status);
//參數(shù)作為一個全局的數(shù)據(jù)結構體來訪問
void mlmeBeaconNotifyIndication(MLME_BEACON_NOTIFY_INDICATION beacon_payload_info);
void mlmeCommStatusIndication(WORD panId, BYTE srcAddrMode, ADDRESS *pSrcAddr, BYTE dstAddrMode, ADDRESS *pDstAddr, BYTE status);
void mlmeDisassociateRequest(LONG_ADDR pDeviceAddress, BYTE disassociateReason, bool securityEnable);
void mlmeDisassociateIndication(LONG_ADDR deviceAddress, BYTE disassociateReason, bool securityUse, BYTE aclEntry);
void mlmeDisassociateConfirm(MAC_ENUM status);
MAC_ENUM mlmeGetRequest(MAC_PIB_ATTR pibAttribute, void *pPibAttributeValue);
void mlmeOrphanIndication(LONG_ADDR orphanAddress, bool securityUse, BYTE aclEntry);
void mlmeOrphanResponse(LONG_ADDR orphanAddress, SHORT_ADDR shortAddress, bool associatedMember, bool securityEnable);
//本代碼不實現(xiàn)這兩個原語
void mlmePollRequest(BYTE coordAddrMode, WORD coordPANId, ADDRESS *coordAddress, bool securityEnable);
void mlmePollConfirm(MAC_ENUM status);
MAC_ENUM mlmeResetRequest(bool setDefaultPIB);
//本版本代碼不實現(xiàn)下面兩個原語
void mlmeRxEnableRequest(bool deferPermit, uint32_t rxOnTime, uint32_t rxOnDuration);
void mlmeRxEnableConfirm(MAC_ENUM status);
MAC_ENUM mlmeScanRequest(BYTE scanType, DWORD scanChannels, UINT8 scanDuration);
//沒有必要定義mlmescanconfirm函數(shù),scan request得到的結果:
//狀態(tài)由scan request返回,其他的結果由全局結構MLME_SCAN_CONFIRM返回;
void mlmeScanConfirm(MLME_SCAN_CONFIRM scan_result_info);
MAC_ENUM mlmeSetRequest(MAC_PIB_ATTR pibAttribute, void *pPibAttributeValue);
//void mlmeStartRequest(SHORT_ADDR panId, UINT8 logicalChannel, UINT8 beaconOrder, UINT8 superframeOrder, bool panCoordinator, bool batteryLifeExtension, bool coordRealignment, bool securityEnable, QWORD StartTime);
void mlmeStartRequest(SHORT_ADDR panId, uint8_t logicalChannel, uint8_t beaconOrder, uint8_t superframeOrder, bool panCoordinator, bool batteryLifeExtension, bool coordRealignment, bool securityEnable , WORD StartTime);
void mlmeStartConfirm(void);
void mlmeSyncRequest(UINT8 logicalChannel, bool trackBeacon);
void mlmeSyncLossIndication(MAC_ENUM lossReason);
//--------------------------------------------------//
//----下面為Zigbee中MAC層內部需要的一些數(shù)據(jù)結構-----//
//--------------------------------------------------//
//射頻發(fā)送buffer。已經打包好,準備向物理層發(fā)送的MAC幀,
//由于信標幀具有最高的發(fā)送優(yōu)先級,故本隊列里面不包括信標幀
//采用間接通信方式的幀由于在收到
typedef struct _TX_BUFFER
{
//隊列中該結構元素是否可用,如果發(fā)送完一個不需要ack的幀
//或者發(fā)送一個需要ack的幀,并且已經收到ack幀,則發(fā)送完成后可以置IsValid為無效。
bool IsNeedAcked;
//區(qū)分各個幀的句柄
BYTE FrameHandle;
//是否發(fā)送過,表明該幀在等待ack中
bool IsTxed;
//該幀序列號,在處理應答幀的時候有用。
BYTE FrameSeq;
//該幀已經發(fā)送過的次數(shù),初始化為aMaxFrameRetries,每發(fā)送一次,減1。為0時候,不需要發(fā)送,直接向上層報告出錯。
BYTE FrameRetriesCounter;
//發(fā)送的MAC幀長度
BYTE frameLength;
//命令幀類型字段
BYTE cmd_type;
//待發(fā)送的幀負載
BYTE * payload;
struct _TX_BUFFER *next;
} TX_BUFFER;
//初始化發(fā)送隊列函數(shù)聲明,將IsValid置為無效,payload指針置為空.
void initial_tx_queue(void);
//射頻發(fā)送隊列的操作函數(shù)聲明,尋找發(fā)送buffer中的一個空位置,如果沒有,則返回發(fā)送忙,把須發(fā)送的包放到隊列中
TX_BUFFER * add_tx_queue(BYTE framelength, BYTE * payload, BYTE framehandle, bool is_ack, BYTE frameseq,BYTE cmd_type);
//射頻發(fā)送隊列的刪除一個元素函數(shù)聲明。對于需要應答的幀,在收到對應的ack后,即可從隊列中刪除,釋放payload域,置isvalid為無效。
//如果為一個不需要應答的幀,則發(fā)送完成收到正確的confirm后即可直接刪除掉
void remove_tx_queue(BYTE frameseq);
TX_BUFFER * get_frame_pointer(BYTE frameseq);
//下面的結構用于發(fā)送任務的參數(shù)傳遞作用
#define MAX_TX_BUFFER_SIZE 5
typedef struct _parameter_tx_task
{
TX_BUFFER * parameter_tx_task[MAX_TX_BUFFER_SIZE];
uint8_t top;
uint8_t tail;
}parameter_tx_task;
/*
//
//標志用于存儲發(fā)送時候需要的信息,不用再到MAC幀里面去查找
typedef struct _MAC_FRAME_FLAG
{
BYTE IsValid :1; //表示該幀是否處理完畢,那么該存儲空間可以重新放入一個新的待發(fā)送的幀
BYTE IsAcked :1; //
} MAC_FRAME_FLAG;
*/
//pending transaction隊列,協(xié)調者用于存儲采用間接通信的數(shù)據(jù)或命令幀
//注意:pending隊列里面的幀,在發(fā)送時,還需要打包進入TX_BUFFERS隊列,然后才能發(fā)送。在pending隊列時候還沒有分配幀序列號
typedef struct _INDIRECDT_TX_PENDING_QUEUE
{
//該元素是否有效,在將該元素添加到發(fā)送隊列中去以后,可以置該域為無效。同時置pending_payload指針為空
bool IsValid;
//可以表明該間接通信的幀已經經歷過多少個超幀,如果計數(shù)到零,則需要通過原語向上層報告超時。
//對于數(shù)據(jù)幀或協(xié)調者發(fā)給設備的disassociation notification幀,可以采用相應的confirm原語向高層報告
//對于association response幀,采用comu_status原語向高層報告
//該值的更新在每次發(fā)送信標幀時候,遞減1,減到0時候,向上層報告,初始值設為macTransactionPersistenceTime
uint16_t MacTranPersistCounter;
//用于區(qū)分是哪個幀的句柄
BYTE FrameHandle;
//幀控制域,兩字節(jié)
FRAME_CONTROL framectl_field;
bool associate_or_disassociate;
SHORT_ADDR shortaddralloc;
union{
BYTE associate_status;
BYTE disassociation_reason;
};
union{
LONG_ADDR associate_device_addr;
LONG_ADDR end_device_addr;
};
//目標地址和源地址信息,包括PANID
NODE_INFO dst;
NODE_INFO src;
//pending幀的長度
BYTE frameLength;
//該幀的負載域
BYTE * high_level_payload;
struct _INDIRECDT_TX_PENDING_QUEUE *next;
//?????需要擴展?
} INDIRECT_TX_PENDING_QUEUE;
//操作函數(shù)聲明
//pending隊列的初始化函數(shù)
void initial_pending_queue(void);
//添加一個數(shù)據(jù)包到pending隊列中,如果隊列滿,需要采用對應的原語通知高層。
void add_pending_queue(BYTE framehandle, FRAME_CONTROL framectl, NODE_INFO dst, NODE_INFO src, BYTE framelength, BYTE *payload,BYTE associate_status_or_disassociate_reason,bool associate_or_disassociate,LONG_ADDR addr,SHORT_ADDR shortaddralloc);
//從pending隊列中刪除一個元素
void remove_pending_queue(INDIRECT_TX_PENDING_QUEUE *current);
INDIRECT_TX_PENDING_QUEUE * get_pending_frame(NODE_INFO dst);
bool Is_data_pending(NODE_INFO dst);
void transmit_with_csmaca(void);
uint32_t direct_transmit(uint8_t psdulength,uint8_t * psdu);
//MAC層在收到一個幀后如何處理該幀的函數(shù)(或任務)
void mac_frame_rcvd(void);
//定時器中斷服務程序post的一個任務
void mac_timer_task(void);
uint16_t mac_timer3queue_getnextinterval(void);
//物理信道狀態(tài)
//物理層將根據(jù)該狀態(tài)進行接收的幀的預過濾,減輕高層負擔
typedef enum {
PHY_IDLE=0,
DOINGCSMA_CA,
TRANSMITTING_FRAME,
WAITING_FOR_ACK,
WAITING_FOR_BEACON,
INACTIVE_PERIOD
}PHY_CHANNEL_STATE ;
PHY_CHANNEL_STATE phy_channel_state;
#define MAX_RX_BUFFER_SIZE 3
typedef struct _RX_BUFFER
{
BYTE framelength;
BYTE * payload;
BYTE lqi;
uint32_t timestamp;
struct _RX_BUFFER *next;
}RX_BUFFER;
RX_BUFFER * add_to_rx_buffer(BYTE framelength, BYTE *payload,BYTE lqi,uint32_t timestamp);
void remove_from_rx_buffer(RX_BUFFER * framepointer);
//該任務負責是從物理層取一個幀并進行解析
void mac_get_received_frame(void);
//void beacon_received(void);
void data_request_frame_send(void);
void pending_data_send(NODE_INFO dst);
void data_frame_send(BYTE * nwkpayload, BYTE nwkpayloadlength, NODE_INFO dst,NODE_INFO src,BYTE frameHandle);
void associate_request_frame_send(SHORT_ADDR panid,NODE_INFO dst, Node_Capability node_capinfo);
void disassociate_notification_frame_send(BYTE disassociation_reason,LONG_ADDR end_device_addr);
void panid_confilct_frame_send(void);
void orphan_notification_frame_send(void);
void beacon_request_frame_send(void);
//#ifdef I_AM_COORDINATOR
void coordinator_realignment_frame_send(bool Isunicast, NODE_INFO dst, SHORT_ADDR allocated_addr);
void associate_response_frame_send(SHORT_ADDR coor_short_addr, BYTE associate_status,LONG_ADDR associate_device_addr,SHORT_ADDR shortaddralloc);
void beacon_frame_send(bool short_or_long);
void mac_frame_send(void);
void pending_frame_handle(void);
//endif
void beacon_frame_tx_timing(void);
void mlmesyn_finished(void);
void synrequest_task(void);
uint8_t random_generate(void);
//uint8_t wait_for_backoff_boundary(void);
uint8_t do_backoff(void);
uint8_t csma_initial(void);
void failure_to_tx_with_csma(void);
void CSMA_CA_DOING(void);
void scan_task(void);
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -