RadioLib/src/Module.h

328 wiersze
9.8 KiB
C
Czysty Zwykły widok Historia

2019-02-08 14:58:29 +00:00
#ifndef _RADIOLIB_MODULE_H
#define _RADIOLIB_MODULE_H
2018-03-05 16:08:42 +00:00
#include <SPI.h>
2018-09-14 15:31:19 +00:00
//#include <Wire.h>
#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32)
#else
2018-03-05 16:08:42 +00:00
#include <SoftwareSerial.h>
#endif
2018-03-05 16:08:42 +00:00
#include "TypeDef.h"
2019-05-24 15:32:11 +00:00
/*!
\class Module
\brief Implements all common low-level SPI/UART/I2C methods to control the wireless module.
Every module class contains one private instance of this class.
*/
2018-03-05 16:08:42 +00:00
class Module {
public:
2019-05-24 15:32:11 +00:00
/*!
\brief UART-based module constructor.
\param tx Arduino pin to be used as Tx pin for SoftwareSerial communication.
\param rx Arduino pin to be used as Rx pin for SoftwareSerial communication.
\param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1
2019-05-24 15:32:11 +00:00
*/
#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32)
Module(int tx, int rx, HardwareSerial* useSer = &Serial1);
#else
Module(int tx, int rx, HardwareSerial* useSer = nullptr);
#endif
2019-05-24 15:32:11 +00:00
/*!
\brief SPI-based module constructor.
\param cs Arduino pin to be used as chip select.
\param int0 Arduino pin to be used as interrupt/GPIO 0.
\param int1 Arduino pin to be used as interrupt/GPIO 1.
\param spi SPI interface to be used. Defaults to Arduino hardware SPI interface, can also use software SPI implementations.
\param spiSettings SPI interface settings. Defaults to 2 MHz clock, MSB first, mode 0.
*/
Module(int cs, int int0, int int1, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0));
2019-05-24 15:32:11 +00:00
/*!
\brief Extended SPI-based module constructor.
\param cs Arduino pin to be used as chip select.
\param int0 Arduino pin to be used as interrupt/GPIO 0.
\param int1 Arduino pin to be used as interrupt/GPIO 1.
\param int2 Arduino pin to be used as interrupt/GPIO 2.
\param spi SPI interface to be used. Defaults to Arduino hardware SPI interface, can also use software SPI implementations.
\param spiSettings SPI interface settings. Defaults to 2 MHz clock, MSB first, mode 0.
*/
2019-05-20 06:54:04 +00:00
Module(int cs, int int0, int int1, int int2, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0));
2019-05-24 15:32:11 +00:00
/*!
\brief Generic module constructor.
\param cs Arduino pin to be used as chip select.
\param int0 Arduino pin to be used as interrupt/GPIO 0.
\param int1 Arduino pin to be used as interrupt/GPIO 1.
\param tx Arduino pin to be used as Tx pin for SoftwareSerial communication.
\param rx Arduino pin to be used as Rx pin for SoftwareSerial communication.
\param spi SPI interface to be used. Defaults to Arduino hardware SPI interface, can also use software SPI implementations.
\param spiSettings SPI interface settings. Defaults to 2 MHz clock, MSB first, mode 0.
\param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1
2019-05-24 15:32:11 +00:00
*/
#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32)
Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0), HardwareSerial* useSer = &Serial1);
#else
Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi = SPI, SPISettings spiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0), HardwareSerial* useSer = nullptr);
#endif
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
// public member variables
/*!
\brief Internal SoftwareSerial instance.
*/
#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32)
HardwareSerial* ModuleSerial;
#else
2018-03-05 16:08:42 +00:00
SoftwareSerial* ModuleSerial;
#endif
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
/*!
\brief Baud rate of SoftwareSerial UART communication. Defaults to 9600 baud.
*/
2018-03-05 16:08:42 +00:00
uint32_t baudrate = 9600;
2019-05-24 15:32:11 +00:00
/*!
\brief Line feed to be used when sending AT commands. Defaults to CR+LF.
*/
const char* AtLineFeed = "\r\n";
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
/*!
\brief Basic SPI read command. Defaults to 0x00.
*/
2018-09-29 16:56:50 +00:00
uint8_t SPIreadCommand = 0b00000000;
2019-05-24 15:32:11 +00:00
/*!
\brief Basic SPI write command. Defaults to 0x80.
*/
2018-09-29 16:56:50 +00:00
uint8_t SPIwriteCommand = 0b10000000;
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
// basic methods
/*!
\brief Initialize low-level module control.
\param interface Interface to be used on the module. See \ref shield_config for details.
\param gpio GPIO/interrupt pins to be used on the module. See \ref uart_config for details.
*/
2018-07-23 09:19:34 +00:00
void init(uint8_t interface, uint8_t gpio);
2019-05-24 15:32:11 +00:00
/*!
\brief Terminate low-level module control.
*/
2019-03-22 18:01:56 +00:00
void term();
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
// AT methods
/*!
\brief Empty internal AT buffer.
*/
2018-03-05 16:08:42 +00:00
void ATemptyBuffer();
2019-05-24 15:32:11 +00:00
/*!
\brief Get response after sending AT command.
\returns True if AT response contains the string "OK", false otehrwise.
*/
2018-03-05 16:08:42 +00:00
bool ATgetResponse();
2019-05-24 15:32:11 +00:00
/*!
\brief Send AT command. Will also call ATgetResponse.
\param cmd AT command to be sent. Line feed characters are added automatically.
\returns True if AT response contains the string "OK", false otherwise.
*/
2018-03-05 16:08:42 +00:00
bool ATsendCommand(const char* cmd);
2019-05-24 15:32:11 +00:00
/*!
\brief Send raw AT data. Will also call ATgetResponse.
\param data Data to be sent.
\param len Number of bytes to send.
\returns True if AT response contains the string "OK", false otherwise.
*/
bool ATsendData(uint8_t* data, uint32_t len);
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
// SPI methods
/*!
\brief SPI read method that automatically masks unused bits. This method is the preferred SPI read mechanism.
\param reg Address of SPI register to read.
\param msb Most significant bit of the register variable. Bits above this one will be masked out.
\param lsb Least significant bit of the register variable. Bits below this one will be masked out.
\returns Masked register value or status code.
*/
2018-07-23 09:19:34 +00:00
int16_t SPIgetRegValue(uint8_t reg, uint8_t msb = 7, uint8_t lsb = 0);
2019-05-24 15:32:11 +00:00
/*!
\brief Overwrite-safe SPI write method with verification. This method is the preferred SPI write mechanism.
\param reg Address of SPI register to write.
\param value Single byte value that will be written to the SPI register.
\param msb Most significant bit of the register variable. Bits above this one will not be affected by the write operation.
\param lsb Least significant bit of the register variable. Bits below this one will not be affected by the write operation.
\param checkInterval Number of milliseconds between register writing and verification reading. Some registers need up to 10ms to process the change.
\returns \ref status_codes
*/
2018-10-31 16:44:47 +00:00
int16_t SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb = 7, uint8_t lsb = 0, uint8_t checkInterval = 2);
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
/*!
\brief SPI burst read method.
\param reg Address of SPI register to read.
\param numBytes Number of bytes that will be read.
\param inBytes Pointer to array that will hold the read data.
*/
2018-07-23 09:19:34 +00:00
void SPIreadRegisterBurst(uint8_t reg, uint8_t numBytes, uint8_t* inBytes);
2019-05-24 15:32:11 +00:00
/*!
\brief SPI basic read method. Use of this method is reserved for special cases, SPIgetRegValue should be used instead.
\param reg Address of SPI register to read.
\returns Value that was read from register.
*/
2018-03-05 16:08:42 +00:00
uint8_t SPIreadRegister(uint8_t reg);
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
/*!
\brief SPI burst write method.
\param reg Address of SPI register to write.
\param data Pointer to array that holds the data that will be written.
\param numBytes Number of bytes that will be written.
*/
2018-03-05 16:08:42 +00:00
void SPIwriteRegisterBurst(uint8_t reg, uint8_t* data, uint8_t numBytes);
2019-05-24 15:32:11 +00:00
/*!
\brief SPI basic write method. Use of this method is reserved for special cases, SPIsetRegValue should be used instead.
\param reg Address of SPI register to write.
\param data Value that will be written to the register.
*/
2018-03-05 16:08:42 +00:00
void SPIwriteRegister(uint8_t reg, uint8_t data);
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
/*!
\brief SPI single transfer method.
\param cmd SPI access command (read/write/burst/...).
\param reg Address of SPI register to transfer to/from.
\param dataOut Data that will be transfered from master to slave.
\param dataIn Data that was transfered from slave to master.
\param numBytes Number of bytes to transfer.
*/
2019-03-22 18:01:56 +00:00
void SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes);
2019-05-13 13:03:09 +00:00
2019-05-24 15:32:11 +00:00
// pin number access methods
/*!
\brief Access method to get the pin number of SPI chip select.
\returns Pin number of SPI chip select configured in the constructor.
*/
2019-01-13 18:44:16 +00:00
int getCs() const { return(_cs); }
2019-05-24 15:32:11 +00:00
/*!
\brief Access method to get the pin number of interrupt/GPIO 0.
\returns Pin number of interrupt/GPIO 0 configured in the constructor.
*/
2019-01-13 18:44:16 +00:00
int getInt0() const { return(_int0); }
2019-05-24 15:32:11 +00:00
/*!
\brief Access method to get the pin number of interrupt/GPIO 1.
\returns Pin number of interrupt/GPIO 1 configured in the constructor.
*/
2019-01-13 18:44:16 +00:00
int getInt1() const { return(_int1); }
2019-05-24 15:32:11 +00:00
/*!
\brief Access method to get the pin number of UART Rx.
\returns Pin number of UART Rx configured in the constructor.
*/
int getRx() const { return(_rx); }
2019-05-24 15:32:11 +00:00
/*!
\brief Access method to get the pin number of UART Rx.
\returns Pin number of UART Rx configured in the constructor.
*/
int getTx() const { return(_tx); }
2019-05-24 15:32:11 +00:00
/*!
\brief Access method to get the SPI interface.
\returns SPI interface configured in the constructor.
*/
SPIClass* getSpi() const { return(_spi); }
2019-05-24 15:32:11 +00:00
/*!
\brief Access method to get the SPI interface settings.
\returns SPI interface settings configured in the constructor.
*/
SPISettings getSpiSettings() const { return(_spiSettings); }
2019-05-13 13:03:09 +00:00
2018-03-05 16:08:42 +00:00
private:
int _cs;
int _tx;
int _rx;
int _int0;
int _int1;
2019-05-13 13:03:09 +00:00
2019-03-22 18:01:56 +00:00
SPIClass* _spi;
SPISettings _spiSettings;
2019-05-13 13:03:09 +00:00
2018-03-05 16:08:42 +00:00
uint32_t _ATtimeout = 15000;
};
#endif