Luis Ruiz
/
RangingSlave
Slave program for ranging, open for improvements
main.cpp@0:871af6563674, 2018-04-23 (annotated)
- Committer:
- LuisRuiz
- Date:
- Mon Apr 23 22:08:14 2018 +0000
- Revision:
- 0:871af6563674
Ranging Slave for SX1280
Who changed what in which revision?
User | Revision | Line number | New 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 | } |