nimita naik
/
SX1262PingPong
ping pong with modifiable parameters
main.cpp@5:dc53029f4c02, 2019-06-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |