Semtech / Mbed 2 deprecated SX1280DevKit

Dependencies:   mbed SX1280Lib DmTftLibrary

* This code MUST run on the mbed library release 127 or everything will be painfully slow.*

Files at this revision

API Documentation at this revision

Comitter:
GregCr
Date:
Thu May 11 15:42:05 2017 +0000
Parent:
7:bc2f0fe8056f
Child:
9:0efc2c99078f
Commit message:
Corrected driver to match datasheet, corrected FW version registers, improved ranging performances at short distance

Changed in this revision

Demo/DemoApplication.cpp Show annotated file Show diff for this revision Revisions of this file
Demo/DemoApplication.h Show annotated file Show diff for this revision Revisions of this file
Demo/SX1280Lib.lib Show annotated file Show diff for this revision Revisions of this file
Display/Menu.cpp Show annotated file Show diff for this revision Revisions of this file
Display/Menu.h Show annotated file Show diff for this revision Revisions of this file
Peripherals/Eeprom.cpp Show annotated file Show diff for this revision Revisions of this file
Peripherals/Eeprom.h Show annotated file Show diff for this revision Revisions of this file
--- a/Demo/DemoApplication.cpp	Wed Apr 19 14:21:05 2017 +0000
+++ b/Demo/DemoApplication.cpp	Thu May 11 15:42:05 2017 +0000
@@ -13,12 +13,23 @@
 */
 
 #include "mbed.h"
+#include <math.h>
 #include "radio.h"
 #include "sx1280-hal.h"
 #include "Eeprom.h"
 #include "DemoApplication.h"
 #include "FreqLUT.h"
 
+double t0 =       -0.016432807883697;                         // X0
+double t1 =       0.323147003165358;                          // X1
+double t2 =       0.014922061351196;                          // X1^2
+double t3 =       0.000137832006285;                          // X1^3
+double t4 =       0.536873856625399;                          // X2
+double t5 =       0.040890089178579;                          // X2^2
+double t6 =       -0.001074801048732;                         // X2^3
+double t7 =       0.000009240142234;                          // X2^4
+
+
 
 /*!
  * \brief Defines the local payload buffer size
@@ -74,9 +85,11 @@
 uint8_t Buffer[BUFFER_SIZE];
 
 static uint8_t CurrentChannel;
-static uint8_t MeasuredChannels;
+static uint16_t MeasuredChannels;
 int RngResultIndex;
 double RawRngResults[DEMO_RNG_CHANNELS_COUNT_MAX];
+double RssiRng[DEMO_RNG_CHANNELS_COUNT_MAX];
+
 
 /*!
  * \brief Function to be executed on Radio Tx Done event
@@ -969,8 +982,8 @@
         if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
         {
             Eeprom.EepromData.DemoSettings.InterPacketDelay = RefreshScreenDelayMs;
-            Radio.SetDioIrqParams( IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_RESULT_TIMEOUT,
-                                   IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_RESULT_TIMEOUT,
+            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;
@@ -999,7 +1012,7 @@
                     memcpy( &( PacketParams.Params.LoRa.PreambleLength ),      Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
                     memcpy( &( PacketParams.Params.LoRa.HeaderType ),          Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR,   1 );
                     PacketParams.Params.LoRa.PayloadLength = 7;
-                    memcpy( &( PacketParams.Params.LoRa.CrcMode ),             Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
+                    memcpy( &( PacketParams.Params.LoRa.Crc ),                 Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
                     memcpy( &( PacketParams.Params.LoRa.InvertIQ ),            Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR,       1 );
                     Radio.SetPacketType( ModulationParams.PacketType );
                     Radio.SetModulationParams( &ModulationParams );
@@ -1122,7 +1135,7 @@
                         memcpy( &( PacketParams.Params.LoRa.PreambleLength ),      Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
                         memcpy( &( PacketParams.Params.LoRa.HeaderType ),          Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR,   1 );
                         PacketParams.Params.LoRa.PayloadLength = 10;
-                        memcpy( &( PacketParams.Params.LoRa.CrcMode ),             Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
+                        memcpy( &( PacketParams.Params.LoRa.Crc ),                 Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
                         memcpy( &( PacketParams.Params.LoRa.InvertIQ ),            Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR,       1 );
 
                         Radio.SetPacketType( ModulationParams.PacketType );
@@ -1174,12 +1187,14 @@
                 RX_LED = 0;
                 DemoInternalState = APP_RANGING_CONFIG;
                 Eeprom.EepromData.DemoSettings.HoldDemo = true;
+                refreshDisplay = 1; // display error on token color (RNG_TIMEOUT)
                 break;
 
             case APP_TX_TIMEOUT:
                 TX_LED = 0;
                 DemoInternalState = APP_RANGING_CONFIG;
                 Eeprom.EepromData.DemoSettings.HoldDemo = true;
+                refreshDisplay = 1; // display error on token color (RNG_TIMEOUT)
                 break;
 
             case APP_IDLE: // do nothing
@@ -1205,7 +1220,7 @@
                 memcpy( &( PacketParams.Params.LoRa.PreambleLength ),      Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
                 memcpy( &( PacketParams.Params.LoRa.HeaderType ),          Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR,   1 );
                 PacketParams.Params.LoRa.PayloadLength = 9;
-                memcpy( &( PacketParams.Params.LoRa.CrcMode ),             Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
+                memcpy( &( PacketParams.Params.LoRa.Crc ),                 Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
                 memcpy( &( PacketParams.Params.LoRa.InvertIQ ),            Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR,       1 );
                 Radio.SetPacketType( ModulationParams.PacketType );
                 Radio.SetModulationParams( &ModulationParams );
@@ -1229,7 +1244,8 @@
                         switch( Eeprom.EepromData.DemoSettings.RngAntenna )
                         {
                             case DEMO_RNG_ANT_1:
-                                ANT_SW = 1; // ANT1
+                                //ANT_SW = 1; // ANT1
+                                Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
                                 CurrentChannel++;
                                 if( CurrentChannel >= CHANNELS )
                                 {
@@ -1238,7 +1254,8 @@
                                 break;
 
                             case DEMO_RNG_ANT_2:
-                                ANT_SW = 0; // ANT2
+                                //ANT_SW = 0; // ANT2
+                                Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
                                 CurrentChannel++;
                                 if( CurrentChannel >= CHANNELS )
                                 {
@@ -1249,11 +1266,13 @@
                             case DEMO_RNG_ANT_BOTH:
                                 if( ANT_SW == 1 )
                                 {
-                                    ANT_SW = 0;
+                                    //ANT_SW = 0;
+                                    Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
                                 }
                                 else
                                 {
-                                    ANT_SW = 1;
+                                    //ANT_SW = 1;
+                                    Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
                                     CurrentChannel++;
                                     if( CurrentChannel >= CHANNELS )
                                     {
@@ -1337,7 +1356,7 @@
                     memcpy( &( PacketParams.Params.LoRa.PreambleLength ),      Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
                     memcpy( &( PacketParams.Params.LoRa.HeaderType ),          Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR,   1 );
                     PacketParams.Params.LoRa.PayloadLength = 10;
-                    memcpy( &( PacketParams.Params.LoRa.CrcMode ),             Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
+                    memcpy( &( PacketParams.Params.LoRa.Crc ),                 Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
                     memcpy( &( PacketParams.Params.LoRa.InvertIQ ),            Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR,       1 );
 
                     Radio.SetPacketType( ModulationParams.PacketType );
@@ -1501,7 +1520,7 @@
         double tPreamble = ( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength + 4.25 ) * ts; // time of preamble
         uint8_t de = 1;    // always 1 on SX1280. "low data rate optimization" condition.
         double tmp = ceil( ( 8 * Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength - 4 * ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) +
-                             28 + 16 * ( ( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode == 0x00 ) ? 0 : 1 ) - \
+                             28 + 16 * ( ( Eeprom.EepromData.PacketParams.Params.LoRa.Crc == 0x00 ) ? 0 : 1 ) - \
                              ( ( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType >> 7 ) ? 20 : 0 ) ) / \
                            ( double )( 4 * ( ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - ( de * 2 ) ) ) * \
                            ( ( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate % 4 ) + 4 ) );                     // Symbol length of payload and time
@@ -1724,7 +1743,7 @@
         PacketParams.Params.LoRa.PreambleLength      =                                  Eeprom.EepromData.DemoSettings.PacketParam1;
         PacketParams.Params.LoRa.HeaderType          = ( RadioLoRaPacketLengthsModes_t )Eeprom.EepromData.DemoSettings.PacketParam2;
         PacketParams.Params.LoRa.PayloadLength       =                                  Eeprom.EepromData.DemoSettings.PacketParam3;
-        PacketParams.Params.LoRa.CrcMode             = ( RadioLoRaCrcModes_t )          Eeprom.EepromData.DemoSettings.PacketParam4;
+        PacketParams.Params.LoRa.Crc                 = ( RadioLoRaCrcModes_t )          Eeprom.EepromData.DemoSettings.PacketParam4;
         PacketParams.Params.LoRa.InvertIQ            = ( RadioLoRaIQModes_t )           Eeprom.EepromData.DemoSettings.PacketParam5;
 
         Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength;
@@ -1805,7 +1824,8 @@
         // only used in GFSK, FLRC (4 bytes max) and BLE mode
         Radio.SetSyncWord( 1, ( uint8_t[] ){ 0xDD, 0xA0, 0x96, 0x69, 0xDD } );
         // only used in GFSK, FLRC
-        Radio.SetCrcSeed( 0x4567 );
+        uint8_t crcSeedLocal[3] = { 0x00, 0x45, 0x67 };
+        Radio.SetCrcSeed( crcSeedLocal );
         Radio.SetCrcPolynomial( 0x0123 );
         Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
     }
@@ -1826,78 +1846,46 @@
 uint8_t CheckDistance( void )
 {
     double mean = 0.0;
-    double meanRaw = 0.0;
     double total = 0.0;
-    double squareDeviation = 0.0;
-    double squareDeviationRaw = 0.0;
-    uint8_t j = 0;
-    uint8_t i;
+    double rssi = Eeprom.EepromData.DemoSettings.RssiValue;
+
+    uint16_t j = 0;
+    uint16_t i;
 
     printf( "#id: %d", Eeprom.EepromData.DemoSettings.CntPacketTx );
     if( RngResultIndex > 0 )
     {
-        // compute average and std deviation w/o frequency correction
-        for( i = 0; i < RngResultIndex; ++i )
-        {
-            total               += RawRngResults[i];
-            squareDeviationRaw  += RawRngResults[i] * RawRngResults[i];
-        }
-        meanRaw = total / RngResultIndex;
-        squareDeviationRaw = sqrt( ( squareDeviationRaw / RngResultIndex ) - ( meanRaw * meanRaw ) );
-
         // compute average and std deviation
         total = 0.0;
         for( i = 0; i < RngResultIndex; ++i )
         {
-            RawRngResults[i] -= ( Eeprom.EepromData.DemoSettings.RngFeiFactor * Eeprom.EepromData.DemoSettings.RngFei / 1000 );
-            total            += RawRngResults[i];
-            squareDeviation  += RawRngResults[i] * RawRngResults[i];
+            RawRngResults[i] = RawRngResults[i] - ( Eeprom.EepromData.DemoSettings.RngFeiFactor * Eeprom.EepromData.DemoSettings.RngFei / 1000 );
         }
-        mean = total / RngResultIndex;
-        squareDeviation = sqrt( ( squareDeviation / RngResultIndex ) - ( mean * mean ) );
-        printf( ", Moy: %5.1f, Std: %6.3f", mean, squareDeviation );
 
-/*
- *  also use RSSI since chip V3 for filter ranging values
- */
-        total = 0.0;
-        // select measure with correct Z Score
-        for( i = 0; i < RngResultIndex; ++i )
+        for (int i = RngResultIndex - 1; i > 0; --i) 
         {
-            if( ( fabs( RawRngResults[i] - meanRaw ) / squareDeviationRaw ) <= ( double )Eeprom.EepromData.DemoSettings.RngZscoreMax )
+            for (int j = 0; j < i; ++j) 
             {
-                total += RawRngResults[i];
-                j++;
+                if (RawRngResults[j] > RawRngResults[j+1]) 
+                {
+                    int temp = RawRngResults[j];
+                    RawRngResults[j] = RawRngResults[j+1];
+                    RawRngResults[j+1] = temp;
+                }
             }
         }
-        if( j > 0 )
-        {
-            meanRaw = total / j;
-        }
-        else
-        {
-            meanRaw = 0.0;
-        }
-        Eeprom.EepromData.DemoSettings.RngRawDistance = meanRaw;
-        total = 0.0;
-        j = 0;
-        // select measure with correct Z Score
-        for( i = 0; i < RngResultIndex; ++i )
+        double median;
+        if ((RngResultIndex % 2) == 0) 
         {
-            if( ( fabs( RawRngResults[i] - mean ) / squareDeviation ) <= ( double )Eeprom.EepromData.DemoSettings.RngZscoreMax )
-            {
-                total += RawRngResults[i];
-                j++;
-            }
+            median = (RawRngResults[RngResultIndex/2] + RawRngResults[(RngResultIndex/2) - 1])/2.0;
+        } 
+        else 
+        {
+            median = RawRngResults[RngResultIndex/2];
         }
-        if( j > 0 )
-        {
-            mean = total / j;
-        }
-        else
-        {
-            mean = 0.0;
-        }
+
+        mean = 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) ;       
+        
         if( j < DEMO_RNG_CHANNELS_COUNT_MIN )
         {
             Eeprom.EepromData.DemoSettings.RngStatus = RNG_PER_ERROR;
@@ -1906,10 +1894,7 @@
         {
             Eeprom.EepromData.DemoSettings.RngStatus = RNG_VALID;
         }
-        if( mean <= 18.5 )
-        {
-            mean = exp( ( mean + 2.4917 ) / 7.2262 );
-        }
+
         if( mean < 0 )
         {
             Eeprom.EepromData.DemoSettings.RngDistance = 0.0;
--- a/Demo/DemoApplication.h	Wed Apr 19 14:21:05 2017 +0000
+++ b/Demo/DemoApplication.h	Thu May 11 15:42:05 2017 +0000
@@ -19,7 +19,7 @@
 /*!
  * \brief Used to display firmware version on TFT (Utilities menu)
  */
-#define FIRMWARE_VERSION    ( ( char* )"Firmware Version: 170331A" )
+#define FIRMWARE_VERSION    ( ( char* )"Firmware Version: 170511" )
 
 /*!
  * \brief Define range of central frequency [Hz]
@@ -69,8 +69,8 @@
 /*!
  * \brief Define min and max ranging channels count
  */
-#define DEMO_RNG_CHANNELS_COUNT_MAX 90
-#define DEMO_RNG_CHANNELS_COUNT_MIN 10
+const uint16_t DEMO_RNG_CHANNELS_COUNT_MAX = 255;
+const uint16_t DEMO_RNG_CHANNELS_COUNT_MIN = 10;
 
 /*!
  * \brief Define min and max Z Score for ranging filtered results
@@ -171,7 +171,7 @@
     double RngFeiFactor;         // Ranging frequency correction factor
     uint16_t RngReqDelay;        // Time between ranging request
     uint16_t RngCalib;           // Ranging Calibration
-    uint8_t RngZscoreMax;        // Max Zscore for ranging value ( ! *10 ! )
+    uint8_t RFU;                 // -------------------------
     int8_t RssiValue;            // Demo Rssi Value
     int8_t SnrValue;             // Demo Snr Value (only for LORA mod. type)
 }DemoSettings_t;
--- a/Demo/SX1280Lib.lib	Wed Apr 19 14:21:05 2017 +0000
+++ b/Demo/SX1280Lib.lib	Thu May 11 15:42:05 2017 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/teams/Semtech/code/SX1280Lib/#6cabb9538041
+https://developer.mbed.org/teams/Semtech/code/SX1280Lib/#abf14b677777
--- a/Display/Menu.cpp	Wed Apr 19 14:21:05 2017 +0000
+++ b/Display/Menu.cpp	Thu May 11 15:42:05 2017 +0000
@@ -962,7 +962,7 @@
                 if( graphObjectTouched == BTN1_BORDER )
                 {
                     Eeprom.EepromData.DemoSettings.RngRequestCount += 5;
-                    if( Eeprom.EepromData.DemoSettings.RngRequestCount > DEMO_RNG_CHANNELS_COUNT_MAX )
+                    if( Eeprom.EepromData.DemoSettings.RngRequestCount >= DEMO_RNG_CHANNELS_COUNT_MAX )
                     {
                         Eeprom.EepromData.DemoSettings.RngRequestCount = DEMO_RNG_CHANNELS_COUNT_MIN;
                     }
@@ -970,15 +970,6 @@
                 }
                 else if( graphObjectTouched == BTN2_BORDER )
                 {
-                    Eeprom.EepromData.DemoSettings.RngZscoreMax += 1;
-                    if( Eeprom.EepromData.DemoSettings.RngZscoreMax > DEMO_RNG_ZSCORE_MAX )
-                    {
-                        Eeprom.EepromData.DemoSettings.RngZscoreMax = DEMO_RNG_ZSCORE_MIN;
-                    }
-                    ButtonChangeText( BTN2_BORDER, NULL, ( uint8_t* )GetRangingZscore( ) );
-                }
-                else if( graphObjectTouched == BTN3_BORDER )
-                {
                     switch( Eeprom.EepromData.DemoSettings.RngAddress )
                     {
                         case DEMO_RNG_ADDR_1:
@@ -1001,9 +992,9 @@
                             Eeprom.EepromData.DemoSettings.RngAddress = DEMO_RNG_ADDR_1;
                             break;
                     }
-                    ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetRangingAddress( ) );
+                    ButtonChangeText( BTN2_BORDER, NULL, ( uint8_t* )GetRangingAddress( ) );
                 }
-                else if( graphObjectTouched == BTN4_BORDER )
+                else if( graphObjectTouched == BTN3_BORDER )
                 {
                     switch( Eeprom.EepromData.DemoSettings.RngAntenna )
                     {
@@ -1019,16 +1010,16 @@
                             Eeprom.EepromData.DemoSettings.RngAntenna = DEMO_RNG_ANT_1;
                             break;
                     }
-                    ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetRangingAntenna( ) );
+                    ButtonChangeText( BTN3_BORDER, NULL, ( uint8_t* )GetRangingAntenna( ) );
                 }
-                else if( graphObjectTouched == BTN5_BORDER )
+                else if( graphObjectTouched == BTN4_BORDER )
                 {
                     Eeprom.EepromData.DemoSettings.RngUnit++;
                     if( Eeprom.EepromData.DemoSettings.RngUnit > DEMO_RNG_UNIT_SEL_MI )
                     {
                         Eeprom.EepromData.DemoSettings.RngUnit = DEMO_RNG_UNIT_SEL_M;
                     }
-                    ButtonChangeText( BTN5_BORDER, NULL, ( uint8_t* )GetRangingUnit( ) );
+                    ButtonChangeText( BTN4_BORDER, NULL, ( uint8_t* )GetRangingUnit( ) );
                 }
                 else if( graphObjectTouched == BTN7_BORDER )
                 {
@@ -1674,7 +1665,7 @@
                 DrawText( LINE6_COL0_TEXT, ( uint8_t* )"Packet   :", ( uint8_t* )GetMenuDemoNumSentPacket( ), NULL );
                 DrawText( LINE7_COL0_TEXT, ( uint8_t* )"FEI [Hz] :", ( uint8_t* )GetFrequencyError( ), NULL );
                 DrawText( LINE8_COL0_TEXT, ( uint8_t* )"Channel  :", ( uint8_t* )GetRngChannelsOk( ), NULL );
-                DrawText( LINE9_COL0_TEXT, ( uint8_t* )"Zscore N :", ( uint8_t* )"     0", NULL );
+
                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"    EXIT", NULL );
                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )"   START", NULL );
                 DrawActiveButton( BTN9_BORDER, ( uint8_t* )"  SETTINGS", NULL );
@@ -1776,10 +1767,9 @@
                 DrawText( TITLE_TEXT, ( uint8_t* )"    Settings : Ranging", NULL, NULL );
 
                 DrawActiveButton( BTN1_BORDER, ( uint8_t* )"Request:", ( uint8_t* )GetRangingRequestCount( ) );
-                DrawActiveButton( BTN2_BORDER, ( uint8_t* )"Z score:", ( uint8_t* )GetRangingZscore( ) );
-                DrawActiveButton( BTN3_BORDER, ( uint8_t* )"Address:", ( uint8_t* )GetRangingAddress( ) );
-                DrawActiveButton( BTN4_BORDER, ( uint8_t* )"Antenna:", ( uint8_t* )GetRangingAntenna( ) );
-                DrawActiveButton( BTN5_BORDER, ( uint8_t* )"Unit:", ( uint8_t* )GetRangingUnit( ) );
+                DrawActiveButton( BTN2_BORDER, ( uint8_t* )"Address:", ( uint8_t* )GetRangingAddress( ) );
+                DrawActiveButton( BTN3_BORDER, ( uint8_t* )"Antenna:", ( uint8_t* )GetRangingAntenna( ) );
+                DrawActiveButton( BTN4_BORDER, ( uint8_t* )"Unit:", ( uint8_t* )GetRangingUnit( ) );
                 DrawActiveButton( BTN7_BORDER, ( uint8_t* )"   CANCEL", NULL );
                 DrawActiveButton( BTN8_BORDER, ( uint8_t* )" OK & SAVE", NULL );
             }
@@ -2407,7 +2397,7 @@
     {
         Eeprom.EepromData.DemoSettings.CntPacketRxOK /= 2;
     }
-    sprintf( StringText2, " %02d/%02d", Eeprom.EepromData.DemoSettings.CntPacketRxOK, Eeprom.EepromData.DemoSettings.RngRequestCount );
+    sprintf( StringText2, "%03d/%03d", Eeprom.EepromData.DemoSettings.CntPacketRxOK, Eeprom.EepromData.DemoSettings.RngRequestCount );
     return StringText2;
 }
 
@@ -2417,12 +2407,6 @@
     return StringText2;
 }
 
-char* GetRangingZscore( void )
-{
-    sprintf( StringText2, "%d", Eeprom.EepromData.DemoSettings.RngZscoreMax );
-    return StringText2;
-}
-
 char* GetRangingAddress( void )
 {
     sprintf( StringText2, "0x%08x", Eeprom.EepromData.DemoSettings.RngAddress );
--- a/Display/Menu.h	Wed Apr 19 14:21:05 2017 +0000
+++ b/Display/Menu.h	Thu May 11 15:42:05 2017 +0000
@@ -310,13 +310,6 @@
 char* GetRangingRequestCount( void );
 
 /*!
- * \brief Return text with current Ranging Max Z Score Value.
- *
- * \retval      text          Pointer on text to display
- */
-char* GetRangingZscore( void );
-
-/*!
  * \brief Return text with current Ranging Address Value.
  *
  * \retval      text          Pointer on text to display
--- a/Peripherals/Eeprom.cpp	Wed Apr 19 14:21:05 2017 +0000
+++ b/Peripherals/Eeprom.cpp	Thu May 11 15:42:05 2017 +0000
@@ -90,7 +90,7 @@
             Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength      =                                  Eeprom.EepromData.DemoSettings.PacketParam1;
             Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType          = ( RadioLoRaPacketLengthsModes_t )Eeprom.EepromData.DemoSettings.PacketParam2;
             Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength       =                                  Eeprom.EepromData.DemoSettings.PacketParam3;
-            Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode             = ( RadioLoRaCrcModes_t )          Eeprom.EepromData.DemoSettings.PacketParam4;
+            Eeprom.EepromData.PacketParams.Params.LoRa.Crc                 = ( RadioLoRaCrcModes_t )          Eeprom.EepromData.DemoSettings.PacketParam4;
             Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ            = ( RadioLoRaIQModes_t )           Eeprom.EepromData.DemoSettings.PacketParam5;
 
             memcpy( Eeprom.Buffer + MOD_LOR_SPREADF_EEPROM_ADDR,      &( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor ), 1 );
@@ -99,7 +99,7 @@
             memcpy( Eeprom.Buffer + PAK_LOR_PREAMBLE_LEN_EEPROM_ADDR, &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ),      1 );
             memcpy( Eeprom.Buffer + PAK_LOR_HEADERTYPE_EEPROM_ADDR,   &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ),          1 );
             memcpy( Eeprom.Buffer + PAK_LOR_PL_LEN_EEPROM_ADDR,       &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ),       1 );
-            memcpy( Eeprom.Buffer + PAK_LOR_CRC_MODE_EEPROM_ADDR,     &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ),             1 );
+            memcpy( Eeprom.Buffer + PAK_LOR_CRC_MODE_EEPROM_ADDR,     &( Eeprom.EepromData.PacketParams.Params.LoRa.Crc ),                 1 );
             memcpy( Eeprom.Buffer + PAK_LOR_IQ_INV_EEPROM_ADDR,       &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ),            1 );
             printf("Saved RADIO_LORA_PARAMS\n\r");
             break;
@@ -116,7 +116,6 @@
 
             memcpy( Eeprom.Buffer + APP_RNG_REQ_COUNT_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.RngRequestCount ), 1 );
             memcpy( Eeprom.Buffer + APP_RNG_FULLSCALE_EEPROM_ADDR, &( Eeprom.EepromData.DemoSettings.RngFullScale ),    2 );
-            memcpy( Eeprom.Buffer + APP_RNG_ZSCORE_EEPROM_ADDR,    &( Eeprom.EepromData.DemoSettings.RngZscoreMax ),    1 );
             memcpy( Eeprom.Buffer + APP_RNG_ADDR_EEPROM_ADDR,      &( Eeprom.EepromData.DemoSettings.RngAddress ),      4 );
             memcpy( Eeprom.Buffer + APP_RNG_ANT_EEPROM_ADDR,       &( Eeprom.EepromData.DemoSettings.RngAntenna ),      1 );
             memcpy( Eeprom.Buffer + APP_RNG_UNIT_EEPROM_ADDR,      &( Eeprom.EepromData.DemoSettings.RngUnit ),         1 );
@@ -251,7 +250,7 @@
     memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_LOR_PREAMBLE_LEN_EEPROM_ADDR, 1 );
     memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ),     Eeprom.Buffer + PAK_LOR_HEADERTYPE_EEPROM_ADDR,   1 );
     memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ),  Eeprom.Buffer + PAK_LOR_PL_LEN_EEPROM_ADDR,       1 );
-    memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ),        Eeprom.Buffer + PAK_LOR_CRC_MODE_EEPROM_ADDR,     1 );
+    memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.Crc ),            Eeprom.Buffer + PAK_LOR_CRC_MODE_EEPROM_ADDR,     1 );
     memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ),       Eeprom.Buffer + PAK_LOR_IQ_INV_EEPROM_ADDR,       1 );
     memcpy( &( Eeprom.EepromData.PacketParams.Params.Flrc.PreambleLength ), Eeprom.Buffer + PAK_FLR_PREAMBLE_LEN_EEPROM_ADDR, 1 );
     memcpy( &( Eeprom.EepromData.PacketParams.Params.Flrc.SyncWordLength ), Eeprom.Buffer + PAK_FLR_SYNC_LEN_EEPROM_ADDR,     1 );
@@ -260,14 +259,13 @@
     memcpy( &( Eeprom.EepromData.PacketParams.Params.Flrc.PayloadLength ),  Eeprom.Buffer + PAK_FLR_PL_LEN_EEPROM_ADDR,       1 );
     memcpy( &( Eeprom.EepromData.PacketParams.Params.Flrc.CrcLength ),      Eeprom.Buffer + PAK_FLR_CRC_LEN_EEPROM_ADDR,      1 );
     memcpy( &( Eeprom.EepromData.PacketParams.Params.Flrc.Whitening ),      Eeprom.Buffer + PAK_FLR_WHITENING_EEPROM_ADDR,    1 );
-    memcpy( &( Eeprom.EepromData.PacketParams.Params.Ble.BlePacketType ),   Eeprom.Buffer + PAK_BLE_PAK_TYPE_EEPROM_ADDR,     1 );
+    memcpy( &( Eeprom.EepromData.PacketParams.Params.Ble.BleTestPayload ),  Eeprom.Buffer + PAK_BLE_PAK_TYPE_EEPROM_ADDR,     1 );
     memcpy( &( Eeprom.EepromData.PacketParams.Params.Ble.ConnectionState ), Eeprom.Buffer + PAK_BLE_CON_STATE_EEPROM_ADDR,    1 );
-    memcpy( &( Eeprom.EepromData.PacketParams.Params.Ble.CrcField ),        Eeprom.Buffer + PAK_BLE_CRC_FIELD_EEPROM_ADDR,    1 );
+    memcpy( &( Eeprom.EepromData.PacketParams.Params.Ble.CrcLength ),       Eeprom.Buffer + PAK_BLE_CRC_FIELD_EEPROM_ADDR,    1 );
     memcpy( &( Eeprom.EepromData.PacketParams.Params.Ble.Whitening ),       Eeprom.Buffer + PAK_BLE_WHITENING_EEPROM_ADDR,    1 );
 
     memcpy( &( Eeprom.EepromData.DemoSettings.RngRequestCount ), Eeprom.Buffer + APP_RNG_REQ_COUNT_EEPROM_ADDR, 1 );
     memcpy( &( Eeprom.EepromData.DemoSettings.RngFullScale ),    Eeprom.Buffer + APP_RNG_FULLSCALE_EEPROM_ADDR, 2 );
-    memcpy( &( Eeprom.EepromData.DemoSettings.RngZscoreMax ),    Eeprom.Buffer + APP_RNG_ZSCORE_EEPROM_ADDR,    1 );
     memcpy( &( Eeprom.EepromData.DemoSettings.RngAddress ),      Eeprom.Buffer + APP_RNG_ADDR_EEPROM_ADDR,      4 );
     memcpy( &( Eeprom.EepromData.DemoSettings.RngAntenna ),      Eeprom.Buffer + APP_RNG_ANT_EEPROM_ADDR,       1 );
     memcpy( &( Eeprom.EepromData.DemoSettings.RngUnit ),         Eeprom.Buffer + APP_RNG_UNIT_EEPROM_ADDR,      1 );
@@ -284,7 +282,7 @@
         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ),      Eeprom.Buffer + PAK_LOR_PREAMBLE_LEN_EEPROM_ADDR, 1 );
         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ),          Eeprom.Buffer + PAK_LOR_HEADERTYPE_EEPROM_ADDR,   1 );
         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ),       Eeprom.Buffer + PAK_LOR_PL_LEN_EEPROM_ADDR,       1 );
-        memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ),             Eeprom.Buffer + PAK_LOR_CRC_MODE_EEPROM_ADDR,     1 );
+        memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.Crc ),                 Eeprom.Buffer + PAK_LOR_CRC_MODE_EEPROM_ADDR,     1 );
         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ),            Eeprom.Buffer + PAK_LOR_IQ_INV_EEPROM_ADDR,       1 );
 
         Eeprom.EepromData.ModulationParams.PacketType   = PACKET_TYPE_LORA;
@@ -296,7 +294,7 @@
         Eeprom.EepromData.DemoSettings.PacketParam1 = Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength;
         Eeprom.EepromData.DemoSettings.PacketParam2 = Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType;
         Eeprom.EepromData.DemoSettings.PacketParam3 = Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength;
-        Eeprom.EepromData.DemoSettings.PacketParam4 = Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode;
+        Eeprom.EepromData.DemoSettings.PacketParam4 = Eeprom.EepromData.PacketParams.Params.LoRa.Crc;
         Eeprom.EepromData.DemoSettings.PacketParam5 = Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ;
         Eeprom.EepromData.DemoSettings.PacketParam6 = 0x00;
         Eeprom.EepromData.DemoSettings.PacketParam7 = 0x00;
@@ -310,11 +308,10 @@
         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength ),      Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType ),          Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR,   1 );
         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength ),       Eeprom.Buffer + PAK_RNG_PL_LEN_EEPROM_ADDR,       1 );
-        memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode ),             Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
+        memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.Crc ),                 Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR,     1 );
         memcpy( &( Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ ),            Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR,       1 );
         memcpy( &( Eeprom.EepromData.DemoSettings.RngRequestCount ),                 Eeprom.Buffer + APP_RNG_REQ_COUNT_EEPROM_ADDR,    1 );
         memcpy( &( Eeprom.EepromData.DemoSettings.RngFullScale ),                    Eeprom.Buffer + APP_RNG_FULLSCALE_EEPROM_ADDR,    2 );
-        memcpy( &( Eeprom.EepromData.DemoSettings.RngZscoreMax ),                    Eeprom.Buffer + APP_RNG_ZSCORE_EEPROM_ADDR,       1 );
         memcpy( &( Eeprom.EepromData.DemoSettings.RngAddress ),                      Eeprom.Buffer + APP_RNG_ADDR_EEPROM_ADDR,         4 );
         memcpy( &( Eeprom.EepromData.DemoSettings.RngAntenna ),                      Eeprom.Buffer + APP_RNG_ANT_EEPROM_ADDR,          1 );
         memcpy( &( Eeprom.EepromData.DemoSettings.RngUnit ),                         Eeprom.Buffer + APP_RNG_UNIT_EEPROM_ADDR,         1 );
@@ -328,7 +325,7 @@
         Eeprom.EepromData.DemoSettings.PacketParam1 = Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength;
         Eeprom.EepromData.DemoSettings.PacketParam2 = Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType;
         Eeprom.EepromData.DemoSettings.PacketParam3 = Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength;
-        Eeprom.EepromData.DemoSettings.PacketParam4 = Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode;
+        Eeprom.EepromData.DemoSettings.PacketParam4 = Eeprom.EepromData.PacketParams.Params.LoRa.Crc;
         Eeprom.EepromData.DemoSettings.PacketParam5 = Eeprom.EepromData.PacketParams.Params.LoRa.InvertIQ;
         Eeprom.EepromData.DemoSettings.PacketParam6 = 0x00;
         Eeprom.EepromData.DemoSettings.PacketParam7 = 0x00;
@@ -410,8 +407,7 @@
     Eeprom.EepromData.DemoSettings.PacketParam3    = 10; // PayloadLength
     Eeprom.EepromData.DemoSettings.PacketParam4    = LORA_CRC_ON;
     Eeprom.EepromData.DemoSettings.PacketParam5    = LORA_IQ_NORMAL;
-    Eeprom.EepromData.DemoSettings.RngRequestCount = 40;
-    Eeprom.EepromData.DemoSettings.RngZscoreMax    = 1;
+    Eeprom.EepromData.DemoSettings.RngRequestCount = 60;
     Eeprom.EepromData.DemoSettings.RngAntenna      = DEMO_RNG_ANT_1;
 
     EepromSaveSettings( RADIO_RANGING_PARAMS );
@@ -437,9 +433,8 @@
     Eeprom.EepromData.DemoSettings.PacketParam3    = 10; // PayloadLength
     Eeprom.EepromData.DemoSettings.PacketParam4    = LORA_CRC_ON;
     Eeprom.EepromData.DemoSettings.PacketParam5    = LORA_IQ_NORMAL;
-    Eeprom.EepromData.DemoSettings.RngRequestCount = 40;
+    Eeprom.EepromData.DemoSettings.RngRequestCount = 60;
     Eeprom.EepromData.DemoSettings.RngFullScale    = 30;
-    Eeprom.EepromData.DemoSettings.RngZscoreMax    = 1;
     Eeprom.EepromData.DemoSettings.RngAddress      = DEMO_RNG_ADDR_1;
     Eeprom.EepromData.DemoSettings.RngAntenna      = DEMO_RNG_ANT_1;
     Eeprom.EepromData.DemoSettings.RngUnit         = DEMO_RNG_UNIT_SEL_M;
--- a/Peripherals/Eeprom.h	Wed Apr 19 14:21:05 2017 +0000
+++ b/Peripherals/Eeprom.h	Thu May 11 15:42:05 2017 +0000
@@ -40,7 +40,7 @@
 #define APP_RADIO_POWER_MODE_EEPROM_ADDR    37  // RadioRegulatorMode_t
 #define APP_RNG_REQ_COUNT_EEPROM_ADDR       38  // uint8_t
 #define APP_RNG_FULLSCALE_EEPROM_ADDR       39  // uint16_t
-#define APP_RNG_ZSCORE_EEPROM_ADDR          41
+#define APP_RNG_RFU_EEPROM_ADDR             41
 #define APP_RNG_UNIT_EEPROM_ADDR            42  // ranging distance unit
 #define APP_RNG_ADDR_EEPROM_ADDR            43  // uint32_t
 #define APP_RNG_ANT_EEPROM_ADDR             47  // uint8_t RngAntenna