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 
6 #if defined(RADIOLIB_BUILD_ARDUINO)
7  #include <SPI.h>
8 #endif
9 
10 #if defined(STM32WLxx)
11  #include <SubGhz.h>
12 #endif
13 
20 #define END_OF_MODE_TABLE { Module::MODE_END_OF_TABLE, {} }
21 
28 class Module {
29  public:
39  static const size_t RFSWITCH_MAX_PINS = 3;
40 
46  struct RfSwitchMode_t {
47  uint8_t mode;
48  RADIOLIB_PIN_STATUS values[RFSWITCH_MAX_PINS];
49  };
50 
58  enum OpMode_t {
69  };
70 
71  #if defined(RADIOLIB_BUILD_ARDUINO)
72 
84  Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE gpio = RADIOLIB_NC);
85 
101  Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE gpio, SPIClass& spi, SPISettings spiSettings = RADIOLIB_DEFAULT_SPI_SETTINGS);
102 
103  #else
104 
116  Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE gpio = RADIOLIB_NC);
117 
118  #endif
119 
125  Module(const Module& mod);
126 
132  Module& operator=(const Module& mod);
133 
134  // public member variables
135 
139  uint8_t SPIreadCommand = 0b00000000;
140 
144  uint8_t SPIwriteCommand = 0b10000000;
145 
149  uint8_t SPInopCommand = 0x00;
150 
154  uint8_t SPIstatusCommand = 0x00;
155 
159  uint8_t SPIaddrWidth = 8;
160 
165  bool SPIstreamType = false;
166 
171 
175  typedef int16_t (*SPIparseStatusCb_t)(uint8_t in);
176 
182 
183  #if defined(RADIOLIB_INTERRUPT_TIMING)
184 
188  typedef void (*TimerSetupCb_t)(uint32_t len);
189 
193  TimerSetupCb_t TimerSetupCb = nullptr;
194 
198  volatile bool TimerFlag = false;
199 
200  #endif
201 
202  // basic methods
203 
207  void init();
208 
212  void term();
213 
214  // SPI methods
215 
227  int16_t SPIgetRegValue(uint16_t reg, uint8_t msb = 7, uint8_t lsb = 0);
228 
246  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);
247 
257  void SPIreadRegisterBurst(uint16_t reg, size_t numBytes, uint8_t* inBytes);
258 
266  uint8_t SPIreadRegister(uint16_t reg);
267 
277  void SPIwriteRegisterBurst(uint16_t reg, uint8_t* data, size_t numBytes);
278 
286  void SPIwriteRegister(uint16_t reg, uint8_t data);
287 
301  void SPItransfer(uint8_t cmd, uint16_t reg, uint8_t* dataOut, uint8_t* dataIn, size_t numBytes);
302 
308  int16_t SPIcheckStream();
309 
325  int16_t SPIreadStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
326 
344  int16_t SPIreadStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
345 
361  int16_t SPIwriteStream(uint8_t cmd, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
362 
380  int16_t SPIwriteStream(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, size_t numBytes, bool waitForGpio = true, bool verify = true);
381 
403  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);
404 
405  // pin number access methods
406 
412  RADIOLIB_PIN_TYPE getCs() const { return(_cs); }
413 
419  RADIOLIB_PIN_TYPE getIrq() const { return(_irq); }
420 
426  RADIOLIB_PIN_TYPE getRst() const { return(_rst); }
427 
433  RADIOLIB_PIN_TYPE getGpio() const { return(_gpio); }
434 
451  void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn);
452 
515  void setRfSwitchTable(const RADIOLIB_PIN_TYPE (&pins)[RFSWITCH_MAX_PINS], const RfSwitchMode_t table[]);
516 
526  const RfSwitchMode_t *findRfSwitchMode(uint8_t mode) const;
527 
532  void setRfSwitchState(uint8_t mode);
533 
542  void waitForMicroseconds(uint32_t start, uint32_t len);
543 
544  // Arduino core overrides
545 
553  void pinMode(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_MODE mode);
554 
562  void digitalWrite(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS value);
563 
571  RADIOLIB_PIN_STATUS digitalRead(RADIOLIB_PIN_TYPE pin);
572 
580  void tone(RADIOLIB_PIN_TYPE pin, uint16_t value, uint32_t duration = 0);
581 
587  void noTone(RADIOLIB_PIN_TYPE pin);
588 
598  void attachInterrupt(RADIOLIB_PIN_TYPE interruptNum, void (*userFunc)(void), RADIOLIB_INTERRUPT_STATUS mode);
599 
605  void detachInterrupt(RADIOLIB_PIN_TYPE interruptNum);
606 
610  void yield();
611 
617  void delay(uint32_t ms);
618 
624  void delayMicroseconds(uint32_t us);
625 
629  uint32_t millis();
630 
634  uint32_t micros();
635 
639  uint32_t pulseIn(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS state, uint32_t timeout);
640 
644  void begin();
645 
649  void beginTransaction();
650 
654  uint8_t transfer(uint8_t b);
655 
659  void endTransaction();
660 
664  void end();
665 
666  // helper functions to set up SPI overrides on Arduino
667  #if defined(RADIOLIB_BUILD_ARDUINO)
668  void SPIbegin();
669  void SPIend();
670  virtual void SPIbeginTransaction();
671  virtual uint8_t SPItransfer(uint8_t b);
672  virtual void SPIendTransaction();
673  #endif
674 
678  static uint8_t flipBits(uint8_t b);
679 
683  static uint16_t flipBits16(uint16_t i);
684 
696  static void hexdump(uint8_t* data, size_t len, uint32_t offset = 0, uint8_t width = 1, bool be = false);
697 
705  void regdump(uint16_t start, size_t len);
706 
707  #if defined(RADIOLIB_DEBUG) and defined(RADIOLIB_BUILD_ARDUINO)
708  static size_t serialPrintf(const char* format, ...);
709  #endif
710 
711 #if !defined(RADIOLIB_GODMODE)
712  private:
713 #endif
714 
715  // pins
716  RADIOLIB_PIN_TYPE _cs = RADIOLIB_NC;
717  RADIOLIB_PIN_TYPE _irq = RADIOLIB_NC;
718  RADIOLIB_PIN_TYPE _rst = RADIOLIB_NC;
719  RADIOLIB_PIN_TYPE _gpio = RADIOLIB_NC;
720 
721  // SPI interface (Arduino only)
722  #if defined(RADIOLIB_BUILD_ARDUINO)
723  SPIClass* _spi = NULL;
724  SPISettings _spiSettings = RADIOLIB_DEFAULT_SPI_SETTINGS;
725  bool _initInterface = false;
726  #endif
727 
728  // RF switch pins and table
729  RADIOLIB_PIN_TYPE _rfSwitchPins[RFSWITCH_MAX_PINS] = { RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC };
730  const RfSwitchMode_t *_rfSwitchTable = nullptr;
731 
732  #if defined(RADIOLIB_INTERRUPT_TIMING)
733  uint32_t _prevTimingLen = 0;
734  #endif
735 
736  // hardware abstraction layer callbacks
737  // this is placed at the end of Module class because the callback generator macros
738  // screw with the private/public access specifiers
739  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_PIN_MODE);
740  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DIGITAL_WRITE);
741  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DIGITAL_READ);
742  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_TONE);
743  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_NO_TONE);
744  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_ATTACH_INTERRUPT);
745  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DETACH_INTERRUPT);
746  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_YIELD);
747  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DELAY);
748  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DELAY_MICROSECONDS);
749  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_MILLIS);
750  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_MICROS);
751  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_PULSE_IN);
752 
753  #if defined(RADIOLIB_BUILD_ARDUINO)
754  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_BEGIN);
755  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_BEGIN_TRANSACTION);
756  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_TRANSFER);
757  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_END_TRANSACTION);
758  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_END);
759  #else
760  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_BEGIN);
761  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_BEGIN_TRANSACTION);
762  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_TRANSFER);
763  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_END_TRANSACTION);
764  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_END);
765  #endif
766 };
767 
768 #endif
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:28
void endTransaction()
Arduino core SPI endTransaction override.
Definition: Module.cpp:643
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:130
uint8_t SPIstatusCommand
Basic SPI status read command. Defaults to 0x00.
Definition: Module.h:154
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:140
static const size_t RFSWITCH_MAX_PINS
The maximum number of pins supported by the RF switch code.
Definition: Module.h:39
void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn)
Some modules contain external RF switch controlled by pins. This function gives RadioLib control over...
Definition: Module.cpp:786
Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE gpio=RADIOLIB_NC)
Default constructor.
Definition: Module.cpp:81
uint32_t pulseIn(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS state, uint32_t timeout)
Arduino core pulseIn override.
Definition: Module.cpp:603
void delayMicroseconds(uint32_t us)
Arduino core delayMicroseconds override.
Definition: Module.cpp:582
static uint16_t flipBits16(uint16_t i)
Function to reflect bits within an integer.
Definition: Module.cpp:694
uint32_t millis()
Arduino core millis override.
Definition: Module.cpp:589
void yield()
Arduino core yield override.
Definition: Module.cpp:566
void tone(RADIOLIB_PIN_TYPE pin, uint16_t value, uint32_t duration=0)
Arduino core tone override that checks RADIOLIB_NC as alias for unused pin and RADIOLIB_TONE_UNSUPPOR...
Definition: Module.cpp:490
bool SPIstreamType
Whether the SPI interface is stream-type (e.g. SX126x) or register-type (e.g. SX127x)....
Definition: Module.h:165
void beginTransaction()
Arduino core SPI beginTransaction override.
Definition: Module.cpp:621
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:220
void term()
Terminate low-level module control.
Definition: Module.cpp:117
uint8_t transfer(uint8_t b)
Arduino core SPI transfer override.
Definition: Module.cpp:632
uint8_t SPInopCommand
Basic SPI no-operation command. Defaults to 0x00.
Definition: Module.h:149
void digitalWrite(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS value)
Arduino core digitalWrite override that checks RADIOLIB_NC as alias for unused pin.
Definition: Module.cpp:471
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:446
Module & operator=(const Module &mod)
Overload for assignment operator.
Definition: Module.cpp:96
const RfSwitchMode_t * findRfSwitchMode(uint8_t mode) const
Find a mode in the RfSwitchTable.
Definition: Module.cpp:808
OpMode_t
Definition: Module.h:58
@ MODE_TX
Definition: Module.h:68
@ MODE_IDLE
Definition: Module.h:64
@ MODE_RX
Definition: Module.h:66
@ MODE_END_OF_TABLE
Definition: Module.h:62
int16_t SPIcheckStream()
Method to check the result of last SPI stream transfer.
Definition: Module.cpp:312
void detachInterrupt(RADIOLIB_PIN_TYPE interruptNum)
Arduino core detachInterrupt override.
Definition: Module.cpp:559
int16_t SPIstreamError
The last recorded SPI stream error.
Definition: Module.h:170
RADIOLIB_PIN_STATUS digitalRead(RADIOLIB_PIN_TYPE pin)
Arduino core digitalWrite override that checks RADIOLIB_NC as alias for unused pin.
Definition: Module.cpp:478
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:295
void SPItransfer(uint8_t cmd, uint16_t reg, uint8_t *dataOut, uint8_t *dataIn, size_t numBytes)
SPI single transfer method.
Definition: Module.cpp:229
static uint8_t flipBits(uint8_t b)
Function to reflect bits within a byte.
Definition: Module.cpp:687
uint8_t SPIreadCommand
Basic SPI read command. Defaults to 0x00.
Definition: Module.h:139
void setRfSwitchTable(const RADIOLIB_PIN_TYPE(&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:801
void SPIreadRegisterBurst(uint16_t reg, size_t numBytes, uint8_t *inBytes)
SPI burst read method.
Definition: Module.cpp:191
RADIOLIB_PIN_TYPE getIrq() const
Access method to get the pin number of interrupt/GPIO.
Definition: Module.h:419
void attachInterrupt(RADIOLIB_PIN_TYPE interruptNum, void(*userFunc)(void), RADIOLIB_INTERRUPT_STATUS mode)
Arduino core attachInterrupt override.
Definition: Module.cpp:552
int16_t(* SPIparseStatusCb_t)(uint8_t in)
SPI status parsing callback typedef.
Definition: Module.h:175
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:200
void end()
Arduino core SPI end override.
Definition: Module.cpp:654
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:278
void regdump(uint16_t start, size_t len)
Function to dump device registers as hex into the debug port.
Definition: Module.cpp:747
uint8_t SPIaddrWidth
SPI address width. Defaults to 8, currently only supports 8 and 16-bit addresses.
Definition: Module.h:159
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:332
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:702
void init()
Initialize low-level module control.
Definition: Module.cpp:107
RADIOLIB_PIN_TYPE getRst() const
Access method to get the pin number of hardware reset pin.
Definition: Module.h:426
RADIOLIB_PIN_TYPE getCs() const
Access method to get the pin number of SPI chip select.
Definition: Module.h:412
uint8_t SPIwriteCommand
Basic SPI write command. Defaults to 0x80.
Definition: Module.h:144
RADIOLIB_PIN_TYPE getGpio() const
Access method to get the pin number of second interrupt/GPIO.
Definition: Module.h:433
void delay(uint32_t ms)
Arduino core delay override.
Definition: Module.cpp:575
uint32_t micros()
Arduino core micros override.
Definition: Module.cpp:596
void SPIwriteRegisterBurst(uint16_t reg, uint8_t *data, size_t numBytes)
SPI burst write method.
Definition: Module.cpp:211
void begin()
Arduino core SPI begin override.
Definition: Module.cpp:610
SPIparseStatusCb_t SPIparseStatusCb
Callback to function that will parse the module-specific status codes to RadioLib status codes....
Definition: Module.h:181
void pinMode(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_MODE mode)
Arduino core pinMode override that checks RADIOLIB_NC as alias for unused pin.
Definition: Module.cpp:464
void noTone(RADIOLIB_PIN_TYPE pin)
Arduino core noTone override that checks RADIOLIB_NC as alias for unused pin and RADIOLIB_TONE_UNSUPP...
Definition: Module.cpp:525
void setRfSwitchState(uint8_t mode)
Set RF switch state.
Definition: Module.cpp:818
#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:46