Slave program for ranging, open for improvements

Dependencies:   SX1280Lib mbed

Committer:
LuisRuiz
Date:
Mon Apr 23 22:08:14 2018 +0000
Revision:
0:871af6563674
Ranging Slave for SX1280

Who changed what in which revision?

UserRevisionLine numberNew contents of line
LuisRuiz 0:871af6563674 1 #include "mbed.h"
LuisRuiz 0:871af6563674 2 #include "radio.h"
LuisRuiz 0:871af6563674 3 #include "sx1280-hal.h"
LuisRuiz 0:871af6563674 4 #include <math.h>
LuisRuiz 0:871af6563674 5 #include "FreqLUT.h"
LuisRuiz 0:871af6563674 6 #include "Timers.h"
LuisRuiz 0:871af6563674 7
LuisRuiz 0:871af6563674 8 /*!
LuisRuiz 0:871af6563674 9 * \brief Used to display firmware version on RS232
LuisRuiz 0:871af6563674 10 */
LuisRuiz 0:871af6563674 11 #define FIRMWARE_VERSION ( ( char* )"Firmware Version: 15.0.3" )
LuisRuiz 0:871af6563674 12
LuisRuiz 0:871af6563674 13 /*!
LuisRuiz 0:871af6563674 14 * Mode of operation
LuisRuiz 0:871af6563674 15 */
LuisRuiz 0:871af6563674 16 #define MODE_LORA
LuisRuiz 0:871af6563674 17
LuisRuiz 0:871af6563674 18 /*!
LuisRuiz 0:871af6563674 19 * \brief Ranging raw factors
LuisRuiz 0:871af6563674 20 * SF5 SF6 SF7 SF8 SF9 SF10
LuisRuiz 0:871af6563674 21 */
LuisRuiz 0:871af6563674 22 //const uint16_t RNG_CALIB_0400[] = { 10299, 10271, 10244, 10242, 10230, 10246 };
LuisRuiz 0:871af6563674 23 //const uint16_t RNG_CALIB_0800[] = { 11486, 11474, 11453, 11426, 11417, 11401 };
LuisRuiz 0:871af6563674 24 const uint16_t RNG_CALIB_1600[] = { 13308, 13493, 13528, 13515, 13430, 13376 };
LuisRuiz 0:871af6563674 25 //const double RNG_FGRAD_0400[] = { -0.148, -0.214, -0.419, -0.853, -1.686, -3.423 };
LuisRuiz 0:871af6563674 26 //const double RNG_FGRAD_0800[] = { -0.041, -0.811, -0.218, -0.429, -0.853, -1.737 };
LuisRuiz 0:871af6563674 27 const double RNG_FGRAD_1600[] = { 0.103, -0.041, -0.101, -0.211, -0.424, -0.87 };
LuisRuiz 0:871af6563674 28
LuisRuiz 0:871af6563674 29 /*!
LuisRuiz 0:871af6563674 30 * \brief Defines the nominal frequency
LuisRuiz 0:871af6563674 31 */
LuisRuiz 0:871af6563674 32 #define RF_FREQUENCY 2402000000UL // Hz
LuisRuiz 0:871af6563674 33
LuisRuiz 0:871af6563674 34 /*!
LuisRuiz 0:871af6563674 35 * \brief Defines the output power in dBm
LuisRuiz 0:871af6563674 36 *
LuisRuiz 0:871af6563674 37 * \remark The range of the output power is [-18..+13] dBm
LuisRuiz 0:871af6563674 38 */
LuisRuiz 0:871af6563674 39 #define TX_OUTPUT_POWER 13
LuisRuiz 0:871af6563674 40
LuisRuiz 0:871af6563674 41 uint32_t RngAddress = 0x32100000;//0x10000000;
LuisRuiz 0:871af6563674 42 uint32_t CntPacketTx = 0;
LuisRuiz 0:871af6563674 43 uint32_t CntPacketRxOK = 0;
LuisRuiz 0:871af6563674 44 uint32_t CntPacketRxOKSlave = 0;
LuisRuiz 0:871af6563674 45 uint32_t CntPacketRxKOSlave = 0;
LuisRuiz 0:871af6563674 46 uint32_t MeasuredChannels = 0;
LuisRuiz 0:871af6563674 47 uint32_t CurrentChannel = 0;
LuisRuiz 0:871af6563674 48 uint16_t RxTimeOutCount = 0;
LuisRuiz 0:871af6563674 49 uint16_t RngCalib;
LuisRuiz 0:871af6563674 50 uint16_t RngReqDelay;
LuisRuiz 0:871af6563674 51 uint16_t RngRequestCount = 10;
LuisRuiz 0:871af6563674 52 uint8_t RngStatus;
LuisRuiz 0:871af6563674 53 int8_t RssiValue = 0;
LuisRuiz 0:871af6563674 54 int8_t SnrValue = 0;
LuisRuiz 0:871af6563674 55 double RngDistance = 0.0;
LuisRuiz 0:871af6563674 56 double RngFeiFactor;
LuisRuiz 0:871af6563674 57 double RngFei;
LuisRuiz 0:871af6563674 58 double RawRngResults[255];
LuisRuiz 0:871af6563674 59 double RssiRng[255];
LuisRuiz 0:871af6563674 60 int RngResultIndex;
LuisRuiz 0:871af6563674 61
LuisRuiz 0:871af6563674 62 /*!
LuisRuiz 0:871af6563674 63 * \brief Status of ranging distance
LuisRuiz 0:871af6563674 64 */
LuisRuiz 0:871af6563674 65 enum RangingStatus
LuisRuiz 0:871af6563674 66 {
LuisRuiz 0:871af6563674 67 RNG_INIT = 0,
LuisRuiz 0:871af6563674 68 RNG_PROCESS,
LuisRuiz 0:871af6563674 69 RNG_VALID,
LuisRuiz 0:871af6563674 70 RNG_TIMEOUT,
LuisRuiz 0:871af6563674 71 RNG_PER_ERROR
LuisRuiz 0:871af6563674 72 };
LuisRuiz 0:871af6563674 73
LuisRuiz 0:871af6563674 74 /*!
LuisRuiz 0:871af6563674 75 * \brief Defines the states of the application
LuisRuiz 0:871af6563674 76 */
LuisRuiz 0:871af6563674 77 typedef enum
LuisRuiz 0:871af6563674 78 {
LuisRuiz 0:871af6563674 79 APP_IDLE,
LuisRuiz 0:871af6563674 80 APP_RANGING_DONE,
LuisRuiz 0:871af6563674 81 APP_RANGING_TIMEOUT,
LuisRuiz 0:871af6563674 82 APP_RANGING_CONFIG,
LuisRuiz 0:871af6563674 83 APP_RNG,
LuisRuiz 0:871af6563674 84 APP_RX,
LuisRuiz 0:871af6563674 85 APP_RX_TIMEOUT,
LuisRuiz 0:871af6563674 86 APP_RX_ERROR,
LuisRuiz 0:871af6563674 87 APP_TX,
LuisRuiz 0:871af6563674 88 APP_TX_TIMEOUT,
LuisRuiz 0:871af6563674 89 }AppStates_t;
LuisRuiz 0:871af6563674 90
LuisRuiz 0:871af6563674 91 /*!
LuisRuiz 0:871af6563674 92 * \brief Defines the buffer size, i.e. the payload size
LuisRuiz 0:871af6563674 93 */
LuisRuiz 0:871af6563674 94 #define BUFFER_SIZE 255
LuisRuiz 0:871af6563674 95
LuisRuiz 0:871af6563674 96 /*!
LuisRuiz 0:871af6563674 97 * \brief The size of the buffer
LuisRuiz 0:871af6563674 98 */
LuisRuiz 0:871af6563674 99 uint8_t BufferSize = BUFFER_SIZE;
LuisRuiz 0:871af6563674 100
LuisRuiz 0:871af6563674 101 /*!
LuisRuiz 0:871af6563674 102 * \brief The buffer
LuisRuiz 0:871af6563674 103 */
LuisRuiz 0:871af6563674 104 uint8_t Buffer[BUFFER_SIZE];
LuisRuiz 0:871af6563674 105
LuisRuiz 0:871af6563674 106 /*!
LuisRuiz 0:871af6563674 107 * \brief The State of the application
LuisRuiz 0:871af6563674 108 */
LuisRuiz 0:871af6563674 109 AppStates_t AppState = APP_IDLE;
LuisRuiz 0:871af6563674 110
LuisRuiz 0:871af6563674 111 void SendNextPacketEvent( void );
LuisRuiz 0:871af6563674 112
LuisRuiz 0:871af6563674 113 /*!
LuisRuiz 0:871af6563674 114 * \brief Function to be executed on Radio Tx Done event
LuisRuiz 0:871af6563674 115 */
LuisRuiz 0:871af6563674 116 void OnTxDone( void );
LuisRuiz 0:871af6563674 117
LuisRuiz 0:871af6563674 118 /*!
LuisRuiz 0:871af6563674 119 * \brief Function to be executed on Radio Rx Done event
LuisRuiz 0:871af6563674 120 */
LuisRuiz 0:871af6563674 121 void OnRxDone( void );
LuisRuiz 0:871af6563674 122
LuisRuiz 0:871af6563674 123 /*!
LuisRuiz 0:871af6563674 124 * \brief Function executed on Radio Tx Timeout event
LuisRuiz 0:871af6563674 125 */
LuisRuiz 0:871af6563674 126 void OnTxTimeout( void );
LuisRuiz 0:871af6563674 127
LuisRuiz 0:871af6563674 128 /*!
LuisRuiz 0:871af6563674 129 * \brief Function executed on Radio Rx Timeout event
LuisRuiz 0:871af6563674 130 */
LuisRuiz 0:871af6563674 131 void OnRxTimeout( void );
LuisRuiz 0:871af6563674 132
LuisRuiz 0:871af6563674 133 /*!
LuisRuiz 0:871af6563674 134 * \brief Function executed on Radio Rx Error event
LuisRuiz 0:871af6563674 135 */
LuisRuiz 0:871af6563674 136 void OnRxError( IrqErrorCode_t );
LuisRuiz 0:871af6563674 137
LuisRuiz 0:871af6563674 138 /*!
LuisRuiz 0:871af6563674 139 * \brief Function executed on Ranging Done
LuisRuiz 0:871af6563674 140 */
LuisRuiz 0:871af6563674 141 void OnRangingDone( IrqRangingCode_t val );
LuisRuiz 0:871af6563674 142
LuisRuiz 0:871af6563674 143 /*!
LuisRuiz 0:871af6563674 144 * \brief All the callbacks are stored in a structure
LuisRuiz 0:871af6563674 145 */
LuisRuiz 0:871af6563674 146 RadioCallbacks_t callbacks =
LuisRuiz 0:871af6563674 147 {
LuisRuiz 0:871af6563674 148 &OnTxDone, // txDone
LuisRuiz 0:871af6563674 149 &OnRxDone, // rxDone
LuisRuiz 0:871af6563674 150 NULL, // syncWordDone
LuisRuiz 0:871af6563674 151 NULL, // headerDone
LuisRuiz 0:871af6563674 152 &OnTxTimeout, // txTimeout
LuisRuiz 0:871af6563674 153 &OnRxTimeout, // rxTimeout
LuisRuiz 0:871af6563674 154 &OnRxError, // rxError
LuisRuiz 0:871af6563674 155 &OnRangingDone, // rangingDone
LuisRuiz 0:871af6563674 156 NULL, // cadDone
LuisRuiz 0:871af6563674 157 };
LuisRuiz 0:871af6563674 158
LuisRuiz 0:871af6563674 159 // mosi, miso, sclk, nss, busy, dio1, dio2, dio3, rst, callbacks...
LuisRuiz 0:871af6563674 160 SX1280Hal Radio( D11, D12, D13, D7, D3, D5, NC, NC, A0, &callbacks );
LuisRuiz 0:871af6563674 161
LuisRuiz 0:871af6563674 162 //DigitalOut ANT_SW( A3 );
LuisRuiz 0:871af6563674 163 DigitalOut TxLed( A4 );
LuisRuiz 0:871af6563674 164 DigitalOut RxLed( A5 );
LuisRuiz 0:871af6563674 165
LuisRuiz 0:871af6563674 166 /*!
LuisRuiz 0:871af6563674 167 * \brief Define IO for Unused Pin
LuisRuiz 0:871af6563674 168 */
LuisRuiz 0:871af6563674 169 DigitalOut F_CS( D6 ); // MBED description of pin RX_EN
LuisRuiz 0:871af6563674 170 DigitalOut SD_CS( D8 ); // MBED description of pin TX_EN
LuisRuiz 0:871af6563674 171
LuisRuiz 0:871af6563674 172 /*!
LuisRuiz 0:871af6563674 173 * \brief Number of tick size steps for tx timeout
LuisRuiz 0:871af6563674 174 */
LuisRuiz 0:871af6563674 175 #define TX_TIMEOUT_VALUE 100 // ms
LuisRuiz 0:871af6563674 176
LuisRuiz 0:871af6563674 177 /*!
LuisRuiz 0:871af6563674 178 * \brief Number of tick size steps for rx timeout
LuisRuiz 0:871af6563674 179 */
LuisRuiz 0:871af6563674 180 #define RX_TIMEOUT_VALUE 100 // ms
LuisRuiz 0:871af6563674 181
LuisRuiz 0:871af6563674 182 /*!
LuisRuiz 0:871af6563674 183 * \brief Size of ticks (used for Tx and Rx timeout)
LuisRuiz 0:871af6563674 184 */
LuisRuiz 0:871af6563674 185 #define RX_TIMEOUT_TICK_SIZE RADIO_TICK_SIZE_1000_US
LuisRuiz 0:871af6563674 186
LuisRuiz 0:871af6563674 187 #define RNG_TIMER_MS 384 // ms
LuisRuiz 0:871af6563674 188 #define RNG_COM_TIMEOUT 100 // ms
LuisRuiz 0:871af6563674 189
LuisRuiz 0:871af6563674 190 /*!
LuisRuiz 0:871af6563674 191 * \brief Mask of IRQs to listen to in rx mode
LuisRuiz 0:871af6563674 192 */
LuisRuiz 0:871af6563674 193 uint16_t RxIrqMask = IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT;
LuisRuiz 0:871af6563674 194
LuisRuiz 0:871af6563674 195 /*!
LuisRuiz 0:871af6563674 196 * \brief Mask of IRQs to listen to in tx mode
LuisRuiz 0:871af6563674 197 */
LuisRuiz 0:871af6563674 198 uint16_t TxIrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT;
LuisRuiz 0:871af6563674 199
LuisRuiz 0:871af6563674 200 /*!
LuisRuiz 0:871af6563674 201 * \brief Locals parameters and status for radio API
LuisRuiz 0:871af6563674 202 * NEED TO BE OPTIMIZED, COPY OF STUCTURE ALREADY EXISTING
LuisRuiz 0:871af6563674 203 */
LuisRuiz 0:871af6563674 204 PacketParams_t PacketParams;
LuisRuiz 0:871af6563674 205 PacketStatus_t PacketStatus;
LuisRuiz 0:871af6563674 206 ModulationParams_t ModulationParams;
LuisRuiz 0:871af6563674 207
LuisRuiz 0:871af6563674 208 /*!
LuisRuiz 0:871af6563674 209 * \brief Ticker for master to synch Tx frames. Flags for PER and PingPong demo
LuisRuiz 0:871af6563674 210 * for Synch TX in cycle.
LuisRuiz 0:871af6563674 211 */
LuisRuiz 0:871af6563674 212 Ticker SendNextPacket;
LuisRuiz 0:871af6563674 213 static bool SendNext = false;
LuisRuiz 0:871af6563674 214
LuisRuiz 0:871af6563674 215 /*!
LuisRuiz 0:871af6563674 216 * \brief Specify serial datarate for UART debug output
LuisRuiz 0:871af6563674 217 */
LuisRuiz 0:871af6563674 218 void baud( int baudrate )
LuisRuiz 0:871af6563674 219 {
LuisRuiz 0:871af6563674 220 Serial s( USBTX, USBRX );
LuisRuiz 0:871af6563674 221 s.baud( baudrate );
LuisRuiz 0:871af6563674 222 }
LuisRuiz 0:871af6563674 223
LuisRuiz 0:871af6563674 224 int main( )
LuisRuiz 0:871af6563674 225 {
LuisRuiz 0:871af6563674 226 baud( 115200 );
LuisRuiz 0:871af6563674 227
LuisRuiz 0:871af6563674 228 F_CS = 1;
LuisRuiz 0:871af6563674 229 SD_CS = 1;
LuisRuiz 0:871af6563674 230 RxLed = 1;
LuisRuiz 0:871af6563674 231 TxLed = 1;
LuisRuiz 0:871af6563674 232
LuisRuiz 0:871af6563674 233 wait_ms( 500 ); // wait for on board DC/DC start-up time
LuisRuiz 0:871af6563674 234
LuisRuiz 0:871af6563674 235 Radio.Init( );
LuisRuiz 0:871af6563674 236 Radio.SetRegulatorMode( USE_DCDC ); // Can also be set in LDO mode but consume more power
LuisRuiz 0:871af6563674 237
LuisRuiz 0:871af6563674 238 memset( &Buffer, 0x00, BufferSize );
LuisRuiz 0:871af6563674 239
LuisRuiz 0:871af6563674 240 printf( "\n\n\r SX1280 Ranging Demo Application (%s)\n\n\r", FIRMWARE_VERSION );
LuisRuiz 0:871af6563674 241 printf( "\nRunning in LORA mode\n\r" );
LuisRuiz 0:871af6563674 242 printf( "\nSlave\n\r" );
LuisRuiz 0:871af6563674 243
LuisRuiz 0:871af6563674 244 TimersInit( );
LuisRuiz 0:871af6563674 245
LuisRuiz 0:871af6563674 246 RngStatus = RNG_INIT;
LuisRuiz 0:871af6563674 247 Radio.SetDioIrqParams( IRQ_RADIO_ALL, IRQ_RADIO_ALL, IRQ_RADIO_NONE, IRQ_RADIO_NONE );
LuisRuiz 0:871af6563674 248
LuisRuiz 0:871af6563674 249 RxLed = 0;
LuisRuiz 0:871af6563674 250 TxLed = 0;
LuisRuiz 0:871af6563674 251
LuisRuiz 0:871af6563674 252 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 253
LuisRuiz 0:871af6563674 254 while( 1 ){
LuisRuiz 0:871af6563674 255 switch( AppState )
LuisRuiz 0:871af6563674 256 {
LuisRuiz 0:871af6563674 257 case APP_RANGING_CONFIG:
LuisRuiz 0:871af6563674 258 //printf("App_Ranging_Config\r\n");
LuisRuiz 0:871af6563674 259 RngStatus = RNG_INIT;
LuisRuiz 0:871af6563674 260
LuisRuiz 0:871af6563674 261 ModulationParams.PacketType = PACKET_TYPE_LORA;
LuisRuiz 0:871af6563674 262 PacketParams.PacketType = PACKET_TYPE_LORA;
LuisRuiz 0:871af6563674 263
LuisRuiz 0:871af6563674 264 ModulationParams.Params.LoRa.SpreadingFactor = LORA_SF7;
LuisRuiz 0:871af6563674 265 ModulationParams.Params.LoRa.Bandwidth = LORA_BW_1600;
LuisRuiz 0:871af6563674 266 ModulationParams.Params.LoRa.CodingRate = LORA_CR_4_5;
LuisRuiz 0:871af6563674 267
LuisRuiz 0:871af6563674 268 PacketParams.Params.LoRa.PreambleLength = 0x08;
LuisRuiz 0:871af6563674 269 PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH;
LuisRuiz 0:871af6563674 270 PacketParams.Params.LoRa.PayloadLength = 9;
LuisRuiz 0:871af6563674 271 PacketParams.Params.LoRa.Crc = LORA_CRC_ON;
LuisRuiz 0:871af6563674 272 PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED;
LuisRuiz 0:871af6563674 273
LuisRuiz 0:871af6563674 274 Radio.SetPacketType( ModulationParams.PacketType );
LuisRuiz 0:871af6563674 275 Radio.SetModulationParams( &ModulationParams );
LuisRuiz 0:871af6563674 276 Radio.SetPacketParams( &PacketParams );
LuisRuiz 0:871af6563674 277 Radio.SetRfFrequency( RF_FREQUENCY );
LuisRuiz 0:871af6563674 278
LuisRuiz 0:871af6563674 279 RxLed = 1;
LuisRuiz 0:871af6563674 280
LuisRuiz 0:871af6563674 281 // use listen mode here instead of rx continuous
LuisRuiz 0:871af6563674 282 Radio.SetRx( ( TickTime_t ) { RADIO_TICK_SIZE_1000_US, 0xFFFF } );
LuisRuiz 0:871af6563674 283 AppState = APP_IDLE;
LuisRuiz 0:871af6563674 284 break;
LuisRuiz 0:871af6563674 285
LuisRuiz 0:871af6563674 286 case APP_RNG:
LuisRuiz 0:871af6563674 287 //printf("App_Rng ");
LuisRuiz 0:871af6563674 288 if( SendNext == true )
LuisRuiz 0:871af6563674 289 {
LuisRuiz 0:871af6563674 290 SendNext = false;
LuisRuiz 0:871af6563674 291 MeasuredChannels++;
LuisRuiz 0:871af6563674 292 if( MeasuredChannels <= RngRequestCount )
LuisRuiz 0:871af6563674 293 {
LuisRuiz 0:871af6563674 294 Radio.SetRfFrequency( Channels[CurrentChannel] );
LuisRuiz 0:871af6563674 295 RxLed = 1;
LuisRuiz 0:871af6563674 296 CurrentChannel++;
LuisRuiz 0:871af6563674 297 if( CurrentChannel >= CHANNELS )
LuisRuiz 0:871af6563674 298 {
LuisRuiz 0:871af6563674 299 CurrentChannel -= CHANNELS;
LuisRuiz 0:871af6563674 300 }
LuisRuiz 0:871af6563674 301 AppState = APP_IDLE;
LuisRuiz 0:871af6563674 302 Radio.SetRx( ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, RngReqDelay } );
LuisRuiz 0:871af6563674 303 }
LuisRuiz 0:871af6563674 304 else
LuisRuiz 0:871af6563674 305 {
LuisRuiz 0:871af6563674 306 Radio.SetStandby( STDBY_RC );
LuisRuiz 0:871af6563674 307 SendNextPacket.detach( );
LuisRuiz 0:871af6563674 308 RngStatus = RNG_VALID;
LuisRuiz 0:871af6563674 309 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 310 }
LuisRuiz 0:871af6563674 311 }
LuisRuiz 0:871af6563674 312 break;
LuisRuiz 0:871af6563674 313
LuisRuiz 0:871af6563674 314 case APP_RANGING_DONE:
LuisRuiz 0:871af6563674 315 //printf("App_Ranging_Done ");
LuisRuiz 0:871af6563674 316 RxLed = 0;
LuisRuiz 0:871af6563674 317 CntPacketRxOK++;
LuisRuiz 0:871af6563674 318 AppState = APP_RNG;
LuisRuiz 0:871af6563674 319 break;
LuisRuiz 0:871af6563674 320
LuisRuiz 0:871af6563674 321 case APP_RANGING_TIMEOUT:
LuisRuiz 0:871af6563674 322 //printf("App_Ranging_Timeout ");
LuisRuiz 0:871af6563674 323 RxLed = 0;
LuisRuiz 0:871af6563674 324 AppState = APP_RNG;
LuisRuiz 0:871af6563674 325 break;
LuisRuiz 0:871af6563674 326
LuisRuiz 0:871af6563674 327 case APP_RX:
LuisRuiz 0:871af6563674 328 //printf("App_Rx ");
LuisRuiz 0:871af6563674 329 RxLed = 0;
LuisRuiz 0:871af6563674 330 if( RngStatus == RNG_INIT )
LuisRuiz 0:871af6563674 331 {
LuisRuiz 0:871af6563674 332 Radio.GetPayload( Buffer, &BufferSize, BUFFER_SIZE );
LuisRuiz 0:871af6563674 333 Radio.GetPacketStatus( &PacketStatus );
LuisRuiz 0:871af6563674 334 if( ( BufferSize > 0 ) && \
LuisRuiz 0:871af6563674 335 ( Buffer[0] == ( ( RngAddress >> 24 ) & 0xFF ) ) && \
LuisRuiz 0:871af6563674 336 ( Buffer[1] == ( ( RngAddress >> 16 ) & 0xFF ) ) && \
LuisRuiz 0:871af6563674 337 ( Buffer[2] == ( ( RngAddress >> 8 ) & 0xFF ) ) && \
LuisRuiz 0:871af6563674 338 ( Buffer[3] == ( RngAddress & 0xFF ) ) )
LuisRuiz 0:871af6563674 339 {
LuisRuiz 0:871af6563674 340 RngFei = Radio.GetFrequencyError( );
LuisRuiz 0:871af6563674 341 RssiValue = PacketStatus.LoRa.RssiPkt;
LuisRuiz 0:871af6563674 342 CntPacketTx++;
LuisRuiz 0:871af6563674 343
LuisRuiz 0:871af6563674 344 CurrentChannel = Buffer[4];
LuisRuiz 0:871af6563674 345 //RngAntenna = Buffer[5];
LuisRuiz 0:871af6563674 346 RngRequestCount = Buffer[6];
LuisRuiz 0:871af6563674 347 wait_us( 10 );
LuisRuiz 0:871af6563674 348
LuisRuiz 0:871af6563674 349 Buffer[4] = ( ( ( int32_t )RngFei ) >> 24 ) & 0xFF ;
LuisRuiz 0:871af6563674 350 Buffer[5] = ( ( ( int32_t )RngFei ) >> 16 ) & 0xFF ;
LuisRuiz 0:871af6563674 351 Buffer[6] = ( ( ( int32_t )RngFei ) >> 8 ) & 0xFF ;
LuisRuiz 0:871af6563674 352 Buffer[7] = ( ( ( int32_t )RngFei ) & 0xFF );
LuisRuiz 0:871af6563674 353 Buffer[8] = RssiValue;
LuisRuiz 0:871af6563674 354
LuisRuiz 0:871af6563674 355 TxLed = 1;
LuisRuiz 0:871af6563674 356 Radio.SendPayload( Buffer, 9, ( TickTime_t ){ RADIO_TICK_SIZE_1000_US, RNG_COM_TIMEOUT } );
LuisRuiz 0:871af6563674 357 AppState = APP_IDLE;
LuisRuiz 0:871af6563674 358 }
LuisRuiz 0:871af6563674 359 else
LuisRuiz 0:871af6563674 360 {
LuisRuiz 0:871af6563674 361 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 362 }
LuisRuiz 0:871af6563674 363 }
LuisRuiz 0:871af6563674 364 else
LuisRuiz 0:871af6563674 365 {
LuisRuiz 0:871af6563674 366 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 367 }
LuisRuiz 0:871af6563674 368 break;
LuisRuiz 0:871af6563674 369
LuisRuiz 0:871af6563674 370 case APP_TX:
LuisRuiz 0:871af6563674 371 //printf("App_Tx ");
LuisRuiz 0:871af6563674 372 TxLed = 0;
LuisRuiz 0:871af6563674 373 if( RngStatus == RNG_INIT )
LuisRuiz 0:871af6563674 374 {
LuisRuiz 0:871af6563674 375 RngStatus = RNG_PROCESS;
LuisRuiz 0:871af6563674 376
LuisRuiz 0:871af6563674 377 ModulationParams.PacketType = PACKET_TYPE_RANGING;
LuisRuiz 0:871af6563674 378 PacketParams.PacketType = PACKET_TYPE_RANGING;
LuisRuiz 0:871af6563674 379
LuisRuiz 0:871af6563674 380 ModulationParams.Params.LoRa.SpreadingFactor = LORA_SF7;
LuisRuiz 0:871af6563674 381 ModulationParams.Params.LoRa.Bandwidth = LORA_BW_1600;
LuisRuiz 0:871af6563674 382 ModulationParams.Params.LoRa.CodingRate = LORA_CR_4_5;
LuisRuiz 0:871af6563674 383
LuisRuiz 0:871af6563674 384 PacketParams.Params.LoRa.PreambleLength = 0x08;
LuisRuiz 0:871af6563674 385 PacketParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH;
LuisRuiz 0:871af6563674 386 PacketParams.Params.LoRa.PayloadLength = 10;
LuisRuiz 0:871af6563674 387 PacketParams.Params.LoRa.Crc = LORA_CRC_ON;
LuisRuiz 0:871af6563674 388 PacketParams.Params.LoRa.InvertIQ = LORA_IQ_INVERTED;
LuisRuiz 0:871af6563674 389
LuisRuiz 0:871af6563674 390 RngCalib = RNG_CALIB_1600[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
LuisRuiz 0:871af6563674 391 RngFeiFactor = ( double )RNG_FGRAD_1600[ ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) - 5 ];
LuisRuiz 0:871af6563674 392 RngReqDelay = RNG_TIMER_MS >> ( 2 + 10 - ( ModulationParams.Params.LoRa.SpreadingFactor >> 4 ) );
LuisRuiz 0:871af6563674 393
LuisRuiz 0:871af6563674 394 Radio.SetPacketType( ModulationParams.PacketType );
LuisRuiz 0:871af6563674 395
LuisRuiz 0:871af6563674 396 Radio.SetModulationParams( &ModulationParams );
LuisRuiz 0:871af6563674 397 Radio.SetPacketParams( &PacketParams );
LuisRuiz 0:871af6563674 398 Radio.SetDeviceRangingAddress( RngAddress );
LuisRuiz 0:871af6563674 399 Radio.SetRangingCalibration( RngCalib );
LuisRuiz 0:871af6563674 400 Radio.SetTxParams( TX_OUTPUT_POWER, RADIO_RAMP_20_US );
LuisRuiz 0:871af6563674 401
LuisRuiz 0:871af6563674 402 CntPacketRxOK = 0;
LuisRuiz 0:871af6563674 403 MeasuredChannels = 0;
LuisRuiz 0:871af6563674 404 CntPacketRxKOSlave = 0;
LuisRuiz 0:871af6563674 405
LuisRuiz 0:871af6563674 406 SendNextPacket.attach_us( &SendNextPacketEvent, RngReqDelay * 1000 );
LuisRuiz 0:871af6563674 407 AppState = APP_RNG;
LuisRuiz 0:871af6563674 408 }
LuisRuiz 0:871af6563674 409 else
LuisRuiz 0:871af6563674 410 {
LuisRuiz 0:871af6563674 411 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 412 }
LuisRuiz 0:871af6563674 413 break;
LuisRuiz 0:871af6563674 414
LuisRuiz 0:871af6563674 415 case APP_RX_TIMEOUT:
LuisRuiz 0:871af6563674 416 //printf("App_Rx ");
LuisRuiz 0:871af6563674 417 RxLed = 0;
LuisRuiz 0:871af6563674 418 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 419 break;
LuisRuiz 0:871af6563674 420
LuisRuiz 0:871af6563674 421 case APP_RX_ERROR:
LuisRuiz 0:871af6563674 422 //printf("App_Rx_Error ");
LuisRuiz 0:871af6563674 423 RxLed = 0;
LuisRuiz 0:871af6563674 424 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 425 break;
LuisRuiz 0:871af6563674 426
LuisRuiz 0:871af6563674 427 case APP_TX_TIMEOUT:
LuisRuiz 0:871af6563674 428 //printf("App_Tx_Timeout ");
LuisRuiz 0:871af6563674 429 TxLed = 0;
LuisRuiz 0:871af6563674 430 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 431 break;
LuisRuiz 0:871af6563674 432
LuisRuiz 0:871af6563674 433 case APP_IDLE: // do nothing
LuisRuiz 0:871af6563674 434 if( CntPacketRxKOSlave > 255 )
LuisRuiz 0:871af6563674 435 {
LuisRuiz 0:871af6563674 436 CntPacketRxKOSlave = 0;
LuisRuiz 0:871af6563674 437 RxLed = 0;
LuisRuiz 0:871af6563674 438 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 439 SendNextPacket.detach( );
LuisRuiz 0:871af6563674 440 }
LuisRuiz 0:871af6563674 441 break;
LuisRuiz 0:871af6563674 442
LuisRuiz 0:871af6563674 443 default:
LuisRuiz 0:871af6563674 444 AppState = APP_RANGING_CONFIG;
LuisRuiz 0:871af6563674 445 SendNextPacket.detach( );
LuisRuiz 0:871af6563674 446 break;
LuisRuiz 0:871af6563674 447 }
LuisRuiz 0:871af6563674 448 }
LuisRuiz 0:871af6563674 449 }
LuisRuiz 0:871af6563674 450
LuisRuiz 0:871af6563674 451 /*!
LuisRuiz 0:871af6563674 452 * \brief Callback of ticker PerSendNextPacket
LuisRuiz 0:871af6563674 453 */
LuisRuiz 0:871af6563674 454 void SendNextPacketEvent( void )
LuisRuiz 0:871af6563674 455 {
LuisRuiz 0:871af6563674 456 SendNext = true;
LuisRuiz 0:871af6563674 457 if( RngStatus == RNG_PROCESS )
LuisRuiz 0:871af6563674 458 {
LuisRuiz 0:871af6563674 459 CntPacketRxKOSlave++;
LuisRuiz 0:871af6563674 460 }
LuisRuiz 0:871af6563674 461 }
LuisRuiz 0:871af6563674 462
LuisRuiz 0:871af6563674 463 // ************************ Radio Callbacks ****************************
LuisRuiz 0:871af6563674 464 // * *
LuisRuiz 0:871af6563674 465 // * These functions are called through function pointer by the Radio low *
LuisRuiz 0:871af6563674 466 // * level drivers *
LuisRuiz 0:871af6563674 467 // * *
LuisRuiz 0:871af6563674 468 // *****************************************************************************
LuisRuiz 0:871af6563674 469
LuisRuiz 0:871af6563674 470 void OnTxDone( void )
LuisRuiz 0:871af6563674 471 {
LuisRuiz 0:871af6563674 472 AppState = APP_TX;
LuisRuiz 0:871af6563674 473 }
LuisRuiz 0:871af6563674 474
LuisRuiz 0:871af6563674 475 void OnRxDone( void )
LuisRuiz 0:871af6563674 476 {
LuisRuiz 0:871af6563674 477 AppState = APP_RX;
LuisRuiz 0:871af6563674 478 }
LuisRuiz 0:871af6563674 479
LuisRuiz 0:871af6563674 480 void OnTxTimeout( void )
LuisRuiz 0:871af6563674 481 {
LuisRuiz 0:871af6563674 482 AppState = APP_TX_TIMEOUT;
LuisRuiz 0:871af6563674 483 printf( "<>>>>>>>>TXE\r\n" );
LuisRuiz 0:871af6563674 484 }
LuisRuiz 0:871af6563674 485
LuisRuiz 0:871af6563674 486 void OnRxTimeout( void )
LuisRuiz 0:871af6563674 487 {
LuisRuiz 0:871af6563674 488 AppState = APP_RX_TIMEOUT;
LuisRuiz 0:871af6563674 489 }
LuisRuiz 0:871af6563674 490
LuisRuiz 0:871af6563674 491 void OnRxError( IrqErrorCode_t errorCode )
LuisRuiz 0:871af6563674 492 {
LuisRuiz 0:871af6563674 493 AppState = APP_RX_ERROR;
LuisRuiz 0:871af6563674 494 printf( "RXE<>>>>>>>>\r\n" );
LuisRuiz 0:871af6563674 495 }
LuisRuiz 0:871af6563674 496
LuisRuiz 0:871af6563674 497 void OnRangingDone( IrqRangingCode_t val )
LuisRuiz 0:871af6563674 498 {
LuisRuiz 0:871af6563674 499 if( val == IRQ_RANGING_MASTER_VALID_CODE || val == IRQ_RANGING_SLAVE_VALID_CODE )
LuisRuiz 0:871af6563674 500 {
LuisRuiz 0:871af6563674 501 AppState = APP_RANGING_DONE;
LuisRuiz 0:871af6563674 502 }
LuisRuiz 0:871af6563674 503 else if( val == IRQ_RANGING_MASTER_ERROR_CODE || val == IRQ_RANGING_SLAVE_ERROR_CODE )
LuisRuiz 0:871af6563674 504 {
LuisRuiz 0:871af6563674 505 AppState = APP_RANGING_TIMEOUT;
LuisRuiz 0:871af6563674 506 }
LuisRuiz 0:871af6563674 507 else
LuisRuiz 0:871af6563674 508 {
LuisRuiz 0:871af6563674 509 AppState = APP_RANGING_TIMEOUT;
LuisRuiz 0:871af6563674 510 }
LuisRuiz 0:871af6563674 511 }
LuisRuiz 0:871af6563674 512
LuisRuiz 0:871af6563674 513 void OnCadDone( bool channelActivityDetected )
LuisRuiz 0:871af6563674 514 {
LuisRuiz 0:871af6563674 515 }