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.*
Committer:
GregCr
Date:
Thu May 11 15:42:05 2017 +0000
Revision:
8:c0a5f53fe196
Parent:
7:bc2f0fe8056f
Child:
9:0efc2c99078f
Corrected driver to match datasheet, corrected FW version registers, improved ranging performances at short distance

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 0:9c0917bfde97 1 /*
GregCr 0:9c0917bfde97 2 ______ _
GregCr 0:9c0917bfde97 3 / _____) _ | |
GregCr 0:9c0917bfde97 4 ( (____ _____ ____ _| |_ _____ ____| |__
GregCr 0:9c0917bfde97 5 \____ \| ___ | (_ _) ___ |/ ___) _ \
GregCr 0:9c0917bfde97 6 _____) ) ____| | | || |_| ____( (___| | | |
GregCr 0:9c0917bfde97 7 (______/|_____)_|_|_| \__)_____)\____)_| |_|
GregCr 0:9c0917bfde97 8 (C)2016 Semtech
GregCr 0:9c0917bfde97 9
GregCr 0:9c0917bfde97 10 Description: PingPong, PER and Ranging demo implementation.
GregCr 0:9c0917bfde97 11
GregCr 0:9c0917bfde97 12 Maintainer: Gregory Cristian & Gilbert Menth
GregCr 0:9c0917bfde97 13 */
GregCr 0:9c0917bfde97 14
GregCr 0:9c0917bfde97 15 #include "mbed.h"
GregCr 8:c0a5f53fe196 16 #include <math.h>
GregCr 0:9c0917bfde97 17 #include "radio.h"
GregCr 0:9c0917bfde97 18 #include "sx1280-hal.h"
GregCr 0:9c0917bfde97 19 #include "Eeprom.h"
GregCr 0:9c0917bfde97 20 #include "DemoApplication.h"
GregCr 0:9c0917bfde97 21 #include "FreqLUT.h"
GregCr 0:9c0917bfde97 22
GregCr 8:c0a5f53fe196 23 double t0 = -0.016432807883697; // X0
GregCr 8:c0a5f53fe196 24 double t1 = 0.323147003165358; // X1
GregCr 8:c0a5f53fe196 25 double t2 = 0.014922061351196; // X1^2
GregCr 8:c0a5f53fe196 26 double t3 = 0.000137832006285; // X1^3
GregCr 8:c0a5f53fe196 27 double t4 = 0.536873856625399; // X2
GregCr 8:c0a5f53fe196 28 double t5 = 0.040890089178579; // X2^2
GregCr 8:c0a5f53fe196 29 double t6 = -0.001074801048732; // X2^3
GregCr 8:c0a5f53fe196 30 double t7 = 0.000009240142234; // X2^4
GregCr 8:c0a5f53fe196 31
GregCr 8:c0a5f53fe196 32
GregCr 1:dbcb3698f73a 33
GregCr 0:9c0917bfde97 34 /*!
GregCr 0:9c0917bfde97 35 * \brief Defines the local payload buffer size
GregCr 0:9c0917bfde97 36 */
GregCr 0:9c0917bfde97 37 #define BUFFER_SIZE 255
GregCr 0:9c0917bfde97 38
GregCr 0:9c0917bfde97 39 /*!
GregCr 0:9c0917bfde97 40 * \brief Defines the size of the token defining message type in the payload
GregCr 0:9c0917bfde97 41 * cf. above.
GregCr 0:9c0917bfde97 42 */
GregCr 0:9c0917bfde97 43 #define PINGPONG_SIZE 4
GregCr 0:9c0917bfde97 44 #define PER_SIZE 3
GregCr 0:9c0917bfde97 45
GregCr 0:9c0917bfde97 46 /*!
GregCr 0:9c0917bfde97 47 * \brief Define time used in PingPong demo to synch with cycle
GregCr 0:9c0917bfde97 48 * RX_TIMEOUT_MARGIN is the free time between each cycle (time reserve)
GregCr 0:9c0917bfde97 49 */
GregCr 0:9c0917bfde97 50 #define RX_TIMEOUT_MARGIN 50 // ms
GregCr 0:9c0917bfde97 51 #define RX_TX_TRANSITION_WAIT 5 // ms
GregCr 0:9c0917bfde97 52
GregCr 0:9c0917bfde97 53 /*!
GregCr 0:9c0917bfde97 54 * \brief Size of ticks (used for Tx and Rx timeout)
GregCr 0:9c0917bfde97 55 */
GregCr 0:9c0917bfde97 56 #define RX_TIMEOUT_TICK_SIZE RADIO_TICK_SIZE_1000_US
GregCr 0:9c0917bfde97 57
GregCr 0:9c0917bfde97 58 #define RNG_TIMER_MS 384 // ms
GregCr 0:9c0917bfde97 59 #define RNG_COM_TIMEOUT 100 // ms
GregCr 0:9c0917bfde97 60
GregCr 0:9c0917bfde97 61 /*!
GregCr 0:9c0917bfde97 62 * \brief Ranging raw factors
GregCr 0:9c0917bfde97 63 * SF5 SF6 SF7 SF8 SF9 SF10
GregCr 0:9c0917bfde97 64 */
GregCr 0:9c0917bfde97 65 const uint16_t RNG_CALIB_0400[] = { 10299, 10271, 10244, 10242, 10230, 10246 };
GregCr 0:9c0917bfde97 66 const uint16_t RNG_CALIB_0800[] = { 11486, 11474, 11453, 11426, 11417, 11401 };
GregCr 0:9c0917bfde97 67 const uint16_t RNG_CALIB_1600[] = { 13308, 13493, 13528, 13515, 13430, 13376 };
GregCr 0:9c0917bfde97 68 const double RNG_FGRAD_0400[] = { -0.148, -0.214, -0.419, -0.853, -1.686, -3.423 };
GregCr 0:9c0917bfde97 69 const double RNG_FGRAD_0800[] = { -0.041, -0.811, -0.218, -0.429, -0.853, -1.737 };
GregCr 0:9c0917bfde97 70 const double RNG_FGRAD_1600[] = { 0.103, -0.041, -0.101, -0.211, -0.424, -0.87 };
GregCr 0:9c0917bfde97 71
GregCr 0:9c0917bfde97 72 /*!
GregCr 0:9c0917bfde97 73 * \brief Define the possible message type for the Ping-Pong and PER apps
GregCr 0:9c0917bfde97 74 */
GregCr 0:9c0917bfde97 75 const uint8_t PingMsg[] = "PING";
GregCr 0:9c0917bfde97 76 const uint8_t PongMsg[] = "PONG";
GregCr 0:9c0917bfde97 77 const uint8_t PerMsg[] = "PER";
GregCr 0:9c0917bfde97 78
GregCr 0:9c0917bfde97 79 const uint32_t RefreshScreenDelayMs = 300; // in ms
GregCr 0:9c0917bfde97 80
GregCr 0:9c0917bfde97 81 /*!
GregCr 0:9c0917bfde97 82 * \brief Buffer and its size
GregCr 0:9c0917bfde97 83 */
GregCr 0:9c0917bfde97 84 uint8_t BufferSize = BUFFER_SIZE;
GregCr 0:9c0917bfde97 85 uint8_t Buffer[BUFFER_SIZE];
GregCr 0:9c0917bfde97 86
GregCr 0:9c0917bfde97 87 static uint8_t CurrentChannel;
GregCr 8:c0a5f53fe196 88 static uint16_t MeasuredChannels;
GregCr 0:9c0917bfde97 89 int RngResultIndex;
GregCr 0:9c0917bfde97 90 double RawRngResults[DEMO_RNG_CHANNELS_COUNT_MAX];
GregCr 8:c0a5f53fe196 91 double RssiRng[DEMO_RNG_CHANNELS_COUNT_MAX];
GregCr 8:c0a5f53fe196 92
GregCr 0:9c0917bfde97 93
GregCr 0:9c0917bfde97 94 /*!
GregCr 0:9c0917bfde97 95 * \brief Function to be executed on Radio Tx Done event
GregCr 0:9c0917bfde97 96 */
GregCr 0:9c0917bfde97 97 void OnTxDone( void );
GregCr 0:9c0917bfde97 98
GregCr 0:9c0917bfde97 99 /*!
GregCr 0:9c0917bfde97 100 * \brief Function to be executed on Radio Rx Done event
GregCr 0:9c0917bfde97 101 */
GregCr 0:9c0917bfde97 102 void OnRxDone( void );
GregCr 0:9c0917bfde97 103
GregCr 0:9c0917bfde97 104 /*!
GregCr 0:9c0917bfde97 105 * \brief Function executed on Radio Tx Timeout event
GregCr 0:9c0917bfde97 106 */
GregCr 0:9c0917bfde97 107 void OnTxTimeout( void );
GregCr 0:9c0917bfde97 108
GregCr 0:9c0917bfde97 109 /*!
GregCr 0:9c0917bfde97 110 * \brief Function executed on Radio Rx Timeout event
GregCr 0:9c0917bfde97 111 */
GregCr 0:9c0917bfde97 112 void OnRxTimeout( void );
GregCr 0:9c0917bfde97 113
GregCr 0:9c0917bfde97 114 /*!
GregCr 0:9c0917bfde97 115 * \brief Function executed on Radio Rx Error event
GregCr 0:9c0917bfde97 116 */
GregCr 0:9c0917bfde97 117 void OnRxError( IrqErrorCode_t );
GregCr 0:9c0917bfde97 118
GregCr 0:9c0917bfde97 119 /*!
GregCr 0:9c0917bfde97 120 * \brief Function executed on Radio Rx Error event
GregCr 0:9c0917bfde97 121 */
GregCr 0:9c0917bfde97 122 void OnRangingDone( IrqRangingCode_t );
GregCr 0:9c0917bfde97 123
GregCr 0:9c0917bfde97 124 /*!
GregCr 0:9c0917bfde97 125 * \brief All the callbacks are stored in a structure
GregCr 0:9c0917bfde97 126 */
GregCr 0:9c0917bfde97 127 RadioCallbacks_t Callbacks =
GregCr 0:9c0917bfde97 128 {
GregCr 0:9c0917bfde97 129 &OnTxDone, // txDone
GregCr 0:9c0917bfde97 130 &OnRxDone, // rxDone
GregCr 0:9c0917bfde97 131 NULL, // syncWordDone
GregCr 0:9c0917bfde97 132 NULL, // headerDone
GregCr 0:9c0917bfde97 133 &OnTxTimeout, // txTimeout
GregCr 0:9c0917bfde97 134 &OnRxTimeout, // rxTimeout
GregCr 0:9c0917bfde97 135 &OnRxError, // rxError
GregCr 0:9c0917bfde97 136 &OnRangingDone, // rangingDone
GregCr 0:9c0917bfde97 137 NULL, // cadDone
GregCr 0:9c0917bfde97 138 };
GregCr 0:9c0917bfde97 139
GregCr 0:9c0917bfde97 140 /*!
GregCr 0:9c0917bfde97 141 * \brief Define IO and callbacks for radio
GregCr 0:9c0917bfde97 142 * mosi, miso, sclk, nss, busy, dio1, dio2, dio3, rst, callbacks
GregCr 0:9c0917bfde97 143 */
GregCr 0:9c0917bfde97 144 SX1280Hal Radio( D11, D12, D13, D7, D3, D5, NC, NC, A0, &Callbacks );
GregCr 0:9c0917bfde97 145
GregCr 0:9c0917bfde97 146 /*!
GregCr 0:9c0917bfde97 147 * \brief Control the Antenna Diversity switch
GregCr 0:9c0917bfde97 148 */
GregCr 0:9c0917bfde97 149 DigitalOut ANT_SW( A3 );
GregCr 0:9c0917bfde97 150
GregCr 0:9c0917bfde97 151 /*!
GregCr 0:9c0917bfde97 152 * \brief Tx LED toggling on transmition success
GregCr 0:9c0917bfde97 153 */
GregCr 0:9c0917bfde97 154 DigitalOut TX_LED( A4 );
GregCr 0:9c0917bfde97 155
GregCr 0:9c0917bfde97 156 /*!
GregCr 0:9c0917bfde97 157 * \brief Rx LED toggling on reception success
GregCr 0:9c0917bfde97 158 */
GregCr 0:9c0917bfde97 159 DigitalOut RX_LED( A5 );
GregCr 0:9c0917bfde97 160
GregCr 0:9c0917bfde97 161 /*!
GregCr 0:9c0917bfde97 162 * \brief Mask of IRQs
GregCr 0:9c0917bfde97 163 */
GregCr 0:9c0917bfde97 164 uint16_t IrqMask = 0x0000;
GregCr 0:9c0917bfde97 165
GregCr 0:9c0917bfde97 166 /*!
GregCr 0:9c0917bfde97 167 * \brief Locals parameters and status for radio API
GregCr 0:9c0917bfde97 168 * NEED TO BE OPTIMIZED, COPY OF STUCTURE ALREADY EXISTING
GregCr 0:9c0917bfde97 169 */
GregCr 0:9c0917bfde97 170 PacketParams_t PacketParams;
GregCr 0:9c0917bfde97 171 PacketStatus_t PacketStatus;
GregCr 0:9c0917bfde97 172 ModulationParams_t ModulationParams;
GregCr 0:9c0917bfde97 173
GregCr 0:9c0917bfde97 174 /*!
GregCr 0:9c0917bfde97 175 * \brief Flag to indicate if the demo is already running
GregCr 0:9c0917bfde97 176 */
GregCr 0:9c0917bfde97 177 static bool DemoRunning = false;
GregCr 0:9c0917bfde97 178
GregCr 0:9c0917bfde97 179 /*!
GregCr 0:9c0917bfde97 180 * \brief Flag holding the current internal state of the demo application
GregCr 0:9c0917bfde97 181 */
GregCr 0:9c0917bfde97 182 static uint8_t DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 183
GregCr 0:9c0917bfde97 184 /*!
GregCr 0:9c0917bfde97 185 * \brief Ticker for master to synch Tx frames. Flags for PER and PingPong demo
GregCr 0:9c0917bfde97 186 * for Synch TX in cycle.
GregCr 0:9c0917bfde97 187 */
GregCr 0:9c0917bfde97 188 Ticker SendNextPacket;
GregCr 0:9c0917bfde97 189 static bool SendNext = false;
GregCr 0:9c0917bfde97 190
GregCr 0:9c0917bfde97 191 /*!
GregCr 0:9c0917bfde97 192 * \brief Hold last Rx packet number to compute PER in PER and PingPong demo
GregCr 0:9c0917bfde97 193 */
GregCr 0:9c0917bfde97 194 static uint32_t PacketRxSequence = 0;
GregCr 0:9c0917bfde97 195 static uint32_t PacketRxSequencePrev = 0;
GregCr 0:9c0917bfde97 196
GregCr 0:9c0917bfde97 197
GregCr 0:9c0917bfde97 198 void SetAntennaSwitch( void );
GregCr 0:9c0917bfde97 199 void LedBlink( void );
GregCr 0:9c0917bfde97 200 void InitializeDemoParameters( uint8_t modulation );
GregCr 0:9c0917bfde97 201 uint16_t GetTimeOnAir( uint8_t modulation );
GregCr 0:9c0917bfde97 202 void SendNextPacketEvent( void );
GregCr 0:9c0917bfde97 203 uint8_t CheckDistance( void );
GregCr 0:9c0917bfde97 204
GregCr 0:9c0917bfde97 205 // ************************** RF Test Demo ******************************
GregCr 0:9c0917bfde97 206 // * *
GregCr 0:9c0917bfde97 207 // * *
GregCr 0:9c0917bfde97 208 // * *
GregCr 0:9c0917bfde97 209 // *****************************************************************************
GregCr 0:9c0917bfde97 210
GregCr 0:9c0917bfde97 211 uint8_t RunDemoSleepMode( void )
GregCr 0:9c0917bfde97 212 {
GregCr 0:9c0917bfde97 213 SleepParams_t SleepParam;
GregCr 0:9c0917bfde97 214
GregCr 0:9c0917bfde97 215 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 216 {
GregCr 0:9c0917bfde97 217 return 0;
GregCr 0:9c0917bfde97 218 }
GregCr 0:9c0917bfde97 219 if( DemoRunning == false )
GregCr 0:9c0917bfde97 220 {
GregCr 0:9c0917bfde97 221 DemoRunning = true;
GregCr 0:9c0917bfde97 222 InitializeDemoParameters( PACKET_TYPE_LORA );
GregCr 0:9c0917bfde97 223 TX_LED = 0;
GregCr 0:9c0917bfde97 224 RX_LED = 0;
GregCr 0:9c0917bfde97 225 SleepParam.WakeUpRTC = 0; //!< Get out of sleep mode if wakeup signal received from RTC
GregCr 0:9c0917bfde97 226 SleepParam.InstructionRamRetention = 0; //!< InstructionRam is conserved during sleep
GregCr 0:9c0917bfde97 227 SleepParam.DataBufferRetention = 0; //!< Data buffer is conserved during sleep
GregCr 0:9c0917bfde97 228 SleepParam.DataRamRetention = 0; //!< Data ram is conserved during sleep
GregCr 0:9c0917bfde97 229 Radio.SetSleep( SleepParam );
GregCr 0:9c0917bfde97 230 }
GregCr 0:9c0917bfde97 231 else
GregCr 0:9c0917bfde97 232 {
GregCr 0:9c0917bfde97 233 LedBlink( );
GregCr 0:9c0917bfde97 234 }
GregCr 0:9c0917bfde97 235 return 0;
GregCr 0:9c0917bfde97 236 }
GregCr 0:9c0917bfde97 237
GregCr 0:9c0917bfde97 238 uint8_t RunDemoStandbyRcMode( void )
GregCr 0:9c0917bfde97 239 {
GregCr 0:9c0917bfde97 240 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 241 {
GregCr 0:9c0917bfde97 242 return 0;
GregCr 0:9c0917bfde97 243 }
GregCr 0:9c0917bfde97 244 if( DemoRunning == false )
GregCr 0:9c0917bfde97 245 {
GregCr 0:9c0917bfde97 246 DemoRunning = true;
GregCr 0:9c0917bfde97 247 InitializeDemoParameters( PACKET_TYPE_LORA );
GregCr 0:9c0917bfde97 248 TX_LED = 0;
GregCr 0:9c0917bfde97 249 RX_LED = 0;
GregCr 0:9c0917bfde97 250 Radio.SetRegulatorMode( ( RadioRegulatorModes_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
GregCr 0:9c0917bfde97 251 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 252 DemoRunning = true;
GregCr 0:9c0917bfde97 253 }
GregCr 0:9c0917bfde97 254 else
GregCr 0:9c0917bfde97 255 {
GregCr 0:9c0917bfde97 256 LedBlink( );
GregCr 0:9c0917bfde97 257 }
GregCr 0:9c0917bfde97 258 return 0;
GregCr 0:9c0917bfde97 259 }
GregCr 0:9c0917bfde97 260
GregCr 0:9c0917bfde97 261 uint8_t RunDemoStandbyXoscMode( void )
GregCr 0:9c0917bfde97 262 {
GregCr 0:9c0917bfde97 263 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 264 {
GregCr 0:9c0917bfde97 265 return 0;
GregCr 0:9c0917bfde97 266 }
GregCr 0:9c0917bfde97 267 if( DemoRunning == false )
GregCr 0:9c0917bfde97 268 {
GregCr 0:9c0917bfde97 269 DemoRunning = true;
GregCr 0:9c0917bfde97 270 InitializeDemoParameters( PACKET_TYPE_LORA );
GregCr 0:9c0917bfde97 271 TX_LED = 0;
GregCr 0:9c0917bfde97 272 RX_LED = 0;
GregCr 0:9c0917bfde97 273 Radio.SetRegulatorMode( ( RadioRegulatorModes_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
GregCr 0:9c0917bfde97 274 Radio.SetStandby( STDBY_XOSC );
GregCr 0:9c0917bfde97 275 DemoRunning = true;
GregCr 0:9c0917bfde97 276 }
GregCr 0:9c0917bfde97 277 else
GregCr 0:9c0917bfde97 278 {
GregCr 0:9c0917bfde97 279 LedBlink( );
GregCr 0:9c0917bfde97 280 }
GregCr 0:9c0917bfde97 281 return 0;
GregCr 0:9c0917bfde97 282 }
GregCr 0:9c0917bfde97 283
GregCr 0:9c0917bfde97 284 uint8_t RunDemoTxCw( void )
GregCr 0:9c0917bfde97 285 {
GregCr 0:9c0917bfde97 286 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 287 {
GregCr 0:9c0917bfde97 288 return 0;
GregCr 0:9c0917bfde97 289 }
GregCr 0:9c0917bfde97 290 if( DemoRunning == false )
GregCr 0:9c0917bfde97 291 {
GregCr 0:9c0917bfde97 292 DemoRunning = true;
GregCr 0:9c0917bfde97 293 InitializeDemoParameters( PACKET_TYPE_LORA );
GregCr 0:9c0917bfde97 294 TX_LED = 0;
GregCr 0:9c0917bfde97 295 RX_LED = 0;
GregCr 0:9c0917bfde97 296 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 297 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 298 Radio.SetRegulatorMode( ( RadioRegulatorModes_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
GregCr 0:9c0917bfde97 299 Radio.SetRfFrequency( Eeprom.EepromData.DemoSettings.Frequency );
GregCr 0:9c0917bfde97 300 Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
GregCr 0:9c0917bfde97 301 Radio.SetTxContinuousWave( );
GregCr 0:9c0917bfde97 302 DemoRunning = true;
GregCr 0:9c0917bfde97 303 }
GregCr 0:9c0917bfde97 304 else
GregCr 0:9c0917bfde97 305 {
GregCr 0:9c0917bfde97 306 LedBlink( );
GregCr 0:9c0917bfde97 307 }
GregCr 0:9c0917bfde97 308 return 0;
GregCr 0:9c0917bfde97 309 }
GregCr 0:9c0917bfde97 310
GregCr 0:9c0917bfde97 311 uint8_t RunDemoTxContinuousModulation( void )
GregCr 0:9c0917bfde97 312 {
GregCr 0:9c0917bfde97 313 uint8_t localPayloadSize = 250;
GregCr 0:9c0917bfde97 314 uint8_t i = 0;
GregCr 0:9c0917bfde97 315
GregCr 0:9c0917bfde97 316 if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_RANGING )
GregCr 0:9c0917bfde97 317 {
GregCr 0:9c0917bfde97 318 Eeprom.EepromData.DemoSettings.ModulationType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 319 }
GregCr 0:9c0917bfde97 320 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 321 {
GregCr 0:9c0917bfde97 322 return 0;
GregCr 0:9c0917bfde97 323 }
GregCr 0:9c0917bfde97 324
GregCr 0:9c0917bfde97 325 if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 326 {
GregCr 0:9c0917bfde97 327 localPayloadSize = 120; // Encoded in 4/8 so 240 bytes in total
GregCr 0:9c0917bfde97 328 }
GregCr 0:9c0917bfde97 329 if( DemoRunning == false )
GregCr 0:9c0917bfde97 330 {
GregCr 0:9c0917bfde97 331 DemoRunning = true;
GregCr 0:9c0917bfde97 332
GregCr 0:9c0917bfde97 333 TX_LED = 0;
GregCr 0:9c0917bfde97 334 RX_LED = 0;
GregCr 0:9c0917bfde97 335
GregCr 0:9c0917bfde97 336 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 337
GregCr 0:9c0917bfde97 338 // Send the next PING frame
GregCr 0:9c0917bfde97 339 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 340 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 341 for( i = 0; i < localPayloadSize; i++ )
GregCr 0:9c0917bfde97 342 {
GregCr 0:9c0917bfde97 343 Buffer[i] = ( uint8_t )rand( );
GregCr 0:9c0917bfde97 344 }
GregCr 0:9c0917bfde97 345 // Radio.SetAutoFS( true ); // no need to relock the PLL between packets
GregCr 0:9c0917bfde97 346 Radio.SendPayload( Buffer, localPayloadSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, 10000 } );
GregCr 0:9c0917bfde97 347 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 348 }
GregCr 0:9c0917bfde97 349 else
GregCr 0:9c0917bfde97 350 {
GregCr 0:9c0917bfde97 351 switch( DemoInternalState )
GregCr 0:9c0917bfde97 352 {
GregCr 0:9c0917bfde97 353 case APP_RX:
GregCr 0:9c0917bfde97 354 break;
GregCr 0:9c0917bfde97 355
GregCr 0:9c0917bfde97 356 case APP_TX:
GregCr 0:9c0917bfde97 357 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 358 LedBlink( );
GregCr 0:9c0917bfde97 359 // Send the next frame
GregCr 0:9c0917bfde97 360 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 361 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 362 for( i = 0; i < localPayloadSize; i++ )
GregCr 0:9c0917bfde97 363 {
GregCr 0:9c0917bfde97 364 Buffer[i] = ( uint8_t )rand( );
GregCr 0:9c0917bfde97 365 }
GregCr 0:9c0917bfde97 366 // Radio.SetAutoFS( true ); // no need to relock the PLL between packets
GregCr 0:9c0917bfde97 367 Radio.SendPayload( Buffer, localPayloadSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, 0xFFFF } );
GregCr 0:9c0917bfde97 368 break;
GregCr 0:9c0917bfde97 369
GregCr 0:9c0917bfde97 370 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 371 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 372 break;
GregCr 0:9c0917bfde97 373
GregCr 0:9c0917bfde97 374 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 375 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 376 break;
GregCr 0:9c0917bfde97 377
GregCr 0:9c0917bfde97 378 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 379 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 380 break;
GregCr 0:9c0917bfde97 381
GregCr 0:9c0917bfde97 382 case APP_IDLE:
GregCr 0:9c0917bfde97 383 break;
GregCr 0:9c0917bfde97 384
GregCr 0:9c0917bfde97 385 default:
GregCr 0:9c0917bfde97 386 break;
GregCr 0:9c0917bfde97 387 }
GregCr 0:9c0917bfde97 388 }
GregCr 0:9c0917bfde97 389 return 0;
GregCr 0:9c0917bfde97 390 }
GregCr 0:9c0917bfde97 391
GregCr 0:9c0917bfde97 392 // ************************* PER Demo ******************************
GregCr 0:9c0917bfde97 393 // * *
GregCr 0:9c0917bfde97 394 // * *
GregCr 0:9c0917bfde97 395 // * *
GregCr 0:9c0917bfde97 396 // *****************************************************************************
GregCr 0:9c0917bfde97 397 uint8_t RunDemoApplicationPer( void )
GregCr 0:9c0917bfde97 398 {
GregCr 0:9c0917bfde97 399 uint8_t i = 0;
GregCr 0:9c0917bfde97 400 uint8_t refreshDisplay = 0;
GregCr 0:9c0917bfde97 401
GregCr 0:9c0917bfde97 402 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 403 {
GregCr 0:9c0917bfde97 404 return 0;
GregCr 0:9c0917bfde97 405 }
GregCr 0:9c0917bfde97 406
GregCr 0:9c0917bfde97 407 if( DemoRunning == false )
GregCr 0:9c0917bfde97 408 {
GregCr 0:9c0917bfde97 409 DemoRunning = true;
GregCr 0:9c0917bfde97 410
GregCr 0:9c0917bfde97 411 printf( "Start RunDemoApplicationPer\n\r" );
GregCr 0:9c0917bfde97 412
GregCr 0:9c0917bfde97 413 TX_LED = 0;
GregCr 0:9c0917bfde97 414 RX_LED = 0;
GregCr 0:9c0917bfde97 415 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 416 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 417 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 418 Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0;
GregCr 0:9c0917bfde97 419 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 420
GregCr 0:9c0917bfde97 421 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 422
GregCr 0:9c0917bfde97 423 Eeprom.EepromData.DemoSettings.InterPacketDelay = GetTimeOnAir( Eeprom.EepromData.DemoSettings.ModulationType ) + RefreshScreenDelayMs;
GregCr 0:9c0917bfde97 424
GregCr 0:9c0917bfde97 425 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 426 {
GregCr 0:9c0917bfde97 427 SendNextPacket.attach_us( &SendNextPacketEvent, Eeprom.EepromData.DemoSettings.InterPacketDelay * 1000 );
GregCr 0:9c0917bfde97 428 DemoInternalState = APP_TX;
GregCr 0:9c0917bfde97 429 }
GregCr 0:9c0917bfde97 430 else
GregCr 0:9c0917bfde97 431 {
GregCr 0:9c0917bfde97 432 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 433 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 434 // Rx Single without timeout for the start
GregCr 0:9c0917bfde97 435 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, 0x0000 } );
GregCr 0:9c0917bfde97 436 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 437 }
GregCr 0:9c0917bfde97 438 }
GregCr 0:9c0917bfde97 439
GregCr 0:9c0917bfde97 440 if( Eeprom.EepromData.DemoSettings.MaxNumPacket > 0 ) // != Infinite
GregCr 0:9c0917bfde97 441 {
GregCr 0:9c0917bfde97 442 if( ( Eeprom.EepromData.DemoSettings.CntPacketRxOK + \
GregCr 0:9c0917bfde97 443 Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 444 Eeprom.EepromData.DemoSettings.RxTimeOutCount) >= \
GregCr 0:9c0917bfde97 445 Eeprom.EepromData.DemoSettings.MaxNumPacket )
GregCr 0:9c0917bfde97 446 {
GregCr 0:9c0917bfde97 447 RX_LED = 0;
GregCr 0:9c0917bfde97 448 TX_LED = 0;
GregCr 0:9c0917bfde97 449 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 450 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 451 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 452 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 453 refreshDisplay = 1;
GregCr 0:9c0917bfde97 454 }
GregCr 0:9c0917bfde97 455 }
GregCr 0:9c0917bfde97 456
GregCr 0:9c0917bfde97 457 switch( DemoInternalState )
GregCr 0:9c0917bfde97 458 {
GregCr 0:9c0917bfde97 459 case PER_TX_START:
GregCr 0:9c0917bfde97 460 Eeprom.EepromData.DemoSettings.CntPacketTx++;
GregCr 0:9c0917bfde97 461 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 462
GregCr 0:9c0917bfde97 463 Buffer[0] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 464 Buffer[1] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 465 Buffer[2] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 466 Buffer[3] = Eeprom.EepromData.DemoSettings.CntPacketTx & 0xFF;
GregCr 0:9c0917bfde97 467 Buffer[4] = PerMsg[0];
GregCr 0:9c0917bfde97 468 Buffer[5] = PerMsg[1];
GregCr 0:9c0917bfde97 469 Buffer[6] = PerMsg[2];
GregCr 0:9c0917bfde97 470 for( i = 7; i < Eeprom.EepromData.DemoSettings.PayloadLength; i++ )
GregCr 0:9c0917bfde97 471 {
GregCr 0:9c0917bfde97 472 Buffer[i] = i;
GregCr 0:9c0917bfde97 473 }
GregCr 0:9c0917bfde97 474 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 475 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 476 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 477 Radio.SendPayload( Buffer, Eeprom.EepromData.DemoSettings.PayloadLength, \
GregCr 0:9c0917bfde97 478 ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 479 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 480 break;
GregCr 0:9c0917bfde97 481
GregCr 0:9c0917bfde97 482 case PER_RX_START:
GregCr 0:9c0917bfde97 483 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 484 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 485 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 486 Eeprom.EepromData.DemoSettings.InterPacketDelay + RX_TIMEOUT_MARGIN } );
GregCr 0:9c0917bfde97 487 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 488 break;
GregCr 0:9c0917bfde97 489
GregCr 0:9c0917bfde97 490 case APP_TX:
GregCr 0:9c0917bfde97 491 if( SendNext == true )
GregCr 0:9c0917bfde97 492 {
GregCr 0:9c0917bfde97 493 SendNext = false;
GregCr 0:9c0917bfde97 494 if( Eeprom.EepromData.DemoSettings.MaxNumPacket == 0 )
GregCr 0:9c0917bfde97 495 {
GregCr 0:9c0917bfde97 496 DemoInternalState = PER_TX_START; // Infinite -> send next
GregCr 0:9c0917bfde97 497 refreshDisplay = 1;
GregCr 0:9c0917bfde97 498 }
GregCr 0:9c0917bfde97 499 else if( Eeprom.EepromData.DemoSettings.CntPacketTx < \
GregCr 0:9c0917bfde97 500 Eeprom.EepromData.DemoSettings.MaxNumPacket )
GregCr 0:9c0917bfde97 501 {
GregCr 0:9c0917bfde97 502 DemoInternalState = PER_TX_START; // MaxNumPacket not sent
GregCr 0:9c0917bfde97 503 refreshDisplay = 1;
GregCr 0:9c0917bfde97 504 }
GregCr 0:9c0917bfde97 505 else // MaxNumPacket sent -> end of demo
GregCr 0:9c0917bfde97 506 {
GregCr 0:9c0917bfde97 507 RX_LED = 0;
GregCr 0:9c0917bfde97 508 TX_LED = 0;
GregCr 0:9c0917bfde97 509 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 510 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 511 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 512 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 513 refreshDisplay = 1;
GregCr 0:9c0917bfde97 514 }
GregCr 0:9c0917bfde97 515 }
GregCr 0:9c0917bfde97 516 break;
GregCr 0:9c0917bfde97 517
GregCr 0:9c0917bfde97 518 case APP_RX:
GregCr 0:9c0917bfde97 519 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 520 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 0:9c0917bfde97 521 Radio.GetPacketStatus( &PacketStatus );
GregCr 0:9c0917bfde97 522 if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 523 {
GregCr 0:9c0917bfde97 524 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.LoRa.RssiPkt;
GregCr 0:9c0917bfde97 525 Eeprom.EepromData.DemoSettings.SnrValue = PacketStatus.LoRa.SnrPkt;
GregCr 0:9c0917bfde97 526 }
GregCr 0:9c0917bfde97 527 else if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 528 {
GregCr 0:9c0917bfde97 529 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Flrc.RssiSync;
GregCr 0:9c0917bfde97 530 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 531 }
GregCr 0:9c0917bfde97 532 else if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 533 {
GregCr 0:9c0917bfde97 534 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Gfsk.RssiSync;
GregCr 0:9c0917bfde97 535 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 536 }
GregCr 0:9c0917bfde97 537 DemoInternalState = PER_RX_START;
GregCr 0:9c0917bfde97 538 if( ( BufferSize >= PER_SIZE ) && ( strncmp( ( const char* )( Buffer + 4 ), ( const char* )PerMsg, PER_SIZE ) == 0 ) )
GregCr 0:9c0917bfde97 539 {
GregCr 0:9c0917bfde97 540 ComputePerPayload( Buffer, BufferSize );
GregCr 0:9c0917bfde97 541 refreshDisplay = 1;
GregCr 0:9c0917bfde97 542 }
GregCr 0:9c0917bfde97 543 else
GregCr 0:9c0917bfde97 544 {
GregCr 0:9c0917bfde97 545 Eeprom.EepromData.DemoSettings.RxTimeOutCount++;
GregCr 0:9c0917bfde97 546 }
GregCr 0:9c0917bfde97 547 break;
GregCr 0:9c0917bfde97 548
GregCr 0:9c0917bfde97 549 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 550 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 551 Eeprom.EepromData.DemoSettings.RxTimeOutCount++;
GregCr 0:9c0917bfde97 552 DemoInternalState = PER_RX_START;
GregCr 0:9c0917bfde97 553 refreshDisplay = 1;
GregCr 0:9c0917bfde97 554 break;
GregCr 0:9c0917bfde97 555
GregCr 0:9c0917bfde97 556 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 557 printf( "Failure: timeout in Tx is shorter than the packet time on air\n\r" );
GregCr 0:9c0917bfde97 558 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 559 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 560 refreshDisplay = 1;
GregCr 0:9c0917bfde97 561 break;
GregCr 0:9c0917bfde97 562
GregCr 0:9c0917bfde97 563 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 564 break;
GregCr 0:9c0917bfde97 565
GregCr 0:9c0917bfde97 566 default:
GregCr 0:9c0917bfde97 567 break;
GregCr 0:9c0917bfde97 568 }
GregCr 0:9c0917bfde97 569 return refreshDisplay;
GregCr 0:9c0917bfde97 570 }
GregCr 0:9c0917bfde97 571
GregCr 0:9c0917bfde97 572 void ComputePerPayload( uint8_t *buffer, uint8_t bufferSize )
GregCr 0:9c0917bfde97 573 {
GregCr 0:9c0917bfde97 574 uint32_t i = 0;
GregCr 0:9c0917bfde97 575
GregCr 0:9c0917bfde97 576 Eeprom.EepromData.DemoSettings.CntPacketRxOK++;
GregCr 0:9c0917bfde97 577 PacketRxSequence = ( ( uint32_t )buffer[0] << 24 ) | \
GregCr 0:9c0917bfde97 578 ( ( uint32_t )buffer[1] << 16 ) | \
GregCr 0:9c0917bfde97 579 ( ( uint32_t )buffer[2] << 8 ) | \
GregCr 0:9c0917bfde97 580 buffer[3];
GregCr 0:9c0917bfde97 581
GregCr 0:9c0917bfde97 582 if( ( PacketRxSequence <= PacketRxSequencePrev ) || \
GregCr 0:9c0917bfde97 583 ( PacketRxSequencePrev == 0 ) )
GregCr 0:9c0917bfde97 584 {
GregCr 0:9c0917bfde97 585 // Sequence went back => resynchronization
GregCr 0:9c0917bfde97 586 // Don't count missed packets this time
GregCr 0:9c0917bfde97 587 i = 0;
GregCr 0:9c0917bfde97 588 }
GregCr 0:9c0917bfde97 589 else
GregCr 0:9c0917bfde97 590 {
GregCr 0:9c0917bfde97 591 // Determine number of missed packets
GregCr 0:9c0917bfde97 592 i = PacketRxSequence - PacketRxSequencePrev - 1;
GregCr 0:9c0917bfde97 593 }
GregCr 0:9c0917bfde97 594 // Be ready for the next
GregCr 0:9c0917bfde97 595 PacketRxSequencePrev = PacketRxSequence;
GregCr 0:9c0917bfde97 596 // increment 'missed' counter for the RX session
GregCr 0:9c0917bfde97 597 Eeprom.EepromData.DemoSettings.CntPacketRxKO += i;
GregCr 0:9c0917bfde97 598 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 599 }
GregCr 0:9c0917bfde97 600
GregCr 0:9c0917bfde97 601 // ************************ Ping Pong Demo *****************************
GregCr 0:9c0917bfde97 602 // * *
GregCr 0:9c0917bfde97 603 // * *
GregCr 0:9c0917bfde97 604 // * *
GregCr 0:9c0917bfde97 605 // *****************************************************************************
GregCr 0:9c0917bfde97 606 uint8_t RunDemoApplicationPingPong( void )
GregCr 0:9c0917bfde97 607 {
GregCr 0:9c0917bfde97 608 uint8_t i = 0;
GregCr 0:9c0917bfde97 609 uint8_t refreshDisplay = 0;
GregCr 0:9c0917bfde97 610
GregCr 0:9c0917bfde97 611 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 612 {
GregCr 0:9c0917bfde97 613 return 0; // quit without refresh display
GregCr 0:9c0917bfde97 614 }
GregCr 0:9c0917bfde97 615
GregCr 0:9c0917bfde97 616 if( DemoRunning == false )
GregCr 0:9c0917bfde97 617 {
GregCr 0:9c0917bfde97 618 DemoRunning = true;
GregCr 0:9c0917bfde97 619 TX_LED = 0;
GregCr 0:9c0917bfde97 620 RX_LED = 0;
GregCr 0:9c0917bfde97 621 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 622 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 623 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 624 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = 0;
GregCr 0:9c0917bfde97 625 Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0;
GregCr 0:9c0917bfde97 626 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave = 0;
GregCr 0:9c0917bfde97 627 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 628
GregCr 0:9c0917bfde97 629 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 630
GregCr 0:9c0917bfde97 631 Eeprom.EepromData.DemoSettings.InterPacketDelay = ( 2 * \
GregCr 0:9c0917bfde97 632 GetTimeOnAir( Eeprom.EepromData.DemoSettings.ModulationType ) ) + \
GregCr 0:9c0917bfde97 633 RX_TIMEOUT_MARGIN + RefreshScreenDelayMs;
GregCr 0:9c0917bfde97 634
GregCr 0:9c0917bfde97 635 printf( "Start RunDemoApplicationPingPong.\n\r" );
GregCr 0:9c0917bfde97 636 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 637 {
GregCr 0:9c0917bfde97 638 DemoInternalState = SEND_PING_MSG;
GregCr 0:9c0917bfde97 639 SendNextPacket.attach_us( &SendNextPacketEvent, \
GregCr 0:9c0917bfde97 640 ( Eeprom.EepromData.DemoSettings.InterPacketDelay * 1000 ) );
GregCr 0:9c0917bfde97 641 }
GregCr 0:9c0917bfde97 642 else
GregCr 0:9c0917bfde97 643 {
GregCr 0:9c0917bfde97 644 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 645 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 646 // Rx Single without timeout for the start
GregCr 0:9c0917bfde97 647 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 648 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, 0x0000 } );
GregCr 0:9c0917bfde97 649 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 650 }
GregCr 0:9c0917bfde97 651 }
GregCr 0:9c0917bfde97 652
GregCr 0:9c0917bfde97 653 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 654 {
GregCr 0:9c0917bfde97 655 switch( DemoInternalState )
GregCr 0:9c0917bfde97 656 {
GregCr 0:9c0917bfde97 657 case SEND_PING_MSG:
GregCr 0:9c0917bfde97 658 if( ( Eeprom.EepromData.DemoSettings.MaxNumPacket != 0 ) \
GregCr 0:9c0917bfde97 659 && ( Eeprom.EepromData.DemoSettings.CntPacketTx >= Eeprom.EepromData.DemoSettings.MaxNumPacket ) )
GregCr 0:9c0917bfde97 660 {
GregCr 0:9c0917bfde97 661 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 662 SendNext = false;
GregCr 0:9c0917bfde97 663 RX_LED = 0;
GregCr 0:9c0917bfde97 664 TX_LED = 0;
GregCr 0:9c0917bfde97 665 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 666 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 667 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 668 refreshDisplay = 1;
GregCr 0:9c0917bfde97 669 }
GregCr 0:9c0917bfde97 670 else
GregCr 0:9c0917bfde97 671 {
GregCr 0:9c0917bfde97 672 if( SendNext == true )
GregCr 0:9c0917bfde97 673 {
GregCr 0:9c0917bfde97 674 SendNext = false;
GregCr 0:9c0917bfde97 675
GregCr 0:9c0917bfde97 676 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 677 Eeprom.EepromData.DemoSettings.CntPacketTx++;
GregCr 0:9c0917bfde97 678 // Send the next PING frame
GregCr 0:9c0917bfde97 679 Buffer[0] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 680 Buffer[1] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 681 Buffer[2] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 682 Buffer[3] = ( Eeprom.EepromData.DemoSettings.CntPacketTx & 0xFF );
GregCr 0:9c0917bfde97 683 Buffer[4] = PingMsg[0];
GregCr 0:9c0917bfde97 684 Buffer[5] = PingMsg[1];
GregCr 0:9c0917bfde97 685 Buffer[6] = PingMsg[2];
GregCr 0:9c0917bfde97 686 Buffer[7] = PingMsg[3];
GregCr 0:9c0917bfde97 687 for( i = 8; i < Eeprom.EepromData.DemoSettings.PayloadLength; i++ )
GregCr 0:9c0917bfde97 688 {
GregCr 0:9c0917bfde97 689 Buffer[i] = i;
GregCr 0:9c0917bfde97 690 }
GregCr 0:9c0917bfde97 691 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 692 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 693 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 694 Radio.SendPayload( Buffer, Eeprom.EepromData.DemoSettings.PayloadLength, \
GregCr 0:9c0917bfde97 695 ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 696 Eeprom.EepromData.DemoSettings.InterPacketDelay - \
GregCr 0:9c0917bfde97 697 ( RX_TIMEOUT_MARGIN / 2 ) } );
GregCr 0:9c0917bfde97 698 }
GregCr 0:9c0917bfde97 699 }
GregCr 0:9c0917bfde97 700 break;
GregCr 0:9c0917bfde97 701
GregCr 0:9c0917bfde97 702 case APP_TX:
GregCr 0:9c0917bfde97 703 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 704 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 705 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 706 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 707 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 708 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 709 Eeprom.EepromData.DemoSettings.InterPacketDelay - \
GregCr 0:9c0917bfde97 710 ( RX_TIMEOUT_MARGIN / 2 ) } );
GregCr 0:9c0917bfde97 711 break;
GregCr 0:9c0917bfde97 712
GregCr 0:9c0917bfde97 713 case APP_RX:
GregCr 0:9c0917bfde97 714 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 715 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 0:9c0917bfde97 716 Radio.GetPacketStatus( &PacketStatus );
GregCr 0:9c0917bfde97 717 if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 718 {
GregCr 0:9c0917bfde97 719 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.LoRa.RssiPkt;
GregCr 0:9c0917bfde97 720 Eeprom.EepromData.DemoSettings.SnrValue = PacketStatus.LoRa.SnrPkt;
GregCr 0:9c0917bfde97 721 }
GregCr 0:9c0917bfde97 722 else if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 723 {
GregCr 0:9c0917bfde97 724 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Flrc.RssiSync;
GregCr 0:9c0917bfde97 725 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 726 }
GregCr 0:9c0917bfde97 727 else if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 728 {
GregCr 0:9c0917bfde97 729 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Gfsk.RssiSync;
GregCr 0:9c0917bfde97 730 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 731 }
GregCr 0:9c0917bfde97 732 if( ( BufferSize >= PINGPONG_SIZE ) && ( strncmp( ( const char* )( Buffer + 8 ), ( const char* )PongMsg, PINGPONG_SIZE ) == 0 ) )
GregCr 0:9c0917bfde97 733 {
GregCr 0:9c0917bfde97 734 ComputePingPongPayload( Buffer, BufferSize );
GregCr 0:9c0917bfde97 735 }
GregCr 0:9c0917bfde97 736 else
GregCr 0:9c0917bfde97 737 {
GregCr 0:9c0917bfde97 738 Eeprom.EepromData.DemoSettings.CntPacketRxKO++;
GregCr 0:9c0917bfde97 739 }
GregCr 0:9c0917bfde97 740 DemoInternalState = SEND_PING_MSG;
GregCr 0:9c0917bfde97 741 refreshDisplay = 1;
GregCr 0:9c0917bfde97 742 break;
GregCr 0:9c0917bfde97 743
GregCr 0:9c0917bfde97 744 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 745 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 746 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 747 Eeprom.EepromData.DemoSettings.CntPacketRxKO++;
GregCr 0:9c0917bfde97 748 DemoInternalState = SEND_PING_MSG;
GregCr 0:9c0917bfde97 749 refreshDisplay = 1;
GregCr 0:9c0917bfde97 750 break;
GregCr 0:9c0917bfde97 751
GregCr 0:9c0917bfde97 752 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 753 printf( "Failure: timeout in Tx is shorter than the packet time on air\n\r" );
GregCr 0:9c0917bfde97 754 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 755 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 756 refreshDisplay = 1;
GregCr 0:9c0917bfde97 757 break;
GregCr 0:9c0917bfde97 758
GregCr 0:9c0917bfde97 759 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 760 break;
GregCr 0:9c0917bfde97 761
GregCr 0:9c0917bfde97 762 default:
GregCr 0:9c0917bfde97 763 break;
GregCr 0:9c0917bfde97 764 }
GregCr 0:9c0917bfde97 765 }
GregCr 0:9c0917bfde97 766 else // SLAVE
GregCr 0:9c0917bfde97 767 {
GregCr 0:9c0917bfde97 768 switch( DemoInternalState )
GregCr 0:9c0917bfde97 769 {
GregCr 0:9c0917bfde97 770 case SEND_PONG_MSG:
GregCr 0:9c0917bfde97 771 wait_ms( RX_TX_TRANSITION_WAIT );
GregCr 0:9c0917bfde97 772
GregCr 0:9c0917bfde97 773 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 774 // Send the next PING frame
GregCr 0:9c0917bfde97 775 Buffer[0] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 776 Buffer[1] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 777 Buffer[2] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 778 Buffer[3] = ( Eeprom.EepromData.DemoSettings.CntPacketTx & 0xFF );
GregCr 0:9c0917bfde97 779 Buffer[4] = ( ( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 780 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 781 Buffer[5] = ( ( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 782 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 783 Buffer[6] = ( ( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 784 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 785 Buffer[7] = ( ( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 786 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) & 0xFF );
GregCr 0:9c0917bfde97 787 Buffer[8] = PongMsg[0];
GregCr 0:9c0917bfde97 788 Buffer[9] = PongMsg[1];
GregCr 0:9c0917bfde97 789 Buffer[10] = PongMsg[2];
GregCr 0:9c0917bfde97 790 Buffer[11] = PongMsg[3];
GregCr 0:9c0917bfde97 791 for( i = 12; i < Eeprom.EepromData.DemoSettings.PayloadLength; i++ )
GregCr 0:9c0917bfde97 792 {
GregCr 0:9c0917bfde97 793 Buffer[i] = i;
GregCr 0:9c0917bfde97 794 }
GregCr 0:9c0917bfde97 795 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 796 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 797 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 798 Radio.SendPayload( Buffer, Eeprom.EepromData.DemoSettings.PayloadLength, \
GregCr 0:9c0917bfde97 799 ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 800 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 801 break;
GregCr 0:9c0917bfde97 802
GregCr 0:9c0917bfde97 803 case APP_TX:
GregCr 0:9c0917bfde97 804 if( ( Eeprom.EepromData.DemoSettings.MaxNumPacket != 0 ) \
GregCr 0:9c0917bfde97 805 && ( ( Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 806 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) >= Eeprom.EepromData.DemoSettings.MaxNumPacket ) )
GregCr 0:9c0917bfde97 807 {
GregCr 0:9c0917bfde97 808 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 809 SendNext = false;
GregCr 0:9c0917bfde97 810 RX_LED = 0;
GregCr 0:9c0917bfde97 811 TX_LED = 0;
GregCr 0:9c0917bfde97 812 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 813 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 814 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 815 refreshDisplay = 1;
GregCr 0:9c0917bfde97 816 }
GregCr 0:9c0917bfde97 817 else
GregCr 0:9c0917bfde97 818 {
GregCr 0:9c0917bfde97 819 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 820 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 821 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 822 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 823 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 824 Radio.SetRx( ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 825 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 826 refreshDisplay = 1;
GregCr 0:9c0917bfde97 827 }
GregCr 0:9c0917bfde97 828 break;
GregCr 0:9c0917bfde97 829
GregCr 0:9c0917bfde97 830 case APP_RX:
GregCr 0:9c0917bfde97 831 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 832 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 833 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 0:9c0917bfde97 834 Radio.GetPacketStatus( &PacketStatus );
GregCr 0:9c0917bfde97 835 if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 836 {
GregCr 0:9c0917bfde97 837 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.LoRa.RssiPkt;
GregCr 0:9c0917bfde97 838 Eeprom.EepromData.DemoSettings.SnrValue = PacketStatus.LoRa.SnrPkt;
GregCr 0:9c0917bfde97 839 }
GregCr 0:9c0917bfde97 840 else if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 841 {
GregCr 0:9c0917bfde97 842 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Flrc.RssiSync;
GregCr 0:9c0917bfde97 843 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 844 }
GregCr 0:9c0917bfde97 845 else if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 846 {
GregCr 0:9c0917bfde97 847 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Gfsk.RssiSync;
GregCr 0:9c0917bfde97 848 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 849 }
GregCr 0:9c0917bfde97 850 if( ( BufferSize >= PINGPONG_SIZE ) && ( strncmp( ( const char* )( Buffer + 4 ), ( const char* )PingMsg, PINGPONG_SIZE ) == 0 ) )
GregCr 0:9c0917bfde97 851 {
GregCr 0:9c0917bfde97 852 ComputePingPongPayload( Buffer, BufferSize );
GregCr 0:9c0917bfde97 853 DemoInternalState = SEND_PONG_MSG;
GregCr 0:9c0917bfde97 854 }
GregCr 0:9c0917bfde97 855 else
GregCr 0:9c0917bfde97 856 {
GregCr 0:9c0917bfde97 857 Eeprom.EepromData.DemoSettings.CntPacketRxKO++;
GregCr 0:9c0917bfde97 858 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 859 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 860 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 861 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 862 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 863 refreshDisplay = 1;
GregCr 0:9c0917bfde97 864 }
GregCr 0:9c0917bfde97 865 break;
GregCr 0:9c0917bfde97 866
GregCr 0:9c0917bfde97 867 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 868 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 869 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 870 Eeprom.EepromData.DemoSettings.RxTimeOutCount++;
GregCr 0:9c0917bfde97 871 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 872 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 873 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 874 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 875 refreshDisplay = 1;
GregCr 0:9c0917bfde97 876 break;
GregCr 0:9c0917bfde97 877
GregCr 0:9c0917bfde97 878 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 879 printf( "Failure: timeout in Tx is shorter than the packet time on air\n\r" );
GregCr 0:9c0917bfde97 880 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 881 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 882 refreshDisplay = 1;
GregCr 0:9c0917bfde97 883 break;
GregCr 0:9c0917bfde97 884
GregCr 0:9c0917bfde97 885 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 886 break;
GregCr 0:9c0917bfde97 887
GregCr 0:9c0917bfde97 888 default:
GregCr 0:9c0917bfde97 889 break;
GregCr 0:9c0917bfde97 890 }
GregCr 0:9c0917bfde97 891 }
GregCr 0:9c0917bfde97 892 return refreshDisplay;
GregCr 0:9c0917bfde97 893 }
GregCr 0:9c0917bfde97 894
GregCr 0:9c0917bfde97 895 void ComputePingPongPayload( uint8_t *buffer, uint8_t bufferSize )
GregCr 0:9c0917bfde97 896 {
GregCr 0:9c0917bfde97 897 uint32_t i = 0;
GregCr 0:9c0917bfde97 898
GregCr 0:9c0917bfde97 899 PacketRxSequence = ( ( uint32_t )buffer[0] << 24 ) | \
GregCr 0:9c0917bfde97 900 ( ( uint32_t )buffer[1] << 16 ) | \
GregCr 0:9c0917bfde97 901 ( ( uint32_t )buffer[2] << 8 ) | \
GregCr 0:9c0917bfde97 902 buffer[3];
GregCr 0:9c0917bfde97 903
GregCr 0:9c0917bfde97 904 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 905 {
GregCr 0:9c0917bfde97 906 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave =
GregCr 0:9c0917bfde97 907 ( ( uint32_t )buffer[4] << 24 ) | \
GregCr 0:9c0917bfde97 908 ( ( uint32_t )buffer[5] << 16 ) | \
GregCr 0:9c0917bfde97 909 ( ( uint32_t )buffer[6] << 8 ) | \
GregCr 0:9c0917bfde97 910 buffer[7];
GregCr 0:9c0917bfde97 911 if( PacketRxSequence > Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave )
GregCr 0:9c0917bfde97 912 {
GregCr 0:9c0917bfde97 913 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = PacketRxSequence - \
GregCr 0:9c0917bfde97 914 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave;
GregCr 0:9c0917bfde97 915 }
GregCr 0:9c0917bfde97 916 else
GregCr 0:9c0917bfde97 917 {
GregCr 0:9c0917bfde97 918 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = 0;
GregCr 0:9c0917bfde97 919 }
GregCr 0:9c0917bfde97 920
GregCr 0:9c0917bfde97 921 if( PacketRxSequence == Eeprom.EepromData.DemoSettings.CntPacketTx )
GregCr 0:9c0917bfde97 922 {
GregCr 0:9c0917bfde97 923 Eeprom.EepromData.DemoSettings.CntPacketRxOK += 1;
GregCr 0:9c0917bfde97 924 }
GregCr 0:9c0917bfde97 925 else
GregCr 0:9c0917bfde97 926 {
GregCr 0:9c0917bfde97 927 Eeprom.EepromData.DemoSettings.CntPacketRxKO += 1;
GregCr 0:9c0917bfde97 928 }
GregCr 0:9c0917bfde97 929 }
GregCr 0:9c0917bfde97 930 else
GregCr 0:9c0917bfde97 931 {
GregCr 0:9c0917bfde97 932 Eeprom.EepromData.DemoSettings.CntPacketRxOK += 1;
GregCr 0:9c0917bfde97 933 if( ( PacketRxSequence <= PacketRxSequencePrev ) || \
GregCr 0:9c0917bfde97 934 ( PacketRxSequencePrev == 0 ) )
GregCr 0:9c0917bfde97 935 {
GregCr 0:9c0917bfde97 936 // Sequence went back => resynchronization
GregCr 0:9c0917bfde97 937 // Don't count missed packets this time
GregCr 0:9c0917bfde97 938 i = 0;
GregCr 0:9c0917bfde97 939 }
GregCr 0:9c0917bfde97 940 else
GregCr 0:9c0917bfde97 941 {
GregCr 0:9c0917bfde97 942 // Determine number of missed packets
GregCr 0:9c0917bfde97 943 i = PacketRxSequence - PacketRxSequencePrev - 1;
GregCr 0:9c0917bfde97 944 }
GregCr 0:9c0917bfde97 945 // Be ready for the next
GregCr 0:9c0917bfde97 946 PacketRxSequencePrev = PacketRxSequence;
GregCr 0:9c0917bfde97 947 Eeprom.EepromData.DemoSettings.CntPacketTx = PacketRxSequence;
GregCr 0:9c0917bfde97 948 // increment 'missed' counter for the RX session
GregCr 0:9c0917bfde97 949 Eeprom.EepromData.DemoSettings.CntPacketRxKO += i;
GregCr 0:9c0917bfde97 950 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 951 }
GregCr 0:9c0917bfde97 952 }
GregCr 0:9c0917bfde97 953
GregCr 0:9c0917bfde97 954 // ************************ Ranging Demo *****************************
GregCr 0:9c0917bfde97 955 // * *
GregCr 0:9c0917bfde97 956 // * *
GregCr 0:9c0917bfde97 957 // * *
GregCr 0:9c0917bfde97 958 // *****************************************************************************
GregCr 0:9c0917bfde97 959 uint8_t RunDemoApplicationRanging( void )
GregCr 0:9c0917bfde97 960 {
GregCr 0:9c0917bfde97 961 uint8_t refreshDisplay = 0;
GregCr 0:9c0917bfde97 962
GregCr 0:9c0917bfde97 963 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 964 {
GregCr 0:9c0917bfde97 965 return 0; // quit without refresh display
GregCr 0:9c0917bfde97 966 }
GregCr 0:9c0917bfde97 967
GregCr 0:9c0917bfde97 968 if( DemoRunning == false )
GregCr 0:9c0917bfde97 969 {
GregCr 0:9c0917bfde97 970 DemoRunning = true;
GregCr 0:9c0917bfde97 971 TX_LED = 0;
GregCr 0:9c0917bfde97 972 RX_LED = 0;
GregCr 0:9c0917bfde97 973 ANT_SW = 1;
GregCr 0:9c0917bfde97 974
GregCr 0:9c0917bfde97 975 printf( "Start RunDemoApplicationRanging\r\n" );
GregCr 0:9c0917bfde97 976
GregCr 0:9c0917bfde97 977 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 978 Eeprom.EepromData.DemoSettings.RngFei = 0.0;
GregCr 0:9c0917bfde97 979 Eeprom.EepromData.DemoSettings.RngStatus = RNG_INIT;
GregCr 0:9c0917bfde97 980 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 981
GregCr 0:9c0917bfde97 982 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 983 {
GregCr 0:9c0917bfde97 984 Eeprom.EepromData.DemoSettings.InterPacketDelay = RefreshScreenDelayMs;
GregCr 8:c0a5f53fe196 985 Radio.SetDioIrqParams( IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_TIMEOUT,
GregCr 8:c0a5f53fe196 986 IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_TIMEOUT,
GregCr 0:9c0917bfde97 987 IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 988 Eeprom.EepromData.DemoSettings.RngDistance = 0.0;
GregCr 0:9c0917bfde97 989 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 990 }
GregCr 0:9c0917bfde97 991 else
GregCr 0:9c0917bfde97 992 {
GregCr 0:9c0917bfde97 993 Radio.SetDioIrqParams( IRQ_RADIO_ALL, IRQ_RADIO_ALL, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 994 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 995 }
GregCr 0:9c0917bfde97 996 }
GregCr 0:9c0917bfde97 997
GregCr 0:9c0917bfde97 998 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 999 {
GregCr 0:9c0917bfde97 1000 switch( DemoInternalState )
GregCr 0:9c0917bfde97 1001 {
GregCr 0:9c0917bfde97 1002 case APP_RANGING_CONFIG:
GregCr 0:9c0917bfde97 1003 if( Eeprom.EepromData.DemoSettings.HoldDemo == false )
GregCr 0:9c0917bfde97 1004 {
GregCr 0:9c0917bfde97 1005 Eeprom.EepromData.DemoSettings.RngStatus = RNG_INIT;
GregCr 0:9c0917bfde97 1006 Eeprom.EepromData.DemoSettings.CntPacketTx++;
GregCr 0:9c0917bfde97 1007 ModulationParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1008 PacketParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1009 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1010 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1011 memcpy( &( ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_RNG_CODERATE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1012 memcpy( &( PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1013 memcpy( &( PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1014 PacketParams.Params.LoRa.PayloadLength = 7;
GregCr 8:c0a5f53fe196 1015 memcpy( &( PacketParams.Params.LoRa.Crc ), Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1016 memcpy( &( PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1017 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 0:9c0917bfde97 1018 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1019 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1020 Radio.SetRfFrequency( Eeprom.EepromData.DemoSettings.Frequency );
GregCr 0:9c0917bfde97 1021 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 1022 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = 0;
GregCr 0:9c0917bfde97 1023 MeasuredChannels = 0;
GregCr 0:9c0917bfde97 1024 CurrentChannel = 0;
GregCr 0:9c0917bfde97 1025 Buffer[0] = ( Eeprom.EepromData.DemoSettings.RngAddress >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 1026 Buffer[1] = ( Eeprom.EepromData.DemoSettings.RngAddress >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 1027 Buffer[2] = ( Eeprom.EepromData.DemoSettings.RngAddress >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 1028 Buffer[3] = ( Eeprom.EepromData.DemoSettings.RngAddress & 0xFF );
GregCr 0:9c0917bfde97 1029 Buffer[4] = CurrentChannel; // set the first channel to use
GregCr 0:9c0917bfde97 1030 Buffer[5] = Eeprom.EepromData.DemoSettings.RngAntenna; // set the antenna strategy
GregCr 0:9c0917bfde97 1031 Buffer[6] = Eeprom.EepromData.DemoSettings.RngRequestCount; // set the number of hops
GregCr 0:9c0917bfde97 1032 TX_LED = 1;
GregCr 0:9c0917bfde97 1033 Radio.SendPayload( Buffer, PacketParams.Params.LoRa.PayloadLength, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, RNG_COM_TIMEOUT } );
GregCr 0:9c0917bfde97 1034 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1035 }
GregCr 0:9c0917bfde97 1036 break;
GregCr 0:9c0917bfde97 1037
GregCr 0:9c0917bfde97 1038 case APP_RNG:
GregCr 0:9c0917bfde97 1039 if( SendNext == true )
GregCr 0:9c0917bfde97 1040 {
GregCr 0:9c0917bfde97 1041 SendNext = false;
GregCr 0:9c0917bfde97 1042 MeasuredChannels++;
GregCr 0:9c0917bfde97 1043 if( MeasuredChannels <= Eeprom.EepromData.DemoSettings.RngRequestCount )
GregCr 0:9c0917bfde97 1044 {
GregCr 0:9c0917bfde97 1045 Radio.SetRfFrequency( Channels[CurrentChannel] );
GregCr 0:9c0917bfde97 1046 TX_LED = 1;
GregCr 0:9c0917bfde97 1047 switch( Eeprom.EepromData.DemoSettings.RngAntenna )
GregCr 0:9c0917bfde97 1048 {
GregCr 0:9c0917bfde97 1049 case DEMO_RNG_ANT_1:
GregCr 7:bc2f0fe8056f 1050 //ANT_SW = 1; // ANT1
GregCr 7:bc2f0fe8056f 1051 Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
GregCr 0:9c0917bfde97 1052 CurrentChannel++;
GregCr 0:9c0917bfde97 1053 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1054 {
GregCr 0:9c0917bfde97 1055 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1056 }
GregCr 0:9c0917bfde97 1057 break;
GregCr 0:9c0917bfde97 1058
GregCr 0:9c0917bfde97 1059 case DEMO_RNG_ANT_2:
GregCr 7:bc2f0fe8056f 1060 //ANT_SW = 0; // ANT2
GregCr 7:bc2f0fe8056f 1061 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
GregCr 0:9c0917bfde97 1062 CurrentChannel++;
GregCr 0:9c0917bfde97 1063 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1064 {
GregCr 0:9c0917bfde97 1065 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1066 }
GregCr 0:9c0917bfde97 1067 break;
GregCr 0:9c0917bfde97 1068
GregCr 0:9c0917bfde97 1069 case DEMO_RNG_ANT_BOTH:
GregCr 0:9c0917bfde97 1070 if( ANT_SW == 1 )
GregCr 0:9c0917bfde97 1071 {
GregCr 7:bc2f0fe8056f 1072 //ANT_SW = 0;
GregCr 7:bc2f0fe8056f 1073 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
GregCr 0:9c0917bfde97 1074 }
GregCr 0:9c0917bfde97 1075 else
GregCr 0:9c0917bfde97 1076 {
GregCr 7:bc2f0fe8056f 1077 //ANT_SW = 1;
GregCr 7:bc2f0fe8056f 1078 Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
GregCr 0:9c0917bfde97 1079 CurrentChannel++;
GregCr 0:9c0917bfde97 1080 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1081 {
GregCr 0:9c0917bfde97 1082 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1083 }
GregCr 0:9c0917bfde97 1084 }
GregCr 0:9c0917bfde97 1085 break;
GregCr 0:9c0917bfde97 1086 }
GregCr 0:9c0917bfde97 1087 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 1088 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1089 Radio.SetTx( ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, 0xFFFF } );
GregCr 0:9c0917bfde97 1090 }
GregCr 0:9c0917bfde97 1091 else
GregCr 0:9c0917bfde97 1092 {
GregCr 0:9c0917bfde97 1093 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = CheckDistance( );
GregCr 0:9c0917bfde97 1094 refreshDisplay = 1;
GregCr 0:9c0917bfde97 1095 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1096 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 1097 SendNext = false;
GregCr 0:9c0917bfde97 1098 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1099 }
GregCr 0:9c0917bfde97 1100 }
GregCr 0:9c0917bfde97 1101 break;
GregCr 0:9c0917bfde97 1102
GregCr 0:9c0917bfde97 1103 case APP_RANGING_DONE:
GregCr 0:9c0917bfde97 1104 TX_LED = 0;
GregCr 0:9c0917bfde97 1105 RawRngResults[RngResultIndex++] = Radio.GetRangingResult( RANGING_RESULT_RAW );
GregCr 0:9c0917bfde97 1106 Eeprom.EepromData.DemoSettings.CntPacketRxOK++;
GregCr 0:9c0917bfde97 1107 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1108 break;
GregCr 0:9c0917bfde97 1109
GregCr 0:9c0917bfde97 1110 case APP_RANGING_TIMEOUT:
GregCr 0:9c0917bfde97 1111 TX_LED = 0;
GregCr 0:9c0917bfde97 1112 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1113 break;
GregCr 0:9c0917bfde97 1114
GregCr 0:9c0917bfde97 1115 case APP_RX:
GregCr 0:9c0917bfde97 1116 RX_LED = 0;
GregCr 0:9c0917bfde97 1117 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_INIT )
GregCr 0:9c0917bfde97 1118 {
GregCr 0:9c0917bfde97 1119 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 0:9c0917bfde97 1120 if( BufferSize > 0 )
GregCr 0:9c0917bfde97 1121 {
GregCr 0:9c0917bfde97 1122 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 1123 Eeprom.EepromData.DemoSettings.RngStatus = RNG_PROCESS;
GregCr 0:9c0917bfde97 1124 Eeprom.EepromData.DemoSettings.RngFei = ( double )( ( ( int32_t )Buffer[4] << 24 ) | \
GregCr 0:9c0917bfde97 1125 ( ( int32_t )Buffer[5] << 16 ) | \
GregCr 0:9c0917bfde97 1126 ( ( int32_t )Buffer[6] << 8 ) | \
GregCr 0:9c0917bfde97 1127 Buffer[7] );
GregCr 0:9c0917bfde97 1128 Eeprom.EepromData.DemoSettings.RssiValue = Buffer[8]; // for ranging post-traitment (since V3 only)
GregCr 0:9c0917bfde97 1129 ModulationParams.PacketType = PACKET_TYPE_RANGING;
GregCr 0:9c0917bfde97 1130 PacketParams.PacketType = PACKET_TYPE_RANGING;
GregCr 0:9c0917bfde97 1131
GregCr 0:9c0917bfde97 1132 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1133 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1134 memcpy( &( ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_RNG_CODERATE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1135 memcpy( &( PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1136 memcpy( &( PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1137 PacketParams.Params.LoRa.PayloadLength = 10;
GregCr 8:c0a5f53fe196 1138 memcpy( &( PacketParams.Params.LoRa.Crc ), Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1139 memcpy( &( PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1140
GregCr 0:9c0917bfde97 1141 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 0:9c0917bfde97 1142 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1143 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1144 Radio.SetRangingRequestAddress( Eeprom.EepromData.DemoSettings.RngAddress );
GregCr 0:9c0917bfde97 1145 Radio.SetRangingCalibration( Eeprom.EepromData.DemoSettings.RngCalib );
GregCr 0:9c0917bfde97 1146 Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
GregCr 0:9c0917bfde97 1147
GregCr 0:9c0917bfde97 1148 MeasuredChannels = 0;
GregCr 0:9c0917bfde97 1149 RngResultIndex = 0;
GregCr 0:9c0917bfde97 1150 SendNextPacket.attach_us( &SendNextPacketEvent, Eeprom.EepromData.DemoSettings.RngReqDelay * 1000 );
GregCr 0:9c0917bfde97 1151 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1152 }
GregCr 0:9c0917bfde97 1153 else
GregCr 0:9c0917bfde97 1154 {
GregCr 0:9c0917bfde97 1155 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1156 }
GregCr 0:9c0917bfde97 1157 }
GregCr 0:9c0917bfde97 1158 else
GregCr 0:9c0917bfde97 1159 {
GregCr 0:9c0917bfde97 1160 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1161 }
GregCr 0:9c0917bfde97 1162 break;
GregCr 0:9c0917bfde97 1163
GregCr 0:9c0917bfde97 1164 case APP_TX:
GregCr 0:9c0917bfde97 1165 TX_LED = 0;
GregCr 0:9c0917bfde97 1166 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_INIT )
GregCr 0:9c0917bfde97 1167 {
GregCr 0:9c0917bfde97 1168 RX_LED = 1;
GregCr 0:9c0917bfde97 1169 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RNG_COM_TIMEOUT } );
GregCr 0:9c0917bfde97 1170 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1171 }
GregCr 0:9c0917bfde97 1172 else
GregCr 0:9c0917bfde97 1173 {
GregCr 0:9c0917bfde97 1174 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1175 }
GregCr 0:9c0917bfde97 1176 break;
GregCr 0:9c0917bfde97 1177
GregCr 0:9c0917bfde97 1178 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 1179 RX_LED = 0;
GregCr 0:9c0917bfde97 1180 Eeprom.EepromData.DemoSettings.RngStatus = RNG_TIMEOUT;
GregCr 0:9c0917bfde97 1181 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1182 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 1183 refreshDisplay = 1; // display error on token color (RNG_TIMEOUT)
GregCr 0:9c0917bfde97 1184 break;
GregCr 0:9c0917bfde97 1185
GregCr 0:9c0917bfde97 1186 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 1187 RX_LED = 0;
GregCr 0:9c0917bfde97 1188 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1189 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 8:c0a5f53fe196 1190 refreshDisplay = 1; // display error on token color (RNG_TIMEOUT)
GregCr 0:9c0917bfde97 1191 break;
GregCr 0:9c0917bfde97 1192
GregCr 0:9c0917bfde97 1193 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 1194 TX_LED = 0;
GregCr 0:9c0917bfde97 1195 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1196 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 8:c0a5f53fe196 1197 refreshDisplay = 1; // display error on token color (RNG_TIMEOUT)
GregCr 0:9c0917bfde97 1198 break;
GregCr 0:9c0917bfde97 1199
GregCr 0:9c0917bfde97 1200 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 1201 break;
GregCr 0:9c0917bfde97 1202
GregCr 0:9c0917bfde97 1203 default:
GregCr 0:9c0917bfde97 1204 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1205 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 1206 break;
GregCr 0:9c0917bfde97 1207 }
GregCr 0:9c0917bfde97 1208 }
GregCr 0:9c0917bfde97 1209 else // Slave
GregCr 0:9c0917bfde97 1210 {
GregCr 0:9c0917bfde97 1211 switch( DemoInternalState )
GregCr 0:9c0917bfde97 1212 {
GregCr 0:9c0917bfde97 1213 case APP_RANGING_CONFIG:
GregCr 0:9c0917bfde97 1214 Eeprom.EepromData.DemoSettings.RngStatus = RNG_INIT;
GregCr 0:9c0917bfde97 1215 ModulationParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1216 PacketParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1217 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1218 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1219 memcpy( &( ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_RNG_CODERATE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1220 memcpy( &( PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1221 memcpy( &( PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1222 PacketParams.Params.LoRa.PayloadLength = 9;
GregCr 8:c0a5f53fe196 1223 memcpy( &( PacketParams.Params.LoRa.Crc ), Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1224 memcpy( &( PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1225 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 0:9c0917bfde97 1226 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1227 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1228 Radio.SetRfFrequency( Eeprom.EepromData.DemoSettings.Frequency );
GregCr 0:9c0917bfde97 1229 RX_LED = 1;
GregCr 0:9c0917bfde97 1230 // use listen mode here instead of rx continuous
GregCr 0:9c0917bfde97 1231 Radio.SetRx( ( TickTime_t ) { RADIO_TICK_SIZE_1000_US, 0xFFFF } );
GregCr 0:9c0917bfde97 1232 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1233 break;
GregCr 0:9c0917bfde97 1234
GregCr 0:9c0917bfde97 1235 case APP_RNG:
GregCr 0:9c0917bfde97 1236 if( SendNext == true )
GregCr 0:9c0917bfde97 1237 {
GregCr 0:9c0917bfde97 1238 SendNext = false;
GregCr 0:9c0917bfde97 1239 MeasuredChannels++;
GregCr 0:9c0917bfde97 1240 if( MeasuredChannels <= Eeprom.EepromData.DemoSettings.RngRequestCount )
GregCr 0:9c0917bfde97 1241 {
GregCr 0:9c0917bfde97 1242 Radio.SetRfFrequency( Channels[CurrentChannel] );
GregCr 0:9c0917bfde97 1243 RX_LED = 1;
GregCr 0:9c0917bfde97 1244 switch( Eeprom.EepromData.DemoSettings.RngAntenna )
GregCr 0:9c0917bfde97 1245 {
GregCr 0:9c0917bfde97 1246 case DEMO_RNG_ANT_1:
GregCr 8:c0a5f53fe196 1247 //ANT_SW = 1; // ANT1
GregCr 8:c0a5f53fe196 1248 Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
GregCr 0:9c0917bfde97 1249 CurrentChannel++;
GregCr 0:9c0917bfde97 1250 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1251 {
GregCr 0:9c0917bfde97 1252 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1253 }
GregCr 0:9c0917bfde97 1254 break;
GregCr 0:9c0917bfde97 1255
GregCr 0:9c0917bfde97 1256 case DEMO_RNG_ANT_2:
GregCr 8:c0a5f53fe196 1257 //ANT_SW = 0; // ANT2
GregCr 8:c0a5f53fe196 1258 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
GregCr 0:9c0917bfde97 1259 CurrentChannel++;
GregCr 0:9c0917bfde97 1260 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1261 {
GregCr 0:9c0917bfde97 1262 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1263 }
GregCr 0:9c0917bfde97 1264 break;
GregCr 0:9c0917bfde97 1265
GregCr 0:9c0917bfde97 1266 case DEMO_RNG_ANT_BOTH:
GregCr 0:9c0917bfde97 1267 if( ANT_SW == 1 )
GregCr 0:9c0917bfde97 1268 {
GregCr 8:c0a5f53fe196 1269 //ANT_SW = 0;
GregCr 8:c0a5f53fe196 1270 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
GregCr 0:9c0917bfde97 1271 }
GregCr 0:9c0917bfde97 1272 else
GregCr 0:9c0917bfde97 1273 {
GregCr 8:c0a5f53fe196 1274 //ANT_SW = 1;
GregCr 8:c0a5f53fe196 1275 Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
GregCr 0:9c0917bfde97 1276 CurrentChannel++;
GregCr 0:9c0917bfde97 1277 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1278 {
GregCr 0:9c0917bfde97 1279 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1280 }
GregCr 0:9c0917bfde97 1281 }
GregCr 0:9c0917bfde97 1282 break;
GregCr 0:9c0917bfde97 1283 }
GregCr 0:9c0917bfde97 1284 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 1285 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1286 Radio.SetRx( ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, Eeprom.EepromData.DemoSettings.RngReqDelay } );
GregCr 0:9c0917bfde97 1287 }
GregCr 0:9c0917bfde97 1288 else
GregCr 0:9c0917bfde97 1289 {
GregCr 0:9c0917bfde97 1290 refreshDisplay = 1;
GregCr 0:9c0917bfde97 1291 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1292 Eeprom.EepromData.DemoSettings.RngStatus = RNG_VALID;
GregCr 0:9c0917bfde97 1293 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1294 }
GregCr 0:9c0917bfde97 1295 }
GregCr 0:9c0917bfde97 1296 break;
GregCr 0:9c0917bfde97 1297
GregCr 0:9c0917bfde97 1298 case APP_RANGING_DONE:
GregCr 0:9c0917bfde97 1299 RX_LED = 0;
GregCr 0:9c0917bfde97 1300 Eeprom.EepromData.DemoSettings.CntPacketRxOK++;
GregCr 0:9c0917bfde97 1301 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1302 break;
GregCr 0:9c0917bfde97 1303
GregCr 0:9c0917bfde97 1304 case APP_RANGING_TIMEOUT:
GregCr 0:9c0917bfde97 1305 RX_LED = 0;
GregCr 0:9c0917bfde97 1306 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1307 break;
GregCr 0:9c0917bfde97 1308
GregCr 0:9c0917bfde97 1309 case APP_RX:
GregCr 0:9c0917bfde97 1310 RX_LED = 0;
GregCr 0:9c0917bfde97 1311 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_INIT )
GregCr 0:9c0917bfde97 1312 {
GregCr 0:9c0917bfde97 1313 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 1:dbcb3698f73a 1314 Radio.GetPacketStatus( &PacketStatus );
GregCr 0:9c0917bfde97 1315 if( ( BufferSize > 0 ) && \
GregCr 0:9c0917bfde97 1316 ( Buffer[0] == ( ( Eeprom.EepromData.DemoSettings.RngAddress >> 24 ) & 0xFF ) ) && \
GregCr 0:9c0917bfde97 1317 ( Buffer[1] == ( ( Eeprom.EepromData.DemoSettings.RngAddress >> 16 ) & 0xFF ) ) && \
GregCr 0:9c0917bfde97 1318 ( Buffer[2] == ( ( Eeprom.EepromData.DemoSettings.RngAddress >> 8 ) & 0xFF ) ) && \
GregCr 0:9c0917bfde97 1319 ( Buffer[3] == ( Eeprom.EepromData.DemoSettings.RngAddress & 0xFF ) ) )
GregCr 0:9c0917bfde97 1320 {
GregCr 0:9c0917bfde97 1321 Eeprom.EepromData.DemoSettings.RngFei = Radio.GetFrequencyError( );
GregCr 1:dbcb3698f73a 1322 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.LoRa.RssiPkt;
GregCr 0:9c0917bfde97 1323 Eeprom.EepromData.DemoSettings.CntPacketTx++;
GregCr 0:9c0917bfde97 1324 CurrentChannel = Buffer[4];
GregCr 0:9c0917bfde97 1325 Eeprom.EepromData.DemoSettings.RngAntenna = Buffer[5];
GregCr 0:9c0917bfde97 1326 Eeprom.EepromData.DemoSettings.RngRequestCount = Buffer[6];
GregCr 0:9c0917bfde97 1327 wait_us( 10 );
GregCr 0:9c0917bfde97 1328 Buffer[4] = ( ( ( int32_t )Eeprom.EepromData.DemoSettings.RngFei ) >> 24 ) & 0xFF ;
GregCr 0:9c0917bfde97 1329 Buffer[5] = ( ( ( int32_t )Eeprom.EepromData.DemoSettings.RngFei ) >> 16 ) & 0xFF ;
GregCr 0:9c0917bfde97 1330 Buffer[6] = ( ( ( int32_t )Eeprom.EepromData.DemoSettings.RngFei ) >> 8 ) & 0xFF ;
GregCr 0:9c0917bfde97 1331 Buffer[7] = ( ( ( int32_t )Eeprom.EepromData.DemoSettings.RngFei ) & 0xFF );
GregCr 0:9c0917bfde97 1332 Buffer[8] = Eeprom.EepromData.DemoSettings.RssiValue;
GregCr 0:9c0917bfde97 1333 TX_LED = 1;
GregCr 0:9c0917bfde97 1334 Radio.SendPayload( Buffer, 9, ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, RNG_COM_TIMEOUT } );
GregCr 0:9c0917bfde97 1335 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1336 }
GregCr 0:9c0917bfde97 1337 }
GregCr 0:9c0917bfde97 1338 else
GregCr 0:9c0917bfde97 1339 {
GregCr 0:9c0917bfde97 1340 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1341 }
GregCr 0:9c0917bfde97 1342 break;
GregCr 0:9c0917bfde97 1343
GregCr 0:9c0917bfde97 1344 case APP_TX:
GregCr 0:9c0917bfde97 1345 TX_LED = 0;
GregCr 0:9c0917bfde97 1346 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_INIT )
GregCr 0:9c0917bfde97 1347 {
GregCr 0:9c0917bfde97 1348 Eeprom.EepromData.DemoSettings.RngStatus = RNG_PROCESS;
GregCr 0:9c0917bfde97 1349
GregCr 0:9c0917bfde97 1350 ModulationParams.PacketType = PACKET_TYPE_RANGING;
GregCr 0:9c0917bfde97 1351 PacketParams.PacketType = PACKET_TYPE_RANGING;
GregCr 0:9c0917bfde97 1352
GregCr 0:9c0917bfde97 1353 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1354 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1355 memcpy( &( ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_RNG_CODERATE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1356 memcpy( &( PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1357 memcpy( &( PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1358 PacketParams.Params.LoRa.PayloadLength = 10;
GregCr 8:c0a5f53fe196 1359 memcpy( &( PacketParams.Params.LoRa.Crc ), Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1360 memcpy( &( PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1361
GregCr 0:9c0917bfde97 1362 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 4:e9daf4ed7b4c 1363
GregCr 0:9c0917bfde97 1364 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1365 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1366 Radio.SetDeviceRangingAddress( Eeprom.EepromData.DemoSettings.RngAddress );
GregCr 0:9c0917bfde97 1367 Radio.SetRangingCalibration( Eeprom.EepromData.DemoSettings.RngCalib );
GregCr 0:9c0917bfde97 1368 Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
GregCr 0:9c0917bfde97 1369 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 1370 MeasuredChannels = 0;
GregCr 0:9c0917bfde97 1371 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave = 0;
GregCr 0:9c0917bfde97 1372 SendNextPacket.attach_us( &SendNextPacketEvent, Eeprom.EepromData.DemoSettings.RngReqDelay * 1000 );
GregCr 0:9c0917bfde97 1373 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1374 }
GregCr 0:9c0917bfde97 1375 else
GregCr 0:9c0917bfde97 1376 {
GregCr 0:9c0917bfde97 1377 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1378 }
GregCr 0:9c0917bfde97 1379 break;
GregCr 0:9c0917bfde97 1380
GregCr 0:9c0917bfde97 1381 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 1382 RX_LED = 0;
GregCr 0:9c0917bfde97 1383 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1384 break;
GregCr 0:9c0917bfde97 1385
GregCr 0:9c0917bfde97 1386 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 1387 RX_LED = 0;
GregCr 0:9c0917bfde97 1388 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1389 break;
GregCr 0:9c0917bfde97 1390
GregCr 0:9c0917bfde97 1391 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 1392 TX_LED = 0;
GregCr 0:9c0917bfde97 1393 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1394 break;
GregCr 0:9c0917bfde97 1395
GregCr 0:9c0917bfde97 1396 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 1397 if( Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave > DEMO_RNG_CHANNELS_COUNT_MAX )
GregCr 0:9c0917bfde97 1398 {
GregCr 0:9c0917bfde97 1399 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave = 0;
GregCr 0:9c0917bfde97 1400 refreshDisplay = 1;
GregCr 0:9c0917bfde97 1401 RX_LED = 0;
GregCr 0:9c0917bfde97 1402 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1403 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1404 }
GregCr 0:9c0917bfde97 1405 break;
GregCr 0:9c0917bfde97 1406
GregCr 0:9c0917bfde97 1407 default:
GregCr 0:9c0917bfde97 1408 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1409 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1410 break;
GregCr 0:9c0917bfde97 1411 }
GregCr 0:9c0917bfde97 1412 }
GregCr 0:9c0917bfde97 1413 return refreshDisplay;
GregCr 0:9c0917bfde97 1414 }
GregCr 0:9c0917bfde97 1415
GregCr 0:9c0917bfde97 1416 // ************************ Utils ****************************
GregCr 0:9c0917bfde97 1417 // * *
GregCr 0:9c0917bfde97 1418 // * *
GregCr 0:9c0917bfde97 1419 // * *
GregCr 0:9c0917bfde97 1420 // *****************************************************************************
GregCr 0:9c0917bfde97 1421
GregCr 0:9c0917bfde97 1422 void InitDemoApplication( void )
GregCr 0:9c0917bfde97 1423 {
GregCr 0:9c0917bfde97 1424 RX_LED = 1;
GregCr 0:9c0917bfde97 1425 TX_LED = 1;
GregCr 0:9c0917bfde97 1426
GregCr 0:9c0917bfde97 1427 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 1428
GregCr 0:9c0917bfde97 1429 wait_ms( 500 ); // wait for on board DC/DC start-up time
GregCr 0:9c0917bfde97 1430
GregCr 0:9c0917bfde97 1431 Radio.Init( );
GregCr 0:9c0917bfde97 1432
GregCr 0:9c0917bfde97 1433 // Can also be set in LDO mode but consume more power
GregCr 0:9c0917bfde97 1434 Radio.SetRegulatorMode( ( RadioRegulatorModes_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
GregCr 0:9c0917bfde97 1435 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 1436
GregCr 0:9c0917bfde97 1437 memset( &Buffer, 0x00, BufferSize );
GregCr 0:9c0917bfde97 1438
GregCr 0:9c0917bfde97 1439 RX_LED = 0;
GregCr 0:9c0917bfde97 1440 TX_LED = 0;
GregCr 0:9c0917bfde97 1441
GregCr 0:9c0917bfde97 1442 PacketRxSequence = 0;
GregCr 0:9c0917bfde97 1443 PacketRxSequencePrev = 0;
GregCr 0:9c0917bfde97 1444 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 1445 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 1446 Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0;
GregCr 0:9c0917bfde97 1447 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 1448 }
GregCr 0:9c0917bfde97 1449
GregCr 0:9c0917bfde97 1450 void StopDemoApplication( void )
GregCr 0:9c0917bfde97 1451 {
GregCr 0:9c0917bfde97 1452 if( DemoRunning == true )
GregCr 0:9c0917bfde97 1453 {
GregCr 0:9c0917bfde97 1454 __disable_irq( ); // Disable Interrupts
GregCr 0:9c0917bfde97 1455
GregCr 0:9c0917bfde97 1456 printf( "StopDemoApplication\n\r" );
GregCr 0:9c0917bfde97 1457 if( Radio.GetOpMode( ) == MODE_SLEEP )
GregCr 0:9c0917bfde97 1458 {
GregCr 5:a0f5842fb337 1459 Radio.Wakeup( );
GregCr 0:9c0917bfde97 1460 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 1461 }
GregCr 0:9c0917bfde97 1462 RX_LED = 0;
GregCr 0:9c0917bfde97 1463 TX_LED = 0;
GregCr 0:9c0917bfde97 1464 DemoRunning = false;
GregCr 0:9c0917bfde97 1465 SendNext = false;
GregCr 0:9c0917bfde97 1466 PacketRxSequence = 0;
GregCr 0:9c0917bfde97 1467 PacketRxSequencePrev = 0;
GregCr 0:9c0917bfde97 1468 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 1469 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 1470 Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0;
GregCr 0:9c0917bfde97 1471 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 1472
GregCr 0:9c0917bfde97 1473 Radio.SetAutoFs( false );
GregCr 0:9c0917bfde97 1474 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1475 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 1476 Radio.ClearIrqStatus( IRQ_RADIO_ALL );
GregCr 0:9c0917bfde97 1477 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1478
GregCr 0:9c0917bfde97 1479 __enable_irq( ); // Enable Interrupts
GregCr 0:9c0917bfde97 1480 }
GregCr 0:9c0917bfde97 1481 }
GregCr 0:9c0917bfde97 1482
GregCr 0:9c0917bfde97 1483 /*
GregCr 0:9c0917bfde97 1484 * Function still being implemented >>> To be completed
GregCr 0:9c0917bfde97 1485 * WARNING: Computation is in float and his really slow
GregCr 0:9c0917bfde97 1486 * LongInterLeaving vs LegacyInterLeaving has no influence on TimeOnAir.
GregCr 0:9c0917bfde97 1487 */
GregCr 0:9c0917bfde97 1488 uint16_t GetTimeOnAir( uint8_t modulation )
GregCr 0:9c0917bfde97 1489 {
GregCr 0:9c0917bfde97 1490 uint16_t result = 2000;
GregCr 0:9c0917bfde97 1491
GregCr 0:9c0917bfde97 1492 if( modulation == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 1493 {
GregCr 0:9c0917bfde97 1494 double bw = 0.0;
GregCr 0:9c0917bfde97 1495
GregCr 0:9c0917bfde97 1496 switch( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth )
GregCr 0:9c0917bfde97 1497 {
GregCr 0:9c0917bfde97 1498 case LORA_BW_0200:
GregCr 0:9c0917bfde97 1499 bw = 203e3;
GregCr 0:9c0917bfde97 1500 break;
GregCr 0:9c0917bfde97 1501
GregCr 0:9c0917bfde97 1502 case LORA_BW_0400:
GregCr 0:9c0917bfde97 1503 bw = 406e3;
GregCr 0:9c0917bfde97 1504 break;
GregCr 0:9c0917bfde97 1505
GregCr 0:9c0917bfde97 1506 case LORA_BW_0800:
GregCr 0:9c0917bfde97 1507 bw = 812e3;
GregCr 0:9c0917bfde97 1508 break;
GregCr 0:9c0917bfde97 1509
GregCr 0:9c0917bfde97 1510 case LORA_BW_1600:
GregCr 0:9c0917bfde97 1511 bw = 1625e3;
GregCr 0:9c0917bfde97 1512 break;
GregCr 0:9c0917bfde97 1513
GregCr 0:9c0917bfde97 1514 default:
GregCr 0:9c0917bfde97 1515 bw = 100e3;
GregCr 0:9c0917bfde97 1516 break;
GregCr 0:9c0917bfde97 1517 }
GregCr 0:9c0917bfde97 1518 double rs = bw / ( 1 << ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) ); // Symbol rate : time for one symbol (secs)
GregCr 0:9c0917bfde97 1519 double ts = 1 / rs;
GregCr 0:9c0917bfde97 1520 double tPreamble = ( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength + 4.25 ) * ts; // time of preamble
GregCr 0:9c0917bfde97 1521 uint8_t de = 1; // always 1 on SX1280. "low data rate optimization" condition.
GregCr 0:9c0917bfde97 1522 double tmp = ceil( ( 8 * Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength - 4 * ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) +
GregCr 8:c0a5f53fe196 1523 28 + 16 * ( ( Eeprom.EepromData.PacketParams.Params.LoRa.Crc == 0x00 ) ? 0 : 1 ) - \
GregCr 0:9c0917bfde97 1524 ( ( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType >> 7 ) ? 20 : 0 ) ) / \
GregCr 0:9c0917bfde97 1525 ( double )( 4 * ( ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - ( de * 2 ) ) ) * \
GregCr 0:9c0917bfde97 1526 ( ( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate % 4 ) + 4 ) ); // Symbol length of payload and time
GregCr 0:9c0917bfde97 1527 double nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 );
GregCr 0:9c0917bfde97 1528 double tPayload = nPayload * ts;
GregCr 0:9c0917bfde97 1529
GregCr 0:9c0917bfde97 1530 // Time on air [ms]
GregCr 0:9c0917bfde97 1531 result = floor( ( ( tPreamble + tPayload ) * 1000 * 1.2 ) + 0.999 ); // Set some margin
GregCr 0:9c0917bfde97 1532 result *= 1.8; // Set some margin
GregCr 0:9c0917bfde97 1533 }
GregCr 0:9c0917bfde97 1534 else if( modulation == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 1535 {
GregCr 0:9c0917bfde97 1536 uint16_t packetBitCount;
GregCr 0:9c0917bfde97 1537
GregCr 0:9c0917bfde97 1538 switch( Eeprom.EepromData.PacketParams.Params.Flrc.PreambleLength )
GregCr 0:9c0917bfde97 1539 {
GregCr 0:9c0917bfde97 1540 case PREAMBLE_LENGTH_04_BITS: // Preamble length: 04 bits
GregCr 0:9c0917bfde97 1541 case PREAMBLE_LENGTH_08_BITS: // Preamble length: 08 bits
GregCr 0:9c0917bfde97 1542 packetBitCount = 1;
GregCr 0:9c0917bfde97 1543 break;
GregCr 0:9c0917bfde97 1544
GregCr 0:9c0917bfde97 1545 case PREAMBLE_LENGTH_12_BITS: // Preamble length: 12 bits
GregCr 0:9c0917bfde97 1546 case PREAMBLE_LENGTH_16_BITS: // Preamble length: 16 bits
GregCr 0:9c0917bfde97 1547 packetBitCount = 2;
GregCr 0:9c0917bfde97 1548 break;
GregCr 0:9c0917bfde97 1549
GregCr 0:9c0917bfde97 1550 case PREAMBLE_LENGTH_20_BITS: // Preamble length: 20 bits
GregCr 0:9c0917bfde97 1551 case PREAMBLE_LENGTH_24_BITS: // Preamble length: 24 bits
GregCr 0:9c0917bfde97 1552 packetBitCount = 3;
GregCr 0:9c0917bfde97 1553 break;
GregCr 0:9c0917bfde97 1554
GregCr 0:9c0917bfde97 1555 case PREAMBLE_LENGTH_28_BITS: // Preamble length: 28 bits
GregCr 0:9c0917bfde97 1556 case PREAMBLE_LENGTH_32_BITS: // Preamble length: 32 bits
GregCr 0:9c0917bfde97 1557 packetBitCount = 4;
GregCr 0:9c0917bfde97 1558 break;
GregCr 0:9c0917bfde97 1559
GregCr 0:9c0917bfde97 1560 default:
GregCr 0:9c0917bfde97 1561 packetBitCount = 4;
GregCr 0:9c0917bfde97 1562 break;
GregCr 0:9c0917bfde97 1563 }
GregCr 0:9c0917bfde97 1564 packetBitCount += 3; // Preamble 21 bits
GregCr 0:9c0917bfde97 1565 switch( Eeprom.EepromData.PacketParams.Params.Flrc.SyncWordLength )
GregCr 0:9c0917bfde97 1566 {
GregCr 0:9c0917bfde97 1567 case FLRC_SYNCWORD_LENGTH_4_BYTE:
GregCr 0:9c0917bfde97 1568 packetBitCount += 4;
GregCr 0:9c0917bfde97 1569 break;
GregCr 0:9c0917bfde97 1570
GregCr 0:9c0917bfde97 1571 case FLRC_NO_SYNCWORD:
GregCr 0:9c0917bfde97 1572 default:
GregCr 0:9c0917bfde97 1573 break;
GregCr 0:9c0917bfde97 1574 }
GregCr 0:9c0917bfde97 1575 switch( Eeprom.EepromData.ModulationParams.Params.Flrc.CodingRate )
GregCr 0:9c0917bfde97 1576 {
GregCr 0:9c0917bfde97 1577 // += 7; // CRC length is maximum 4 bytes (short-cut) + 2 Header + 6 bits Tail
GregCr 0:9c0917bfde97 1578 case FLRC_CR_3_4:
GregCr 0:9c0917bfde97 1579 packetBitCount += ( uint16_t )( ceil( ( ( float )( Eeprom.EepromData.PacketParams.Params.Flrc.PayloadLength + 7 ) * 4 ) / 3 ) );
GregCr 0:9c0917bfde97 1580 break;
GregCr 0:9c0917bfde97 1581
GregCr 0:9c0917bfde97 1582 case FLRC_CR_1_0:
GregCr 0:9c0917bfde97 1583 packetBitCount += Eeprom.EepromData.PacketParams.Params.Flrc.PayloadLength + 7;
GregCr 0:9c0917bfde97 1584 break;
GregCr 0:9c0917bfde97 1585
GregCr 0:9c0917bfde97 1586 default:
GregCr 0:9c0917bfde97 1587 case FLRC_CR_1_2:
GregCr 0:9c0917bfde97 1588 packetBitCount += ( Eeprom.EepromData.PacketParams.Params.Flrc.PayloadLength + 7 ) * 2;
GregCr 0:9c0917bfde97 1589 break;
GregCr 0:9c0917bfde97 1590 }
GregCr 0:9c0917bfde97 1591 packetBitCount *= 8;
GregCr 0:9c0917bfde97 1592 switch( Eeprom.EepromData.ModulationParams.Params.Flrc.BitrateBandwidth )
GregCr 0:9c0917bfde97 1593 {
GregCr 0:9c0917bfde97 1594 case FLRC_BR_1_300_BW_1_2:
GregCr 0:9c0917bfde97 1595 result = ( uint16_t )( ceil( ( float )packetBitCount / 1300 ) );
GregCr 0:9c0917bfde97 1596 break;
GregCr 0:9c0917bfde97 1597
GregCr 0:9c0917bfde97 1598 case FLRC_BR_1_040_BW_1_2:
GregCr 0:9c0917bfde97 1599 result = ( uint16_t )( ceil( ( float )packetBitCount / 1040 ) );
GregCr 0:9c0917bfde97 1600 break;
GregCr 0:9c0917bfde97 1601
GregCr 0:9c0917bfde97 1602 case FLRC_BR_0_650_BW_0_6:
GregCr 0:9c0917bfde97 1603 result = ( uint16_t )( ceil( ( float )packetBitCount / 650 ) );
GregCr 0:9c0917bfde97 1604 break;
GregCr 0:9c0917bfde97 1605
GregCr 0:9c0917bfde97 1606 case FLRC_BR_0_520_BW_0_6:
GregCr 0:9c0917bfde97 1607 result = ( uint16_t )( ceil( ( float )packetBitCount / 520 ) );
GregCr 0:9c0917bfde97 1608 break;
GregCr 0:9c0917bfde97 1609
GregCr 0:9c0917bfde97 1610 case FLRC_BR_0_325_BW_0_3:
GregCr 0:9c0917bfde97 1611 result = ( uint16_t )( ceil( ( float )packetBitCount / 325 ) );
GregCr 0:9c0917bfde97 1612 break;
GregCr 0:9c0917bfde97 1613
GregCr 0:9c0917bfde97 1614 default:
GregCr 0:9c0917bfde97 1615 case FLRC_BR_0_260_BW_0_3:
GregCr 0:9c0917bfde97 1616 result = ( uint16_t )( ceil( ( float )packetBitCount / 260 ) );
GregCr 0:9c0917bfde97 1617 break;
GregCr 0:9c0917bfde97 1618 }
GregCr 0:9c0917bfde97 1619 result *= 2; // Set some margin
GregCr 0:9c0917bfde97 1620 }
GregCr 0:9c0917bfde97 1621 else if( modulation == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 1622 {
GregCr 0:9c0917bfde97 1623 uint16_t packetBitCount;
GregCr 0:9c0917bfde97 1624
GregCr 0:9c0917bfde97 1625 switch( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength )
GregCr 0:9c0917bfde97 1626 {
GregCr 0:9c0917bfde97 1627 case PREAMBLE_LENGTH_04_BITS: // Preamble length: 04 bits
GregCr 0:9c0917bfde97 1628 case PREAMBLE_LENGTH_08_BITS: // Preamble length: 08 bits
GregCr 0:9c0917bfde97 1629 packetBitCount = 1;
GregCr 0:9c0917bfde97 1630 break;
GregCr 0:9c0917bfde97 1631
GregCr 0:9c0917bfde97 1632 case PREAMBLE_LENGTH_12_BITS: // Preamble length: 12 bits
GregCr 0:9c0917bfde97 1633 case PREAMBLE_LENGTH_16_BITS: // Preamble length: 16 bits
GregCr 0:9c0917bfde97 1634 packetBitCount = 2;
GregCr 0:9c0917bfde97 1635 break;
GregCr 0:9c0917bfde97 1636
GregCr 0:9c0917bfde97 1637 case PREAMBLE_LENGTH_20_BITS: // Preamble length: 20 bits
GregCr 0:9c0917bfde97 1638 case PREAMBLE_LENGTH_24_BITS: // Preamble length: 24 bits
GregCr 0:9c0917bfde97 1639 packetBitCount = 3;
GregCr 0:9c0917bfde97 1640 break;
GregCr 0:9c0917bfde97 1641
GregCr 0:9c0917bfde97 1642 case PREAMBLE_LENGTH_28_BITS: // Preamble length: 28 bits
GregCr 0:9c0917bfde97 1643 case PREAMBLE_LENGTH_32_BITS: // Preamble length: 32 bits
GregCr 0:9c0917bfde97 1644 packetBitCount = 4;
GregCr 0:9c0917bfde97 1645 break;
GregCr 0:9c0917bfde97 1646
GregCr 0:9c0917bfde97 1647 default:
GregCr 0:9c0917bfde97 1648 packetBitCount = 4;
GregCr 0:9c0917bfde97 1649 break;
GregCr 0:9c0917bfde97 1650 }
GregCr 0:9c0917bfde97 1651 switch( Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength )
GregCr 0:9c0917bfde97 1652 {
GregCr 0:9c0917bfde97 1653 case GFSK_SYNCWORD_LENGTH_1_BYTE: // Sync word length: 1 byte
GregCr 0:9c0917bfde97 1654 packetBitCount += 1;
GregCr 0:9c0917bfde97 1655 break;
GregCr 0:9c0917bfde97 1656
GregCr 0:9c0917bfde97 1657 case GFSK_SYNCWORD_LENGTH_2_BYTE: // Sync word length: 2 bytes
GregCr 0:9c0917bfde97 1658 packetBitCount += 2;
GregCr 0:9c0917bfde97 1659 break;
GregCr 0:9c0917bfde97 1660
GregCr 0:9c0917bfde97 1661 case GFSK_SYNCWORD_LENGTH_3_BYTE: // Sync word length: 3 bytes
GregCr 0:9c0917bfde97 1662 packetBitCount += 3;
GregCr 0:9c0917bfde97 1663 break;
GregCr 0:9c0917bfde97 1664
GregCr 0:9c0917bfde97 1665 case GFSK_SYNCWORD_LENGTH_4_BYTE: // Sync word length: 4 bytes
GregCr 0:9c0917bfde97 1666 packetBitCount += 4;
GregCr 0:9c0917bfde97 1667 break;
GregCr 0:9c0917bfde97 1668
GregCr 0:9c0917bfde97 1669 case GFSK_SYNCWORD_LENGTH_5_BYTE: // Sync word length: 5 bytes
GregCr 0:9c0917bfde97 1670 packetBitCount += 5;
GregCr 0:9c0917bfde97 1671 break;
GregCr 0:9c0917bfde97 1672
GregCr 0:9c0917bfde97 1673 default:
GregCr 0:9c0917bfde97 1674 packetBitCount += 5;
GregCr 0:9c0917bfde97 1675 break;
GregCr 0:9c0917bfde97 1676 }
GregCr 0:9c0917bfde97 1677 packetBitCount += Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength + 3;
GregCr 0:9c0917bfde97 1678 packetBitCount *= 8;
GregCr 0:9c0917bfde97 1679 switch( Eeprom.EepromData.ModulationParams.Params.Gfsk.BitrateBandwidth )
GregCr 0:9c0917bfde97 1680 {
GregCr 0:9c0917bfde97 1681 case GFSK_BLE_BR_2_000_BW_2_4:
GregCr 0:9c0917bfde97 1682 result = ( uint16_t )( ceil( ( float )packetBitCount / 2000 ) );
GregCr 0:9c0917bfde97 1683 break;
GregCr 0:9c0917bfde97 1684
GregCr 0:9c0917bfde97 1685 case GFSK_BLE_BR_1_600_BW_2_4:
GregCr 0:9c0917bfde97 1686 result = ( uint16_t )( ceil( ( float )packetBitCount / 1600 ) );
GregCr 0:9c0917bfde97 1687 break;
GregCr 0:9c0917bfde97 1688
GregCr 0:9c0917bfde97 1689 case GFSK_BLE_BR_1_000_BW_2_4:
GregCr 0:9c0917bfde97 1690 case GFSK_BLE_BR_1_000_BW_1_2:
GregCr 0:9c0917bfde97 1691 result = ( uint16_t )( ceil( ( float )packetBitCount / 1000 ) );
GregCr 0:9c0917bfde97 1692 break;
GregCr 0:9c0917bfde97 1693
GregCr 0:9c0917bfde97 1694 case GFSK_BLE_BR_0_800_BW_2_4:
GregCr 0:9c0917bfde97 1695 case GFSK_BLE_BR_0_800_BW_1_2:
GregCr 0:9c0917bfde97 1696 result = ( uint16_t )( ceil( ( float )packetBitCount / 800 ) );
GregCr 0:9c0917bfde97 1697 break;
GregCr 0:9c0917bfde97 1698
GregCr 0:9c0917bfde97 1699 case GFSK_BLE_BR_0_500_BW_1_2:
GregCr 0:9c0917bfde97 1700 case GFSK_BLE_BR_0_500_BW_0_6:
GregCr 0:9c0917bfde97 1701 result = ( uint16_t )( ceil( ( float )packetBitCount / 500 ) );
GregCr 0:9c0917bfde97 1702 break;
GregCr 0:9c0917bfde97 1703
GregCr 0:9c0917bfde97 1704 case GFSK_BLE_BR_0_400_BW_1_2:
GregCr 0:9c0917bfde97 1705 case GFSK_BLE_BR_0_400_BW_0_6:
GregCr 0:9c0917bfde97 1706 result = ( uint16_t )( ceil( ( float )packetBitCount / 400 ) );
GregCr 0:9c0917bfde97 1707 break;
GregCr 0:9c0917bfde97 1708
GregCr 0:9c0917bfde97 1709 case GFSK_BLE_BR_0_250_BW_0_6:
GregCr 0:9c0917bfde97 1710 case GFSK_BLE_BR_0_250_BW_0_3:
GregCr 0:9c0917bfde97 1711 result = ( uint16_t )( ceil( ( float )packetBitCount / 250 ) );
GregCr 0:9c0917bfde97 1712 break;
GregCr 0:9c0917bfde97 1713
GregCr 0:9c0917bfde97 1714 case GFSK_BLE_BR_0_125_BW_0_3:
GregCr 0:9c0917bfde97 1715 result = ( uint16_t )( ceil( ( float )packetBitCount / 125 ) );
GregCr 0:9c0917bfde97 1716 break;
GregCr 0:9c0917bfde97 1717
GregCr 0:9c0917bfde97 1718 default:
GregCr 0:9c0917bfde97 1719 result = 100;
GregCr 0:9c0917bfde97 1720 break;
GregCr 0:9c0917bfde97 1721 }
GregCr 0:9c0917bfde97 1722 result *= 1.5; // Set 50% margin
GregCr 0:9c0917bfde97 1723 }
GregCr 0:9c0917bfde97 1724 return result;
GregCr 0:9c0917bfde97 1725 }
GregCr 0:9c0917bfde97 1726
GregCr 0:9c0917bfde97 1727 void InitializeDemoParameters( uint8_t modulation )
GregCr 0:9c0917bfde97 1728 {
GregCr 0:9c0917bfde97 1729 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 1730
GregCr 0:9c0917bfde97 1731 Radio.SetRegulatorMode( ( RadioRegulatorModes_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
GregCr 0:9c0917bfde97 1732
GregCr 0:9c0917bfde97 1733 printf("> InitializeDemoParameters\n\r");
GregCr 0:9c0917bfde97 1734 if( modulation == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 1735 {
GregCr 0:9c0917bfde97 1736 printf("set param LORA for demo\n\r");
GregCr 0:9c0917bfde97 1737 ModulationParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1738 PacketParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1739
GregCr 0:9c0917bfde97 1740 ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t ) Eeprom.EepromData.DemoSettings.ModulationParam1;
GregCr 0:9c0917bfde97 1741 ModulationParams.Params.LoRa.Bandwidth = ( RadioLoRaBandwidths_t ) Eeprom.EepromData.DemoSettings.ModulationParam2;
GregCr 0:9c0917bfde97 1742 ModulationParams.Params.LoRa.CodingRate = ( RadioLoRaCodingRates_t ) Eeprom.EepromData.DemoSettings.ModulationParam3;
GregCr 0:9c0917bfde97 1743 PacketParams.Params.LoRa.PreambleLength = Eeprom.EepromData.DemoSettings.PacketParam1;
GregCr 0:9c0917bfde97 1744 PacketParams.Params.LoRa.HeaderType = ( RadioLoRaPacketLengthsModes_t )Eeprom.EepromData.DemoSettings.PacketParam2;
GregCr 0:9c0917bfde97 1745 PacketParams.Params.LoRa.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam3;
GregCr 8:c0a5f53fe196 1746 PacketParams.Params.LoRa.Crc = ( RadioLoRaCrcModes_t ) Eeprom.EepromData.DemoSettings.PacketParam4;
GregCr 0:9c0917bfde97 1747 PacketParams.Params.LoRa.InvertIQ = ( RadioLoRaIQModes_t ) Eeprom.EepromData.DemoSettings.PacketParam5;
GregCr 0:9c0917bfde97 1748
GregCr 0:9c0917bfde97 1749 Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength;
GregCr 0:9c0917bfde97 1750 }
GregCr 0:9c0917bfde97 1751 else if( modulation == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 1752 {
GregCr 0:9c0917bfde97 1753 printf("set param FLRC for demo\n\r");
GregCr 0:9c0917bfde97 1754 ModulationParams.PacketType = PACKET_TYPE_FLRC;
GregCr 0:9c0917bfde97 1755 PacketParams.PacketType = PACKET_TYPE_FLRC;
GregCr 0:9c0917bfde97 1756
GregCr 0:9c0917bfde97 1757 ModulationParams.Params.Flrc.BitrateBandwidth = ( RadioFlrcBitrates_t ) Eeprom.EepromData.DemoSettings.ModulationParam1;
GregCr 0:9c0917bfde97 1758 ModulationParams.Params.Flrc.CodingRate = ( RadioFlrcCodingRates_t ) Eeprom.EepromData.DemoSettings.ModulationParam2;
GregCr 0:9c0917bfde97 1759 ModulationParams.Params.Flrc.ModulationShaping = ( RadioModShapings_t ) Eeprom.EepromData.DemoSettings.ModulationParam3;
GregCr 0:9c0917bfde97 1760 PacketParams.Params.Flrc.PreambleLength = ( RadioPreambleLengths_t ) Eeprom.EepromData.DemoSettings.PacketParam1;
GregCr 0:9c0917bfde97 1761 PacketParams.Params.Flrc.SyncWordLength = ( RadioFlrcSyncWordLengths_t )Eeprom.EepromData.DemoSettings.PacketParam2;
GregCr 0:9c0917bfde97 1762 PacketParams.Params.Flrc.SyncWordMatch = ( RadioSyncWordRxMatchs_t ) Eeprom.EepromData.DemoSettings.PacketParam3;
GregCr 0:9c0917bfde97 1763 PacketParams.Params.Flrc.HeaderType = ( RadioPacketLengthModes_t ) Eeprom.EepromData.DemoSettings.PacketParam4;
GregCr 0:9c0917bfde97 1764 PacketParams.Params.Flrc.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam5;
GregCr 0:9c0917bfde97 1765 PacketParams.Params.Flrc.CrcLength = ( RadioCrcTypes_t ) Eeprom.EepromData.DemoSettings.PacketParam6;
GregCr 0:9c0917bfde97 1766 PacketParams.Params.Flrc.Whitening = ( RadioWhiteningModes_t ) Eeprom.EepromData.DemoSettings.PacketParam7;
GregCr 0:9c0917bfde97 1767
GregCr 0:9c0917bfde97 1768 Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Flrc.PayloadLength;
GregCr 0:9c0917bfde97 1769 }
GregCr 0:9c0917bfde97 1770 else if( modulation == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 1771 {
GregCr 0:9c0917bfde97 1772 printf("set param GFSK for demo\n\r");
GregCr 0:9c0917bfde97 1773 ModulationParams.PacketType = PACKET_TYPE_GFSK;
GregCr 0:9c0917bfde97 1774 PacketParams.PacketType = PACKET_TYPE_GFSK;
GregCr 0:9c0917bfde97 1775
GregCr 0:9c0917bfde97 1776 ModulationParams.Params.Gfsk.BitrateBandwidth = ( RadioGfskBleBitrates_t ) Eeprom.EepromData.DemoSettings.ModulationParam1;
GregCr 0:9c0917bfde97 1777 ModulationParams.Params.Gfsk.ModulationIndex = ( RadioGfskBleModIndexes_t )Eeprom.EepromData.DemoSettings.ModulationParam2;
GregCr 0:9c0917bfde97 1778 ModulationParams.Params.Gfsk.ModulationShaping = ( RadioModShapings_t ) Eeprom.EepromData.DemoSettings.ModulationParam3;
GregCr 0:9c0917bfde97 1779 PacketParams.Params.Gfsk.PreambleLength = ( RadioPreambleLengths_t ) Eeprom.EepromData.DemoSettings.PacketParam1;
GregCr 0:9c0917bfde97 1780 PacketParams.Params.Gfsk.SyncWordLength = ( RadioSyncWordLengths_t ) Eeprom.EepromData.DemoSettings.PacketParam2;
GregCr 0:9c0917bfde97 1781 PacketParams.Params.Gfsk.SyncWordMatch = ( RadioSyncWordRxMatchs_t ) Eeprom.EepromData.DemoSettings.PacketParam3;
GregCr 0:9c0917bfde97 1782 PacketParams.Params.Gfsk.HeaderType = ( RadioPacketLengthModes_t )Eeprom.EepromData.DemoSettings.PacketParam4;
GregCr 0:9c0917bfde97 1783 PacketParams.Params.Gfsk.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam5;
GregCr 0:9c0917bfde97 1784 PacketParams.Params.Gfsk.CrcLength = ( RadioCrcTypes_t ) Eeprom.EepromData.DemoSettings.PacketParam6;
GregCr 0:9c0917bfde97 1785 PacketParams.Params.Gfsk.Whitening = ( RadioWhiteningModes_t ) Eeprom.EepromData.DemoSettings.PacketParam7;
GregCr 0:9c0917bfde97 1786
GregCr 0:9c0917bfde97 1787 Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Gfsk.PayloadLength;
GregCr 0:9c0917bfde97 1788 }
GregCr 0:9c0917bfde97 1789 if( modulation == PACKET_TYPE_RANGING )
GregCr 0:9c0917bfde97 1790 {
GregCr 0:9c0917bfde97 1791 Radio.SetBufferBaseAddresses( 0x00, 0x00 );
GregCr 0:9c0917bfde97 1792 Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
GregCr 0:9c0917bfde97 1793 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1794 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 5:a0f5842fb337 1795 switch( ModulationParams.Params.LoRa.Bandwidth )
GregCr 0:9c0917bfde97 1796 {
GregCr 0:9c0917bfde97 1797 case LORA_BW_0400:
GregCr 0:9c0917bfde97 1798 Eeprom.EepromData.DemoSettings.RngCalib = RNG_CALIB_0400[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1799 Eeprom.EepromData.DemoSettings.RngFeiFactor = ( double )RNG_FGRAD_0400[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1800 Eeprom.EepromData.DemoSettings.RngReqDelay = RNG_TIMER_MS >> ( 0 + 10 - ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) );
GregCr 0:9c0917bfde97 1801 break;
GregCr 0:9c0917bfde97 1802
GregCr 0:9c0917bfde97 1803 case LORA_BW_0800:
GregCr 0:9c0917bfde97 1804 Eeprom.EepromData.DemoSettings.RngCalib = RNG_CALIB_0800[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1805 Eeprom.EepromData.DemoSettings.RngFeiFactor = ( double )RNG_FGRAD_0800[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1806 Eeprom.EepromData.DemoSettings.RngReqDelay = RNG_TIMER_MS >> ( 1 + 10 - ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) );
GregCr 0:9c0917bfde97 1807 break;
GregCr 0:9c0917bfde97 1808
GregCr 0:9c0917bfde97 1809 case LORA_BW_1600:
GregCr 0:9c0917bfde97 1810 Eeprom.EepromData.DemoSettings.RngCalib = RNG_CALIB_1600[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1811 Eeprom.EepromData.DemoSettings.RngFeiFactor = ( double )RNG_FGRAD_1600[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1812 Eeprom.EepromData.DemoSettings.RngReqDelay = RNG_TIMER_MS >> ( 2 + 10 - ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) );
GregCr 0:9c0917bfde97 1813 break;
GregCr 0:9c0917bfde97 1814 }
GregCr 0:9c0917bfde97 1815 }
GregCr 0:9c0917bfde97 1816 else
GregCr 0:9c0917bfde97 1817 {
GregCr 0:9c0917bfde97 1818 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 1819 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 0:9c0917bfde97 1820 Radio.SetRfFrequency( Eeprom.EepromData.DemoSettings.Frequency );
GregCr 0:9c0917bfde97 1821 Radio.SetBufferBaseAddresses( 0x00, 0x00 );
GregCr 0:9c0917bfde97 1822 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1823 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1824 // only used in GFSK, FLRC (4 bytes max) and BLE mode
GregCr 0:9c0917bfde97 1825 Radio.SetSyncWord( 1, ( uint8_t[] ){ 0xDD, 0xA0, 0x96, 0x69, 0xDD } );
GregCr 0:9c0917bfde97 1826 // only used in GFSK, FLRC
GregCr 8:c0a5f53fe196 1827 uint8_t crcSeedLocal[3] = { 0x00, 0x45, 0x67 };
GregCr 8:c0a5f53fe196 1828 Radio.SetCrcSeed( crcSeedLocal );
GregCr 0:9c0917bfde97 1829 Radio.SetCrcPolynomial( 0x0123 );
GregCr 0:9c0917bfde97 1830 Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
GregCr 0:9c0917bfde97 1831 }
GregCr 0:9c0917bfde97 1832 }
GregCr 0:9c0917bfde97 1833
GregCr 0:9c0917bfde97 1834 /*!
GregCr 0:9c0917bfde97 1835 * \brief Callback of ticker PerSendNextPacket
GregCr 0:9c0917bfde97 1836 */
GregCr 0:9c0917bfde97 1837 void SendNextPacketEvent( void )
GregCr 0:9c0917bfde97 1838 {
GregCr 0:9c0917bfde97 1839 SendNext = true;
GregCr 0:9c0917bfde97 1840 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_PROCESS )
GregCr 0:9c0917bfde97 1841 {
GregCr 0:9c0917bfde97 1842 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave++;
GregCr 0:9c0917bfde97 1843 }
GregCr 0:9c0917bfde97 1844 }
GregCr 0:9c0917bfde97 1845
GregCr 0:9c0917bfde97 1846 uint8_t CheckDistance( void )
GregCr 0:9c0917bfde97 1847 {
GregCr 0:9c0917bfde97 1848 double mean = 0.0;
GregCr 0:9c0917bfde97 1849 double total = 0.0;
GregCr 8:c0a5f53fe196 1850 double rssi = Eeprom.EepromData.DemoSettings.RssiValue;
GregCr 8:c0a5f53fe196 1851
GregCr 8:c0a5f53fe196 1852 uint16_t j = 0;
GregCr 8:c0a5f53fe196 1853 uint16_t i;
GregCr 0:9c0917bfde97 1854
GregCr 0:9c0917bfde97 1855 printf( "#id: %d", Eeprom.EepromData.DemoSettings.CntPacketTx );
GregCr 0:9c0917bfde97 1856 if( RngResultIndex > 0 )
GregCr 0:9c0917bfde97 1857 {
GregCr 0:9c0917bfde97 1858 // compute average and std deviation
GregCr 0:9c0917bfde97 1859 total = 0.0;
GregCr 0:9c0917bfde97 1860 for( i = 0; i < RngResultIndex; ++i )
GregCr 0:9c0917bfde97 1861 {
GregCr 8:c0a5f53fe196 1862 RawRngResults[i] = RawRngResults[i] - ( Eeprom.EepromData.DemoSettings.RngFeiFactor * Eeprom.EepromData.DemoSettings.RngFei / 1000 );
GregCr 0:9c0917bfde97 1863 }
GregCr 0:9c0917bfde97 1864
GregCr 8:c0a5f53fe196 1865 for (int i = RngResultIndex - 1; i > 0; --i)
GregCr 0:9c0917bfde97 1866 {
GregCr 8:c0a5f53fe196 1867 for (int j = 0; j < i; ++j)
GregCr 0:9c0917bfde97 1868 {
GregCr 8:c0a5f53fe196 1869 if (RawRngResults[j] > RawRngResults[j+1])
GregCr 8:c0a5f53fe196 1870 {
GregCr 8:c0a5f53fe196 1871 int temp = RawRngResults[j];
GregCr 8:c0a5f53fe196 1872 RawRngResults[j] = RawRngResults[j+1];
GregCr 8:c0a5f53fe196 1873 RawRngResults[j+1] = temp;
GregCr 8:c0a5f53fe196 1874 }
GregCr 0:9c0917bfde97 1875 }
GregCr 0:9c0917bfde97 1876 }
GregCr 8:c0a5f53fe196 1877 double median;
GregCr 8:c0a5f53fe196 1878 if ((RngResultIndex % 2) == 0)
GregCr 0:9c0917bfde97 1879 {
GregCr 8:c0a5f53fe196 1880 median = (RawRngResults[RngResultIndex/2] + RawRngResults[(RngResultIndex/2) - 1])/2.0;
GregCr 8:c0a5f53fe196 1881 }
GregCr 8:c0a5f53fe196 1882 else
GregCr 8:c0a5f53fe196 1883 {
GregCr 8:c0a5f53fe196 1884 median = RawRngResults[RngResultIndex/2];
GregCr 0:9c0917bfde97 1885 }
GregCr 8:c0a5f53fe196 1886
GregCr 8:c0a5f53fe196 1887 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) ;
GregCr 8:c0a5f53fe196 1888
GregCr 0:9c0917bfde97 1889 if( j < DEMO_RNG_CHANNELS_COUNT_MIN )
GregCr 0:9c0917bfde97 1890 {
GregCr 0:9c0917bfde97 1891 Eeprom.EepromData.DemoSettings.RngStatus = RNG_PER_ERROR;
GregCr 0:9c0917bfde97 1892 }
GregCr 0:9c0917bfde97 1893 else
GregCr 0:9c0917bfde97 1894 {
GregCr 0:9c0917bfde97 1895 Eeprom.EepromData.DemoSettings.RngStatus = RNG_VALID;
GregCr 0:9c0917bfde97 1896 }
GregCr 8:c0a5f53fe196 1897
GregCr 0:9c0917bfde97 1898 if( mean < 0 )
GregCr 0:9c0917bfde97 1899 {
GregCr 0:9c0917bfde97 1900 Eeprom.EepromData.DemoSettings.RngDistance = 0.0;
GregCr 0:9c0917bfde97 1901 }
GregCr 0:9c0917bfde97 1902 else
GregCr 0:9c0917bfde97 1903 {
GregCr 0:9c0917bfde97 1904 switch( Eeprom.EepromData.DemoSettings.RngUnit )
GregCr 0:9c0917bfde97 1905 {
GregCr 0:9c0917bfde97 1906 case DEMO_RNG_UNIT_SEL_M:
GregCr 0:9c0917bfde97 1907 Eeprom.EepromData.DemoSettings.RngDistance = mean;
GregCr 0:9c0917bfde97 1908 break;
GregCr 0:9c0917bfde97 1909
GregCr 0:9c0917bfde97 1910 case DEMO_RNG_UNIT_SEL_YD:
GregCr 0:9c0917bfde97 1911 Eeprom.EepromData.DemoSettings.RngDistance = mean * DEMO_RNG_UNIT_CONV_YD;
GregCr 0:9c0917bfde97 1912 break;
GregCr 0:9c0917bfde97 1913
GregCr 0:9c0917bfde97 1914 case DEMO_RNG_UNIT_SEL_MI:
GregCr 0:9c0917bfde97 1915 Eeprom.EepromData.DemoSettings.RngDistance = mean * DEMO_RNG_UNIT_CONV_MI;
GregCr 0:9c0917bfde97 1916 break;
GregCr 0:9c0917bfde97 1917 }
GregCr 0:9c0917bfde97 1918 }
GregCr 0:9c0917bfde97 1919 }
GregCr 0:9c0917bfde97 1920 printf( ", Rssi: %d, Zn: %3d, Zmoy: %5.1f, FEI: %d\r\n", Eeprom.EepromData.DemoSettings.RssiValue, j, mean, ( int32_t )Eeprom.EepromData.DemoSettings.RngFei );
GregCr 0:9c0917bfde97 1921
GregCr 0:9c0917bfde97 1922 return j;
GregCr 0:9c0917bfde97 1923 }
GregCr 0:9c0917bfde97 1924
GregCr 0:9c0917bfde97 1925 void LedBlink( void )
GregCr 0:9c0917bfde97 1926 {
GregCr 0:9c0917bfde97 1927 if( ( TX_LED == 0 ) && ( RX_LED == 0 ) )
GregCr 0:9c0917bfde97 1928 {
GregCr 0:9c0917bfde97 1929 TX_LED = 1;
GregCr 0:9c0917bfde97 1930 }
GregCr 0:9c0917bfde97 1931 else if( ( TX_LED == 1 ) && ( RX_LED == 0 ) )
GregCr 0:9c0917bfde97 1932 {
GregCr 0:9c0917bfde97 1933 RX_LED = 1;
GregCr 0:9c0917bfde97 1934 }
GregCr 0:9c0917bfde97 1935 else if( ( TX_LED == 1 ) && ( RX_LED == 1 ) )
GregCr 0:9c0917bfde97 1936 {
GregCr 0:9c0917bfde97 1937 TX_LED = 0;
GregCr 0:9c0917bfde97 1938 }
GregCr 0:9c0917bfde97 1939 else
GregCr 0:9c0917bfde97 1940 {
GregCr 0:9c0917bfde97 1941 RX_LED = 0;
GregCr 0:9c0917bfde97 1942 }
GregCr 0:9c0917bfde97 1943 }
GregCr 0:9c0917bfde97 1944
GregCr 0:9c0917bfde97 1945 void SetAntennaSwitch( void )
GregCr 0:9c0917bfde97 1946 {
GregCr 0:9c0917bfde97 1947 if( Eeprom.EepromData.DemoSettings.AntennaSwitch == 0 )
GregCr 0:9c0917bfde97 1948 {
GregCr 0:9c0917bfde97 1949 ANT_SW = 1; // ANT1
GregCr 0:9c0917bfde97 1950 }
GregCr 0:9c0917bfde97 1951 else
GregCr 0:9c0917bfde97 1952 {
GregCr 0:9c0917bfde97 1953 ANT_SW = 0; // ANT2
GregCr 0:9c0917bfde97 1954 }
GregCr 0:9c0917bfde97 1955 }
GregCr 0:9c0917bfde97 1956
GregCr 0:9c0917bfde97 1957 // ************************ Radio Callbacks ****************************
GregCr 0:9c0917bfde97 1958 // * *
GregCr 0:9c0917bfde97 1959 // * These functions are called through function pointer by the Radio low *
GregCr 0:9c0917bfde97 1960 // * level drivers *
GregCr 0:9c0917bfde97 1961 // * *
GregCr 0:9c0917bfde97 1962 // *****************************************************************************
GregCr 0:9c0917bfde97 1963 void OnTxDone( void )
GregCr 0:9c0917bfde97 1964 {
GregCr 0:9c0917bfde97 1965 DemoInternalState = APP_TX;
GregCr 0:9c0917bfde97 1966 }
GregCr 0:9c0917bfde97 1967
GregCr 0:9c0917bfde97 1968 void OnRxDone( void )
GregCr 0:9c0917bfde97 1969 {
GregCr 0:9c0917bfde97 1970 DemoInternalState = APP_RX;
GregCr 0:9c0917bfde97 1971 }
GregCr 0:9c0917bfde97 1972
GregCr 0:9c0917bfde97 1973 void OnTxTimeout( void )
GregCr 0:9c0917bfde97 1974 {
GregCr 0:9c0917bfde97 1975 DemoInternalState = APP_TX_TIMEOUT;
GregCr 0:9c0917bfde97 1976 }
GregCr 0:9c0917bfde97 1977
GregCr 0:9c0917bfde97 1978 void OnRxTimeout( void )
GregCr 0:9c0917bfde97 1979 {
GregCr 0:9c0917bfde97 1980 DemoInternalState = APP_RX_TIMEOUT;
GregCr 0:9c0917bfde97 1981 }
GregCr 0:9c0917bfde97 1982
GregCr 0:9c0917bfde97 1983 void OnRxError( IrqErrorCode_t errorCode )
GregCr 0:9c0917bfde97 1984 {
GregCr 0:9c0917bfde97 1985 DemoInternalState = APP_RX_ERROR;
GregCr 0:9c0917bfde97 1986 }
GregCr 0:9c0917bfde97 1987
GregCr 0:9c0917bfde97 1988 void OnRangingDone( IrqRangingCode_t val )
GregCr 0:9c0917bfde97 1989 {
GregCr 0:9c0917bfde97 1990 if( val == IRQ_RANGING_MASTER_VALID_CODE || val == IRQ_RANGING_SLAVE_VALID_CODE )
GregCr 0:9c0917bfde97 1991 {
GregCr 0:9c0917bfde97 1992 DemoInternalState = APP_RANGING_DONE;
GregCr 0:9c0917bfde97 1993 }
GregCr 0:9c0917bfde97 1994 else if( val == IRQ_RANGING_MASTER_ERROR_CODE || val == IRQ_RANGING_SLAVE_ERROR_CODE )
GregCr 0:9c0917bfde97 1995 {
GregCr 0:9c0917bfde97 1996 DemoInternalState = APP_RANGING_TIMEOUT;
GregCr 0:9c0917bfde97 1997 }
GregCr 0:9c0917bfde97 1998 else
GregCr 0:9c0917bfde97 1999 {
GregCr 0:9c0917bfde97 2000 DemoInternalState = APP_RANGING_TIMEOUT;
GregCr 0:9c0917bfde97 2001 }
GregCr 0:9c0917bfde97 2002 }
GregCr 0:9c0917bfde97 2003
GregCr 0:9c0917bfde97 2004 void OnCadDone( bool channelActivityDetected )
GregCr 0:9c0917bfde97 2005 {
GregCr 0:9c0917bfde97 2006 }