Skip to content

Commit

Permalink
Port the majority of SX127x RFM9x changes from RadioLib 3.4.0
Browse files Browse the repository at this point in the history
  • Loading branch information
zhgzhg committed Apr 18, 2020
1 parent 26f6694 commit c456691
Show file tree
Hide file tree
Showing 15 changed files with 479 additions and 501 deletions.
48 changes: 26 additions & 22 deletions src/Module.cpp
Original file line number Diff line number Diff line change
@@ -1,42 +1,27 @@
#include "Module.h"

Module::Module(int cs, int int0, int int1, SPIClass& spi) {
Module::Module(RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE int0, RADIOLIB_PIN_TYPE int1, RADIOLIB_PIN_TYPE rst, SPIClass& spi) {
// save pins numbers to private global variables
_cs = cs;
_int0 = int0;
_int1 = int1;
_rst = rst;
_spi = &spi;
}

void Module::init(uint8_t interface, uint8_t gpio) {
void Module::init(uint8_t interface) {
// select interface
switch(interface) {
case RADIOLIB_USE_SPI:
pinMode(_cs, OUTPUT);
digitalWrite(_cs, HIGH);
Module::pinMode(_cs, OUTPUT);
Module::digitalWrite(_cs, HIGH);
_spi->begin();
break;
case RADIOLIB_USE_UART:
break;
case RADIOLIB_USE_I2C:
break;
}

// select GPIO
switch(gpio) {
case RADIOLIB_INT_NONE:
break;
case RADIOLIB_INT_0:
pinMode(_int0, INPUT);
break;
case RADIOLIB_INT_1:
pinMode(_int1, INPUT);
break;
case RADIOLIB_INT_BOTH:
pinMode(_int0, INPUT);
pinMode(_int1, INPUT);
break;
}
}

void Module::term() {
Expand Down Expand Up @@ -134,7 +119,7 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da
_spi->beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0));

// pull CS low
digitalWrite(_cs, LOW);
Module::digitalWrite(_cs, LOW);

// send SPI register address with access command
_spi->transfer(reg | cmd);
Expand All @@ -156,8 +141,27 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da
}

// release CS
digitalWrite(_cs, HIGH);
Module::digitalWrite(_cs, HIGH);

// end SPI transaction
_spi->endTransaction();
}

void Module::pinMode(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_MODE mode) {
if(pin != RADIOLIB_NC) {
::pinMode(pin, mode);
}
}

void Module::digitalWrite(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS value) {
if(pin != RADIOLIB_NC) {
::digitalWrite(pin, value);
}
}

RADIOLIB_PIN_STATUS Module::digitalRead(RADIOLIB_PIN_TYPE pin) {
if(pin != RADIOLIB_NC) {
return(::digitalRead(pin));
}
return(LOW);
}
63 changes: 49 additions & 14 deletions src/Module.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,26 +35,25 @@ class Module {
\param int1 Arduino pin that will be used as interrupt/GPIO 1. Connect to SX127x/RFM9x pin DIO1.
Does not need to be connected to Arduino interrupt pin, unless Arduino sketch is using interrupt-driven transmit/receive methods.
\param rst Arduino pin that will be used connected to the reset pin of the module. Defaults to RADIOLIB_NC.
\param spi SPIClass instance that will be used for SPI bus control. This can be hardware SPI or some software SPI driver.
*/
Module(int cs = LORALIB_DEFAULT_SPI_CS, int int0 = 2, int int1 = 3, SPIClass& spi = SPI);
Module(RADIOLIB_PIN_TYPE cs = LORALIB_DEFAULT_SPI_CS, RADIOLIB_PIN_TYPE int0 = 2, RADIOLIB_PIN_TYPE int1 = 3, RADIOLIB_PIN_TYPE rst = RADIOLIB_NC, SPIClass& spi = SPI);

/*!
\brief Initialization method. Called internally when connecting to the %LoRa chip and should not be called explicitly from Arduino code.
\param interface %Module interface that should be used. Required for RadioLib compatibility, will always be set to USE_SPI.
\param gpio Determines which interrupt/GPIO should be used. Required for RadioLib compatibility, will always be set to INT_BOTH.
*/
void init(uint8_t interface, uint8_t gpio);
void init(uint8_t interface);

/*!
\brief Termination method. Called internally when required %LoRa chip is not found and should not be called explicitly from Arduino code.
*/
void term();



/*!
\brief SPI read method that automatically masks unused bits. This method is the preferred SPI read mechanism.
Expand Down Expand Up @@ -144,27 +143,63 @@ class Module {
*/
void SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes);

/*!
\brief Access method to get the pin number of SPI chip select.
\returns Pin number of SPI chip select configured in the constructor.
*/
RADIOLIB_PIN_TYPE getCs() const { return(_cs); }

/*!
\brief Access method to get the pin number of interrupt/GPIO.
\returns Pin number of interrupt/GPIO configured in the constructor.
*/
RADIOLIB_PIN_TYPE getIrq() const { return(_int0); }


/*!
\brief Access method to get the pin number of second interrupt/GPIO.
\returns Pin number of interrupt/GPIO configured in the constructor.
*/
RADIOLIB_PIN_TYPE getGpio() const { return(_int1); }

/*!
\brief Access method to get the pin number of interrupt/GPIO 0.
\brief Access method to get the pin number of hardware reset pin.
\returns Pin number of interrupt/GPIO 0 configured in the constructor.
\returns Pin number of hardware reset pin configured in the constructor.
*/
int getInt0() const { return(_int0); }
RADIOLIB_PIN_TYPE getRst() const { return(_rst); }

/*!
\brief Access method to get the pin number of interrupt/GPIO 1.
\brief Arduino core pinMode override that checks RADIOLIB_NC as alias for unused pin.
\param pin Pin to change the mode of.
\param mode Which mode to set.
*/
static void pinMode(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_MODE mode);

\returns Pin number of interrupt/GPIO 1 configured in the constructor.
/*!
\brief Arduino core digitalWrite override that checks RADIOLIB_NC as alias for unused pin.
\param pin Pin to write to.
\param value Whether to set the pin high or low.
*/
static void digitalWrite(RADIOLIB_PIN_TYPE pin, RADIOLIB_PIN_STATUS value);

/*!
\brief Arduino core digitalWrite override that checks RADIOLIB_NC as alias for unused pin.
\param pin Pin to read from.
\returns Pin value.
*/
int getInt1() const { return(_int1); }
static RADIOLIB_PIN_STATUS digitalRead(RADIOLIB_PIN_TYPE pin);

#ifndef RADIOLIB_GODMODE
private:
#endif
int _cs;
int _int0;
int _int1;
RADIOLIB_PIN_TYPE _cs;
RADIOLIB_PIN_TYPE _int0;
RADIOLIB_PIN_TYPE _int1;
RADIOLIB_PIN_TYPE _rst;

SPIClass* _spi;
};
Expand Down
129 changes: 129 additions & 0 deletions src/TypeDef.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,134 @@
#endif
#endif

/*
* Platform-specific configuration.
*
* RADIOLIB_PIN_TYPE - which type should be used for pin numbers in functions like digitalRead().
* RADIOLIB_PIN_MODE - which type should be used for pin modes in functions like pinMode().
* RADIOLIB_PIN_STATUS - which type should be used for pin values in functions like digitalWrite().
* RADIOLIB_NC - alias for unused pin, usually the largest possible value of RADIOLIB_PIN_TYPE.
* RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED - defined if the specific platform does not support SoftwareSerial.
* RADIOLIB_HARDWARE_SERIAL_PORT - which hardware serial port should be used on platform that do not have SoftwareSerial support.
*
* In addition, some platforms may require RadioLib to disable specific drivers (such as ESP8266).
*/
#if defined(__AVR__) && !(defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_AVR_NANO_EVERY))
// Arduino AVR boards (except for megaAVR) - Uno, Mega etc.
#define RADIOLIB_PIN_TYPE uint8_t
#define RADIOLIB_PIN_MODE uint8_t
#define RADIOLIB_PIN_STATUS uint8_t
#define RADIOLIB_NC (0xFF)

#elif defined(ESP8266)
// ESP8266 boards
#define RADIOLIB_PIN_TYPE uint8_t
#define RADIOLIB_PIN_MODE uint8_t
#define RADIOLIB_PIN_STATUS uint8_t
#define RADIOLIB_NC (0xFF)

// RadioLib has ESPS8266 driver, this must be disabled to use ESP8266 as platform
#define _RADIOLIB_ESP8266_H

#elif defined(ESP32)
// ESP32 boards
#define RADIOLIB_PIN_TYPE uint8_t
#define RADIOLIB_PIN_MODE uint8_t
#define RADIOLIB_PIN_STATUS uint8_t
#define RADIOLIB_NC (0xFF)
#define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED
#define RADIOLIB_HARDWARE_SERIAL_PORT Serial1

#elif defined(ARDUINO_ARCH_STM32)
// STM32duino boards
#define RADIOLIB_PIN_TYPE uint32_t
#define RADIOLIB_PIN_MODE uint32_t
#define RADIOLIB_PIN_STATUS uint32_t
#define RADIOLIB_NC (0xFFFFFFFF)
#define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED
#define RADIOLIB_HARDWARE_SERIAL_PORT Serial1

#elif defined(SAMD_SERIES)
// Arduino SAMD boards - Zero, MKR, etc.
#define RADIOLIB_PIN_TYPE uint32_t
#define RADIOLIB_PIN_MODE uint32_t
#define RADIOLIB_PIN_STATUS uint32_t
#define RADIOLIB_NC (0xFFFFFFFF)
#define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED
#define RADIOLIB_HARDWARE_SERIAL_PORT Serial1

#elif defined(__SAM3X8E__)
// Arduino Due
#define RADIOLIB_PIN_TYPE uint32_t
#define RADIOLIB_PIN_MODE uint32_t
#define RADIOLIB_PIN_STATUS uint32_t
#define RADIOLIB_NC (0xFFFFFFFF)
#define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED
#define RADIOLIB_HARDWARE_SERIAL_PORT Serial1

#elif (defined(NRF52832_XXAA) || defined(NRF52840_XXAA)) && !defined(ARDUINO_ARDUINO_NANO33BLE)
// Adafruit nRF52 boards
#define RADIOLIB_PIN_TYPE uint32_t
#define RADIOLIB_PIN_MODE uint32_t
#define RADIOLIB_PIN_STATUS uint32_t
#define RADIOLIB_NC (0xFFFFFFFF)

#elif defined(ARDUINO_ARC32_TOOLS)
// Intel Curie
#define RADIOLIB_PIN_TYPE uint8_t
#define RADIOLIB_PIN_MODE uint8_t
#define RADIOLIB_PIN_STATUS uint8_t
#define RADIOLIB_NC (0xFF)

#elif defined(ARDUINO_AVR_UNO_WIFI_REV2) || defined(ARDUINO_AVR_NANO_EVERY)
// Arduino megaAVR boards - Uno Wifi Rev.2, Nano Every
#define RADIOLIB_PIN_TYPE uint8_t
#define RADIOLIB_PIN_MODE PinMode
#define RADIOLIB_PIN_STATUS PinStatus
#define RADIOLIB_NC (0xFF)

#elif defined(AM_PART_APOLLO3)
// Sparkfun Artemis boards
#define RADIOLIB_PIN_TYPE uint8_t
#define RADIOLIB_PIN_MODE uint8_t
#define RADIOLIB_PIN_STATUS uint8_t
#define RADIOLIB_NC (0xFF)
#define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED
#define RADIOLIB_HARDWARE_SERIAL_PORT Serial1

#elif defined(ARDUINO_ARDUINO_NANO33BLE)
// Arduino Nano 33 BLE
#define RADIOLIB_PIN_TYPE pin_size_t
#define RADIOLIB_PIN_MODE PinMode
#define RADIOLIB_PIN_STATUS PinStatus
#define RADIOLIB_NC (0xFF)
#define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED
#define RADIOLIB_HARDWARE_SERIAL_PORT Serial1

// Nano 33 BLE uses mbed libraries, which already contain ESP8266 driver
#define _RADIOLIB_ESP8266_H

#elif defined (LINUX)
// Linux pseudo-definitions, for Armbian/Raspbian/etc.
#define RADIOLIB_PIN_TYPE uint32_t
#define RADIOLIB_PIN_MODE uint32_t
#define RADIOLIB_PIN_STATUS uint32_t
#define RADIOLIB_NC (0xFFFFFFFF)
#define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED
#define RADIOLIB_HARDWARE_SERIAL_PORT Serial1