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

Dependencies:   mbed SX1280Lib DmTftLibrary

* This code MUST run on the mbed library release 127 or everything will be painfully slow.*
Committer:
GregCr
Date:
Wed Apr 19 14:21:05 2017 +0000
Revision:
7:bc2f0fe8056f
Parent:
6:e4c4a6878542
Child:
8:c0a5f53fe196
Corrected handling of the Antenna switch in the ranging demo

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