ping pong with modifiable parameters

Dependencies:   mbed SX126xLib

Committer:
nimita23
Date:
Thu Jun 20 22:53:28 2019 +0000
Revision:
5:dc53029f4c02
Parent:
4:99bfe3b61a6a
Child:
6:e155f7cceb5b
sf, bw added. power tba;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 1:22e02d1cfbca 1 #include "mbed.h"
GregCr 1:22e02d1cfbca 2 #include "radio.h"
nimita23 2:2bedac9faed3 3 #include "sx126x-hal.h"
GregCr 1:22e02d1cfbca 4
nimita23 4:99bfe3b61a6a 5 #define buffer_size 256 // incoming buffer size
nimita23 4:99bfe3b61a6a 6 #define buffer_fill buffer_size+1 // number, when buffer is ready
GregCr 1:22e02d1cfbca 7
GregCr 1:22e02d1cfbca 8
nimita23 4:99bfe3b61a6a 9 long unsigned RF_FREQUENCY = 350000000; // Hz
nimita23 5:dc53029f4c02 10 unsigned int spreading_factor = LORA_SF7;
nimita23 5:dc53029f4c02 11 unsigned int bandwidth = LORA_BW_500;
nimita23 4:99bfe3b61a6a 12
nimita23 4:99bfe3b61a6a 13 Serial s( USBTX, USBRX );
nimita23 4:99bfe3b61a6a 14 // additional variables for incoming data
nimita23 4:99bfe3b61a6a 15 char serial_buffer[buffer_size]; // buffer to save incoming data
nimita23 4:99bfe3b61a6a 16 int serial_buffer_index = 0; // index array for buffer
nimita23 4:99bfe3b61a6a 17 bool serial_end_line = false; // searching for end line
nimita23 4:99bfe3b61a6a 18
GregCr 1:22e02d1cfbca 19
GregCr 1:22e02d1cfbca 20 /*!
GregCr 1:22e02d1cfbca 21 * \brief Defines the output power in dBm
GregCr 1:22e02d1cfbca 22 *
GregCr 1:22e02d1cfbca 23 * \remark The range of the output power is [-18..+13] dBm
GregCr 1:22e02d1cfbca 24 */
nimita23 2:2bedac9faed3 25 #define TX_OUTPUT_POWER 10
GregCr 1:22e02d1cfbca 26
GregCr 1:22e02d1cfbca 27 /*!
GregCr 1:22e02d1cfbca 28 * \brief Defines the states of the application
GregCr 1:22e02d1cfbca 29 */
GregCr 1:22e02d1cfbca 30 typedef enum
GregCr 1:22e02d1cfbca 31 {
GregCr 1:22e02d1cfbca 32 APP_LOWPOWER,
GregCr 1:22e02d1cfbca 33 APP_RX,
GregCr 1:22e02d1cfbca 34 APP_RX_TIMEOUT,
GregCr 1:22e02d1cfbca 35 APP_RX_ERROR,
GregCr 1:22e02d1cfbca 36 APP_TX,
GregCr 1:22e02d1cfbca 37 APP_TX_TIMEOUT,
GregCr 1:22e02d1cfbca 38 }AppStates_t;
GregCr 1:22e02d1cfbca 39
GregCr 1:22e02d1cfbca 40 /*!
GregCr 1:22e02d1cfbca 41 * \brief Defines the buffer size, i.e. the payload size
GregCr 1:22e02d1cfbca 42 */
GregCr 1:22e02d1cfbca 43 #define BUFFER_SIZE 16
GregCr 1:22e02d1cfbca 44
GregCr 1:22e02d1cfbca 45 /*!
GregCr 1:22e02d1cfbca 46 * \brief Define the possible message type for this application
GregCr 1:22e02d1cfbca 47 */
GregCr 1:22e02d1cfbca 48 const uint8_t PingMsg[] = "PING";
GregCr 1:22e02d1cfbca 49 const uint8_t PongMsg[] = "PONG";
GregCr 1:22e02d1cfbca 50
GregCr 1:22e02d1cfbca 51 /*!
GregCr 1:22e02d1cfbca 52 * \brief Defines the size of the token defining message type in the payload
GregCr 1:22e02d1cfbca 53 */
GregCr 1:22e02d1cfbca 54 #define PINGPONGSIZE 4
GregCr 1:22e02d1cfbca 55
GregCr 1:22e02d1cfbca 56 /*!
GregCr 1:22e02d1cfbca 57 * \brief The size of the buffer
GregCr 1:22e02d1cfbca 58 */
GregCr 1:22e02d1cfbca 59 uint8_t BufferSize = BUFFER_SIZE;
GregCr 1:22e02d1cfbca 60
GregCr 1:22e02d1cfbca 61 /*!
GregCr 1:22e02d1cfbca 62 * \brief The buffer
GregCr 1:22e02d1cfbca 63 */
GregCr 1:22e02d1cfbca 64 uint8_t Buffer[BUFFER_SIZE];
GregCr 1:22e02d1cfbca 65
GregCr 1:22e02d1cfbca 66 /*!
GregCr 1:22e02d1cfbca 67 * \brief The State of the application
GregCr 1:22e02d1cfbca 68 */
GregCr 1:22e02d1cfbca 69 AppStates_t AppState = APP_LOWPOWER;
GregCr 1:22e02d1cfbca 70
GregCr 1:22e02d1cfbca 71 int8_t RssiValue = 0;
GregCr 1:22e02d1cfbca 72 int8_t SnrValue = 0;
nimita23 4:99bfe3b61a6a 73 ModulationParams_t modulationParams;
GregCr 1:22e02d1cfbca 74
nimita23 4:99bfe3b61a6a 75 void OnTxDone( void );
nimita23 4:99bfe3b61a6a 76 void OnRxDone( void );
GregCr 1:22e02d1cfbca 77 void OnTxTimeout( void );
GregCr 1:22e02d1cfbca 78 void OnRxTimeout( void );
GregCr 1:22e02d1cfbca 79 void OnRxError( IrqErrorCode_t );
nimita23 4:99bfe3b61a6a 80 void parser();
nimita23 4:99bfe3b61a6a 81 void LoRa_init(ModulationParams_t modulationParams);
GregCr 1:22e02d1cfbca 82
nimita23 2:2bedac9faed3 83
nimita23 4:99bfe3b61a6a 84 RadioCallbacks_t callbacks = {
GregCr 1:22e02d1cfbca 85 &OnTxDone, // txDone
GregCr 1:22e02d1cfbca 86 &OnRxDone, // rxDone
nimita23 2:2bedac9faed3 87 NULL, // rxPreambleDetect
nimita23 2:2bedac9faed3 88 NULL, // rxSyncWordDone
nimita23 2:2bedac9faed3 89 NULL, // rxHeaderDone
GregCr 1:22e02d1cfbca 90 &OnTxTimeout, // txTimeout
GregCr 1:22e02d1cfbca 91 &OnRxTimeout, // rxTimeout
GregCr 1:22e02d1cfbca 92 &OnRxError, // rxError
nimita23 2:2bedac9faed3 93 NULL, // cadDone
GregCr 1:22e02d1cfbca 94 };
GregCr 1:22e02d1cfbca 95
GregCr 1:22e02d1cfbca 96 // mosi, miso, sclk, nss, busy, dio1, dio2, dio3, rst, callbacks...
nimita23 2:2bedac9faed3 97
nimita23 2:2bedac9faed3 98 SX126xHal Radio( D11, D12, D13, D7, D3, D5, NC, NC, A0, A1, A2, D8, &callbacks );
GregCr 1:22e02d1cfbca 99
GregCr 1:22e02d1cfbca 100 DigitalOut ANT_SW( A3 );
GregCr 1:22e02d1cfbca 101 DigitalOut TxLed( A4 );
GregCr 1:22e02d1cfbca 102 DigitalOut RxLed( A5 );
GregCr 1:22e02d1cfbca 103
GregCr 1:22e02d1cfbca 104 /*!
GregCr 1:22e02d1cfbca 105 * \brief Define IO for Unused Pin
GregCr 1:22e02d1cfbca 106 */
GregCr 1:22e02d1cfbca 107 DigitalOut F_CS( D6 ); // MBED description of pin
GregCr 1:22e02d1cfbca 108 DigitalOut SD_CS( D8 ); // MBED description of pin
GregCr 1:22e02d1cfbca 109
GregCr 1:22e02d1cfbca 110 /*!
GregCr 1:22e02d1cfbca 111 * \brief Number of tick size steps for tx timeout
GregCr 1:22e02d1cfbca 112 */
nimita23 3:c704345b0c9f 113 #define TX_TIMEOUT_VALUE 0xFFFF // ms
GregCr 1:22e02d1cfbca 114
GregCr 1:22e02d1cfbca 115 /*!
GregCr 1:22e02d1cfbca 116 * \brief Number of tick size steps for rx timeout
GregCr 1:22e02d1cfbca 117 */
nimita23 3:c704345b0c9f 118 #define RX_TIMEOUT_VALUE 0xFFFF // ms
GregCr 1:22e02d1cfbca 119
GregCr 1:22e02d1cfbca 120 /*!
GregCr 1:22e02d1cfbca 121 * \brief Mask of IRQs to listen to in rx mode
GregCr 1:22e02d1cfbca 122 */
nimita23 2:2bedac9faed3 123 uint16_t RxIrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 1:22e02d1cfbca 124
GregCr 1:22e02d1cfbca 125 /*!
GregCr 1:22e02d1cfbca 126 * \brief Mask of IRQs to listen to in tx mode
GregCr 1:22e02d1cfbca 127 */
GregCr 1:22e02d1cfbca 128 uint16_t TxIrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 1:22e02d1cfbca 129
GregCr 1:22e02d1cfbca 130 /*!
GregCr 1:22e02d1cfbca 131 * \brief Locals parameters and status for radio API
GregCr 1:22e02d1cfbca 132 */
GregCr 1:22e02d1cfbca 133 PacketParams_t PacketParams;
GregCr 1:22e02d1cfbca 134 PacketStatus_t PacketStatus;
GregCr 1:22e02d1cfbca 135
nimita23 4:99bfe3b61a6a 136
nimita23 4:99bfe3b61a6a 137 void serialRx()
nimita23 4:99bfe3b61a6a 138 {
nimita23 4:99bfe3b61a6a 139 int j;
nimita23 4:99bfe3b61a6a 140 while(s.readable()) {
nimita23 4:99bfe3b61a6a 141 char character=s.getc();
nimita23 4:99bfe3b61a6a 142 if(( (int)character==10 || (int)character==13) && serial_end_line) {
nimita23 4:99bfe3b61a6a 143 serial_end_line=true;
nimita23 4:99bfe3b61a6a 144 continue;
nimita23 4:99bfe3b61a6a 145 } else {
nimita23 4:99bfe3b61a6a 146 serial_end_line=false;
nimita23 4:99bfe3b61a6a 147 }
nimita23 4:99bfe3b61a6a 148 if(serial_buffer_index != buffer_fill) {
nimita23 4:99bfe3b61a6a 149 serial_buffer[serial_buffer_index++] = character;
nimita23 4:99bfe3b61a6a 150 if(serial_buffer_index == buffer_size) {
nimita23 4:99bfe3b61a6a 151 serial_buffer[buffer_size-1] = '\0';
nimita23 4:99bfe3b61a6a 152 serial_buffer_index=buffer_fill;
nimita23 4:99bfe3b61a6a 153 continue;
nimita23 4:99bfe3b61a6a 154 }
nimita23 4:99bfe3b61a6a 155 if(character == 13 || character == 10) {
nimita23 4:99bfe3b61a6a 156 serial_buffer[serial_buffer_index-1] = '\0';
nimita23 4:99bfe3b61a6a 157 serial_buffer_index = buffer_fill;
nimita23 4:99bfe3b61a6a 158 serial_end_line = true;
nimita23 4:99bfe3b61a6a 159 }
nimita23 4:99bfe3b61a6a 160 }
nimita23 4:99bfe3b61a6a 161 }
nimita23 4:99bfe3b61a6a 162 if(serial_buffer_index==buffer_fill && serial_end_line != true) {
nimita23 4:99bfe3b61a6a 163 printf("Input too long to be parsed\n\r");
nimita23 4:99bfe3b61a6a 164 serial_buffer_index = 0;
nimita23 4:99bfe3b61a6a 165 }
nimita23 4:99bfe3b61a6a 166 else if(serial_end_line == true) {
nimita23 4:99bfe3b61a6a 167 serial_buffer_index = 0;
nimita23 4:99bfe3b61a6a 168 if(sscanf (serial_buffer,"%d",&j)) { // sscanf for searching integer
nimita23 4:99bfe3b61a6a 169 printf("From PC:%d.\n\r" ,j); // write to serial incoming integer
nimita23 4:99bfe3b61a6a 170 }
nimita23 4:99bfe3b61a6a 171 parser();
nimita23 4:99bfe3b61a6a 172 }
nimita23 4:99bfe3b61a6a 173
nimita23 4:99bfe3b61a6a 174 }
nimita23 4:99bfe3b61a6a 175
GregCr 1:22e02d1cfbca 176 /*!
GregCr 1:22e02d1cfbca 177 * \brief Specify serial datarate for UART debug output
GregCr 1:22e02d1cfbca 178 */
GregCr 1:22e02d1cfbca 179 void baud( int baudrate )
nimita23 4:99bfe3b61a6a 180 {
nimita23 4:99bfe3b61a6a 181 s.baud(baudrate);
nimita23 4:99bfe3b61a6a 182 s.attach(&serialRx,Serial::RxIrq);
GregCr 1:22e02d1cfbca 183 }
GregCr 1:22e02d1cfbca 184
nimita23 4:99bfe3b61a6a 185 void LoRa_init() {
GregCr 1:22e02d1cfbca 186 modulationParams.PacketType = PACKET_TYPE_LORA;
nimita23 5:dc53029f4c02 187 modulationParams.Params.LoRa.SpreadingFactor = spreading_factor;
nimita23 5:dc53029f4c02 188 modulationParams.Params.LoRa.Bandwidth = bandwidth;
GregCr 1:22e02d1cfbca 189 modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5;
GregCr 1:22e02d1cfbca 190
GregCr 1:22e02d1cfbca 191 PacketParams.PacketType = PACKET_TYPE_LORA;
GregCr 1:22e02d1cfbca 192 PacketParams.Params.LoRa.PreambleLength = 0x08;
GregCr 1:22e02d1cfbca 193 PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH;
GregCr 1:22e02d1cfbca 194 PacketParams.Params.LoRa.PayloadLength = 15;
GregCr 1:22e02d1cfbca 195 PacketParams.Params.LoRa.CrcMode = LORA_CRC_ON;
GregCr 1:22e02d1cfbca 196 PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED;
GregCr 1:22e02d1cfbca 197
nimita23 2:2bedac9faed3 198
GregCr 1:22e02d1cfbca 199
GregCr 1:22e02d1cfbca 200 Radio.SetStandby( STDBY_RC );
GregCr 1:22e02d1cfbca 201 Radio.SetPacketType( modulationParams.PacketType );
GregCr 1:22e02d1cfbca 202 Radio.SetModulationParams( &modulationParams );
GregCr 1:22e02d1cfbca 203 Radio.SetPacketParams( &PacketParams );
GregCr 1:22e02d1cfbca 204
GregCr 1:22e02d1cfbca 205 Radio.SetRfFrequency( RF_FREQUENCY );
GregCr 1:22e02d1cfbca 206 Radio.SetBufferBaseAddresses( 0x00, 0x00 );
GregCr 1:22e02d1cfbca 207 Radio.SetTxParams( TX_OUTPUT_POWER, RADIO_RAMP_20_US );
GregCr 1:22e02d1cfbca 208
GregCr 1:22e02d1cfbca 209 RxLed = 0;
GregCr 1:22e02d1cfbca 210 TxLed = 0;
GregCr 1:22e02d1cfbca 211
GregCr 1:22e02d1cfbca 212 Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 213 Radio.SetRx( RX_TIMEOUT_VALUE );
GregCr 1:22e02d1cfbca 214 AppState = APP_LOWPOWER;
nimita23 2:2bedac9faed3 215
nimita23 2:2bedac9faed3 216 Radio.ProcessIrqs( );
nimita23 4:99bfe3b61a6a 217 }
nimita23 4:99bfe3b61a6a 218
nimita23 4:99bfe3b61a6a 219 int main( )
nimita23 4:99bfe3b61a6a 220 {
nimita23 4:99bfe3b61a6a 221 bool isMaster = true;
nimita23 4:99bfe3b61a6a 222
nimita23 4:99bfe3b61a6a 223 baud( 115200 );
nimita23 4:99bfe3b61a6a 224
nimita23 4:99bfe3b61a6a 225 F_CS = 1;
nimita23 4:99bfe3b61a6a 226 SD_CS = 1;
nimita23 4:99bfe3b61a6a 227 RxLed = 1;
nimita23 4:99bfe3b61a6a 228 TxLed = 1;
nimita23 4:99bfe3b61a6a 229 ANT_SW = 1;
nimita23 4:99bfe3b61a6a 230
nimita23 4:99bfe3b61a6a 231 wait_ms( 500 ); // wait for on board DC/DC start-up time
nimita23 4:99bfe3b61a6a 232
nimita23 4:99bfe3b61a6a 233 Radio.Init( );
nimita23 4:99bfe3b61a6a 234 Radio.SetRegulatorMode( USE_DCDC ); // Can also be set in LDO mode but consume more power
nimita23 4:99bfe3b61a6a 235
nimita23 4:99bfe3b61a6a 236 memset( &Buffer, 0x00, BufferSize );
nimita23 4:99bfe3b61a6a 237
nimita23 4:99bfe3b61a6a 238 printf( "\n\n\r SX1262 Whitespace Ping Pong Application \n\n\r");
nimita23 4:99bfe3b61a6a 239
nimita23 4:99bfe3b61a6a 240 LoRa_init();
nimita23 4:99bfe3b61a6a 241 printf( "\nPing Pong running in LORA mode\n\r");
nimita23 4:99bfe3b61a6a 242
GregCr 1:22e02d1cfbca 243
GregCr 1:22e02d1cfbca 244 while( 1 )
GregCr 1:22e02d1cfbca 245 {
nimita23 2:2bedac9faed3 246 Radio.ProcessIrqs( );
GregCr 1:22e02d1cfbca 247 switch( AppState )
GregCr 1:22e02d1cfbca 248 {
GregCr 1:22e02d1cfbca 249 case APP_RX:
GregCr 1:22e02d1cfbca 250 AppState = APP_LOWPOWER;
GregCr 1:22e02d1cfbca 251 RxLed = !RxLed;
GregCr 1:22e02d1cfbca 252 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
nimita23 2:2bedac9faed3 253 printf("\n%s\n", Buffer);
GregCr 1:22e02d1cfbca 254 if( isMaster == true )
GregCr 1:22e02d1cfbca 255 {
GregCr 1:22e02d1cfbca 256 if( BufferSize > 0 )
GregCr 1:22e02d1cfbca 257 {
GregCr 1:22e02d1cfbca 258 if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, PINGPONGSIZE ) == 0 )
GregCr 1:22e02d1cfbca 259 {
GregCr 1:22e02d1cfbca 260 printf( "...Pong\r\n" );
GregCr 1:22e02d1cfbca 261 memcpy( Buffer, PingMsg, PINGPONGSIZE );
GregCr 1:22e02d1cfbca 262 Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 263 Radio.SendPayload( Buffer, BufferSize, (TX_TIMEOUT_VALUE));
GregCr 1:22e02d1cfbca 264 }
GregCr 1:22e02d1cfbca 265 else if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, PINGPONGSIZE ) == 0 )
GregCr 1:22e02d1cfbca 266 {
GregCr 1:22e02d1cfbca 267 // A master already exists then become a slave
GregCr 1:22e02d1cfbca 268 printf( "...Ping\r\n" );
GregCr 1:22e02d1cfbca 269 isMaster = false;
GregCr 1:22e02d1cfbca 270 memcpy( Buffer, PongMsg, PINGPONGSIZE );
GregCr 1:22e02d1cfbca 271 Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 272 Radio.SendPayload( Buffer, BufferSize, TX_TIMEOUT_VALUE );
GregCr 1:22e02d1cfbca 273 }
GregCr 1:22e02d1cfbca 274 else // valid reception but neither a PING or a PONG message
GregCr 1:22e02d1cfbca 275 { // Set device as master ans start again
GregCr 1:22e02d1cfbca 276 isMaster = true;
GregCr 1:22e02d1cfbca 277 Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 278 Radio.SetRx(RX_TIMEOUT_VALUE );
GregCr 1:22e02d1cfbca 279 }
GregCr 1:22e02d1cfbca 280 }
GregCr 1:22e02d1cfbca 281 }
GregCr 1:22e02d1cfbca 282 else
GregCr 1:22e02d1cfbca 283 {
GregCr 1:22e02d1cfbca 284 if( BufferSize > 0 )
GregCr 1:22e02d1cfbca 285 {
GregCr 1:22e02d1cfbca 286 if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, PINGPONGSIZE ) == 0 )
GregCr 1:22e02d1cfbca 287 {
GregCr 1:22e02d1cfbca 288 printf( "...Ping\r\n" );
GregCr 1:22e02d1cfbca 289 memcpy( Buffer, PongMsg, 4 );
GregCr 1:22e02d1cfbca 290 Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 291 Radio.SendPayload( Buffer, BufferSize, TX_TIMEOUT_VALUE );
GregCr 1:22e02d1cfbca 292 }
GregCr 1:22e02d1cfbca 293 else // valid reception but not a PING as expected
GregCr 1:22e02d1cfbca 294 {
GregCr 1:22e02d1cfbca 295 isMaster = true;
GregCr 1:22e02d1cfbca 296 Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 297 Radio.SetRx(RX_TIMEOUT_VALUE);
GregCr 1:22e02d1cfbca 298 }
GregCr 1:22e02d1cfbca 299 }
GregCr 1:22e02d1cfbca 300 }
GregCr 1:22e02d1cfbca 301 break;
GregCr 1:22e02d1cfbca 302
GregCr 1:22e02d1cfbca 303 case APP_TX:
GregCr 1:22e02d1cfbca 304 AppState = APP_LOWPOWER;
GregCr 1:22e02d1cfbca 305 TxLed = !TxLed;
GregCr 1:22e02d1cfbca 306 if( isMaster == true )
GregCr 1:22e02d1cfbca 307 {
GregCr 1:22e02d1cfbca 308 printf( "Ping...\r\n" );
GregCr 1:22e02d1cfbca 309 }
GregCr 1:22e02d1cfbca 310 else
GregCr 1:22e02d1cfbca 311 {
GregCr 1:22e02d1cfbca 312 printf( "Pong...\r\n" );
GregCr 1:22e02d1cfbca 313 }
GregCr 1:22e02d1cfbca 314 Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 315 Radio.SetRx(RX_TIMEOUT_VALUE );
GregCr 1:22e02d1cfbca 316 break;
GregCr 1:22e02d1cfbca 317
GregCr 1:22e02d1cfbca 318 case APP_RX_TIMEOUT:
GregCr 1:22e02d1cfbca 319 AppState = APP_LOWPOWER;
GregCr 1:22e02d1cfbca 320 if( isMaster == true )
GregCr 1:22e02d1cfbca 321 {
GregCr 1:22e02d1cfbca 322 // Send the next PING frame
GregCr 1:22e02d1cfbca 323 memcpy( Buffer, PingMsg, PINGPONGSIZE );
GregCr 1:22e02d1cfbca 324 Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 325 Radio.SendPayload( Buffer, BufferSize, TX_TIMEOUT_VALUE );
GregCr 1:22e02d1cfbca 326 }
GregCr 1:22e02d1cfbca 327 else
GregCr 1:22e02d1cfbca 328 {
GregCr 1:22e02d1cfbca 329 Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 330 Radio.SetRx( RX_TIMEOUT_VALUE );
GregCr 1:22e02d1cfbca 331 }
GregCr 1:22e02d1cfbca 332 break;
GregCr 1:22e02d1cfbca 333
GregCr 1:22e02d1cfbca 334 case APP_RX_ERROR:
GregCr 1:22e02d1cfbca 335 AppState = APP_LOWPOWER;
GregCr 1:22e02d1cfbca 336 // We have received a Packet with a CRC error, send reply as if packet was correct
GregCr 1:22e02d1cfbca 337 if( isMaster == true )
GregCr 1:22e02d1cfbca 338 {
GregCr 1:22e02d1cfbca 339 // Send the next PING frame
GregCr 1:22e02d1cfbca 340 memcpy( Buffer, PingMsg, PINGPONGSIZE );
GregCr 1:22e02d1cfbca 341 Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 342 Radio.SendPayload( Buffer, BufferSize, TX_TIMEOUT_VALUE);
GregCr 1:22e02d1cfbca 343 }
GregCr 1:22e02d1cfbca 344 else
GregCr 1:22e02d1cfbca 345 {
GregCr 1:22e02d1cfbca 346 // Send the next PONG frame
GregCr 1:22e02d1cfbca 347 memcpy( Buffer, PongMsg, PINGPONGSIZE );
GregCr 1:22e02d1cfbca 348 Radio.SetDioIrqParams( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 349 Radio.SendPayload( Buffer, BufferSize, TX_TIMEOUT_VALUE );
GregCr 1:22e02d1cfbca 350 }
GregCr 1:22e02d1cfbca 351 break;
GregCr 1:22e02d1cfbca 352
GregCr 1:22e02d1cfbca 353 case APP_TX_TIMEOUT:
GregCr 1:22e02d1cfbca 354 AppState = APP_LOWPOWER;
GregCr 1:22e02d1cfbca 355 Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
nimita23 3:c704345b0c9f 356 Radio.SetRx( RX_TIMEOUT_VALUE );
GregCr 1:22e02d1cfbca 357 break;
GregCr 1:22e02d1cfbca 358
GregCr 1:22e02d1cfbca 359 case APP_LOWPOWER:
GregCr 1:22e02d1cfbca 360 break;
GregCr 1:22e02d1cfbca 361
GregCr 1:22e02d1cfbca 362 default:
GregCr 1:22e02d1cfbca 363 // Set low power
GregCr 1:22e02d1cfbca 364 break;
GregCr 1:22e02d1cfbca 365 }
GregCr 1:22e02d1cfbca 366 }
GregCr 1:22e02d1cfbca 367 }
GregCr 1:22e02d1cfbca 368
nimita23 4:99bfe3b61a6a 369 void OnTxDone( void ) {
GregCr 1:22e02d1cfbca 370 AppState = APP_TX;
GregCr 1:22e02d1cfbca 371 }
GregCr 1:22e02d1cfbca 372
nimita23 4:99bfe3b61a6a 373 void OnRxDone( void ) {
nimita23 3:c704345b0c9f 374 AppState = APP_RX;
nimita23 3:c704345b0c9f 375 PacketStatus_t packetStatus;
GregCr 1:22e02d1cfbca 376 Radio.GetPacketStatus(&packetStatus);
nimita23 3:c704345b0c9f 377 RssiValue = packetStatus.Params.LoRa.RssiPkt;
nimita23 3:c704345b0c9f 378 SnrValue = packetStatus.Params.LoRa.SnrPkt;
GregCr 1:22e02d1cfbca 379 printf("rssi: %d; snr: %d\n\r", RssiValue, SnrValue );
GregCr 1:22e02d1cfbca 380 }
GregCr 1:22e02d1cfbca 381
nimita23 4:99bfe3b61a6a 382 void OnTxTimeout( void ) {
GregCr 1:22e02d1cfbca 383 AppState = APP_TX_TIMEOUT;
GregCr 1:22e02d1cfbca 384 printf( "<>>>>>>>>TXE\r\n" );
GregCr 1:22e02d1cfbca 385 }
GregCr 1:22e02d1cfbca 386
nimita23 4:99bfe3b61a6a 387 void OnRxTimeout( void ) {
GregCr 1:22e02d1cfbca 388 AppState = APP_RX_TIMEOUT;
GregCr 1:22e02d1cfbca 389 }
GregCr 1:22e02d1cfbca 390
nimita23 4:99bfe3b61a6a 391 void OnRxError( IrqErrorCode_t errorCode ) {
GregCr 1:22e02d1cfbca 392 AppState = APP_RX_ERROR;
GregCr 1:22e02d1cfbca 393 printf( "RXE<>>>>>>>>\r\n" );
GregCr 1:22e02d1cfbca 394 }
nimita23 4:99bfe3b61a6a 395
nimita23 4:99bfe3b61a6a 396 void OnCadDone( bool channelActivityDetected ) {
nimita23 4:99bfe3b61a6a 397 }
nimita23 4:99bfe3b61a6a 398
GregCr 1:22e02d1cfbca 399
nimita23 4:99bfe3b61a6a 400 void parser() {
nimita23 4:99bfe3b61a6a 401 printf("%s\n\r", serial_buffer);
nimita23 4:99bfe3b61a6a 402 char command[10];
nimita23 4:99bfe3b61a6a 403 unsigned long val;
nimita23 4:99bfe3b61a6a 404 if(sscanf(serial_buffer, "%10s %lu", command, &val) != 2){
nimita23 4:99bfe3b61a6a 405 printf("Invalid Input\n\r");
nimita23 4:99bfe3b61a6a 406 return;
nimita23 4:99bfe3b61a6a 407 }
nimita23 4:99bfe3b61a6a 408 if(strcmp(command, "FREQ") == 0) {
nimita23 4:99bfe3b61a6a 409 if((125000000<=val) && (val<=960000000)) {
nimita23 4:99bfe3b61a6a 410 RF_FREQUENCY = val;
nimita23 4:99bfe3b61a6a 411 printf("Frequency set to: %lu\n\r", val);
nimita23 5:dc53029f4c02 412 LoRa_init();
nimita23 5:dc53029f4c02 413 }
nimita23 5:dc53029f4c02 414 }
nimita23 5:dc53029f4c02 415 else if(strcmp(command, "S_F") == 0) {
nimita23 5:dc53029f4c02 416 switch(val) {
nimita23 5:dc53029f4c02 417 case 5:
nimita23 5:dc53029f4c02 418 spreading_factor = LORA_SF5;
nimita23 5:dc53029f4c02 419 break;
nimita23 5:dc53029f4c02 420 case 6:
nimita23 5:dc53029f4c02 421 spreading_factor = LORA_SF6;
nimita23 5:dc53029f4c02 422 break;
nimita23 5:dc53029f4c02 423 case 7:
nimita23 5:dc53029f4c02 424 spreading_factor = LORA_SF7;
nimita23 5:dc53029f4c02 425 break;
nimita23 5:dc53029f4c02 426 case 8:
nimita23 5:dc53029f4c02 427 spreading_factor = LORA_SF8;
nimita23 5:dc53029f4c02 428 break;
nimita23 5:dc53029f4c02 429 case 9:
nimita23 5:dc53029f4c02 430 spreading_factor = LORA_SF9;
nimita23 5:dc53029f4c02 431 break;
nimita23 5:dc53029f4c02 432 case 10:
nimita23 5:dc53029f4c02 433 spreading_factor = LORA_SF10;
nimita23 5:dc53029f4c02 434 break;
nimita23 5:dc53029f4c02 435 case 11:
nimita23 5:dc53029f4c02 436 spreading_factor = LORA_SF11;
nimita23 5:dc53029f4c02 437 break;
nimita23 5:dc53029f4c02 438 case 12:
nimita23 5:dc53029f4c02 439 spreading_factor = LORA_SF12;
nimita23 5:dc53029f4c02 440 break;
nimita23 5:dc53029f4c02 441 default:
nimita23 5:dc53029f4c02 442 printf("enter spreading factor between 5 and 12\n\r");
nimita23 5:dc53029f4c02 443 return;
nimita23 4:99bfe3b61a6a 444 }
nimita23 5:dc53029f4c02 445 printf("Spreading factor changed to %lu\n\r", val);
nimita23 5:dc53029f4c02 446 LoRa.init();
nimita23 5:dc53029f4c02 447 }
nimita23 5:dc53029f4c02 448 else if(strcmp(command, "BW") == 0) {
nimita23 5:dc53029f4c02 449 switch(val) {
nimita23 5:dc53029f4c02 450 case 500:
nimita23 5:dc53029f4c02 451 bandwidth = LORA_BW_500;
nimita23 5:dc53029f4c02 452 break;
nimita23 5:dc53029f4c02 453 case 250:
nimita23 5:dc53029f4c02 454 bandwidth = LORA_BW_250;
nimita23 5:dc53029f4c02 455 break;
nimita23 5:dc53029f4c02 456 case 125:
nimita23 5:dc53029f4c02 457 bandwidth = LORA_BW_125;
nimita23 5:dc53029f4c02 458 break;
nimita23 5:dc53029f4c02 459 case 062:
nimita23 5:dc53029f4c02 460 bandwidth = LORA_BW_062;
nimita23 5:dc53029f4c02 461 break;
nimita23 5:dc53029f4c02 462 case 041:
nimita23 5:dc53029f4c02 463 bandwidth = LORA_BW_041;
nimita23 5:dc53029f4c02 464 break;
nimita23 5:dc53029f4c02 465 case 031:
nimita23 5:dc53029f4c02 466 bandwidth = LORA_BW_031;
nimita23 5:dc53029f4c02 467 break;
nimita23 5:dc53029f4c02 468 case 020:
nimita23 5:dc53029f4c02 469 bandwidth = LORA_BW_020;
nimita23 5:dc53029f4c02 470 break;
nimita23 5:dc53029f4c02 471 case 015:
nimita23 5:dc53029f4c02 472 bandwidth = LORA_BW_015;
nimita23 5:dc53029f4c02 473 break;
nimita23 5:dc53029f4c02 474 case 010:
nimita23 5:dc53029f4c02 475 bandwidth = LORA_BW_010;
nimita23 5:dc53029f4c02 476 break;
nimita23 5:dc53029f4c02 477 case 007:
nimita23 5:dc53029f4c02 478 bandwidth = LORA_BW_007;
nimita23 5:dc53029f4c02 479 break;
nimita23 5:dc53029f4c02 480 default:
nimita23 5:dc53029f4c02 481 printf("Valid bandwidths: 500, 250, 125, 62, 41, 31, 20, ");
nimita23 5:dc53029f4c02 482 printf("15, 10, 7\n\r");
nimita23 5:dc53029f4c02 483 return;
nimita23 5:dc53029f4c02 484 }
nimita23 5:dc53029f4c02 485 printf("LoRa bandwidth changed to %lu\n\r", val);
nimita23 5:dc53029f4c02 486 LoRa.init();
nimita23 4:99bfe3b61a6a 487 }
nimita23 4:99bfe3b61a6a 488 else
nimita23 4:99bfe3b61a6a 489 printf("Invalid command\n\r");
nimita23 4:99bfe3b61a6a 490
nimita23 4:99bfe3b61a6a 491
GregCr 1:22e02d1cfbca 492 }