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
semsem 0:80ebf9b1dd4f 2 #include "WANOT.h"
semsem 0:80ebf9b1dd4f 3
semsem 0:80ebf9b1dd4f 4 /*
semsem 0:80ebf9b1dd4f 5 * Global variables declarations
semsem 0:80ebf9b1dd4f 6 */
semsem 0:80ebf9b1dd4f 7
semsem 0:80ebf9b1dd4f 8 extern SuperSlotStates SuperSlotState;
semsem 0:80ebf9b1dd4f 9
semsem 0:80ebf9b1dd4f 10 extern Slave_Beacon_State Slave_Beacon_States;
semsem 0:80ebf9b1dd4f 11
semsem 0:80ebf9b1dd4f 12 volatile SlaveSetUpStates SlaveSetUpState = Rx_Init;
semsem 0:80ebf9b1dd4f 13 extern SlaveRegStates SlaveRegState;
semsem 0:80ebf9b1dd4f 14
semsem 0:80ebf9b1dd4f 15 volatile msgType messageType = msgRTS;
semsem 0:80ebf9b1dd4f 16 volatile msgType messageType2 = msgCTS;
semsem 0:80ebf9b1dd4f 17
semsem 0:80ebf9b1dd4f 18 extern RadioEvents_t RadioEvents;
semsem 0:80ebf9b1dd4f 19 extern SX1276MB1xAS Radio;
semsem 0:80ebf9b1dd4f 20
semsem 0:80ebf9b1dd4f 21 extern uint16_t BufferSize;
semsem 0:80ebf9b1dd4f 22 extern uint8_t Buffer[];
semsem 0:80ebf9b1dd4f 23
semsem 0:80ebf9b1dd4f 24 extern uint32_t LORA_Channels[NUMBER_OF_CHANNELS];
semsem 0:80ebf9b1dd4f 25
semsem 0:80ebf9b1dd4f 26 extern int16_t RssiValue;
semsem 0:80ebf9b1dd4f 27 extern int8_t SnrValue;
semsem 0:80ebf9b1dd4f 28
semsem 0:80ebf9b1dd4f 29 extern uint8_t TDMAChannel;
semsem 0:80ebf9b1dd4f 30 extern uint8_t SlaveLocalID;
semsem 0:80ebf9b1dd4f 31
semsem 0:80ebf9b1dd4f 32 void SetUp_OnTxDone(void)
semsem 0:80ebf9b1dd4f 33 {
semsem 0:80ebf9b1dd4f 34 Radio.Rx(RX_TIMEOUT_VALUE);
semsem 0:80ebf9b1dd4f 35 debug("SetUp_OnTxDone!!\n\r");
semsem 0:80ebf9b1dd4f 36
semsem 0:80ebf9b1dd4f 37 }
semsem 0:80ebf9b1dd4f 38
semsem 0:80ebf9b1dd4f 39 void SetUp_OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
semsem 0:80ebf9b1dd4f 40 {
semsem 0:80ebf9b1dd4f 41 Radio.Sleep();
semsem 0:80ebf9b1dd4f 42 BufferSize = size;
semsem 0:80ebf9b1dd4f 43 memcpy(Buffer, payload, BufferSize);
semsem 0:80ebf9b1dd4f 44 RssiValue = rssi;
semsem 0:80ebf9b1dd4f 45 SnrValue = snr;
semsem 0:80ebf9b1dd4f 46 debug("SetUp_OnRxDone!!\n\r");
semsem 0:80ebf9b1dd4f 47
semsem 0:80ebf9b1dd4f 48 switch (SlaveSetUpState) {
semsem 0:80ebf9b1dd4f 49 case Wait_for_Beacon:
semsem 0:80ebf9b1dd4f 50 if(Buffer[0] == BEACON_SYNCWORD) {
semsem 0:80ebf9b1dd4f 51 SlaveSetUpState = Phy_CS;
semsem 0:80ebf9b1dd4f 52 debug("Beacon Packet\n\r");
semsem 0:80ebf9b1dd4f 53 } else {
semsem 0:80ebf9b1dd4f 54 SlaveSetUpState = Rx_Init;
semsem 0:80ebf9b1dd4f 55 debug("Beacon Mismatch\n\r");
semsem 0:80ebf9b1dd4f 56
semsem 0:80ebf9b1dd4f 57 }
semsem 0:80ebf9b1dd4f 58 break;
semsem 0:80ebf9b1dd4f 59
semsem 0:80ebf9b1dd4f 60 case Virtual_CS:
semsem 0:80ebf9b1dd4f 61 if ((messageType == Buffer[0]) || (messageType2 == Buffer[0])) {
semsem 0:80ebf9b1dd4f 62 SlaveSetUpState = Channel_Busy;
semsem 0:80ebf9b1dd4f 63 debug("Channel is Busy(CTS/RTS)!!\n\r");
semsem 0:80ebf9b1dd4f 64 } else {
semsem 0:80ebf9b1dd4f 65 SlaveSetUpState = Channel_Busy;
semsem 0:80ebf9b1dd4f 66 debug("Channel is Busy(Invalid Packet)!!\n\r");
semsem 0:80ebf9b1dd4f 67 }
semsem 0:80ebf9b1dd4f 68 break;
semsem 0:80ebf9b1dd4f 69
semsem 0:80ebf9b1dd4f 70 case Wait_for_CTS:
semsem 0:80ebf9b1dd4f 71 messageType = msgCTS;
semsem 0:80ebf9b1dd4f 72 if (messageType == Buffer[0]) {
semsem 0:80ebf9b1dd4f 73 SlaveSetUpState = Send_JoinReq;
semsem 0:80ebf9b1dd4f 74 debug("CTS Packet\n\r");
semsem 0:80ebf9b1dd4f 75 } else {
semsem 0:80ebf9b1dd4f 76 SlaveSetUpState = Rx_Init;
semsem 0:80ebf9b1dd4f 77 debug("CTS Mismatch\n\r");
semsem 0:80ebf9b1dd4f 78 }
semsem 0:80ebf9b1dd4f 79 break;
semsem 0:80ebf9b1dd4f 80
semsem 0:80ebf9b1dd4f 81 case Wait_for_JoinAccept:
semsem 0:80ebf9b1dd4f 82 messageType = msgJoinAccept;
semsem 0:80ebf9b1dd4f 83 if (messageType == Buffer[0]) {
semsem 0:80ebf9b1dd4f 84 SlaveLocalID = Buffer[11];
semsem 0:80ebf9b1dd4f 85 SlaveSetUpState = Send_ACK;
semsem 0:80ebf9b1dd4f 86 debug("JoinAccept Packet\n\r");
semsem 0:80ebf9b1dd4f 87 } else {
semsem 0:80ebf9b1dd4f 88 SlaveSetUpState = Rx_Init;
semsem 0:80ebf9b1dd4f 89 debug("JoinAccept Mismatch\n\r");
semsem 0:80ebf9b1dd4f 90 }
semsem 0:80ebf9b1dd4f 91 break;
semsem 0:80ebf9b1dd4f 92
semsem 0:80ebf9b1dd4f 93 default:
semsem 0:80ebf9b1dd4f 94 debug("Invalid Packet!!");
semsem 0:80ebf9b1dd4f 95 }
semsem 0:80ebf9b1dd4f 96
semsem 0:80ebf9b1dd4f 97
semsem 0:80ebf9b1dd4f 98 }
semsem 0:80ebf9b1dd4f 99
semsem 0:80ebf9b1dd4f 100 void SetUp_OnTxTimeout(void)
semsem 0:80ebf9b1dd4f 101 {
semsem 0:80ebf9b1dd4f 102 SlaveSetUpState = Rx_Init;
semsem 0:80ebf9b1dd4f 103 debug("SetUp_OnTxTimeout!!\n\r");
semsem 0:80ebf9b1dd4f 104
semsem 0:80ebf9b1dd4f 105 }
semsem 0:80ebf9b1dd4f 106
semsem 0:80ebf9b1dd4f 107 void SetUp_OnRxTimeout(void)
semsem 0:80ebf9b1dd4f 108 {
semsem 0:80ebf9b1dd4f 109 switch(SlaveSetUpState) {
semsem 0:80ebf9b1dd4f 110 case Virtual_CS:
semsem 0:80ebf9b1dd4f 111 SlaveSetUpState = Send_RTS;
semsem 0:80ebf9b1dd4f 112 debug("Channel is Free!!\n\r");
semsem 0:80ebf9b1dd4f 113 break;
semsem 0:80ebf9b1dd4f 114 default:
semsem 0:80ebf9b1dd4f 115 SlaveSetUpState = Rx_Init;
semsem 0:80ebf9b1dd4f 116 debug("SetUp_OnRxTimeout!!\n\r");
semsem 0:80ebf9b1dd4f 117 }
semsem 0:80ebf9b1dd4f 118 }
semsem 0:80ebf9b1dd4f 119
semsem 0:80ebf9b1dd4f 120 void SetUp_OnRxError(void)
semsem 0:80ebf9b1dd4f 121 {
semsem 0:80ebf9b1dd4f 122 SlaveSetUpState = Rx_Init;
semsem 0:80ebf9b1dd4f 123
semsem 0:80ebf9b1dd4f 124 }
semsem 0:80ebf9b1dd4f 125
semsem 0:80ebf9b1dd4f 126 void SlaveSetUp()
semsem 0:80ebf9b1dd4f 127 {
semsem 0:80ebf9b1dd4f 128 debug("Slave Set Up Phase Started...\n\r");
semsem 0:80ebf9b1dd4f 129
semsem 0:80ebf9b1dd4f 130 // Initialize Radio driver
semsem 0:80ebf9b1dd4f 131 RadioEvents.TxDone = SetUp_OnTxDone;
semsem 0:80ebf9b1dd4f 132 RadioEvents.RxDone = SetUp_OnRxDone;
semsem 0:80ebf9b1dd4f 133 RadioEvents.RxError = SetUp_OnRxError;
semsem 0:80ebf9b1dd4f 134 RadioEvents.TxTimeout = SetUp_OnTxTimeout;
semsem 0:80ebf9b1dd4f 135 RadioEvents.RxTimeout = SetUp_OnRxTimeout;
semsem 0:80ebf9b1dd4f 136 Radio.Init(&RadioEvents);
semsem 0:80ebf9b1dd4f 137
semsem 0:80ebf9b1dd4f 138 while ((SuperSlotState == SetUp_Phase) && (SlaveRegState == UnRegistered) && (Slave_Beacon_States == Beacon_Recieved)) {
semsem 0:80ebf9b1dd4f 139 switch (SlaveSetUpState) {
semsem 0:80ebf9b1dd4f 140 case Phy_CS:
semsem 0:80ebf9b1dd4f 141 if(Radio.IsChannelFree(MODEM_LORA, SET_UP_FREQUENCY, RSSI_THRESHOLD)) {
semsem 0:80ebf9b1dd4f 142 uint16_t BackOffValue = MIN_BACK_OFF + /*rand()%*/RANDOM_BACK_OFF_WINDOW;
semsem 0:80ebf9b1dd4f 143 SlaveSetUpState = Virtual_CS;
semsem 0:80ebf9b1dd4f 144 Radio.Rx(BackOffValue);
semsem 0:80ebf9b1dd4f 145 } else {
semsem 0:80ebf9b1dd4f 146 SlaveSetUpState = Channel_Busy;
semsem 0:80ebf9b1dd4f 147 }
semsem 0:80ebf9b1dd4f 148 break;
semsem 0:80ebf9b1dd4f 149
semsem 0:80ebf9b1dd4f 150
semsem 0:80ebf9b1dd4f 151 case Virtual_CS:
semsem 0:80ebf9b1dd4f 152 break;
semsem 0:80ebf9b1dd4f 153
semsem 0:80ebf9b1dd4f 154 case Channel_Busy:
semsem 0:80ebf9b1dd4f 155 debug("Channel Busy !!\n\r");
semsem 0:80ebf9b1dd4f 156 wait_ms(MIN_BACK_OFF + RANDOM_BACK_OFF_WINDOW * rand());
semsem 0:80ebf9b1dd4f 157 SlaveSetUpState = Wait_for_Beacon;
semsem 0:80ebf9b1dd4f 158 break;
semsem 0:80ebf9b1dd4f 159
semsem 0:80ebf9b1dd4f 160 case Send_RTS:
semsem 0:80ebf9b1dd4f 161 messageType = msgRTS;
semsem 0:80ebf9b1dd4f 162 Buffer[0] = messageType;
semsem 0:80ebf9b1dd4f 163 Buffer[1] = SnrValue;
semsem 0:80ebf9b1dd4f 164 Radio.Send(Buffer, BUFFER_SIZE_RTS);
semsem 0:80ebf9b1dd4f 165 debug("Case of RTS Sent\n\r");
semsem 0:80ebf9b1dd4f 166 SlaveSetUpState = Wait_for_CTS;
semsem 0:80ebf9b1dd4f 167 break;
semsem 0:80ebf9b1dd4f 168
semsem 0:80ebf9b1dd4f 169 case Send_JoinReq:
semsem 0:80ebf9b1dd4f 170 messageType = msgJoinReq;
semsem 0:80ebf9b1dd4f 171 Buffer[0] = messageType;
semsem 0:80ebf9b1dd4f 172 Radio.Send(Buffer, BUFFER_SIZE_JoinReq);
semsem 0:80ebf9b1dd4f 173 debug("Case of JoinRequest Sent\n\r");
semsem 0:80ebf9b1dd4f 174 SlaveSetUpState = Wait_for_JoinAccept;
semsem 0:80ebf9b1dd4f 175 break;
semsem 0:80ebf9b1dd4f 176
semsem 0:80ebf9b1dd4f 177 case Send_ACK:
semsem 0:80ebf9b1dd4f 178 messageType = msgAck;
semsem 0:80ebf9b1dd4f 179 Buffer[0] = messageType;
semsem 0:80ebf9b1dd4f 180 Radio.Send(Buffer, BUFFER_SIZE_Ack);
semsem 0:80ebf9b1dd4f 181 debug("Registered\n\r");
semsem 0:80ebf9b1dd4f 182 SlaveSetUpState = Rx_Init;
semsem 0:80ebf9b1dd4f 183 SlaveRegState = Registered;
semsem 0:80ebf9b1dd4f 184 debug("Slave Set Up Phase Finished...\n\r");
semsem 0:80ebf9b1dd4f 185 return;
semsem 0:80ebf9b1dd4f 186
semsem 0:80ebf9b1dd4f 187 case Rx_Init:
semsem 0:80ebf9b1dd4f 188 Radio.Rx( RX_TIMEOUT_VALUE );
semsem 0:80ebf9b1dd4f 189 SlaveSetUpState = Wait_for_Beacon;
semsem 0:80ebf9b1dd4f 190 debug("Case of Rx_Init\n\r");
semsem 0:80ebf9b1dd4f 191 break;
semsem 0:80ebf9b1dd4f 192 case Wait_for_Beacon:
semsem 0:80ebf9b1dd4f 193 case Wait_for_CTS:
semsem 0:80ebf9b1dd4f 194 case Wait_for_JoinAccept:
semsem 0:80ebf9b1dd4f 195 break;
semsem 0:80ebf9b1dd4f 196 default:
semsem 0:80ebf9b1dd4f 197 break;
semsem 0:80ebf9b1dd4f 198
semsem 0:80ebf9b1dd4f 199 }
semsem 0:80ebf9b1dd4f 200
semsem 0:80ebf9b1dd4f 201 }
semsem 0:80ebf9b1dd4f 202 }