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 
21 #define END_OF_MODE_TABLE { Module::MODE_END_OF_TABLE, {} }
22 
29 class Module {
30  public:
40  static const size_t RFSWITCH_MAX_PINS = 3;
41 
47  struct RfSwitchMode_t {
48  uint8_t mode;
49  uint32_t values[RFSWITCH_MAX_PINS];
50  };
51 
59  enum OpMode_t {
70  };
71 
72  #if defined(RADIOLIB_BUILD_ARDUINO)
84  Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC);
85 
101  Module(uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio, SPIClass& spi, SPISettings spiSettings = RADIOLIB_DEFAULT_SPI_SETTINGS);
102  #endif
103 
117  Module(RadioLibHal *hal, uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio = RADIOLIB_NC);
118 
124  Module(const Module& mod);
125 
131  Module& operator=(const Module& mod);
132 
133  // public member variables
134 
135  RadioLibHal* hal = NULL;
136 
140  uint8_t SPIreadCommand = 0b00000000;
141 
145  uint8_t SPIwriteCommand = 0b10000000;
146 
150  uint8_t SPInopCommand = 0x00;
151 
155  uint8_t SPIstatusCommand = 0x00;
156 
160  uint8_t SPIaddrWidth = 8;
161 
166  bool SPIstreamType = false;
167 
172 
176  typedef int16_t (*SPIparseStatusCb_t)(uint8_t in);
177 
183 
184  #if defined(RADIOLIB_INTERRUPT_TIMING)
185 
189  typedef void (*TimerSetupCb_t)(uint32_t len);
190 
194  TimerSetupCb_t TimerSetupCb = nullptr;
195 
199  volatile bool TimerFlag = false;
200 
201  #endif
202 
203  // basic methods
204 
208  void init();
209 
213  void term();
214 
215  // SPI methods
216 
228  int16_t SPIgetRegValue(uint16_t reg, uint8_t msb = 7, uint8_t lsb = 0);
229 
247  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);
248 
258  void SPIreadRegisterBurst(uint16_t reg, size_t numBytes, uint8_t* inBytes);
259 
267  uint8_t SPIreadRegister(uint16_t reg);
268 
278  void SPIwriteRegisterBurst(uint16_t reg, uint8_t* data, size_t numBytes);
279 
287  void SPIwriteRegister(uint16_t reg, uint8_t data);
288 
302  void SPItransfer(uint8_t cmd, uint16_t reg, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes);
303 
309  int16_t SPIcheckStream();
310 
326  int16_t SPIreadStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
327 
345  int16_t SPIreadStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
346 
362  int16_t SPIwriteStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
363 
381  int16_t SPIwriteStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
382 
404  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);
405 
406  // pin number access methods
407 
413  uint32_t getCs() const { return(_cs); }
414 
420  uint32_t getIrq() const { return(_irq); }
421 
427  uint32_t getRst() const { return(_rst); }
428 
434  uint32_t getGpio() const { return(_gpio); }
435 
452  void setRfSwitchPins(uint32_t rxEn, uint32_t txEn);
453 
516  void setRfSwitchTable(const uint32_t (&pins)[RFSWITCH_MAX_PINS], const RfSwitchMode_t table[]);
517 
527  const RfSwitchMode_t *findRfSwitchMode(uint8_t mode) const;
528 
533  void setRfSwitchState(uint8_t mode);
534 
543  void waitForMicroseconds(uint32_t start, uint32_t len);
544 
548  static uint8_t flipBits(uint8_t b);
549 
553  static uint16_t flipBits16(uint16_t i);
554 
566  static void hexdump(uint8_t* data, size_t len, uint32_t offset = 0, uint8_t width = 1, bool be = false);
567 
575  void regdump(uint16_t start, size_t len);
576 
577  #if defined(RADIOLIB_DEBUG) and defined(RADIOLIB_BUILD_ARDUINO)
578  static size_t serialPrintf(const char* format, ...);
579  #endif
580 
581 #if !defined(RADIOLIB_GODMODE)
582  private:
583 #endif
584  uint32_t _cs = RADIOLIB_NC;
585  uint32_t _irq = RADIOLIB_NC;
586  uint32_t _rst = RADIOLIB_NC;
587  uint32_t _gpio = RADIOLIB_NC;
588 
589  // RF switch pins and table
590  uint32_t _rfSwitchPins[RFSWITCH_MAX_PINS] = { RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC };
591  const RfSwitchMode_t *_rfSwitchTable = nullptr;
592 
593  #if defined(RADIOLIB_INTERRUPT_TIMING)
594  uint32_t _prevTimingLen = 0;
595  #endif
596 };
597 
598 #endif
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:29
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:49
uint8_t SPIstatusCommand
Basic SPI status read command. Defaults to 0x00.
Definition: Module.h:155
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:59
static const size_t RFSWITCH_MAX_PINS
The maximum number of pins supported by the RF switch code.
Definition: Module.h:40
static uint16_t flipBits16(uint16_t i)
Function to reflect bits within an integer.
Definition: Module.cpp:377
bool SPIstreamType
Whether the SPI interface is stream-type (e.g. SX126x) or register-type (e.g. SX127x)....
Definition: Module.h:166
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:127
void term()
Terminate low-level module control.
Definition: Module.cpp:44
uint8_t SPInopCommand
Basic SPI no-operation command. Defaults to 0x00.
Definition: Module.h:150
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:352
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:434
const RfSwitchMode_t * findRfSwitchMode(uint8_t mode) const
Find a mode in the RfSwitchTable.
Definition: Module.cpp:491
OpMode_t
Definition: Module.h:59
@ MODE_TX
Definition: Module.h:69
@ MODE_IDLE
Definition: Module.h:65
@ MODE_RX
Definition: Module.h:67
@ MODE_END_OF_TABLE
Definition: Module.h:63
int16_t SPIcheckStream()
Method to check the result of last SPI stream transfer.
Definition: Module.cpp:219
int16_t SPIstreamError
The last recorded SPI stream error.
Definition: Module.h:171
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:202
void SPItransfer(uint8_t cmd, uint16_t reg, uint8_t *dataOut, uint8_t *dataIn, size_t numBytes)
SPI single transfer method.
Definition: Module.cpp:136
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:469
static uint8_t flipBits(uint8_t b)
Function to reflect bits within a byte.
Definition: Module.cpp:370
Module(RadioLibHal *hal, uint32_t cs, uint32_t irq, uint32_t rst, uint32_t gpio=RADIOLIB_NC)
Module constructor.
Definition: Module.cpp:19
uint8_t SPIreadCommand
Basic SPI read command. Defaults to 0x00.
Definition: Module.h:140
void SPIreadRegisterBurst(uint16_t reg, size_t numBytes, uint8_t *inBytes)
SPI burst read method.
Definition: Module.cpp:98
int16_t(* SPIparseStatusCb_t)(uint8_t in)
SPI status parsing callback typedef.
Definition: Module.h:176
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:107
uint32_t getCs() const
Access method to get the pin number of SPI chip select.
Definition: Module.h:413
uint32_t getIrq() const
Access method to get the pin number of interrupt/GPIO.
Definition: Module.h:420
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:185
void regdump(uint16_t start, size_t len)
Function to dump device registers as hex into the debug port.
Definition: Module.cpp:430
uint8_t SPIaddrWidth
SPI address width. Defaults to 8, currently only supports 8 and 16-bit addresses.
Definition: Module.h:160
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:484
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:238
static void hexdump(uint8_t *data, size_t len, uint32_t offset=0, uint8_t width=1, bool be=false)
Function to dump data as hex into the debug port.
Definition: Module.cpp:385
void init()
Initialize low-level module control.
Definition: Module.cpp:38
uint32_t getRst() const
Access method to get the pin number of hardware reset pin.
Definition: Module.h:427
uint8_t SPIwriteCommand
Basic SPI write command. Defaults to 0x80.
Definition: Module.h:145
void SPIwriteRegisterBurst(uint16_t reg, uint8_t *data, size_t numBytes)
SPI burst write method.
Definition: Module.cpp:118
SPIparseStatusCb_t SPIparseStatusCb
Callback to function that will parse the module-specific status codes to RadioLib status codes....
Definition: Module.h:182
void setRfSwitchState(uint8_t mode)
Set RF switch state.
Definition: Module.cpp:501
Definition: Hal.h:12
#define RADIOLIB_ERR_UNKNOWN
There was an unexpected, unknown error. If you see this, something went incredibly wrong....
Definition: TypeDef.h:110
Definition: Module.h:47