original

Dependencies:   mbed SX126xLib

Files at this revision

API Documentation at this revision

Comitter:
wavespectrum
Date:
Mon Feb 15 21:03:43 2021 +0000
Parent:
7:274ca9fe1080
Commit message:
prep

Changed in this revision

CwTransmitter/CwTransmitter.cpp Show annotated file Show diff for this revision Revisions of this file
CwTransmitter/CwTransmitter.h Show annotated file Show diff for this revision Revisions of this file
CwTransmitter/SX126xLib.lib Show annotated file Show diff for this revision Revisions of this file
Demo/DemoApplication.cpp Show diff for this revision Revisions of this file
Demo/DemoApplication.h Show diff for this revision Revisions of this file
Demo/SX126xLib.lib 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
Peripherals/Timers.cpp Show diff for this revision Revisions of this file
Peripherals/Timers.h Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 274ca9fe1080 -r cdb739697925 CwTransmitter/CwTransmitter.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CwTransmitter/CwTransmitter.cpp	Mon Feb 15 21:03:43 2021 +0000
@@ -0,0 +1,305 @@
+#include "mbed.h"
+#include "radio.h"
+#include "sx126x-hal.h"
+#include "Eeprom.h"
+#include "CwTransmitter.h"
+
+/*!
+ * \brief Defines the local payload buffer size
+ */
+#define BUFFER_SIZE                     255
+
+/*!
+ * \brief Defines the size of the token defining message type in the payload
+ *        cf. above.
+ */
+#define PER_SIZE                        3
+
+/*!
+ * \brief Define time used in PingPong demo to synch with cycle
+ * RX_TIMEOUT_MARGIN is the free time between each cycle (time reserve)
+ */
+#define RX_TIMEOUT_MARGIN               150  // ms
+#define RX_TX_TRANSITION_WAIT           5    // ms
+
+
+/*!
+ * \brief Define the possible message type for the Ping-Pong and PER apps
+ */
+
+/*!
+ * \brief Buffer and its size
+ */
+uint8_t BufferSize = BUFFER_SIZE;
+uint8_t Buffer[BUFFER_SIZE];
+
+/*!
+ * \brief Function to be executed on Radio Tx Done event
+ */
+
+
+
+/*!
+ * \brief Function executed on Radio Rx Error event
+ */
+void OnRxError( IrqErrorCode_t );
+
+/*!
+ * \brief Function executed on Radio CAD Done event
+ */
+void OnCadDone( bool channelActivityDetected );
+
+/*!
+ * \brief All the callbacks are stored in a structure
+ */
+RadioCallbacks_t RadioEvents =
+{
+};
+
+// SPI
+// mosi, miso, sclk, nss, dio0, dio1, dio2, dio3, rst, freqSel, deviceSel, antSwPower, callbacks...
+SX126xHal Radio( D11, D12, D13, D7, D3, D5, NC, NC, A0, A1, A2, D8, &RadioEvents );
+
+/*!
+ * \brief Tx LED toggling on transmition success
+ */
+DigitalOut TX_LED( A4 );
+
+/*!
+ * \brief Rx LED toggling on reception success
+ */
+DigitalOut RX_LED( A5 );
+
+/*!
+ * \brief Mask of IRQs
+ */
+uint16_t IrqMask = 0x0000;
+
+/*!
+ * \brief Locals parameters and status for radio API
+ * NEED TO BE OPTIMIZED, COPY OF STUCTURE ALREADY EXISTING
+ */
+PacketParams_t PacketParams;
+PacketStatus_t PacketStatus;
+ModulationParams_t ModulationParams;
+
+/*!
+ * \brief Ticker for master to synch Tx frames. Flags for PER and PingPong demo
+ * for Synch TX in cycle.
+ */
+Ticker SendNextPacket;
+static bool SendNext = false;
+
+/*!
+ * \brief Hold last Rx packet number to compute PER in PER and PingPong demo
+ */
+static uint32_t PacketRxSequence = 0;
+static uint32_t PacketRxSequencePrev = 0;
+
+void LedBlink( void );
+void InitializeDemoParameters( uint8_t modulation );
+uint16_t GetTimeOnAir( uint8_t modulation );
+void SendNextPacketEvent( void );
+
+// **************************     RF Test Demo    ******************************
+// *                                                                           *
+// *                                                                           *
+// *                                                                           *
+// *****************************************************************************
+
+uint8_t DemoStandby( void )
+{       
+        Radio.SetStandby( STDBY_XOSC );
+        return 0;        
+}
+
+uint8_t PrepDemoTxCw( uint32_t rf_frequency,int8_t power, RadioRampTimes_t rampTime )
+{
+    
+    RX_LED = 1;
+    TX_LED = 1;
+
+    Radio.Init( );
+
+    // Can also be set in LDO mode but consume more power
+    Radio.SetRegulatorMode( ( RadioRegulatorMode_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
+
+    memset( &Buffer, 0x00, BufferSize );
+    
+    RX_LED = 0;
+    TX_LED = 0;
+
+    PacketRxSequence = 0;
+    PacketRxSequencePrev = 0;
+    Eeprom.EepromData.DemoSettings.CntPacketTx    = 0;
+    Eeprom.EepromData.DemoSettings.CntPacketRxOK  = 0;
+    Eeprom.EepromData.DemoSettings.CntPacketRxKO  = 0;
+    Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
+    
+    
+    if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
+    {
+        return 0;
+    }
+    InitializeDemoParameters( PACKET_TYPE_LORA );
+    TX_LED = 0;
+    RX_LED = 0;
+    uint8_t value = Radio.ReadReg( 0x08d8 );
+    Radio.WriteReg( 0x08d8, value | 0x1E );
+    Radio.SetRegulatorMode( ( RadioRegulatorMode_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
+    Radio.SetRfFrequency( rf_frequency );
+    Radio.SetTxParams( power, rampTime );
+    Radio.SetStandby( STDBY_XOSC );
+    return 0;
+}
+
+uint8_t RunDemoTxCw( void )
+{
+    Radio.SetTxContinuousWave( );
+    return 0;
+}
+
+
+void ComputePerPayload( uint8_t *buffer, uint8_t bufferSize )
+{
+    uint32_t i = 0;
+
+    Eeprom.EepromData.DemoSettings.CntPacketRxOK++;
+    PacketRxSequence = ( ( uint32_t )buffer[1] << 24 ) | \
+                       ( ( uint32_t )buffer[2] << 16 ) | \
+                       ( ( uint32_t )buffer[3] << 8 )  | \
+                                     buffer[4];
+
+    if( ( PacketRxSequence <= PacketRxSequencePrev ) || \
+        ( PacketRxSequencePrev == 0xFFFFFFFF ) )
+    {
+        // Sequence went back => resynchronization
+        // Don't count missed packets this time
+        i = 0;
+    }
+    else
+    {
+        // Determine number of missed packets
+        i = PacketRxSequence - PacketRxSequencePrev - 1;
+    }
+    // Be ready for the next
+    PacketRxSequencePrev = PacketRxSequence;
+    // increment 'missed' counter for the RX session
+    Eeprom.EepromData.DemoSettings.CntPacketRxKO += i;
+    Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
+}
+
+
+uint8_t GetConnectedDevice( void )
+{
+    return( Radio.GetDeviceType( ) );
+}
+
+uint8_t GetMatchingFrequency( void )
+{
+    return( Radio.GetFreqSelect( ) );
+}
+
+
+void InitializeDemoParameters( uint8_t modulation ) 
+{
+    Radio.SetStandby( STDBY_RC );
+
+    Radio.SetRegulatorMode( ( RadioRegulatorMode_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
+
+    printf("> InitializeDemoParameters\n\r");
+    if( modulation == PACKET_TYPE_LORA )
+    {
+        printf("set param LORA for demo\n\r");
+        ModulationParams.PacketType = PACKET_TYPE_LORA;
+        PacketParams.PacketType     = PACKET_TYPE_LORA;
+
+        ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t ) Eeprom.EepromData.DemoSettings.ModulationParam1;
+        ModulationParams.Params.LoRa.Bandwidth       = ( RadioLoRaBandwidths_t )       Eeprom.EepromData.DemoSettings.ModulationParam2;
+        ModulationParams.Params.LoRa.CodingRate      = ( RadioLoRaCodingRates_t )      Eeprom.EepromData.DemoSettings.ModulationParam3;
+
+        PacketParams.Params.LoRa.PreambleLength      =                                 Eeprom.EepromData.DemoSettings.PacketParam1;
+        PacketParams.Params.LoRa.HeaderType          = ( RadioLoRaPacketLengthsMode_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.InvertIQ            = ( RadioLoRaIQModes_t )          Eeprom.EepromData.DemoSettings.PacketParam5;
+
+        Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength;
+        
+        if( ( ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF6 ) || ( ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF5 ) )
+        {
+            if( PacketParams.Params.LoRa.PreambleLength < 12 )
+            {
+                PacketParams.Params.LoRa.PreambleLength = 12;
+            }
+        }
+    }
+    else// if( modulation == PACKET_TYPE_GFSK )
+    {
+        printf("set param GFSK for demo\n\r");
+        ModulationParams.PacketType = PACKET_TYPE_GFSK;
+        PacketParams.PacketType     = PACKET_TYPE_GFSK;
+
+        ModulationParams.Params.Gfsk.BitRate           =                             Eeprom.EepromData.DemoSettings.ModulationParam1;
+        ModulationParams.Params.Gfsk.Fdev              =                             Eeprom.EepromData.DemoSettings.ModulationParam2;
+        ModulationParams.Params.Gfsk.ModulationShaping = ( RadioModShapings_t )      Eeprom.EepromData.DemoSettings.ModulationParam3;
+        ModulationParams.Params.Gfsk.Bandwidth         = ( RadioRxBandwidth_t )      Eeprom.EepromData.DemoSettings.ModulationParam4;
+        PacketParams.Params.Gfsk.PreambleLength        =                             Eeprom.EepromData.DemoSettings.PacketParam1;
+        PacketParams.Params.Gfsk.PreambleMinDetect     = ( RadioPreambleDetection_t )Eeprom.EepromData.DemoSettings.PacketParam2;
+        PacketParams.Params.Gfsk.SyncWordLength        =                             Eeprom.EepromData.DemoSettings.PacketParam3;
+        PacketParams.Params.Gfsk.AddrComp              = ( RadioAddressComp_t )      Eeprom.EepromData.DemoSettings.PacketParam4;
+        PacketParams.Params.Gfsk.HeaderType            = ( RadioPacketLengthModes_t )Eeprom.EepromData.DemoSettings.PacketParam5;
+        PacketParams.Params.Gfsk.PayloadLength         =                             Eeprom.EepromData.DemoSettings.PacketParam6;
+
+        PacketParams.Params.Gfsk.CrcLength             = ( RadioCrcTypes_t )         Eeprom.EepromData.DemoSettings.PacketParam7;
+        PacketParams.Params.Gfsk.DcFree                = ( RadioDcFree_t )           Eeprom.EepromData.DemoSettings.PacketParam8;
+
+        Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Gfsk.PayloadLength;
+    }
+
+    Radio.SetStandby( STDBY_RC );
+    Radio.ClearIrqStatus( IRQ_RADIO_ALL );
+    Radio.SetPacketType( ModulationParams.PacketType );
+    Radio.SetModulationParams( &ModulationParams );
+    Radio.SetPacketParams( &PacketParams );
+    Radio.SetBufferBaseAddresses( 0x00, 0x00 );
+    
+
+
+    // only used in GFSK
+    Radio.SetSyncWord( ( uint8_t[] ){ 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0 } );
+    Radio.SetWhiteningSeed( 0x01FF );
+
+    RX_LED = 0;
+    TX_LED = 0;
+}
+
+/*!
+ * \brief Callback of ticker PerSendNextPacket
+ */
+void SendNextPacketEvent( void )
+{
+    SendNext = true;
+}
+
+void LedBlink( void )
+{
+    if( ( TX_LED == 0 ) && ( RX_LED == 0 ) )
+    {
+        TX_LED = 1;
+    }
+    else if( ( TX_LED == 1 ) && ( RX_LED == 0 ) )
+    {
+        RX_LED = 1;
+    }
+    else if( ( TX_LED == 1 ) && ( RX_LED == 1 ) )
+    {
+        TX_LED = 0;
+    }
+    else
+    {
+        RX_LED = 0;
+    }
+}
+
+
diff -r 274ca9fe1080 -r cdb739697925 CwTransmitter/CwTransmitter.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CwTransmitter/CwTransmitter.h	Mon Feb 15 21:03:43 2021 +0000
@@ -0,0 +1,239 @@
+#ifndef DEMO_APPLICATION_H
+#define DEMO_APPLICATION_H
+#include "sx126x.h"
+
+/*!
+ * \brief Used to display firmware version on TFT (Utilities menu)
+ */
+#define FIRMWARE_VERSION    ( ( char* )"Firmware Version: 180706" )
+
+/*!
+ * \brief Define range of central frequency [Hz]
+ */
+#define DEMO_CENTRAL_FREQ_MIN       150000000UL
+#define DEMO_CENTRAL_FREQ_MAX       950000000UL
+
+/*!
+ * \brief Define 3 preset central frequencies [Hz]
+ */
+#define DEMO_CENTRAL_FREQ_PRESET1   169000000UL
+#define DEMO_CENTRAL_FREQ_PRESET2   280000000UL
+#define DEMO_CENTRAL_FREQ_PRESET3   434000000UL
+#define DEMO_CENTRAL_FREQ_PRESET4   490000000UL
+#define DEMO_CENTRAL_FREQ_PRESET5   783000000UL
+#define DEMO_CENTRAL_FREQ_PRESET6   868000000UL
+#define DEMO_CENTRAL_FREQ_PRESET7   915000000UL
+#define DEMO_CENTRAL_FREQ_PRESET8   930000000UL
+#define DEMO_CENTRAL_FREQ_PRESET9   510000000UL
+
+/*!
+ * \brief Define min and max Tx power [dBm]
+ */
+#define SX1261_POWER_TX_MIN           -17
+#define SX1261_POWER_TX_MAX           15
+
+#define SX1262_POWER_TX_MIN           -10
+#define SX1262_POWER_TX_MAX           22
+
+/*!
+ * \brief Define current demo mode
+ */
+enum DemoMode
+{
+    MASTER = 0,
+    SLAVE
+};
+
+/*!
+ * \brief Define GFSK bitrate
+ */
+typedef enum
+{
+    DEMO_BR_100         = 100,
+    DEMO_BR_600         = 600,
+    DEMO_BR_4800        = 4800,
+    DEMO_BR_9600        = 9600,
+    DEMO_BR_19200       = 19200,
+    DEMO_BR_57600       = 57600,
+    DEMO_BR_100000      = 100000,
+    DEMO_BR_250000      = 250000,
+}DemoBitrate_t;
+
+/*!
+ * \brief Define GFSK frequency deviation
+ */
+typedef enum
+{
+    DEMO_FDEV_5000      = 5000,
+    DEMO_FDEV_10000     = 10000,
+    DEMO_FDEV_25000     = 25000,
+    DEMO_FDEV_50000     = 50000,
+    DEMO_FDEV_75000     = 75000,
+    DEMO_FDEV_100000    = 100000,
+    DEMO_FDEV_150000    = 150000,
+}DemoFrequencyDev_t;
+
+/*!
+ * \brief List of states for demo state machine
+ */
+enum DemoInternalStates
+{
+    APP_IDLE = 0,               // nothing to do (or wait a radio interrupt)
+    SEND_PING_MSG,
+    SEND_PONG_MSG,
+    APP_RX,                     // Rx done
+    APP_RX_TIMEOUT,             // Rx timeout
+    APP_RX_ERROR,               // Rx error
+    APP_TX,                     // Tx done
+    APP_TX_TIMEOUT,             // Tx error
+    PER_TX_START,               // PER master
+    PER_RX_START,               // PER slave
+    CAD_DONE,                   // CAD Done
+    CAD_DONE_CHANNEL_DETECTED   // Channel Detected following a CAD
+};
+
+/*!
+ * \brief Demo Settings structure of Eeprom structure
+ */
+typedef struct
+{
+    uint8_t Entity;             // Master or Slave
+    uint8_t HoldDemo;           // Put demo in hold status
+    uint8_t BoostedRx;          // Use Boosted Rx if true
+    uint32_t Frequency;         // Demo frequency
+    uint8_t LastDeviceConnected;// Last Device Connected
+    int8_t TxPower;             // Demo Tx power
+    uint8_t RadioPowerMode;     // Radio Power Mode [0: LDO, 1:DC_DC]
+    uint8_t PayloadLength;      // Demo payload length
+    uint8_t ModulationType;     // Demo modulation type (LORA, GFSK)
+    uint32_t ModulationParam1;  // Demo Mod. Param1 (depend on modulation type)
+    uint32_t ModulationParam2;  // Demo Mod. Param2 (depend on modulation type)
+    uint8_t ModulationParam3;   // Demo Mod. Param3 (depend on modulation type)
+    uint8_t ModulationParam4;   // Demo Mod. Param4 (depend on modulation type)
+    uint16_t PacketParam1;      // Demo Pack. Param1 (depend on packet type)
+    uint8_t PacketParam2;       // Demo Pack. Param2 (depend on packet type)
+    uint8_t PacketParam3;       // Demo Pack. Param3 (depend on packet type)
+    uint8_t PacketParam4;       // Demo Pack. Param4 (depend on packet type)
+    uint8_t PacketParam5;       // Demo Pack. Param5 (depend on packet type)
+    uint8_t PacketParam6;       // Demo Pack. Param6 (depend on packet type)
+    uint8_t PacketParam7;       // Demo Pack. Param7 (depend on packet type)
+    uint8_t PacketParam8;       // Demo Pack. Param8 (depend on packet type)
+    uint32_t MaxNumPacket;      // Demo Max Num Packet for PingPong and PER
+    uint16_t InterPacketDelay;  // Demo Inter-Packet Delay for PingPong and PER
+    uint32_t CntPacketTx;       // Tx packet transmitted
+    uint32_t CntPacketRxOK;     // Rx packet received OK
+    uint32_t CntPacketRxOKSlave;// Rx packet received OK (slave side)
+    uint32_t CntPacketRxKO;     // Rx packet received KO
+    uint32_t CntPacketRxKOSlave;// Rx packet received KO (slave side)
+    uint16_t RxTimeOutCount;    // Rx packet received KO (by timeout)
+    int8_t RssiValue;           // Demo Rssi Value
+    int8_t SnrValue;            // Demo Snr Value (only for LR24 mod. type)
+    uint32_t FreqErrorEst;      // Estimation of the frequency error on the Rx side
+}DemoSettings_t;
+
+/*!
+ * \brief Define freq offset for config central freq in "Radio Config Freq" menu
+ */
+enum FreqBase
+{
+    FB1     = 1,            //   1 Hz
+    FB10    = 10,           //  10 Hz
+    FB100   = 100,          // 100 Hz
+    FB1K    = 1000,         //   1 kHz
+    FB10K   = 10000,        //  10 kHz
+    FB100K  = 100000,       // 100 kHz
+    FB1M    = 1000000,      //   1 MHz
+    FB10M   = 10000000      //  10 MHz
+};
+
+
+/*!
+ * \brief Simple Function which return the device connected.
+ *
+ * \retval      deviceConnected    device type connected
+ */
+uint8_t GetConnectedDevice( void );
+
+/*!
+ * \brief Simple Function which return the board matching frequency
+ *
+ * \retval      freq    1: 868 MHz   0: 915 MHz
+ */
+uint8_t GetMatchingFrequency( void );
+
+
+
+/*!
+ * \brief Run Demo in sleep mode.
+ *
+ * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
+ */
+uint8_t RunDemoSleepMode( void );
+
+/*!
+ * \brief Run Demo in standby RC mode.
+ *
+ * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
+ */
+uint8_t RunDemoStandbyRcMode( void );
+
+/*!
+ * \brief Run Demo in standby XOSC mode.
+ *
+ * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
+ */
+uint8_t RunDemoStandbyXoscMode( void );
+
+/*!
+ * \brief Run Demo Tx in continuous mode without modulation.
+ *
+ * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
+ */
+uint8_t PrepDemoTxCw( uint32_t rf_frequency,int8_t power, RadioRampTimes_t rampTime );
+uint8_t RunDemoTxCw( void );
+uint8_t DemoStandby( void );
+/*!
+ * \brief Run Demo Tx in continuous modulation.
+ *
+ * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
+ */
+uint8_t RunDemoTxContinuousModulation( void );
+
+/*!
+ * \brief Run Demo Rx in continuous mode.
+ *
+ * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
+ */
+uint8_t RunDemoRxContinuous( void );
+
+/*!
+ * \brief Run demo PingPong.
+ *
+ * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
+ */
+uint8_t RunDemoApplicationPingPong( void );
+
+/*!
+ * \brief Compute payload of Rx frame and update current counts and indicators.
+ *
+ * \param [in]  buffer        buffer with frame to compute
+ * \param [in]  buffersize    size of frame data in the buffer
+ */
+void ComputePingPongPayload( uint8_t *buffer, uint8_t bufferSize );
+
+/*!
+ * \brief Run demo PER.
+ *
+ * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
+ */
+uint8_t RunDemoApplicationPer( void );
+
+/*!
+ * \brief Compute payload of Rx frame and update current counts and indicators.
+ *
+ * \param [in]  buffer        buffer with frame to compute
+ * \param [in]  buffersize    size of frame data in the buffer
+ */
+void ComputePerPayload( uint8_t *buffer, uint8_t bufferSize );
+
+#endif // DEMO_APPLICATION_H
diff -r 274ca9fe1080 -r cdb739697925 CwTransmitter/SX126xLib.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CwTransmitter/SX126xLib.lib	Mon Feb 15 21:03:43 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/Semtech/code/SX126xLib/#1e2345700991
diff -r 274ca9fe1080 -r cdb739697925 Demo/DemoApplication.cpp
--- a/Demo/DemoApplication.cpp	Mon Feb 15 19:20:41 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,621 +0,0 @@
-/*
-  ______                              _
- / _____)             _              | |
-( (____  _____ ____ _| |_ _____  ____| |__
- \____ \| ___ |    (_   _) ___ |/ ___)  _ \
- _____) ) ____| | | || |_| ____( (___| | | |
-(______/|_____)_|_|_| \__)_____)\____)_| |_|
-    (C)2016 Semtech
-
-Description: PingPong, PER demo implementation.
-
-Maintainer: Gregory Cristian & Gilbert Menth
-*/
-
-#include "mbed.h"
-#include "radio.h"
-#include "sx126x-hal.h"
-#include "Eeprom.h"
-#include "DemoApplication.h"
-
-/*!
- * \brief Defines the local payload buffer size
- */
-#define BUFFER_SIZE                     255
-
-/*!
- * \brief Defines the size of the token defining message type in the payload
- *        cf. above.
- */
-#define PINGPONG_SIZE                   4
-#define PER_SIZE                        3
-
-/*!
- * \brief Define time used in PingPong demo to synch with cycle
- * RX_TIMEOUT_MARGIN is the free time between each cycle (time reserve)
- */
-#define RX_TIMEOUT_MARGIN               150  // ms
-#define RX_TX_TRANSITION_WAIT           5    // ms
-
-
-/*!
- * \brief Define the possible message type for the Ping-Pong and PER apps
- */
-
-/*!
- * \brief Buffer and its size
- */
-uint8_t BufferSize = BUFFER_SIZE;
-uint8_t Buffer[BUFFER_SIZE];
-
-/*!
- * \brief Function to be executed on Radio Tx Done event
- */
-void OnTxDone( void );
-
-/*!
- * \brief Function to be executed on Radio Rx Done event
- */
-void OnRxDone( void );
-
-/*!
- * \brief Function executed on Radio Tx Timeout event
- */
-void OnTxTimeout( void );
-
-/*!
- * \brief Function executed on Radio Rx Timeout event
- */
-void OnRxTimeout( void );
-
-/*!
- * \brief Function executed on Radio Rx Error event
- */
-void OnRxError( IrqErrorCode_t );
-
-/*!
- * \brief Function executed on Radio CAD Done event
- */
-void OnCadDone( bool channelActivityDetected );
-
-/*!
- * \brief All the callbacks are stored in a structure
- */
-RadioCallbacks_t RadioEvents =
-{
-    &OnTxDone,        // txDone
-    &OnRxDone,        // rxDone
-    NULL,             // rxPreambleDetect
-    NULL,             // rxSyncWordDone
-    NULL,             // rxHeaderDone
-    &OnTxTimeout,     // txTimeout
-    &OnRxTimeout,     // rxTimeout
-    &OnRxError,       // rxError
-    &OnCadDone,       // cadDone
-};
-
-// SPI
-// mosi, miso, sclk, nss, dio0, dio1, dio2, dio3, rst, freqSel, deviceSel, antSwPower, callbacks...
-SX126xHal Radio( D11, D12, D13, D7, D3, D5, NC, NC, A0, A1, A2, D8, &RadioEvents );
-
-/*!
- * \brief Tx LED toggling on transmition success
- */
-DigitalOut TX_LED( A4 );
-
-/*!
- * \brief Rx LED toggling on reception success
- */
-DigitalOut RX_LED( A5 );
-
-/*!
- * \brief Mask of IRQs
- */
-uint16_t IrqMask = 0x0000;
-
-/*!
- * \brief Locals parameters and status for radio API
- * NEED TO BE OPTIMIZED, COPY OF STUCTURE ALREADY EXISTING
- */
-PacketParams_t PacketParams;
-PacketStatus_t PacketStatus;
-ModulationParams_t ModulationParams;
-
-/*!
- * \brief Flag to indicate if the demo is already running
- */
-static bool DemoRunning = false;
-
-/*!
- * \brief Frequency Error (only LSB)
- */
-static double FreErrorLsb = 0.0;
-
-/*!
- * \brief Flag holding the current internal state of the demo application
- */
-static uint8_t DemoInternalState = APP_IDLE;
-
-/*!
- * \brief Ticker for master to synch Tx frames. Flags for PER and PingPong demo
- * for Synch TX in cycle.
- */
-Ticker SendNextPacket;
-static bool SendNext = false;
-
-/*!
- * \brief Hold last Rx packet number to compute PER in PER and PingPong demo
- */
-static uint32_t PacketRxSequence = 0;
-static uint32_t PacketRxSequencePrev = 0;
-
-void LedBlink( void );
-void InitializeDemoParameters( uint8_t modulation );
-uint16_t GetTimeOnAir( uint8_t modulation );
-void SendNextPacketEvent( void );
-
-// **************************     RF Test Demo    ******************************
-// *                                                                           *
-// *                                                                           *
-// *                                                                           *
-// *****************************************************************************
-
-uint8_t DemoStandby( void )
-{       
-        //Radio.SetRx(1);
-        Radio.SetStandby( STDBY_XOSC );
-        return 0;        
-}
-
-uint8_t PrepDemoTxCw( void )
-{
-    if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
-    {
-        return 0;
-    }
-
-
-    InitializeDemoParameters( PACKET_TYPE_LORA );
-    TX_LED = 0;
-    RX_LED = 0;
-    Radio.SetStandby( STDBY_RC );
-    Radio.SetRegulatorMode( ( RadioRegulatorMode_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
-    Radio.SetRfFrequency( Eeprom.EepromData.DemoSettings.Frequency );
-    Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_200_US );
-
-    return 0;
-}
-
-uint8_t RunDemoTxCw( void )
-{
-    Radio.SetTxContinuousWave( );
-    DemoRunning = true;
-    return 0;
-}
-
-
-void ComputePerPayload( uint8_t *buffer, uint8_t bufferSize )
-{
-    uint32_t i = 0;
-
-    Eeprom.EepromData.DemoSettings.CntPacketRxOK++;
-    PacketRxSequence = ( ( uint32_t )buffer[1] << 24 ) | \
-                       ( ( uint32_t )buffer[2] << 16 ) | \
-                       ( ( uint32_t )buffer[3] << 8 )  | \
-                                     buffer[4];
-
-    if( ( PacketRxSequence <= PacketRxSequencePrev ) || \
-        ( PacketRxSequencePrev == 0xFFFFFFFF ) )
-    {
-        // Sequence went back => resynchronization
-        // Don't count missed packets this time
-        i = 0;
-    }
-    else
-    {
-        // Determine number of missed packets
-        i = PacketRxSequence - PacketRxSequencePrev - 1;
-    }
-    // Be ready for the next
-    PacketRxSequencePrev = PacketRxSequence;
-    // increment 'missed' counter for the RX session
-    Eeprom.EepromData.DemoSettings.CntPacketRxKO += i;
-    Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
-}
-
-// ************************     Ping Pong Demo     *****************************
-// *                                                                           *
-// *                                                                           *
-// *                                                                           *
-// *****************************************************************************
-
-
-// ************************        Utils            ****************************
-// *                                                                           *
-// *                                                                           *
-// *                                                                           *
-// *****************************************************************************
-
-uint8_t GetConnectedDevice( void )
-{
-    return( Radio.GetDeviceType( ) );
-}
-
-uint8_t GetMatchingFrequency( void )
-{
-    return( Radio.GetFreqSelect( ) );
-}
-
-void InitDemoApplication( void )
-{
-    RX_LED = 1;
-    TX_LED = 1;
-
-    Radio.Init( );
-
-    // Can also be set in LDO mode but consume more power
-    Radio.SetRegulatorMode( ( RadioRegulatorMode_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
-    Radio.SetStandby( STDBY_RC );
-
-    memset( &Buffer, 0x00, BufferSize );
-    
-    RX_LED = 0;
-    TX_LED = 0;
-
-    PacketRxSequence = 0;
-    PacketRxSequencePrev = 0;
-    Eeprom.EepromData.DemoSettings.CntPacketTx    = 0;
-    Eeprom.EepromData.DemoSettings.CntPacketRxOK  = 0;
-    Eeprom.EepromData.DemoSettings.CntPacketRxKO  = 0;
-    Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
-}
-
-void StopDemoApplication( void )
-{
-    if( DemoRunning == true )
-    {
-        Radio.CheckDeviceReady( );
-
-        RX_LED = 0;
-        TX_LED = 0;
-        DemoRunning = false;
-        SendNext = false;
-        PacketRxSequence = 0;
-        PacketRxSequencePrev = 0;
-        Eeprom.EepromData.DemoSettings.CntPacketTx    = 0;
-        Eeprom.EepromData.DemoSettings.CntPacketRxOK  = 0;
-        Eeprom.EepromData.DemoSettings.CntPacketRxKO  = 0;
-        Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
-        
-        DemoInternalState = APP_IDLE;
-        Radio.SetStandby( STDBY_RC );
-        Radio.ClearIrqStatus( IRQ_RADIO_ALL );
-        SendNextPacket.detach( ); 
-    }
-}
-
-/*
- * Function still being implemented >>> To be completed 
- * WARNING: Computation is in float and his really slow
- * LongInterLeaving vs LegacyInterLeaving has no influence on TimeOnAir.
- */
-uint16_t GetTimeOnAir( uint8_t modulation )
-{
-    uint16_t result = 2000;
-    uint8_t LowDatarateOptimize = 0;
-
-    if( modulation == PACKET_TYPE_LORA )
-    {
-        volatile double loraBw = 0.0;
-        volatile double FreqErrorUnits = 0.0;
-        
-        switch( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth )
-        {
-            case LORA_BW_500:
-                loraBw = 500e3;
-                break;
-
-            case LORA_BW_250:
-                loraBw = 250e3;
-                break;
-
-            case LORA_BW_125:
-                loraBw = 125e3;
-                break;
-
-            case LORA_BW_062:
-                loraBw = 62e3;
-                break;
-
-            case LORA_BW_041:
-                loraBw = 41e3;
-                break;
-
-            case LORA_BW_031:
-                loraBw = 31e3;
-                break;
-
-            case LORA_BW_020:
-                loraBw = 20e3;
-                break;
-
-            case LORA_BW_015:
-                loraBw = 15e3;
-                break;
-
-            case LORA_BW_010:
-                loraBw = 10e3;
-                break;
-
-            case LORA_BW_007:
-                loraBw = 7e3;
-                break;
-
-            default:
-                loraBw = 7e3;
-                break;
-        }
-
-        /* Used to compute the freq Error */
-        FreqErrorUnits = FREQ_ERR;
-        FreErrorLsb = FreqErrorUnits * ( ( double )loraBw / 1000 ) / 500;
-
-        float ts = 1 << Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor; // time for one symbol in ms
-              ts = (float)ts / (float)loraBw;
-              ts = ts * 1000; // from seconds to miliseconds
-
-        float tPreamble = ( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength + 4.25 + ( ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor > 6 ) ? 2 : 0 )) * ts; // time of preamble
-
-        switch( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth )
-        {
-            case LORA_BW_500:
-                break;
-
-            case LORA_BW_250:
-                if( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF12 )
-                {
-                    LowDatarateOptimize = 1;
-                }
-                break;
-
-            case LORA_BW_125:
-                if( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >= LORA_SF11 )
-                {
-                    LowDatarateOptimize = 1;
-                }
-                break;
-
-            case LORA_BW_062:
-                if( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >= LORA_SF10 )
-                {
-                    LowDatarateOptimize = 1;
-                }
-                break;
-
-            case LORA_BW_041:
-            case LORA_BW_031:
-                if( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >= LORA_SF9 )
-                {
-                    LowDatarateOptimize = 1;
-                }
-                break;
-
-            case LORA_BW_020:
-            case LORA_BW_015:
-                if( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >= LORA_SF8 )
-                {
-                    LowDatarateOptimize = 1;
-                }
-                break;
-
-            case LORA_BW_010:
-            case LORA_BW_007:
-                if( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >= LORA_SF7 )
-                {
-                    LowDatarateOptimize = 1;
-                }
-                break;
-        }
-
-        float nData = ceil( ( float )( ( 8 * Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength +                                           \
-                       16 * ( ( Eeprom.EepromData.PacketParams.Params.LoRa.CrcMode == LORA_CRC_OFF ) ? 0 : 1 ) +                \
-                       ( ( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType == LORA_PACKET_VARIABLE_LENGTH ) ? 20 : 0 ) -  \
-                       ( 4 * Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor ) + 8 -                             \
-                       ( 8 *( ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor > 6 ) ? 1 : 0 ) ) ) / 4 ) );
-
-               nData = ceil( ( float )nData / ( ( float )( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor - \
-                              ( LowDatarateOptimize * 2 ) ) ) * ( ( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate % 4 ) + 4 ) );
-
-        float tPayload = nData * ts;
-
-        float tHeader = 8 * ts;
-        // Time on air [ms]
-        float ToA = ceil( tPreamble + tPayload + tHeader );
-
-        result = ( uint16_t )ToA + ( ( uint16_t )ToA >> 1 );   // Set some margin
-    }
-    else if( modulation == PACKET_TYPE_GFSK )
-    {
-        uint16_t packetBitCount = Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength;
-
-        packetBitCount += ( Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength + 1 );
-        packetBitCount += Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength + 3;
-        packetBitCount *= 8;
-        // 1500 = 1000 * 1.5 : 1000 for translate s in ms and 1.5 is some margin
-        result = ( uint16_t )( ceil( 1500 * ( float )packetBitCount / Eeprom.EepromData.ModulationParams.Params.Gfsk.BitRate ) );
-    }
-    return result;
-}
-
-void InitializeDemoParameters( uint8_t modulation )
-{
-    Radio.SetStandby( STDBY_RC );
-
-    Radio.SetRegulatorMode( ( RadioRegulatorMode_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
-
-    printf("> InitializeDemoParameters\n\r");
-    if( modulation == PACKET_TYPE_LORA )
-    {
-        printf("set param LORA for demo\n\r");
-        ModulationParams.PacketType = PACKET_TYPE_LORA;
-        PacketParams.PacketType     = PACKET_TYPE_LORA;
-
-        ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t ) Eeprom.EepromData.DemoSettings.ModulationParam1;
-        ModulationParams.Params.LoRa.Bandwidth       = ( RadioLoRaBandwidths_t )       Eeprom.EepromData.DemoSettings.ModulationParam2;
-        ModulationParams.Params.LoRa.CodingRate      = ( RadioLoRaCodingRates_t )      Eeprom.EepromData.DemoSettings.ModulationParam3;
-
-        PacketParams.Params.LoRa.PreambleLength      =                                 Eeprom.EepromData.DemoSettings.PacketParam1;
-        PacketParams.Params.LoRa.HeaderType          = ( RadioLoRaPacketLengthsMode_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.InvertIQ            = ( RadioLoRaIQModes_t )          Eeprom.EepromData.DemoSettings.PacketParam5;
-
-        Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength;
-        
-        if( ( ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF6 ) || ( ModulationParams.Params.LoRa.SpreadingFactor == LORA_SF5 ) )
-        {
-            if( PacketParams.Params.LoRa.PreambleLength < 12 )
-            {
-                PacketParams.Params.LoRa.PreambleLength = 12;
-            }
-        }
-    }
-    else// if( modulation == PACKET_TYPE_GFSK )
-    {
-        printf("set param GFSK for demo\n\r");
-        ModulationParams.PacketType = PACKET_TYPE_GFSK;
-        PacketParams.PacketType     = PACKET_TYPE_GFSK;
-
-        ModulationParams.Params.Gfsk.BitRate           =                             Eeprom.EepromData.DemoSettings.ModulationParam1;
-        ModulationParams.Params.Gfsk.Fdev              =                             Eeprom.EepromData.DemoSettings.ModulationParam2;
-        ModulationParams.Params.Gfsk.ModulationShaping = ( RadioModShapings_t )      Eeprom.EepromData.DemoSettings.ModulationParam3;
-        ModulationParams.Params.Gfsk.Bandwidth         = ( RadioRxBandwidth_t )      Eeprom.EepromData.DemoSettings.ModulationParam4;
-        PacketParams.Params.Gfsk.PreambleLength        =                             Eeprom.EepromData.DemoSettings.PacketParam1;
-        PacketParams.Params.Gfsk.PreambleMinDetect     = ( RadioPreambleDetection_t )Eeprom.EepromData.DemoSettings.PacketParam2;
-        PacketParams.Params.Gfsk.SyncWordLength        =                             Eeprom.EepromData.DemoSettings.PacketParam3;
-        PacketParams.Params.Gfsk.AddrComp              = ( RadioAddressComp_t )      Eeprom.EepromData.DemoSettings.PacketParam4;
-        PacketParams.Params.Gfsk.HeaderType            = ( RadioPacketLengthModes_t )Eeprom.EepromData.DemoSettings.PacketParam5;
-        PacketParams.Params.Gfsk.PayloadLength         =                             Eeprom.EepromData.DemoSettings.PacketParam6;
-
-        PacketParams.Params.Gfsk.CrcLength             = ( RadioCrcTypes_t )         Eeprom.EepromData.DemoSettings.PacketParam7;
-        PacketParams.Params.Gfsk.DcFree                = ( RadioDcFree_t )           Eeprom.EepromData.DemoSettings.PacketParam8;
-
-        Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Gfsk.PayloadLength;
-    }
-
-    Radio.SetStandby( STDBY_RC );
-    Radio.ClearIrqStatus( IRQ_RADIO_ALL );
-    Radio.SetPacketType( ModulationParams.PacketType );
-    Radio.SetModulationParams( &ModulationParams );
-    Radio.SetPacketParams( &PacketParams );
-
-    Radio.SetRfFrequency( Eeprom.EepromData.DemoSettings.Frequency );
-    Radio.SetBufferBaseAddresses( 0x00, 0x00 );
-    
-    
-    Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_200_US );
-
-    // only used in GFSK
-    Radio.SetSyncWord( ( uint8_t[] ){ 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0 } );
-    Radio.SetWhiteningSeed( 0x01FF );
-
-    RX_LED = 0;
-    TX_LED = 0;
-}
-
-/*!
- * \brief Callback of ticker PerSendNextPacket
- */
-void SendNextPacketEvent( void )
-{
-    SendNext = true;
-}
-
-void LedBlink( void )
-{
-    if( ( TX_LED == 0 ) && ( RX_LED == 0 ) )
-    {
-        TX_LED = 1;
-    }
-    else if( ( TX_LED == 1 ) && ( RX_LED == 0 ) )
-    {
-        RX_LED = 1;
-    }
-    else if( ( TX_LED == 1 ) && ( RX_LED == 1 ) )
-    {
-        TX_LED = 0;
-    }
-    else
-    {
-        RX_LED = 0;
-    }
-}
-
-// ************************     Radio Callbacks     ****************************
-// *                                                                           *
-// * These functions are called through function pointer by the Radio low      *
-// * level drivers                                                             *
-// *                                                                           *
-// *****************************************************************************
-void OnTxDone( void )
-{
-    DemoInternalState = APP_TX;
-}
-
-void OnRxDone( void )
-{
-    DemoInternalState = APP_RX;
-}
-
-void OnTxTimeout( void )
-{
-    DemoInternalState = APP_TX_TIMEOUT;
-}
-
-void OnRxTimeout( void )
-{
-    DemoInternalState = APP_RX_TIMEOUT;
-}
-
-void OnRxError( IrqErrorCode_t errorCode )
-{
-    DemoInternalState = APP_RX_ERROR;
-    
-    if( errorCode == IRQ_HEADER_ERROR_CODE )
-    {
-#ifdef ADV_DEBUG
-        printf( ">> IRQ_HEADER_ERROR_CODE\n\r" );
-#endif
-    }
-    else if( errorCode == IRQ_SYNCWORD_ERROR_CODE )
-    {
-#ifdef ADV_DEBUG
-        printf( ">> IRQ_SYNCWORD_ERROR_CODE\n\r" );
-#endif
-    }
-    else if( errorCode == IRQ_CRC_ERROR_CODE )
-    {
-#ifdef ADV_DEBUG
-        printf( ">> IRQ_CRC_ERROR_CODE\n\r" );
-#endif
-    }
-    else
-    {
-#ifdef ADV_DEBUG
-        printf( "unknown error\n\r" );
-#endif
-    }
-    Radio.GetPacketStatus( &PacketStatus );
-}
-
-void OnCadDone( bool channelActivityDetected )
-{
-    if( channelActivityDetected == true )
-    {
-        DemoInternalState = CAD_DONE_CHANNEL_DETECTED;
-    }
-    else
-    {
-        DemoInternalState = CAD_DONE;
-    }
-}
diff -r 274ca9fe1080 -r cdb739697925 Demo/DemoApplication.h
--- a/Demo/DemoApplication.h	Mon Feb 15 19:20:41 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,269 +0,0 @@
-/*
-  ______                              _
- / _____)             _              | |
-( (____  _____ ____ _| |_ _____  ____| |__
- \____ \| ___ |    (_   _) ___ |/ ___)  _ \
- _____) ) ____| | | || |_| ____( (___| | | |
-(______/|_____)_|_|_| \__)_____)\____)_| |_|
-    (C)2016 Semtech
-
-Description: Display driver header
-
-Maintainer: Gregory Cristian & Gilbert Menth
-*/
-
-#ifndef DEMO_APPLICATION_H
-#define DEMO_APPLICATION_H
-
-
-/*!
- * \brief Used to display firmware version on TFT (Utilities menu)
- */
-#define FIRMWARE_VERSION    ( ( char* )"Firmware Version: 180706" )
-
-/*!
- * \brief Define range of central frequency [Hz]
- */
-#define DEMO_CENTRAL_FREQ_MIN       150000000UL
-#define DEMO_CENTRAL_FREQ_MAX       950000000UL
-
-/*!
- * \brief Define 3 preset central frequencies [Hz]
- */
-#define DEMO_CENTRAL_FREQ_PRESET1   169000000UL
-#define DEMO_CENTRAL_FREQ_PRESET2   280000000UL
-#define DEMO_CENTRAL_FREQ_PRESET3   434000000UL
-#define DEMO_CENTRAL_FREQ_PRESET4   490000000UL
-#define DEMO_CENTRAL_FREQ_PRESET5   783000000UL
-#define DEMO_CENTRAL_FREQ_PRESET6   868000000UL
-#define DEMO_CENTRAL_FREQ_PRESET7   915000000UL
-#define DEMO_CENTRAL_FREQ_PRESET8   930000000UL
-#define DEMO_CENTRAL_FREQ_PRESET9   510000000UL
-
-/*!
- * \brief Define min and max Tx power [dBm]
- */
-#define SX1261_POWER_TX_MIN           -17
-#define SX1261_POWER_TX_MAX           15
-
-#define SX1262_POWER_TX_MIN           -10
-#define SX1262_POWER_TX_MAX           22
-
-/*!
- * \brief Define current demo mode
- */
-enum DemoMode
-{
-    MASTER = 0,
-    SLAVE
-};
-
-/*!
- * \brief Define GFSK bitrate
- */
-typedef enum
-{
-    DEMO_BR_100         = 100,
-    DEMO_BR_600         = 600,
-    DEMO_BR_4800        = 4800,
-    DEMO_BR_9600        = 9600,
-    DEMO_BR_19200       = 19200,
-    DEMO_BR_57600       = 57600,
-    DEMO_BR_100000      = 100000,
-    DEMO_BR_250000      = 250000,
-}DemoBitrate_t;
-
-/*!
- * \brief Define GFSK frequency deviation
- */
-typedef enum
-{
-    DEMO_FDEV_5000      = 5000,
-    DEMO_FDEV_10000     = 10000,
-    DEMO_FDEV_25000     = 25000,
-    DEMO_FDEV_50000     = 50000,
-    DEMO_FDEV_75000     = 75000,
-    DEMO_FDEV_100000    = 100000,
-    DEMO_FDEV_150000    = 150000,
-}DemoFrequencyDev_t;
-
-/*!
- * \brief List of states for demo state machine
- */
-enum DemoInternalStates
-{
-    APP_IDLE = 0,               // nothing to do (or wait a radio interrupt)
-    SEND_PING_MSG,
-    SEND_PONG_MSG,
-    APP_RX,                     // Rx done
-    APP_RX_TIMEOUT,             // Rx timeout
-    APP_RX_ERROR,               // Rx error
-    APP_TX,                     // Tx done
-    APP_TX_TIMEOUT,             // Tx error
-    PER_TX_START,               // PER master
-    PER_RX_START,               // PER slave
-    CAD_DONE,                   // CAD Done
-    CAD_DONE_CHANNEL_DETECTED   // Channel Detected following a CAD
-};
-
-/*!
- * \brief Demo Settings structure of Eeprom structure
- */
-typedef struct
-{
-    uint8_t Entity;             // Master or Slave
-    uint8_t HoldDemo;           // Put demo in hold status
-    uint8_t BoostedRx;          // Use Boosted Rx if true
-    uint32_t Frequency;         // Demo frequency
-    uint8_t LastDeviceConnected;// Last Device Connected
-    int8_t TxPower;             // Demo Tx power
-    uint8_t RadioPowerMode;     // Radio Power Mode [0: LDO, 1:DC_DC]
-    uint8_t PayloadLength;      // Demo payload length
-    uint8_t ModulationType;     // Demo modulation type (LORA, GFSK)
-    uint32_t ModulationParam1;  // Demo Mod. Param1 (depend on modulation type)
-    uint32_t ModulationParam2;  // Demo Mod. Param2 (depend on modulation type)
-    uint8_t ModulationParam3;   // Demo Mod. Param3 (depend on modulation type)
-    uint8_t ModulationParam4;   // Demo Mod. Param4 (depend on modulation type)
-    uint16_t PacketParam1;      // Demo Pack. Param1 (depend on packet type)
-    uint8_t PacketParam2;       // Demo Pack. Param2 (depend on packet type)
-    uint8_t PacketParam3;       // Demo Pack. Param3 (depend on packet type)
-    uint8_t PacketParam4;       // Demo Pack. Param4 (depend on packet type)
-    uint8_t PacketParam5;       // Demo Pack. Param5 (depend on packet type)
-    uint8_t PacketParam6;       // Demo Pack. Param6 (depend on packet type)
-    uint8_t PacketParam7;       // Demo Pack. Param7 (depend on packet type)
-    uint8_t PacketParam8;       // Demo Pack. Param8 (depend on packet type)
-    uint32_t MaxNumPacket;      // Demo Max Num Packet for PingPong and PER
-    uint16_t InterPacketDelay;  // Demo Inter-Packet Delay for PingPong and PER
-    uint32_t CntPacketTx;       // Tx packet transmitted
-    uint32_t CntPacketRxOK;     // Rx packet received OK
-    uint32_t CntPacketRxOKSlave;// Rx packet received OK (slave side)
-    uint32_t CntPacketRxKO;     // Rx packet received KO
-    uint32_t CntPacketRxKOSlave;// Rx packet received KO (slave side)
-    uint16_t RxTimeOutCount;    // Rx packet received KO (by timeout)
-    int8_t RssiValue;           // Demo Rssi Value
-    int8_t SnrValue;            // Demo Snr Value (only for LR24 mod. type)
-    uint32_t FreqErrorEst;      // Estimation of the frequency error on the Rx side
-}DemoSettings_t;
-
-/*!
- * \brief Define freq offset for config central freq in "Radio Config Freq" menu
- */
-enum FreqBase
-{
-    FB1     = 1,            //   1 Hz
-    FB10    = 10,           //  10 Hz
-    FB100   = 100,          // 100 Hz
-    FB1K    = 1000,         //   1 kHz
-    FB10K   = 10000,        //  10 kHz
-    FB100K  = 100000,       // 100 kHz
-    FB1M    = 1000000,      //   1 MHz
-    FB10M   = 10000000      //  10 MHz
-};
-
-
-/*!
- * \brief Simple Function which return the device connected.
- *
- * \retval      deviceConnected    device type connected
- */
-uint8_t GetConnectedDevice( void );
-
-/*!
- * \brief Simple Function which return the board matching frequency
- *
- * \retval      freq    1: 868 MHz   0: 915 MHz
- */
-uint8_t GetMatchingFrequency( void );
-
-/*!
- * \brief Init RAM copy of Eeprom structure and init radio with it.
- *
- */
-void InitDemoApplication( void );
-
-/*!
- * \brief Init vars of demo and fix APP_IDLE state to demo state machine.
- */
-void StopDemoApplication( void );
-
-/*!
- * \brief Run demo reading constantly the RSSI.
- *
- * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
- */
-uint8_t RunDemoTestRssi( void );
-
-/*!
- * \brief Run Demo in sleep mode.
- *
- * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
- */
-uint8_t RunDemoSleepMode( void );
-
-/*!
- * \brief Run Demo in standby RC mode.
- *
- * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
- */
-uint8_t RunDemoStandbyRcMode( void );
-
-/*!
- * \brief Run Demo in standby XOSC mode.
- *
- * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
- */
-uint8_t RunDemoStandbyXoscMode( void );
-
-/*!
- * \brief Run Demo Tx in continuous mode without modulation.
- *
- * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
- */
-uint8_t PrepDemoTxCw( void );
-uint8_t RunDemoTxCw( void );
-uint8_t DemoStandby( void );
-/*!
- * \brief Run Demo Tx in continuous modulation.
- *
- * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
- */
-uint8_t RunDemoTxContinuousModulation( void );
-
-/*!
- * \brief Run Demo Rx in continuous mode.
- *
- * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
- */
-uint8_t RunDemoRxContinuous( void );
-
-/*!
- * \brief Run demo PingPong.
- *
- * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
- */
-uint8_t RunDemoApplicationPingPong( void );
-
-/*!
- * \brief Compute payload of Rx frame and update current counts and indicators.
- *
- * \param [in]  buffer        buffer with frame to compute
- * \param [in]  buffersize    size of frame data in the buffer
- */
-void ComputePingPongPayload( uint8_t *buffer, uint8_t bufferSize );
-
-/*!
- * \brief Run demo PER.
- *
- * \retval      demoStatusUpdate    page refresh status ( >0 : refresh)
- */
-uint8_t RunDemoApplicationPer( void );
-
-/*!
- * \brief Compute payload of Rx frame and update current counts and indicators.
- *
- * \param [in]  buffer        buffer with frame to compute
- * \param [in]  buffersize    size of frame data in the buffer
- */
-void ComputePerPayload( uint8_t *buffer, uint8_t bufferSize );
-
-#endif // DEMO_APPLICATION_H
diff -r 274ca9fe1080 -r cdb739697925 Demo/SX126xLib.lib
--- a/Demo/SX126xLib.lib	Mon Feb 15 19:20:41 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://os.mbed.com/teams/Semtech/code/SX126xLib/#1e2345700991
diff -r 274ca9fe1080 -r cdb739697925 Peripherals/Eeprom.cpp
--- a/Peripherals/Eeprom.cpp	Mon Feb 15 19:20:41 2021 +0000
+++ b/Peripherals/Eeprom.cpp	Mon Feb 15 21:03:43 2021 +0000
@@ -15,7 +15,7 @@
 #include "mbed.h"
 #include "string.h"
 #include "Eeprom.h"
-#include "DemoApplication.h"
+#include "CwTransmitter.h"
 #include "sx126x.h"
 #if defined( TARGET_NUCLEO_L476RG )
 #include "stm32l4xx_hal_flash.h"
diff -r 274ca9fe1080 -r cdb739697925 Peripherals/Eeprom.h
--- a/Peripherals/Eeprom.h	Mon Feb 15 19:20:41 2021 +0000
+++ b/Peripherals/Eeprom.h	Mon Feb 15 21:03:43 2021 +0000
@@ -17,7 +17,7 @@
 
 
 //#include "Menu.h"
-#include "DemoApplication.h"
+#include "CwTransmitter.h"
 #include "sx126x.h"
 
 
diff -r 274ca9fe1080 -r cdb739697925 Peripherals/Timers.cpp
--- a/Peripherals/Timers.cpp	Mon Feb 15 19:20:41 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
-  ______                              _
- / _____)             _              | |
-( (____  _____ ____ _| |_ _____  ____| |__
- \____ \| ___ |    (_   _) ___ |/ ___)  _ \
- _____) ) ____| | | || |_| ____( (___| | | |
-(______/|_____)_|_|_| \__)_____)\____)_| |_|
-    (C)2016 Semtech
-
-Description: Timers
-
-Maintainer: Gregory Cristian & Gilbert Menth
-*/
-
-#include "mbed.h"
-#include "Timers.h"
-
-
-Ticker TickTimer;
-
-static uint32_t SoftTimer = 0;
-static void TimersIncSoftTimer( void );
-
-
-void TimersInit( void )
-{
-    TickTimer.attach_us( &TimersIncSoftTimer, 1000 ); // Ticks every millisecond
-}
-
-static void TimersIncSoftTimer( void )
-{
-    SoftTimer++;
-}
-
-void TimersSetTimer( uint32_t *sTimer, uint32_t timeLength )
-{
-    if( timeLength > MAX_TIMER_VALUE )
-    {
-        timeLength = MAX_TIMER_VALUE;
-    }
-    *sTimer = SoftTimer + timeLength;
-}
-
-uint32_t TimersTimerHasExpired ( const uint32_t * sTimer )
-{
-    if( ( SoftTimer - *sTimer ) > 0x7fffffff )
-    {
-        return false;
-    }
-    return true;
-}
-
-uint32_t TimersTimerValue ( void )
-{
-    return SoftTimer;
-}
diff -r 274ca9fe1080 -r cdb739697925 Peripherals/Timers.h
--- a/Peripherals/Timers.h	Mon Feb 15 19:20:41 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
-  ______                              _
- / _____)             _              | |
-( (____  _____ ____ _| |_ _____  ____| |__
- \____ \| ___ |    (_   _) ___ |/ ___)  _ \
- _____) ) ____| | | || |_| ____( (___| | | |
-(______/|_____)_|_|_| \__)_____)\____)_| |_|
-    (C)2016 Semtech
-
-Description: Timers header
-
-Maintainer: Gregory Cristian & Gilbert Menth
-*/
-
-#ifndef TIMERS_H
-#define TIMERS_H
-
-
-#define TIM_MSEC        ( uint32_t )1
-#define TIM_SEC         ( uint32_t )1000
-#define TIM_MIN         ( uint32_t )60000
-#define TIM_HOUR        ( uint32_t )3600000
-#define MAX_TIMER_VALUE ( TIM_MIN * 150 ) // maximum time for timer
-
-
- /*!
- * \brief Initialses the hardware and variables associated with the timers.
- */
-void TimersInit( void );
-
- /*!
- * \brief Sets a timer to a specific value
- *
- * \param [in]  *STimer       Pointer to the timer value to be set.
- * \param [in]  TimeLength    Value to set the timer to in milliseconds.
- */
-void TimersSetTimer( uint32_t *sTimer, uint32_t timeLength );
-
- /*!
- * \brief Checks if a timer has expired.
- *
- * \param [in]  *STimer       Pointer to the timer value to be read.
- *
- * \retval      Status        Non zero if the timer has not expired and is still
- *                            running.
- */
-uint32_t TimersTimerHasExpired ( const uint32_t * sTimer );
-
- /*!
- * \brief Returns the value of the current time in milliseconds
- *
- * \param [in]  refresh       Flag indicates refresh display required (touch)
- *
- * \retval      Value         value of current time in milliseconds
- */
-uint32_t TimersTimerValue ( void );
-
-#endif //TIMERS_H
diff -r 274ca9fe1080 -r cdb739697925 main.cpp
--- a/main.cpp	Mon Feb 15 19:20:41 2021 +0000
+++ b/main.cpp	Mon Feb 15 21:03:43 2021 +0000
@@ -1,19 +1,4 @@
-/*
-  ______                              _
- / _____)             _              | |
-( (____  _____ ____ _| |_ _____  ____| |__
- \____ \| ___ |    (_   _) ___ |/ ___)  _ \
- _____) ) ____| | | || |_| ____( (___| | | |
-(______/|_____)_|_|_| \__)_____)\____)_| |_|
-    (C)2016 Semtech
-
-Description: Main program
-
-Maintainer: Gregory Cristian & Gilbert Menth
-*/
-
 #include "mbed.h"
-#include "Timers.h"
 #include "Eeprom.h"
 #include "stm32l4xx_hal.h"
 
@@ -24,6 +9,20 @@
 InterruptIn tact(USER_BUTTON);
 volatile uint8_t tactFlag=0,t1Flag=0,t2Flag=0;
 
+// RfFrequency
+#define SET_RF_FREQUENCY                                915000000 
+// Tx power
+#define TX_POWER                                        22
+// rampTime                                            
+#define RAMP_TIME                                       RADIO_RAMP_10_US
+// pilotduration, us
+#define PILOT_DURATION                                  500          
+// pilotdelay, us
+#define PILOT_START_DELAY                               271
+#define PILOT_STOP_DELAY                                462  
+
+
+
 
 void baud( int baudrate ) 
 {
@@ -35,9 +34,7 @@
 void cwStop()
 {
     DemoStandby();
-    //StopDemoApplication( );
     cwTrigger.detach();
-    //PrepDemoTxCw( );
 }
 
 void cwStart()
@@ -67,16 +64,14 @@
     matchingFreq = GetMatchingFrequency( );
 
     EepromInit( deviceConnected, matchingFreq );
-    InitDemoApplication( );
-    TimersInit( );
-
     printf( "Start SX126xDevKit : %s\n\r", FIRMWARE_VERSION );
-    PrepDemoTxCw( );
+    PrepDemoTxCw(SET_RF_FREQUENCY,TX_POWER,RAMP_TIME);
+    uint32_t cwTimer = PILOT_DURATION + PILOT_START_DELAY - PILOT_STOP_DELAY;
     while( true )
     {   
         if(tactFlag){
             RunDemoTxCw( );
-            cwTrigger.attach_us(&cwStop, 300); // the address of the function to be attached (cwStop) and the interval (2000000 microseconds)
+            cwTrigger.attach_us(&cwStop, cwTimer);
             tactFlag=0;
         }