nimita naik
/
SX1262PingPong
ping pong with modifiable parameters
main.cpp@9:58c61a425d06, 2019-11-12 (annotated)
- 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?
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 |
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 | } |