SX1276GenericLib to support sx1276 bassed LoRa modules, including HopeRF RFM95, Murata CMWX1ZZABZ and Semtech SX1276MB1MAS/SX1276MB1LAS modules

Dependents:   DISCO-L072CZ-LRWAN1_LoRa_PingPong DISCO-L072CZ-LRWAN1_LoRa_PingPong DISCO-L072CZ-LRWAN1_LoRa_PingPong DISCO-L072CZ-LRWAN1_LoRa_USB_Rx ... more

Fork of SX1276Lib by Semtech

Committer:
Helmut64
Date:
Sun May 14 14:22:02 2017 +0000
Revision:
48:62af1e692f00
Parent:
39:706c32eda7e7
Child:
50:43f7160e869c
Added a Radio pointer parameter to the event callback functions, this allows to know the context where the event coming from, specially of interest when using multiple Radios. It also avoids the use of global variables.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GregCr 0:e6ceb13d2d05 1 /*
GregCr 0:e6ceb13d2d05 2 / _____) _ | |
GregCr 0:e6ceb13d2d05 3 ( (____ _____ ____ _| |_ _____ ____| |__
GregCr 0:e6ceb13d2d05 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
GregCr 0:e6ceb13d2d05 5 _____) ) ____| | | || |_| ____( (___| | | |
GregCr 0:e6ceb13d2d05 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
mluis 22:7f3aab69cca9 7 (C) 2014 Semtech
GregCr 0:e6ceb13d2d05 8
GregCr 0:e6ceb13d2d05 9 Description: Interface for the radios, contains the main functions that a radio needs, and 5 callback functions
GregCr 0:e6ceb13d2d05 10
GregCr 0:e6ceb13d2d05 11 License: Revised BSD License, see LICENSE.TXT file include in the project
GregCr 0:e6ceb13d2d05 12
GregCr 0:e6ceb13d2d05 13 Maintainers: Miguel Luis, Gregory Cristian and Nicolas Huguenin
GregCr 0:e6ceb13d2d05 14 */
GregCr 0:e6ceb13d2d05 15 #ifndef __RADIO_H__
GregCr 0:e6ceb13d2d05 16 #define __RADIO_H__
GregCr 0:e6ceb13d2d05 17
GregCr 0:e6ceb13d2d05 18 #include "mbed.h"
GregCr 0:e6ceb13d2d05 19
Helmut Tschemernjak 39:706c32eda7e7 20
Helmut Tschemernjak 39:706c32eda7e7 21 /*
Helmut Tschemernjak 39:706c32eda7e7 22 !
Helmut Tschemernjak 39:706c32eda7e7 23 * Radio driver internal state machine states definition
Helmut Tschemernjak 39:706c32eda7e7 24 */
Helmut Tschemernjak 39:706c32eda7e7 25 typedef enum RadioState
Helmut Tschemernjak 39:706c32eda7e7 26 {
Helmut Tschemernjak 39:706c32eda7e7 27 RF_IDLE = 0,
Helmut Tschemernjak 39:706c32eda7e7 28 RF_RX_RUNNING,
Helmut Tschemernjak 39:706c32eda7e7 29 RF_TX_RUNNING,
Helmut Tschemernjak 39:706c32eda7e7 30 RF_CAD,
Helmut Tschemernjak 39:706c32eda7e7 31 }RadioState_t;
Helmut Tschemernjak 39:706c32eda7e7 32
Helmut Tschemernjak 39:706c32eda7e7 33
Helmut Tschemernjak 39:706c32eda7e7 34 /*!
Helmut Tschemernjak 39:706c32eda7e7 35 * Type of the modem. [LORA / FSK]
Helmut Tschemernjak 39:706c32eda7e7 36 */
Helmut Tschemernjak 39:706c32eda7e7 37 typedef enum ModemType
Helmut Tschemernjak 39:706c32eda7e7 38 {
Helmut Tschemernjak 39:706c32eda7e7 39 MODEM_FSK = 0,
Helmut Tschemernjak 39:706c32eda7e7 40 MODEM_LORA
Helmut Tschemernjak 39:706c32eda7e7 41 }RadioModems_t;
Helmut Tschemernjak 39:706c32eda7e7 42
Helmut Tschemernjak 39:706c32eda7e7 43
Helmut Tschemernjak 39:706c32eda7e7 44 /*!
Helmut Tschemernjak 39:706c32eda7e7 45 * Radio LoRa modem parameters
Helmut Tschemernjak 39:706c32eda7e7 46 */
Helmut Tschemernjak 39:706c32eda7e7 47 typedef struct
Helmut Tschemernjak 39:706c32eda7e7 48 {
Helmut Tschemernjak 39:706c32eda7e7 49 int8_t Power;
Helmut Tschemernjak 39:706c32eda7e7 50 uint32_t Bandwidth;
Helmut Tschemernjak 39:706c32eda7e7 51 uint32_t Datarate;
Helmut Tschemernjak 39:706c32eda7e7 52 bool LowDatarateOptimize;
Helmut Tschemernjak 39:706c32eda7e7 53 uint8_t Coderate;
Helmut Tschemernjak 39:706c32eda7e7 54 uint16_t PreambleLen;
Helmut Tschemernjak 39:706c32eda7e7 55 bool FixLen;
Helmut Tschemernjak 39:706c32eda7e7 56 uint8_t PayloadLen;
Helmut Tschemernjak 39:706c32eda7e7 57 bool CrcOn;
Helmut Tschemernjak 39:706c32eda7e7 58 bool FreqHopOn;
Helmut Tschemernjak 39:706c32eda7e7 59 uint8_t HopPeriod;
Helmut Tschemernjak 39:706c32eda7e7 60 bool IqInverted;
Helmut Tschemernjak 39:706c32eda7e7 61 bool RxContinuous;
Helmut Tschemernjak 39:706c32eda7e7 62 uint32_t TxTimeout;
Helmut Tschemernjak 39:706c32eda7e7 63 bool PublicNetwork;
Helmut Tschemernjak 39:706c32eda7e7 64 }RadioLoRaSettings_t;
Helmut Tschemernjak 39:706c32eda7e7 65
Helmut Tschemernjak 39:706c32eda7e7 66 /*!
Helmut Tschemernjak 39:706c32eda7e7 67 * Radio FSK modem parameters
Helmut Tschemernjak 39:706c32eda7e7 68 */
Helmut Tschemernjak 39:706c32eda7e7 69 typedef struct
Helmut Tschemernjak 39:706c32eda7e7 70 {
Helmut Tschemernjak 39:706c32eda7e7 71 int8_t Power;
Helmut Tschemernjak 39:706c32eda7e7 72 uint32_t Fdev;
Helmut Tschemernjak 39:706c32eda7e7 73 uint32_t Bandwidth;
Helmut Tschemernjak 39:706c32eda7e7 74 uint32_t BandwidthAfc;
Helmut Tschemernjak 39:706c32eda7e7 75 uint32_t Datarate;
Helmut Tschemernjak 39:706c32eda7e7 76 uint16_t PreambleLen;
Helmut Tschemernjak 39:706c32eda7e7 77 bool FixLen;
Helmut Tschemernjak 39:706c32eda7e7 78 uint8_t PayloadLen;
Helmut Tschemernjak 39:706c32eda7e7 79 bool CrcOn;
Helmut Tschemernjak 39:706c32eda7e7 80 bool IqInverted;
Helmut Tschemernjak 39:706c32eda7e7 81 bool RxContinuous;
Helmut Tschemernjak 39:706c32eda7e7 82 uint32_t TxTimeout;
Helmut Tschemernjak 39:706c32eda7e7 83 uint32_t RxSingleTimeout;
Helmut Tschemernjak 39:706c32eda7e7 84 }RadioFskSettings_t;
Helmut Tschemernjak 39:706c32eda7e7 85
Helmut Tschemernjak 39:706c32eda7e7 86 /*!
Helmut Tschemernjak 39:706c32eda7e7 87 * Radio FSK packet handler state
Helmut Tschemernjak 39:706c32eda7e7 88 */
Helmut Tschemernjak 39:706c32eda7e7 89 typedef struct
Helmut Tschemernjak 39:706c32eda7e7 90 {
Helmut Tschemernjak 39:706c32eda7e7 91 uint8_t PreambleDetected;
Helmut Tschemernjak 39:706c32eda7e7 92 uint8_t SyncWordDetected;
Helmut Tschemernjak 39:706c32eda7e7 93 int8_t RssiValue;
Helmut Tschemernjak 39:706c32eda7e7 94 int32_t AfcValue;
Helmut Tschemernjak 39:706c32eda7e7 95 uint8_t RxGain;
Helmut Tschemernjak 39:706c32eda7e7 96 uint16_t Size;
Helmut Tschemernjak 39:706c32eda7e7 97 uint16_t NbBytes;
Helmut Tschemernjak 39:706c32eda7e7 98 uint8_t FifoThresh;
Helmut Tschemernjak 39:706c32eda7e7 99 uint8_t ChunkSize;
Helmut Tschemernjak 39:706c32eda7e7 100 }RadioFskPacketHandler_t;
Helmut Tschemernjak 39:706c32eda7e7 101
Helmut Tschemernjak 39:706c32eda7e7 102 /*!
Helmut Tschemernjak 39:706c32eda7e7 103 * Radio LoRa packet handler state
Helmut Tschemernjak 39:706c32eda7e7 104 */
Helmut Tschemernjak 39:706c32eda7e7 105 typedef struct
Helmut Tschemernjak 39:706c32eda7e7 106 {
Helmut Tschemernjak 39:706c32eda7e7 107 int8_t SnrValue;
Helmut Tschemernjak 39:706c32eda7e7 108 int8_t RssiValue;
Helmut Tschemernjak 39:706c32eda7e7 109 uint8_t Size;
Helmut Tschemernjak 39:706c32eda7e7 110 }RadioLoRaPacketHandler_t;
Helmut Tschemernjak 39:706c32eda7e7 111
Helmut Tschemernjak 39:706c32eda7e7 112 /*!
Helmut Tschemernjak 39:706c32eda7e7 113 * Radio Settings
Helmut Tschemernjak 39:706c32eda7e7 114 */
Helmut Tschemernjak 39:706c32eda7e7 115 typedef struct
Helmut Tschemernjak 39:706c32eda7e7 116 {
Helmut Tschemernjak 39:706c32eda7e7 117 RadioState State;
Helmut Tschemernjak 39:706c32eda7e7 118 ModemType Modem;
Helmut Tschemernjak 39:706c32eda7e7 119 uint32_t Channel;
Helmut Tschemernjak 39:706c32eda7e7 120 RadioFskSettings_t Fsk;
Helmut Tschemernjak 39:706c32eda7e7 121 RadioFskPacketHandler_t FskPacketHandler;
Helmut Tschemernjak 39:706c32eda7e7 122 RadioLoRaSettings_t LoRa;
Helmut Tschemernjak 39:706c32eda7e7 123 RadioLoRaPacketHandler_t LoRaPacketHandler;
Helmut Tschemernjak 39:706c32eda7e7 124 }RadioSettings_t;
GregCr 0:e6ceb13d2d05 125
GregCr 0:e6ceb13d2d05 126 /*!
mluis 21:2e496deb7858 127 * @brief Radio driver callback functions
GregCr 0:e6ceb13d2d05 128 */
mluis 21:2e496deb7858 129 typedef struct
GregCr 0:e6ceb13d2d05 130 {
mluis 13:618826a997e2 131 /*!
GregCr 0:e6ceb13d2d05 132 * @brief Tx Done callback prototype.
GregCr 0:e6ceb13d2d05 133 */
Helmut64 48:62af1e692f00 134 void ( *TxDone )(void *radio);
mluis 13:618826a997e2 135 /*!
GregCr 0:e6ceb13d2d05 136 * @brief Tx Timeout callback prototype.
GregCr 0:e6ceb13d2d05 137 */
Helmut64 48:62af1e692f00 138 void ( *TxTimeout )(void *radio);
mluis 13:618826a997e2 139 /*!
GregCr 0:e6ceb13d2d05 140 * @brief Rx Done callback prototype.
GregCr 0:e6ceb13d2d05 141 *
GregCr 0:e6ceb13d2d05 142 * @param [IN] payload Received buffer pointer
GregCr 0:e6ceb13d2d05 143 * @param [IN] size Received buffer size
GregCr 0:e6ceb13d2d05 144 * @param [IN] rssi RSSI value computed while receiving the frame [dBm]
GregCr 0:e6ceb13d2d05 145 * @param [IN] snr Raw SNR value given by the radio hardware
GregCr 0:e6ceb13d2d05 146 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 147 * LoRa: SNR value in dB
GregCr 0:e6ceb13d2d05 148 */
Helmut64 48:62af1e692f00 149 void ( *RxDone )(void *radio, uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr );
GregCr 0:e6ceb13d2d05 150 /*!
GregCr 0:e6ceb13d2d05 151 * @brief Rx Timeout callback prototype.
GregCr 0:e6ceb13d2d05 152 */
Helmut64 48:62af1e692f00 153 void ( *RxTimeout )(void *radio);
GregCr 0:e6ceb13d2d05 154 /*!
GregCr 0:e6ceb13d2d05 155 * @brief Rx Error callback prototype.
GregCr 0:e6ceb13d2d05 156 */
Helmut64 48:62af1e692f00 157 void ( *RxError )(void *radio);
mluis 13:618826a997e2 158 /*!
GregCr 6:e7f02929cd3d 159 * \brief FHSS Change Channel callback prototype.
GregCr 6:e7f02929cd3d 160 *
mluis 21:2e496deb7858 161 * \param [IN] currentChannel Index number of the current channel
GregCr 6:e7f02929cd3d 162 */
Helmut64 48:62af1e692f00 163 void ( *FhssChangeChannel )(void *radio, uint8_t currentChannel );
GregCr 7:2b555111463f 164
GregCr 7:2b555111463f 165 /*!
GregCr 7:2b555111463f 166 * @brief CAD Done callback prototype.
GregCr 12:aa5b3bf7fdf4 167 *
mluis 21:2e496deb7858 168 * @param [IN] channelDetected Channel Activity detected during the CAD
GregCr 7:2b555111463f 169 */
Helmut64 48:62af1e692f00 170 void ( *CadDone ) (void *radio, bool channelActivityDetected );
Helmut64 48:62af1e692f00 171
mluis 21:2e496deb7858 172 }RadioEvents_t;
mluis 21:2e496deb7858 173
mluis 21:2e496deb7858 174 /*!
mluis 21:2e496deb7858 175 * Interface for the radios, contains the main functions that a radio needs, and 5 callback functions
mluis 21:2e496deb7858 176 */
mluis 21:2e496deb7858 177 class Radio
mluis 21:2e496deb7858 178 {
mluis 21:2e496deb7858 179 protected:
mluis 21:2e496deb7858 180 RadioEvents_t* RadioEvents;
mluis 21:2e496deb7858 181
GregCr 0:e6ceb13d2d05 182 public:
mluis 13:618826a997e2 183 //-------------------------------------------------------------------------
mluis 13:618826a997e2 184 // Constructor
mluis 13:618826a997e2 185 //-------------------------------------------------------------------------
mluis 13:618826a997e2 186 /*!
mluis 13:618826a997e2 187 * @brief Constructor of the radio object, the parameters are the callback functions described in the header.
mluis 21:2e496deb7858 188 *
mluis 21:2e496deb7858 189 * @param [IN] events Structure containing the driver callback functions
mluis 13:618826a997e2 190 */
mluis 21:2e496deb7858 191 Radio( RadioEvents_t *events );
mluis 13:618826a997e2 192 virtual ~Radio( ) {};
GregCr 0:e6ceb13d2d05 193
mluis 13:618826a997e2 194 //-------------------------------------------------------------------------
mluis 13:618826a997e2 195 // Pure virtual functions
mluis 13:618826a997e2 196 //-------------------------------------------------------------------------
GregCr 0:e6ceb13d2d05 197
mluis 13:618826a997e2 198 /*!
mluis 21:2e496deb7858 199 * @brief Initializes the radio
mluis 21:2e496deb7858 200 *
mluis 21:2e496deb7858 201 * @param [IN] events Structure containing the driver callback functions
mluis 21:2e496deb7858 202 */
mluis 21:2e496deb7858 203 virtual void Init( RadioEvents_t *events ) = 0;
mluis 21:2e496deb7858 204
mluis 21:2e496deb7858 205 /*!
mluis 21:2e496deb7858 206 * @brief Return current radio status
GregCr 0:e6ceb13d2d05 207 *
GregCr 0:e6ceb13d2d05 208 * @param status Radio status.[RF_IDLE, RF_RX_RUNNING, RF_TX_RUNNING]
GregCr 0:e6ceb13d2d05 209 */
GregCr 19:71a47bb03fbb 210 virtual RadioState GetStatus( void ) = 0;
mluis 13:618826a997e2 211
mluis 13:618826a997e2 212 /*!
mluis 21:2e496deb7858 213 * @brief Configures the radio with the given modem
mluis 13:618826a997e2 214 *
mluis 21:2e496deb7858 215 * @param [IN] modem Modem to be used [0: FSK, 1: LoRa]
mluis 13:618826a997e2 216 */
mluis 22:7f3aab69cca9 217 virtual void SetModem( RadioModems_t modem ) = 0;
mluis 13:618826a997e2 218
mluis 13:618826a997e2 219 /*!
GregCr 0:e6ceb13d2d05 220 * @brief Sets the channel frequency
GregCr 0:e6ceb13d2d05 221 *
GregCr 0:e6ceb13d2d05 222 * @param [IN] freq Channel RF frequency
GregCr 0:e6ceb13d2d05 223 */
GregCr 0:e6ceb13d2d05 224 virtual void SetChannel( uint32_t freq ) = 0;
GregCr 0:e6ceb13d2d05 225
mluis 13:618826a997e2 226 /*!
GregCr 0:e6ceb13d2d05 227 * @brief Sets the channels configuration
GregCr 0:e6ceb13d2d05 228 *
GregCr 0:e6ceb13d2d05 229 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
GregCr 0:e6ceb13d2d05 230 * @param [IN] freq Channel RF frequency
GregCr 0:e6ceb13d2d05 231 * @param [IN] rssiThresh RSSI threshold
GregCr 0:e6ceb13d2d05 232 *
GregCr 0:e6ceb13d2d05 233 * @retval isFree [true: Channel is free, false: Channel is not free]
GregCr 0:e6ceb13d2d05 234 */
mluis 22:7f3aab69cca9 235 virtual bool IsChannelFree( RadioModems_t modem, uint32_t freq, int16_t rssiThresh ) = 0;
GregCr 0:e6ceb13d2d05 236
mluis 13:618826a997e2 237 /*!
GregCr 0:e6ceb13d2d05 238 * @brief Generates a 32 bits random value based on the RSSI readings
GregCr 0:e6ceb13d2d05 239 *
GregCr 0:e6ceb13d2d05 240 * \remark This function sets the radio in LoRa modem mode and disables
GregCr 0:e6ceb13d2d05 241 * all interrupts.
GregCr 0:e6ceb13d2d05 242 * After calling this function either Radio.SetRxConfig or
GregCr 0:e6ceb13d2d05 243 * Radio.SetTxConfig functions must be called.
GregCr 0:e6ceb13d2d05 244 *
GregCr 0:e6ceb13d2d05 245 * @retval randomValue 32 bits random value
GregCr 0:e6ceb13d2d05 246 */
GregCr 0:e6ceb13d2d05 247 virtual uint32_t Random( void )= 0;
GregCr 0:e6ceb13d2d05 248
mluis 13:618826a997e2 249 /*!
GregCr 0:e6ceb13d2d05 250 * @brief Sets the reception parameters
GregCr 0:e6ceb13d2d05 251 *
GregCr 0:e6ceb13d2d05 252 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
GregCr 0:e6ceb13d2d05 253 * @param [IN] bandwidth Sets the bandwidth
GregCr 0:e6ceb13d2d05 254 * FSK : >= 2600 and <= 250000 Hz
GregCr 0:e6ceb13d2d05 255 * LoRa: [0: 125 kHz, 1: 250 kHz,
GregCr 0:e6ceb13d2d05 256 * 2: 500 kHz, 3: Reserved]
GregCr 0:e6ceb13d2d05 257 * @param [IN] datarate Sets the Datarate
GregCr 0:e6ceb13d2d05 258 * FSK : 600..300000 bits/s
GregCr 0:e6ceb13d2d05 259 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
GregCr 0:e6ceb13d2d05 260 * 10: 1024, 11: 2048, 12: 4096 chips]
GregCr 0:e6ceb13d2d05 261 * @param [IN] coderate Sets the coding rate ( LoRa only )
GregCr 0:e6ceb13d2d05 262 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 263 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
GregCr 0:e6ceb13d2d05 264 * @param [IN] bandwidthAfc Sets the AFC Bandwidth ( FSK only )
GregCr 0:e6ceb13d2d05 265 * FSK : >= 2600 and <= 250000 Hz
GregCr 0:e6ceb13d2d05 266 * LoRa: N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 267 * @param [IN] preambleLen Sets the Preamble length ( LoRa only )
GregCr 0:e6ceb13d2d05 268 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 269 * LoRa: Length in symbols ( the hardware adds 4 more symbols )
Helmut Tschemernjak 31:e50929bd3f32 270 * @param [IN] symbTimeout Sets the RxSingle timeout value
Helmut Tschemernjak 31:e50929bd3f32 271 * FSK : timeout number of bytes
GregCr 0:e6ceb13d2d05 272 * LoRa: timeout in symbols
GregCr 0:e6ceb13d2d05 273 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
mluis 13:618826a997e2 274 * @param [IN] payloadLen Sets payload length when fixed lenght is used
GregCr 0:e6ceb13d2d05 275 * @param [IN] crcOn Enables/Disables the CRC [0: OFF, 1: ON]
mluis 13:618826a997e2 276 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
mluis 13:618826a997e2 277 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
GregCr 0:e6ceb13d2d05 278 * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
GregCr 0:e6ceb13d2d05 279 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 280 * LoRa: [0: not inverted, 1: inverted]
GregCr 0:e6ceb13d2d05 281 * @param [IN] rxContinuous Sets the reception in continuous mode
GregCr 0:e6ceb13d2d05 282 * [false: single mode, true: continuous mode]
GregCr 0:e6ceb13d2d05 283 */
mluis 22:7f3aab69cca9 284 virtual void SetRxConfig ( RadioModems_t modem, uint32_t bandwidth,
GregCr 0:e6ceb13d2d05 285 uint32_t datarate, uint8_t coderate,
GregCr 0:e6ceb13d2d05 286 uint32_t bandwidthAfc, uint16_t preambleLen,
GregCr 0:e6ceb13d2d05 287 uint16_t symbTimeout, bool fixLen,
mluis 13:618826a997e2 288 uint8_t payloadLen,
mluis 13:618826a997e2 289 bool crcOn, bool freqHopOn, uint8_t hopPeriod,
GregCr 6:e7f02929cd3d 290 bool iqInverted, bool rxContinuous ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 291
mluis 13:618826a997e2 292 /*!
GregCr 0:e6ceb13d2d05 293 * @brief Sets the transmission parameters
GregCr 0:e6ceb13d2d05 294 *
GregCr 0:e6ceb13d2d05 295 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
GregCr 0:e6ceb13d2d05 296 * @param [IN] power Sets the output power [dBm]
GregCr 0:e6ceb13d2d05 297 * @param [IN] fdev Sets the frequency deviation ( FSK only )
GregCr 0:e6ceb13d2d05 298 * FSK : [Hz]
GregCr 0:e6ceb13d2d05 299 * LoRa: 0
GregCr 0:e6ceb13d2d05 300 * @param [IN] bandwidth Sets the bandwidth ( LoRa only )
GregCr 0:e6ceb13d2d05 301 * FSK : 0
GregCr 0:e6ceb13d2d05 302 * LoRa: [0: 125 kHz, 1: 250 kHz,
GregCr 0:e6ceb13d2d05 303 * 2: 500 kHz, 3: Reserved]
GregCr 0:e6ceb13d2d05 304 * @param [IN] datarate Sets the Datarate
GregCr 0:e6ceb13d2d05 305 * FSK : 600..300000 bits/s
GregCr 0:e6ceb13d2d05 306 * LoRa: [6: 64, 7: 128, 8: 256, 9: 512,
GregCr 0:e6ceb13d2d05 307 * 10: 1024, 11: 2048, 12: 4096 chips]
GregCr 0:e6ceb13d2d05 308 * @param [IN] coderate Sets the coding rate ( LoRa only )
GregCr 0:e6ceb13d2d05 309 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 310 * LoRa: [1: 4/5, 2: 4/6, 3: 4/7, 4: 4/8]
GregCr 0:e6ceb13d2d05 311 * @param [IN] preambleLen Sets the preamble length
GregCr 0:e6ceb13d2d05 312 * @param [IN] fixLen Fixed length packets [0: variable, 1: fixed]
GregCr 0:e6ceb13d2d05 313 * @param [IN] crcOn Enables disables the CRC [0: OFF, 1: ON]
mluis 13:618826a997e2 314 * @param [IN] freqHopOn Enables disables the intra-packet frequency hopping [0: OFF, 1: ON] (LoRa only)
mluis 13:618826a997e2 315 * @param [IN] hopPeriod Number of symbols bewteen each hop (LoRa only)
GregCr 0:e6ceb13d2d05 316 * @param [IN] iqInverted Inverts IQ signals ( LoRa only )
GregCr 0:e6ceb13d2d05 317 * FSK : N/A ( set to 0 )
GregCr 0:e6ceb13d2d05 318 * LoRa: [0: not inverted, 1: inverted]
GregCr 0:e6ceb13d2d05 319 * @param [IN] timeout Transmission timeout [us]
GregCr 0:e6ceb13d2d05 320 */
mluis 22:7f3aab69cca9 321 virtual void SetTxConfig( RadioModems_t modem, int8_t power, uint32_t fdev,
GregCr 6:e7f02929cd3d 322 uint32_t bandwidth, uint32_t datarate,
GregCr 6:e7f02929cd3d 323 uint8_t coderate, uint16_t preambleLen,
mluis 13:618826a997e2 324 bool fixLen, bool crcOn, bool freqHopOn,
mluis 13:618826a997e2 325 uint8_t hopPeriod, bool iqInverted, uint32_t timeout ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 326
mluis 13:618826a997e2 327 /*!
GregCr 0:e6ceb13d2d05 328 * @brief Checks if the given RF frequency is supported by the hardware
GregCr 0:e6ceb13d2d05 329 *
GregCr 0:e6ceb13d2d05 330 * @param [IN] frequency RF frequency to be checked
GregCr 0:e6ceb13d2d05 331 * @retval isSupported [true: supported, false: unsupported]
GregCr 0:e6ceb13d2d05 332 */
GregCr 0:e6ceb13d2d05 333 virtual bool CheckRfFrequency( uint32_t frequency ) = 0;
GregCr 0:e6ceb13d2d05 334
mluis 13:618826a997e2 335 /*!
GregCr 0:e6ceb13d2d05 336 * @brief Computes the packet time on air for the given payload
GregCr 0:e6ceb13d2d05 337 *
GregCr 0:e6ceb13d2d05 338 * \Remark Can only be called once SetRxConfig or SetTxConfig have been called
GregCr 0:e6ceb13d2d05 339 *
GregCr 0:e6ceb13d2d05 340 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
GregCr 0:e6ceb13d2d05 341 * @param [IN] pktLen Packet payload length
GregCr 0:e6ceb13d2d05 342 *
GregCr 0:e6ceb13d2d05 343 * @retval airTime Computed airTime for the given packet payload length
GregCr 0:e6ceb13d2d05 344 */
Helmut Tschemernjak 31:e50929bd3f32 345 virtual uint32_t TimeOnAir ( RadioModems_t modem, uint8_t pktLen ) = 0;
GregCr 0:e6ceb13d2d05 346
mluis 13:618826a997e2 347 /*!
GregCr 0:e6ceb13d2d05 348 * @brief Sends the buffer of size. Prepares the packet to be sent and sets
GregCr 0:e6ceb13d2d05 349 * the radio in transmission
GregCr 0:e6ceb13d2d05 350 *
GregCr 0:e6ceb13d2d05 351 * @param [IN]: buffer Buffer pointer
GregCr 0:e6ceb13d2d05 352 * @param [IN]: size Buffer size
GregCr 0:e6ceb13d2d05 353 */
GregCr 0:e6ceb13d2d05 354 virtual void Send( uint8_t *buffer, uint8_t size ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 355
mluis 13:618826a997e2 356 /*!
GregCr 0:e6ceb13d2d05 357 * @brief Sets the radio in sleep mode
GregCr 0:e6ceb13d2d05 358 */
GregCr 0:e6ceb13d2d05 359 virtual void Sleep( void ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 360
mluis 13:618826a997e2 361 /*!
GregCr 0:e6ceb13d2d05 362 * @brief Sets the radio in standby mode
GregCr 0:e6ceb13d2d05 363 */
GregCr 7:2b555111463f 364 virtual void Standby( void ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 365
mluis 13:618826a997e2 366 /*!
GregCr 7:2b555111463f 367 * @brief Sets the radio in CAD mode
GregCr 7:2b555111463f 368 */
GregCr 7:2b555111463f 369 virtual void StartCad( void ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 370
mluis 13:618826a997e2 371 /*!
GregCr 0:e6ceb13d2d05 372 * @brief Sets the radio in reception mode for the given time
GregCr 0:e6ceb13d2d05 373 * @param [IN] timeout Reception timeout [us]
GregCr 0:e6ceb13d2d05 374 * [0: continuous, others timeout]
GregCr 0:e6ceb13d2d05 375 */
GregCr 0:e6ceb13d2d05 376 virtual void Rx( uint32_t timeout ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 377
mluis 13:618826a997e2 378 /*!
GregCr 0:e6ceb13d2d05 379 * @brief Sets the radio in transmission mode for the given time
GregCr 0:e6ceb13d2d05 380 * @param [IN] timeout Transmission timeout [us]
GregCr 0:e6ceb13d2d05 381 * [0: continuous, others timeout]
GregCr 0:e6ceb13d2d05 382 */
GregCr 0:e6ceb13d2d05 383 virtual void Tx( uint32_t timeout ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 384
Helmut Tschemernjak 31:e50929bd3f32 385 /*!
Helmut Tschemernjak 31:e50929bd3f32 386 * @brief Sets the radio in continuous wave transmission mode
Helmut Tschemernjak 31:e50929bd3f32 387 *
Helmut Tschemernjak 31:e50929bd3f32 388 * @param [IN]: freq Channel RF frequency
Helmut Tschemernjak 31:e50929bd3f32 389 * @param [IN]: power Sets the output power [dBm]
Helmut Tschemernjak 31:e50929bd3f32 390 * @param [IN]: time Transmission mode timeout [s]
Helmut Tschemernjak 31:e50929bd3f32 391 */
Helmut Tschemernjak 31:e50929bd3f32 392 virtual void SetTxContinuousWave( uint32_t freq, int8_t power, uint16_t time ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 393
mluis 13:618826a997e2 394 /*!
GregCr 0:e6ceb13d2d05 395 * @brief Reads the current RSSI value
GregCr 0:e6ceb13d2d05 396 *
GregCr 0:e6ceb13d2d05 397 * @retval rssiValue Current RSSI value in [dBm]
GregCr 0:e6ceb13d2d05 398 */
mluis 22:7f3aab69cca9 399 virtual int16_t GetRssi ( RadioModems_t modem ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 400
mluis 13:618826a997e2 401 /*!
GregCr 0:e6ceb13d2d05 402 * @brief Writes the radio register at the specified address
GregCr 0:e6ceb13d2d05 403 *
GregCr 0:e6ceb13d2d05 404 * @param [IN]: addr Register address
GregCr 0:e6ceb13d2d05 405 * @param [IN]: data New register value
GregCr 0:e6ceb13d2d05 406 */
GregCr 0:e6ceb13d2d05 407 virtual void Write ( uint8_t addr, uint8_t data ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 408
mluis 13:618826a997e2 409 /*!
GregCr 0:e6ceb13d2d05 410 * @brief Reads the radio register at the specified address
GregCr 0:e6ceb13d2d05 411 *
GregCr 0:e6ceb13d2d05 412 * @param [IN]: addr Register address
GregCr 0:e6ceb13d2d05 413 * @retval data Register value
GregCr 0:e6ceb13d2d05 414 */
GregCr 0:e6ceb13d2d05 415 virtual uint8_t Read ( uint8_t addr ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 416
mluis 13:618826a997e2 417 /*!
GregCr 0:e6ceb13d2d05 418 * @brief Writes multiple radio registers starting at address
GregCr 0:e6ceb13d2d05 419 *
GregCr 0:e6ceb13d2d05 420 * @param [IN] addr First Radio register address
GregCr 0:e6ceb13d2d05 421 * @param [IN] buffer Buffer containing the new register's values
GregCr 0:e6ceb13d2d05 422 * @param [IN] size Number of registers to be written
GregCr 0:e6ceb13d2d05 423 */
GregCr 0:e6ceb13d2d05 424 virtual void Write( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 425
mluis 13:618826a997e2 426 /*!
GregCr 0:e6ceb13d2d05 427 * @brief Reads multiple radio registers starting at address
GregCr 0:e6ceb13d2d05 428 *
GregCr 0:e6ceb13d2d05 429 * @param [IN] addr First Radio register address
GregCr 0:e6ceb13d2d05 430 * @param [OUT] buffer Buffer where to copy the registers data
GregCr 0:e6ceb13d2d05 431 * @param [IN] size Number of registers to be read
GregCr 0:e6ceb13d2d05 432 */
GregCr 0:e6ceb13d2d05 433 virtual void Read ( uint8_t addr, uint8_t *buffer, uint8_t size ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 434
mluis 13:618826a997e2 435 /*!
Helmut Tschemernjak 31:e50929bd3f32 436 * @brief Writes the buffer contents to the Radio FIFO
mluis 13:618826a997e2 437 *
mluis 13:618826a997e2 438 * @param [IN] buffer Buffer containing data to be put on the FIFO.
mluis 13:618826a997e2 439 * @param [IN] size Number of bytes to be written to the FIFO
mluis 13:618826a997e2 440 */
mluis 13:618826a997e2 441 virtual void WriteFifo( uint8_t *buffer, uint8_t size ) = 0;
GregCr 0:e6ceb13d2d05 442
mluis 13:618826a997e2 443 /*!
Helmut Tschemernjak 31:e50929bd3f32 444 * @brief Reads the contents of the Radio FIFO
mluis 13:618826a997e2 445 *
mluis 13:618826a997e2 446 * @param [OUT] buffer Buffer where to copy the FIFO read data.
mluis 13:618826a997e2 447 * @param [IN] size Number of bytes to be read from the FIFO
mluis 13:618826a997e2 448 */
mluis 13:618826a997e2 449 virtual void ReadFifo( uint8_t *buffer, uint8_t size ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 450
mluis 20:e05596ba4166 451 /*!
mluis 20:e05596ba4166 452 * @brief Sets the maximum payload length.
mluis 20:e05596ba4166 453 *
mluis 20:e05596ba4166 454 * @param [IN] modem Radio modem to be used [0: FSK, 1: LoRa]
mluis 20:e05596ba4166 455 * @param [IN] max Maximum payload length in bytes
mluis 20:e05596ba4166 456 */
mluis 22:7f3aab69cca9 457 virtual void SetMaxPayloadLength( RadioModems_t modem, uint8_t max ) = 0;
Helmut Tschemernjak 31:e50929bd3f32 458
Helmut Tschemernjak 31:e50929bd3f32 459 /*!
Helmut Tschemernjak 31:e50929bd3f32 460 * @brief Sets the network to public or private. Updates the sync byte.
Helmut Tschemernjak 31:e50929bd3f32 461 *
Helmut Tschemernjak 31:e50929bd3f32 462 * @remark Applies to LoRa modem only
Helmut Tschemernjak 31:e50929bd3f32 463 *
Helmut Tschemernjak 31:e50929bd3f32 464 * @param [IN] enable if true, it enables a public network
Helmut Tschemernjak 31:e50929bd3f32 465 */
Helmut Tschemernjak 31:e50929bd3f32 466 virtual void SetPublicNetwork( bool enable ) = 0;
GregCr 0:e6ceb13d2d05 467 };
GregCr 0:e6ceb13d2d05 468
GregCr 0:e6ceb13d2d05 469 #endif // __RADIO_H__