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:
18 
19  #if defined(RADIOLIB_BUILD_ARDUINO)
20 
32  Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE gpio = RADIOLIB_NC);
33 
49  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);
50 
51  #else
52 
64  Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE gpio = RADIOLIB_NC);
65 
66  #endif
67 
73  Module(const Module& mod);
74 
80  Module& operator=(const Module& mod);
81 
82  // public member variables
83 
87  uint8_t SPIreadCommand = 0b00000000;
88 
92  uint8_t SPIwriteCommand = 0b10000000;
93 
94  #if defined(RADIOLIB_INTERRUPT_TIMING)
95 
99  typedef void (*TimerSetupCb_t)(uint32_t len);
100 
104  TimerSetupCb_t TimerSetupCb = nullptr;
105 
109  volatile bool TimerFlag = false;
110 
111  #endif
112 
113  // basic methods
114 
118  void init();
119 
123  void term();
124 
125  // SPI methods
126 
138  int16_t SPIgetRegValue(uint8_t reg, uint8_t msb = 7, uint8_t lsb = 0);
139 
157  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);
158 
168  void SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes);
169 
177  uint8_t SPIreadRegister(uint8_t reg);
178 
188  void SPIwriteRegisterBurst(uint8_t reg, uint8_t* data, uint8_t numBytes);
189 
197  void SPIwriteRegister(uint8_t reg, uint8_t data);
198 
212  void SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes);
213 
214  // pin number access methods
215 
221  RADIOLIB_PIN_TYPE getCs() const { return(_cs); }
222 
228  RADIOLIB_PIN_TYPE getIrq() const { return(_irq); }
229 
235  RADIOLIB_PIN_TYPE getRst() const { return(_rst); }
236 
242  RADIOLIB_PIN_TYPE getGpio() const { return(_gpio); }
243 
252  void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn);
253 
261  void setRfSwitchState(RADIOLIB_PIN_STATUS rxPinState, RADIOLIB_PIN_STATUS txPinState);
262 
271  void waitForMicroseconds(uint32_t start, uint32_t len);
272 
273  // Arduino core overrides
274 
282  void pinMode(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_MODE mode);
283 
291  void digitalWrite(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS value);
292 
300  RADIOLIB_PIN_STATUS digitalRead(RADIOLIB_PIN_TYPE pin);
301 
309  void tone(RADIOLIB_PIN_TYPE pin, uint16_t value, uint32_t duration = 0);
310 
316  void noTone(RADIOLIB_PIN_TYPE pin);
317 
327  void attachInterrupt(RADIOLIB_PIN_TYPE interruptNum, void (*userFunc)(void), RADIOLIB_INTERRUPT_STATUS mode);
328 
334  void detachInterrupt(RADIOLIB_PIN_TYPE interruptNum);
335 
339  void yield();
340 
346  void delay(uint32_t ms);
347 
353  void delayMicroseconds(uint32_t us);
354 
358  uint32_t millis();
359 
363  uint32_t micros();
364 
368  uint32_t pulseIn(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS state, uint32_t timeout);
369 
373  void begin();
374 
378  void beginTransaction();
379 
383  uint8_t transfer(uint8_t b);
384 
388  void endTransaction();
389 
393  void end();
394 
395  // helper functions to set up SPI overrides on Arduino
396  #if defined(RADIOLIB_BUILD_ARDUINO)
397  void SPIbegin();
398  void SPIend();
399  #endif
400  virtual void SPIbeginTransaction();
401  virtual uint8_t SPItransfer(uint8_t b);
402  virtual void SPIendTransaction();
403 
407  static uint8_t flipBits(uint8_t b);
408 
412  static uint16_t flipBits16(uint16_t i);
413 
421  static void hexdump(uint8_t* data, size_t len);
422 
430  void regdump(uint8_t start, uint8_t len);
431 
432 #if !defined(RADIOLIB_GODMODE)
433  private:
434 #endif
435 
436  // pins
437  RADIOLIB_PIN_TYPE _cs = RADIOLIB_NC;
438  RADIOLIB_PIN_TYPE _irq = RADIOLIB_NC;
439  RADIOLIB_PIN_TYPE _rst = RADIOLIB_NC;
440  RADIOLIB_PIN_TYPE _gpio = RADIOLIB_NC;
441 
442  // SPI interface (Arduino only)
443  #if defined(RADIOLIB_BUILD_ARDUINO)
444  SPIClass* _spi = NULL;
445  SPISettings _spiSettings = RADIOLIB_DEFAULT_SPI_SETTINGS;
446  bool _initInterface = false;
447  #endif
448 
449  // RF switch presence and pins
450  bool _useRfSwitch = false;
451  RADIOLIB_PIN_TYPE _rxEn = RADIOLIB_NC;
452  RADIOLIB_PIN_TYPE _txEn = RADIOLIB_NC;
453 
454  #if defined(RADIOLIB_INTERRUPT_TIMING)
455  uint32_t _prevTimingLen = 0;
456  #endif
457 
458  // hardware abstraction layer callbacks
459  // this is placed at the end of Module class because the callback generator macros
460  // screw with the private/public access specifiers
461  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_PIN_MODE);
462  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DIGITAL_WRITE);
463  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DIGITAL_READ);
464  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_TONE);
465  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_NO_TONE);
466  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_ATTACH_INTERRUPT);
467  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DETACH_INTERRUPT);
468  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_YIELD);
469  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DELAY);
470  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_DELAY_MICROSECONDS);
471  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_MILLIS);
472  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_MICROS);
473  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_PULSE_IN);
474 
475  #if defined(RADIOLIB_BUILD_ARDUINO)
476  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_BEGIN);
477  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_BEGIN_TRANSACTION);
478  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_TRANSFER);
479  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_END_TRANSACTION);
480  RADIOLIB_GENERATE_CALLBACK_SPI(RADIOLIB_CB_ARGS_SPI_END);
481  #else
482  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_BEGIN);
483  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_BEGIN_TRANSACTION);
484  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_TRANSFER);
485  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_END_TRANSACTION);
486  RADIOLIB_GENERATE_CALLBACK(RADIOLIB_CB_ARGS_SPI_END);
487  #endif
488 };
489 
490 #endif
Module::waitForMicroseconds
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:254
Module::pinMode
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:272
Module::hexdump
static void hexdump(uint8_t *data, size_t len)
Function to dump data as hex into the debug port.
Definition: Module.cpp:508
Module::getIrq
RADIOLIB_PIN_TYPE getIrq() const
Access method to get the pin number of interrupt/GPIO.
Definition: Module.h:228
Module::digitalRead
RADIOLIB_PIN_STATUS digitalRead(RADIOLIB_PIN_TYPE pin)
Arduino core digitalWrite override that checks RADIOLIB_NC as alias for unused pin.
Definition: Module.cpp:286
Module::SPItransfer
void SPItransfer(uint8_t cmd, uint8_t reg, uint8_t *dataOut, uint8_t *dataIn, uint8_t numBytes)
SPI single transfer method.
Definition: Module.cpp:207
Module::transfer
uint8_t transfer(uint8_t b)
Arduino core SPI transfer override.
Definition: Module.cpp:436
Module::init
void init()
Initialize low-level module control.
Definition: Module.cpp:107
Module::SPIgetRegValue
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:130
Module::regdump
void regdump(uint8_t start, uint8_t len)
Function to dump device registers as hex into the debug port.
Definition: Module.cpp:540
Module::getRst
RADIOLIB_PIN_TYPE getRst() const
Access method to get the pin number of hardware reset pin.
Definition: Module.h:235
Module::begin
void begin()
Arduino core SPI begin override.
Definition: Module.cpp:418
Module::SPIwriteCommand
uint8_t SPIwriteCommand
Basic SPI write command. Defaults to 0x80.
Definition: Module.h:92
Module::delay
void delay(uint32_t ms)
Arduino core delay override.
Definition: Module.cpp:383
Module::yield
void yield()
Arduino core yield override.
Definition: Module.cpp:374
Module::digitalWrite
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:279
Module::micros
uint32_t micros()
Arduino core micros override.
Definition: Module.cpp:404
Module::getCs
RADIOLIB_PIN_TYPE getCs() const
Access method to get the pin number of SPI chip select.
Definition: Module.h:221
Module::SPIsetRegValue
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:140
Module::tone
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:298
Module::SPIwriteRegister
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:203
Module::noTone
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:333
Module::endTransaction
void endTransaction()
Arduino core SPI endTransaction override.
Definition: Module.cpp:445
Module::setRfSwitchPins
void setRfSwitchPins(RADIOLIB_PIN_TYPE rxEn, RADIOLIB_PIN_TYPE txEn)
Some modules contain external RF switch controlled by two pins. This function gives RadioLib control ...
Definition: Module.cpp:553
Module::getGpio
RADIOLIB_PIN_TYPE getGpio() const
Access method to get the pin number of second interrupt/GPIO.
Definition: Module.h:242
Module::Module
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
Module::flipBits16
static uint16_t flipBits16(uint16_t i)
Function to reflect bits within an integer.
Definition: Module.cpp:500
Module::SPIreadRegister
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:193
Module
Implements all common low-level methods to control the wireless module. Every module class contains o...
Definition: Module.h:16
Module::operator=
Module & operator=(const Module &mod)
Overload for assignment operator.
Definition: Module.cpp:96
Module::end
void end()
Arduino core SPI end override.
Definition: Module.cpp:454
Module::term
void term()
Terminate low-level module control.
Definition: Module.cpp:117
Module::SPIreadCommand
uint8_t SPIreadCommand
Basic SPI read command. Defaults to 0x00.
Definition: Module.h:87
Module::detachInterrupt
void detachInterrupt(RADIOLIB_PIN_TYPE interruptNum)
Arduino core detachInterrupt override.
Definition: Module.cpp:367
Module::setRfSwitchState
void setRfSwitchState(RADIOLIB_PIN_STATUS rxPinState, RADIOLIB_PIN_STATUS txPinState)
Set RF switch state.
Definition: Module.cpp:561
Module::SPIreadRegisterBurst
void SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t *inBytes)
SPI burst read method.
Definition: Module.cpp:189
Module::pulseIn
uint32_t pulseIn(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS state, uint32_t timeout)
Arduino core pulseIn override.
Definition: Module.cpp:411
Module::flipBits
static uint8_t flipBits(uint8_t b)
Function to reflect bits within a byte.
Definition: Module.cpp:493
Module::millis
uint32_t millis()
Arduino core millis override.
Definition: Module.cpp:397
Module::delayMicroseconds
void delayMicroseconds(uint32_t us)
Arduino core delayMicroseconds override.
Definition: Module.cpp:390
Module::attachInterrupt
void attachInterrupt(RADIOLIB_PIN_TYPE interruptNum, void(*userFunc)(void), RADIOLIB_INTERRUPT_STATUS mode)
Arduino core attachInterrupt override.
Definition: Module.cpp:360
Module::beginTransaction
void beginTransaction()
Arduino core SPI beginTransaction override.
Definition: Module.cpp:427
Module::SPIwriteRegisterBurst
void SPIwriteRegisterBurst(uint8_t reg, uint8_t *data, uint8_t numBytes)
SPI burst write method.
Definition: Module.cpp:199