Master Implementation of WANOT

Dependencies:   SX1276Lib mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MasterTDMA.cpp Source File

MasterTDMA.cpp

00001 #include "WANOT.h"
00002 
00003 /*
00004  *  Global variables declarations
00005  */
00006 
00007 extern SuperSlotStates SuperSlotState;
00008 
00009 extern RadioEvents_t RadioEvents;
00010 extern SX1276MB1xAS Radio;
00011 
00012 extern uint16_t BufferSize;
00013 extern uint8_t Buffer[];
00014 
00015 extern int16_t RssiValue;
00016 extern int8_t SnrValue;
00017 
00018 extern uint32_t LORA_Channels[NUMBER_OF_CHANNELS];
00019 
00020 extern uint8_t SlotNumber;
00021 extern uint8_t TDMAChannel;
00022 
00023 volatile MasterTDMAStates MasterTDMAState = TDMA_sendBeacon;
00024 volatile TDMA_msgType TDMA_messageType = TDMA_msgRTS;
00025 volatile uint8_t Beacon_Counter = 0;
00026 
00027 static Timer timer;
00028 static int begin, end;
00029 
00030 void TDMA_OnTxDone(void)
00031 {
00032     if( MasterTDMAState != TDMA_Wait_for_Data ){
00033         Radio.Rx(RX_TIMEOUT_VALUE);
00034         debug("TDMA OnTxDone!!\n\r");
00035     }   else    {
00036         Radio.Rx(4*RX_TIMEOUT_VALUE);
00037         debug("TDMA OnTxDone!!\n\r");
00038     }
00039 
00040 }
00041 
00042 void TDMA_OnRxDone(uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr)
00043 {
00044     Radio.Sleep();
00045     BufferSize = size;
00046     memcpy(Buffer, payload, BufferSize);
00047     RssiValue = rssi;
00048     SnrValue = snr;
00049 
00050     debug("OnRxDone!!\n\r SNR = %d , RSSI = %d\n\r",snr, rssi);
00051 
00052     switch (MasterTDMAState) {
00053         case TDMA_Wait_for_RTS:
00054             TDMA_messageType = TDMA_msgRTS;
00055             if (TDMA_messageType == Buffer[0]) {
00056                 MasterTDMAState = TDMA_Send_CTS;
00057                 debug("RTS Packet\n\r");
00058             } else {
00059                 MasterTDMAState = TDMA_sendBeacon;
00060                 debug("RTS Packet Mismatch\n\r");
00061             }
00062             break;
00063 
00064         case TDMA_Wait_for_Data:
00065             TDMA_messageType = TDMA_msgData;
00066             if (TDMA_messageType == Buffer[0]) {
00067                 MasterTDMAState = TDMA_Send_Ack;
00068             } else {
00069                 MasterTDMAState = TDMA_sendBeacon;
00070             }
00071             break;
00072 
00073         default:
00074             break;
00075 
00076 
00077     }
00078 
00079 
00080 }
00081 
00082 void TDMA_OnTxTimeout(void)
00083 {
00084 
00085 }
00086 
00087 void TDMA_OnRxTimeout(void)
00088 {
00089     MasterTDMAState = TDMA_sendBeacon;
00090     debug("OnRxTimeout!!\n\r");
00091 
00092 }
00093 
00094 void TDMA_OnRxError(void)
00095 {
00096     MasterTDMAState = TDMA_sendBeacon;
00097 }
00098 
00099 void MasterTDMA(uint8_t SlaveLocalID)
00100 {
00101     debug("Master TDMA Phase Started...\n\r");
00102     
00103     timer.start();
00104     begin = timer.read_us();
00105     
00106     MasterTDMAState = TDMA_sendBeacon;
00107     
00108     // Initialize Radio driver
00109     RadioEvents.TxDone = TDMA_OnTxDone;
00110     RadioEvents.RxDone = TDMA_OnRxDone;
00111     RadioEvents.RxError = TDMA_OnRxError;
00112     RadioEvents.TxTimeout = TDMA_OnTxTimeout;
00113     RadioEvents.RxTimeout = TDMA_OnRxTimeout;
00114     Radio.Init(&RadioEvents);
00115 
00116     Radio.SetChannel(LORA_Channels[TDMAChannel]);
00117 
00118     Radio.SetTxConfig(MODEM_LORA, TX_OUTPUT_POWER, 0, SET_UP_LORA_BANDWIDTH,
00119                       SET_UP_LORA_SPREADING_FACTOR, LORA_CODINGRATE,
00120                       LORA_PREAMBLE_LENGTH, LORA_FIX_LENGTH_PAYLOAD_ON,
00121                       SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
00122                       LORA_IQ_INVERSION_ON, 2000000);
00123 
00124     Radio.SetRxConfig(MODEM_LORA, SET_UP_LORA_BANDWIDTH, SET_UP_LORA_SPREADING_FACTOR,
00125                       LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH,
00126                       LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, 0,
00127                       SET_UP_LORA_CRC_ENABLED, LORA_FHSS_ENABLED, LORA_NB_SYMB_HOP,
00128                       LORA_IQ_INVERSION_ON, true);
00129 
00130     while (SuperSlotState ==  TDMA_Phase) {
00131         switch (MasterTDMAState) {
00132             case TDMA_sendBeacon:
00133                 if (Beacon_Counter < 2) {
00134                     Beacon_Counter++;
00135                     Buffer[0] = SETUP_BEACON_SYNCWORD;
00136                     Buffer[1] = SlaveLocalID;
00137                     Radio.Send(Buffer, BUFFER_SIZE_RTS);
00138                     debug("TDMA_sendBeacon\n\r");
00139                     MasterTDMAState = TDMA_Wait_for_RTS;
00140                 } else {
00141                     MasterTDMAState = TDMA_Slave_Not_Found;
00142                     Beacon_Counter = 0;
00143                 }
00144                 break;
00145 
00146             case TDMA_Send_CTS:
00147                 TDMA_messageType = TDMA_msgCTS;
00148                 Buffer[0] = TDMA_messageType;
00149                 Buffer[1] = SnrValue;
00150                 Radio.Send(Buffer, BUFFER_SIZE_CTS);
00151                 debug("RTS Received\n\r");
00152                 MasterTDMAState = TDMA_Wait_for_Data;
00153                 break;
00154 
00155             case TDMA_Send_Ack:
00156                 TDMA_messageType = TDMA_msgAck;
00157                 Buffer[0] = TDMA_messageType;
00158                 Radio.Send(Buffer, BUFFER_SIZE_JoinAccept);
00159                 debug("Data Received\n\r");
00160                 end = timer.read_us();
00161                 debug("TDMA took : %f S\n\r", (end-begin+20000)/1000000.0);
00162                 debug("Master TDMA Slot Finished...\n\r");
00163                 return;
00164 
00165             case TDMA_Slave_Not_Found:
00166                 debug("Case of Slave Not Found\n\r");
00167                 Radio.Sleep();
00168                 wait_us(TDMA_TIME_OUT_VALUE);
00169                 MasterTDMAState = TDMA_sendBeacon;
00170                 break;
00171 
00172             case TDMA_Wait_for_RTS:
00173             case TDMA_Wait_for_Data:
00174                 break;
00175             default:
00176                 break;
00177 
00178         }
00179 
00180     }
00181 }