ping pong with modifiable parameters

Dependencies:   mbed SX126xLib

Committer:
nimita23
Date:
Fri Jun 21 19:08:11 2019 +0000
Revision:
6:e155f7cceb5b
Parent:
5:dc53029f4c02
Child:
7:df2f595fda33
all values changeable;

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