This code holds the complete demo set for the sx1280: PingPong, PER and Ranging Outdoor demo application. >>>>> This code MUST run on the mbed library release 127 or everything will be painfully slow.

Dependencies:   mbed SX1280Lib DmTftLibrary

* This code MUST run on the mbed library release 127 or everything will be painfully slow.*
Revision:
19:45d0ce0f0677
Parent:
18:22796c3be774
--- a/Demo/DemoApplication.cpp	Fri Aug 24 08:01:53 2018 +0000
+++ b/Demo/DemoApplication.cpp	Thu Nov 08 10:13:23 2018 +0000
@@ -19,6 +19,7 @@
 #include "Eeprom.h"
 #include "DemoApplication.h"
 #include "FreqLUT.h"
+#include "RangingCorrection.h"
 
 #define max(a,b) \
    ({ __typeof__ (a) _a = (a); \
@@ -35,6 +36,14 @@
 double t7 =       0.000009240142234;                          // X2^4
 
 
+double p[8] = { 0,
+                -4.1e-9,
+                1.03e-7,
+                1.971e-5,
+                -0.00107,
+                0.018757,
+                0.869171,
+                3.072450 };
 
 /*!
  * \brief Defines the local payload buffer size
@@ -346,7 +355,6 @@
         InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
         TX_LED = 0;
         RX_LED = 0;
-
         IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
         Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
         for( i = 0; i < localPayloadSize; i++ )
@@ -1054,8 +1062,8 @@
         if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
         {
             Eeprom.EepromData.DemoSettings.TimeOnAir = RX_TX_INTER_PACKET_DELAY;
-            Radio.SetDioIrqParams( IRQ_RADIO_ALL /*IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_ERROR_CODE*/,
-                                   IRQ_RADIO_ALL /*IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_ERROR_CODE*/,
+            Radio.SetDioIrqParams( IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_TIMEOUT,
+                                   IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_TIMEOUT,
                                    IRQ_RADIO_NONE, IRQ_RADIO_NONE );
             Eeprom.EepromData.DemoSettings.RngDistance = 0.0;
             DemoInternalState = APP_RANGING_CONFIG;
@@ -1130,8 +1138,8 @@
                                 }
                                 break;
 
-                            case DEMO_RNG_ANT_2:
-                                //ANT_SW = 0; // ANT2
+                            case DEMO_RNG_ANT_0:
+                                //ANT_SW = 0; // ANT0
                                 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
                                 CurrentChannel++;
                                 if( CurrentChannel >= CHANNELS )
@@ -1170,13 +1178,21 @@
                         Eeprom.EepromData.DemoSettings.HoldDemo = true;
                         SendNext = false;
                         DemoInternalState = APP_RANGING_CONFIG;
+                        Eeprom.EepromData.DemoSettings.RngStatus = RNG_INIT;
                     }
                 }
                 break;
 
             case APP_RANGING_DONE:
                 TX_LED = 0;
-                RawRngResults[RngResultIndex++] = Radio.GetRangingResult( RANGING_RESULT_RAW );
+                RawRngResults[RngResultIndex] = Radio.GetRangingResult( RANGING_RESULT_RAW );
+                RawRngResults[RngResultIndex] += Sx1280RangingCorrection::GetRangingCorrectionPerSfBwGain(
+                    ModulationParams.Params.LoRa.SpreadingFactor,
+                    ModulationParams.Params.LoRa.Bandwidth,
+                    Radio.GetRangingPowerDeltaThresholdIndicator( )
+                );
+                RngResultIndex++;
+
                 Eeprom.EepromData.DemoSettings.CntPacketRxOK++;
                 DemoInternalState = APP_RNG;
                 break;
@@ -1327,8 +1343,8 @@
                                 }
                                 break;
 
-                            case DEMO_RNG_ANT_2:
-                                //ANT_SW = 0; // ANT2
+                            case DEMO_RNG_ANT_0:
+                                //ANT_SW = 0; // ANT0
                                 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
                                 CurrentChannel++;
                                 if( CurrentChannel >= CHANNELS )
@@ -1409,6 +1425,10 @@
                         Radio.SendPayload( Buffer, 9, ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, RNG_COM_TIMEOUT } );
                         DemoInternalState = APP_IDLE;
                     }
+                    else
+                    {
+                        DemoInternalState = APP_RANGING_CONFIG;
+                    }
                 }
                 else
                 {
@@ -1790,7 +1810,7 @@
 
         Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength;
 
-        Radio.WriteRegister( REG_HIGH_SENSITIVITY, Radio.ReadRegister( REG_HIGH_SENSITIVITY ) & ~LNA_HIGH_SENSITIVITY_MASK );
+        Radio.SetLNAGainSetting(LNA_LOW_POWER_MODE);
     }
     else if( modulation == PACKET_TYPE_FLRC )
     {
@@ -1813,7 +1833,7 @@
 
         Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Flrc.PayloadLength;
 
-        Radio.WriteRegister( REG_HIGH_SENSITIVITY, Radio.ReadRegister( REG_HIGH_SENSITIVITY ) | LNA_HIGH_SENSITIVITY_MASK );
+        Radio.SetLNAGainSetting(LNA_HIGH_SENSITIVITY_MODE);
     }
     else if( modulation == PACKET_TYPE_GFSK )
     {
@@ -1835,8 +1855,8 @@
         PacketParams.Params.Gfsk.Whitening             = ( RadioWhiteningModes_t )   Eeprom.EepromData.DemoSettings.PacketParam7;
 
         Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Gfsk.PayloadLength;
-        
-        Radio.WriteRegister( REG_HIGH_SENSITIVITY, Radio.ReadRegister( REG_HIGH_SENSITIVITY ) | LNA_HIGH_SENSITIVITY_MASK );
+
+        Radio.SetLNAGainSetting(LNA_HIGH_SENSITIVITY_MODE);
     }
     if( modulation == PACKET_TYPE_RANGING )
     {
@@ -1866,7 +1886,7 @@
         }
 
         Radio.SetPollingMode( );
-        Radio.WriteRegister( REG_HIGH_SENSITIVITY, Radio.ReadRegister( REG_HIGH_SENSITIVITY ) & ~LNA_HIGH_SENSITIVITY_MASK );
+        Radio.SetLNAGainSetting(LNA_LOW_POWER_MODE);
     }
     else
     {
@@ -1910,7 +1930,6 @@
 uint8_t CheckDistance( void )
 {
     double displayRange = 0.0;
-    double rssi = Eeprom.EepromData.DemoSettings.RssiValue;
 
     uint16_t j = 0;
     uint16_t i;
@@ -1941,16 +1960,34 @@
         if ((RngResultIndex % 2) == 0) 
         {
             median = (RawRngResults[RngResultIndex/2] + RawRngResults[(RngResultIndex/2) - 1])/2.0;
-        } 
-        else 
+        }
+        else
         {
             median = RawRngResults[RngResultIndex/2];
         }
 
-        if( median < 50 )
+        if( median < 100 )
         {
+            printf("median: %f \n\r", median );
             // Apply the short range correction and RSSI short range improvement below 50 m
-            displayRange = t0 + t1 * rssi + t2 * pow(rssi,2) + t3 * pow(rssi, 3) +t4 * median + t5 * pow(median,2) + t6 * pow(median, 3) + t7 * pow(median, 4) ;       
+            displayRange = Sx1280RangingCorrection::ComputeRangingCorrectionPolynome(
+                ModulationParams.Params.LoRa.SpreadingFactor,
+                ModulationParams.Params.LoRa.Bandwidth,
+                median
+            );
+            printf("Corrected range: %f \n\r", displayRange );
+            //displayRange = t0 + t1 * rssi + t2 * pow(rssi,2) + t3 * pow(rssi, 3) + t4 * median + t5 * pow(median,2) + t6 * pow(median, 3) + t7 * pow(median, 4) ;
+            //printf("displayRange %f \n\r", displayRange );
+//            double correctedRange = 0;
+//            uint8_t k = 0;
+//            uint8_t order = 6;
+//            for( k = 1; k <= (order+1); k++ )                    // loop though each polynomial term and sum
+//            {
+//                correctedRange = correctedRange + p[k] * pow( median, ( order + 1 - k ) );
+//                printf("correctedRange[%d] %f \n\r", k, correctedRange );
+//            }
+//            printf("Final correctedRange %f \n\r", correctedRange );
+//            displayRange = correctedRange - 2;
         }
         else
         {
@@ -2021,7 +2058,7 @@
     }
     else
     {
-        ANT_SW = 0; // ANT2
+        ANT_SW = 0; // ANT0
     }
 }