Slave Implementation of WANOT Slave

Dependencies:   SX1276Lib mbed-src

Committer:
semsem
Date:
Mon May 23 22:28:07 2016 +0000
Revision:
0:80ebf9b1dd4f
WANOT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
semsem 0:80ebf9b1dd4f 1 #include "WANOT.h"
semsem 0:80ebf9b1dd4f 2
semsem 0:80ebf9b1dd4f 3 /*
semsem 0:80ebf9b1dd4f 4 * Global variables declarations
semsem 0:80ebf9b1dd4f 5 */
semsem 0:80ebf9b1dd4f 6
semsem 0:80ebf9b1dd4f 7 extern SuperSlotStates SuperSlotState;
semsem 0:80ebf9b1dd4f 8 extern SlaveRegStates SlaveRegState;
semsem 0:80ebf9b1dd4f 9
semsem 0:80ebf9b1dd4f 10 extern RadioEvents_t RadioEvents;
semsem 0:80ebf9b1dd4f 11 extern SX1276MB1xAS Radio;
semsem 0:80ebf9b1dd4f 12
semsem 0:80ebf9b1dd4f 13 extern uint16_t BufferSize;
semsem 0:80ebf9b1dd4f 14 extern uint8_t Buffer[];
semsem 0:80ebf9b1dd4f 15
semsem 0:80ebf9b1dd4f 16 extern uint32_t LORA_Channels[NUMBER_OF_CHANNELS];
semsem 0:80ebf9b1dd4f 17
semsem 0:80ebf9b1dd4f 18 extern int16_t RssiValue;
semsem 0:80ebf9b1dd4f 19 extern int8_t SnrValue;
semsem 0:80ebf9b1dd4f 20
semsem 0:80ebf9b1dd4f 21 extern uint8_t TDMAChannel;
semsem 0:80ebf9b1dd4f 22 extern uint8_t SlaveLocalID;
semsem 0:80ebf9b1dd4f 23
semsem 0:80ebf9b1dd4f 24 volatile SlaveTDMAStates SlaveTDMAState = TDMA_Wait_for_Beacon;
semsem 0:80ebf9b1dd4f 25 volatile TDMA_msgType TDMA_messageType = TDMA_msgRTS;
semsem 0:80ebf9b1dd4f 26
semsem 0:80ebf9b1dd4f 27
semsem 0:80ebf9b1dd4f 28 void TDMA_OnTxDone(void)
semsem 0:80ebf9b1dd4f 29 {
semsem 0:80ebf9b1dd4f 30 Radio.Rx(RX_TIMEOUT_VALUE);
semsem 0:80ebf9b1dd4f 31 debug("TDMA_OnTxDone!!\n\r");
semsem 0:80ebf9b1dd4f 32
semsem 0:80ebf9b1dd4f 33 }
semsem 0:80ebf9b1dd4f 34
semsem 0:80ebf9b1dd4f 35 void TDMA_OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
semsem 0:80ebf9b1dd4f 36 {
semsem 0:80ebf9b1dd4f 37 Radio.Sleep();
semsem 0:80ebf9b1dd4f 38 BufferSize = size;
semsem 0:80ebf9b1dd4f 39 memcpy(Buffer, payload, BufferSize);
semsem 0:80ebf9b1dd4f 40 RssiValue = rssi;
semsem 0:80ebf9b1dd4f 41 SnrValue = snr;
semsem 0:80ebf9b1dd4f 42 debug("TDMA_OnRxDone!!\n\r");
semsem 0:80ebf9b1dd4f 43
semsem 0:80ebf9b1dd4f 44 switch (SlaveTDMAState) {
semsem 0:80ebf9b1dd4f 45 case TDMA_Wait_for_Beacon:
semsem 0:80ebf9b1dd4f 46
semsem 0:80ebf9b1dd4f 47 if(Buffer[0] == SETUP_BEACON_SYNCWORD) {
semsem 0:80ebf9b1dd4f 48 debug("Beacon Packet\n\r");
semsem 0:80ebf9b1dd4f 49 if(Buffer[1] == SlaveLocalID)
semsem 0:80ebf9b1dd4f 50 {
semsem 0:80ebf9b1dd4f 51 SlaveTDMAState = TDMA_Send_RTS;
semsem 0:80ebf9b1dd4f 52 debug("Slave Correct Slot \n\r");
semsem 0:80ebf9b1dd4f 53 } else {
semsem 0:80ebf9b1dd4f 54 debug("Slave InCorrect Slot \n\r");
semsem 0:80ebf9b1dd4f 55 //SlaveTDMAState = TDMA_Finished;////////////////////////////////
semsem 0:80ebf9b1dd4f 56 SlaveTDMAState = TDMA_Wait_for_Beacon;
semsem 0:80ebf9b1dd4f 57 }
semsem 0:80ebf9b1dd4f 58 } else {
semsem 0:80ebf9b1dd4f 59 debug("Beacon Mismatch\n\r");
semsem 0:80ebf9b1dd4f 60
semsem 0:80ebf9b1dd4f 61 SlaveTDMAState = TDMA_Finished;
semsem 0:80ebf9b1dd4f 62 }
semsem 0:80ebf9b1dd4f 63 break;
semsem 0:80ebf9b1dd4f 64
semsem 0:80ebf9b1dd4f 65
semsem 0:80ebf9b1dd4f 66 case TDMA_Wait_for_CTS:
semsem 0:80ebf9b1dd4f 67 TDMA_messageType = TDMA_msgCTS;
semsem 0:80ebf9b1dd4f 68 if (TDMA_messageType == Buffer[0]) {
semsem 0:80ebf9b1dd4f 69 debug("CTS Packet\n\r");
semsem 0:80ebf9b1dd4f 70 SlaveTDMAState = TDMA_Send_Data;
semsem 0:80ebf9b1dd4f 71 } else {
semsem 0:80ebf9b1dd4f 72 debug("Wait for CTS failed \n\r");
semsem 0:80ebf9b1dd4f 73
semsem 0:80ebf9b1dd4f 74 SlaveTDMAState = TDMA_Finished;
semsem 0:80ebf9b1dd4f 75 }
semsem 0:80ebf9b1dd4f 76 break;
semsem 0:80ebf9b1dd4f 77
semsem 0:80ebf9b1dd4f 78 case TDMA_Wait_for_Ack:
semsem 0:80ebf9b1dd4f 79 TDMA_messageType = TDMA_msgAck;
semsem 0:80ebf9b1dd4f 80 if (TDMA_messageType == Buffer[0]) {
semsem 0:80ebf9b1dd4f 81 debug("Data Sent and Master Acked \n\r");
semsem 0:80ebf9b1dd4f 82 SlaveTDMAState = TDMA_Wait_for_Beacon;
semsem 0:80ebf9b1dd4f 83
semsem 0:80ebf9b1dd4f 84 SlaveTDMAState = TDMA_Finished;
semsem 0:80ebf9b1dd4f 85 } else {
semsem 0:80ebf9b1dd4f 86 debug("Master Ack Mismatch \n\r");
semsem 0:80ebf9b1dd4f 87
semsem 0:80ebf9b1dd4f 88 SlaveTDMAState = TDMA_Finished;
semsem 0:80ebf9b1dd4f 89 }
semsem 0:80ebf9b1dd4f 90 break;
semsem 0:80ebf9b1dd4f 91
semsem 0:80ebf9b1dd4f 92 default:
semsem 0:80ebf9b1dd4f 93 debug("Invalid Packet!!");
semsem 0:80ebf9b1dd4f 94
semsem 0:80ebf9b1dd4f 95 SlaveTDMAState = TDMA_Finished;
semsem 0:80ebf9b1dd4f 96 }
semsem 0:80ebf9b1dd4f 97
semsem 0:80ebf9b1dd4f 98 }
semsem 0:80ebf9b1dd4f 99
semsem 0:80ebf9b1dd4f 100 void TDMA_OnTxTimeout(void)
semsem 0:80ebf9b1dd4f 101 {
semsem 0:80ebf9b1dd4f 102 debug("TDMA_OnTxTimeout!!\n\r");
semsem 0:80ebf9b1dd4f 103
semsem 0:80ebf9b1dd4f 104 SlaveTDMAState = TDMA_Finished;
semsem 0:80ebf9b1dd4f 105 }
semsem 0:80ebf9b1dd4f 106
semsem 0:80ebf9b1dd4f 107 void TDMA_OnRxTimeout(void)
semsem 0:80ebf9b1dd4f 108 {
semsem 0:80ebf9b1dd4f 109 debug("TDMA_OnRxTimeout!!\n\r");
semsem 0:80ebf9b1dd4f 110
semsem 0:80ebf9b1dd4f 111 SlaveTDMAState = TDMA_Finished;
semsem 0:80ebf9b1dd4f 112 }
semsem 0:80ebf9b1dd4f 113
semsem 0:80ebf9b1dd4f 114 void TDMA_OnRxError(void)
semsem 0:80ebf9b1dd4f 115 {
semsem 0:80ebf9b1dd4f 116 debug("TDMA_OnRxError!!\n\r");
semsem 0:80ebf9b1dd4f 117
semsem 0:80ebf9b1dd4f 118 SlaveTDMAState = TDMA_Finished;
semsem 0:80ebf9b1dd4f 119 }
semsem 0:80ebf9b1dd4f 120
semsem 0:80ebf9b1dd4f 121 void SlaveTDMA()
semsem 0:80ebf9b1dd4f 122 {
semsem 0:80ebf9b1dd4f 123
semsem 0:80ebf9b1dd4f 124 debug("Slave TDMA Started...\n\r");
semsem 0:80ebf9b1dd4f 125
semsem 0:80ebf9b1dd4f 126 SlaveTDMAState = TDMA_Wait_for_Beacon;
semsem 0:80ebf9b1dd4f 127
semsem 0:80ebf9b1dd4f 128 // Initialize Radio driver
semsem 0:80ebf9b1dd4f 129 RadioEvents.TxDone = TDMA_OnTxDone;
semsem 0:80ebf9b1dd4f 130 RadioEvents.RxDone = TDMA_OnRxDone;
semsem 0:80ebf9b1dd4f 131 RadioEvents.RxError = TDMA_OnRxError;
semsem 0:80ebf9b1dd4f 132 RadioEvents.TxTimeout = TDMA_OnTxTimeout;
semsem 0:80ebf9b1dd4f 133 RadioEvents.RxTimeout = TDMA_OnRxTimeout;
semsem 0:80ebf9b1dd4f 134 Radio.Init(&RadioEvents);
semsem 0:80ebf9b1dd4f 135
semsem 0:80ebf9b1dd4f 136 Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, SET_UP_LORA_BANDWIDTH,
semsem 0:80ebf9b1dd4f 137 SET_UP_LORA_SPREADING_FACTOR, LORA_CODINGRATE,
semsem 0:80ebf9b1dd4f 138 LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
semsem 0:80ebf9b1dd4f 139 SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
semsem 0:80ebf9b1dd4f 140 LORA_IQ_INVERSION_ON, 2000000);
semsem 0:80ebf9b1dd4f 141
semsem 0:80ebf9b1dd4f 142 Radio.SetRxConfig(MODEM_LORA, SET_UP_LORA_BANDWIDTH, SET_UP_LORA_SPREADING_FACTOR,
semsem 0:80ebf9b1dd4f 143 LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
semsem 0:80ebf9b1dd4f 144 LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
semsem 0:80ebf9b1dd4f 145 SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
semsem 0:80ebf9b1dd4f 146 LORA_IQ_INVERSION_ON, true);
semsem 0:80ebf9b1dd4f 147
semsem 0:80ebf9b1dd4f 148 Radio.SetChannel(LORA_Channels[TDMAChannel]);
semsem 0:80ebf9b1dd4f 149 Radio.Rx(RX_TIMEOUT_VALUE);
semsem 0:80ebf9b1dd4f 150
semsem 0:80ebf9b1dd4f 151
semsem 0:80ebf9b1dd4f 152 while (SuperSlotState == TDMA_Phase) {
semsem 0:80ebf9b1dd4f 153
semsem 0:80ebf9b1dd4f 154 switch (SlaveTDMAState) {
semsem 0:80ebf9b1dd4f 155
semsem 0:80ebf9b1dd4f 156 case TDMA_Send_RTS:
semsem 0:80ebf9b1dd4f 157 TDMA_messageType = TDMA_msgRTS;
semsem 0:80ebf9b1dd4f 158 Buffer[0] = TDMA_messageType;
semsem 0:80ebf9b1dd4f 159 Buffer[1] = SnrValue;
semsem 0:80ebf9b1dd4f 160 Radio.Send(Buffer, BUFFER_SIZE_RTS);
semsem 0:80ebf9b1dd4f 161 debug("Sending RTS\n\r");
semsem 0:80ebf9b1dd4f 162 SlaveTDMAState = TDMA_Wait_for_CTS;
semsem 0:80ebf9b1dd4f 163 break;
semsem 0:80ebf9b1dd4f 164
semsem 0:80ebf9b1dd4f 165 case TDMA_Send_Data:
semsem 0:80ebf9b1dd4f 166 TDMA_messageType = TDMA_msgData;
semsem 0:80ebf9b1dd4f 167 Buffer[0] = TDMA_messageType;
semsem 0:80ebf9b1dd4f 168 Radio.Send(Buffer, BUFFER_SIZE_TDMA_DATA);
semsem 0:80ebf9b1dd4f 169 debug("Sending DATA\n\r");
semsem 0:80ebf9b1dd4f 170 SlaveTDMAState = TDMA_Wait_for_Ack;
semsem 0:80ebf9b1dd4f 171 break;
semsem 0:80ebf9b1dd4f 172
semsem 0:80ebf9b1dd4f 173 case TDMA_Finished:
semsem 0:80ebf9b1dd4f 174 debug("Slave TDMA Slot Finished...\n\r");
semsem 0:80ebf9b1dd4f 175 return;
semsem 0:80ebf9b1dd4f 176
semsem 0:80ebf9b1dd4f 177
semsem 0:80ebf9b1dd4f 178 case TDMA_Wait_for_Beacon:
semsem 0:80ebf9b1dd4f 179 case TDMA_Wait_for_CTS:
semsem 0:80ebf9b1dd4f 180 case TDMA_Wait_for_Ack:
semsem 0:80ebf9b1dd4f 181
semsem 0:80ebf9b1dd4f 182 break;
semsem 0:80ebf9b1dd4f 183 default:
semsem 0:80ebf9b1dd4f 184 break;
semsem 0:80ebf9b1dd4f 185
semsem 0:80ebf9b1dd4f 186 }
semsem 0:80ebf9b1dd4f 187
semsem 0:80ebf9b1dd4f 188 }
semsem 0:80ebf9b1dd4f 189 }