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

Dependencies:   mbed SX1280Lib DmTftLibrary

* This code MUST run on the mbed library release 127 or everything will be painfully slow.*
Committer:
GregCr
Date:
Wed Jul 18 08:51:53 2018 +0000
Revision:
17:a0bbfc228415
Parent:
14:ebd89dacc807
Child:
18:22796c3be774
Updated DevKit with the latest drivers

Who changed what in which revision?

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