Slave Implementation of WANOT Slave
Dependencies: SX1276Lib mbed-src
SlaveSetUp.cpp@0:80ebf9b1dd4f, 2016-05-23 (annotated)
- Committer:
- semsem
- Date:
- Mon May 23 22:28:07 2016 +0000
- Revision:
- 0:80ebf9b1dd4f
WANOT
Who changed what in which revision?
User | Revision | Line number | New 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 | } |