Slave Implementation of WANOT Slave
Dependencies: SX1276Lib mbed-src
SlaveSetUp.cpp
- Committer:
- semsem
- Date:
- 2016-05-23
- Revision:
- 0:80ebf9b1dd4f
File content as of revision 0:80ebf9b1dd4f:
#include "WANOT.h" /* * Global variables declarations */ extern SuperSlotStates SuperSlotState; extern Slave_Beacon_State Slave_Beacon_States; volatile SlaveSetUpStates SlaveSetUpState = Rx_Init; extern SlaveRegStates SlaveRegState; volatile msgType messageType = msgRTS; volatile msgType messageType2 = msgCTS; extern RadioEvents_t RadioEvents; extern SX1276MB1xAS Radio; extern uint16_t BufferSize; extern uint8_t Buffer[]; extern uint32_t LORA_Channels[NUMBER_OF_CHANNELS]; extern int16_t RssiValue; extern int8_t SnrValue; extern uint8_t TDMAChannel; extern uint8_t SlaveLocalID; void SetUp_OnTxDone(void) { Radio.Rx(RX_TIMEOUT_VALUE); debug("SetUp_OnTxDone!!\n\r"); } void SetUp_OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr) { Radio.Sleep(); BufferSize = size; memcpy(Buffer, payload, BufferSize); RssiValue = rssi; SnrValue = snr; debug("SetUp_OnRxDone!!\n\r"); switch (SlaveSetUpState) { case Wait_for_Beacon: if(Buffer[0] == BEACON_SYNCWORD) { SlaveSetUpState = Phy_CS; debug("Beacon Packet\n\r"); } else { SlaveSetUpState = Rx_Init; debug("Beacon Mismatch\n\r"); } break; case Virtual_CS: if ((messageType == Buffer[0]) || (messageType2 == Buffer[0])) { SlaveSetUpState = Channel_Busy; debug("Channel is Busy(CTS/RTS)!!\n\r"); } else { SlaveSetUpState = Channel_Busy; debug("Channel is Busy(Invalid Packet)!!\n\r"); } break; case Wait_for_CTS: messageType = msgCTS; if (messageType == Buffer[0]) { SlaveSetUpState = Send_JoinReq; debug("CTS Packet\n\r"); } else { SlaveSetUpState = Rx_Init; debug("CTS Mismatch\n\r"); } break; case Wait_for_JoinAccept: messageType = msgJoinAccept; if (messageType == Buffer[0]) { SlaveLocalID = Buffer[11]; SlaveSetUpState = Send_ACK; debug("JoinAccept Packet\n\r"); } else { SlaveSetUpState = Rx_Init; debug("JoinAccept Mismatch\n\r"); } break; default: debug("Invalid Packet!!"); } } void SetUp_OnTxTimeout(void) { SlaveSetUpState = Rx_Init; debug("SetUp_OnTxTimeout!!\n\r"); } void SetUp_OnRxTimeout(void) { switch(SlaveSetUpState) { case Virtual_CS: SlaveSetUpState = Send_RTS; debug("Channel is Free!!\n\r"); break; default: SlaveSetUpState = Rx_Init; debug("SetUp_OnRxTimeout!!\n\r"); } } void SetUp_OnRxError(void) { SlaveSetUpState = Rx_Init; } void SlaveSetUp() { debug("Slave Set Up Phase Started...\n\r"); // Initialize Radio driver RadioEvents.TxDone = SetUp_OnTxDone; RadioEvents.RxDone = SetUp_OnRxDone; RadioEvents.RxError = SetUp_OnRxError; RadioEvents.TxTimeout = SetUp_OnTxTimeout; RadioEvents.RxTimeout = SetUp_OnRxTimeout; Radio.Init(&RadioEvents); while ((SuperSlotState == SetUp_Phase) && (SlaveRegState == UnRegistered) && (Slave_Beacon_States == Beacon_Recieved)) { switch (SlaveSetUpState) { case Phy_CS: if(Radio.IsChannelFree(MODEM_LORA, SET_UP_FREQUENCY, RSSI_THRESHOLD)) { uint16_t BackOffValue = MIN_BACK_OFF + /*rand()%*/RANDOM_BACK_OFF_WINDOW; SlaveSetUpState = Virtual_CS; Radio.Rx(BackOffValue); } else { SlaveSetUpState = Channel_Busy; } break; case Virtual_CS: break; case Channel_Busy: debug("Channel Busy !!\n\r"); wait_ms(MIN_BACK_OFF + RANDOM_BACK_OFF_WINDOW * rand()); SlaveSetUpState = Wait_for_Beacon; break; case Send_RTS: messageType = msgRTS; Buffer[0] = messageType; Buffer[1] = SnrValue; Radio.Send(Buffer, BUFFER_SIZE_RTS); debug("Case of RTS Sent\n\r"); SlaveSetUpState = Wait_for_CTS; break; case Send_JoinReq: messageType = msgJoinReq; Buffer[0] = messageType; Radio.Send(Buffer, BUFFER_SIZE_JoinReq); debug("Case of JoinRequest Sent\n\r"); SlaveSetUpState = Wait_for_JoinAccept; break; case Send_ACK: messageType = msgAck; Buffer[0] = messageType; Radio.Send(Buffer, BUFFER_SIZE_Ack); debug("Registered\n\r"); SlaveSetUpState = Rx_Init; SlaveRegState = Registered; debug("Slave Set Up Phase Finished...\n\r"); return; case Rx_Init: Radio.Rx( RX_TIMEOUT_VALUE ); SlaveSetUpState = Wait_for_Beacon; debug("Case of Rx_Init\n\r"); break; case Wait_for_Beacon: case Wait_for_CTS: case Wait_for_JoinAccept: break; default: break; } } }