RadioLib
Universal wireless communication library for Arduino
Module.h
1 #if !defined(_RADIOLIB_MODULE_H)
2 #define _RADIOLIB_MODULE_H
3 
4 #include "TypeDef.h"
5 #include "Hal.h"
6 #include "utils/Utils.h"
7 
8 #if defined(RADIOLIB_BUILD_ARDUINO)
9  #include <SPI.h>
10 #endif
11 
12 #if defined(STM32WLxx)
13  #include <SubGhz.h>
14 #endif
15 
20 #define END_OF_MODE_TABLE { Module::MODE_END_OF_TABLE, {} }
21 
28 #define RADIOLIB_MODULE_SPI_COMMAND_READ (0)
29 
31 #define RADIOLIB_MODULE_SPI_COMMAND_WRITE (1)
32 
34 #define RADIOLIB_MODULE_SPI_COMMAND_NOP (2)
35 
37 #define RADIOLIB_MODULE_SPI_COMMAND_STATUS (3)
38 
49 #define RADIOLIB_MODULE_SPI_WIDTH_ADDR (0)
50 
52 #define RADIOLIB_MODULE_SPI_WIDTH_CMD (1)
53 
55 #define RADIOLIB_MODULE_SPI_WIDTH_STATUS (2)
56 
66 class Module {
67  public:
75  static const size_t RFSWITCH_MAX_PINS = 5;
76 
82  struct RfSwitchMode_t {
84  uint8_t mode;
85 
88  };
89 
98  enum OpMode_t {
104 
107 
110 
113  };
114 
115  #if defined(RADIOLIB_BUILD_ARDUINO)
123  Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC);
124 
134  Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio, SPIClass& spi, SPISettings spiSettings = RADIOLIB_DEFAULT_SPI_SETTINGS);
135  #endif
136 
145  Module(RadioLibHal *hal, uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC);
146 
151  Module(const Module& mod);
152 
157  Module& operator=(const Module& mod);
158 
159  // public member variables
161  RadioLibHal* hal = NULL;
162 
164  typedef int16_t (*SPIparseStatusCb_t)(uint8_t in);
165 
167  typedef int16_t (*SPIcheckStatusCb_t)(Module* mod);
168 
169  enum BitWidth_t {
170  BITS_0 = 0,
171  BITS_8 = 8,
172  BITS_16 = 16,
173  BITS_32 = 32,
174  };
175 
180  struct SPIConfig_t {
182  bool stream;
183 
185  int16_t err;
186 
188  uint16_t cmds[4];
189 
191  BitWidth_t widths[3];
192 
194  uint8_t statusPos;
195 
198 
201 
204  };
205 
208  .stream = false,
209  .err = RADIOLIB_ERR_UNKNOWN,
210  .cmds = { 0x00, 0x80, 0x00, 0x00 },
211  .widths = { Module::BITS_8, Module::BITS_0, Module::BITS_8 },
212  .statusPos = 0,
213  .parseStatusCb = nullptr,
214  .checkStatusCb = nullptr,
215  .timeout = 1000,
216  };
217 
218  #if RADIOLIB_INTERRUPT_TIMING
219 
223  typedef void (*TimerSetupCb_t)(uint32_t len);
224 
228  TimerSetupCb_t TimerSetupCb = nullptr;
229 
233  volatile bool TimerFlag = false;
234 
235  #endif
236 
237  // basic methods
238 
242  void init();
243 
247  void term();
248 
249  // SPI methods
250 
258  int16_t SPIgetRegValue(uint32_t reg, uint8_t msb = 7, uint8_t lsb = 0);
259 
270  int16_t SPIsetRegValue(uint32_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2, uint8_t checkMask = 0xFF);
271 
278  void SPIreadRegisterBurst(uint32_t reg, size_t numBytes, uint8_t* inBytes);
279 
285  uint8_t SPIreadRegister(uint32_t reg);
286 
293  void SPIwriteRegisterBurst(uint32_t reg, uint8_t* data, size_t numBytes);
294 
300  void SPIwriteRegister(uint32_t reg, uint8_t data);
301 
310  void SPItransfer(uint16_t cmd, uint32_t reg, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes);
311 
316  int16_t SPIcheckStream();
317 
327  int16_t SPIreadStream(uint16_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
328 
339  int16_t SPIreadStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
340 
350  int16_t SPIwriteStream(uint16_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
351 
362  int16_t SPIwriteStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
363 
375  int16_t SPItransferStream(const uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes, bool waitForGpio);
376 
377  // pin number access methods
378 
383  uint32_t getCs() const { return(csPin); }
384 
389  uint32_t getIrq() const { return(irqPin); }
390 
395  uint32_t getRst() const { return(rstPin); }
396 
401  uint32_t getGpio() const { return(gpioPin); }
402 
419  void setRfSwitchPins(uint32_t rxEn, uint32_t txEn);
420 
483  void setRfSwitchTable(const uint32_t (&pins)[RFSWITCH_MAX_PINS], const RfSwitchMode_t table[]);
484 
492  const RfSwitchMode_t *findRfSwitchMode(uint8_t mode) const;
493 
498  void setRfSwitchState(uint8_t mode);
499 
508 
509  #if RADIOLIB_DEBUG
516  void regdump(const char* level, uint16_t start, size_t len);
517  #endif
518 
519 #if !RADIOLIB_GODMODE
520  private:
521 #endif
522  uint32_t csPin = RADIOLIB_NC;
523  uint32_t irqPin = RADIOLIB_NC;
524  uint32_t rstPin = RADIOLIB_NC;
525  uint32_t gpioPin = RADIOLIB_NC;
526 
527  // RF switch pins and table
528  uint32_t rfSwitchPins[RFSWITCH_MAX_PINS] = { RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC };
529  const RfSwitchMode_t *rfSwitchTable = nullptr;
530 
531  #if RADIOLIB_INTERRUPT_TIMING
532  uint32_t prevTimingLen = 0;
533  #endif
534 };
535 
536 #endif
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:66
static const size_t RFSWITCH_MAX_PINS
The maximum number of pins supported by the RF switch code. Note: It is not recommended to use this c...
Definition: Module.h:75
int16_t(* SPIcheckStatusCb_t)(Module *mod)
Callback for validation SPI status.
Definition: Module.h:167
void SPIwriteRegisterBurst(uint32_t reg, uint8_t *data, size_t numBytes)
SPI burst write method.
Definition: Module.cpp:137
int16_t SPIgetRegValue(uint32_t reg, uint8_t msb=7, uint8_t lsb=0)
SPI read method that automatically masks unused bits. This method is the preferred SPI read mechanism...
Definition: Module.cpp:49
SPIConfig_t spiConfig
SPI configuration structure. The default configuration corresponds to register-access modules,...
Definition: Module.h:207
int16_t SPItransferStream(const uint8_t *cmd, uint8_t cmdLen, bool write, uint8_t *dataOut, uint8_t *dataIn, size_t numBytes, bool waitForGpio)
SPI single transfer method for modules with stream-type SPI interface (SX126x, SX128x etc....
Definition: Module.cpp:310
RadioLibHal * hal
Hardware abstraction layer to be used.
Definition: Module.h:161
void term()
Terminate low-level module control.
Definition: Module.cpp:44
Module & operator=(const Module &mod)
Overload for assignment operator.
Definition: Module.cpp:27
uint32_t getGpio() const
Access method to get the pin number of second interrupt/GPIO.
Definition: Module.h:401
const RfSwitchMode_t * findRfSwitchMode(uint8_t mode) const
Find a mode in the RfSwitchTable.
Definition: Module.cpp:496
OpMode_t
Constants to use in a mode table set be setRfSwitchTable. These constants work for most radios,...
Definition: Module.h:98
@ MODE_TX
Transmission mode.
Definition: Module.h:112
@ MODE_IDLE
Idle mode.
Definition: Module.h:106
@ MODE_RX
Receive mode.
Definition: Module.h:109
@ MODE_END_OF_TABLE
End of table marker, use END_OF_MODE_TABLE constant instead. Value is zero to ensure zero-initialized...
Definition: Module.h:103
int16_t SPIcheckStream()
Method to check the result of last SPI stream transfer.
Definition: Module.cpp:287
void SPIwriteRegister(uint32_t reg, uint8_t data)
SPI basic write method. Use of this method is reserved for special cases, SPIsetRegValue should be us...
Definition: Module.cpp:153
void setRfSwitchPins(uint32_t rxEn, uint32_t txEn)
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition: Module.cpp:473
void waitForMicroseconds(RadioLibTime_t start, RadioLibTime_t len)
Wait for time to elapse, either using the microsecond timer, or the TimerFlag. Note that in interrupt...
Definition: Module.cpp:440
Module(RadioLibHal *hal, uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio=RADIOLIB_NC)
Module constructor.
Definition: Module.cpp:19
int16_t(* SPIparseStatusCb_t)(uint8_t in)
Callback for parsing SPI status.
Definition: Module.h:164
uint32_t getCs() const
Access method to get the pin number of SPI chip select.
Definition: Module.h:383
void SPItransfer(uint16_t cmd, uint32_t reg, uint8_t *dataOut, uint8_t *dataIn, size_t numBytes)
SPI single transfer method.
Definition: Module.cpp:169
uint8_t SPIreadRegister(uint32_t reg)
SPI basic read method. Use of this method is reserved for special cases, SPIgetRegValue should be use...
Definition: Module.cpp:119
uint32_t getIrq() const
Access method to get the pin number of interrupt/GPIO.
Definition: Module.h:389
void setRfSwitchTable(const uint32_t(&pins)[RFSWITCH_MAX_PINS], const RfSwitchMode_t table[])
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition: Module.cpp:489
void SPIreadRegisterBurst(uint32_t reg, size_t numBytes, uint8_t *inBytes)
SPI burst read method.
Definition: Module.cpp:103
void init()
Initialize low-level module control.
Definition: Module.cpp:37
uint32_t getRst() const
Access method to get the pin number of hardware reset pin.
Definition: Module.h:395
int16_t SPIreadStream(uint16_t cmd, uint8_t *data, size_t numBytes, bool waitForGpio=true, bool verify=true)
Method to perform a read transaction with SPI stream.
Definition: Module.cpp:231
int16_t SPIsetRegValue(uint32_t reg, uint8_t value, uint8_t msb=7, uint8_t lsb=0, uint8_t checkInterval=2, uint8_t checkMask=0xFF)
Overwrite-safe SPI write method with verification. This method is the preferred SPI write mechanism.
Definition: Module.cpp:59
int16_t SPIwriteStream(uint16_t cmd, uint8_t *data, size_t numBytes, bool waitForGpio=true, bool verify=true)
Method to perform a write transaction with SPI stream.
Definition: Module.cpp:259
void setRfSwitchState(uint8_t mode)
Set RF switch state.
Definition: Module.cpp:506
Hardware abstraction library base interface.
Definition: Hal.h:13
#define RADIOLIB_ERR_UNKNOWN
There was an unexpected, unknown error. If you see this, something went incredibly wrong....
Definition: TypeDef.h:110
unsigned long RadioLibTime_t
Type used for durations in RadioLib.
Definition: TypeDef.h:642
Description of RF switch pin states for a single mode. See setRfSwitchTable for details.
Definition: Module.h:82
uint8_t mode
RF switching mode, one of OpMode_t or a custom radio-defined value.
Definition: Module.h:84
uint32_t values[RFSWITCH_MAX_PINS]
Output pin values.
Definition: Module.h:87
SPI configuration structure.
Definition: Module.h:180
bool stream
Whether the SPI module is stream-type (SX126x/8x) or registrer access type (SX127x,...
Definition: Module.h:182
RadioLibTime_t timeout
Timeout in ms when waiting for GPIO signals.
Definition: Module.h:203
uint16_t cmds[4]
SPI commands.
Definition: Module.h:188
uint8_t statusPos
Byte position of status command in SPI stream.
Definition: Module.h:194
BitWidth_t widths[3]
Bit widths of SPI addresses, commands and status bytes.
Definition: Module.h:191
SPIparseStatusCb_t parseStatusCb
Callback for parsing SPI status.
Definition: Module.h:197
SPIcheckStatusCb_t checkStatusCb
Callback for validation SPI status.
Definition: Module.h:200
int16_t err
Last recorded SPI error - only updated for modules that return status during SPI transfers.
Definition: Module.h:185