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:
mverdy
Date:
Thu Aug 17 10:22:32 2017 +0000
Revision:
14:ebd89dacc807
Parent:
13:94a3f92fd49c
Child:
17:a0bbfc228415
Make use of polling mode; Use up to date driver version; Print radio version at startup on Virtual Com Port

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 }
mverdy 14:ebd89dacc807 329
mverdy 14:ebd89dacc807 330 Radio.ProcessIrqs( );
mverdy 14:ebd89dacc807 331
GregCr 0:9c0917bfde97 332 if( DemoRunning == false )
GregCr 0:9c0917bfde97 333 {
GregCr 0:9c0917bfde97 334 DemoRunning = true;
GregCr 0:9c0917bfde97 335
GregCr 0:9c0917bfde97 336 TX_LED = 0;
GregCr 0:9c0917bfde97 337 RX_LED = 0;
GregCr 0:9c0917bfde97 338
GregCr 0:9c0917bfde97 339 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 340
GregCr 0:9c0917bfde97 341 // Send the next PING frame
GregCr 0:9c0917bfde97 342 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 343 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 344 for( i = 0; i < localPayloadSize; i++ )
GregCr 0:9c0917bfde97 345 {
GregCr 0:9c0917bfde97 346 Buffer[i] = ( uint8_t )rand( );
GregCr 0:9c0917bfde97 347 }
GregCr 0:9c0917bfde97 348 // Radio.SetAutoFS( true ); // no need to relock the PLL between packets
GregCr 0:9c0917bfde97 349 Radio.SendPayload( Buffer, localPayloadSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, 10000 } );
GregCr 0:9c0917bfde97 350 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 351 }
GregCr 0:9c0917bfde97 352 else
GregCr 0:9c0917bfde97 353 {
GregCr 0:9c0917bfde97 354 switch( DemoInternalState )
GregCr 0:9c0917bfde97 355 {
GregCr 0:9c0917bfde97 356 case APP_RX:
GregCr 0:9c0917bfde97 357 break;
GregCr 0:9c0917bfde97 358
GregCr 0:9c0917bfde97 359 case APP_TX:
GregCr 0:9c0917bfde97 360 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 361 LedBlink( );
GregCr 0:9c0917bfde97 362 // Send the next frame
GregCr 0:9c0917bfde97 363 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 364 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 365 for( i = 0; i < localPayloadSize; i++ )
GregCr 0:9c0917bfde97 366 {
GregCr 0:9c0917bfde97 367 Buffer[i] = ( uint8_t )rand( );
GregCr 0:9c0917bfde97 368 }
GregCr 0:9c0917bfde97 369 // Radio.SetAutoFS( true ); // no need to relock the PLL between packets
GregCr 0:9c0917bfde97 370 Radio.SendPayload( Buffer, localPayloadSize, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, 0xFFFF } );
GregCr 0:9c0917bfde97 371 break;
GregCr 0:9c0917bfde97 372
GregCr 0:9c0917bfde97 373 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 374 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 375 break;
GregCr 0:9c0917bfde97 376
GregCr 0:9c0917bfde97 377 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 378 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 379 break;
GregCr 0:9c0917bfde97 380
GregCr 0:9c0917bfde97 381 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 382 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 383 break;
GregCr 0:9c0917bfde97 384
GregCr 0:9c0917bfde97 385 case APP_IDLE:
GregCr 0:9c0917bfde97 386 break;
GregCr 0:9c0917bfde97 387
GregCr 0:9c0917bfde97 388 default:
GregCr 0:9c0917bfde97 389 break;
GregCr 0:9c0917bfde97 390 }
GregCr 0:9c0917bfde97 391 }
GregCr 0:9c0917bfde97 392 return 0;
GregCr 0:9c0917bfde97 393 }
GregCr 0:9c0917bfde97 394
GregCr 0:9c0917bfde97 395 // ************************* PER Demo ******************************
GregCr 0:9c0917bfde97 396 // * *
GregCr 0:9c0917bfde97 397 // * *
GregCr 0:9c0917bfde97 398 // * *
GregCr 0:9c0917bfde97 399 // *****************************************************************************
GregCr 0:9c0917bfde97 400 uint8_t RunDemoApplicationPer( void )
GregCr 0:9c0917bfde97 401 {
GregCr 0:9c0917bfde97 402 uint8_t i = 0;
GregCr 0:9c0917bfde97 403 uint8_t refreshDisplay = 0;
GregCr 0:9c0917bfde97 404
GregCr 0:9c0917bfde97 405 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 406 {
GregCr 0:9c0917bfde97 407 return 0;
GregCr 0:9c0917bfde97 408 }
GregCr 0:9c0917bfde97 409
GregCr 0:9c0917bfde97 410 if( DemoRunning == false )
GregCr 0:9c0917bfde97 411 {
GregCr 0:9c0917bfde97 412 DemoRunning = true;
GregCr 0:9c0917bfde97 413
GregCr 0:9c0917bfde97 414 printf( "Start RunDemoApplicationPer\n\r" );
GregCr 0:9c0917bfde97 415
GregCr 0:9c0917bfde97 416 TX_LED = 0;
GregCr 0:9c0917bfde97 417 RX_LED = 0;
GregCr 0:9c0917bfde97 418 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 419 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 420 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 421 Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0;
GregCr 0:9c0917bfde97 422 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 423
GregCr 0:9c0917bfde97 424 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 425
GregCr 0:9c0917bfde97 426 Eeprom.EepromData.DemoSettings.InterPacketDelay = GetTimeOnAir( Eeprom.EepromData.DemoSettings.ModulationType ) + RefreshScreenDelayMs;
GregCr 0:9c0917bfde97 427
GregCr 0:9c0917bfde97 428 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 429 {
GregCr 0:9c0917bfde97 430 SendNextPacket.attach_us( &SendNextPacketEvent, Eeprom.EepromData.DemoSettings.InterPacketDelay * 1000 );
GregCr 0:9c0917bfde97 431 DemoInternalState = APP_TX;
GregCr 0:9c0917bfde97 432 }
GregCr 0:9c0917bfde97 433 else
GregCr 0:9c0917bfde97 434 {
GregCr 0:9c0917bfde97 435 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 436 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 437 // Rx Single without timeout for the start
GregCr 0:9c0917bfde97 438 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, 0x0000 } );
GregCr 0:9c0917bfde97 439 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 440 }
GregCr 0:9c0917bfde97 441 }
GregCr 0:9c0917bfde97 442
mverdy 14:ebd89dacc807 443 Radio.ProcessIrqs( );
mverdy 14:ebd89dacc807 444
GregCr 0:9c0917bfde97 445 if( Eeprom.EepromData.DemoSettings.MaxNumPacket > 0 ) // != Infinite
GregCr 0:9c0917bfde97 446 {
GregCr 0:9c0917bfde97 447 if( ( Eeprom.EepromData.DemoSettings.CntPacketRxOK + \
GregCr 0:9c0917bfde97 448 Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 449 Eeprom.EepromData.DemoSettings.RxTimeOutCount) >= \
GregCr 0:9c0917bfde97 450 Eeprom.EepromData.DemoSettings.MaxNumPacket )
GregCr 0:9c0917bfde97 451 {
GregCr 0:9c0917bfde97 452 RX_LED = 0;
GregCr 0:9c0917bfde97 453 TX_LED = 0;
GregCr 0:9c0917bfde97 454 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 455 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 456 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 457 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 458 refreshDisplay = 1;
GregCr 0:9c0917bfde97 459 }
GregCr 0:9c0917bfde97 460 }
GregCr 0:9c0917bfde97 461
GregCr 0:9c0917bfde97 462 switch( DemoInternalState )
GregCr 0:9c0917bfde97 463 {
GregCr 0:9c0917bfde97 464 case PER_TX_START:
GregCr 0:9c0917bfde97 465 Eeprom.EepromData.DemoSettings.CntPacketTx++;
GregCr 0:9c0917bfde97 466 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 467
GregCr 0:9c0917bfde97 468 Buffer[0] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 469 Buffer[1] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 470 Buffer[2] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 471 Buffer[3] = Eeprom.EepromData.DemoSettings.CntPacketTx & 0xFF;
GregCr 0:9c0917bfde97 472 Buffer[4] = PerMsg[0];
GregCr 0:9c0917bfde97 473 Buffer[5] = PerMsg[1];
GregCr 0:9c0917bfde97 474 Buffer[6] = PerMsg[2];
GregCr 0:9c0917bfde97 475 for( i = 7; i < Eeprom.EepromData.DemoSettings.PayloadLength; i++ )
GregCr 0:9c0917bfde97 476 {
GregCr 0:9c0917bfde97 477 Buffer[i] = i;
GregCr 0:9c0917bfde97 478 }
GregCr 0:9c0917bfde97 479 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 480 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 481 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 482 Radio.SendPayload( Buffer, Eeprom.EepromData.DemoSettings.PayloadLength, \
GregCr 0:9c0917bfde97 483 ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 484 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 485 break;
GregCr 0:9c0917bfde97 486
GregCr 0:9c0917bfde97 487 case PER_RX_START:
GregCr 0:9c0917bfde97 488 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 489 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 490 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 491 Eeprom.EepromData.DemoSettings.InterPacketDelay + RX_TIMEOUT_MARGIN } );
GregCr 0:9c0917bfde97 492 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 493 break;
GregCr 0:9c0917bfde97 494
GregCr 0:9c0917bfde97 495 case APP_TX:
GregCr 0:9c0917bfde97 496 if( SendNext == true )
GregCr 0:9c0917bfde97 497 {
GregCr 0:9c0917bfde97 498 SendNext = false;
GregCr 0:9c0917bfde97 499 if( Eeprom.EepromData.DemoSettings.MaxNumPacket == 0 )
GregCr 0:9c0917bfde97 500 {
GregCr 0:9c0917bfde97 501 DemoInternalState = PER_TX_START; // Infinite -> send next
GregCr 0:9c0917bfde97 502 refreshDisplay = 1;
GregCr 0:9c0917bfde97 503 }
GregCr 0:9c0917bfde97 504 else if( Eeprom.EepromData.DemoSettings.CntPacketTx < \
GregCr 0:9c0917bfde97 505 Eeprom.EepromData.DemoSettings.MaxNumPacket )
GregCr 0:9c0917bfde97 506 {
GregCr 0:9c0917bfde97 507 DemoInternalState = PER_TX_START; // MaxNumPacket not sent
GregCr 0:9c0917bfde97 508 refreshDisplay = 1;
GregCr 0:9c0917bfde97 509 }
GregCr 0:9c0917bfde97 510 else // MaxNumPacket sent -> end of demo
GregCr 0:9c0917bfde97 511 {
GregCr 0:9c0917bfde97 512 RX_LED = 0;
GregCr 0:9c0917bfde97 513 TX_LED = 0;
GregCr 0:9c0917bfde97 514 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 515 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 516 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 517 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 518 refreshDisplay = 1;
GregCr 0:9c0917bfde97 519 }
GregCr 0:9c0917bfde97 520 }
GregCr 0:9c0917bfde97 521 break;
GregCr 0:9c0917bfde97 522
GregCr 0:9c0917bfde97 523 case APP_RX:
GregCr 0:9c0917bfde97 524 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 525 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 0:9c0917bfde97 526 Radio.GetPacketStatus( &PacketStatus );
GregCr 0:9c0917bfde97 527 if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 528 {
GregCr 0:9c0917bfde97 529 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.LoRa.RssiPkt;
GregCr 0:9c0917bfde97 530 Eeprom.EepromData.DemoSettings.SnrValue = PacketStatus.LoRa.SnrPkt;
GregCr 0:9c0917bfde97 531 }
GregCr 0:9c0917bfde97 532 else if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 533 {
GregCr 0:9c0917bfde97 534 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Flrc.RssiSync;
GregCr 0:9c0917bfde97 535 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 536 }
GregCr 0:9c0917bfde97 537 else if( Eeprom.EepromData.DemoSettings.ModulationType == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 538 {
GregCr 0:9c0917bfde97 539 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Gfsk.RssiSync;
GregCr 0:9c0917bfde97 540 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 541 }
GregCr 0:9c0917bfde97 542 DemoInternalState = PER_RX_START;
GregCr 0:9c0917bfde97 543 if( ( BufferSize >= PER_SIZE ) && ( strncmp( ( const char* )( Buffer + 4 ), ( const char* )PerMsg, PER_SIZE ) == 0 ) )
GregCr 0:9c0917bfde97 544 {
GregCr 0:9c0917bfde97 545 ComputePerPayload( Buffer, BufferSize );
GregCr 0:9c0917bfde97 546 refreshDisplay = 1;
GregCr 0:9c0917bfde97 547 }
GregCr 0:9c0917bfde97 548 else
GregCr 0:9c0917bfde97 549 {
GregCr 0:9c0917bfde97 550 Eeprom.EepromData.DemoSettings.RxTimeOutCount++;
GregCr 0:9c0917bfde97 551 }
GregCr 0:9c0917bfde97 552 break;
GregCr 0:9c0917bfde97 553
GregCr 0:9c0917bfde97 554 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 555 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 556 Eeprom.EepromData.DemoSettings.RxTimeOutCount++;
GregCr 0:9c0917bfde97 557 DemoInternalState = PER_RX_START;
GregCr 0:9c0917bfde97 558 refreshDisplay = 1;
GregCr 0:9c0917bfde97 559 break;
GregCr 0:9c0917bfde97 560
GregCr 0:9c0917bfde97 561 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 562 printf( "Failure: timeout in Tx is shorter than the packet time on air\n\r" );
GregCr 0:9c0917bfde97 563 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 564 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 565 refreshDisplay = 1;
GregCr 0:9c0917bfde97 566 break;
GregCr 0:9c0917bfde97 567
GregCr 0:9c0917bfde97 568 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 569 break;
GregCr 0:9c0917bfde97 570
GregCr 0:9c0917bfde97 571 default:
GregCr 0:9c0917bfde97 572 break;
GregCr 0:9c0917bfde97 573 }
GregCr 0:9c0917bfde97 574 return refreshDisplay;
GregCr 0:9c0917bfde97 575 }
GregCr 0:9c0917bfde97 576
GregCr 0:9c0917bfde97 577 void ComputePerPayload( uint8_t *buffer, uint8_t bufferSize )
GregCr 0:9c0917bfde97 578 {
GregCr 0:9c0917bfde97 579 uint32_t i = 0;
GregCr 0:9c0917bfde97 580
GregCr 0:9c0917bfde97 581 Eeprom.EepromData.DemoSettings.CntPacketRxOK++;
GregCr 0:9c0917bfde97 582 PacketRxSequence = ( ( uint32_t )buffer[0] << 24 ) | \
GregCr 0:9c0917bfde97 583 ( ( uint32_t )buffer[1] << 16 ) | \
GregCr 0:9c0917bfde97 584 ( ( uint32_t )buffer[2] << 8 ) | \
GregCr 0:9c0917bfde97 585 buffer[3];
GregCr 0:9c0917bfde97 586
GregCr 0:9c0917bfde97 587 if( ( PacketRxSequence <= PacketRxSequencePrev ) || \
GregCr 0:9c0917bfde97 588 ( PacketRxSequencePrev == 0 ) )
GregCr 0:9c0917bfde97 589 {
GregCr 0:9c0917bfde97 590 // Sequence went back => resynchronization
GregCr 0:9c0917bfde97 591 // Don't count missed packets this time
GregCr 0:9c0917bfde97 592 i = 0;
GregCr 0:9c0917bfde97 593 }
GregCr 0:9c0917bfde97 594 else
GregCr 0:9c0917bfde97 595 {
GregCr 0:9c0917bfde97 596 // Determine number of missed packets
GregCr 0:9c0917bfde97 597 i = PacketRxSequence - PacketRxSequencePrev - 1;
GregCr 0:9c0917bfde97 598 }
GregCr 0:9c0917bfde97 599 // Be ready for the next
GregCr 0:9c0917bfde97 600 PacketRxSequencePrev = PacketRxSequence;
GregCr 0:9c0917bfde97 601 // increment 'missed' counter for the RX session
GregCr 0:9c0917bfde97 602 Eeprom.EepromData.DemoSettings.CntPacketRxKO += i;
GregCr 0:9c0917bfde97 603 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 604 }
GregCr 0:9c0917bfde97 605
GregCr 0:9c0917bfde97 606 // ************************ Ping Pong Demo *****************************
GregCr 0:9c0917bfde97 607 // * *
GregCr 0:9c0917bfde97 608 // * *
GregCr 0:9c0917bfde97 609 // * *
GregCr 0:9c0917bfde97 610 // *****************************************************************************
GregCr 0:9c0917bfde97 611 uint8_t RunDemoApplicationPingPong( void )
GregCr 0:9c0917bfde97 612 {
GregCr 0:9c0917bfde97 613 uint8_t i = 0;
GregCr 0:9c0917bfde97 614 uint8_t refreshDisplay = 0;
GregCr 0:9c0917bfde97 615
GregCr 0:9c0917bfde97 616 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 617 {
GregCr 0:9c0917bfde97 618 return 0; // quit without refresh display
GregCr 0:9c0917bfde97 619 }
GregCr 0:9c0917bfde97 620
GregCr 0:9c0917bfde97 621 if( DemoRunning == false )
GregCr 0:9c0917bfde97 622 {
GregCr 0:9c0917bfde97 623 DemoRunning = true;
GregCr 0:9c0917bfde97 624 TX_LED = 0;
GregCr 0:9c0917bfde97 625 RX_LED = 0;
GregCr 0:9c0917bfde97 626 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 627 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 628 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 629 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = 0;
GregCr 0:9c0917bfde97 630 Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0;
GregCr 0:9c0917bfde97 631 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave = 0;
GregCr 0:9c0917bfde97 632 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 633
GregCr 0:9c0917bfde97 634 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 635
GregCr 0:9c0917bfde97 636 Eeprom.EepromData.DemoSettings.InterPacketDelay = ( 2 * \
GregCr 0:9c0917bfde97 637 GetTimeOnAir( Eeprom.EepromData.DemoSettings.ModulationType ) ) + \
GregCr 0:9c0917bfde97 638 RX_TIMEOUT_MARGIN + RefreshScreenDelayMs;
GregCr 0:9c0917bfde97 639
GregCr 0:9c0917bfde97 640 printf( "Start RunDemoApplicationPingPong.\n\r" );
GregCr 0:9c0917bfde97 641 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 642 {
GregCr 0:9c0917bfde97 643 DemoInternalState = SEND_PING_MSG;
GregCr 0:9c0917bfde97 644 SendNextPacket.attach_us( &SendNextPacketEvent, \
GregCr 0:9c0917bfde97 645 ( Eeprom.EepromData.DemoSettings.InterPacketDelay * 1000 ) );
GregCr 0:9c0917bfde97 646 }
GregCr 0:9c0917bfde97 647 else
GregCr 0:9c0917bfde97 648 {
GregCr 0:9c0917bfde97 649 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 650 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 651 // Rx Single without timeout for the start
GregCr 0:9c0917bfde97 652 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 653 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, 0x0000 } );
GregCr 0:9c0917bfde97 654 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 655 }
GregCr 0:9c0917bfde97 656 }
GregCr 0:9c0917bfde97 657
mverdy 14:ebd89dacc807 658 Radio.ProcessIrqs( );
mverdy 14:ebd89dacc807 659
GregCr 0:9c0917bfde97 660 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 661 {
GregCr 0:9c0917bfde97 662 switch( DemoInternalState )
GregCr 0:9c0917bfde97 663 {
GregCr 0:9c0917bfde97 664 case SEND_PING_MSG:
GregCr 0:9c0917bfde97 665 if( ( Eeprom.EepromData.DemoSettings.MaxNumPacket != 0 ) \
GregCr 0:9c0917bfde97 666 && ( Eeprom.EepromData.DemoSettings.CntPacketTx >= Eeprom.EepromData.DemoSettings.MaxNumPacket ) )
GregCr 0:9c0917bfde97 667 {
GregCr 0:9c0917bfde97 668 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 669 SendNext = false;
GregCr 0:9c0917bfde97 670 RX_LED = 0;
GregCr 0:9c0917bfde97 671 TX_LED = 0;
GregCr 0:9c0917bfde97 672 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 673 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 674 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 675 refreshDisplay = 1;
GregCr 0:9c0917bfde97 676 }
GregCr 0:9c0917bfde97 677 else
GregCr 0:9c0917bfde97 678 {
GregCr 0:9c0917bfde97 679 if( SendNext == true )
GregCr 0:9c0917bfde97 680 {
GregCr 0:9c0917bfde97 681 SendNext = false;
GregCr 0:9c0917bfde97 682
GregCr 0:9c0917bfde97 683 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 684 Eeprom.EepromData.DemoSettings.CntPacketTx++;
GregCr 0:9c0917bfde97 685 // Send the next PING frame
GregCr 0:9c0917bfde97 686 Buffer[0] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 687 Buffer[1] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 688 Buffer[2] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 689 Buffer[3] = ( Eeprom.EepromData.DemoSettings.CntPacketTx & 0xFF );
GregCr 0:9c0917bfde97 690 Buffer[4] = PingMsg[0];
GregCr 0:9c0917bfde97 691 Buffer[5] = PingMsg[1];
GregCr 0:9c0917bfde97 692 Buffer[6] = PingMsg[2];
GregCr 0:9c0917bfde97 693 Buffer[7] = PingMsg[3];
GregCr 0:9c0917bfde97 694 for( i = 8; i < Eeprom.EepromData.DemoSettings.PayloadLength; i++ )
GregCr 0:9c0917bfde97 695 {
GregCr 0:9c0917bfde97 696 Buffer[i] = i;
GregCr 0:9c0917bfde97 697 }
GregCr 0:9c0917bfde97 698 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 699 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 700 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 701 Radio.SendPayload( Buffer, Eeprom.EepromData.DemoSettings.PayloadLength, \
GregCr 0:9c0917bfde97 702 ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 703 Eeprom.EepromData.DemoSettings.InterPacketDelay - \
GregCr 0:9c0917bfde97 704 ( RX_TIMEOUT_MARGIN / 2 ) } );
GregCr 0:9c0917bfde97 705 }
GregCr 0:9c0917bfde97 706 }
GregCr 0:9c0917bfde97 707 break;
GregCr 0:9c0917bfde97 708
GregCr 0:9c0917bfde97 709 case APP_TX:
GregCr 0:9c0917bfde97 710 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 711 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 712 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 713 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 714 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 715 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 716 Eeprom.EepromData.DemoSettings.InterPacketDelay - \
GregCr 0:9c0917bfde97 717 ( RX_TIMEOUT_MARGIN / 2 ) } );
GregCr 0:9c0917bfde97 718 break;
GregCr 0:9c0917bfde97 719
GregCr 0:9c0917bfde97 720 case APP_RX:
GregCr 0:9c0917bfde97 721 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 722 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 0:9c0917bfde97 723 Radio.GetPacketStatus( &PacketStatus );
GregCr 0:9c0917bfde97 724 if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 725 {
GregCr 0:9c0917bfde97 726 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.LoRa.RssiPkt;
GregCr 0:9c0917bfde97 727 Eeprom.EepromData.DemoSettings.SnrValue = PacketStatus.LoRa.SnrPkt;
GregCr 0:9c0917bfde97 728 }
GregCr 0:9c0917bfde97 729 else if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 730 {
GregCr 0:9c0917bfde97 731 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Flrc.RssiSync;
GregCr 0:9c0917bfde97 732 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 733 }
GregCr 0:9c0917bfde97 734 else if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 735 {
GregCr 0:9c0917bfde97 736 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Gfsk.RssiSync;
GregCr 0:9c0917bfde97 737 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 738 }
GregCr 0:9c0917bfde97 739 if( ( BufferSize >= PINGPONG_SIZE ) && ( strncmp( ( const char* )( Buffer + 8 ), ( const char* )PongMsg, PINGPONG_SIZE ) == 0 ) )
GregCr 0:9c0917bfde97 740 {
GregCr 0:9c0917bfde97 741 ComputePingPongPayload( Buffer, BufferSize );
GregCr 0:9c0917bfde97 742 }
GregCr 0:9c0917bfde97 743 else
GregCr 0:9c0917bfde97 744 {
GregCr 0:9c0917bfde97 745 Eeprom.EepromData.DemoSettings.CntPacketRxKO++;
GregCr 0:9c0917bfde97 746 }
GregCr 0:9c0917bfde97 747 DemoInternalState = SEND_PING_MSG;
GregCr 0:9c0917bfde97 748 refreshDisplay = 1;
GregCr 0:9c0917bfde97 749 break;
GregCr 0:9c0917bfde97 750
GregCr 0:9c0917bfde97 751 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 752 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 753 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 754 Eeprom.EepromData.DemoSettings.CntPacketRxKO++;
GregCr 0:9c0917bfde97 755 DemoInternalState = SEND_PING_MSG;
GregCr 0:9c0917bfde97 756 refreshDisplay = 1;
GregCr 0:9c0917bfde97 757 break;
GregCr 0:9c0917bfde97 758
GregCr 0:9c0917bfde97 759 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 760 printf( "Failure: timeout in Tx is shorter than the packet time on air\n\r" );
GregCr 0:9c0917bfde97 761 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 762 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 763 refreshDisplay = 1;
GregCr 0:9c0917bfde97 764 break;
GregCr 0:9c0917bfde97 765
GregCr 0:9c0917bfde97 766 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 767 break;
GregCr 0:9c0917bfde97 768
GregCr 0:9c0917bfde97 769 default:
GregCr 0:9c0917bfde97 770 break;
GregCr 0:9c0917bfde97 771 }
GregCr 0:9c0917bfde97 772 }
GregCr 0:9c0917bfde97 773 else // SLAVE
GregCr 0:9c0917bfde97 774 {
GregCr 0:9c0917bfde97 775 switch( DemoInternalState )
GregCr 0:9c0917bfde97 776 {
GregCr 0:9c0917bfde97 777 case SEND_PONG_MSG:
GregCr 0:9c0917bfde97 778 wait_ms( RX_TX_TRANSITION_WAIT );
GregCr 0:9c0917bfde97 779
GregCr 0:9c0917bfde97 780 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 781 // Send the next PING frame
GregCr 0:9c0917bfde97 782 Buffer[0] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 783 Buffer[1] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 784 Buffer[2] = ( Eeprom.EepromData.DemoSettings.CntPacketTx >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 785 Buffer[3] = ( Eeprom.EepromData.DemoSettings.CntPacketTx & 0xFF );
GregCr 0:9c0917bfde97 786 Buffer[4] = ( ( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 787 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 788 Buffer[5] = ( ( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 789 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 790 Buffer[6] = ( ( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 791 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 792 Buffer[7] = ( ( Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 793 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) & 0xFF );
GregCr 0:9c0917bfde97 794 Buffer[8] = PongMsg[0];
GregCr 0:9c0917bfde97 795 Buffer[9] = PongMsg[1];
GregCr 0:9c0917bfde97 796 Buffer[10] = PongMsg[2];
GregCr 0:9c0917bfde97 797 Buffer[11] = PongMsg[3];
GregCr 0:9c0917bfde97 798 for( i = 12; i < Eeprom.EepromData.DemoSettings.PayloadLength; i++ )
GregCr 0:9c0917bfde97 799 {
GregCr 0:9c0917bfde97 800 Buffer[i] = i;
GregCr 0:9c0917bfde97 801 }
GregCr 0:9c0917bfde97 802 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 803 IrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 804 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 805 Radio.SendPayload( Buffer, Eeprom.EepromData.DemoSettings.PayloadLength, \
GregCr 0:9c0917bfde97 806 ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 807 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 808 break;
GregCr 0:9c0917bfde97 809
GregCr 0:9c0917bfde97 810 case APP_TX:
GregCr 0:9c0917bfde97 811 if( ( Eeprom.EepromData.DemoSettings.MaxNumPacket != 0 ) \
GregCr 0:9c0917bfde97 812 && ( ( Eeprom.EepromData.DemoSettings.CntPacketRxOK + Eeprom.EepromData.DemoSettings.CntPacketRxKO + \
GregCr 0:9c0917bfde97 813 Eeprom.EepromData.DemoSettings.RxTimeOutCount ) >= Eeprom.EepromData.DemoSettings.MaxNumPacket ) )
GregCr 0:9c0917bfde97 814 {
GregCr 0:9c0917bfde97 815 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 816 SendNext = false;
GregCr 0:9c0917bfde97 817 RX_LED = 0;
GregCr 0:9c0917bfde97 818 TX_LED = 0;
GregCr 0:9c0917bfde97 819 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 820 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 821 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 822 refreshDisplay = 1;
GregCr 0:9c0917bfde97 823 }
GregCr 0:9c0917bfde97 824 else
GregCr 0:9c0917bfde97 825 {
GregCr 0:9c0917bfde97 826 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 827 TX_LED = !TX_LED;
GregCr 0:9c0917bfde97 828 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 829 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 830 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 831 Radio.SetRx( ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 832 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 833 refreshDisplay = 1;
GregCr 0:9c0917bfde97 834 }
GregCr 0:9c0917bfde97 835 break;
GregCr 0:9c0917bfde97 836
GregCr 0:9c0917bfde97 837 case APP_RX:
GregCr 0:9c0917bfde97 838 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 839 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 840 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 0:9c0917bfde97 841 Radio.GetPacketStatus( &PacketStatus );
GregCr 0:9c0917bfde97 842 if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 843 {
GregCr 0:9c0917bfde97 844 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.LoRa.RssiPkt;
GregCr 0:9c0917bfde97 845 Eeprom.EepromData.DemoSettings.SnrValue = PacketStatus.LoRa.SnrPkt;
GregCr 0:9c0917bfde97 846 }
GregCr 0:9c0917bfde97 847 else if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 848 {
GregCr 0:9c0917bfde97 849 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Flrc.RssiSync;
GregCr 0:9c0917bfde97 850 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 851 }
GregCr 0:9c0917bfde97 852 else if( Eeprom.EepromData.ModulationParams.PacketType == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 853 {
GregCr 0:9c0917bfde97 854 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.Gfsk.RssiSync;
GregCr 0:9c0917bfde97 855 Eeprom.EepromData.DemoSettings.SnrValue = 0;
GregCr 0:9c0917bfde97 856 }
GregCr 0:9c0917bfde97 857 if( ( BufferSize >= PINGPONG_SIZE ) && ( strncmp( ( const char* )( Buffer + 4 ), ( const char* )PingMsg, PINGPONG_SIZE ) == 0 ) )
GregCr 0:9c0917bfde97 858 {
GregCr 0:9c0917bfde97 859 ComputePingPongPayload( Buffer, BufferSize );
GregCr 0:9c0917bfde97 860 DemoInternalState = SEND_PONG_MSG;
GregCr 0:9c0917bfde97 861 }
GregCr 0:9c0917bfde97 862 else
GregCr 0:9c0917bfde97 863 {
GregCr 0:9c0917bfde97 864 Eeprom.EepromData.DemoSettings.CntPacketRxKO++;
GregCr 0:9c0917bfde97 865 RX_LED = !RX_LED;
GregCr 0:9c0917bfde97 866 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 867 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 868 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 869 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 870 refreshDisplay = 1;
GregCr 0:9c0917bfde97 871 }
GregCr 0:9c0917bfde97 872 break;
GregCr 0:9c0917bfde97 873
GregCr 0:9c0917bfde97 874 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 875 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 876 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 877 Eeprom.EepromData.DemoSettings.RxTimeOutCount++;
GregCr 0:9c0917bfde97 878 IrqMask = IRQ_RX_DONE | IRQ_CRC_ERROR | IRQ_RX_TX_TIMEOUT;
GregCr 0:9c0917bfde97 879 Radio.SetDioIrqParams( IrqMask, IrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 880 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, \
GregCr 0:9c0917bfde97 881 Eeprom.EepromData.DemoSettings.InterPacketDelay } );
GregCr 0:9c0917bfde97 882 refreshDisplay = 1;
GregCr 0:9c0917bfde97 883 break;
GregCr 0:9c0917bfde97 884
GregCr 0:9c0917bfde97 885 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 886 printf( "Failure: timeout in Tx is shorter than the packet time on air\n\r" );
GregCr 0:9c0917bfde97 887 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 888 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 889 refreshDisplay = 1;
GregCr 0:9c0917bfde97 890 break;
GregCr 0:9c0917bfde97 891
GregCr 0:9c0917bfde97 892 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 893 break;
GregCr 0:9c0917bfde97 894
GregCr 0:9c0917bfde97 895 default:
GregCr 0:9c0917bfde97 896 break;
GregCr 0:9c0917bfde97 897 }
GregCr 0:9c0917bfde97 898 }
GregCr 0:9c0917bfde97 899 return refreshDisplay;
GregCr 0:9c0917bfde97 900 }
GregCr 0:9c0917bfde97 901
GregCr 0:9c0917bfde97 902 void ComputePingPongPayload( uint8_t *buffer, uint8_t bufferSize )
GregCr 0:9c0917bfde97 903 {
GregCr 0:9c0917bfde97 904 uint32_t i = 0;
GregCr 0:9c0917bfde97 905
GregCr 0:9c0917bfde97 906 PacketRxSequence = ( ( uint32_t )buffer[0] << 24 ) | \
GregCr 0:9c0917bfde97 907 ( ( uint32_t )buffer[1] << 16 ) | \
GregCr 0:9c0917bfde97 908 ( ( uint32_t )buffer[2] << 8 ) | \
GregCr 0:9c0917bfde97 909 buffer[3];
GregCr 0:9c0917bfde97 910
GregCr 0:9c0917bfde97 911 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 912 {
GregCr 0:9c0917bfde97 913 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave =
GregCr 0:9c0917bfde97 914 ( ( uint32_t )buffer[4] << 24 ) | \
GregCr 0:9c0917bfde97 915 ( ( uint32_t )buffer[5] << 16 ) | \
GregCr 0:9c0917bfde97 916 ( ( uint32_t )buffer[6] << 8 ) | \
GregCr 0:9c0917bfde97 917 buffer[7];
GregCr 0:9c0917bfde97 918 if( PacketRxSequence > Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave )
GregCr 0:9c0917bfde97 919 {
GregCr 0:9c0917bfde97 920 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = PacketRxSequence - \
GregCr 0:9c0917bfde97 921 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave;
GregCr 0:9c0917bfde97 922 }
GregCr 0:9c0917bfde97 923 else
GregCr 0:9c0917bfde97 924 {
GregCr 0:9c0917bfde97 925 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = 0;
GregCr 0:9c0917bfde97 926 }
mverdy 14:ebd89dacc807 927
GregCr 0:9c0917bfde97 928 if( PacketRxSequence == Eeprom.EepromData.DemoSettings.CntPacketTx )
GregCr 0:9c0917bfde97 929 {
GregCr 0:9c0917bfde97 930 Eeprom.EepromData.DemoSettings.CntPacketRxOK += 1;
GregCr 0:9c0917bfde97 931 }
GregCr 0:9c0917bfde97 932 else
GregCr 0:9c0917bfde97 933 {
GregCr 0:9c0917bfde97 934 Eeprom.EepromData.DemoSettings.CntPacketRxKO += 1;
GregCr 0:9c0917bfde97 935 }
GregCr 0:9c0917bfde97 936 }
GregCr 0:9c0917bfde97 937 else
GregCr 0:9c0917bfde97 938 {
GregCr 0:9c0917bfde97 939 Eeprom.EepromData.DemoSettings.CntPacketRxOK += 1;
GregCr 0:9c0917bfde97 940 if( ( PacketRxSequence <= PacketRxSequencePrev ) || \
GregCr 0:9c0917bfde97 941 ( PacketRxSequencePrev == 0 ) )
GregCr 0:9c0917bfde97 942 {
GregCr 0:9c0917bfde97 943 // Sequence went back => resynchronization
GregCr 0:9c0917bfde97 944 // Don't count missed packets this time
GregCr 0:9c0917bfde97 945 i = 0;
GregCr 0:9c0917bfde97 946 }
GregCr 0:9c0917bfde97 947 else
GregCr 0:9c0917bfde97 948 {
GregCr 0:9c0917bfde97 949 // Determine number of missed packets
GregCr 0:9c0917bfde97 950 i = PacketRxSequence - PacketRxSequencePrev - 1;
GregCr 0:9c0917bfde97 951 }
GregCr 0:9c0917bfde97 952 // Be ready for the next
GregCr 0:9c0917bfde97 953 PacketRxSequencePrev = PacketRxSequence;
GregCr 0:9c0917bfde97 954 Eeprom.EepromData.DemoSettings.CntPacketTx = PacketRxSequence;
GregCr 0:9c0917bfde97 955 // increment 'missed' counter for the RX session
GregCr 0:9c0917bfde97 956 Eeprom.EepromData.DemoSettings.CntPacketRxKO += i;
GregCr 0:9c0917bfde97 957 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 958 }
GregCr 0:9c0917bfde97 959 }
GregCr 0:9c0917bfde97 960
GregCr 0:9c0917bfde97 961 // ************************ Ranging Demo *****************************
GregCr 0:9c0917bfde97 962 // * *
GregCr 0:9c0917bfde97 963 // * *
GregCr 0:9c0917bfde97 964 // * *
GregCr 0:9c0917bfde97 965 // *****************************************************************************
GregCr 0:9c0917bfde97 966 uint8_t RunDemoApplicationRanging( void )
GregCr 0:9c0917bfde97 967 {
GregCr 0:9c0917bfde97 968 uint8_t refreshDisplay = 0;
GregCr 0:9c0917bfde97 969
GregCr 0:9c0917bfde97 970 if( Eeprom.EepromData.DemoSettings.HoldDemo == true )
GregCr 0:9c0917bfde97 971 {
GregCr 0:9c0917bfde97 972 return 0; // quit without refresh display
GregCr 0:9c0917bfde97 973 }
GregCr 0:9c0917bfde97 974
GregCr 0:9c0917bfde97 975 if( DemoRunning == false )
GregCr 0:9c0917bfde97 976 {
GregCr 0:9c0917bfde97 977 DemoRunning = true;
GregCr 0:9c0917bfde97 978 TX_LED = 0;
GregCr 0:9c0917bfde97 979 RX_LED = 0;
GregCr 0:9c0917bfde97 980 ANT_SW = 1;
GregCr 0:9c0917bfde97 981
GregCr 0:9c0917bfde97 982 printf( "Start RunDemoApplicationRanging\r\n" );
GregCr 0:9c0917bfde97 983
GregCr 0:9c0917bfde97 984 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 985 Eeprom.EepromData.DemoSettings.RngFei = 0.0;
GregCr 0:9c0917bfde97 986 Eeprom.EepromData.DemoSettings.RngStatus = RNG_INIT;
GregCr 0:9c0917bfde97 987 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 988
GregCr 0:9c0917bfde97 989 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 990 {
GregCr 0:9c0917bfde97 991 Eeprom.EepromData.DemoSettings.InterPacketDelay = RefreshScreenDelayMs;
GregCr 8:c0a5f53fe196 992 Radio.SetDioIrqParams( IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_TIMEOUT,
GregCr 8:c0a5f53fe196 993 IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RANGING_MASTER_RESULT_VALID | IRQ_RANGING_MASTER_TIMEOUT,
GregCr 0:9c0917bfde97 994 IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 995 Eeprom.EepromData.DemoSettings.RngDistance = 0.0;
GregCr 0:9c0917bfde97 996 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 997 }
GregCr 0:9c0917bfde97 998 else
GregCr 0:9c0917bfde97 999 {
GregCr 0:9c0917bfde97 1000 Radio.SetDioIrqParams( IRQ_RADIO_ALL, IRQ_RADIO_ALL, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
GregCr 0:9c0917bfde97 1001 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1002 }
GregCr 0:9c0917bfde97 1003 }
GregCr 0:9c0917bfde97 1004
GregCr 0:9c0917bfde97 1005 if( Eeprom.EepromData.DemoSettings.Entity == MASTER )
GregCr 0:9c0917bfde97 1006 {
GregCr 0:9c0917bfde97 1007 switch( DemoInternalState )
GregCr 0:9c0917bfde97 1008 {
GregCr 0:9c0917bfde97 1009 case APP_RANGING_CONFIG:
GregCr 0:9c0917bfde97 1010 if( Eeprom.EepromData.DemoSettings.HoldDemo == false )
GregCr 0:9c0917bfde97 1011 {
GregCr 0:9c0917bfde97 1012 Eeprom.EepromData.DemoSettings.RngStatus = RNG_INIT;
GregCr 0:9c0917bfde97 1013 Eeprom.EepromData.DemoSettings.CntPacketTx++;
GregCr 0:9c0917bfde97 1014 ModulationParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1015 PacketParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1016 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1017 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1018 memcpy( &( ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_RNG_CODERATE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1019 memcpy( &( PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1020 memcpy( &( PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1021 PacketParams.Params.LoRa.PayloadLength = 7;
GregCr 8:c0a5f53fe196 1022 memcpy( &( PacketParams.Params.LoRa.Crc ), Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1023 memcpy( &( PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1024 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 0:9c0917bfde97 1025 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1026 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1027 Radio.SetRfFrequency( Eeprom.EepromData.DemoSettings.Frequency );
GregCr 0:9c0917bfde97 1028 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 1029 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = 0;
GregCr 0:9c0917bfde97 1030 MeasuredChannels = 0;
GregCr 0:9c0917bfde97 1031 CurrentChannel = 0;
GregCr 0:9c0917bfde97 1032 Buffer[0] = ( Eeprom.EepromData.DemoSettings.RngAddress >> 24 ) & 0xFF;
GregCr 0:9c0917bfde97 1033 Buffer[1] = ( Eeprom.EepromData.DemoSettings.RngAddress >> 16 ) & 0xFF;
GregCr 0:9c0917bfde97 1034 Buffer[2] = ( Eeprom.EepromData.DemoSettings.RngAddress >> 8 ) & 0xFF;
GregCr 0:9c0917bfde97 1035 Buffer[3] = ( Eeprom.EepromData.DemoSettings.RngAddress & 0xFF );
GregCr 0:9c0917bfde97 1036 Buffer[4] = CurrentChannel; // set the first channel to use
GregCr 0:9c0917bfde97 1037 Buffer[5] = Eeprom.EepromData.DemoSettings.RngAntenna; // set the antenna strategy
GregCr 0:9c0917bfde97 1038 Buffer[6] = Eeprom.EepromData.DemoSettings.RngRequestCount; // set the number of hops
GregCr 0:9c0917bfde97 1039 TX_LED = 1;
GregCr 0:9c0917bfde97 1040 Radio.SendPayload( Buffer, PacketParams.Params.LoRa.PayloadLength, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, RNG_COM_TIMEOUT } );
GregCr 0:9c0917bfde97 1041 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1042 }
GregCr 0:9c0917bfde97 1043 break;
GregCr 0:9c0917bfde97 1044
GregCr 0:9c0917bfde97 1045 case APP_RNG:
GregCr 0:9c0917bfde97 1046 if( SendNext == true )
GregCr 0:9c0917bfde97 1047 {
GregCr 0:9c0917bfde97 1048 SendNext = false;
GregCr 0:9c0917bfde97 1049 MeasuredChannels++;
GregCr 0:9c0917bfde97 1050 if( MeasuredChannels <= Eeprom.EepromData.DemoSettings.RngRequestCount )
GregCr 0:9c0917bfde97 1051 {
GregCr 0:9c0917bfde97 1052 Radio.SetRfFrequency( Channels[CurrentChannel] );
GregCr 0:9c0917bfde97 1053 TX_LED = 1;
GregCr 0:9c0917bfde97 1054 switch( Eeprom.EepromData.DemoSettings.RngAntenna )
GregCr 0:9c0917bfde97 1055 {
GregCr 0:9c0917bfde97 1056 case DEMO_RNG_ANT_1:
GregCr 7:bc2f0fe8056f 1057 //ANT_SW = 1; // ANT1
GregCr 7:bc2f0fe8056f 1058 Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
GregCr 0:9c0917bfde97 1059 CurrentChannel++;
GregCr 0:9c0917bfde97 1060 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1061 {
GregCr 0:9c0917bfde97 1062 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1063 }
GregCr 0:9c0917bfde97 1064 break;
GregCr 0:9c0917bfde97 1065
GregCr 0:9c0917bfde97 1066 case DEMO_RNG_ANT_2:
GregCr 7:bc2f0fe8056f 1067 //ANT_SW = 0; // ANT2
GregCr 7:bc2f0fe8056f 1068 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
GregCr 0:9c0917bfde97 1069 CurrentChannel++;
GregCr 0:9c0917bfde97 1070 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1071 {
GregCr 0:9c0917bfde97 1072 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1073 }
GregCr 0:9c0917bfde97 1074 break;
GregCr 0:9c0917bfde97 1075
GregCr 0:9c0917bfde97 1076 case DEMO_RNG_ANT_BOTH:
GregCr 0:9c0917bfde97 1077 if( ANT_SW == 1 )
GregCr 0:9c0917bfde97 1078 {
GregCr 7:bc2f0fe8056f 1079 //ANT_SW = 0;
GregCr 7:bc2f0fe8056f 1080 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
GregCr 0:9c0917bfde97 1081 }
GregCr 0:9c0917bfde97 1082 else
GregCr 0:9c0917bfde97 1083 {
GregCr 7:bc2f0fe8056f 1084 //ANT_SW = 1;
GregCr 7:bc2f0fe8056f 1085 Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
GregCr 0:9c0917bfde97 1086 CurrentChannel++;
GregCr 0:9c0917bfde97 1087 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1088 {
GregCr 0:9c0917bfde97 1089 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1090 }
GregCr 0:9c0917bfde97 1091 }
GregCr 0:9c0917bfde97 1092 break;
GregCr 0:9c0917bfde97 1093 }
GregCr 0:9c0917bfde97 1094 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 1095 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1096 Radio.SetTx( ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, 0xFFFF } );
GregCr 0:9c0917bfde97 1097 }
GregCr 0:9c0917bfde97 1098 else
GregCr 0:9c0917bfde97 1099 {
GregCr 0:9c0917bfde97 1100 Eeprom.EepromData.DemoSettings.CntPacketRxOKSlave = CheckDistance( );
GregCr 0:9c0917bfde97 1101 refreshDisplay = 1;
GregCr 0:9c0917bfde97 1102 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1103 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 1104 SendNext = false;
GregCr 0:9c0917bfde97 1105 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1106 }
GregCr 0:9c0917bfde97 1107 }
GregCr 0:9c0917bfde97 1108 break;
GregCr 0:9c0917bfde97 1109
GregCr 0:9c0917bfde97 1110 case APP_RANGING_DONE:
GregCr 0:9c0917bfde97 1111 TX_LED = 0;
GregCr 0:9c0917bfde97 1112 RawRngResults[RngResultIndex++] = Radio.GetRangingResult( RANGING_RESULT_RAW );
GregCr 0:9c0917bfde97 1113 Eeprom.EepromData.DemoSettings.CntPacketRxOK++;
GregCr 0:9c0917bfde97 1114 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1115 break;
GregCr 0:9c0917bfde97 1116
GregCr 0:9c0917bfde97 1117 case APP_RANGING_TIMEOUT:
GregCr 0:9c0917bfde97 1118 TX_LED = 0;
GregCr 0:9c0917bfde97 1119 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1120 break;
GregCr 0:9c0917bfde97 1121
GregCr 0:9c0917bfde97 1122 case APP_RX:
GregCr 0:9c0917bfde97 1123 RX_LED = 0;
GregCr 0:9c0917bfde97 1124 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_INIT )
GregCr 0:9c0917bfde97 1125 {
GregCr 0:9c0917bfde97 1126 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 0:9c0917bfde97 1127 if( BufferSize > 0 )
GregCr 0:9c0917bfde97 1128 {
GregCr 0:9c0917bfde97 1129 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 1130 Eeprom.EepromData.DemoSettings.RngStatus = RNG_PROCESS;
GregCr 0:9c0917bfde97 1131 Eeprom.EepromData.DemoSettings.RngFei = ( double )( ( ( int32_t )Buffer[4] << 24 ) | \
GregCr 0:9c0917bfde97 1132 ( ( int32_t )Buffer[5] << 16 ) | \
GregCr 0:9c0917bfde97 1133 ( ( int32_t )Buffer[6] << 8 ) | \
GregCr 0:9c0917bfde97 1134 Buffer[7] );
GregCr 0:9c0917bfde97 1135 Eeprom.EepromData.DemoSettings.RssiValue = Buffer[8]; // for ranging post-traitment (since V3 only)
GregCr 0:9c0917bfde97 1136 ModulationParams.PacketType = PACKET_TYPE_RANGING;
GregCr 0:9c0917bfde97 1137 PacketParams.PacketType = PACKET_TYPE_RANGING;
GregCr 0:9c0917bfde97 1138
GregCr 0:9c0917bfde97 1139 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1140 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1141 memcpy( &( ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_RNG_CODERATE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1142 memcpy( &( PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1143 memcpy( &( PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1144 PacketParams.Params.LoRa.PayloadLength = 10;
GregCr 8:c0a5f53fe196 1145 memcpy( &( PacketParams.Params.LoRa.Crc ), Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1146 memcpy( &( PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1147
GregCr 0:9c0917bfde97 1148 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 0:9c0917bfde97 1149 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1150 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1151 Radio.SetRangingRequestAddress( Eeprom.EepromData.DemoSettings.RngAddress );
GregCr 0:9c0917bfde97 1152 Radio.SetRangingCalibration( Eeprom.EepromData.DemoSettings.RngCalib );
GregCr 0:9c0917bfde97 1153 Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
GregCr 0:9c0917bfde97 1154
GregCr 0:9c0917bfde97 1155 MeasuredChannels = 0;
GregCr 0:9c0917bfde97 1156 RngResultIndex = 0;
GregCr 0:9c0917bfde97 1157 SendNextPacket.attach_us( &SendNextPacketEvent, Eeprom.EepromData.DemoSettings.RngReqDelay * 1000 );
GregCr 0:9c0917bfde97 1158 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1159 }
GregCr 0:9c0917bfde97 1160 else
GregCr 0:9c0917bfde97 1161 {
GregCr 0:9c0917bfde97 1162 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1163 }
GregCr 0:9c0917bfde97 1164 }
GregCr 0:9c0917bfde97 1165 else
GregCr 0:9c0917bfde97 1166 {
GregCr 0:9c0917bfde97 1167 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1168 }
GregCr 0:9c0917bfde97 1169 break;
GregCr 0:9c0917bfde97 1170
GregCr 0:9c0917bfde97 1171 case APP_TX:
GregCr 0:9c0917bfde97 1172 TX_LED = 0;
GregCr 0:9c0917bfde97 1173 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_INIT )
GregCr 0:9c0917bfde97 1174 {
GregCr 0:9c0917bfde97 1175 RX_LED = 1;
GregCr 0:9c0917bfde97 1176 Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RNG_COM_TIMEOUT } );
GregCr 0:9c0917bfde97 1177 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1178 }
GregCr 0:9c0917bfde97 1179 else
GregCr 0:9c0917bfde97 1180 {
GregCr 0:9c0917bfde97 1181 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1182 }
GregCr 0:9c0917bfde97 1183 break;
GregCr 0:9c0917bfde97 1184
GregCr 0:9c0917bfde97 1185 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 1186 RX_LED = 0;
GregCr 0:9c0917bfde97 1187 Eeprom.EepromData.DemoSettings.RngStatus = RNG_TIMEOUT;
GregCr 0:9c0917bfde97 1188 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1189 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 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_RX_ERROR:
GregCr 0:9c0917bfde97 1194 RX_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_TX_TIMEOUT:
GregCr 0:9c0917bfde97 1201 TX_LED = 0;
GregCr 0:9c0917bfde97 1202 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1203 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 8:c0a5f53fe196 1204 refreshDisplay = 1; // display error on token color (RNG_TIMEOUT)
GregCr 0:9c0917bfde97 1205 break;
GregCr 0:9c0917bfde97 1206
GregCr 0:9c0917bfde97 1207 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 1208 break;
GregCr 0:9c0917bfde97 1209
GregCr 0:9c0917bfde97 1210 default:
GregCr 0:9c0917bfde97 1211 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1212 Eeprom.EepromData.DemoSettings.HoldDemo = true;
GregCr 0:9c0917bfde97 1213 break;
GregCr 0:9c0917bfde97 1214 }
GregCr 0:9c0917bfde97 1215 }
GregCr 0:9c0917bfde97 1216 else // Slave
GregCr 0:9c0917bfde97 1217 {
GregCr 0:9c0917bfde97 1218 switch( DemoInternalState )
GregCr 0:9c0917bfde97 1219 {
GregCr 0:9c0917bfde97 1220 case APP_RANGING_CONFIG:
GregCr 0:9c0917bfde97 1221 Eeprom.EepromData.DemoSettings.RngStatus = RNG_INIT;
GregCr 0:9c0917bfde97 1222 ModulationParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1223 PacketParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1224 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1225 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1226 memcpy( &( ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_RNG_CODERATE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1227 memcpy( &( PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1228 memcpy( &( PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1229 PacketParams.Params.LoRa.PayloadLength = 9;
GregCr 8:c0a5f53fe196 1230 memcpy( &( PacketParams.Params.LoRa.Crc ), Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1231 memcpy( &( PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1232 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 0:9c0917bfde97 1233 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1234 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1235 Radio.SetRfFrequency( Eeprom.EepromData.DemoSettings.Frequency );
GregCr 0:9c0917bfde97 1236 RX_LED = 1;
GregCr 0:9c0917bfde97 1237 // use listen mode here instead of rx continuous
GregCr 0:9c0917bfde97 1238 Radio.SetRx( ( TickTime_t ) { RADIO_TICK_SIZE_1000_US, 0xFFFF } );
GregCr 0:9c0917bfde97 1239 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1240 break;
GregCr 0:9c0917bfde97 1241
GregCr 0:9c0917bfde97 1242 case APP_RNG:
GregCr 0:9c0917bfde97 1243 if( SendNext == true )
GregCr 0:9c0917bfde97 1244 {
GregCr 0:9c0917bfde97 1245 SendNext = false;
GregCr 0:9c0917bfde97 1246 MeasuredChannels++;
GregCr 0:9c0917bfde97 1247 if( MeasuredChannels <= Eeprom.EepromData.DemoSettings.RngRequestCount )
GregCr 0:9c0917bfde97 1248 {
GregCr 0:9c0917bfde97 1249 Radio.SetRfFrequency( Channels[CurrentChannel] );
GregCr 0:9c0917bfde97 1250 RX_LED = 1;
GregCr 0:9c0917bfde97 1251 switch( Eeprom.EepromData.DemoSettings.RngAntenna )
GregCr 0:9c0917bfde97 1252 {
GregCr 0:9c0917bfde97 1253 case DEMO_RNG_ANT_1:
GregCr 8:c0a5f53fe196 1254 //ANT_SW = 1; // ANT1
GregCr 8:c0a5f53fe196 1255 Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
GregCr 0:9c0917bfde97 1256 CurrentChannel++;
GregCr 0:9c0917bfde97 1257 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1258 {
GregCr 0:9c0917bfde97 1259 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1260 }
GregCr 0:9c0917bfde97 1261 break;
GregCr 0:9c0917bfde97 1262
GregCr 0:9c0917bfde97 1263 case DEMO_RNG_ANT_2:
GregCr 8:c0a5f53fe196 1264 //ANT_SW = 0; // ANT2
GregCr 8:c0a5f53fe196 1265 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
GregCr 0:9c0917bfde97 1266 CurrentChannel++;
GregCr 0:9c0917bfde97 1267 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1268 {
GregCr 0:9c0917bfde97 1269 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1270 }
GregCr 0:9c0917bfde97 1271 break;
GregCr 0:9c0917bfde97 1272
GregCr 0:9c0917bfde97 1273 case DEMO_RNG_ANT_BOTH:
GregCr 0:9c0917bfde97 1274 if( ANT_SW == 1 )
GregCr 0:9c0917bfde97 1275 {
GregCr 8:c0a5f53fe196 1276 //ANT_SW = 0;
GregCr 8:c0a5f53fe196 1277 Eeprom.EepromData.DemoSettings.AntennaSwitch = 1;
GregCr 0:9c0917bfde97 1278 }
GregCr 0:9c0917bfde97 1279 else
GregCr 0:9c0917bfde97 1280 {
GregCr 8:c0a5f53fe196 1281 //ANT_SW = 1;
GregCr 8:c0a5f53fe196 1282 Eeprom.EepromData.DemoSettings.AntennaSwitch = 0;
GregCr 0:9c0917bfde97 1283 CurrentChannel++;
GregCr 0:9c0917bfde97 1284 if( CurrentChannel >= CHANNELS )
GregCr 0:9c0917bfde97 1285 {
GregCr 0:9c0917bfde97 1286 CurrentChannel -= CHANNELS;
GregCr 0:9c0917bfde97 1287 }
GregCr 0:9c0917bfde97 1288 }
GregCr 0:9c0917bfde97 1289 break;
GregCr 0:9c0917bfde97 1290 }
GregCr 0:9c0917bfde97 1291 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 1292 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1293 Radio.SetRx( ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, Eeprom.EepromData.DemoSettings.RngReqDelay } );
GregCr 0:9c0917bfde97 1294 }
GregCr 0:9c0917bfde97 1295 else
GregCr 0:9c0917bfde97 1296 {
mverdy 14:ebd89dacc807 1297 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 1298 refreshDisplay = 1;
GregCr 0:9c0917bfde97 1299 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1300 Eeprom.EepromData.DemoSettings.RngStatus = RNG_VALID;
GregCr 0:9c0917bfde97 1301 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1302 }
GregCr 0:9c0917bfde97 1303 }
GregCr 0:9c0917bfde97 1304 break;
GregCr 0:9c0917bfde97 1305
GregCr 0:9c0917bfde97 1306 case APP_RANGING_DONE:
GregCr 0:9c0917bfde97 1307 RX_LED = 0;
GregCr 0:9c0917bfde97 1308 Eeprom.EepromData.DemoSettings.CntPacketRxOK++;
GregCr 0:9c0917bfde97 1309 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1310 break;
GregCr 0:9c0917bfde97 1311
GregCr 0:9c0917bfde97 1312 case APP_RANGING_TIMEOUT:
GregCr 0:9c0917bfde97 1313 RX_LED = 0;
GregCr 0:9c0917bfde97 1314 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1315 break;
GregCr 0:9c0917bfde97 1316
GregCr 0:9c0917bfde97 1317 case APP_RX:
GregCr 0:9c0917bfde97 1318 RX_LED = 0;
GregCr 0:9c0917bfde97 1319 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_INIT )
GregCr 0:9c0917bfde97 1320 {
GregCr 0:9c0917bfde97 1321 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
GregCr 1:dbcb3698f73a 1322 Radio.GetPacketStatus( &PacketStatus );
GregCr 0:9c0917bfde97 1323 if( ( BufferSize > 0 ) && \
GregCr 0:9c0917bfde97 1324 ( Buffer[0] == ( ( Eeprom.EepromData.DemoSettings.RngAddress >> 24 ) & 0xFF ) ) && \
GregCr 0:9c0917bfde97 1325 ( Buffer[1] == ( ( Eeprom.EepromData.DemoSettings.RngAddress >> 16 ) & 0xFF ) ) && \
GregCr 0:9c0917bfde97 1326 ( Buffer[2] == ( ( Eeprom.EepromData.DemoSettings.RngAddress >> 8 ) & 0xFF ) ) && \
GregCr 0:9c0917bfde97 1327 ( Buffer[3] == ( Eeprom.EepromData.DemoSettings.RngAddress & 0xFF ) ) )
GregCr 0:9c0917bfde97 1328 {
GregCr 0:9c0917bfde97 1329 Eeprom.EepromData.DemoSettings.RngFei = Radio.GetFrequencyError( );
GregCr 1:dbcb3698f73a 1330 Eeprom.EepromData.DemoSettings.RssiValue = PacketStatus.LoRa.RssiPkt;
GregCr 0:9c0917bfde97 1331 Eeprom.EepromData.DemoSettings.CntPacketTx++;
GregCr 0:9c0917bfde97 1332 CurrentChannel = Buffer[4];
GregCr 0:9c0917bfde97 1333 Eeprom.EepromData.DemoSettings.RngAntenna = Buffer[5];
GregCr 0:9c0917bfde97 1334 Eeprom.EepromData.DemoSettings.RngRequestCount = Buffer[6];
GregCr 0:9c0917bfde97 1335 wait_us( 10 );
GregCr 0:9c0917bfde97 1336 Buffer[4] = ( ( ( int32_t )Eeprom.EepromData.DemoSettings.RngFei ) >> 24 ) & 0xFF ;
GregCr 0:9c0917bfde97 1337 Buffer[5] = ( ( ( int32_t )Eeprom.EepromData.DemoSettings.RngFei ) >> 16 ) & 0xFF ;
GregCr 0:9c0917bfde97 1338 Buffer[6] = ( ( ( int32_t )Eeprom.EepromData.DemoSettings.RngFei ) >> 8 ) & 0xFF ;
GregCr 0:9c0917bfde97 1339 Buffer[7] = ( ( ( int32_t )Eeprom.EepromData.DemoSettings.RngFei ) & 0xFF );
GregCr 0:9c0917bfde97 1340 Buffer[8] = Eeprom.EepromData.DemoSettings.RssiValue;
GregCr 0:9c0917bfde97 1341 TX_LED = 1;
GregCr 0:9c0917bfde97 1342 Radio.SendPayload( Buffer, 9, ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, RNG_COM_TIMEOUT } );
GregCr 0:9c0917bfde97 1343 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1344 }
GregCr 0:9c0917bfde97 1345 }
GregCr 0:9c0917bfde97 1346 else
GregCr 0:9c0917bfde97 1347 {
GregCr 0:9c0917bfde97 1348 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1349 }
GregCr 0:9c0917bfde97 1350 break;
GregCr 0:9c0917bfde97 1351
GregCr 0:9c0917bfde97 1352 case APP_TX:
GregCr 0:9c0917bfde97 1353 TX_LED = 0;
GregCr 0:9c0917bfde97 1354 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_INIT )
GregCr 0:9c0917bfde97 1355 {
GregCr 0:9c0917bfde97 1356 Eeprom.EepromData.DemoSettings.RngStatus = RNG_PROCESS;
GregCr 0:9c0917bfde97 1357
GregCr 0:9c0917bfde97 1358 ModulationParams.PacketType = PACKET_TYPE_RANGING;
GregCr 0:9c0917bfde97 1359 PacketParams.PacketType = PACKET_TYPE_RANGING;
GregCr 0:9c0917bfde97 1360
GregCr 0:9c0917bfde97 1361 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1362 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1363 memcpy( &( ModulationParams.Params.LoRa.CodingRate ), Eeprom.Buffer + MOD_RNG_CODERATE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1364 memcpy( &( PacketParams.Params.LoRa.PreambleLength ), Eeprom.Buffer + PAK_RNG_PREAMBLE_LEN_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1365 memcpy( &( PacketParams.Params.LoRa.HeaderType ), Eeprom.Buffer + PAK_RNG_HEADERTYPE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1366 PacketParams.Params.LoRa.PayloadLength = 10;
GregCr 8:c0a5f53fe196 1367 memcpy( &( PacketParams.Params.LoRa.Crc ), Eeprom.Buffer + PAK_RNG_CRC_MODE_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1368 memcpy( &( PacketParams.Params.LoRa.InvertIQ ), Eeprom.Buffer + PAK_RNG_IQ_INV_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1369
GregCr 0:9c0917bfde97 1370 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 4:e9daf4ed7b4c 1371
GregCr 0:9c0917bfde97 1372 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1373 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1374 Radio.SetDeviceRangingAddress( Eeprom.EepromData.DemoSettings.RngAddress );
GregCr 0:9c0917bfde97 1375 Radio.SetRangingCalibration( Eeprom.EepromData.DemoSettings.RngCalib );
GregCr 0:9c0917bfde97 1376 Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
GregCr 0:9c0917bfde97 1377 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 1378 MeasuredChannels = 0;
GregCr 0:9c0917bfde97 1379 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave = 0;
GregCr 0:9c0917bfde97 1380 SendNextPacket.attach_us( &SendNextPacketEvent, Eeprom.EepromData.DemoSettings.RngReqDelay * 1000 );
GregCr 0:9c0917bfde97 1381 DemoInternalState = APP_RNG;
GregCr 0:9c0917bfde97 1382 }
GregCr 0:9c0917bfde97 1383 else
GregCr 0:9c0917bfde97 1384 {
GregCr 0:9c0917bfde97 1385 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1386 }
GregCr 0:9c0917bfde97 1387 break;
GregCr 0:9c0917bfde97 1388
GregCr 0:9c0917bfde97 1389 case APP_RX_TIMEOUT:
GregCr 0:9c0917bfde97 1390 RX_LED = 0;
GregCr 0:9c0917bfde97 1391 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1392 break;
GregCr 0:9c0917bfde97 1393
GregCr 0:9c0917bfde97 1394 case APP_RX_ERROR:
GregCr 0:9c0917bfde97 1395 RX_LED = 0;
GregCr 0:9c0917bfde97 1396 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1397 break;
GregCr 0:9c0917bfde97 1398
GregCr 0:9c0917bfde97 1399 case APP_TX_TIMEOUT:
GregCr 0:9c0917bfde97 1400 TX_LED = 0;
GregCr 0:9c0917bfde97 1401 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1402 break;
GregCr 0:9c0917bfde97 1403
GregCr 0:9c0917bfde97 1404 case APP_IDLE: // do nothing
GregCr 0:9c0917bfde97 1405 if( Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave > DEMO_RNG_CHANNELS_COUNT_MAX )
GregCr 0:9c0917bfde97 1406 {
GregCr 0:9c0917bfde97 1407 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave = 0;
GregCr 0:9c0917bfde97 1408 refreshDisplay = 1;
GregCr 0:9c0917bfde97 1409 RX_LED = 0;
GregCr 0:9c0917bfde97 1410 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1411 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1412 }
GregCr 0:9c0917bfde97 1413 break;
GregCr 0:9c0917bfde97 1414
GregCr 0:9c0917bfde97 1415 default:
GregCr 0:9c0917bfde97 1416 DemoInternalState = APP_RANGING_CONFIG;
GregCr 0:9c0917bfde97 1417 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1418 break;
GregCr 0:9c0917bfde97 1419 }
GregCr 0:9c0917bfde97 1420 }
GregCr 0:9c0917bfde97 1421 return refreshDisplay;
GregCr 0:9c0917bfde97 1422 }
GregCr 0:9c0917bfde97 1423
GregCr 0:9c0917bfde97 1424 // ************************ Utils ****************************
GregCr 0:9c0917bfde97 1425 // * *
GregCr 0:9c0917bfde97 1426 // * *
GregCr 0:9c0917bfde97 1427 // * *
GregCr 0:9c0917bfde97 1428 // *****************************************************************************
GregCr 0:9c0917bfde97 1429
GregCr 0:9c0917bfde97 1430 void InitDemoApplication( void )
GregCr 0:9c0917bfde97 1431 {
GregCr 0:9c0917bfde97 1432 RX_LED = 1;
GregCr 0:9c0917bfde97 1433 TX_LED = 1;
GregCr 0:9c0917bfde97 1434
GregCr 0:9c0917bfde97 1435 SetAntennaSwitch( );
GregCr 0:9c0917bfde97 1436
GregCr 0:9c0917bfde97 1437 wait_ms( 500 ); // wait for on board DC/DC start-up time
GregCr 0:9c0917bfde97 1438
GregCr 0:9c0917bfde97 1439 Radio.Init( );
GregCr 0:9c0917bfde97 1440
GregCr 0:9c0917bfde97 1441 // Can also be set in LDO mode but consume more power
GregCr 0:9c0917bfde97 1442 Radio.SetRegulatorMode( ( RadioRegulatorModes_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
GregCr 0:9c0917bfde97 1443 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 1444
GregCr 0:9c0917bfde97 1445 memset( &Buffer, 0x00, BufferSize );
GregCr 0:9c0917bfde97 1446
GregCr 0:9c0917bfde97 1447 RX_LED = 0;
GregCr 0:9c0917bfde97 1448 TX_LED = 0;
GregCr 0:9c0917bfde97 1449
GregCr 0:9c0917bfde97 1450 PacketRxSequence = 0;
GregCr 0:9c0917bfde97 1451 PacketRxSequencePrev = 0;
GregCr 0:9c0917bfde97 1452 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 1453 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 1454 Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0;
GregCr 0:9c0917bfde97 1455 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 1456 }
GregCr 0:9c0917bfde97 1457
GregCr 0:9c0917bfde97 1458 void StopDemoApplication( void )
GregCr 0:9c0917bfde97 1459 {
GregCr 0:9c0917bfde97 1460 if( DemoRunning == true )
GregCr 0:9c0917bfde97 1461 {
GregCr 0:9c0917bfde97 1462 __disable_irq( ); // Disable Interrupts
GregCr 0:9c0917bfde97 1463
GregCr 0:9c0917bfde97 1464 printf( "StopDemoApplication\n\r" );
GregCr 0:9c0917bfde97 1465 if( Radio.GetOpMode( ) == MODE_SLEEP )
GregCr 0:9c0917bfde97 1466 {
GregCr 5:a0f5842fb337 1467 Radio.Wakeup( );
GregCr 0:9c0917bfde97 1468 InitializeDemoParameters( Eeprom.EepromData.DemoSettings.ModulationType );
GregCr 0:9c0917bfde97 1469 }
GregCr 0:9c0917bfde97 1470 RX_LED = 0;
GregCr 0:9c0917bfde97 1471 TX_LED = 0;
GregCr 0:9c0917bfde97 1472 DemoRunning = false;
GregCr 0:9c0917bfde97 1473 SendNext = false;
GregCr 0:9c0917bfde97 1474 PacketRxSequence = 0;
GregCr 0:9c0917bfde97 1475 PacketRxSequencePrev = 0;
GregCr 0:9c0917bfde97 1476 Eeprom.EepromData.DemoSettings.CntPacketTx = 0;
GregCr 0:9c0917bfde97 1477 Eeprom.EepromData.DemoSettings.CntPacketRxOK = 0;
GregCr 0:9c0917bfde97 1478 Eeprom.EepromData.DemoSettings.CntPacketRxKO = 0;
GregCr 0:9c0917bfde97 1479 Eeprom.EepromData.DemoSettings.RxTimeOutCount = 0;
GregCr 0:9c0917bfde97 1480
GregCr 0:9c0917bfde97 1481 Radio.SetAutoFs( false );
GregCr 0:9c0917bfde97 1482 DemoInternalState = APP_IDLE;
GregCr 0:9c0917bfde97 1483 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 1484 Radio.ClearIrqStatus( IRQ_RADIO_ALL );
GregCr 0:9c0917bfde97 1485 SendNextPacket.detach( );
GregCr 0:9c0917bfde97 1486
GregCr 0:9c0917bfde97 1487 __enable_irq( ); // Enable Interrupts
GregCr 0:9c0917bfde97 1488 }
GregCr 0:9c0917bfde97 1489 }
GregCr 0:9c0917bfde97 1490
GregCr 0:9c0917bfde97 1491 /*
GregCr 0:9c0917bfde97 1492 * Function still being implemented >>> To be completed
GregCr 0:9c0917bfde97 1493 * WARNING: Computation is in float and his really slow
GregCr 0:9c0917bfde97 1494 * LongInterLeaving vs LegacyInterLeaving has no influence on TimeOnAir.
GregCr 0:9c0917bfde97 1495 */
GregCr 0:9c0917bfde97 1496 uint16_t GetTimeOnAir( uint8_t modulation )
GregCr 0:9c0917bfde97 1497 {
GregCr 0:9c0917bfde97 1498 uint16_t result = 2000;
GregCr 0:9c0917bfde97 1499
GregCr 0:9c0917bfde97 1500 if( modulation == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 1501 {
GregCr 0:9c0917bfde97 1502 double bw = 0.0;
GregCr 0:9c0917bfde97 1503
GregCr 0:9c0917bfde97 1504 switch( Eeprom.EepromData.ModulationParams.Params.LoRa.Bandwidth )
GregCr 0:9c0917bfde97 1505 {
GregCr 0:9c0917bfde97 1506 case LORA_BW_0200:
GregCr 0:9c0917bfde97 1507 bw = 203e3;
GregCr 0:9c0917bfde97 1508 break;
GregCr 0:9c0917bfde97 1509
GregCr 0:9c0917bfde97 1510 case LORA_BW_0400:
GregCr 0:9c0917bfde97 1511 bw = 406e3;
GregCr 0:9c0917bfde97 1512 break;
GregCr 0:9c0917bfde97 1513
GregCr 0:9c0917bfde97 1514 case LORA_BW_0800:
GregCr 0:9c0917bfde97 1515 bw = 812e3;
GregCr 0:9c0917bfde97 1516 break;
GregCr 0:9c0917bfde97 1517
GregCr 0:9c0917bfde97 1518 case LORA_BW_1600:
GregCr 0:9c0917bfde97 1519 bw = 1625e3;
GregCr 0:9c0917bfde97 1520 break;
GregCr 0:9c0917bfde97 1521
GregCr 0:9c0917bfde97 1522 default:
GregCr 0:9c0917bfde97 1523 bw = 100e3;
GregCr 0:9c0917bfde97 1524 break;
GregCr 0:9c0917bfde97 1525 }
GregCr 0:9c0917bfde97 1526 double rs = bw / ( 1 << ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) ); // Symbol rate : time for one symbol (secs)
GregCr 0:9c0917bfde97 1527 double ts = 1 / rs;
GregCr 0:9c0917bfde97 1528 double tPreamble = ( Eeprom.EepromData.PacketParams.Params.LoRa.PreambleLength + 4.25 ) * ts; // time of preamble
GregCr 0:9c0917bfde97 1529 uint8_t de = 1; // always 1 on SX1280. "low data rate optimization" condition.
GregCr 0:9c0917bfde97 1530 double tmp = ceil( ( 8 * Eeprom.EepromData.PacketParams.Params.LoRa.PayloadLength - 4 * ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) +
GregCr 8:c0a5f53fe196 1531 28 + 16 * ( ( Eeprom.EepromData.PacketParams.Params.LoRa.Crc == 0x00 ) ? 0 : 1 ) - \
GregCr 0:9c0917bfde97 1532 ( ( Eeprom.EepromData.PacketParams.Params.LoRa.HeaderType >> 7 ) ? 20 : 0 ) ) / \
GregCr 0:9c0917bfde97 1533 ( double )( 4 * ( ( Eeprom.EepromData.ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - ( de * 2 ) ) ) * \
GregCr 0:9c0917bfde97 1534 ( ( Eeprom.EepromData.ModulationParams.Params.LoRa.CodingRate % 4 ) + 4 ) ); // Symbol length of payload and time
GregCr 0:9c0917bfde97 1535 double nPayload = 8 + ( ( tmp > 0 ) ? tmp : 0 );
GregCr 0:9c0917bfde97 1536 double tPayload = nPayload * ts;
GregCr 0:9c0917bfde97 1537
GregCr 0:9c0917bfde97 1538 // Time on air [ms]
GregCr 0:9c0917bfde97 1539 result = floor( ( ( tPreamble + tPayload ) * 1000 * 1.2 ) + 0.999 ); // Set some margin
GregCr 0:9c0917bfde97 1540 result *= 1.8; // Set some margin
GregCr 0:9c0917bfde97 1541 }
GregCr 0:9c0917bfde97 1542 else if( modulation == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 1543 {
GregCr 0:9c0917bfde97 1544 uint16_t packetBitCount;
GregCr 0:9c0917bfde97 1545
GregCr 0:9c0917bfde97 1546 switch( Eeprom.EepromData.PacketParams.Params.Flrc.PreambleLength )
GregCr 0:9c0917bfde97 1547 {
GregCr 0:9c0917bfde97 1548 case PREAMBLE_LENGTH_04_BITS: // Preamble length: 04 bits
GregCr 0:9c0917bfde97 1549 case PREAMBLE_LENGTH_08_BITS: // Preamble length: 08 bits
GregCr 0:9c0917bfde97 1550 packetBitCount = 1;
GregCr 0:9c0917bfde97 1551 break;
GregCr 0:9c0917bfde97 1552
GregCr 0:9c0917bfde97 1553 case PREAMBLE_LENGTH_12_BITS: // Preamble length: 12 bits
GregCr 0:9c0917bfde97 1554 case PREAMBLE_LENGTH_16_BITS: // Preamble length: 16 bits
GregCr 0:9c0917bfde97 1555 packetBitCount = 2;
GregCr 0:9c0917bfde97 1556 break;
GregCr 0:9c0917bfde97 1557
GregCr 0:9c0917bfde97 1558 case PREAMBLE_LENGTH_20_BITS: // Preamble length: 20 bits
GregCr 0:9c0917bfde97 1559 case PREAMBLE_LENGTH_24_BITS: // Preamble length: 24 bits
GregCr 0:9c0917bfde97 1560 packetBitCount = 3;
GregCr 0:9c0917bfde97 1561 break;
GregCr 0:9c0917bfde97 1562
GregCr 0:9c0917bfde97 1563 case PREAMBLE_LENGTH_28_BITS: // Preamble length: 28 bits
GregCr 0:9c0917bfde97 1564 case PREAMBLE_LENGTH_32_BITS: // Preamble length: 32 bits
GregCr 0:9c0917bfde97 1565 packetBitCount = 4;
GregCr 0:9c0917bfde97 1566 break;
GregCr 0:9c0917bfde97 1567
GregCr 0:9c0917bfde97 1568 default:
GregCr 0:9c0917bfde97 1569 packetBitCount = 4;
GregCr 0:9c0917bfde97 1570 break;
GregCr 0:9c0917bfde97 1571 }
GregCr 0:9c0917bfde97 1572 packetBitCount += 3; // Preamble 21 bits
GregCr 0:9c0917bfde97 1573 switch( Eeprom.EepromData.PacketParams.Params.Flrc.SyncWordLength )
GregCr 0:9c0917bfde97 1574 {
GregCr 0:9c0917bfde97 1575 case FLRC_SYNCWORD_LENGTH_4_BYTE:
GregCr 0:9c0917bfde97 1576 packetBitCount += 4;
GregCr 0:9c0917bfde97 1577 break;
GregCr 0:9c0917bfde97 1578
GregCr 0:9c0917bfde97 1579 case FLRC_NO_SYNCWORD:
GregCr 0:9c0917bfde97 1580 default:
GregCr 0:9c0917bfde97 1581 break;
GregCr 0:9c0917bfde97 1582 }
GregCr 0:9c0917bfde97 1583 switch( Eeprom.EepromData.ModulationParams.Params.Flrc.CodingRate )
GregCr 0:9c0917bfde97 1584 {
GregCr 0:9c0917bfde97 1585 // += 7; // CRC length is maximum 4 bytes (short-cut) + 2 Header + 6 bits Tail
GregCr 0:9c0917bfde97 1586 case FLRC_CR_3_4:
GregCr 0:9c0917bfde97 1587 packetBitCount += ( uint16_t )( ceil( ( ( float )( Eeprom.EepromData.PacketParams.Params.Flrc.PayloadLength + 7 ) * 4 ) / 3 ) );
GregCr 0:9c0917bfde97 1588 break;
GregCr 0:9c0917bfde97 1589
GregCr 0:9c0917bfde97 1590 case FLRC_CR_1_0:
GregCr 0:9c0917bfde97 1591 packetBitCount += Eeprom.EepromData.PacketParams.Params.Flrc.PayloadLength + 7;
GregCr 0:9c0917bfde97 1592 break;
GregCr 0:9c0917bfde97 1593
GregCr 0:9c0917bfde97 1594 default:
GregCr 0:9c0917bfde97 1595 case FLRC_CR_1_2:
GregCr 0:9c0917bfde97 1596 packetBitCount += ( Eeprom.EepromData.PacketParams.Params.Flrc.PayloadLength + 7 ) * 2;
GregCr 0:9c0917bfde97 1597 break;
GregCr 0:9c0917bfde97 1598 }
GregCr 0:9c0917bfde97 1599 packetBitCount *= 8;
GregCr 0:9c0917bfde97 1600 switch( Eeprom.EepromData.ModulationParams.Params.Flrc.BitrateBandwidth )
GregCr 0:9c0917bfde97 1601 {
GregCr 0:9c0917bfde97 1602 case FLRC_BR_1_300_BW_1_2:
GregCr 0:9c0917bfde97 1603 result = ( uint16_t )( ceil( ( float )packetBitCount / 1300 ) );
GregCr 0:9c0917bfde97 1604 break;
GregCr 0:9c0917bfde97 1605
GregCr 0:9c0917bfde97 1606 case FLRC_BR_1_040_BW_1_2:
GregCr 0:9c0917bfde97 1607 result = ( uint16_t )( ceil( ( float )packetBitCount / 1040 ) );
GregCr 0:9c0917bfde97 1608 break;
GregCr 0:9c0917bfde97 1609
GregCr 0:9c0917bfde97 1610 case FLRC_BR_0_650_BW_0_6:
GregCr 0:9c0917bfde97 1611 result = ( uint16_t )( ceil( ( float )packetBitCount / 650 ) );
GregCr 0:9c0917bfde97 1612 break;
GregCr 0:9c0917bfde97 1613
GregCr 0:9c0917bfde97 1614 case FLRC_BR_0_520_BW_0_6:
GregCr 0:9c0917bfde97 1615 result = ( uint16_t )( ceil( ( float )packetBitCount / 520 ) );
GregCr 0:9c0917bfde97 1616 break;
GregCr 0:9c0917bfde97 1617
GregCr 0:9c0917bfde97 1618 case FLRC_BR_0_325_BW_0_3:
GregCr 0:9c0917bfde97 1619 result = ( uint16_t )( ceil( ( float )packetBitCount / 325 ) );
GregCr 0:9c0917bfde97 1620 break;
GregCr 0:9c0917bfde97 1621
GregCr 0:9c0917bfde97 1622 default:
GregCr 0:9c0917bfde97 1623 case FLRC_BR_0_260_BW_0_3:
GregCr 0:9c0917bfde97 1624 result = ( uint16_t )( ceil( ( float )packetBitCount / 260 ) );
GregCr 0:9c0917bfde97 1625 break;
GregCr 0:9c0917bfde97 1626 }
GregCr 0:9c0917bfde97 1627 result *= 2; // Set some margin
GregCr 0:9c0917bfde97 1628 }
GregCr 0:9c0917bfde97 1629 else if( modulation == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 1630 {
GregCr 0:9c0917bfde97 1631 uint16_t packetBitCount;
GregCr 0:9c0917bfde97 1632
GregCr 0:9c0917bfde97 1633 switch( Eeprom.EepromData.PacketParams.Params.Gfsk.PreambleLength )
GregCr 0:9c0917bfde97 1634 {
GregCr 0:9c0917bfde97 1635 case PREAMBLE_LENGTH_04_BITS: // Preamble length: 04 bits
GregCr 0:9c0917bfde97 1636 case PREAMBLE_LENGTH_08_BITS: // Preamble length: 08 bits
GregCr 0:9c0917bfde97 1637 packetBitCount = 1;
GregCr 0:9c0917bfde97 1638 break;
GregCr 0:9c0917bfde97 1639
GregCr 0:9c0917bfde97 1640 case PREAMBLE_LENGTH_12_BITS: // Preamble length: 12 bits
GregCr 0:9c0917bfde97 1641 case PREAMBLE_LENGTH_16_BITS: // Preamble length: 16 bits
GregCr 0:9c0917bfde97 1642 packetBitCount = 2;
GregCr 0:9c0917bfde97 1643 break;
GregCr 0:9c0917bfde97 1644
GregCr 0:9c0917bfde97 1645 case PREAMBLE_LENGTH_20_BITS: // Preamble length: 20 bits
GregCr 0:9c0917bfde97 1646 case PREAMBLE_LENGTH_24_BITS: // Preamble length: 24 bits
GregCr 0:9c0917bfde97 1647 packetBitCount = 3;
GregCr 0:9c0917bfde97 1648 break;
GregCr 0:9c0917bfde97 1649
GregCr 0:9c0917bfde97 1650 case PREAMBLE_LENGTH_28_BITS: // Preamble length: 28 bits
GregCr 0:9c0917bfde97 1651 case PREAMBLE_LENGTH_32_BITS: // Preamble length: 32 bits
GregCr 0:9c0917bfde97 1652 packetBitCount = 4;
GregCr 0:9c0917bfde97 1653 break;
GregCr 0:9c0917bfde97 1654
GregCr 0:9c0917bfde97 1655 default:
GregCr 0:9c0917bfde97 1656 packetBitCount = 4;
GregCr 0:9c0917bfde97 1657 break;
GregCr 0:9c0917bfde97 1658 }
GregCr 0:9c0917bfde97 1659 switch( Eeprom.EepromData.PacketParams.Params.Gfsk.SyncWordLength )
GregCr 0:9c0917bfde97 1660 {
GregCr 0:9c0917bfde97 1661 case GFSK_SYNCWORD_LENGTH_1_BYTE: // Sync word length: 1 byte
GregCr 0:9c0917bfde97 1662 packetBitCount += 1;
GregCr 0:9c0917bfde97 1663 break;
GregCr 0:9c0917bfde97 1664
GregCr 0:9c0917bfde97 1665 case GFSK_SYNCWORD_LENGTH_2_BYTE: // Sync word length: 2 bytes
GregCr 0:9c0917bfde97 1666 packetBitCount += 2;
GregCr 0:9c0917bfde97 1667 break;
GregCr 0:9c0917bfde97 1668
GregCr 0:9c0917bfde97 1669 case GFSK_SYNCWORD_LENGTH_3_BYTE: // Sync word length: 3 bytes
GregCr 0:9c0917bfde97 1670 packetBitCount += 3;
GregCr 0:9c0917bfde97 1671 break;
GregCr 0:9c0917bfde97 1672
GregCr 0:9c0917bfde97 1673 case GFSK_SYNCWORD_LENGTH_4_BYTE: // Sync word length: 4 bytes
GregCr 0:9c0917bfde97 1674 packetBitCount += 4;
GregCr 0:9c0917bfde97 1675 break;
GregCr 0:9c0917bfde97 1676
GregCr 0:9c0917bfde97 1677 case GFSK_SYNCWORD_LENGTH_5_BYTE: // Sync word length: 5 bytes
GregCr 0:9c0917bfde97 1678 packetBitCount += 5;
GregCr 0:9c0917bfde97 1679 break;
GregCr 0:9c0917bfde97 1680
GregCr 0:9c0917bfde97 1681 default:
GregCr 0:9c0917bfde97 1682 packetBitCount += 5;
GregCr 0:9c0917bfde97 1683 break;
GregCr 0:9c0917bfde97 1684 }
GregCr 0:9c0917bfde97 1685 packetBitCount += Eeprom.EepromData.PacketParams.Params.Gfsk.PayloadLength + 3;
GregCr 0:9c0917bfde97 1686 packetBitCount *= 8;
GregCr 0:9c0917bfde97 1687 switch( Eeprom.EepromData.ModulationParams.Params.Gfsk.BitrateBandwidth )
GregCr 0:9c0917bfde97 1688 {
GregCr 0:9c0917bfde97 1689 case GFSK_BLE_BR_2_000_BW_2_4:
GregCr 0:9c0917bfde97 1690 result = ( uint16_t )( ceil( ( float )packetBitCount / 2000 ) );
GregCr 0:9c0917bfde97 1691 break;
GregCr 0:9c0917bfde97 1692
GregCr 0:9c0917bfde97 1693 case GFSK_BLE_BR_1_600_BW_2_4:
GregCr 0:9c0917bfde97 1694 result = ( uint16_t )( ceil( ( float )packetBitCount / 1600 ) );
GregCr 0:9c0917bfde97 1695 break;
GregCr 0:9c0917bfde97 1696
GregCr 0:9c0917bfde97 1697 case GFSK_BLE_BR_1_000_BW_2_4:
GregCr 0:9c0917bfde97 1698 case GFSK_BLE_BR_1_000_BW_1_2:
GregCr 0:9c0917bfde97 1699 result = ( uint16_t )( ceil( ( float )packetBitCount / 1000 ) );
GregCr 0:9c0917bfde97 1700 break;
GregCr 0:9c0917bfde97 1701
GregCr 0:9c0917bfde97 1702 case GFSK_BLE_BR_0_800_BW_2_4:
GregCr 0:9c0917bfde97 1703 case GFSK_BLE_BR_0_800_BW_1_2:
GregCr 0:9c0917bfde97 1704 result = ( uint16_t )( ceil( ( float )packetBitCount / 800 ) );
GregCr 0:9c0917bfde97 1705 break;
GregCr 0:9c0917bfde97 1706
GregCr 0:9c0917bfde97 1707 case GFSK_BLE_BR_0_500_BW_1_2:
GregCr 0:9c0917bfde97 1708 case GFSK_BLE_BR_0_500_BW_0_6:
GregCr 0:9c0917bfde97 1709 result = ( uint16_t )( ceil( ( float )packetBitCount / 500 ) );
GregCr 0:9c0917bfde97 1710 break;
GregCr 0:9c0917bfde97 1711
GregCr 0:9c0917bfde97 1712 case GFSK_BLE_BR_0_400_BW_1_2:
GregCr 0:9c0917bfde97 1713 case GFSK_BLE_BR_0_400_BW_0_6:
GregCr 0:9c0917bfde97 1714 result = ( uint16_t )( ceil( ( float )packetBitCount / 400 ) );
GregCr 0:9c0917bfde97 1715 break;
GregCr 0:9c0917bfde97 1716
GregCr 0:9c0917bfde97 1717 case GFSK_BLE_BR_0_250_BW_0_6:
GregCr 0:9c0917bfde97 1718 case GFSK_BLE_BR_0_250_BW_0_3:
GregCr 0:9c0917bfde97 1719 result = ( uint16_t )( ceil( ( float )packetBitCount / 250 ) );
GregCr 0:9c0917bfde97 1720 break;
GregCr 0:9c0917bfde97 1721
GregCr 0:9c0917bfde97 1722 case GFSK_BLE_BR_0_125_BW_0_3:
GregCr 0:9c0917bfde97 1723 result = ( uint16_t )( ceil( ( float )packetBitCount / 125 ) );
GregCr 0:9c0917bfde97 1724 break;
GregCr 0:9c0917bfde97 1725
GregCr 0:9c0917bfde97 1726 default:
GregCr 0:9c0917bfde97 1727 result = 100;
GregCr 0:9c0917bfde97 1728 break;
GregCr 0:9c0917bfde97 1729 }
GregCr 0:9c0917bfde97 1730 result *= 1.5; // Set 50% margin
GregCr 0:9c0917bfde97 1731 }
GregCr 0:9c0917bfde97 1732 return result;
GregCr 0:9c0917bfde97 1733 }
GregCr 0:9c0917bfde97 1734
GregCr 0:9c0917bfde97 1735 void InitializeDemoParameters( uint8_t modulation )
GregCr 0:9c0917bfde97 1736 {
GregCr 0:9c0917bfde97 1737 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 1738
GregCr 0:9c0917bfde97 1739 Radio.SetRegulatorMode( ( RadioRegulatorModes_t )Eeprom.EepromData.DemoSettings.RadioPowerMode );
GregCr 0:9c0917bfde97 1740
GregCr 0:9c0917bfde97 1741 printf("> InitializeDemoParameters\n\r");
GregCr 0:9c0917bfde97 1742 if( modulation == PACKET_TYPE_LORA )
GregCr 0:9c0917bfde97 1743 {
GregCr 0:9c0917bfde97 1744 printf("set param LORA for demo\n\r");
GregCr 0:9c0917bfde97 1745 ModulationParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1746 PacketParams.PacketType = PACKET_TYPE_LORA;
GregCr 0:9c0917bfde97 1747
GregCr 0:9c0917bfde97 1748 ModulationParams.Params.LoRa.SpreadingFactor = ( RadioLoRaSpreadingFactors_t ) Eeprom.EepromData.DemoSettings.ModulationParam1;
GregCr 0:9c0917bfde97 1749 ModulationParams.Params.LoRa.Bandwidth = ( RadioLoRaBandwidths_t ) Eeprom.EepromData.DemoSettings.ModulationParam2;
GregCr 0:9c0917bfde97 1750 ModulationParams.Params.LoRa.CodingRate = ( RadioLoRaCodingRates_t ) Eeprom.EepromData.DemoSettings.ModulationParam3;
GregCr 0:9c0917bfde97 1751 PacketParams.Params.LoRa.PreambleLength = Eeprom.EepromData.DemoSettings.PacketParam1;
GregCr 0:9c0917bfde97 1752 PacketParams.Params.LoRa.HeaderType = ( RadioLoRaPacketLengthsModes_t )Eeprom.EepromData.DemoSettings.PacketParam2;
GregCr 0:9c0917bfde97 1753 PacketParams.Params.LoRa.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam3;
GregCr 8:c0a5f53fe196 1754 PacketParams.Params.LoRa.Crc = ( RadioLoRaCrcModes_t ) Eeprom.EepromData.DemoSettings.PacketParam4;
GregCr 0:9c0917bfde97 1755 PacketParams.Params.LoRa.InvertIQ = ( RadioLoRaIQModes_t ) Eeprom.EepromData.DemoSettings.PacketParam5;
GregCr 0:9c0917bfde97 1756
GregCr 0:9c0917bfde97 1757 Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength;
GregCr 0:9c0917bfde97 1758 }
GregCr 0:9c0917bfde97 1759 else if( modulation == PACKET_TYPE_FLRC )
GregCr 0:9c0917bfde97 1760 {
GregCr 0:9c0917bfde97 1761 printf("set param FLRC for demo\n\r");
GregCr 0:9c0917bfde97 1762 ModulationParams.PacketType = PACKET_TYPE_FLRC;
GregCr 0:9c0917bfde97 1763 PacketParams.PacketType = PACKET_TYPE_FLRC;
GregCr 0:9c0917bfde97 1764
GregCr 0:9c0917bfde97 1765 ModulationParams.Params.Flrc.BitrateBandwidth = ( RadioFlrcBitrates_t ) Eeprom.EepromData.DemoSettings.ModulationParam1;
GregCr 0:9c0917bfde97 1766 ModulationParams.Params.Flrc.CodingRate = ( RadioFlrcCodingRates_t ) Eeprom.EepromData.DemoSettings.ModulationParam2;
GregCr 0:9c0917bfde97 1767 ModulationParams.Params.Flrc.ModulationShaping = ( RadioModShapings_t ) Eeprom.EepromData.DemoSettings.ModulationParam3;
GregCr 0:9c0917bfde97 1768 PacketParams.Params.Flrc.PreambleLength = ( RadioPreambleLengths_t ) Eeprom.EepromData.DemoSettings.PacketParam1;
GregCr 0:9c0917bfde97 1769 PacketParams.Params.Flrc.SyncWordLength = ( RadioFlrcSyncWordLengths_t )Eeprom.EepromData.DemoSettings.PacketParam2;
GregCr 0:9c0917bfde97 1770 PacketParams.Params.Flrc.SyncWordMatch = ( RadioSyncWordRxMatchs_t ) Eeprom.EepromData.DemoSettings.PacketParam3;
GregCr 0:9c0917bfde97 1771 PacketParams.Params.Flrc.HeaderType = ( RadioPacketLengthModes_t ) Eeprom.EepromData.DemoSettings.PacketParam4;
GregCr 0:9c0917bfde97 1772 PacketParams.Params.Flrc.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam5;
GregCr 0:9c0917bfde97 1773 PacketParams.Params.Flrc.CrcLength = ( RadioCrcTypes_t ) Eeprom.EepromData.DemoSettings.PacketParam6;
GregCr 0:9c0917bfde97 1774 PacketParams.Params.Flrc.Whitening = ( RadioWhiteningModes_t ) Eeprom.EepromData.DemoSettings.PacketParam7;
GregCr 0:9c0917bfde97 1775
GregCr 0:9c0917bfde97 1776 Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Flrc.PayloadLength;
GregCr 0:9c0917bfde97 1777 }
GregCr 0:9c0917bfde97 1778 else if( modulation == PACKET_TYPE_GFSK )
GregCr 0:9c0917bfde97 1779 {
GregCr 0:9c0917bfde97 1780 printf("set param GFSK for demo\n\r");
GregCr 0:9c0917bfde97 1781 ModulationParams.PacketType = PACKET_TYPE_GFSK;
GregCr 0:9c0917bfde97 1782 PacketParams.PacketType = PACKET_TYPE_GFSK;
GregCr 0:9c0917bfde97 1783
GregCr 0:9c0917bfde97 1784 ModulationParams.Params.Gfsk.BitrateBandwidth = ( RadioGfskBleBitrates_t ) Eeprom.EepromData.DemoSettings.ModulationParam1;
GregCr 0:9c0917bfde97 1785 ModulationParams.Params.Gfsk.ModulationIndex = ( RadioGfskBleModIndexes_t )Eeprom.EepromData.DemoSettings.ModulationParam2;
GregCr 0:9c0917bfde97 1786 ModulationParams.Params.Gfsk.ModulationShaping = ( RadioModShapings_t ) Eeprom.EepromData.DemoSettings.ModulationParam3;
GregCr 0:9c0917bfde97 1787 PacketParams.Params.Gfsk.PreambleLength = ( RadioPreambleLengths_t ) Eeprom.EepromData.DemoSettings.PacketParam1;
GregCr 0:9c0917bfde97 1788 PacketParams.Params.Gfsk.SyncWordLength = ( RadioSyncWordLengths_t ) Eeprom.EepromData.DemoSettings.PacketParam2;
GregCr 0:9c0917bfde97 1789 PacketParams.Params.Gfsk.SyncWordMatch = ( RadioSyncWordRxMatchs_t ) Eeprom.EepromData.DemoSettings.PacketParam3;
GregCr 0:9c0917bfde97 1790 PacketParams.Params.Gfsk.HeaderType = ( RadioPacketLengthModes_t )Eeprom.EepromData.DemoSettings.PacketParam4;
GregCr 0:9c0917bfde97 1791 PacketParams.Params.Gfsk.PayloadLength = Eeprom.EepromData.DemoSettings.PacketParam5;
GregCr 0:9c0917bfde97 1792 PacketParams.Params.Gfsk.CrcLength = ( RadioCrcTypes_t ) Eeprom.EepromData.DemoSettings.PacketParam6;
GregCr 0:9c0917bfde97 1793 PacketParams.Params.Gfsk.Whitening = ( RadioWhiteningModes_t ) Eeprom.EepromData.DemoSettings.PacketParam7;
GregCr 0:9c0917bfde97 1794
GregCr 0:9c0917bfde97 1795 Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Gfsk.PayloadLength;
GregCr 0:9c0917bfde97 1796 }
GregCr 0:9c0917bfde97 1797 if( modulation == PACKET_TYPE_RANGING )
GregCr 0:9c0917bfde97 1798 {
GregCr 0:9c0917bfde97 1799 Radio.SetBufferBaseAddresses( 0x00, 0x00 );
GregCr 0:9c0917bfde97 1800 Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
GregCr 0:9c0917bfde97 1801 memcpy( &( ModulationParams.Params.LoRa.SpreadingFactor ), Eeprom.Buffer + MOD_RNG_SPREADF_EEPROM_ADDR, 1 );
GregCr 0:9c0917bfde97 1802 memcpy( &( ModulationParams.Params.LoRa.Bandwidth ), Eeprom.Buffer + MOD_RNG_BW_EEPROM_ADDR, 1 );
GregCr 5:a0f5842fb337 1803 switch( ModulationParams.Params.LoRa.Bandwidth )
GregCr 0:9c0917bfde97 1804 {
GregCr 0:9c0917bfde97 1805 case LORA_BW_0400:
GregCr 0:9c0917bfde97 1806 Eeprom.EepromData.DemoSettings.RngCalib = RNG_CALIB_0400[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1807 Eeprom.EepromData.DemoSettings.RngFeiFactor = ( double )RNG_FGRAD_0400[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1808 Eeprom.EepromData.DemoSettings.RngReqDelay = RNG_TIMER_MS >> ( 0 + 10 - ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) );
GregCr 0:9c0917bfde97 1809 break;
GregCr 0:9c0917bfde97 1810
GregCr 0:9c0917bfde97 1811 case LORA_BW_0800:
GregCr 0:9c0917bfde97 1812 Eeprom.EepromData.DemoSettings.RngCalib = RNG_CALIB_0800[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1813 Eeprom.EepromData.DemoSettings.RngFeiFactor = ( double )RNG_FGRAD_0800[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1814 Eeprom.EepromData.DemoSettings.RngReqDelay = RNG_TIMER_MS >> ( 1 + 10 - ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) );
GregCr 0:9c0917bfde97 1815 break;
GregCr 0:9c0917bfde97 1816
GregCr 0:9c0917bfde97 1817 case LORA_BW_1600:
GregCr 0:9c0917bfde97 1818 Eeprom.EepromData.DemoSettings.RngCalib = RNG_CALIB_1600[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1819 Eeprom.EepromData.DemoSettings.RngFeiFactor = ( double )RNG_FGRAD_1600[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
GregCr 0:9c0917bfde97 1820 Eeprom.EepromData.DemoSettings.RngReqDelay = RNG_TIMER_MS >> ( 2 + 10 - ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) );
GregCr 0:9c0917bfde97 1821 break;
GregCr 0:9c0917bfde97 1822 }
mverdy 14:ebd89dacc807 1823 Radio.SetInterruptMode( );
GregCr 0:9c0917bfde97 1824 }
GregCr 0:9c0917bfde97 1825 else
GregCr 0:9c0917bfde97 1826 {
GregCr 0:9c0917bfde97 1827 Radio.SetStandby( STDBY_RC );
GregCr 0:9c0917bfde97 1828 Radio.SetPacketType( ModulationParams.PacketType );
GregCr 0:9c0917bfde97 1829 Radio.SetRfFrequency( Eeprom.EepromData.DemoSettings.Frequency );
GregCr 0:9c0917bfde97 1830 Radio.SetBufferBaseAddresses( 0x00, 0x00 );
GregCr 0:9c0917bfde97 1831 Radio.SetModulationParams( &ModulationParams );
GregCr 0:9c0917bfde97 1832 Radio.SetPacketParams( &PacketParams );
GregCr 0:9c0917bfde97 1833 // only used in GFSK, FLRC (4 bytes max) and BLE mode
GregCr 0:9c0917bfde97 1834 Radio.SetSyncWord( 1, ( uint8_t[] ){ 0xDD, 0xA0, 0x96, 0x69, 0xDD } );
GregCr 0:9c0917bfde97 1835 // only used in GFSK, FLRC
GregCr 8:c0a5f53fe196 1836 uint8_t crcSeedLocal[3] = { 0x00, 0x45, 0x67 };
GregCr 8:c0a5f53fe196 1837 Radio.SetCrcSeed( crcSeedLocal );
GregCr 0:9c0917bfde97 1838 Radio.SetCrcPolynomial( 0x0123 );
GregCr 0:9c0917bfde97 1839 Radio.SetTxParams( Eeprom.EepromData.DemoSettings.TxPower, RADIO_RAMP_20_US );
mverdy 14:ebd89dacc807 1840 Radio.SetPollingMode( );
GregCr 0:9c0917bfde97 1841 }
GregCr 0:9c0917bfde97 1842 }
GregCr 0:9c0917bfde97 1843
GregCr 0:9c0917bfde97 1844 /*!
GregCr 0:9c0917bfde97 1845 * \brief Callback of ticker PerSendNextPacket
GregCr 0:9c0917bfde97 1846 */
GregCr 0:9c0917bfde97 1847 void SendNextPacketEvent( void )
GregCr 0:9c0917bfde97 1848 {
GregCr 0:9c0917bfde97 1849 SendNext = true;
GregCr 0:9c0917bfde97 1850 if( Eeprom.EepromData.DemoSettings.RngStatus == RNG_PROCESS )
GregCr 0:9c0917bfde97 1851 {
GregCr 0:9c0917bfde97 1852 Eeprom.EepromData.DemoSettings.CntPacketRxKOSlave++;
GregCr 0:9c0917bfde97 1853 }
GregCr 0:9c0917bfde97 1854 }
GregCr 0:9c0917bfde97 1855
GregCr 0:9c0917bfde97 1856 uint8_t CheckDistance( void )
GregCr 0:9c0917bfde97 1857 {
GregCr 13:94a3f92fd49c 1858 double displayRange = 0.0;
GregCr 8:c0a5f53fe196 1859 double rssi = Eeprom.EepromData.DemoSettings.RssiValue;
GregCr 8:c0a5f53fe196 1860
GregCr 8:c0a5f53fe196 1861 uint16_t j = 0;
GregCr 8:c0a5f53fe196 1862 uint16_t i;
GregCr 0:9c0917bfde97 1863
GregCr 0:9c0917bfde97 1864 printf( "#id: %d", Eeprom.EepromData.DemoSettings.CntPacketTx );
GregCr 0:9c0917bfde97 1865 if( RngResultIndex > 0 )
GregCr 0:9c0917bfde97 1866 {
GregCr 0:9c0917bfde97 1867 for( i = 0; i < RngResultIndex; ++i )
GregCr 0:9c0917bfde97 1868 {
GregCr 8:c0a5f53fe196 1869 RawRngResults[i] = RawRngResults[i] - ( Eeprom.EepromData.DemoSettings.RngFeiFactor * Eeprom.EepromData.DemoSettings.RngFei / 1000 );
GregCr 0:9c0917bfde97 1870 }
GregCr 0:9c0917bfde97 1871
GregCr 8:c0a5f53fe196 1872 for (int i = RngResultIndex - 1; i > 0; --i)
GregCr 0:9c0917bfde97 1873 {
GregCr 8:c0a5f53fe196 1874 for (int j = 0; j < i; ++j)
GregCr 0:9c0917bfde97 1875 {
GregCr 8:c0a5f53fe196 1876 if (RawRngResults[j] > RawRngResults[j+1])
GregCr 8:c0a5f53fe196 1877 {
GregCr 8:c0a5f53fe196 1878 int temp = RawRngResults[j];
GregCr 8:c0a5f53fe196 1879 RawRngResults[j] = RawRngResults[j+1];
GregCr 8:c0a5f53fe196 1880 RawRngResults[j+1] = temp;
GregCr 8:c0a5f53fe196 1881 }
GregCr 0:9c0917bfde97 1882 }
GregCr 0:9c0917bfde97 1883 }
GregCr 8:c0a5f53fe196 1884 double median;
GregCr 8:c0a5f53fe196 1885 if ((RngResultIndex % 2) == 0)
GregCr 0:9c0917bfde97 1886 {
GregCr 8:c0a5f53fe196 1887 median = (RawRngResults[RngResultIndex/2] + RawRngResults[(RngResultIndex/2) - 1])/2.0;
GregCr 8:c0a5f53fe196 1888 }
GregCr 8:c0a5f53fe196 1889 else
GregCr 8:c0a5f53fe196 1890 {
GregCr 8:c0a5f53fe196 1891 median = RawRngResults[RngResultIndex/2];
GregCr 0:9c0917bfde97 1892 }
GregCr 8:c0a5f53fe196 1893
GregCr 13:94a3f92fd49c 1894 if( median < 50 )
GregCr 13:94a3f92fd49c 1895 {
GregCr 13:94a3f92fd49c 1896 // Apply the short range correction and RSSI short range improvement below 50 m
GregCr 13:94a3f92fd49c 1897 displayRange = t0 + t1 * rssi + t2 * pow(rssi,2) + t3 * pow(rssi, 3) +t4 * median + t5 * pow(median,2) + t6 * pow(median, 3) + t7 * pow(median, 4) ;
GregCr 13:94a3f92fd49c 1898 }
GregCr 13:94a3f92fd49c 1899 else
GregCr 13:94a3f92fd49c 1900 {
GregCr 13:94a3f92fd49c 1901 displayRange = median;
GregCr 13:94a3f92fd49c 1902 }
GregCr 13:94a3f92fd49c 1903
GregCr 0:9c0917bfde97 1904 if( j < DEMO_RNG_CHANNELS_COUNT_MIN )
GregCr 0:9c0917bfde97 1905 {
GregCr 0:9c0917bfde97 1906 Eeprom.EepromData.DemoSettings.RngStatus = RNG_PER_ERROR;
GregCr 0:9c0917bfde97 1907 }
GregCr 0:9c0917bfde97 1908 else
GregCr 0:9c0917bfde97 1909 {
GregCr 0:9c0917bfde97 1910 Eeprom.EepromData.DemoSettings.RngStatus = RNG_VALID;
GregCr 0:9c0917bfde97 1911 }
GregCr 8:c0a5f53fe196 1912
GregCr 13:94a3f92fd49c 1913 if( displayRange < 0 )
GregCr 0:9c0917bfde97 1914 {
GregCr 0:9c0917bfde97 1915 Eeprom.EepromData.DemoSettings.RngDistance = 0.0;
GregCr 0:9c0917bfde97 1916 }
GregCr 0:9c0917bfde97 1917 else
GregCr 0:9c0917bfde97 1918 {
GregCr 0:9c0917bfde97 1919 switch( Eeprom.EepromData.DemoSettings.RngUnit )
GregCr 0:9c0917bfde97 1920 {
GregCr 0:9c0917bfde97 1921 case DEMO_RNG_UNIT_SEL_M:
GregCr 13:94a3f92fd49c 1922 Eeprom.EepromData.DemoSettings.RngDistance = displayRange;
GregCr 0:9c0917bfde97 1923 break;
GregCr 0:9c0917bfde97 1924
GregCr 0:9c0917bfde97 1925 case DEMO_RNG_UNIT_SEL_YD:
GregCr 13:94a3f92fd49c 1926 Eeprom.EepromData.DemoSettings.RngDistance = displayRange * DEMO_RNG_UNIT_CONV_YD;
GregCr 0:9c0917bfde97 1927 break;
GregCr 0:9c0917bfde97 1928
GregCr 0:9c0917bfde97 1929 case DEMO_RNG_UNIT_SEL_MI:
GregCr 13:94a3f92fd49c 1930 Eeprom.EepromData.DemoSettings.RngDistance = displayRange * DEMO_RNG_UNIT_CONV_MI;
GregCr 0:9c0917bfde97 1931 break;
GregCr 0:9c0917bfde97 1932 }
GregCr 0:9c0917bfde97 1933 }
GregCr 0:9c0917bfde97 1934 }
GregCr 13:94a3f92fd49c 1935 printf( ", Rssi: %d, Zn: %3d, Zmoy: %5.1f, FEI: %d\r\n", Eeprom.EepromData.DemoSettings.RssiValue, j, displayRange, ( int32_t )Eeprom.EepromData.DemoSettings.RngFei );
GregCr 0:9c0917bfde97 1936
GregCr 0:9c0917bfde97 1937 return j;
GregCr 0:9c0917bfde97 1938 }
GregCr 0:9c0917bfde97 1939
GregCr 0:9c0917bfde97 1940 void LedBlink( void )
GregCr 0:9c0917bfde97 1941 {
GregCr 0:9c0917bfde97 1942 if( ( TX_LED == 0 ) && ( RX_LED == 0 ) )
GregCr 0:9c0917bfde97 1943 {
GregCr 0:9c0917bfde97 1944 TX_LED = 1;
GregCr 0:9c0917bfde97 1945 }
GregCr 0:9c0917bfde97 1946 else if( ( TX_LED == 1 ) && ( RX_LED == 0 ) )
GregCr 0:9c0917bfde97 1947 {
GregCr 0:9c0917bfde97 1948 RX_LED = 1;
GregCr 0:9c0917bfde97 1949 }
GregCr 0:9c0917bfde97 1950 else if( ( TX_LED == 1 ) && ( RX_LED == 1 ) )
GregCr 0:9c0917bfde97 1951 {
GregCr 0:9c0917bfde97 1952 TX_LED = 0;
GregCr 0:9c0917bfde97 1953 }
GregCr 0:9c0917bfde97 1954 else
GregCr 0:9c0917bfde97 1955 {
GregCr 0:9c0917bfde97 1956 RX_LED = 0;
GregCr 0:9c0917bfde97 1957 }
GregCr 0:9c0917bfde97 1958 }
GregCr 0:9c0917bfde97 1959
GregCr 0:9c0917bfde97 1960 void SetAntennaSwitch( void )
GregCr 0:9c0917bfde97 1961 {
GregCr 0:9c0917bfde97 1962 if( Eeprom.EepromData.DemoSettings.AntennaSwitch == 0 )
GregCr 0:9c0917bfde97 1963 {
GregCr 0:9c0917bfde97 1964 ANT_SW = 1; // ANT1
GregCr 0:9c0917bfde97 1965 }
GregCr 0:9c0917bfde97 1966 else
GregCr 0:9c0917bfde97 1967 {
GregCr 0:9c0917bfde97 1968 ANT_SW = 0; // ANT2
GregCr 0:9c0917bfde97 1969 }
GregCr 0:9c0917bfde97 1970 }
GregCr 0:9c0917bfde97 1971
GregCr 0:9c0917bfde97 1972 // ************************ Radio Callbacks ****************************
GregCr 0:9c0917bfde97 1973 // * *
GregCr 0:9c0917bfde97 1974 // * These functions are called through function pointer by the Radio low *
GregCr 0:9c0917bfde97 1975 // * level drivers *
GregCr 0:9c0917bfde97 1976 // * *
GregCr 0:9c0917bfde97 1977 // *****************************************************************************
GregCr 0:9c0917bfde97 1978 void OnTxDone( void )
GregCr 0:9c0917bfde97 1979 {
GregCr 0:9c0917bfde97 1980 DemoInternalState = APP_TX;
GregCr 0:9c0917bfde97 1981 }
GregCr 0:9c0917bfde97 1982
GregCr 0:9c0917bfde97 1983 void OnRxDone( void )
GregCr 0:9c0917bfde97 1984 {
GregCr 0:9c0917bfde97 1985 DemoInternalState = APP_RX;
GregCr 0:9c0917bfde97 1986 }
GregCr 0:9c0917bfde97 1987
GregCr 0:9c0917bfde97 1988 void OnTxTimeout( void )
GregCr 0:9c0917bfde97 1989 {
GregCr 0:9c0917bfde97 1990 DemoInternalState = APP_TX_TIMEOUT;
GregCr 0:9c0917bfde97 1991 }
GregCr 0:9c0917bfde97 1992
GregCr 0:9c0917bfde97 1993 void OnRxTimeout( void )
GregCr 0:9c0917bfde97 1994 {
GregCr 0:9c0917bfde97 1995 DemoInternalState = APP_RX_TIMEOUT;
GregCr 0:9c0917bfde97 1996 }
GregCr 0:9c0917bfde97 1997
GregCr 0:9c0917bfde97 1998 void OnRxError( IrqErrorCode_t errorCode )
GregCr 0:9c0917bfde97 1999 {
GregCr 0:9c0917bfde97 2000 DemoInternalState = APP_RX_ERROR;
GregCr 0:9c0917bfde97 2001 }
GregCr 0:9c0917bfde97 2002
GregCr 0:9c0917bfde97 2003 void OnRangingDone( IrqRangingCode_t val )
GregCr 0:9c0917bfde97 2004 {
GregCr 0:9c0917bfde97 2005 if( val == IRQ_RANGING_MASTER_VALID_CODE || val == IRQ_RANGING_SLAVE_VALID_CODE )
GregCr 0:9c0917bfde97 2006 {
GregCr 0:9c0917bfde97 2007 DemoInternalState = APP_RANGING_DONE;
GregCr 0:9c0917bfde97 2008 }
GregCr 0:9c0917bfde97 2009 else if( val == IRQ_RANGING_MASTER_ERROR_CODE || val == IRQ_RANGING_SLAVE_ERROR_CODE )
GregCr 0:9c0917bfde97 2010 {
GregCr 0:9c0917bfde97 2011 DemoInternalState = APP_RANGING_TIMEOUT;
GregCr 0:9c0917bfde97 2012 }
GregCr 0:9c0917bfde97 2013 else
GregCr 0:9c0917bfde97 2014 {
GregCr 0:9c0917bfde97 2015 DemoInternalState = APP_RANGING_TIMEOUT;
GregCr 0:9c0917bfde97 2016 }
GregCr 0:9c0917bfde97 2017 }
GregCr 0:9c0917bfde97 2018
GregCr 0:9c0917bfde97 2019 void OnCadDone( bool channelActivityDetected )
GregCr 0:9c0917bfde97 2020 {
GregCr 0:9c0917bfde97 2021 }