Version FC
Dependencies: DmTftLibrary eeprom SX1280Lib filesystem mbed
Fork of MSNV2-Terminal_V1-5 by
Radio.cpp@41:5a436163dddf, 2018-10-22 (annotated)
- Committer:
- FCH_31
- Date:
- Mon Oct 22 09:37:50 2018 +0000
- Revision:
- 41:5a436163dddf
avec radio;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
FCH_31 | 41:5a436163dddf | 1 | /* |
FCH_31 | 41:5a436163dddf | 2 | * MISNet |
FCH_31 | 41:5a436163dddf | 3 | * |
FCH_31 | 41:5a436163dddf | 4 | * TERMINAL Radio module |
FCH_31 | 41:5a436163dddf | 5 | * |
FCH_31 | 41:5a436163dddf | 6 | * Created on: September 19, 2018 Author: Francis CHATAIN |
FCH_31 | 41:5a436163dddf | 7 | * |
FCH_31 | 41:5a436163dddf | 8 | */ |
FCH_31 | 41:5a436163dddf | 9 | |
FCH_31 | 41:5a436163dddf | 10 | // ================================================================= INCLUDES |
FCH_31 | 41:5a436163dddf | 11 | |
FCH_31 | 41:5a436163dddf | 12 | #include "mbed.h" |
FCH_31 | 41:5a436163dddf | 13 | #include "main.h" |
FCH_31 | 41:5a436163dddf | 14 | #include "Radio.h" |
FCH_31 | 41:5a436163dddf | 15 | #include "sx1280-hal.h" |
FCH_31 | 41:5a436163dddf | 16 | #include <string.h> |
FCH_31 | 41:5a436163dddf | 17 | |
FCH_31 | 41:5a436163dddf | 18 | |
FCH_31 | 41:5a436163dddf | 19 | // ================================================================= VARIABLE & DEFINE |
FCH_31 | 41:5a436163dddf | 20 | |
FCH_31 | 41:5a436163dddf | 21 | extern "C"{ |
FCH_31 | 41:5a436163dddf | 22 | int _getpid () { return -1;} |
FCH_31 | 41:5a436163dddf | 23 | int _kill (int pid, int sig) { return -1; } |
FCH_31 | 41:5a436163dddf | 24 | extern int _write () ; //{return -1;} |
FCH_31 | 41:5a436163dddf | 25 | } |
FCH_31 | 41:5a436163dddf | 26 | |
FCH_31 | 41:5a436163dddf | 27 | //DigitalOut ledReceive (PA_8) ; |
FCH_31 | 41:5a436163dddf | 28 | //DigitalOut ledSend (PB_13) ; |
FCH_31 | 41:5a436163dddf | 29 | DigitalOut ledReceive (A5) ; |
FCH_31 | 41:5a436163dddf | 30 | DigitalOut ledSend (A4) ; |
FCH_31 | 41:5a436163dddf | 31 | |
FCH_31 | 41:5a436163dddf | 32 | |
FCH_31 | 41:5a436163dddf | 33 | /****************************************************************************** |
FCH_31 | 41:5a436163dddf | 34 | * Declaration of RADIO variables and function |
FCH_31 | 41:5a436163dddf | 35 | *****************************************************************************/ |
FCH_31 | 41:5a436163dddf | 36 | |
FCH_31 | 41:5a436163dddf | 37 | // FEM TxEN:PB3 RxEN:PB9 |
FCH_31 | 41:5a436163dddf | 38 | //DigitalOut femTx (PB_3); |
FCH_31 | 41:5a436163dddf | 39 | //DigitalOut femRx (PB_9); |
FCH_31 | 41:5a436163dddf | 40 | |
FCH_31 | 41:5a436163dddf | 41 | #define BUFFER_SIZE 100 |
FCH_31 | 41:5a436163dddf | 42 | uint8_t BufferSize = BUFFER_SIZE; |
FCH_31 | 41:5a436163dddf | 43 | uint8_t Buffer[BUFFER_SIZE]; |
FCH_31 | 41:5a436163dddf | 44 | |
FCH_31 | 41:5a436163dddf | 45 | int8_t RssiValue = 0 ; |
FCH_31 | 41:5a436163dddf | 46 | int8_t SnrValue = 0 ; |
FCH_31 | 41:5a436163dddf | 47 | |
FCH_31 | 41:5a436163dddf | 48 | typedef enum { APP_IDLE=0, APP_LOWPOWER, APP_RX, APP_RX_TIMEOUT, APP_RX_ERROR, APP_TX, APP_TX_TIMEOUT,} AppStates_t; |
FCH_31 | 41:5a436163dddf | 49 | AppStates_t AppState = APP_LOWPOWER ; |
FCH_31 | 41:5a436163dddf | 50 | |
FCH_31 | 41:5a436163dddf | 51 | ModulationParams_t ModulationParams ; |
FCH_31 | 41:5a436163dddf | 52 | ModulationParams_t ModulationParamsEmitter ; |
FCH_31 | 41:5a436163dddf | 53 | ModulationParams_t ModulationParamsReceiver; |
FCH_31 | 41:5a436163dddf | 54 | |
FCH_31 | 41:5a436163dddf | 55 | PacketParams_t PacketParamsReceiver ; |
FCH_31 | 41:5a436163dddf | 56 | PacketStatus_t PacketStatusReceiver ; |
FCH_31 | 41:5a436163dddf | 57 | |
FCH_31 | 41:5a436163dddf | 58 | PacketParams_t PacketParamsEmitter ; |
FCH_31 | 41:5a436163dddf | 59 | |
FCH_31 | 41:5a436163dddf | 60 | |
FCH_31 | 41:5a436163dddf | 61 | // Radio Callback event |
FCH_31 | 41:5a436163dddf | 62 | void OnTxDone (void) { AppState = APP_TX ; } |
FCH_31 | 41:5a436163dddf | 63 | void OnRxDone (void) { AppState = APP_RX ; } |
FCH_31 | 41:5a436163dddf | 64 | void OnTxTimeout (void) { AppState = APP_TX_TIMEOUT ; } |
FCH_31 | 41:5a436163dddf | 65 | void OnRxTimeout (void) { AppState = APP_RX_TIMEOUT ; } |
FCH_31 | 41:5a436163dddf | 66 | void OnRxError (IrqErrorCode_t errorCode) { AppState = APP_RX_ERROR ; } |
FCH_31 | 41:5a436163dddf | 67 | void OnRangingDone (IrqRangingCode_t val) { } |
FCH_31 | 41:5a436163dddf | 68 | void OnCadDone (bool channelActivityDetected){} |
FCH_31 | 41:5a436163dddf | 69 | |
FCH_31 | 41:5a436163dddf | 70 | RadioCallbacks_t callbacks ={ |
FCH_31 | 41:5a436163dddf | 71 | &OnTxDone , &OnRxDone , // tx / rx Done |
FCH_31 | 41:5a436163dddf | 72 | NULL , NULL , // syncWordDone headerDone |
FCH_31 | 41:5a436163dddf | 73 | &OnTxTimeout , &OnRxTimeout , // txTimeout rxTimeout |
FCH_31 | 41:5a436163dddf | 74 | &OnRxError , // rxError |
FCH_31 | 41:5a436163dddf | 75 | NULL , NULL , // rangingDone / cadDone |
FCH_31 | 41:5a436163dddf | 76 | }; |
FCH_31 | 41:5a436163dddf | 77 | |
FCH_31 | 41:5a436163dddf | 78 | // Timeout callback |
FCH_31 | 41:5a436163dddf | 79 | #define TX_TIMEOUT_VALUE 100 // ms |
FCH_31 | 41:5a436163dddf | 80 | #define RX_TIMEOUT_VALUE 0x00000000 // or 100 (ms) |
FCH_31 | 41:5a436163dddf | 81 | #define RX_TIMEOUT_TICK_SIZE RADIO_TICK_SIZE_1000_US |
FCH_31 | 41:5a436163dddf | 82 | |
FCH_31 | 41:5a436163dddf | 83 | uint16_t RxIrqMask = IRQ_RX_DONE | IRQ_RX_TX_TIMEOUT ; |
FCH_31 | 41:5a436163dddf | 84 | uint16_t TxIrqMask = IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT ; |
FCH_31 | 41:5a436163dddf | 85 | |
FCH_31 | 41:5a436163dddf | 86 | |
FCH_31 | 41:5a436163dddf | 87 | int8_t rssi=0, snr=0; |
FCH_31 | 41:5a436163dddf | 88 | |
FCH_31 | 41:5a436163dddf | 89 | // SX1280 MOSI:PA7 MISO:PA6 CLK:PA5 CS:PA4 BSY:PB7 DIO1:PB6 DIO2:PB5 DIO3:PB4 RST:PB8 |
FCH_31 | 41:5a436163dddf | 90 | // SX1280Hal Radio (PA_7, PA_6, PA_5, PA_4, PB_7, PB_6, PB_5, PB_4, PB_8, &callbacks);//mosi miso clk cs bsy dio1 dio2 dio3 rst [DONGLE] |
FCH_31 | 41:5a436163dddf | 91 | SX1280Hal Radio ( D11 , D12 , D13 , D7 , D3 , D5 , NC , NC , A0 , &callbacks ); // [NUCLEO] |
FCH_31 | 41:5a436163dddf | 92 | |
FCH_31 | 41:5a436163dddf | 93 | //Radio Factory Parameter Sender and Receiver only diff the Central Frequency emetter are shited by 800 Mhz |
FCH_31 | 41:5a436163dddf | 94 | uint8_t _modulation = PACKET_TYPE_LORA; |
FCH_31 | 41:5a436163dddf | 95 | int _spreadingFactor = 2 ; |
FCH_31 | 41:5a436163dddf | 96 | int _bandWidth = 1 ; |
FCH_31 | 41:5a436163dddf | 97 | int _codingRate = 0 ; |
FCH_31 | 41:5a436163dddf | 98 | unsigned long _frequencySend = 2400000000UL ; |
FCH_31 | 41:5a436163dddf | 99 | unsigned long _frequencyReceive = 2400000000UL ; |
FCH_31 | 41:5a436163dddf | 100 | int _outputPower = 13 ; // -18 to +13 dBm |
FCH_31 | 41:5a436163dddf | 101 | int _size = 10 ; |
FCH_31 | 41:5a436163dddf | 102 | |
FCH_31 | 41:5a436163dddf | 103 | int _iq = 1 ; |
FCH_31 | 41:5a436163dddf | 104 | int _crc = 0 ; |
FCH_31 | 41:5a436163dddf | 105 | uint8_t _ar[] = { 0xDD, 0xA0, 0x96, 0x69, 0xDD } ; // only used in GENERIC and BLE mode |
FCH_31 | 41:5a436163dddf | 106 | uint8_t _crcSeedLocal[3] = { 0x00, 0x45, 0x67 } ; // only used in GFSK, FLRC |
FCH_31 | 41:5a436163dddf | 107 | |
FCH_31 | 41:5a436163dddf | 108 | |
FCH_31 | 41:5a436163dddf | 109 | // Futur use with FLRC modulation |
FCH_31 | 41:5a436163dddf | 110 | //int _mode = 4 ; |
FCH_31 | 41:5a436163dddf | 111 | //int _modeShape = 1 ; |
FCH_31 | 41:5a436163dddf | 112 | //int _modeIndex = 2 ; |
FCH_31 | 41:5a436163dddf | 113 | //int _whitening = 1 ; |
FCH_31 | 41:5a436163dddf | 114 | //int _bitrateBandwidth = 12 ; |
FCH_31 | 41:5a436163dddf | 115 | |
FCH_31 | 41:5a436163dddf | 116 | // ============================================================================================ Declaration Internal function |
FCH_31 | 41:5a436163dddf | 117 | |
FCH_31 | 41:5a436163dddf | 118 | RadioLoRaCodingRates_t returnCrLORA (int index) ; |
FCH_31 | 41:5a436163dddf | 119 | RadioLoRaSpreadingFactors_t returnSfLORA (int index) ; |
FCH_31 | 41:5a436163dddf | 120 | RadioLoRaBandwidths_t returnBwLORA (int index) ; |
FCH_31 | 41:5a436163dddf | 121 | |
FCH_31 | 41:5a436163dddf | 122 | void setFemTxRx (bool tx) ; // only if FEM HW |
FCH_31 | 41:5a436163dddf | 123 | |
FCH_31 | 41:5a436163dddf | 124 | /* Evolution FLRC |
FCH_31 | 41:5a436163dddf | 125 | * RadioCrcTypes_t returnCrcLen (int index) ; |
FCH_31 | 41:5a436163dddf | 126 | * RadioFlrcBitrates_t returnBrbwFLRC (int index) ; |
FCH_31 | 41:5a436163dddf | 127 | * RadioFlrcCodingRates_t returnCrFLRC (int index) ; |
FCH_31 | 41:5a436163dddf | 128 | * RadioModShapings_t returnMs (int index) ; |
FCH_31 | 41:5a436163dddf | 129 | */ |
FCH_31 | 41:5a436163dddf | 130 | |
FCH_31 | 41:5a436163dddf | 131 | // ============================================================================================ EXTERNAL FUNCTION |
FCH_31 | 41:5a436163dddf | 132 | |
FCH_31 | 41:5a436163dddf | 133 | |
FCH_31 | 41:5a436163dddf | 134 | // ============================================================================================ Radio Self Test |
FCH_31 | 41:5a436163dddf | 135 | |
FCH_31 | 41:5a436163dddf | 136 | bool radioSelfTest (uint16_t *rev) { |
FCH_31 | 41:5a436163dddf | 137 | Radio.Init(); |
FCH_31 | 41:5a436163dddf | 138 | *rev = Radio.GetFirmwareVersion () ; |
FCH_31 | 41:5a436163dddf | 139 | // printf("*** RAD_ *** Selftest : Firmware R%u\r\n", rev); |
FCH_31 | 41:5a436163dddf | 140 | wait(0.2); |
FCH_31 | 41:5a436163dddf | 141 | //printf((rev==0xffff?"Self test FAIL\r\n":"Self test PASS\r\n")); |
FCH_31 | 41:5a436163dddf | 142 | if (*rev==0xffff) return false ; |
FCH_31 | 41:5a436163dddf | 143 | else return true ; |
FCH_31 | 41:5a436163dddf | 144 | } |
FCH_31 | 41:5a436163dddf | 145 | |
FCH_31 | 41:5a436163dddf | 146 | // ============================================================================================ Radio Initialisation |
FCH_31 | 41:5a436163dddf | 147 | |
FCH_31 | 41:5a436163dddf | 148 | |
FCH_31 | 41:5a436163dddf | 149 | void radioInitReceiver (RadioParameter radioParameter ) { |
FCH_31 | 41:5a436163dddf | 150 | _modulation = radioParameter.modulation ; |
FCH_31 | 41:5a436163dddf | 151 | _spreadingFactor = radioParameter.spreadingFactor ; |
FCH_31 | 41:5a436163dddf | 152 | _bandWidth = radioParameter.bandWidth ; |
FCH_31 | 41:5a436163dddf | 153 | _codingRate = radioParameter.codingRate ; |
FCH_31 | 41:5a436163dddf | 154 | _frequencyReceive = radioParameter.frequency ; |
FCH_31 | 41:5a436163dddf | 155 | |
FCH_31 | 41:5a436163dddf | 156 | if( _modulation == PACKET_TYPE_LORA ) { |
FCH_31 | 41:5a436163dddf | 157 | ModulationParamsReceiver.PacketType = PACKET_TYPE_LORA; |
FCH_31 | 41:5a436163dddf | 158 | ModulationParamsReceiver.Params.LoRa.SpreadingFactor = returnSfLORA (_spreadingFactor) ; |
FCH_31 | 41:5a436163dddf | 159 | ModulationParamsReceiver.Params.LoRa.Bandwidth = returnBwLORA (_bandWidth) ; |
FCH_31 | 41:5a436163dddf | 160 | ModulationParamsReceiver.Params.LoRa.CodingRate = returnCrLORA (_codingRate) ; |
FCH_31 | 41:5a436163dddf | 161 | PacketParamsReceiver.PacketType = PACKET_TYPE_LORA; |
FCH_31 | 41:5a436163dddf | 162 | PacketParamsReceiver.Params.LoRa.PreambleLength = 0x08; |
FCH_31 | 41:5a436163dddf | 163 | PacketParamsReceiver.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH; |
FCH_31 | 41:5a436163dddf | 164 | PacketParamsReceiver.Params.LoRa.PayloadLength = 7 ; |
FCH_31 | 41:5a436163dddf | 165 | PacketParamsReceiver.Params.LoRa.Crc = _crc==1?LORA_CRC_ON:LORA_CRC_OFF; |
FCH_31 | 41:5a436163dddf | 166 | PacketParamsReceiver.Params.LoRa.InvertIQ = _iq==1?LORA_IQ_INVERTED:LORA_IQ_NORMAL; |
FCH_31 | 41:5a436163dddf | 167 | //Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength; |
FCH_31 | 41:5a436163dddf | 168 | } |
FCH_31 | 41:5a436163dddf | 169 | } |
FCH_31 | 41:5a436163dddf | 170 | |
FCH_31 | 41:5a436163dddf | 171 | void radioInitEmitter (RadioParameter radioParameter ) { |
FCH_31 | 41:5a436163dddf | 172 | _modulation = radioParameter.modulation ; |
FCH_31 | 41:5a436163dddf | 173 | _spreadingFactor = radioParameter.spreadingFactor ; |
FCH_31 | 41:5a436163dddf | 174 | _bandWidth = radioParameter.bandWidth ; |
FCH_31 | 41:5a436163dddf | 175 | _codingRate = radioParameter.codingRate ; |
FCH_31 | 41:5a436163dddf | 176 | _size = radioParameter.size ; |
FCH_31 | 41:5a436163dddf | 177 | _frequencySend = radioParameter.frequency ; |
FCH_31 | 41:5a436163dddf | 178 | |
FCH_31 | 41:5a436163dddf | 179 | if( _modulation == PACKET_TYPE_LORA ) { |
FCH_31 | 41:5a436163dddf | 180 | ModulationParamsEmitter.PacketType = PACKET_TYPE_LORA ; |
FCH_31 | 41:5a436163dddf | 181 | ModulationParamsEmitter.Params.LoRa.SpreadingFactor = returnSfLORA (_spreadingFactor) ; |
FCH_31 | 41:5a436163dddf | 182 | ModulationParamsEmitter.Params.LoRa.Bandwidth = returnBwLORA (_bandWidth) ; |
FCH_31 | 41:5a436163dddf | 183 | ModulationParamsEmitter.Params.LoRa.CodingRate = returnCrLORA (_codingRate) ; |
FCH_31 | 41:5a436163dddf | 184 | PacketParamsEmitter.PacketType = PACKET_TYPE_LORA ; |
FCH_31 | 41:5a436163dddf | 185 | PacketParamsEmitter.Params.LoRa.PreambleLength = 0x08 ; |
FCH_31 | 41:5a436163dddf | 186 | PacketParamsEmitter.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH ; |
FCH_31 | 41:5a436163dddf | 187 | PacketParamsEmitter.Params.LoRa.PayloadLength = _size ; |
FCH_31 | 41:5a436163dddf | 188 | PacketParamsEmitter.Params.LoRa.Crc = _crc==1?LORA_CRC_ON:LORA_CRC_OFF ; |
FCH_31 | 41:5a436163dddf | 189 | PacketParamsEmitter.Params.LoRa.InvertIQ = _iq==1?LORA_IQ_INVERTED:LORA_IQ_NORMAL; |
FCH_31 | 41:5a436163dddf | 190 | //Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.LoRa.PayloadLength; |
FCH_31 | 41:5a436163dddf | 191 | } |
FCH_31 | 41:5a436163dddf | 192 | } |
FCH_31 | 41:5a436163dddf | 193 | |
FCH_31 | 41:5a436163dddf | 194 | |
FCH_31 | 41:5a436163dddf | 195 | void radioInitRadio () { |
FCH_31 | 41:5a436163dddf | 196 | Radio.SetStandby ( STDBY_RC ) ; |
FCH_31 | 41:5a436163dddf | 197 | Radio.SetCrcSeed ( _crcSeedLocal ) ; |
FCH_31 | 41:5a436163dddf | 198 | Radio.SetCrcPolynomial ( 0x0123 ) ; |
FCH_31 | 41:5a436163dddf | 199 | Radio.SetPollingMode ( ) ; |
FCH_31 | 41:5a436163dddf | 200 | Radio.SetBufferBaseAddresses ( 0x00, 0x00 ) ; |
FCH_31 | 41:5a436163dddf | 201 | Radio.SetSyncWord ( 1, _ar ) ; |
FCH_31 | 41:5a436163dddf | 202 | } |
FCH_31 | 41:5a436163dddf | 203 | |
FCH_31 | 41:5a436163dddf | 204 | void radioStartReceive (RadioParameter radioParameter) { |
FCH_31 | 41:5a436163dddf | 205 | _frequencyReceive = radioParameter.frequency ; |
FCH_31 | 41:5a436163dddf | 206 | _outputPower = radioParameter.outputPower ; |
FCH_31 | 41:5a436163dddf | 207 | |
FCH_31 | 41:5a436163dddf | 208 | // setFemTxRx (0) ; |
FCH_31 | 41:5a436163dddf | 209 | ledSend = 0 ; |
FCH_31 | 41:5a436163dddf | 210 | ledReceive = 0 ; |
FCH_31 | 41:5a436163dddf | 211 | |
FCH_31 | 41:5a436163dddf | 212 | Radio.SetPacketType ( ModulationParamsReceiver.PacketType ) ; |
FCH_31 | 41:5a436163dddf | 213 | Radio.SetModulationParams ( &ModulationParamsReceiver ) ; |
FCH_31 | 41:5a436163dddf | 214 | Radio.SetPacketParams ( &PacketParamsReceiver ) ; |
FCH_31 | 41:5a436163dddf | 215 | Radio.SetRfFrequency ( _frequencyReceive ) ; |
FCH_31 | 41:5a436163dddf | 216 | Radio.SetDioIrqParams ( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ) ; |
FCH_31 | 41:5a436163dddf | 217 | Radio.SetRx ( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ) ; |
FCH_31 | 41:5a436163dddf | 218 | |
FCH_31 | 41:5a436163dddf | 219 | AppState = APP_LOWPOWER ; |
FCH_31 | 41:5a436163dddf | 220 | memset ( &Buffer , 0x00, BufferSize ) ; |
FCH_31 | 41:5a436163dddf | 221 | } |
FCH_31 | 41:5a436163dddf | 222 | |
FCH_31 | 41:5a436163dddf | 223 | |
FCH_31 | 41:5a436163dddf | 224 | void radioSend (RadioParameter radioParameter, uint8_t *frame, uint8_t len) { |
FCH_31 | 41:5a436163dddf | 225 | _frequencySend = radioParameter.frequency ; |
FCH_31 | 41:5a436163dddf | 226 | _outputPower = radioParameter.outputPower ; |
FCH_31 | 41:5a436163dddf | 227 | |
FCH_31 | 41:5a436163dddf | 228 | ledSend = 1 ; |
FCH_31 | 41:5a436163dddf | 229 | ledReceive = 0 ; |
FCH_31 | 41:5a436163dddf | 230 | // setFemTxRx(1); |
FCH_31 | 41:5a436163dddf | 231 | |
FCH_31 | 41:5a436163dddf | 232 | Radio.SetPacketType ( ModulationParamsEmitter.PacketType ) ; |
FCH_31 | 41:5a436163dddf | 233 | Radio.SetModulationParams ( &ModulationParamsEmitter ) ; |
FCH_31 | 41:5a436163dddf | 234 | Radio.SetPacketParams ( &PacketParamsEmitter ) ; |
FCH_31 | 41:5a436163dddf | 235 | Radio.SetRfFrequency ( _frequencySend ) ; |
FCH_31 | 41:5a436163dddf | 236 | Radio.SetTxParams ( _outputPower, RADIO_RAMP_20_US ) ; |
FCH_31 | 41:5a436163dddf | 237 | Radio.SetDioIrqParams ( TxIrqMask, TxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); |
FCH_31 | 41:5a436163dddf | 238 | Radio.SendPayload ( frame, len, ( TickTime_t ){ RX_TIMEOUT_TICK_SIZE, TX_TIMEOUT_VALUE } ); |
FCH_31 | 41:5a436163dddf | 239 | } |
FCH_31 | 41:5a436163dddf | 240 | |
FCH_31 | 41:5a436163dddf | 241 | // ============================================================================================ Radio Handler |
FCH_31 | 41:5a436163dddf | 242 | bool radioHandler(uint8_t *frame, uint8_t *len, int8_t *rssi, int8_t *snr){ |
FCH_31 | 41:5a436163dddf | 243 | |
FCH_31 | 41:5a436163dddf | 244 | bool event = false ; |
FCH_31 | 41:5a436163dddf | 245 | Radio.ProcessIrqs(); |
FCH_31 | 41:5a436163dddf | 246 | switch( AppState ) { |
FCH_31 | 41:5a436163dddf | 247 | case APP_RX: |
FCH_31 | 41:5a436163dddf | 248 | printf ("*** RADIO *** radioHandler APP RX \r\n"); |
FCH_31 | 41:5a436163dddf | 249 | AppState = APP_LOWPOWER; |
FCH_31 | 41:5a436163dddf | 250 | memset ( &Buffer , 0, BUFFER_SIZE ) ; |
FCH_31 | 41:5a436163dddf | 251 | ledReceive = !ledReceive; |
FCH_31 | 41:5a436163dddf | 252 | Radio.GetPayload( Buffer, len, BUFFER_SIZE ); |
FCH_31 | 41:5a436163dddf | 253 | //cdc2->printf ("APP-RX Buffer = %s\r\n", Buffer); |
FCH_31 | 41:5a436163dddf | 254 | //showRssiSnr () ; |
FCH_31 | 41:5a436163dddf | 255 | Radio.GetPacketStatus(&PacketStatusReceiver); |
FCH_31 | 41:5a436163dddf | 256 | *rssi = PacketStatusReceiver.LoRa.RssiPkt; |
FCH_31 | 41:5a436163dddf | 257 | *snr = PacketStatusReceiver.LoRa.SnrPkt; |
FCH_31 | 41:5a436163dddf | 258 | memcpy (frame, Buffer, *len) ; |
FCH_31 | 41:5a436163dddf | 259 | event = true ; |
FCH_31 | 41:5a436163dddf | 260 | //printBytes (Buffer, 30) ; |
FCH_31 | 41:5a436163dddf | 261 | setFemTxRx(0); |
FCH_31 | 41:5a436163dddf | 262 | Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); |
FCH_31 | 41:5a436163dddf | 263 | Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); |
FCH_31 | 41:5a436163dddf | 264 | ledReceive = !ledReceive; |
FCH_31 | 41:5a436163dddf | 265 | break; |
FCH_31 | 41:5a436163dddf | 266 | |
FCH_31 | 41:5a436163dddf | 267 | case APP_TX: |
FCH_31 | 41:5a436163dddf | 268 | printf ("*** RADIO *** radioHandler APP TX \r\n"); |
FCH_31 | 41:5a436163dddf | 269 | AppState = APP_LOWPOWER; |
FCH_31 | 41:5a436163dddf | 270 | //cdc2->printf ("APP-TX \r\n"); |
FCH_31 | 41:5a436163dddf | 271 | setFemTxRx(0); // if fem |
FCH_31 | 41:5a436163dddf | 272 | Radio.SetPacketType ( ModulationParamsReceiver.PacketType ) ; |
FCH_31 | 41:5a436163dddf | 273 | Radio.SetModulationParams ( &ModulationParamsReceiver ) ; |
FCH_31 | 41:5a436163dddf | 274 | Radio.SetPacketParams ( &PacketParamsReceiver ) ; |
FCH_31 | 41:5a436163dddf | 275 | Radio.SetRfFrequency ( _frequencyReceive ) ; |
FCH_31 | 41:5a436163dddf | 276 | |
FCH_31 | 41:5a436163dddf | 277 | Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); |
FCH_31 | 41:5a436163dddf | 278 | Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); |
FCH_31 | 41:5a436163dddf | 279 | ledSend = 0 ; |
FCH_31 | 41:5a436163dddf | 280 | break; |
FCH_31 | 41:5a436163dddf | 281 | |
FCH_31 | 41:5a436163dddf | 282 | case APP_RX_TIMEOUT: |
FCH_31 | 41:5a436163dddf | 283 | printf ("*** RADIO *** radioHandler APP RX Timeout \r\n"); |
FCH_31 | 41:5a436163dddf | 284 | AppState = APP_LOWPOWER; |
FCH_31 | 41:5a436163dddf | 285 | setFemTxRx(0); |
FCH_31 | 41:5a436163dddf | 286 | Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); |
FCH_31 | 41:5a436163dddf | 287 | Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); |
FCH_31 | 41:5a436163dddf | 288 | break; |
FCH_31 | 41:5a436163dddf | 289 | |
FCH_31 | 41:5a436163dddf | 290 | case APP_RX_ERROR: |
FCH_31 | 41:5a436163dddf | 291 | AppState = APP_LOWPOWER; |
FCH_31 | 41:5a436163dddf | 292 | break; |
FCH_31 | 41:5a436163dddf | 293 | |
FCH_31 | 41:5a436163dddf | 294 | case APP_TX_TIMEOUT: |
FCH_31 | 41:5a436163dddf | 295 | printf ("*** RADIO *** radioHandler APP TX Timeout \r\n"); |
FCH_31 | 41:5a436163dddf | 296 | AppState = APP_LOWPOWER; |
FCH_31 | 41:5a436163dddf | 297 | //cdc2->printf ("APP-TX \r\n"); |
FCH_31 | 41:5a436163dddf | 298 | setFemTxRx(0); |
FCH_31 | 41:5a436163dddf | 299 | Radio.SetPacketType ( ModulationParamsReceiver.PacketType ) ; |
FCH_31 | 41:5a436163dddf | 300 | Radio.SetModulationParams ( &ModulationParamsReceiver ) ; |
FCH_31 | 41:5a436163dddf | 301 | Radio.SetPacketParams ( &PacketParamsReceiver ) ; |
FCH_31 | 41:5a436163dddf | 302 | Radio.SetRfFrequency ( _frequencyReceive ) ; |
FCH_31 | 41:5a436163dddf | 303 | |
FCH_31 | 41:5a436163dddf | 304 | Radio.SetDioIrqParams( RxIrqMask, RxIrqMask, IRQ_RADIO_NONE, IRQ_RADIO_NONE ); |
FCH_31 | 41:5a436163dddf | 305 | Radio.SetRx( ( TickTime_t ) { RX_TIMEOUT_TICK_SIZE, RX_TIMEOUT_VALUE } ); |
FCH_31 | 41:5a436163dddf | 306 | ledSend = 0 ; |
FCH_31 | 41:5a436163dddf | 307 | break; |
FCH_31 | 41:5a436163dddf | 308 | |
FCH_31 | 41:5a436163dddf | 309 | case APP_LOWPOWER: |
FCH_31 | 41:5a436163dddf | 310 | break; |
FCH_31 | 41:5a436163dddf | 311 | |
FCH_31 | 41:5a436163dddf | 312 | default: |
FCH_31 | 41:5a436163dddf | 313 | // Set low power |
FCH_31 | 41:5a436163dddf | 314 | break; |
FCH_31 | 41:5a436163dddf | 315 | } |
FCH_31 | 41:5a436163dddf | 316 | return event ; |
FCH_31 | 41:5a436163dddf | 317 | } |
FCH_31 | 41:5a436163dddf | 318 | |
FCH_31 | 41:5a436163dddf | 319 | |
FCH_31 | 41:5a436163dddf | 320 | |
FCH_31 | 41:5a436163dddf | 321 | |
FCH_31 | 41:5a436163dddf | 322 | // ====================================================================================================== INTERNAL FUNCTION |
FCH_31 | 41:5a436163dddf | 323 | |
FCH_31 | 41:5a436163dddf | 324 | RadioLoRaCodingRates_t returnCrLORA (int index) { |
FCH_31 | 41:5a436163dddf | 325 | // coding rate for LoRa |
FCH_31 | 41:5a436163dddf | 326 | switch(index){ |
FCH_31 | 41:5a436163dddf | 327 | case 0: return LORA_CR_4_5; |
FCH_31 | 41:5a436163dddf | 328 | case 1: return LORA_CR_4_6; |
FCH_31 | 41:5a436163dddf | 329 | case 2: return LORA_CR_4_7; |
FCH_31 | 41:5a436163dddf | 330 | case 3: return LORA_CR_4_8; |
FCH_31 | 41:5a436163dddf | 331 | case 4: return LORA_CR_LI_4_5; |
FCH_31 | 41:5a436163dddf | 332 | case 5: return LORA_CR_LI_4_6; |
FCH_31 | 41:5a436163dddf | 333 | case 6: return LORA_CR_LI_4_7; |
FCH_31 | 41:5a436163dddf | 334 | default : return LORA_CR_4_5; |
FCH_31 | 41:5a436163dddf | 335 | } |
FCH_31 | 41:5a436163dddf | 336 | } |
FCH_31 | 41:5a436163dddf | 337 | |
FCH_31 | 41:5a436163dddf | 338 | |
FCH_31 | 41:5a436163dddf | 339 | // SF for LoRa |
FCH_31 | 41:5a436163dddf | 340 | RadioLoRaSpreadingFactors_t returnSfLORA(int index) { |
FCH_31 | 41:5a436163dddf | 341 | switch(index){ |
FCH_31 | 41:5a436163dddf | 342 | case 0: return LORA_SF5 ; |
FCH_31 | 41:5a436163dddf | 343 | case 1: return LORA_SF6 ; |
FCH_31 | 41:5a436163dddf | 344 | case 2: return LORA_SF7 ; |
FCH_31 | 41:5a436163dddf | 345 | case 3: return LORA_SF8 ; |
FCH_31 | 41:5a436163dddf | 346 | case 4: return LORA_SF9 ; |
FCH_31 | 41:5a436163dddf | 347 | case 5: return LORA_SF10; |
FCH_31 | 41:5a436163dddf | 348 | case 6: return LORA_SF11; |
FCH_31 | 41:5a436163dddf | 349 | case 7: return LORA_SF12; |
FCH_31 | 41:5a436163dddf | 350 | default : return LORA_SF7 ; |
FCH_31 | 41:5a436163dddf | 351 | } |
FCH_31 | 41:5a436163dddf | 352 | } |
FCH_31 | 41:5a436163dddf | 353 | RadioModShapings_t returnMs(int index){ |
FCH_31 | 41:5a436163dddf | 354 | // shaping for FLRC GFSK and BLE |
FCH_31 | 41:5a436163dddf | 355 | switch(index){ |
FCH_31 | 41:5a436163dddf | 356 | case 0: return RADIO_MOD_SHAPING_BT_OFF ; |
FCH_31 | 41:5a436163dddf | 357 | case 1: return RADIO_MOD_SHAPING_BT_1_0 ; |
FCH_31 | 41:5a436163dddf | 358 | case 2: return RADIO_MOD_SHAPING_BT_0_5 ; |
FCH_31 | 41:5a436163dddf | 359 | default : return RADIO_MOD_SHAPING_BT_1_0 ; |
FCH_31 | 41:5a436163dddf | 360 | } |
FCH_31 | 41:5a436163dddf | 361 | } |
FCH_31 | 41:5a436163dddf | 362 | RadioLoRaBandwidths_t returnBwLORA(int index){ |
FCH_31 | 41:5a436163dddf | 363 | // bandwidth for LoRa |
FCH_31 | 41:5a436163dddf | 364 | switch(index){ |
FCH_31 | 41:5a436163dddf | 365 | case 0: return LORA_BW_0200 ; |
FCH_31 | 41:5a436163dddf | 366 | case 1: return LORA_BW_0400 ; |
FCH_31 | 41:5a436163dddf | 367 | case 2: return LORA_BW_0800 ; |
FCH_31 | 41:5a436163dddf | 368 | case 3: return LORA_BW_1600 ; |
FCH_31 | 41:5a436163dddf | 369 | default : return LORA_BW_1600 ; |
FCH_31 | 41:5a436163dddf | 370 | } |
FCH_31 | 41:5a436163dddf | 371 | } |
FCH_31 | 41:5a436163dddf | 372 | |
FCH_31 | 41:5a436163dddf | 373 | |
FCH_31 | 41:5a436163dddf | 374 | void setFemTxRx(bool tx) { |
FCH_31 | 41:5a436163dddf | 375 | /* Hoel module |
FCH_31 | 41:5a436163dddf | 376 | if (tx) { femTx=1 ; femRx=0 ; } |
FCH_31 | 41:5a436163dddf | 377 | else { femRx=1 ; femTx=0 ; } |
FCH_31 | 41:5a436163dddf | 378 | */ |
FCH_31 | 41:5a436163dddf | 379 | } |
FCH_31 | 41:5a436163dddf | 380 | |
FCH_31 | 41:5a436163dddf | 381 | |
FCH_31 | 41:5a436163dddf | 382 | /* Futur Use |
FCH_31 | 41:5a436163dddf | 383 | * |
FCH_31 | 41:5a436163dddf | 384 | * else if( _modulation == PACKET_TYPE_FLRC ) { |
FCH_31 | 41:5a436163dddf | 385 | ModulationParams.PacketType = PACKET_TYPE_FLRC; |
FCH_31 | 41:5a436163dddf | 386 | ModulationParams.Params.Flrc.BitrateBandwidth = returnBrbwFLRC (_bitrateBandwidth);// FLRC_BR_0_260_BW_0_3; |
FCH_31 | 41:5a436163dddf | 387 | ModulationParams.Params.Flrc.CodingRate = returnCrFLRC (codingRate);//FLRC_CR_1_2; |
FCH_31 | 41:5a436163dddf | 388 | ModulationParams.Params.Flrc.ModulationShaping = returnMs (_modeShape);//RADIO_MOD_SHAPING_BT_1_0; |
FCH_31 | 41:5a436163dddf | 389 | PacketParams.PacketType = PACKET_TYPE_FLRC; |
FCH_31 | 41:5a436163dddf | 390 | PacketParams.Params.Flrc.PreambleLength = PREAMBLE_LENGTH_32_BITS; |
FCH_31 | 41:5a436163dddf | 391 | PacketParams.Params.Flrc.SyncWordLength = FLRC_SYNCWORD_LENGTH_4_BYTE; |
FCH_31 | 41:5a436163dddf | 392 | PacketParams.Params.Flrc.SyncWordMatch = RADIO_RX_MATCH_SYNCWORD_1; |
FCH_31 | 41:5a436163dddf | 393 | PacketParams.Params.Flrc.HeaderType = RADIO_PACKET_VARIABLE_LENGTH; |
FCH_31 | 41:5a436163dddf | 394 | PacketParams.Params.Flrc.PayloadLength = 32 ; |
FCH_31 | 41:5a436163dddf | 395 | PacketParams.Params.Flrc.CrcLength = RADIO_CRC_3_BYTES; |
FCH_31 | 41:5a436163dddf | 396 | PacketParams.Params.Flrc.Whitening = _whitening==1?RADIO_WHITENING_ON:RADIO_WHITENING_OFF;//RADIO_WHITENING_OFF; |
FCH_31 | 41:5a436163dddf | 397 | //Eeprom.EepromData.DemoSettings.PayloadLength = PacketParams.Params.Flrc.PayloadLength; |
FCH_31 | 41:5a436163dddf | 398 | } |
FCH_31 | 41:5a436163dddf | 399 | * |
FCH_31 | 41:5a436163dddf | 400 | * |
FCH_31 | 41:5a436163dddf | 401 | * |
FCH_31 | 41:5a436163dddf | 402 | *RadioFlrcBitrates_t returnBrbwFLRC(int index){ |
FCH_31 | 41:5a436163dddf | 403 | // bitrate and bandwidth for FLRC |
FCH_31 | 41:5a436163dddf | 404 | switch(index){ |
FCH_31 | 41:5a436163dddf | 405 | case 0: return FLRC_BR_1_300_BW_1_2; |
FCH_31 | 41:5a436163dddf | 406 | case 1: return FLRC_BR_1_040_BW_1_2; |
FCH_31 | 41:5a436163dddf | 407 | case 2: return FLRC_BR_0_650_BW_0_6; |
FCH_31 | 41:5a436163dddf | 408 | case 3: return FLRC_BR_0_520_BW_0_6; |
FCH_31 | 41:5a436163dddf | 409 | case 4: return FLRC_BR_0_325_BW_0_3; |
FCH_31 | 41:5a436163dddf | 410 | case 5: return FLRC_BR_0_260_BW_0_3; |
FCH_31 | 41:5a436163dddf | 411 | default : return FLRC_BR_1_300_BW_1_2; |
FCH_31 | 41:5a436163dddf | 412 | } |
FCH_31 | 41:5a436163dddf | 413 | } |
FCH_31 | 41:5a436163dddf | 414 | RadioFlrcCodingRates_t returnCrFLRC(int index){ |
FCH_31 | 41:5a436163dddf | 415 | switch(index){ |
FCH_31 | 41:5a436163dddf | 416 | case 0: return FLRC_CR_1_2; |
FCH_31 | 41:5a436163dddf | 417 | case 1: return FLRC_CR_3_4; |
FCH_31 | 41:5a436163dddf | 418 | case 2: return FLRC_CR_3_4; |
FCH_31 | 41:5a436163dddf | 419 | default : return FLRC_CR_1_2; |
FCH_31 | 41:5a436163dddf | 420 | } |
FCH_31 | 41:5a436163dddf | 421 | } |
FCH_31 | 41:5a436163dddf | 422 | |
FCH_31 | 41:5a436163dddf | 423 | RadioCrcTypes_t returnCrcLen(int index){ |
FCH_31 | 41:5a436163dddf | 424 | // CRC length for GFSK and FLRC |
FCH_31 | 41:5a436163dddf | 425 | switch(index){ |
FCH_31 | 41:5a436163dddf | 426 | case 0: return RADIO_CRC_OFF; |
FCH_31 | 41:5a436163dddf | 427 | case 1: return RADIO_CRC_1_BYTES; |
FCH_31 | 41:5a436163dddf | 428 | case 2: return RADIO_CRC_2_BYTES; |
FCH_31 | 41:5a436163dddf | 429 | case 3: return RADIO_CRC_3_BYTES; |
FCH_31 | 41:5a436163dddf | 430 | default : return RADIO_CRC_OFF; |
FCH_31 | 41:5a436163dddf | 431 | } |
FCH_31 | 41:5a436163dddf | 432 | } |
FCH_31 | 41:5a436163dddf | 433 | * |
FCH_31 | 41:5a436163dddf | 434 | * |
FCH_31 | 41:5a436163dddf | 435 | * |
FCH_31 | 41:5a436163dddf | 436 | */ |