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 
16 class Module {
17  public:
27  static const size_t RFSWITCH_MAX_PINS = 3;
28 
34  struct RfSwitchMode_t {
35  uint8_t mode;
36  RADIOLIB_PIN_STATUS values[RFSWITCH_MAX_PINS];
37  };
38 
46  enum OpMode_t {
57  };
58 
66 
67  #if defined(RADIOLIB_BUILD_ARDUINO)
68 
80  Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE gpio = RADIOLIB_NC);
81 
97  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);
98 
99  #else
100 
112  Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE gpio = RADIOLIB_NC);
113 
114  #endif
115 
121  Module(const Module& mod);
122 
128  Module& operator=(const Module& mod);
129 
130  // public member variables
131 
135  uint8_t SPIreadCommand = 0b00000000;
136 
140  uint8_t SPIwriteCommand = 0b10000000;
141 
142  #if defined(RADIOLIB_INTERRUPT_TIMING)
143 
147  typedef void (*TimerSetupCb_t)(uint32_t len);
148 
152  TimerSetupCb_t TimerSetupCb = nullptr;
153 
157  volatile bool TimerFlag = false;
158 
159  #endif
160 
161  // basic methods
162 
166  void init();
167 
171  void term();
172 
173  // SPI methods
174 
186  int16_t SPIgetRegValue(uint8_t reg, uint8_t msb = 7, uint8_t lsb = 0);
187 
205  int16_t SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2, uint8_t checkMask = 0xFF);
206 
216  void SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes);
217 
225  uint8_t SPIreadRegister(uint8_t reg);
226 
236  void SPIwriteRegisterBurst(uint8_t reg, uint8_t* data, uint8_t numBytes);
237 
245  void SPIwriteRegister(uint8_t reg, uint8_t data);
246 
260  void SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes);
261 
262  // pin number access methods
263 
269  RADIOLIB_PIN_TYPE getCs() const { return(_cs); }
270 
276  RADIOLIB_PIN_TYPE getIrq() const { return(_irq); }
277 
283  RADIOLIB_PIN_TYPE getRst() const { return(_rst); }
284 
290  RADIOLIB_PIN_TYPE getGpio() const { return(_gpio); }
291 
308  void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn);
309 
372  void setRfSwitchTable(const RADIOLIB_PIN_TYPE (&pins)[RFSWITCH_MAX_PINS], const RfSwitchMode_t table[]);
373 
383  const RfSwitchMode_t *findRfSwitchMode(uint8_t mode) const;
384 
389  void setRfSwitchState(uint8_t mode);
390 
399  void waitForMicroseconds(uint32_t start, uint32_t len);
400 
401  // Arduino core overrides
402 
410  void pinMode(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_MODE mode);
411 
419  void digitalWrite(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS value);
420 
428  RADIOLIB_PIN_STATUS digitalRead(RADIOLIB_PIN_TYPE pin);
429 
437  void tone(RADIOLIB_PIN_TYPE pin, uint16_t value, uint32_t duration = 0);
438 
444  void noTone(RADIOLIB_PIN_TYPE pin);
445 
455  void attachInterrupt(RADIOLIB_PIN_TYPE interruptNum, void (*userFunc)(void), RADIOLIB_INTERRUPT_STATUS mode);
456 
462  void detachInterrupt(RADIOLIB_PIN_TYPE interruptNum);
463 
467  void yield();
468 
474  void delay(uint32_t ms);
475 
481  void delayMicroseconds(uint32_t us);
482 
486  uint32_t millis();
487 
491  uint32_t micros();
492 
496  uint32_t pulseIn(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS state, uint32_t timeout);
497 
501  void begin();
502 
506  void beginTransaction();
507 
511  uint8_t transfer(uint8_t b);
512 
516  void endTransaction();
517 
521  void end();
522 
523  // helper functions to set up SPI overrides on Arduino
524  #if defined(RADIOLIB_BUILD_ARDUINO)
525  void SPIbegin();
526  void SPIend();
527  #endif
528  virtual void SPIbeginTransaction();
529  virtual uint8_t SPItransfer(uint8_t b);
530  virtual void SPIendTransaction();
531 
535  static uint8_t flipBits(uint8_t b);
536 
540  static uint16_t flipBits16(uint16_t i);
541 
549  static void hexdump(uint8_t* data, size_t len);
550 
558  void regdump(uint8_t start, uint8_t len);
559 
560 #if !defined(RADIOLIB_GODMODE)
561  private:
562 #endif
563 
564  // pins
565  RADIOLIB_PIN_TYPE _cs = RADIOLIB_NC;
566  RADIOLIB_PIN_TYPE _irq = RADIOLIB_NC;
567  RADIOLIB_PIN_TYPE _rst = RADIOLIB_NC;
568  RADIOLIB_PIN_TYPE _gpio = RADIOLIB_NC;
569 
570  // SPI interface (Arduino only)
571  #if defined(RADIOLIB_BUILD_ARDUINO)
572  SPIClass* _spi = NULL;
573  SPISettings _spiSettings = RADIOLIB_DEFAULT_SPI_SETTINGS;
574  bool _initInterface = false;
575  #endif
576 
577  // RF switch pins and table
578  RADIOLIB_PIN_TYPE _rfSwitchPins[RFSWITCH_MAX_PINS] = { RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC };
579  const RfSwitchMode_t *_rfSwitchTable = nullptr;
580 
581  #if defined(RADIOLIB_INTERRUPT_TIMING)
582  uint32_t _prevTimingLen = 0;
583  #endif
584 
585  // hardware abstraction layer callbacks
586  // this is placed at the end of Module class because the callback generator macros
587  // screw with the private/public access specifiers
588  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_PIN_MODE);
589  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DIGITAL_WRITE);
590  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DIGITAL_READ);
591  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_TONE);
592  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_NO_TONE);
593  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_ATTACH_INTERRUPT);
594  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DETACH_INTERRUPT);
595  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_YIELD);
596  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DELAY);
597  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DELAY_MICROSECONDS);
598  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_MILLIS);
599  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_MICROS);
600  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_PULSE_IN);
601 
602  #if defined(RADIOLIB_BUILD_ARDUINO)
603  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_BEGIN);
604  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_BEGIN_TRANSACTION);
605  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_TRANSFER);
606  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_END_TRANSACTION);
607  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_END);
608  #else
609  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_BEGIN);
610  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_BEGIN_TRANSACTION);
611  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_TRANSFER);
612  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_END_TRANSACTION);
613  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_END);
614  #endif
615 };
616 
617 #endif
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:16
void endTransaction()
Arduino core SPI endTransaction override.
Definition: Module.cpp:447
static const size_t RFSWITCH_MAX_PINS
The maximum number of pins supported by the RF switch code.
Definition: Module.h:27
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:555
Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE gpio=RADIOLIB_NC)
Default constructor.
Definition: Module.cpp:83
int16_t SPIsetRegValue(uint8_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:142
uint32_t pulseIn(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS state, uint32_t timeout)
Arduino core pulseIn override.
Definition: Module.cpp:413
void delayMicroseconds(uint32_t us)
Arduino core delayMicroseconds override.
Definition: Module.cpp:392
static uint16_t flipBits16(uint16_t i)
Function to reflect bits within an integer.
Definition: Module.cpp:502
uint8_t SPIreadRegister(uint8_t reg)
SPI basic read method. Use of this method is reserved for special cases, SPIgetRegValue should be use...
Definition: Module.cpp:195
uint32_t millis()
Arduino core millis override.
Definition: Module.cpp:399
void yield()
Arduino core yield override.
Definition: Module.cpp:376
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:300
void beginTransaction()
Arduino core SPI beginTransaction override.
Definition: Module.cpp:429
void term()
Terminate low-level module control.
Definition: Module.cpp:119
uint8_t transfer(uint8_t b)
Arduino core SPI transfer override.
Definition: Module.cpp:438
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:281
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:256
static const RfSwitchMode_t END_OF_MODE_TABLE
Definition: Module.h:65
Module & operator=(const Module &mod)
Overload for assignment operator.
Definition: Module.cpp:98
const RfSwitchMode_t * findRfSwitchMode(uint8_t mode) const
Find a mode in the RfSwitchTable.
Definition: Module.cpp:577
OpMode_t
Definition: Module.h:46
@ MODE_TX
Definition: Module.h:56
@ MODE_IDLE
Definition: Module.h:52
@ MODE_RX
Definition: Module.h:54
@ MODE_END_OF_TABLE
Definition: Module.h:50
void detachInterrupt(RADIOLIB_PIN_TYPE interruptNum)
Arduino core detachInterrupt override.
Definition: Module.cpp:369
void SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t *inBytes)
SPI burst read method.
Definition: Module.cpp:191
void regdump(uint8_t start, uint8_t len)
Function to dump device registers as hex into the debug port.
Definition: Module.cpp:542
RADIOLIB_PIN_STATUS digitalRead(RADIOLIB_PIN_TYPE pin)
Arduino core digitalWrite override that checks RADIOLIB_NC as alias for unused pin.
Definition: Module.cpp:288
static uint8_t flipBits(uint8_t b)
Function to reflect bits within a byte.
Definition: Module.cpp:495
uint8_t SPIreadCommand
Basic SPI read command. Defaults to 0x00.
Definition: Module.h:135
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:570
RADIOLIB_PIN_TYPE getIrq() const
Access method to get the pin number of interrupt/GPIO.
Definition: Module.h:276
void attachInterrupt(RADIOLIB_PIN_TYPE interruptNum, void(*userFunc)(void), RADIOLIB_INTERRUPT_STATUS mode)
Arduino core attachInterrupt override.
Definition: Module.cpp:362
void SPIwriteRegisterBurst(uint8_t reg, uint8_t *data, uint8_t numBytes)
SPI burst write method.
Definition: Module.cpp:201
void end()
Arduino core SPI end override.
Definition: Module.cpp:456
void SPIwriteRegister(uint8_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:205
static void hexdump(uint8_t *data, size_t len)
Function to dump data as hex into the debug port.
Definition: Module.cpp:510
void init()
Initialize low-level module control.
Definition: Module.cpp:109
int16_t SPIgetRegValue(uint8_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:132
RADIOLIB_PIN_TYPE getRst() const
Access method to get the pin number of hardware reset pin.
Definition: Module.h:283
RADIOLIB_PIN_TYPE getCs() const
Access method to get the pin number of SPI chip select.
Definition: Module.h:269
uint8_t SPIwriteCommand
Basic SPI write command. Defaults to 0x80.
Definition: Module.h:140
RADIOLIB_PIN_TYPE getGpio() const
Access method to get the pin number of second interrupt/GPIO.
Definition: Module.h:290
void SPItransfer(uint8_t cmd, uint8_t reg, uint8_t *dataOut, uint8_t *dataIn, uint8_t numBytes)
SPI single transfer method.
Definition: Module.cpp:209
void delay(uint32_t ms)
Arduino core delay override.
Definition: Module.cpp:385
uint32_t micros()
Arduino core micros override.
Definition: Module.cpp:406
void begin()
Arduino core SPI begin override.
Definition: Module.cpp:420
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:274
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:335
void setRfSwitchState(uint8_t mode)
Set RF switch state.
Definition: Module.cpp:587
Definition: Module.h:34