houss red
/
Master_F
Master Implementation of WANOT
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Wed Jul 13 2022 09:10:33 by 1.7.2