1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/pkg/openwsn/patches/02a-MAClow_IEEE802154E.h.patch
2014-05-14 15:06:50 +02:00

266 lines
10 KiB
Diff

*** stock_iot-lab_M3/openwsn/02a-MAClow/IEEE802154E.h Thu Apr 24 11:01:36 2014
--- riot-openwsn-wip/openwsn/02a-MAClow/IEEE802154E.h Thu Apr 24 16:55:54 2014
***************
*** 10,21 ****
#include "openwsn.h"
#include "board_info.h"
//=========================== debug define ====================================
//=========================== define ==========================================
! #define SYNCHRONIZING_CHANNEL 20 // channel the mote listens on to synchronize
#define TXRETRIES 3 // number of MAC retries before declaring failed
#define TX_POWER 31 // 1=-25dBm, 31=0dBm (max value)
#define RESYNCHRONIZATIONGUARD 5 // in 32kHz ticks. min distance to the end of the slot to succesfully synchronize
--- 10,22 ----
#include "openwsn.h"
#include "board_info.h"
+ #include "schedule.h"
//=========================== debug define ====================================
//=========================== define ==========================================
! #define SYNCHRONIZING_CHANNEL 0x1a // channel the mote listens on to synchronize
#define TXRETRIES 3 // number of MAC retries before declaring failed
#define TX_POWER 31 // 1=-25dBm, 31=0dBm (max value)
#define RESYNCHRONIZATIONGUARD 5 // in 32kHz ticks. min distance to the end of the slot to succesfully synchronize
***************
*** 25,30 ****
--- 26,79 ----
#define LIMITLARGETIMECORRECTION 5 // threshold number of ticks to declare a timeCorrection "large"
#define LENGTH_IEEE154_MAX 128 // max length of a valid radio packet
+ //15.4e information elements related
+ #define IEEE802154E_PAYLOAD_DESC_LEN_SHIFT 0x04
+ #define IEEE802154E_PAYLOAD_DESC_GROUP_ID_MLME (0x01 << 1) //includes shift 1
+ #define IEEE802154E_DESC_TYPE_LONG 0x01
+ #define IEEE802154E_DESC_TYPE_SHORT 0x00
+
+ #define IEEE802154E_DESC_TYPE_HEADER_IE 0x00
+ #define IEEE802154E_DESC_TYPE_PAYLOAD_IE 0x01
+ //len field on PAYLOAD/HEADER DESC
+ #define IEEE802154E_DESC_LEN_HEADER_IE_MASK 0xFE00
+ #define IEEE802154E_DESC_LEN_PAYLOAD_IE_MASK 0xFFE0
+
+ #define IEEE802154E_DESC_LEN_HEADER_IE_SHIFT 9
+ #define IEEE802154E_DESC_LEN_PAYLOAD_IE_SHIFT 5
+
+ //groupID/elementID field on PAYLOAD/HEADER DESC
+ #define IEEE802154E_DESC_ELEMENTID_HEADER_IE_MASK 0x01FE
+ #define IEEE802154E_DESC_GROUPID_PAYLOAD_IE_MASK 0x001E
+
+ #define IEEE802154E_DESC_ELEMENTID_HEADER_IE_SHIFT 1
+ #define IEEE802154E_DESC_GROUPID_PAYLOAD_IE_SHIFT 1
+
+ //MLME Sub IE LONG page 83
+ #define IEEE802154E_DESC_LEN_LONG_MLME_IE_MASK 0xFFE0
+ #define IEEE802154E_DESC_SUBID_LONG_MLME_IE_MASK 0x001E
+
+ #define IEEE802154E_DESC_LEN_LONG_MLME_IE_SHIFT 5
+ #define IEEE802154E_DESC_SUBID_LONG_MLME_IE_SHIFT 1
+
+ //MLME Sub IE SHORT page 82
+ #define IEEE802154E_DESC_LEN_SHORT_MLME_IE_MASK 0xFF00
+ #define IEEE802154E_DESC_SUBID_SHORT_MLME_IE_MASK 0x00FE
+
+ #define IEEE802154E_DESC_LEN_SHORT_MLME_IE_SHIFT 8
+ #define IEEE802154E_DESC_SUBID_SHORT_MLME_IE_SHIFT 1
+
+
+ #define IEEE802154E_MLME_SYNC_IE_SUBID 0x1A
+ #define IEEE802154E_MLME_SYNC_IE_SUBID_SHIFT 1
+ #define IEEE802154E_MLME_SLOTFRAME_LINK_IE_SUBID 0x1B
+ #define IEEE802154E_MLME_SLOTFRAME_LINK_IE_SUBID_SHIFT 1
+ #define IEEE802154E_MLME_TIMESLOT_IE_SUBID 0x1c
+ #define IEEE802154E_MLME_TIMESLOT_IE_SUBID_SHIFT 1
+
+ #define IEEE802154E_MLME_IE_GROUPID 0x01
+ #define IEEE802154E_ACK_NACK_TIMECORRECTION_ELEMENTID 0x1E
+
+ #define IEEE802154E_
/**
When a packet is received, it is written inside the OpenQueueEntry_t->packet
buffer, starting at the byte defined below. When a packet is relayed, it
***************
*** 81,86 ****
--- 130,136 ----
TsLongGT = 43, // 1300us
TsTxAckDelay = 151, // 4606us
TsShortGT = 16, // 500us
+ // TsShortGT = 30, // 900us, stm32 can work well with this value
TsSlotDuration = PORT_TsSlotDuration, // 15000us
// execution speed related
maxTxDataPrepare = PORT_maxTxDataPrepare,
***************
*** 97,102 ****
--- 147,159 ----
};
+ //shift of bytes in the linkOption bitmap
+ enum ieee154e_linkOption_enum {
+ FLAG_TX_S = 7,
+ FLAG_RX_S = 6,
+ FLAG_SHARED_S = 5,
+ FLAG_TIMEKEEPING_S = 4,
+ };
// FSM timer durations (combinations of atomic durations)
// TX
***************
*** 125,150 ****
PORT_SIGNED_INT_WIDTH timeCorrection;
} IEEE802154E_ACK_ht;
! #define ADV_PAYLOAD_LENGTH 5
! //=========================== variables =======================================
//=========================== prototypes ======================================
// admin
! void ieee154e_init();
// public
! PORT_TIMER_WIDTH ieee154e_asnDiff(asn_t* someASN);
! bool ieee154e_isSynch();
! void asnWriteToPkt(OpenQueueEntry_t* frame);
! void asnWriteToSerial(uint8_t* array);
// events
! void ieee154e_startOfFrame(PORT_TIMER_WIDTH capturedTime);
! void ieee154e_endOfFrame(PORT_TIMER_WIDTH capturedTime);
// misc
! bool debugPrint_asn();
! bool debugPrint_isSync();
! bool debugPrint_macStats();
/**
\}
--- 182,304 ----
PORT_SIGNED_INT_WIDTH timeCorrection;
} IEEE802154E_ACK_ht;
! //includes payload header IE short + MLME short Header + Sync IE
! #define ADV_PAYLOAD_LENGTH sizeof(payload_IE_descriptor_t) + \
! sizeof(MLME_IE_subHeader_t) + \
! sizeof(synch_IE_t)
!
!
!
!
! //=========================== module variables ================================
!
! typedef struct {
! // misc
! asn_t asn; // current absolute slot number
! slotOffset_t slotOffset; // current slot offset
! slotOffset_t nextActiveSlotOffset; // next active slot offset
! PORT_RADIOTIMER_WIDTH deSyncTimeout; // how many slots left before looses sync
! bool isSync; // TRUE iff mote is synchronized to network
! // as shown on the chronogram
! ieee154e_state_t state; // state of the FSM
! OpenQueueEntry_t* dataToSend; // pointer to the data to send
! OpenQueueEntry_t* dataReceived; // pointer to the data received
! OpenQueueEntry_t* ackToSend; // pointer to the ack to send
! OpenQueueEntry_t* ackReceived; // pointer to the ack received
! PORT_RADIOTIMER_WIDTH lastCapturedTime; // last captured time
! PORT_RADIOTIMER_WIDTH syncCapturedTime; // captured time used to sync
! //channel hopping
! uint8_t freq; // frequency of the current slot
! uint8_t asnOffset; // offset inside the frame
!
! PORT_RADIOTIMER_WIDTH radioOnInit; //when within the slot the radio turns on
! PORT_RADIOTIMER_WIDTH radioOnTics;//how many tics within the slot the radio is on
! bool radioOnThisSlot; //to control if the radio has been turned on in a slot.
! } ieee154e_vars_t;
!
! PRAGMA(pack(1));
! typedef struct {
! uint8_t numSyncPkt; // how many times synchronized on a non-ACK packet
! uint8_t numSyncAck; // how many times synchronized on an ACK
! PORT_SIGNED_INT_WIDTH minCorrection; // minimum time correction
! PORT_SIGNED_INT_WIDTH maxCorrection; // maximum time correction
! uint8_t numDeSync; // number of times a desync happened
! float dutyCycle; // mac dutyCycle at each superframe
! } ieee154e_stats_t;
! PRAGMA(pack());
! typedef struct {
! PORT_RADIOTIMER_WIDTH num_newSlot;
! PORT_RADIOTIMER_WIDTH num_timer;
! PORT_RADIOTIMER_WIDTH num_startOfFrame;
! PORT_RADIOTIMER_WIDTH num_endOfFrame;
! } ieee154e_dbg_t;
!
!
! //=========================== IEs =============================================
! //the header for all header IEs
! typedef struct{
! uint16_t length_elementid_type;
! }header_IE_descriptor_t;
! //header descriptor. elementid will be 0 as described in 15.4e pag. 81
! //type is 0 as described on p. 80
!
!
! //the content for ack ie -- it is a header IE with values - element id =0x1e len=2 type=0
! PRAGMA(pack(1));
! typedef struct {
! int16_t timesync_info;
! }ack_timecorrection_IE_t;
! PRAGMA(pack());
! //the header for all payload IEs
!
!
! typedef struct{//11b len 4b gid 1b type
! uint16_t length_groupid_type; //bytes on the IE content- that is the embedded MLME or Header IE.
! //groupid == 0x01 MLME | type long = 1
! }payload_IE_descriptor_t; // payload descriptor. groupid will be 1 as described in 15.4e pag. 81
!
! //MLME sub id header appended to payload descriptor. we use group id=1 type=1
! typedef struct{
! uint16_t length_subID_type;
! }MLME_IE_subHeader_t;
!
! //the Synchronization IE. it is a payload IE with values - subid=0x1a type=0 (short) len=6
! PRAGMA(pack(1));
! typedef struct {
! uint8_t asn[5];
! uint8_t join_priority;
! }synch_IE_t;
! PRAGMA(pack());
!
! //the Slotframe and Link IE
! typedef struct {
! uint8_t slotframehandle;
! uint16_t slotframesize;
! uint8_t numlinks;
! }slotframelink_IE_t;
!
! typedef struct {
! uint16_t tsNum;
! uint16_t choffset;
! uint8_t linkoptions;
! }linkInfo_subIE_t;
//=========================== prototypes ======================================
// admin
! void ieee154e_init(void);
// public
! PORT_RADIOTIMER_WIDTH ieee154e_asnDiff(asn_t* someASN);
! bool ieee154e_isSynch(void);
! void ieee154e_getAsn(uint8_t* array);
// events
! void ieee154e_startOfFrame(PORT_RADIOTIMER_WIDTH capturedTime);
! void ieee154e_endOfFrame(PORT_RADIOTIMER_WIDTH capturedTime);
// misc
! bool debugPrint_asn(void);
! bool debugPrint_isSync(void);
! bool debugPrint_macStats(void);
/**
\}