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

Dependencies:   mbed SX1280Lib DmTftLibrary

* This code MUST run on the mbed library release 127 or everything will be painfully slow.*
Committer:
mverdy
Date:
Thu Nov 08 10:14:39 2018 +0000
Revision:
20:626b92b70bf7
Parent:
19:45d0ce0f0677
Addition of missing modules to synchronize with v1.5.2

Who changed what in which revision?

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