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:
Mon Mar 13 15:12:05 2017 +0000
Revision:
0:9c0917bfde97
Child:
1:dbcb3698f73a
alpha release

Who changed what in which revision?

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