ping pong with modifiable parameters

Dependencies:   mbed SX126xLib

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