Fork of the Simple Ping-Pong demo application between two SX1272MB2xAs demo board. It's now a simple application demonstrating simple Rx (Receive) from a SX1272 boards.
Fork of SX1272PingPong by
Revision 21:03a7d7429cd1, committed 2017-04-01
- Comitter:
- Antoine38
- Date:
- Sat Apr 01 21:46:33 2017 +0000
- Parent:
- 20:17d8ea079085
- Commit message:
- Optimization of received message + conversion (magic formula)
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
main.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 17d8ea079085 -r 03a7d7429cd1 main.cpp --- a/main.cpp Tue Mar 28 14:44:05 2017 +0000 +++ b/main.cpp Sat Apr 01 21:46:33 2017 +0000 @@ -29,10 +29,23 @@ #define LORA_CRC_ENABLED true #define RX_TIMEOUT_VALUE 3500000 // in us -#define BUFFER_SIZE 1024 // Define the payload size here +#define BUFFER_SIZE 48 // Define the payload size here DigitalOut led(LED1); +/* + * Global variables declarations + */ +typedef enum { + LOWPOWER = 0, + + RX, + RX_TIMEOUT, + RX_ERROR +} AppStates_t; + +volatile AppStates_t State = LOWPOWER; + /*! * Radio events function pointer */ @@ -43,7 +56,7 @@ */ SX1272MB2xAS Radio( NULL ); -uint16_t BufferSize = BUFFER_SIZE; +uint16_t BufferSize = 0; uint8_t Buffer[BUFFER_SIZE]; int16_t RssiValue = 0.0; @@ -80,22 +93,41 @@ LORA_IQ_INVERSION_ON, true ); - debug_if( DEBUG_MESSAGE, "Starting listening loop\r\n" ); + debug_if( DEBUG_MESSAGE, "Starting listening loop\r\n\r\n" ); led = 0; - Radio.Rx( RX_TIMEOUT_VALUE ); while( 1 ) { - if(strlen(Buffer > 0)) { - debug("\r\n========\r\nNew Packet\r\n========\r\n"); - debug("%s \r\n", Buffer); + switch( State ) { + case RX: + if( BufferSize > 0 ) { + debug_if( DEBUG_MESSAGE, "\r\n========\r\nNew Packet\r\n========\r\n" ); + for(int i = 0; i < BufferSize; i++) { + debug_if( DEBUG_MESSAGE, "%x", Buffer[i]); + } + debug_if( DEBUG_MESSAGE, "\r\n"); + retrieve_data( Buffer ); + } + BufferSize = 0; + Radio.Rx( RX_TIMEOUT_VALUE ); + State = LOWPOWER; + break; + case RX_TIMEOUT: + Radio.Rx( RX_TIMEOUT_VALUE ); + State = LOWPOWER; + break; + case RX_ERROR: + // We have received a Packet with a CRC error + Radio.Rx( RX_TIMEOUT_VALUE ); + State = LOWPOWER; + break; + case LOWPOWER: + break; + default: + State = LOWPOWER; + break; } - // Clear the buffer - Buffer[0] = 0; - - led = 1-led; - wait(1); } } @@ -106,19 +138,71 @@ memcpy( Buffer, payload, BufferSize ); RssiValue = rssi; SnrValue = snr; - debug_if( DEBUG_MESSAGE, "> OnRxDone\n\r" ); + State = RX; + debug_if( DEBUG_MESSAGE, "> OnRxDone %d \n\r", RssiValue ); } void OnRxTimeout( void ) { Radio.Sleep( ); - Buffer[ BufferSize ] = 0; + BufferSize = 0; + State = RX_TIMEOUT; debug_if( DEBUG_MESSAGE, "> OnRxTimeout\n\r" ); } void OnRxError( void ) { Radio.Sleep( ); + State = RX_ERROR; debug_if( DEBUG_MESSAGE, "> OnRxError\n\r" ); } +float u8_to_float(uint8_t x, bool isTemp) +{ + float a = 0.0; + if ( isTemp ) { + a = 30.0; + } + return (x/255.0)*100.0 - a; +} + +void retrieve_data(uint8_t * payload) +{ + uint8_t measurements_type[4]; + uint8_t greenhouse_info = payload[5]; + printf("Greenhouse number: %d \r\n", greenhouse_info & 0x0F); + printf("Sensors position: %d \r\n", (greenhouse_info & 0x30) >> 4); + + measurements_type[0] = payload[4] & 0x03; + measurements_type[1] = (payload[4] >> 2) & 0x03; + measurements_type[2] = (payload[4] >> 4) & 0x03; + measurements_type[3] = (payload[4] >> 6) & 0x03; + + convert(payload[0], measurements_type[3]); + convert(payload[1], measurements_type[2]); + convert(payload[2], measurements_type[1]); + convert(payload[3], measurements_type[0]); +} + +void convert(uint8_t m, uint8_t t) +{ + if( t & 0x01 == 1 ) { + // Air + if( (t >> 1) & 0x01 == 1 ) { + // Humidity + printf("HumiA=%3.2f \r\n", (float) m); + } else { + // Temperature + printf("TempA=%3.2f \r\n", (float) m); + } + } else { + // Soil + if( (t >> 1) & 0x01 == 1 ) { + // Humidity + printf("HumiS=%3.2f \r\n", u8_to_float(m, false)); + } else { + // Temperature + printf("TempS=%3.2f \r\n", u8_to_float(m, true)); + } + } +} \ No newline at end of file
diff -r 17d8ea079085 -r 03a7d7429cd1 main.h --- a/main.h Tue Mar 28 14:44:05 2017 +0000 +++ b/main.h Sat Apr 01 21:46:33 2017 +0000 @@ -36,13 +36,18 @@ void OnRxError( void ); /*! - * @brief Function executed on Radio Fhss Change Channel event + * @brief Function which convert a unint8 to float */ -void OnFhssChangeChannel( uint8_t channelIndex ); +float u8_to_float(uint8_t x, bool isTemp); /*! - * @brief Function executed on CAD Done event + * @brief function that print payload data */ -void OnCadDone( void ); +void retrieve_data(uint8_t * payload); + +/*! + * @brief function that convert an encoded measurement into is real value + */ +void convert(uint8_t m, uint8_t t); #endif // __MAIN_H__ \ No newline at end of file