Master Implementation of WANOT

Dependencies:   SX1276Lib mbed

Committer:
semsem
Date:
Mon May 23 22:25:40 2016 +0000
Revision:
0:8b449140caa2
V0.2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
semsem 0:8b449140caa2 1 #include "WANOT.h"
semsem 0:8b449140caa2 2
semsem 0:8b449140caa2 3 /*
semsem 0:8b449140caa2 4 * Global variables declarations
semsem 0:8b449140caa2 5 */
semsem 0:8b449140caa2 6
semsem 0:8b449140caa2 7 extern SuperSlotStates SuperSlotState;
semsem 0:8b449140caa2 8
semsem 0:8b449140caa2 9 extern RadioEvents_t RadioEvents;
semsem 0:8b449140caa2 10 extern SX1276MB1xAS Radio;
semsem 0:8b449140caa2 11
semsem 0:8b449140caa2 12 extern uint16_t BufferSize;
semsem 0:8b449140caa2 13 extern uint8_t Buffer[];
semsem 0:8b449140caa2 14
semsem 0:8b449140caa2 15 extern int16_t RssiValue;
semsem 0:8b449140caa2 16 extern int8_t SnrValue;
semsem 0:8b449140caa2 17
semsem 0:8b449140caa2 18 extern uint32_t LORA_Channels[NUMBER_OF_CHANNELS];
semsem 0:8b449140caa2 19
semsem 0:8b449140caa2 20 extern uint8_t SlotNumber;
semsem 0:8b449140caa2 21 extern uint8_t TDMAChannel;
semsem 0:8b449140caa2 22
semsem 0:8b449140caa2 23 volatile MasterTDMAStates MasterTDMAState = TDMA_sendBeacon;
semsem 0:8b449140caa2 24 volatile TDMA_msgType TDMA_messageType = TDMA_msgRTS;
semsem 0:8b449140caa2 25 volatile uint8_t Beacon_Counter = 0;
semsem 0:8b449140caa2 26
semsem 0:8b449140caa2 27 static Timer timer;
semsem 0:8b449140caa2 28 static int begin, end;
semsem 0:8b449140caa2 29
semsem 0:8b449140caa2 30 void TDMA_OnTxDone(void)
semsem 0:8b449140caa2 31 {
semsem 0:8b449140caa2 32 if( MasterTDMAState != TDMA_Wait_for_Data ){
semsem 0:8b449140caa2 33 Radio.Rx(RX_TIMEOUT_VALUE);
semsem 0:8b449140caa2 34 debug("TDMA OnTxDone!!\n\r");
semsem 0:8b449140caa2 35 } else {
semsem 0:8b449140caa2 36 Radio.Rx(4*RX_TIMEOUT_VALUE);
semsem 0:8b449140caa2 37 debug("TDMA OnTxDone!!\n\r");
semsem 0:8b449140caa2 38 }
semsem 0:8b449140caa2 39
semsem 0:8b449140caa2 40 }
semsem 0:8b449140caa2 41
semsem 0:8b449140caa2 42 void TDMA_OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
semsem 0:8b449140caa2 43 {
semsem 0:8b449140caa2 44 Radio.Sleep();
semsem 0:8b449140caa2 45 BufferSize = size;
semsem 0:8b449140caa2 46 memcpy(Buffer, payload, BufferSize);
semsem 0:8b449140caa2 47 RssiValue = rssi;
semsem 0:8b449140caa2 48 SnrValue = snr;
semsem 0:8b449140caa2 49
semsem 0:8b449140caa2 50 debug("OnRxDone!!\n\r SNR = %d , RSSI = %d\n\r",snr, rssi);
semsem 0:8b449140caa2 51
semsem 0:8b449140caa2 52 switch (MasterTDMAState) {
semsem 0:8b449140caa2 53 case TDMA_Wait_for_RTS:
semsem 0:8b449140caa2 54 TDMA_messageType = TDMA_msgRTS;
semsem 0:8b449140caa2 55 if (TDMA_messageType == Buffer[0]) {
semsem 0:8b449140caa2 56 MasterTDMAState = TDMA_Send_CTS;
semsem 0:8b449140caa2 57 debug("RTS Packet\n\r");
semsem 0:8b449140caa2 58 } else {
semsem 0:8b449140caa2 59 MasterTDMAState = TDMA_sendBeacon;
semsem 0:8b449140caa2 60 debug("RTS Packet Mismatch\n\r");
semsem 0:8b449140caa2 61 }
semsem 0:8b449140caa2 62 break;
semsem 0:8b449140caa2 63
semsem 0:8b449140caa2 64 case TDMA_Wait_for_Data:
semsem 0:8b449140caa2 65 TDMA_messageType = TDMA_msgData;
semsem 0:8b449140caa2 66 if (TDMA_messageType == Buffer[0]) {
semsem 0:8b449140caa2 67 MasterTDMAState = TDMA_Send_Ack;
semsem 0:8b449140caa2 68 } else {
semsem 0:8b449140caa2 69 MasterTDMAState = TDMA_sendBeacon;
semsem 0:8b449140caa2 70 }
semsem 0:8b449140caa2 71 break;
semsem 0:8b449140caa2 72
semsem 0:8b449140caa2 73 default:
semsem 0:8b449140caa2 74 break;
semsem 0:8b449140caa2 75
semsem 0:8b449140caa2 76
semsem 0:8b449140caa2 77 }
semsem 0:8b449140caa2 78
semsem 0:8b449140caa2 79
semsem 0:8b449140caa2 80 }
semsem 0:8b449140caa2 81
semsem 0:8b449140caa2 82 void TDMA_OnTxTimeout(void)
semsem 0:8b449140caa2 83 {
semsem 0:8b449140caa2 84
semsem 0:8b449140caa2 85 }
semsem 0:8b449140caa2 86
semsem 0:8b449140caa2 87 void TDMA_OnRxTimeout(void)
semsem 0:8b449140caa2 88 {
semsem 0:8b449140caa2 89 MasterTDMAState = TDMA_sendBeacon;
semsem 0:8b449140caa2 90 debug("OnRxTimeout!!\n\r");
semsem 0:8b449140caa2 91
semsem 0:8b449140caa2 92 }
semsem 0:8b449140caa2 93
semsem 0:8b449140caa2 94 void TDMA_OnRxError(void)
semsem 0:8b449140caa2 95 {
semsem 0:8b449140caa2 96 MasterTDMAState = TDMA_sendBeacon;
semsem 0:8b449140caa2 97 }
semsem 0:8b449140caa2 98
semsem 0:8b449140caa2 99 void MasterTDMA(uint8_t SlaveLocalID)
semsem 0:8b449140caa2 100 {
semsem 0:8b449140caa2 101 debug("Master TDMA Phase Started...\n\r");
semsem 0:8b449140caa2 102
semsem 0:8b449140caa2 103 timer.start();
semsem 0:8b449140caa2 104 begin = timer.read_us();
semsem 0:8b449140caa2 105
semsem 0:8b449140caa2 106 MasterTDMAState = TDMA_sendBeacon;
semsem 0:8b449140caa2 107
semsem 0:8b449140caa2 108 // Initialize Radio driver
semsem 0:8b449140caa2 109 RadioEvents.TxDone = TDMA_OnTxDone;
semsem 0:8b449140caa2 110 RadioEvents.RxDone = TDMA_OnRxDone;
semsem 0:8b449140caa2 111 RadioEvents.RxError = TDMA_OnRxError;
semsem 0:8b449140caa2 112 RadioEvents.TxTimeout = TDMA_OnTxTimeout;
semsem 0:8b449140caa2 113 RadioEvents.RxTimeout = TDMA_OnRxTimeout;
semsem 0:8b449140caa2 114 Radio.Init(&RadioEvents);
semsem 0:8b449140caa2 115
semsem 0:8b449140caa2 116 Radio.SetChannel(LORA_Channels[TDMAChannel]);
semsem 0:8b449140caa2 117
semsem 0:8b449140caa2 118 Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, SET_UP_LORA_BANDWIDTH,
semsem 0:8b449140caa2 119 SET_UP_LORA_SPREADING_FACTOR, LORA_CODINGRATE,
semsem 0:8b449140caa2 120 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
semsem 0:8b449140caa2 121 SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
semsem 0:8b449140caa2 122 LORA_IQ_INVERSION_ON, 2000000);
semsem 0:8b449140caa2 123
semsem 0:8b449140caa2 124 Radio.SetRxConfig(MODEM_LORA, SET_UP_LORA_BANDWIDTH, SET_UP_LORA_SPREADING_FACTOR,
semsem 0:8b449140caa2 125 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
semsem 0:8b449140caa2 126 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
semsem 0:8b449140caa2 127 SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
semsem 0:8b449140caa2 128 LORA_IQ_INVERSION_ON, true);
semsem 0:8b449140caa2 129
semsem 0:8b449140caa2 130 while (SuperSlotState == TDMA_Phase) {
semsem 0:8b449140caa2 131 switch (MasterTDMAState) {
semsem 0:8b449140caa2 132 case TDMA_sendBeacon:
semsem 0:8b449140caa2 133 if (Beacon_Counter < 2) {
semsem 0:8b449140caa2 134 Beacon_Counter++;
semsem 0:8b449140caa2 135 Buffer[0] = SETUP_BEACON_SYNCWORD;
semsem 0:8b449140caa2 136 Buffer[1] = SlaveLocalID;
semsem 0:8b449140caa2 137 Radio.Send(Buffer, BUFFER_SIZE_RTS);
semsem 0:8b449140caa2 138 debug("TDMA_sendBeacon\n\r");
semsem 0:8b449140caa2 139 MasterTDMAState = TDMA_Wait_for_RTS;
semsem 0:8b449140caa2 140 } else {
semsem 0:8b449140caa2 141 MasterTDMAState = TDMA_Slave_Not_Found;
semsem 0:8b449140caa2 142 Beacon_Counter = 0;
semsem 0:8b449140caa2 143 }
semsem 0:8b449140caa2 144 break;
semsem 0:8b449140caa2 145
semsem 0:8b449140caa2 146 case TDMA_Send_CTS:
semsem 0:8b449140caa2 147 TDMA_messageType = TDMA_msgCTS;
semsem 0:8b449140caa2 148 Buffer[0] = TDMA_messageType;
semsem 0:8b449140caa2 149 Buffer[1] = SnrValue;
semsem 0:8b449140caa2 150 Radio.Send(Buffer, BUFFER_SIZE_CTS);
semsem 0:8b449140caa2 151 debug("RTS Received\n\r");
semsem 0:8b449140caa2 152 MasterTDMAState = TDMA_Wait_for_Data;
semsem 0:8b449140caa2 153 break;
semsem 0:8b449140caa2 154
semsem 0:8b449140caa2 155 case TDMA_Send_Ack:
semsem 0:8b449140caa2 156 TDMA_messageType = TDMA_msgAck;
semsem 0:8b449140caa2 157 Buffer[0] = TDMA_messageType;
semsem 0:8b449140caa2 158 Radio.Send(Buffer, BUFFER_SIZE_JoinAccept);
semsem 0:8b449140caa2 159 debug("Data Received\n\r");
semsem 0:8b449140caa2 160 end = timer.read_us();
semsem 0:8b449140caa2 161 debug("TDMA took : %f S\n\r", (end-begin+20000)/1000000.0);
semsem 0:8b449140caa2 162 debug("Master TDMA Slot Finished...\n\r");
semsem 0:8b449140caa2 163 return;
semsem 0:8b449140caa2 164
semsem 0:8b449140caa2 165 case TDMA_Slave_Not_Found:
semsem 0:8b449140caa2 166 debug("Case of Slave Not Found\n\r");
semsem 0:8b449140caa2 167 Radio.Sleep();
semsem 0:8b449140caa2 168 wait_us(TDMA_TIME_OUT_VALUE);
semsem 0:8b449140caa2 169 MasterTDMAState = TDMA_sendBeacon;
semsem 0:8b449140caa2 170 break;
semsem 0:8b449140caa2 171
semsem 0:8b449140caa2 172 case TDMA_Wait_for_RTS:
semsem 0:8b449140caa2 173 case TDMA_Wait_for_Data:
semsem 0:8b449140caa2 174 break;
semsem 0:8b449140caa2 175 default:
semsem 0:8b449140caa2 176 break;
semsem 0:8b449140caa2 177
semsem 0:8b449140caa2 178 }
semsem 0:8b449140caa2 179
semsem 0:8b449140caa2 180 }
semsem 0:8b449140caa2 181 }