SX126X_PingPong_Template

Dependencies:   SX126xLib mbed

Committer:
mverdy
Date:
Tue Oct 16 15:12:01 2018 +0000
Revision:
1:ecd6c7ea3545
Parent:
0:ea5a948dfc97
Delete duplicate debug.h; Define state machines for ping-pong

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SemBen 0:ea5a948dfc97 1 /*!
SemBen 0:ea5a948dfc97 2 * \file main_pingpong.cpp
SemBen 0:ea5a948dfc97 3 *
SemBen 0:ea5a948dfc97 4 * \brief Ping-Pong implementation
SemBen 0:ea5a948dfc97 5 *
SemBen 0:ea5a948dfc97 6 * \copyright Revised BSD License, see section \ref LICENSE.
SemBen 0:ea5a948dfc97 7 *
SemBen 0:ea5a948dfc97 8 * \code
SemBen 0:ea5a948dfc97 9 * ______ _
SemBen 0:ea5a948dfc97 10 * / _____) _ | |
SemBen 0:ea5a948dfc97 11 * ( (____ _____ ____ _| |_ _____ ____| |__
SemBen 0:ea5a948dfc97 12 * \____ \| ___ | (_ _) ___ |/ ___) _ \
SemBen 0:ea5a948dfc97 13 * _____) ) ____| | | || |_| ____( (___| | | |
SemBen 0:ea5a948dfc97 14 * (______/|_____)_|_|_| \__)_____)\____)_| |_|
mverdy 1:ecd6c7ea3545 15 * (C)2013-2018 Semtech
SemBen 0:ea5a948dfc97 16 *
SemBen 0:ea5a948dfc97 17 * \endcode
SemBen 0:ea5a948dfc97 18 *
SemBen 0:ea5a948dfc97 19 */
SemBen 0:ea5a948dfc97 20
SemBen 0:ea5a948dfc97 21 #include "mbed.h"
SemBen 0:ea5a948dfc97 22 #include "sx126x-hal.h"
SemBen 0:ea5a948dfc97 23 #include "sx126x.h"
mverdy 1:ecd6c7ea3545 24 //#include "debug.h"
SemBen 0:ea5a948dfc97 25
mverdy 1:ecd6c7ea3545 26 #define SEND_PING_BEAT_US 200000
mverdy 1:ecd6c7ea3545 27 #define RX_TIMEOUT_US 200000
mverdy 1:ecd6c7ea3545 28
SemBen 0:ea5a948dfc97 29 /* Set this flag to '1' to display debug messages on the console */
SemBen 0:ea5a948dfc97 30 #define DEBUG_MESSAGE 1
SemBen 0:ea5a948dfc97 31
SemBen 0:ea5a948dfc97 32 /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */
SemBen 0:ea5a948dfc97 33 #define USE_MODEM_LORA 1
SemBen 0:ea5a948dfc97 34 #define USE_MODEM_FSK !USE_MODEM_LORA
SemBen 0:ea5a948dfc97 35
SemBen 0:ea5a948dfc97 36 #define RF_FREQUENCY 868000000 // Hz
SemBen 0:ea5a948dfc97 37 #define TX_OUTPUT_POWER 14 // 14 dBm
SemBen 0:ea5a948dfc97 38
SemBen 0:ea5a948dfc97 39 #if USE_MODEM_LORA == 1
SemBen 0:ea5a948dfc97 40
mverdy 1:ecd6c7ea3545 41 #define LORA_BANDWIDTH LORA_BW_500 // [0: 125 kHz,
SemBen 0:ea5a948dfc97 42 // 1: 250 kHz,
SemBen 0:ea5a948dfc97 43 // 2: 500 kHz,
SemBen 0:ea5a948dfc97 44 // 3: Reserved]
mverdy 1:ecd6c7ea3545 45 #define LORA_SPREADING_FACTOR LORA_SF7 // [SF7..SF12]
mverdy 1:ecd6c7ea3545 46 #define LORA_LOWDATARATEOPTIMIZE 0
mverdy 1:ecd6c7ea3545 47 #define LORA_CODINGRATE LORA_CR_4_5 // [1: 4/5,
SemBen 0:ea5a948dfc97 48 // 2: 4/6,
SemBen 0:ea5a948dfc97 49 // 3: 4/7,
SemBen 0:ea5a948dfc97 50 // 4: 4/8]
SemBen 0:ea5a948dfc97 51 #define LORA_PREAMBLE_LENGTH 8 // Same for Tx and Rx
SemBen 0:ea5a948dfc97 52 #define LORA_SYMBOL_TIMEOUT 5 // Symbols
mverdy 1:ecd6c7ea3545 53 #define LORA_HEADER_TYPE LORA_PACKET_VARIABLE_LENGTH
SemBen 0:ea5a948dfc97 54 #define LORA_FHSS_ENABLED false
SemBen 0:ea5a948dfc97 55 #define LORA_NB_SYMB_HOP 4
mverdy 1:ecd6c7ea3545 56 #define LORA_IQ LORA_IQ_NORMAL
mverdy 1:ecd6c7ea3545 57 #define LORA_CRC_MODE LORA_CRC_OFF
SemBen 0:ea5a948dfc97 58
SemBen 0:ea5a948dfc97 59 #elif USE_MODEM_FSK == 1
SemBen 0:ea5a948dfc97 60
SemBen 0:ea5a948dfc97 61 #define FSK_FDEV 25000 // Hz
SemBen 0:ea5a948dfc97 62 #define FSK_DATARATE 19200 // bps
mverdy 1:ecd6c7ea3545 63 #define FSK_BANDWIDTH RX_BW_93800 // Hz
mverdy 1:ecd6c7ea3545 64 #define FSK_MODULATION_SHAPPING MOD_SHAPING_G_BT_05
SemBen 0:ea5a948dfc97 65 #define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx
mverdy 1:ecd6c7ea3545 66 #define FSK_HEADER_TYPE RADIO_PACKET_VARIABLE_LENGTH
mverdy 1:ecd6c7ea3545 67 #define FSK_CRC_MODE RADIO_CRC_2_BYTES_CCIT
mverdy 1:ecd6c7ea3545 68 #define FSK_ADDR_FILTERING RADIO_ADDRESSCOMP_FILT_NODE;
mverdy 1:ecd6c7ea3545 69 #define FSK_WHITENING_MODE RADIO_DC_FREE_OFF
mverdy 1:ecd6c7ea3545 70 #define FSK_PREAMBLE_DETECTOR_MODE RADIO_PREAMBLE_DETECTOR_OFF
mverdy 1:ecd6c7ea3545 71 #define FSK_SYNCWORD_LENGTH 8
SemBen 0:ea5a948dfc97 72 #else
SemBen 0:ea5a948dfc97 73 #error "Please define a modem in the compiler options."
SemBen 0:ea5a948dfc97 74 #endif
SemBen 0:ea5a948dfc97 75
SemBen 0:ea5a948dfc97 76 #define RX_TIMEOUT_VALUE 3500 // in ms
SemBen 0:ea5a948dfc97 77 #define BUFFER_SIZE 32 // Define the payload size here
SemBen 0:ea5a948dfc97 78
SemBen 0:ea5a948dfc97 79 #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) )
SemBen 0:ea5a948dfc97 80 DigitalOut led( LED2 );
SemBen 0:ea5a948dfc97 81 #else
SemBen 0:ea5a948dfc97 82 DigitalOut led( LED1 );
SemBen 0:ea5a948dfc97 83 #endif
SemBen 0:ea5a948dfc97 84
SemBen 0:ea5a948dfc97 85 /*
SemBen 0:ea5a948dfc97 86 * Callback functions prototypes
SemBen 0:ea5a948dfc97 87 */
SemBen 0:ea5a948dfc97 88 /*!
SemBen 0:ea5a948dfc97 89 * @brief Function to be executed on Radio Tx Done event
SemBen 0:ea5a948dfc97 90 */
SemBen 0:ea5a948dfc97 91 void OnTxDone( void );
SemBen 0:ea5a948dfc97 92
SemBen 0:ea5a948dfc97 93 /*!
SemBen 0:ea5a948dfc97 94 * @brief Function to be executed on Radio Rx Done event
SemBen 0:ea5a948dfc97 95 */
mverdy 1:ecd6c7ea3545 96 void OnRxDone( void );
SemBen 0:ea5a948dfc97 97
SemBen 0:ea5a948dfc97 98 /*!
SemBen 0:ea5a948dfc97 99 * @brief Function executed on Radio Tx Timeout event
SemBen 0:ea5a948dfc97 100 */
SemBen 0:ea5a948dfc97 101 void OnTxTimeout( void );
SemBen 0:ea5a948dfc97 102
SemBen 0:ea5a948dfc97 103 /*!
SemBen 0:ea5a948dfc97 104 * @brief Function executed on Radio Rx Timeout event
SemBen 0:ea5a948dfc97 105 */
SemBen 0:ea5a948dfc97 106 void OnRxTimeout( void );
SemBen 0:ea5a948dfc97 107
SemBen 0:ea5a948dfc97 108 /*!
SemBen 0:ea5a948dfc97 109 * @brief Function executed on Radio Rx Error event
SemBen 0:ea5a948dfc97 110 */
mverdy 1:ecd6c7ea3545 111 void OnRxError( IrqErrorCode_t errCode );
SemBen 0:ea5a948dfc97 112
SemBen 0:ea5a948dfc97 113 /*!
SemBen 0:ea5a948dfc97 114 * @brief Function executed on Radio Fhss Change Channel event
SemBen 0:ea5a948dfc97 115 */
SemBen 0:ea5a948dfc97 116 void OnFhssChangeChannel( uint8_t channelIndex );
mverdy 1:ecd6c7ea3545 117
mverdy 1:ecd6c7ea3545 118 typedef struct{
mverdy 1:ecd6c7ea3545 119 RadioPacketTypes_t packetType;
mverdy 1:ecd6c7ea3545 120 int8_t txPower;
mverdy 1:ecd6c7ea3545 121 RadioRampTimes_t txRampTime;
mverdy 1:ecd6c7ea3545 122 ModulationParams_t modParams;
mverdy 1:ecd6c7ea3545 123 PacketParams_t packetParams;
mverdy 1:ecd6c7ea3545 124 uint32_t rfFrequency;
mverdy 1:ecd6c7ea3545 125 uint16_t irqTx;
mverdy 1:ecd6c7ea3545 126 uint16_t irqRx;
mverdy 1:ecd6c7ea3545 127 uint32_t txTimeout;
mverdy 1:ecd6c7ea3545 128 uint32_t rxTimeout;
mverdy 1:ecd6c7ea3545 129 }RadioConfigurations_t;
mverdy 1:ecd6c7ea3545 130 RadioConfigurations_t radioConfiguration;
SemBen 0:ea5a948dfc97 131
SemBen 0:ea5a948dfc97 132 /*
SemBen 0:ea5a948dfc97 133 * Global variables declarations
SemBen 0:ea5a948dfc97 134 */
SemBen 0:ea5a948dfc97 135 typedef enum
SemBen 0:ea5a948dfc97 136 {
mverdy 1:ecd6c7ea3545 137 SEND_PACKET,
mverdy 1:ecd6c7ea3545 138 WAIT_SEND_DONE,
mverdy 1:ecd6c7ea3545 139 RECEIVE_PACKET,
mverdy 1:ecd6c7ea3545 140 WAIT_RECEIVE_DONE,
mverdy 1:ecd6c7ea3545 141 PACKET_RECEIVED,
SemBen 0:ea5a948dfc97 142 }AppStates_t;
mverdy 1:ecd6c7ea3545 143 volatile AppStates_t State = SEND_PACKET;
mverdy 1:ecd6c7ea3545 144
mverdy 1:ecd6c7ea3545 145 typedef struct{
mverdy 1:ecd6c7ea3545 146 bool rxDone;
mverdy 1:ecd6c7ea3545 147 bool rxError;
mverdy 1:ecd6c7ea3545 148 bool txDone;
mverdy 1:ecd6c7ea3545 149 bool rxTimeout;
mverdy 1:ecd6c7ea3545 150 bool txTimeout;
mverdy 1:ecd6c7ea3545 151 }RadioFlags_t;
mverdy 1:ecd6c7ea3545 152 RadioFlags_t radioFlags = {
mverdy 1:ecd6c7ea3545 153 .txDone = false,
mverdy 1:ecd6c7ea3545 154 .rxDone = false,
mverdy 1:ecd6c7ea3545 155 .rxError = false,
mverdy 1:ecd6c7ea3545 156 .rxTimeout = false,
mverdy 1:ecd6c7ea3545 157 .txTimeout = false,
mverdy 1:ecd6c7ea3545 158 };
SemBen 0:ea5a948dfc97 159
SemBen 0:ea5a948dfc97 160 /*!
SemBen 0:ea5a948dfc97 161 * Radio events function pointer
SemBen 0:ea5a948dfc97 162 */
mverdy 1:ecd6c7ea3545 163 static RadioCallbacks_t RadioEvents = {
mverdy 1:ecd6c7ea3545 164 .txDone = &OnTxDone,
mverdy 1:ecd6c7ea3545 165 .txTimeout = &OnTxTimeout,
mverdy 1:ecd6c7ea3545 166 .rxDone = &OnRxDone,
mverdy 1:ecd6c7ea3545 167 .rxPreambleDetect = NULL,
mverdy 1:ecd6c7ea3545 168 .rxHeaderDone = NULL,
mverdy 1:ecd6c7ea3545 169 .rxTimeout = &OnRxTimeout,
mverdy 1:ecd6c7ea3545 170 .rxError = &OnRxError,
mverdy 1:ecd6c7ea3545 171 .cadDone = NULL,
mverdy 1:ecd6c7ea3545 172 };
mverdy 1:ecd6c7ea3545 173
SemBen 0:ea5a948dfc97 174 /*
SemBen 0:ea5a948dfc97 175 * Global variables declarations
SemBen 0:ea5a948dfc97 176 */
SemBen 0:ea5a948dfc97 177 //Radio Radio( NULL );
mverdy 1:ecd6c7ea3545 178 #define MESSAGE_SIZE 4
mverdy 1:ecd6c7ea3545 179 typedef uint8_t Messages_t[MESSAGE_SIZE];
mverdy 1:ecd6c7ea3545 180 const Messages_t PingMsg = {'P', 'I', 'N', 'G'};
mverdy 1:ecd6c7ea3545 181 const Messages_t PongMsg = {'P', 'O', 'N', 'G'};
mverdy 1:ecd6c7ea3545 182 const Messages_t *messageToReceive = &PongMsg;
mverdy 1:ecd6c7ea3545 183 const Messages_t *messageToSend = &PingMsg;
SemBen 0:ea5a948dfc97 184
mverdy 1:ecd6c7ea3545 185 uint8_t BufferSize = BUFFER_SIZE;
SemBen 0:ea5a948dfc97 186 uint8_t Buffer[BUFFER_SIZE];
SemBen 0:ea5a948dfc97 187
mverdy 1:ecd6c7ea3545 188 int8_t RssiValue = 0;
mverdy 1:ecd6c7ea3545 189 int8_t SnrValue = 0;
mverdy 1:ecd6c7ea3545 190
mverdy 1:ecd6c7ea3545 191 void GetRssiSnr(int8_t *rssi, int8_t *snr);
mverdy 1:ecd6c7ea3545 192 SX126xHal Radio( D11, D12, D13, D7, D3, D5, NC, NC, A0, A1, A2, D8, &RadioEvents );
mverdy 1:ecd6c7ea3545 193
mverdy 1:ecd6c7ea3545 194 void SetToMaster(void);
mverdy 1:ecd6c7ea3545 195 void SetToSlave(void);
mverdy 1:ecd6c7ea3545 196 void RunMasterStateMachine();
mverdy 1:ecd6c7ea3545 197 void RunSlaveStateMachine();
mverdy 1:ecd6c7ea3545 198 void SetConfiguration(RadioConfigurations_t *config);
mverdy 1:ecd6c7ea3545 199 void ConfigureGeneralRadio(SX126xHal *radio, RadioConfigurations_t *config);
mverdy 1:ecd6c7ea3545 200 void ConfigureRadioTx(SX126xHal *radio, RadioConfigurations_t *config);
mverdy 1:ecd6c7ea3545 201 void ConfigureRadioRx(SX126xHal *radio, RadioConfigurations_t *config);
mverdy 1:ecd6c7ea3545 202 void PrepareBuffer(SX126xHal *radio, const Messages_t *messageToSend);
mverdy 1:ecd6c7ea3545 203 bool isMaster = true;
mverdy 1:ecd6c7ea3545 204 bool masterCanSend = true;
mverdy 1:ecd6c7ea3545 205 void MasterSendNextEvent(void){masterCanSend = true;}
mverdy 1:ecd6c7ea3545 206 bool slaveCanListen = false;
mverdy 1:ecd6c7ea3545 207 void SlaveListenNextEvent(void){slaveCanListen = true;}
mverdy 1:ecd6c7ea3545 208 Ticker masterSendNextTicker;
mverdy 1:ecd6c7ea3545 209 Ticker slaveListenNextTicker;
mverdy 1:ecd6c7ea3545 210
mverdy 1:ecd6c7ea3545 211 Serial serial(USBTX, USBRX);
mverdy 1:ecd6c7ea3545 212
SemBen 0:ea5a948dfc97 213 int main( void )
SemBen 0:ea5a948dfc97 214 {
mverdy 1:ecd6c7ea3545 215 Radio.Reset();
mverdy 1:ecd6c7ea3545 216 Radio.Init();
mverdy 1:ecd6c7ea3545 217 serial.baud(115200);
mverdy 1:ecd6c7ea3545 218 SetToMaster();
mverdy 1:ecd6c7ea3545 219 SetConfiguration(&radioConfiguration);
mverdy 1:ecd6c7ea3545 220 ConfigureGeneralRadio(&Radio, &radioConfiguration);
mverdy 1:ecd6c7ea3545 221 while(true){
mverdy 1:ecd6c7ea3545 222 if(isMaster){
mverdy 1:ecd6c7ea3545 223 RunMasterStateMachine();
mverdy 1:ecd6c7ea3545 224 }
mverdy 1:ecd6c7ea3545 225 else{
mverdy 1:ecd6c7ea3545 226 RunSlaveStateMachine();
mverdy 1:ecd6c7ea3545 227 }
SemBen 0:ea5a948dfc97 228 }
mverdy 1:ecd6c7ea3545 229 }
mverdy 1:ecd6c7ea3545 230
mverdy 1:ecd6c7ea3545 231 void RunMasterStateMachine(){
mverdy 1:ecd6c7ea3545 232 switch(State){
mverdy 1:ecd6c7ea3545 233 case SEND_PACKET:{
mverdy 1:ecd6c7ea3545 234 if(masterCanSend == true){
mverdy 1:ecd6c7ea3545 235 masterCanSend = false;
mverdy 1:ecd6c7ea3545 236 masterSendNextTicker.attach_us(&MasterSendNextEvent, SEND_PING_BEAT_US);
mverdy 1:ecd6c7ea3545 237 PrepareBuffer(&Radio, messageToSend);
mverdy 1:ecd6c7ea3545 238 ConfigureRadioTx(&Radio, &radioConfiguration);
mverdy 1:ecd6c7ea3545 239 Radio.SetTx(radioConfiguration.txTimeout);
mverdy 1:ecd6c7ea3545 240 printf("Ping...\n");
mverdy 1:ecd6c7ea3545 241 State = WAIT_SEND_DONE;
mverdy 1:ecd6c7ea3545 242 }
mverdy 1:ecd6c7ea3545 243 break;
mverdy 1:ecd6c7ea3545 244 }
mverdy 1:ecd6c7ea3545 245
mverdy 1:ecd6c7ea3545 246 case WAIT_SEND_DONE:{
mverdy 1:ecd6c7ea3545 247 if(radioFlags.txDone){
mverdy 1:ecd6c7ea3545 248 radioFlags.txDone = false;
mverdy 1:ecd6c7ea3545 249 State = RECEIVE_PACKET;
mverdy 1:ecd6c7ea3545 250 }
mverdy 1:ecd6c7ea3545 251 if(radioFlags.txTimeout){
mverdy 1:ecd6c7ea3545 252 radioFlags.txTimeout = false;
mverdy 1:ecd6c7ea3545 253 State = SEND_PACKET;
SemBen 0:ea5a948dfc97 254 }
SemBen 0:ea5a948dfc97 255 break;
mverdy 1:ecd6c7ea3545 256 }
mverdy 1:ecd6c7ea3545 257
mverdy 1:ecd6c7ea3545 258 case RECEIVE_PACKET:{
mverdy 1:ecd6c7ea3545 259 ConfigureRadioRx(&Radio, &radioConfiguration);
mverdy 1:ecd6c7ea3545 260 Radio.SetRx(radioConfiguration.rxTimeout);
mverdy 1:ecd6c7ea3545 261 State = WAIT_RECEIVE_DONE;
SemBen 0:ea5a948dfc97 262 break;
mverdy 1:ecd6c7ea3545 263 }
mverdy 1:ecd6c7ea3545 264
mverdy 1:ecd6c7ea3545 265 case WAIT_RECEIVE_DONE:{
mverdy 1:ecd6c7ea3545 266 if(radioFlags.rxDone == true){
mverdy 1:ecd6c7ea3545 267 radioFlags.rxDone = false;
mverdy 1:ecd6c7ea3545 268 State = PACKET_RECEIVED;
SemBen 0:ea5a948dfc97 269 }
mverdy 1:ecd6c7ea3545 270 if(radioFlags.rxTimeout == true){
mverdy 1:ecd6c7ea3545 271 radioFlags.rxTimeout = false;
mverdy 1:ecd6c7ea3545 272 State = SEND_PACKET;
SemBen 0:ea5a948dfc97 273 }
SemBen 0:ea5a948dfc97 274 break;
mverdy 1:ecd6c7ea3545 275 }
mverdy 1:ecd6c7ea3545 276
mverdy 1:ecd6c7ea3545 277 case PACKET_RECEIVED:{
mverdy 1:ecd6c7ea3545 278 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
mverdy 1:ecd6c7ea3545 279 RssiValue = Radio.GetRssiInst();
mverdy 1:ecd6c7ea3545 280 GetRssiSnr(&RssiValue, &SnrValue);
mverdy 1:ecd6c7ea3545 281 if( strncmp(( const char* )Buffer, (const char*)messageToReceive, MESSAGE_SIZE ) == 0 ){
mverdy 1:ecd6c7ea3545 282 printf("...Pong\n");
mverdy 1:ecd6c7ea3545 283 State = SEND_PACKET;
SemBen 0:ea5a948dfc97 284 }
mverdy 1:ecd6c7ea3545 285 else if( strncmp(( const char* )Buffer, (const char*)messageToSend, MESSAGE_SIZE ) == 0 ){
mverdy 1:ecd6c7ea3545 286 // Another Master is in the air, swith to slave
mverdy 1:ecd6c7ea3545 287 SetToSlave();
SemBen 0:ea5a948dfc97 288 }
mverdy 1:ecd6c7ea3545 289 else{
mverdy 1:ecd6c7ea3545 290 printf("WRONG PAYLOAD\n");
mverdy 1:ecd6c7ea3545 291 SetToMaster();
mverdy 1:ecd6c7ea3545 292 }
SemBen 0:ea5a948dfc97 293 break;
SemBen 0:ea5a948dfc97 294 }
SemBen 0:ea5a948dfc97 295 }
SemBen 0:ea5a948dfc97 296 }
mverdy 1:ecd6c7ea3545 297
mverdy 1:ecd6c7ea3545 298 void RunSlaveStateMachine(){
mverdy 1:ecd6c7ea3545 299 switch(State){
mverdy 1:ecd6c7ea3545 300 case RECEIVE_PACKET:{
mverdy 1:ecd6c7ea3545 301 if(slaveCanListen == true){
mverdy 1:ecd6c7ea3545 302 slaveCanListen = false;
mverdy 1:ecd6c7ea3545 303 ConfigureRadioRx(&Radio, &radioConfiguration);
mverdy 1:ecd6c7ea3545 304 Radio.SetRx(radioConfiguration.rxTimeout);
mverdy 1:ecd6c7ea3545 305 slaveListenNextTicker.attach_us(&SlaveListenNextEvent, SEND_PING_BEAT_US - ( RX_TIMEOUT_US>>1 ));
mverdy 1:ecd6c7ea3545 306 State = WAIT_RECEIVE_DONE;
mverdy 1:ecd6c7ea3545 307 }
mverdy 1:ecd6c7ea3545 308 break;
mverdy 1:ecd6c7ea3545 309 }
mverdy 1:ecd6c7ea3545 310
mverdy 1:ecd6c7ea3545 311 case WAIT_RECEIVE_DONE:{
mverdy 1:ecd6c7ea3545 312 if(radioFlags.rxDone == true){
mverdy 1:ecd6c7ea3545 313 radioFlags.rxDone = false;
mverdy 1:ecd6c7ea3545 314 State = PACKET_RECEIVED;
mverdy 1:ecd6c7ea3545 315 }
mverdy 1:ecd6c7ea3545 316 if(radioFlags.rxTimeout == true){
mverdy 1:ecd6c7ea3545 317 radioFlags.rxTimeout = false;
mverdy 1:ecd6c7ea3545 318 SetToMaster();
mverdy 1:ecd6c7ea3545 319 }
mverdy 1:ecd6c7ea3545 320 break;
mverdy 1:ecd6c7ea3545 321 }
mverdy 1:ecd6c7ea3545 322
mverdy 1:ecd6c7ea3545 323 case PACKET_RECEIVED:{
mverdy 1:ecd6c7ea3545 324 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
mverdy 1:ecd6c7ea3545 325 RssiValue = Radio.GetRssiInst();
mverdy 1:ecd6c7ea3545 326 GetRssiSnr(&RssiValue, &SnrValue);
mverdy 1:ecd6c7ea3545 327 if( strncmp(( const char* )Buffer, (const char*)messageToReceive, MESSAGE_SIZE ) == 0 ){
mverdy 1:ecd6c7ea3545 328 printf("...Ping\n");
mverdy 1:ecd6c7ea3545 329 State = SEND_PACKET;
mverdy 1:ecd6c7ea3545 330 }
mverdy 1:ecd6c7ea3545 331 else{
mverdy 1:ecd6c7ea3545 332 SetToMaster();
mverdy 1:ecd6c7ea3545 333 }
mverdy 1:ecd6c7ea3545 334 break;
mverdy 1:ecd6c7ea3545 335 }
mverdy 1:ecd6c7ea3545 336
mverdy 1:ecd6c7ea3545 337 case SEND_PACKET:{
mverdy 1:ecd6c7ea3545 338 PrepareBuffer(&Radio, messageToSend);
mverdy 1:ecd6c7ea3545 339 ConfigureRadioTx(&Radio, &radioConfiguration);
mverdy 1:ecd6c7ea3545 340 printf("Pong...\n");
mverdy 1:ecd6c7ea3545 341 Radio.SetTx(radioConfiguration.txTimeout);
mverdy 1:ecd6c7ea3545 342 State = WAIT_SEND_DONE;
mverdy 1:ecd6c7ea3545 343 break;
mverdy 1:ecd6c7ea3545 344 }
mverdy 1:ecd6c7ea3545 345
mverdy 1:ecd6c7ea3545 346 case WAIT_SEND_DONE:{
mverdy 1:ecd6c7ea3545 347 if(radioFlags.txDone){
mverdy 1:ecd6c7ea3545 348 radioFlags.txDone = false;
mverdy 1:ecd6c7ea3545 349 State = RECEIVE_PACKET;
mverdy 1:ecd6c7ea3545 350 }
mverdy 1:ecd6c7ea3545 351 if(radioFlags.txTimeout){
mverdy 1:ecd6c7ea3545 352 radioFlags.txTimeout = false;
mverdy 1:ecd6c7ea3545 353 SetToMaster();
mverdy 1:ecd6c7ea3545 354 }
mverdy 1:ecd6c7ea3545 355 break;
mverdy 1:ecd6c7ea3545 356 }
mverdy 1:ecd6c7ea3545 357 }
mverdy 1:ecd6c7ea3545 358 }
mverdy 1:ecd6c7ea3545 359
mverdy 1:ecd6c7ea3545 360 void SetToMaster(){
mverdy 1:ecd6c7ea3545 361 printf("-->Master\n");
mverdy 1:ecd6c7ea3545 362 isMaster = true;
mverdy 1:ecd6c7ea3545 363 masterCanSend = true;
mverdy 1:ecd6c7ea3545 364 State = SEND_PACKET;
mverdy 1:ecd6c7ea3545 365 messageToReceive = &PongMsg;
mverdy 1:ecd6c7ea3545 366 messageToSend = &PingMsg;
mverdy 1:ecd6c7ea3545 367 }
mverdy 1:ecd6c7ea3545 368
mverdy 1:ecd6c7ea3545 369 void SetToSlave(){
mverdy 1:ecd6c7ea3545 370 slaveCanListen = false;
mverdy 1:ecd6c7ea3545 371 slaveListenNextTicker.attach_us(&SlaveListenNextEvent, SEND_PING_BEAT_US - ( RX_TIMEOUT_US>>1 ));
mverdy 1:ecd6c7ea3545 372 printf("--> Slave\n");
mverdy 1:ecd6c7ea3545 373 isMaster = false;
mverdy 1:ecd6c7ea3545 374 State = RECEIVE_PACKET;
mverdy 1:ecd6c7ea3545 375 messageToReceive = &PingMsg;
mverdy 1:ecd6c7ea3545 376 messageToSend = &PongMsg;
mverdy 1:ecd6c7ea3545 377 }
SemBen 0:ea5a948dfc97 378
SemBen 0:ea5a948dfc97 379 void OnTxDone( void )
SemBen 0:ea5a948dfc97 380 {
mverdy 1:ecd6c7ea3545 381 radioFlags.txDone = true;
SemBen 0:ea5a948dfc97 382 }
SemBen 0:ea5a948dfc97 383
mverdy 1:ecd6c7ea3545 384 void OnRxDone( void )
SemBen 0:ea5a948dfc97 385 {
mverdy 1:ecd6c7ea3545 386 radioFlags.rxDone = true;
SemBen 0:ea5a948dfc97 387 }
SemBen 0:ea5a948dfc97 388
SemBen 0:ea5a948dfc97 389 void OnTxTimeout( void )
SemBen 0:ea5a948dfc97 390 {
mverdy 1:ecd6c7ea3545 391 radioFlags.txTimeout = true;
SemBen 0:ea5a948dfc97 392 debug_if( DEBUG_MESSAGE, "> OnTxTimeout\n\r" );
SemBen 0:ea5a948dfc97 393 }
SemBen 0:ea5a948dfc97 394
SemBen 0:ea5a948dfc97 395 void OnRxTimeout( void )
SemBen 0:ea5a948dfc97 396 {
mverdy 1:ecd6c7ea3545 397 radioFlags.rxTimeout = true;
SemBen 0:ea5a948dfc97 398 debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" );
SemBen 0:ea5a948dfc97 399 }
SemBen 0:ea5a948dfc97 400
mverdy 1:ecd6c7ea3545 401 void OnRxError( IrqErrorCode_t errCode )
SemBen 0:ea5a948dfc97 402 {
mverdy 1:ecd6c7ea3545 403 radioFlags.rxError = true;
SemBen 0:ea5a948dfc97 404 debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" );
mverdy 1:ecd6c7ea3545 405 }
mverdy 1:ecd6c7ea3545 406
mverdy 1:ecd6c7ea3545 407 void SetConfiguration(RadioConfigurations_t *config){
mverdy 1:ecd6c7ea3545 408 config->irqRx = IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT;
mverdy 1:ecd6c7ea3545 409 config->irqTx = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
mverdy 1:ecd6c7ea3545 410 config->rfFrequency = RF_FREQUENCY;
mverdy 1:ecd6c7ea3545 411 config->txTimeout = 0;
mverdy 1:ecd6c7ea3545 412 config->rxTimeout = (uint32_t)(RX_TIMEOUT_US / 15.625);
mverdy 1:ecd6c7ea3545 413 config->txPower = TX_OUTPUT_POWER;
mverdy 1:ecd6c7ea3545 414 config->txRampTime = RADIO_RAMP_200_US;
mverdy 1:ecd6c7ea3545 415 #if USE_MODEM_LORA == 1
mverdy 1:ecd6c7ea3545 416 config->packetType = PACKET_TYPE_LORA;
mverdy 1:ecd6c7ea3545 417 config->modParams.PacketType = PACKET_TYPE_LORA;
mverdy 1:ecd6c7ea3545 418 config->modParams.Params.LoRa.Bandwidth = LORA_BANDWIDTH;
mverdy 1:ecd6c7ea3545 419 config->modParams.Params.LoRa.CodingRate = LORA_CODINGRATE;
mverdy 1:ecd6c7ea3545 420 config->modParams.Params.LoRa.LowDatarateOptimize = LORA_LOWDATARATEOPTIMIZE;
mverdy 1:ecd6c7ea3545 421 config->modParams.Params.LoRa.SpreadingFactor = LORA_SPREADING_FACTOR;
mverdy 1:ecd6c7ea3545 422 config->packetParams.PacketType = PACKET_TYPE_LORA;
mverdy 1:ecd6c7ea3545 423 config->packetParams.Params.LoRa.CrcMode = LORA_CRC_MODE;
mverdy 1:ecd6c7ea3545 424 config->packetParams.Params.LoRa.HeaderType = LORA_HEADER_TYPE;
mverdy 1:ecd6c7ea3545 425 config->packetParams.Params.LoRa.InvertIQ = LORA_IQ;
mverdy 1:ecd6c7ea3545 426 config->packetParams.Params.LoRa.PayloadLength = BUFFER_SIZE;
mverdy 1:ecd6c7ea3545 427 config->packetParams.Params.LoRa.PreambleLength = LORA_PREAMBLE_LENGTH;
mverdy 1:ecd6c7ea3545 428 #elif USE_MODEM_FSK == 1
mverdy 1:ecd6c7ea3545 429 config->packetType = PACKET_TYPE_GFSK;
mverdy 1:ecd6c7ea3545 430 config->modParams.PacketType = PACKET_TYPE_GFSK;
mverdy 1:ecd6c7ea3545 431 config->modParams.Params.Gfsk.Bandwidth = FSK_BANDWIDTH;
mverdy 1:ecd6c7ea3545 432 config->modParams.Params.Gfsk.BitRate = 1024000000 / FSK_DATARATE;
mverdy 1:ecd6c7ea3545 433 config->modParams.Params.Gfsk.Fdev = FSK_FDEV * 1.048576;
mverdy 1:ecd6c7ea3545 434 config->modParams.Params.Gfsk.ModulationShaping = FSK_MODULATION_SHAPPING;
mverdy 1:ecd6c7ea3545 435 config->packetParams.PacketType = PACKET_TYPE_GFSK;
mverdy 1:ecd6c7ea3545 436 config->packetParams.Params.Gfsk.AddrComp = FSK_ADDR_FILTERING;
mverdy 1:ecd6c7ea3545 437 config->packetParams.Params.Gfsk.CrcLength = FSK_CRC_MODE;
mverdy 1:ecd6c7ea3545 438 config->packetParams.Params.Gfsk.DcFree = FSK_WHITENING_MODE;
mverdy 1:ecd6c7ea3545 439 config->packetParams.Params.Gfsk.HeaderType = FSK_HEADER_TYPE;
mverdy 1:ecd6c7ea3545 440 config->packetParams.Params.Gfsk.PayloadLength = BUFFER_SIZE;
mverdy 1:ecd6c7ea3545 441 config->packetParams.Params.Gfsk.PreambleLength = FSK_PREAMBLE_LENGTH;
mverdy 1:ecd6c7ea3545 442 config->packetParams.Params.Gfsk.PreambleMinDetect = FSK_PREAMBLE_DETECTOR_MODE;
mverdy 1:ecd6c7ea3545 443 config->packetParams.Params.Gfsk.SyncWordLength = FSK_SYNCWORD_LENGTH;
mverdy 1:ecd6c7ea3545 444 #endif
mverdy 1:ecd6c7ea3545 445 }
mverdy 1:ecd6c7ea3545 446
mverdy 1:ecd6c7ea3545 447 void ConfigureGeneralRadio(SX126xHal *radio, RadioConfigurations_t *config){
mverdy 1:ecd6c7ea3545 448 radio->SetPacketType(config->packetType);
mverdy 1:ecd6c7ea3545 449 radio->SetPacketParams(&config->packetParams);
mverdy 1:ecd6c7ea3545 450 radio->SetModulationParams(&config->modParams);
mverdy 1:ecd6c7ea3545 451 radio->SetRfFrequency(config->rfFrequency);
mverdy 1:ecd6c7ea3545 452 radio->SetTxParams(config->txPower, config->txRampTime);
mverdy 1:ecd6c7ea3545 453 radio->SetInterruptMode();
mverdy 1:ecd6c7ea3545 454 if(config->packetType == PACKET_TYPE_GFSK){
mverdy 1:ecd6c7ea3545 455 uint8_t syncword[8] = {0xF0, 0x0F, 0x55, 0xAA, 0xF0, 0x0F, 0x55, 0xAA};
mverdy 1:ecd6c7ea3545 456 radio->SetSyncWord(syncword);
mverdy 1:ecd6c7ea3545 457 }
mverdy 1:ecd6c7ea3545 458 }
mverdy 1:ecd6c7ea3545 459
mverdy 1:ecd6c7ea3545 460 void ConfigureRadioTx(SX126xHal *radio, RadioConfigurations_t *config){
mverdy 1:ecd6c7ea3545 461 radio->SetDioIrqParams(config->irqTx, config->irqTx, IRQ_RADIO_NONE, IRQ_RADIO_NONE);
mverdy 1:ecd6c7ea3545 462 }
mverdy 1:ecd6c7ea3545 463
mverdy 1:ecd6c7ea3545 464 void ConfigureRadioRx(SX126xHal *radio, RadioConfigurations_t *config){
mverdy 1:ecd6c7ea3545 465 radio->SetDioIrqParams(config->irqRx, config->irqRx, IRQ_RADIO_NONE, IRQ_RADIO_NONE);
mverdy 1:ecd6c7ea3545 466 }
mverdy 1:ecd6c7ea3545 467
mverdy 1:ecd6c7ea3545 468 void PrepareBuffer(SX126xHal *radio, const Messages_t *messageToSend){
mverdy 1:ecd6c7ea3545 469 radio->SetPayload((uint8_t*)messageToSend, MESSAGE_SIZE);
mverdy 1:ecd6c7ea3545 470 }
mverdy 1:ecd6c7ea3545 471
mverdy 1:ecd6c7ea3545 472 void GetRssiSnr(int8_t *rssi, int8_t *snr)
mverdy 1:ecd6c7ea3545 473 {
mverdy 1:ecd6c7ea3545 474 PacketStatus_t pkt_stat;
mverdy 1:ecd6c7ea3545 475 Radio.GetPacketStatus(&pkt_stat);
mverdy 1:ecd6c7ea3545 476 #if USE_MODEM_LORA == 1
mverdy 1:ecd6c7ea3545 477 *rssi = pkt_stat.Params.LoRa.RssiPkt;
mverdy 1:ecd6c7ea3545 478 *snr = pkt_stat.Params.LoRa.SnrPkt;
mverdy 1:ecd6c7ea3545 479 #else
mverdy 1:ecd6c7ea3545 480 *rssi = pkt_stat.Params.Gfsk.RssiSync;
mverdy 1:ecd6c7ea3545 481 #endif
mverdy 1:ecd6c7ea3545 482 }