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 
7 #if defined(RADIOLIB_BUILD_ARDUINO)
8  #include <SPI.h>
9 #endif
10 
11 #if defined(STM32WLxx)
12  #include <SubGhz.h>
13 #endif
14 
20 #define END_OF_MODE_TABLE { Module::MODE_END_OF_TABLE, {} }
21 
22 // default timeout for SPI transfers
23 #define RADIOLIB_MODULE_SPI_TIMEOUT (1000)
24 
30 class Module {
31  public:
39  static const size_t RFSWITCH_MAX_PINS = 3;
40 
46  struct RfSwitchMode_t {
48  uint8_t mode;
49 
52  };
53 
62  enum OpMode_t {
68 
71 
74 
77  };
78 
79  #if defined(RADIOLIB_BUILD_ARDUINO)
87  Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC);
88 
98  Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio, SPIClass& spi, SPISettings spiSettings = RADIOLIB_DEFAULT_SPI_SETTINGS);
99  #endif
100 
109  Module(RadioLibHal *hal, uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC);
110 
115  Module(const Module& mod);
116 
121  Module& operator=(const Module& mod);
122 
123  // public member variables
127  RadioLibHal* hal = NULL;
128 
132  uint8_t SPIreadCommand = 0b00000000;
133 
137  uint8_t SPIwriteCommand = 0b10000000;
138 
142  uint8_t SPInopCommand = 0x00;
143 
147  uint8_t SPIstatusCommand = 0x00;
148 
152  uint8_t SPIaddrWidth = 8;
153 
158  bool SPIstreamType = false;
159 
164 
168  typedef int16_t (*SPIparseStatusCb_t)(uint8_t in);
169 
175 
176  #if RADIOLIB_INTERRUPT_TIMING
177 
181  typedef void (*TimerSetupCb_t)(uint32_t len);
182 
186  TimerSetupCb_t TimerSetupCb = nullptr;
187 
191  volatile bool TimerFlag = false;
192 
193  #endif
194 
195  // basic methods
196 
200  void init();
201 
205  void term();
206 
207  // SPI methods
208 
216  int16_t SPIgetRegValue(uint16_t reg, uint8_t msb = 7, uint8_t lsb = 0);
217 
228  int16_t SPIsetRegValue(uint16_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2, uint8_t checkMask = 0xFF);
229 
236  void SPIreadRegisterBurst(uint16_t reg, size_t numBytes, uint8_t* inBytes);
237 
243  uint8_t SPIreadRegister(uint16_t reg);
244 
251  void SPIwriteRegisterBurst(uint16_t reg, uint8_t* data, size_t numBytes);
252 
258  void SPIwriteRegister(uint16_t reg, uint8_t data);
259 
268  void SPItransfer(uint8_t cmd, uint16_t reg, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes);
269 
274  int16_t SPIcheckStream();
275 
285  int16_t SPIreadStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
286 
297  int16_t SPIreadStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
298 
308  int16_t SPIwriteStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
309 
320  int16_t SPIwriteStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
321 
334  int16_t SPItransferStream(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes, bool waitForGpio, uint32_t timeout);
335 
336  // pin number access methods
337 
342  uint32_t getCs() const { return(csPin); }
343 
348  uint32_t getIrq() const { return(irqPin); }
349 
354  uint32_t getRst() const { return(rstPin); }
355 
360  uint32_t getGpio() const { return(gpioPin); }
361 
378  void setRfSwitchPins(uint32_t rxEn, uint32_t txEn);
379 
442  void setRfSwitchTable(const uint32_t (&pins)[RFSWITCH_MAX_PINS], const RfSwitchMode_t table[]);
443 
451  const RfSwitchMode_t *findRfSwitchMode(uint8_t mode) const;
452 
457  void setRfSwitchState(uint8_t mode);
458 
466  void waitForMicroseconds(uint32_t start, uint32_t len);
467 
474  static uint32_t reflect(uint32_t in, uint8_t bits);
475 
476  #if RADIOLIB_DEBUG
485  static void hexdump(const char* level, uint8_t* data, size_t len, uint32_t offset = 0, uint8_t width = 1, bool be = false);
486 
493  void regdump(const char* level, uint16_t start, size_t len);
494  #endif
495 
496  #if RADIOLIB_DEBUG and defined(RADIOLIB_BUILD_ARDUINO)
497  static size_t serialPrintf(const char* format, ...);
498  #endif
499 
500 #if !RADIOLIB_GODMODE
501  private:
502 #endif
503  uint32_t csPin = RADIOLIB_NC;
504  uint32_t irqPin = RADIOLIB_NC;
505  uint32_t rstPin = RADIOLIB_NC;
506  uint32_t gpioPin = RADIOLIB_NC;
507 
508  // RF switch pins and table
509  uint32_t rfSwitchPins[RFSWITCH_MAX_PINS] = { RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC };
510  const RfSwitchMode_t *rfSwitchTable = nullptr;
511 
512  #if RADIOLIB_INTERRUPT_TIMING
513  uint32_t prevTimingLen = 0;
514  #endif
515 };
516 
517 #endif
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:30
int16_t SPIgetRegValue(uint16_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:58
uint8_t SPIstatusCommand
Basic SPI status read command. Defaults to 0x00.
Definition: Module.h:147
int16_t SPIsetRegValue(uint16_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:68
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:39
bool SPIstreamType
Whether the SPI interface is stream-type (e.g. SX126x) or register-type (e.g. SX127x)....
Definition: Module.h:158
void SPIwriteRegister(uint16_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:136
RadioLibHal * hal
Hardware abstraction layer to be used.
Definition: Module.h:127
void term()
Terminate low-level module control.
Definition: Module.cpp:53
uint8_t SPInopCommand
Basic SPI no-operation command. Defaults to 0x00.
Definition: Module.h:142
void waitForMicroseconds(uint32_t start, uint32_t len)
Wait for time to elapse, either using the microsecond timer, or the TimerFlag. Note that in interrupt...
Definition: Module.cpp:383
static uint32_t reflect(uint32_t in, uint8_t bits)
Function to reflect bits within a byte.
Definition: Module.cpp:401
Module & operator=(const Module &mod)
Overload for assignment operator.
Definition: Module.cpp:33
uint32_t getGpio() const
Access method to get the pin number of second interrupt/GPIO.
Definition: Module.h:360
const RfSwitchMode_t * findRfSwitchMode(uint8_t mode) const
Find a mode in the RfSwitchTable.
Definition: Module.cpp:521
OpMode_t
Constants to use in a mode table set be setRfSwitchTable. These constants work for most radios,...
Definition: Module.h:62
@ MODE_TX
Transmission mode.
Definition: Module.h:76
@ MODE_IDLE
Idle mode.
Definition: Module.h:70
@ MODE_RX
Receive mode.
Definition: Module.h:73
@ 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:67
int16_t SPIcheckStream()
Method to check the result of last SPI stream transfer.
Definition: Module.cpp:240
int16_t SPIstreamError
The last recorded SPI stream error.
Definition: Module.h:163
int16_t SPIwriteStream(uint8_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:223
void SPItransfer(uint8_t cmd, uint16_t reg, uint8_t *dataOut, uint8_t *dataIn, size_t numBytes)
SPI single transfer method.
Definition: Module.cpp:145
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:498
Module(RadioLibHal *hal, uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio=RADIOLIB_NC)
Module constructor.
Definition: Module.cpp:25
uint8_t SPIreadCommand
Basic SPI read command. Defaults to 0x00.
Definition: Module.h:132
void SPIreadRegisterBurst(uint16_t reg, size_t numBytes, uint8_t *inBytes)
SPI burst read method.
Definition: Module.cpp:107
int16_t(* SPIparseStatusCb_t)(uint8_t in)
SPI status parsing callback typedef.
Definition: Module.h:168
uint8_t SPIreadRegister(uint16_t reg)
SPI basic read method. Use of this method is reserved for special cases, SPIgetRegValue should be use...
Definition: Module.cpp:116
uint32_t getCs() const
Access method to get the pin number of SPI chip select.
Definition: Module.h:342
uint32_t getIrq() const
Access method to get the pin number of interrupt/GPIO.
Definition: Module.h:348
int16_t SPIreadStream(uint8_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:206
uint8_t SPIaddrWidth
SPI address width. Defaults to 8, currently only supports 8 and 16-bit addresses.
Definition: Module.h:152
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:514
int16_t SPItransferStream(uint8_t *cmd, uint8_t cmdLen, bool write, uint8_t *dataOut, uint8_t *dataIn, size_t numBytes, bool waitForGpio, uint32_t timeout)
SPI single transfer method for modules with stream-type SPI interface (SX126x, SX128x etc....
Definition: Module.cpp:259
void init()
Initialize low-level module control.
Definition: Module.cpp:43
uint32_t getRst() const
Access method to get the pin number of hardware reset pin.
Definition: Module.h:354
uint8_t SPIwriteCommand
Basic SPI write command. Defaults to 0x80.
Definition: Module.h:137
void SPIwriteRegisterBurst(uint16_t reg, uint8_t *data, size_t numBytes)
SPI burst write method.
Definition: Module.cpp:127
SPIparseStatusCb_t SPIparseStatusCb
Callback to function that will parse the module-specific status codes to RadioLib status codes....
Definition: Module.h:174
void setRfSwitchState(uint8_t mode)
Set RF switch state.
Definition: Module.cpp:531
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
Description of RF switch pin states for a single mode. See setRfSwitchTable for details.
Definition: Module.h:46
uint8_t mode
RF switching mode, one of OpMode_t or a custom radio-defined value.
Definition: Module.h:48
uint32_t values[RFSWITCH_MAX_PINS]
Output pin values.
Definition: Module.h:51