Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
