Slave Implementation of WANOT Slave
Dependencies: SX1276Lib mbed-src
Diff: SlaveTDMA.cpp
- Revision:
- 0:80ebf9b1dd4f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SlaveTDMA.cpp Mon May 23 22:28:07 2016 +0000 @@ -0,0 +1,189 @@ +#include "WANOT.h" + +/* + * Global variables declarations + */ + +extern SuperSlotStates SuperSlotState; +extern SlaveRegStates SlaveRegState; + +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; + +volatile SlaveTDMAStates SlaveTDMAState = TDMA_Wait_for_Beacon; +volatile TDMA_msgType TDMA_messageType = TDMA_msgRTS; + + +void TDMA_OnTxDone(void) +{ + Radio.Rx(RX_TIMEOUT_VALUE); + debug("TDMA_OnTxDone!!\n\r"); + +} + +void TDMA_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("TDMA_OnRxDone!!\n\r"); + + switch (SlaveTDMAState) { + case TDMA_Wait_for_Beacon: + + if(Buffer[0] == SETUP_BEACON_SYNCWORD) { + debug("Beacon Packet\n\r"); + if(Buffer[1] == SlaveLocalID) + { + SlaveTDMAState = TDMA_Send_RTS; + debug("Slave Correct Slot \n\r"); + } else { + debug("Slave InCorrect Slot \n\r"); + //SlaveTDMAState = TDMA_Finished;//////////////////////////////// + SlaveTDMAState = TDMA_Wait_for_Beacon; + } + } else { + debug("Beacon Mismatch\n\r"); + + SlaveTDMAState = TDMA_Finished; + } + break; + + + case TDMA_Wait_for_CTS: + TDMA_messageType = TDMA_msgCTS; + if (TDMA_messageType == Buffer[0]) { + debug("CTS Packet\n\r"); + SlaveTDMAState = TDMA_Send_Data; + } else { + debug("Wait for CTS failed \n\r"); + + SlaveTDMAState = TDMA_Finished; + } + break; + + case TDMA_Wait_for_Ack: + TDMA_messageType = TDMA_msgAck; + if (TDMA_messageType == Buffer[0]) { + debug("Data Sent and Master Acked \n\r"); + SlaveTDMAState = TDMA_Wait_for_Beacon; + + SlaveTDMAState = TDMA_Finished; + } else { + debug("Master Ack Mismatch \n\r"); + + SlaveTDMAState = TDMA_Finished; + } + break; + + default: + debug("Invalid Packet!!"); + + SlaveTDMAState = TDMA_Finished; + } + +} + +void TDMA_OnTxTimeout(void) +{ + debug("TDMA_OnTxTimeout!!\n\r"); + + SlaveTDMAState = TDMA_Finished; +} + +void TDMA_OnRxTimeout(void) +{ + debug("TDMA_OnRxTimeout!!\n\r"); + + SlaveTDMAState = TDMA_Finished; +} + +void TDMA_OnRxError(void) +{ + debug("TDMA_OnRxError!!\n\r"); + + SlaveTDMAState = TDMA_Finished; +} + +void SlaveTDMA() +{ + + debug("Slave TDMA Started...\n\r"); + + SlaveTDMAState = TDMA_Wait_for_Beacon; + + // Initialize Radio driver + RadioEvents.TxDone = TDMA_OnTxDone; + RadioEvents.RxDone = TDMA_OnRxDone; + RadioEvents.RxError = TDMA_OnRxError; + RadioEvents.TxTimeout = TDMA_OnTxTimeout; + RadioEvents.RxTimeout = TDMA_OnRxTimeout; + Radio.Init(&RadioEvents); + + Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, SET_UP_LORA_BANDWIDTH, + SET_UP_LORA_SPREADING_FACTOR, LORA_CODINGRATE, + LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON, + SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, + LORA_IQ_INVERSION_ON, 2000000); + + Radio.SetRxConfig(MODEM_LORA, SET_UP_LORA_BANDWIDTH, SET_UP_LORA_SPREADING_FACTOR, + LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH, + LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0, + SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP, + LORA_IQ_INVERSION_ON, true); + + Radio.SetChannel(LORA_Channels[TDMAChannel]); + Radio.Rx(RX_TIMEOUT_VALUE); + + + while (SuperSlotState == TDMA_Phase) { + + switch (SlaveTDMAState) { + + case TDMA_Send_RTS: + TDMA_messageType = TDMA_msgRTS; + Buffer[0] = TDMA_messageType; + Buffer[1] = SnrValue; + Radio.Send(Buffer, BUFFER_SIZE_RTS); + debug("Sending RTS\n\r"); + SlaveTDMAState = TDMA_Wait_for_CTS; + break; + + case TDMA_Send_Data: + TDMA_messageType = TDMA_msgData; + Buffer[0] = TDMA_messageType; + Radio.Send(Buffer, BUFFER_SIZE_TDMA_DATA); + debug("Sending DATA\n\r"); + SlaveTDMAState = TDMA_Wait_for_Ack; + break; + + case TDMA_Finished: + debug("Slave TDMA Slot Finished...\n\r"); + return; + + + case TDMA_Wait_for_Beacon: + case TDMA_Wait_for_CTS: + case TDMA_Wait_for_Ack: + + break; + default: + break; + + } + + } +} \ No newline at end of file