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.

Dependencies:   SX1272Lib mbed

Fork of SX1272PingPong by Semtech

Files at this revision

API Documentation at this revision

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