ping pong with modifiable parameters

Dependencies:   mbed SX126xLib

Committer:
nimita23
Date:
Tue Nov 12 20:18:22 2019 +0000
Revision:
9:58c61a425d06
Parent:
8:2952eeb51ceb
first public commit

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