Create a LoRa Modem from the SX1272PingPong example
Fork of SX1272PingPong by
Diff: main.cpp
- Revision:
- 14:3c9348ac486c
- Parent:
- 13:edb9b443c1dd
- Child:
- 15:9c3805baa6c1
--- a/main.cpp Wed Feb 17 09:17:46 2016 +0000 +++ b/main.cpp Wed Jan 25 12:16:30 2017 +0000 @@ -3,23 +3,41 @@ #include "sx1272-hal.h" #include "debug.h" +/* CONFIGURATION */ + +#define NODE_ADDR 0x411A + /* Set this flag to '1' to display debug messages on the console */ #define DEBUG_MESSAGE 1 +#define RX_MODE 1 + +#define TX_MODE !RX_MODE + +/* Set the mode RX_MODE or TX_MODE */ +#define MODE TX_MODE + +/* Set the delay (according the duty cycle for the ISM band of the frequency RF_FREQUENCY */ + +#define DUTY_CYCLE 0.01 +//#define DELAY_NEXT_TX_IN_MILLISEC ((int)((timeOnAirInMilli / DUTY_CYCLE)-timeOnAirInMilli)) + +#define DELAY_NEXT_TX_IN_MILLISEC 5000 + /* Set this flag to '1' to use the LoRa modulation or to '0' to use FSK modulation */ #define USE_MODEM_LORA 1 #define USE_MODEM_FSK !USE_MODEM_LORA -#define RF_FREQUENCY 868000000 // Hz +#define RF_FREQUENCY 868100000 // Hz #define TX_OUTPUT_POWER 14 // 14 dBm #if USE_MODEM_LORA == 1 - #define LORA_BANDWIDTH 2 // [0: 125 kHz, + #define LORA_BANDWIDTH 0 // [0: 125 kHz, // 1: 250 kHz, // 2: 500 kHz, // 3: Reserved] - #define LORA_SPREADING_FACTOR 7 // [SF7..SF12] + #define LORA_SPREADING_FACTOR 12 // [SF7..SF12] #define LORA_CODINGRATE 1 // [1: 4/5, // 2: 4/6, // 3: 4/7, @@ -46,8 +64,11 @@ #error "Please define a modem in the compiler options." #endif -#define RX_TIMEOUT_VALUE 3500000 // in us -#define BUFFER_SIZE 32 // Define the payload size here +#define RX_TIMEOUT_VALUE 1000000000 // in us +#define BUFFER_SIZE 17 // Define the payload size here + + +Serial pc(USBTX,USBRX); #if( defined ( TARGET_KL25Z ) || defined ( TARGET_LPC11U6X ) ) DigitalOut led(LED2); @@ -85,23 +106,37 @@ * Global variables declarations */ SX1272MB2xAS Radio( NULL ); - -const uint8_t PingMsg[] = "PING"; -const uint8_t PongMsg[] = "PONG"; - uint16_t BufferSize = BUFFER_SIZE; uint8_t Buffer[BUFFER_SIZE]; -int16_t RssiValue = 0.0; -int8_t SnrValue = 0.0; +int16_t RssiValue = 0; +int8_t SnrValue = 0; +int8_t TemperatureValue = 0; + +ModemType Modem; + +uint16_t SeqNum = 0; + +// Address of the Source Node +uint16_t NodeSrcAddr = NODE_ADDR; + +void hexprintf(Serial* pc, const uint8_t* buffer, uint16_t size) +{ + for(uint16_t count = 0; count < size; count++) + { + pc->printf("%02x", buffer[count]); + } +} +const uint8_t Msg[] = "TEST**##abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrstuvwxyz#0123456789#ABCDEFGHIJKLMNOPQRSTUVWXYZ#0123456789#abcdefghijklmnopqrs#"; /* abc.. is for padding */ int main() { - uint8_t i; - bool isMaster = true; + + pc.format(8, Serial::None, 1); + pc.baud(115200); - debug( "\n\n\r SX1272 Ping Pong Demo Application \n\n\r" ); - + debug( ">INFO RX/TX Modem \r\n\n" ); + // Initialize Radio driver RadioEvents.TxDone = OnTxDone; RadioEvents.RxDone = OnRxDone; @@ -156,146 +191,90 @@ #error "Please define a modem in the compiler options." #endif - - debug_if( DEBUG_MESSAGE, "Starting Ping-Pong loop\r\n" ); - - led = 0; - + led = 0; +#if MODE == RX_MODE + debug_if( DEBUG_MESSAGE, ">INFO Starting RX loop\r\n" ); + + // start RX Radio.Rx( RX_TIMEOUT_VALUE ); + State = LOWPOWER; +#elif MODE == TX_MODE + debug_if( DEBUG_MESSAGE, ">INFO Starting TX loop\r\n" ); + State = TX; + +#else +#error "Please define a valid mode (RX_MODE, TX_MODE)." +#endif + +// TODO ECHO_MODE : RX_MODE then TX_MODE + while( 1 ) { switch( State ) { case RX: - if( isMaster == true ) - { if( BufferSize > 0 ) { - if( strncmp( ( const char* )Buffer, ( const char* )PongMsg, 4 ) == 0 ) - { - led = !led; - debug( "...Pong\r\n" ); - // Send the next PING frame - strcpy( ( char* )Buffer, ( char* )PingMsg ); - // We fill the buffer with numbers for the payload - for( i = 4; i < BufferSize; i++ ) - { - Buffer[i] = i - 4; - } - wait_ms( 10 ); - Radio.Send( Buffer, BufferSize ); - } - else if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 ) - { // A master already exists then become a slave - debug( "...Ping\r\n" ); - led = !led; - isMaster = false; - // Send the next PONG frame - strcpy( ( char* )Buffer, ( char* )PongMsg ); - // We fill the buffer with numbers for the payload - for( i = 4; i < BufferSize; i++ ) - { - Buffer[i] = i - 4; - } - wait_ms( 10 ); - Radio.Send( Buffer, BufferSize ); - } - else // valid reception but neither a PING or a PONG message - { // Set device as master ans start again - isMaster = true; - Radio.Rx( RX_TIMEOUT_VALUE ); - } + led = !led; // Invert LED + + + // TODO ADD tmst | number | Internal timestamp of "RX finished" event (32b unsigned) + + pc.printf(">INFO RX modem=%d size=%d rssi=%d temp=%d snr=%d freq=%d bw=%d sf=%d cr=%d buffer=", + Modem, BufferSize, RssiValue, TemperatureValue, SnrValue, RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE ); + hexprintf(&pc, Buffer, BufferSize); + pc.printf("\r\n"); + + pc.printf("RX;%d;%d;%d;%d;%d;%d;%d;%d;", + Modem, BufferSize, RssiValue, SnrValue, RF_FREQUENCY, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODINGRATE ); + hexprintf(&pc, Buffer, BufferSize); + pc.printf("\r\n"); +// wait_ms( 10 ); + Radio.Rx( RX_TIMEOUT_VALUE ); } - } - else - { - if( BufferSize > 0 ) - { - if( strncmp( ( const char* )Buffer, ( const char* )PingMsg, 4 ) == 0 ) - { - led = !led; - debug( "...Ping\r\n" ); - // Send the reply to the PING string - strcpy( ( char* )Buffer, ( char* )PongMsg ); - // We fill the buffer with numbers for the payload - for( i = 4; i < BufferSize; i++ ) - { - Buffer[i] = i - 4; - } - wait_ms( 10 ); - Radio.Send( Buffer, BufferSize ); - } - else // valid reception but not a PING as expected - { // Set device as master and start again - isMaster = true; - Radio.Rx( RX_TIMEOUT_VALUE ); - } - } - } - State = LOWPOWER; - break; - case TX: - led = !led; - if( isMaster == true ) - { - debug( "Ping...\r\n" ); - } - else - { - debug( "Pong...\r\n" ); - } - Radio.Rx( RX_TIMEOUT_VALUE ); + State = LOWPOWER; break; case RX_TIMEOUT: - if( isMaster == true ) - { - // Send the next PING frame - strcpy( ( char* )Buffer, ( char* )PingMsg ); - for( i = 4; i < BufferSize; i++ ) - { - Buffer[i] = i - 4; - } - wait_ms( 10 ); - Radio.Send( Buffer, BufferSize ); - } - else - { - Radio.Rx( RX_TIMEOUT_VALUE ); - } + Radio.Rx( RX_TIMEOUT_VALUE ); State = LOWPOWER; break; case RX_ERROR: - // We have received a Packet with a CRC error, send reply as if packet was correct - if( isMaster == true ) - { - // Send the next PING frame - strcpy( ( char* )Buffer, ( char* )PingMsg ); - for( i = 4; i < BufferSize; i++ ) - { - Buffer[i] = i - 4; - } - wait_ms( 10 ); - Radio.Send( Buffer, BufferSize ); - } - else - { - // Send the next PONG frame - strcpy( ( char* )Buffer, ( char* )PongMsg ); - for( i = 4; i < BufferSize; i++ ) - { - Buffer[i] = i - 4; - } - wait_ms( 10 ); - Radio.Send( Buffer, BufferSize ); - } + // We have received a Packet with a CRC error + pc.printf(">INFO RX_ERROR size=%d\r\n", BufferSize); + pc.printf("RX_ERROR;%d\r\n", BufferSize); + Radio.Rx( RX_TIMEOUT_VALUE ); State = LOWPOWER; break; case TX_TIMEOUT: - Radio.Rx( RX_TIMEOUT_VALUE ); + pc.printf(">TX: TIMEOUT\r\n"); + case TX: + int timeOnAirInMilli = Radio.TimeOnAir(Modem,BufferSize)/1000; + if(DELAY_NEXT_TX_IN_MILLISEC!=0) { + pc.printf(">INFO: wait %.4f sec before TX\r\n", DELAY_NEXT_TX_IN_MILLISEC/1000.0); + wait_ms( DELAY_NEXT_TX_IN_MILLISEC ); + } + led = !led; // Invert LED + memcpy(( char* )Buffer, ( char* ) Msg, BufferSize); + ++SeqNum; + + TemperatureValue = Radio.Read( REG_TEMP ); + + /* refresh counters in payload (big endian, for readability) */ + Buffer[4] = (uint8_t)(SeqNum >> 8); /* MSB */ + Buffer[5] = (uint8_t)(SeqNum & 0x00FF); /* LSB */ + Buffer[6] = (uint8_t)(NodeSrcAddr >> 8); /* MSB */ + Buffer[7] = (uint8_t)(NodeSrcAddr & 0x00FF); /* LSB */ + Buffer[8] = (uint8_t)(TemperatureValue >> 8); /* MSB */ + Buffer[9] = (uint8_t)(TemperatureValue & 0x00FF); /* LSB */ + + /* send packet */ + pc.printf(">TX: temp=%d src=%4x seqnum=%u size=%d timeOnAir=%.4f\r\n", TemperatureValue, NodeSrcAddr, SeqNum, BufferSize, timeOnAirInMilli/1000.0); + wait_ms( 10 ); + Radio.Send( Buffer, BufferSize ); State = LOWPOWER; - break; + break; case LOWPOWER: break; default: @@ -344,4 +323,3 @@ State = RX_ERROR; debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" ); } -