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

Revision:
21:03a7d7429cd1
Parent:
20:17d8ea079085
--- 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