From e4c4e4a5433b70b10b4e0cc0fd110e55a44b160d Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 19 Sep 2019 08:21:27 +0200 Subject: [PATCH 01/83] Extended RadioShield module config --- src/RadioLib.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RadioLib.cpp b/src/RadioLib.cpp index aa189c34..2ab960cd 100644 --- a/src/RadioLib.cpp +++ b/src/RadioLib.cpp @@ -1,8 +1,8 @@ #include "RadioLib.h" Radio::Radio() { - ModuleA = new Module(RADIOSHIELD_CS_A, RADIOSHIELD_INT_0, RADIOSHIELD_INT_1, RADIOSHIELD_RX_A, RADIOSHIELD_TX_A); - ModuleB = new Module(RADIOSHIELD_CS_B, RADIOSHIELD_INT_0, RADIOSHIELD_INT_1, RADIOSHIELD_RX_B, RADIOSHIELD_TX_B); + ModuleA = new Module(RADIOSHIELD_CS_A, RADIOSHIELD_INT_0, RADIOSHIELD_INT_1, RADIOSHIELD_RX_A, RADIOSHIELD_TX_A, SPI, SPISettings(2000000, MSBFIRST, SPI_MODE0), nullptr); + ModuleB = new Module(RADIOSHIELD_CS_B, RADIOSHIELD_INT_0, RADIOSHIELD_INT_1, RADIOSHIELD_RX_B, RADIOSHIELD_TX_B, SPI, SPISettings(2000000, MSBFIRST, SPI_MODE0), nullptr); } Radio RadioShield; From 9fa039549de5acc533029de985238c0d383d0939 Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 19 Sep 2019 08:21:45 +0200 Subject: [PATCH 02/83] [nRF24] Fixed fallthrough --- src/modules/nRF24.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/nRF24.cpp b/src/modules/nRF24.cpp index f4df1cbe..0c776ce1 100644 --- a/src/modules/nRF24.cpp +++ b/src/modules/nRF24.cpp @@ -386,6 +386,7 @@ int16_t nRF24::setReceivePipe(uint8_t pipeNum, uint8_t* addr) { case 0: _mod->SPIwriteRegisterBurst(NRF24_REG_RX_ADDR_P0, addr, _addrWidth); state |= _mod->SPIsetRegValue(NRF24_REG_EN_RXADDR, NRF24_P0_ON, 0, 0); + break; case 1: _mod->SPIwriteRegisterBurst(NRF24_REG_RX_ADDR_P1, addr, _addrWidth); state |= _mod->SPIsetRegValue(NRF24_REG_EN_RXADDR, NRF24_P1_ON, 1, 1); From ad8c234343db014c47303b7cb4e3a5c87da3fc68 Mon Sep 17 00:00:00 2001 From: mmrein <55082189+mmrein@users.noreply.github.com> Date: Thu, 19 Sep 2019 23:09:02 +0200 Subject: [PATCH 03/83] SX126x FSK: Implement setWhitening method Add setWhitening method for FSK modem for possibility to disable whitening (default enabled) or change whitening initial value. --- keywords.txt | 1 + src/modules/SX126x.cpp | 55 +++++++++++++++++++++++++++++++++++------- src/modules/SX126x.h | 16 ++++++++++-- 3 files changed, 61 insertions(+), 11 deletions(-) diff --git a/keywords.txt b/keywords.txt index 9f0d6d10..76cf9f20 100644 --- a/keywords.txt +++ b/keywords.txt @@ -107,6 +107,7 @@ setTCXO KEYWORD2 setDio2AsRfSwitch KEYWORD2 getTimeOnAir KEYWORD2 setSyncBits KEYWORD2 +setWhitening KEYWORD2 # ESP8266 join KEYWORD2 diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 99996ea8..4d6b444f 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -134,6 +134,11 @@ int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit return(state); } + state = setWhitening(true, 0x0100); + if(state != ERR_NONE) { + return(state); + } + state = setDio2AsRfSwitch(false); return(state); @@ -365,7 +370,7 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { if(modem == SX126X_PACKET_TYPE_LORA) { state = setPacketParams(_preambleLength, _crcType, len); } else if(modem == SX126X_PACKET_TYPE_GFSK) { - state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, len); + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, len); } else { return(ERR_UNKNOWN); } @@ -554,7 +559,7 @@ int16_t SX126x::setPreambleLength(uint16_t preambleLength) { return(setPacketParams(_preambleLength, _crcType)); } else if(modem == SX126X_PACKET_TYPE_GFSK) { _preambleLengthFSK = preambleLength; - return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp)); + return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening)); } return(ERR_UNKNOWN); @@ -716,7 +721,7 @@ int16_t SX126x::setSyncWord(uint8_t* syncWord, uint8_t len) { // update packet parameters _syncWordLength = len * 8; - state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp); + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); return(state); } @@ -745,7 +750,7 @@ int16_t SX126x::setSyncBits(uint8_t *syncWord, uint8_t bitsLen) { // update packet parameters _syncWordLength = bitsLen; - state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp); + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); return(state); } @@ -758,7 +763,7 @@ int16_t SX126x::setNodeAddress(uint8_t nodeAddr) { // enable address filtering (node only) _addrComp = SX126X_GFSK_ADDRESS_FILT_NODE; - int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp); + int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); if(state != ERR_NONE) { return(state); } @@ -777,7 +782,7 @@ int16_t SX126x::setBroadcastAddress(uint8_t broadAddr) { // enable address filtering (node and broadcast) _addrComp = SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST; - int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp); + int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); if(state != ERR_NONE) { return(state); } @@ -796,7 +801,7 @@ int16_t SX126x::disableAddressFiltering() { // disable address filtering _addrComp = SX126X_GFSK_ADDRESS_FILT_OFF; - return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp)); + return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening)); } int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool inverted) { @@ -827,7 +832,7 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool return(ERR_INVALID_CRC_CONFIGURATION); } - int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp); + int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); if(state != ERR_NONE) { return(state); } @@ -862,6 +867,38 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool return(ERR_UNKNOWN); } +int16_t SX126x::setWhitening(bool enabled, uint16_t initial) { + // check active modem + if(getPacketType() != SX126X_PACKET_TYPE_GFSK) { + return(ERR_WRONG_MODEM); + } + + int16_t state = ERR_NONE; + if(enabled != true) { + // disable whitening + _whitening = SX126X_GFSK_WHITENING_OFF; + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); + if(state != ERR_NONE) { + return(state); + } + } else { + // TODO: possibly take care of this note (pg. 65 of datasheet v1.2): "The user should not change the value of the 7 MSB's of this register." + // enable whitening + _whitening = SX126X_GFSK_WHITENING_ON; + // write initial whitening value + uint8_t data[2] = {(uint8_t)((initial >> 8) & 0xFF), (uint8_t)(initial & 0xFF)}; + state = writeRegister(SX126X_REG_WHITENING_INITIAL_MSB, data, 2); + if(state != ERR_NONE) { + return(state); + } + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); + if(state != ERR_NONE) { + return(state); + } + } + return(state); +} + float SX126x::getDataRate() { return(_dataRate); } @@ -1086,7 +1123,7 @@ int16_t SX126x::setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_ return(SPIwriteCommand(SX126X_CMD_SET_PACKET_PARAMS, data, 6)); } -int16_t SX126x::setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t payloadLength, uint8_t packetType, uint8_t preambleDetectorLength, uint8_t whitening) { +int16_t SX126x::setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t payloadLength, uint8_t packetType, uint8_t preambleDetectorLength) { uint8_t data[9] = {(uint8_t)((preambleLength >> 8) & 0xFF), (uint8_t)(preambleLength & 0xFF), preambleDetectorLength, syncWordLength, addrComp, packetType, payloadLength, crcType, whitening}; diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 072cf7ac..324f97b3 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -655,6 +655,18 @@ class SX126x: public PhysicalLayer { */ int16_t setCRC(uint8_t len, uint16_t initial = 0x1D0F, uint16_t polynomial = 0x1021, bool inverted = true); + /*! + \brief Sets FSK whitening parameters. + + \param enabled True = Whitening enabled + + \param initial Initial value used for the whitening LFSR in FSK mode. + The user should not change the value of the 7 MSB's of this register (pg. 65 of datasheet v1.2) + + \returns \ref status_codes + */ + int16_t setWhitening(bool enabled, uint16_t initial = 0x0100); + /*! \brief Sets TCXO (Temperature Compensated Crystal Oscillator) configuration. @@ -730,7 +742,7 @@ class SX126x: public PhysicalLayer { int16_t setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro = 0xFF); int16_t setModulationParamsFSK(uint32_t br, uint8_t pulseShape, uint8_t rxBw, uint32_t freqDev); int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength = 0xFF, uint8_t headerType = SX126X_LORA_HEADER_EXPLICIT, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); - int16_t setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t payloadLength = 0xFF, uint8_t packetType = SX126X_GFSK_PACKET_VARIABLE, uint8_t preambleDetectorLength = SX126X_GFSK_PREAMBLE_DETECT_16, uint8_t whitening = SX126X_GFSK_WHITENING_ON); + int16_t setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t payloadLength = 0xFF, uint8_t packetType = SX126X_GFSK_PACKET_VARIABLE, uint8_t preambleDetectorLength = SX126X_GFSK_PREAMBLE_DETECT_16); int16_t setBufferBaseAddress(uint8_t txBaseAddress = 0x00, uint8_t rxBaseAddress = 0x00); uint8_t getStatus(); uint32_t getPacketStatus(); @@ -747,7 +759,7 @@ class SX126x: public PhysicalLayer { float _bwKhz; uint32_t _br, _freqDev; - uint8_t _rxBw, _pulseShape, _crcTypeFSK, _syncWordLength, _addrComp; + uint8_t _rxBw, _pulseShape, _crcTypeFSK, _syncWordLength, _addrComp, _whitening; uint16_t _preambleLengthFSK; float _rxBwKhz; From 4388cfa06f4a59f5bfb4c35873bd1e40d27e3a4f Mon Sep 17 00:00:00 2001 From: mmrein <55082189+mmrein@users.noreply.github.com> Date: Fri, 20 Sep 2019 11:40:50 +0200 Subject: [PATCH 04/83] SX126x whitening: solved 7 MSBs Proper handling of the datasheet note for Whitening MSB register: "The user should not change the value of the 7 MSB's of this register" --- src/modules/SX126x.cpp | 18 +++++++++++++++--- src/modules/SX126x.h | 1 - 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 4d6b444f..982acaf8 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -877,20 +877,32 @@ int16_t SX126x::setWhitening(bool enabled, uint16_t initial) { if(enabled != true) { // disable whitening _whitening = SX126X_GFSK_WHITENING_OFF; + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); if(state != ERR_NONE) { return(state); } } else { - // TODO: possibly take care of this note (pg. 65 of datasheet v1.2): "The user should not change the value of the 7 MSB's of this register." // enable whitening _whitening = SX126X_GFSK_WHITENING_ON; + // write initial whitening value - uint8_t data[2] = {(uint8_t)((initial >> 8) & 0xFF), (uint8_t)(initial & 0xFF)}; - state = writeRegister(SX126X_REG_WHITENING_INITIAL_MSB, data, 2); + // as per note on pg. 65 of datasheet v1.2: "The user should not change the value of the 7 MSB's of this register" + uint8_t data[2]; + // first read the actual value and mask 7 MSB which we can not change + // if different value is written in 7 MSB, the Rx won't even work (tested on HW) + state = readRegister(SX126X_REG_WHITENING_INITIAL_MSB, data, 1); if(state != ERR_NONE) { return(state); } + data[0] = (data[0] & 0xFE) | (uint8_t)((initial >> 8) & 0x01); + data[1] = (uint8_t)(initial & 0xFF); + state = writeRegister(SX126X_REG_WHITENING_INITIAL_MSB, data, 2); + + if(state != ERR_NONE) { + return(state); + } + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); if(state != ERR_NONE) { return(state); diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 324f97b3..80a3841e 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -661,7 +661,6 @@ class SX126x: public PhysicalLayer { \param enabled True = Whitening enabled \param initial Initial value used for the whitening LFSR in FSK mode. - The user should not change the value of the 7 MSB's of this register (pg. 65 of datasheet v1.2) \returns \ref status_codes */ From b533d42010f54ab9c781bdc21c005cee15436e56 Mon Sep 17 00:00:00 2001 From: mmrein <55082189+mmrein@users.noreply.github.com> Date: Thu, 26 Sep 2019 16:16:29 +0200 Subject: [PATCH 05/83] Add STM32VL-Discovery to tested platforms --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8689d233..5ac65bb0 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ RadioLib was originally created as a driver for [__RadioShield__](https://github * __Arduino AVR boards__ - tested on Uno, Mega and Leonardo * __ESP8266 boards__ - NodeMCU, Wemos D1, etc. * __ESP32 boards__ - tested on ESP-WROOM-32 -* __STM32 boards__ - tested on BluePill F103C6 +* __STM32 boards__ - tested on BluePill F103C8, STM32VL-Discovery F100RB (with [custom definitions](https://github.com/stm32duino/wiki/wiki/Custom-definitions) in variant.h) * __SAMD boards__ - Arduino Zero ### In development: From 5cf9c50b013b4b5277c4c9a977133fa1cfd63483 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 08:52:02 +0200 Subject: [PATCH 06/83] [SX126x] Added module presence check (#48) --- src/modules/SX126x.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 982acaf8..6d0e8fce 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -726,7 +726,7 @@ int16_t SX126x::setSyncWord(uint8_t* syncWord, uint8_t len) { return(state); } -int16_t SX126x::setSyncBits(uint8_t *syncWord, uint8_t bitsLen) { +int16_t SX126x::setSyncBits(uint8_t *syncWord, uint8_t bitsLen) { // check active modem if(getPacketType() != SX126X_PACKET_TYPE_GFSK) { return(ERR_WRONG_MODEM); @@ -741,7 +741,7 @@ int16_t SX126x::setSyncBits(uint8_t *syncWord, uint8_t bitsLen) { if ((bitsLen % 8) != 0) { bytesLen++; } - + // write sync word int16_t state = writeRegister(SX126X_REG_SYNC_WORD_0, syncWord, bytesLen); if(state != ERR_NONE) { @@ -1297,7 +1297,8 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d // check status if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || - ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { + ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED) || + in == 0x00 || in == 0xFF) { status = in; } } @@ -1313,7 +1314,8 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d // check status if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || - ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { + ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED) || + in == 0x00 || in == 0xFF) { status = in; } for(uint8_t n = 0; n < numBytes; n++) { @@ -1349,6 +1351,9 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d return(ERR_SPI_CMD_INVALID); case SX126X_STATUS_CMD_FAILED: return(ERR_SPI_CMD_FAILED); + case(0x00): + case(0xFF): + return(ERR_CHIP_NOT_FOUND); default: return(ERR_NONE); } From cd169056b1d816edfab6cf5658cc05ae2de7e745 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 10:29:08 +0200 Subject: [PATCH 07/83] [SX126x] Fixed units in example --- examples/SX126x/SX126x_Receive/SX126x_Receive.ino | 2 +- .../SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino index 1e582158..9bb83c9d 100644 --- a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino +++ b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino @@ -89,7 +89,7 @@ void loop() { // of the last received packet Serial.print(F("[SX1262] SNR:\t\t")); Serial.print(lora.getSNR()); - Serial.println(F(" dBm")); + Serial.println(F(" dB")); } else if (state == ERR_RX_TIMEOUT) { // timeout occurred while waiting for a packet diff --git a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino index 3de2873e..3be3d64b 100644 --- a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino +++ b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino @@ -136,7 +136,7 @@ void loop() { // print SNR (Signal-to-Noise Ratio) Serial.print(F("[SX1262] SNR:\t\t")); Serial.print(lora.getSNR()); - Serial.println(F(" dBm")); + Serial.println(F(" dB")); } else if (state == ERR_CRC_MISMATCH) { // packet was received, but is malformed From c4d9fe3a3753f27945f2f7c1a73d27a8f758cec4 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 10:29:49 +0200 Subject: [PATCH 08/83] [SX127x] Fixed units in example --- examples/SX127x/SX127x_Receive/SX127x_Receive.ino | 2 +- .../SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/SX127x/SX127x_Receive/SX127x_Receive.ino b/examples/SX127x/SX127x_Receive/SX127x_Receive.ino index 9aed5e3a..c3c3392e 100644 --- a/examples/SX127x/SX127x_Receive/SX127x_Receive.ino +++ b/examples/SX127x/SX127x_Receive/SX127x_Receive.ino @@ -88,7 +88,7 @@ void loop() { // of the last received packet Serial.print(F("[SX1278] SNR:\t\t\t")); Serial.print(lora.getSNR()); - Serial.println(F(" dBm")); + Serial.println(F(" dB")); // print frequency error // of the last received packet diff --git a/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino b/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino index 10c74b09..3fd250da 100644 --- a/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino +++ b/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino @@ -135,7 +135,7 @@ void loop() { // print SNR (Signal-to-Noise Ratio) Serial.print(F("[SX1278] SNR:\t\t")); Serial.print(lora.getSNR()); - Serial.println(F(" dBm")); + Serial.println(F(" dB")); // print frequency error Serial.print(F("[SX1278] Frequency error:\t")); From c093d34c9104570fd9c774bda520e2863ebb8358 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 10:30:50 +0200 Subject: [PATCH 09/83] Updated debug macros --- src/Module.cpp | 70 ++++++++-------- src/TypeDef.h | 19 ++++- src/modules/CC1101.cpp | 4 +- src/modules/ESP8266.cpp | 2 +- src/modules/RF69.cpp | 4 +- src/modules/SX1231.cpp | 30 +++---- src/modules/SX126x.cpp | 50 +++++------ src/modules/SX1272.cpp | 12 +-- src/modules/SX1278.cpp | 12 +-- src/modules/SX127x.cpp | 8 +- src/modules/XBee.cpp | 182 ++++++++++++++++++++-------------------- src/modules/nRF24.cpp | 2 +- src/protocols/Morse.cpp | 8 +- 13 files changed, 207 insertions(+), 196 deletions(-) diff --git a/src/Module.cpp b/src/Module.cpp index 8b87cf2c..5ca9a77d 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -120,20 +120,20 @@ bool Module::ATgetResponse() { while (millis() - start < _ATtimeout) { while(ModuleSerial->available() > 0) { char c = ModuleSerial->read(); - DEBUG_PRINT(c); + RADIOLIB_VERBOSE_PRINT(c); data += c; } if(data.indexOf("OK") != -1) { - DEBUG_PRINTLN(); + RADIOLIB_VERBOSE_PRINTLN(); return(true); } else if (data.indexOf("ERROR") != -1) { - DEBUG_PRINTLN(); + RADIOLIB_VERBOSE_PRINTLN(); return(false); } } - DEBUG_PRINTLN(); + RADIOLIB_VERBOSE_PRINTLN(); return(false); } @@ -170,24 +170,24 @@ int16_t Module::SPIsetRegValue(uint8_t reg, uint8_t value, uint8_t msb, uint8_t } // check failed, print debug info - DEBUG_PRINTLN(); - DEBUG_PRINT(F("address:\t0x")); - DEBUG_PRINTLN(reg, HEX); - DEBUG_PRINT(F("bits:\t\t")); - DEBUG_PRINT(msb); - DEBUG_PRINT(' '); - DEBUG_PRINTLN(lsb); - DEBUG_PRINT(F("value:\t\t0b")); - DEBUG_PRINTLN(value, BIN); - DEBUG_PRINT(F("current:\t0b")); - DEBUG_PRINTLN(currentValue, BIN); - DEBUG_PRINT(F("mask:\t\t0b")); - DEBUG_PRINTLN(mask, BIN); - DEBUG_PRINT(F("new:\t\t0b")); - DEBUG_PRINTLN(newValue, BIN); - DEBUG_PRINT(F("read:\t\t0b")); - DEBUG_PRINTLN(readValue, BIN); - DEBUG_PRINTLN(); + RADIOLIB_DEBUG_PRINTLN(); + RADIOLIB_DEBUG_PRINT(F("address:\t0x")); + RADIOLIB_DEBUG_PRINTLN(reg, HEX); + RADIOLIB_DEBUG_PRINT(F("bits:\t\t")); + RADIOLIB_DEBUG_PRINT(msb); + RADIOLIB_DEBUG_PRINT(' '); + RADIOLIB_DEBUG_PRINTLN(lsb); + RADIOLIB_DEBUG_PRINT(F("value:\t\t0b")); + RADIOLIB_DEBUG_PRINTLN(value, BIN); + RADIOLIB_DEBUG_PRINT(F("current:\t0b")); + RADIOLIB_DEBUG_PRINTLN(currentValue, BIN); + RADIOLIB_DEBUG_PRINT(F("mask:\t\t0b")); + RADIOLIB_DEBUG_PRINTLN(mask, BIN); + RADIOLIB_DEBUG_PRINT(F("new:\t\t0b")); + RADIOLIB_DEBUG_PRINTLN(newValue, BIN); + RADIOLIB_DEBUG_PRINT(F("read:\t\t0b")); + RADIOLIB_DEBUG_PRINTLN(readValue, BIN); + RADIOLIB_DEBUG_PRINTLN(); return(ERR_SPI_WRITE_FAILED); } @@ -219,30 +219,30 @@ void Module::SPItransfer(uint8_t cmd, uint8_t reg, uint8_t* dataOut, uint8_t* da // send SPI register address with access command _spi->transfer(reg | cmd); - DEBUG_PRINT(reg | cmd, HEX); - DEBUG_PRINT('\t'); - DEBUG_PRINT(reg | cmd, BIN); - DEBUG_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(reg | cmd, HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(reg | cmd, BIN); + RADIOLIB_VERBOSE_PRINT('\t'); // send data or get response if(cmd == SPIwriteCommand) { for(size_t n = 0; n < numBytes; n++) { _spi->transfer(dataOut[n]); - DEBUG_PRINT(dataOut[n], HEX); - DEBUG_PRINT('\t'); - DEBUG_PRINT(dataOut[n], BIN); - DEBUG_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(dataOut[n], BIN); + RADIOLIB_VERBOSE_PRINT('\t'); } } else if (cmd == SPIreadCommand) { for(size_t n = 0; n < numBytes; n++) { dataIn[n] = _spi->transfer(0x00); - DEBUG_PRINT(dataIn[n], HEX); - DEBUG_PRINT('\t'); - DEBUG_PRINT(dataIn[n], BIN); - DEBUG_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(dataIn[n], BIN); + RADIOLIB_VERBOSE_PRINT('\t'); } } - DEBUG_PRINTLN(); + RADIOLIB_VERBOSE_PRINTLN(); // release CS digitalWrite(_cs, HIGH); diff --git a/src/TypeDef.h b/src/TypeDef.h index 5359cb82..a3f89aed 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -7,14 +7,25 @@ #error "Unsupported Arduino version (< 1.0.0)" #endif +#define RADIOLIB_DEBUG_PORT Serial + //#define RADIOLIB_DEBUG +//#define RADIOLIB_VERBOSE #ifdef RADIOLIB_DEBUG - #define DEBUG_PRINT(...) { Serial.print(__VA_ARGS__); } - #define DEBUG_PRINTLN(...) { Serial.println(__VA_ARGS__); } + #define RADIOLIB_DEBUG_PRINT(...) { RADIOLIB_DEBUG_PORT.print(__VA_ARGS__); } + #define RADIOLIB_DEBUG_PRINTLN(...) { RADIOLIB_DEBUG_PORT.println(__VA_ARGS__); } #else - #define DEBUG_PRINT(...) {} - #define DEBUG_PRINTLN(...) {} + #define RADIOLIB_DEBUG_PRINT(...) {} + #define RADIOLIB_DEBUG_PRINTLN(...) {} +#endif + +#ifdef RADIOLIB_VERBOSE + #define RADIOLIB_VERBOSE_PRINT(...) { RADIOLIB_DEBUG_PORT.print(__VA_ARGS__); } + #define RADIOLIB_VERBOSE_PRINTLN(...) { RADIOLIB_DEBUG_PORT.println(__VA_ARGS__); } +#else + #define RADIOLIB_VERBOSE_PRINT(...) {} + #define RADIOLIB_VERBOSE_PRINTLN(...) {} #endif /*! diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index 3bf6d4f9..42fe5d7f 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -36,11 +36,11 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po } if(!flagFound) { - DEBUG_PRINTLN(F("No CC1101 found!")); + RADIOLIB_DEBUG_PRINTLN(F("No CC1101 found!")); SPI.end(); return(ERR_CHIP_NOT_FOUND); } else { - DEBUG_PRINTLN(F("Found CC1101! (match by CC1101_REG_VERSION == 0x14)")); + RADIOLIB_DEBUG_PRINTLN(F("Found CC1101! (match by CC1101_REG_VERSION == 0x14)")); } // configure settings not accessible by API diff --git a/src/modules/ESP8266.cpp b/src/modules/ESP8266.cpp index d34e0d57..7f7e47b5 100644 --- a/src/modules/ESP8266.cpp +++ b/src/modules/ESP8266.cpp @@ -173,7 +173,7 @@ size_t ESP8266::receive(uint8_t* data, size_t len, uint32_t timeout) { while((millis() - start < timeout) && (i < len)) { while(_mod->ModuleSerial->available() > 0) { uint8_t b = _mod->ModuleSerial->read(); - DEBUG_PRINT(b); + RADIOLIB_DEBUG_PRINT(b); data[i] = b; i++; } diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 951e6aba..8e7f56b0 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -35,11 +35,11 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe } if(!flagFound) { - DEBUG_PRINTLN(F("No RF69 found!")); + RADIOLIB_DEBUG_PRINTLN(F("No RF69 found!")); SPI.end(); return(ERR_CHIP_NOT_FOUND); } else { - DEBUG_PRINTLN(F("Found RF69! (match by RF69_REG_VERSION == 0x24)")); + RADIOLIB_DEBUG_PRINTLN(F("Found RF69! (match by RF69_REG_VERSION == 0x24)")); } // configure settings not accessible by API diff --git a/src/modules/SX1231.cpp b/src/modules/SX1231.cpp index 23c15cd4..63767987 100644 --- a/src/modules/SX1231.cpp +++ b/src/modules/SX1231.cpp @@ -7,7 +7,7 @@ SX1231::SX1231(Module* mod) : RF69(mod) { int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { // set module properties _mod->init(USE_SPI, INT_BOTH); - + // try to find the SX1231 chip uint8_t i = 0; bool flagFound = false; @@ -21,7 +21,7 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po Serial.print(F("SX127x not found! (")); Serial.print(i + 1); Serial.print(F(" of 10 tries) SX127X_REG_VERSION == ")); - + char buffHex[7]; sprintf(buffHex, "0x%04X", version); Serial.print(buffHex); @@ -32,55 +32,55 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po i++; } } - + if(!flagFound) { - DEBUG_PRINTLN(F("No SX1231 found!")); + RADIOLIB_DEBUG_PRINTLN(F("No SX1231 found!")); SPI.end(); return(ERR_CHIP_NOT_FOUND); } else { - DEBUG_PRINTLN(F("Found SX1231!")); + RADIOLIB_DEBUG_PRINTLN(F("Found SX1231!")); } - + // configure settings not accessible by API int16_t state = config(); if(state != ERR_NONE) { return(state); } - + // configure publicly accessible settings state = setFrequency(freq); if(state != ERR_NONE) { return(state); } - + _rxBw = 125.0; state = setBitRate(br); if(state != ERR_NONE) { return(state); } - + state = setRxBandwidth(rxBw); if(state != ERR_NONE) { return(state); } - + state = setFrequencyDeviation(freqDev); if(state != ERR_NONE) { return(state); } - + state = setOutputPower(power); if(state != ERR_NONE) { return(state); } - + // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library uint8_t syncWord[] = {0x2D, 0x01}; state = setSyncWord(syncWord, 2); if(state != ERR_NONE) { return(state); } - + // SX1231 V2a only if(_chipRevision == SX1231_CHIP_REVISION_2_A) { // modify default OOK threshold value @@ -88,13 +88,13 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po if(state != ERR_NONE) { return(state); } - + // enable OCP with 95 mA limit state = _mod->SPIsetRegValue(RF69_REG_OCP, RF69_OCP_ON | RF69_OCP_TRIM, 4, 0); if(state != ERR_NONE) { return(state); } } - + return(ERR_NONE); } diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 6d0e8fce..0d36f05e 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -172,9 +172,9 @@ int16_t SX126x::transmit(uint8_t* data, size_t len, uint8_t addr) { return(ERR_UNKNOWN); } - DEBUG_PRINT(F("Timeout in ")); - DEBUG_PRINT(timeout); - DEBUG_PRINTLN(F(" us")); + RADIOLIB_DEBUG_PRINT(F("Timeout in ")); + RADIOLIB_DEBUG_PRINT(timeout); + RADIOLIB_DEBUG_PRINTLN(F(" us")); // start transmission state = startTransmit(data, len, addr); @@ -236,9 +236,9 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { return(ERR_UNKNOWN); } - DEBUG_PRINT(F("Timeout in ")); - DEBUG_PRINT(timeout); - DEBUG_PRINTLN(F(" us")); + RADIOLIB_DEBUG_PRINT(F("Timeout in ")); + RADIOLIB_DEBUG_PRINT(timeout); + RADIOLIB_DEBUG_PRINTLN(F(" us")); // start reception uint32_t timeoutValue = (uint32_t)((float)timeout / 15.625); @@ -1107,9 +1107,9 @@ int16_t SX126x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t // calculate symbol length and enable low data rate optimization, if needed if(ldro == 0xFF) { float symbolLength = (float)(uint32_t(1) << _sf) / (float)_bwKhz; - DEBUG_PRINT("Symbol length: "); - DEBUG_PRINT(symbolLength); - DEBUG_PRINTLN(" ms"); + RADIOLIB_DEBUG_PRINT("Symbol length: "); + RADIOLIB_DEBUG_PRINT(symbolLength); + RADIOLIB_DEBUG_PRINTLN(" ms"); if(symbolLength >= 16.0) { _ldro = SX126X_LORA_LOW_DATA_RATE_OPTIMIZE_ON; } else { @@ -1277,8 +1277,8 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d // send command byte(s) for(uint8_t n = 0; n < cmdLen; n++) { spi->transfer(cmd[n]); - DEBUG_PRINT(cmd[n], HEX); - DEBUG_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(cmd[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); } // variable to save error during SPI transfer @@ -1289,10 +1289,10 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d for(uint8_t n = 0; n < numBytes; n++) { // send byte uint8_t in = spi->transfer(dataOut[n]); - DEBUG_PRINT(dataOut[n], HEX); - DEBUG_PRINT('\t'); - DEBUG_PRINT(in, HEX); - DEBUG_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(in, HEX); + RADIOLIB_VERBOSE_PRINT('\t'); // check status if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || @@ -1302,14 +1302,14 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d status = in; } } - DEBUG_PRINTLN(); + RADIOLIB_VERBOSE_PRINT(); } else { // skip the first byte for read-type commands (status-only) uint8_t in = spi->transfer(SX126X_CMD_NOP); - DEBUG_PRINT(SX126X_CMD_NOP, HEX); - DEBUG_PRINT('\t'); - DEBUG_PRINT(in, HEX); - DEBUG_PRINT('\t') + RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(in, HEX); + RADIOLIB_VERBOSE_PRINT('\t') // check status if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || @@ -1320,12 +1320,12 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d } for(uint8_t n = 0; n < numBytes; n++) { dataIn[n] = spi->transfer(SX126X_CMD_NOP); - DEBUG_PRINT(SX126X_CMD_NOP, HEX); - DEBUG_PRINT('\t'); - DEBUG_PRINT(dataIn[n], HEX); - DEBUG_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); } - DEBUG_PRINTLN(); + RADIOLIB_VERBOSE_PRINT(); } // stop transfer diff --git a/src/modules/SX1272.cpp b/src/modules/SX1272.cpp index f592cff9..86d058d7 100644 --- a/src/modules/SX1272.cpp +++ b/src/modules/SX1272.cpp @@ -125,9 +125,9 @@ int16_t SX1272::setBandwidth(float bw) { // calculate symbol length and set low data rate optimization, if needed float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw; - DEBUG_PRINT("Symbol length: "); - DEBUG_PRINT(symbolLength); - DEBUG_PRINTLN(" ms"); + RADIOLIB_DEBUG_PRINT("Symbol length: "); + RADIOLIB_DEBUG_PRINT(symbolLength); + RADIOLIB_DEBUG_PRINTLN(" ms"); if(symbolLength >= 16.0) { state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0); } else { @@ -179,9 +179,9 @@ int16_t SX1272::setSpreadingFactor(uint8_t sf) { // calculate symbol length and set low data rate optimization, if needed float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw; - DEBUG_PRINT("Symbol length: "); - DEBUG_PRINT(symbolLength); - DEBUG_PRINTLN(" ms"); + RADIOLIB_DEBUG_PRINT("Symbol length: "); + RADIOLIB_DEBUG_PRINT(symbolLength); + RADIOLIB_DEBUG_PRINTLN(" ms"); if(symbolLength >= 16.0) { state = _mod->SPIsetRegValue(SX127X_REG_MODEM_CONFIG_1, SX1272_LOW_DATA_RATE_OPT_ON, 0, 0); } else { diff --git a/src/modules/SX1278.cpp b/src/modules/SX1278.cpp index 7f6ad28a..64f2245a 100644 --- a/src/modules/SX1278.cpp +++ b/src/modules/SX1278.cpp @@ -195,9 +195,9 @@ int16_t SX1278::setBandwidth(float bw) { // calculate symbol length and set low data rate optimization, if needed float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw; - DEBUG_PRINT("Symbol length: "); - DEBUG_PRINT(symbolLength); - DEBUG_PRINTLN(" ms"); + RADIOLIB_DEBUG_PRINT("Symbol length: "); + RADIOLIB_DEBUG_PRINT(symbolLength); + RADIOLIB_DEBUG_PRINTLN(" ms"); if(symbolLength >= 16.0) { state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3); } else { @@ -249,9 +249,9 @@ int16_t SX1278::setSpreadingFactor(uint8_t sf) { // calculate symbol length and set low data rate optimization, if needed float symbolLength = (float)(uint32_t(1) << SX127x::_sf) / (float)SX127x::_bw; - DEBUG_PRINT("Symbol length: "); - DEBUG_PRINT(symbolLength); - DEBUG_PRINTLN(" ms"); + RADIOLIB_DEBUG_PRINT("Symbol length: "); + RADIOLIB_DEBUG_PRINT(symbolLength); + RADIOLIB_DEBUG_PRINTLN(" ms"); if(symbolLength >= 16.0) { state = _mod->SPIsetRegValue(SX1278_REG_MODEM_CONFIG_3, SX1278_LOW_DATA_RATE_OPT_ON, 3, 3); } else { diff --git a/src/modules/SX127x.cpp b/src/modules/SX127x.cpp index 31d63ec1..c0739db9 100644 --- a/src/modules/SX127x.cpp +++ b/src/modules/SX127x.cpp @@ -11,11 +11,11 @@ int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimi // try to find the SX127x chip if(!SX127x::findChip(chipVersion)) { - DEBUG_PRINTLN(F("No SX127x found!")); + RADIOLIB_DEBUG_PRINTLN(F("No SX127x found!")); _mod->term(); return(ERR_CHIP_NOT_FOUND); } else { - DEBUG_PRINTLN(F("Found SX127x!")); + RADIOLIB_DEBUG_PRINTLN(F("Found SX127x!")); } // check active modem @@ -55,11 +55,11 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB // try to find the SX127x chip if(!SX127x::findChip(chipVersion)) { - DEBUG_PRINTLN(F("No SX127x found!")); + RADIOLIB_DEBUG_PRINTLN(F("No SX127x found!")); _mod->term(); return(ERR_CHIP_NOT_FOUND); } else { - DEBUG_PRINTLN(F("Found SX127x!")); + RADIOLIB_DEBUG_PRINTLN(F("Found SX127x!")); } // check currently active modem diff --git a/src/modules/XBee.cpp b/src/modules/XBee.cpp index 7c31a588..9be17456 100644 --- a/src/modules/XBee.cpp +++ b/src/modules/XBee.cpp @@ -12,13 +12,13 @@ int16_t XBee::begin(long speed) { // set module properties _mod->baudrate = speed; _mod->init(USE_UART, INT_1); - + // reset module reset(); - + // empty UART buffer (garbage data) _mod->ATemptyBuffer(); - + // try to find the XBee bool flagFound = false; uint8_t i = 0; @@ -26,29 +26,29 @@ int16_t XBee::begin(long speed) { // hardware reset should return 2 modem status frames - 1st status 0x00, second status 0x06 int16_t state = readApiFrame(0x00, 1, 2000); readApiFrame(0x00, 1, 2000); - + if(state == ERR_NONE) { flagFound = true; } else { - DEBUG_PRINT(F("XBee not found! (")); - DEBUG_PRINT(i + 1); - DEBUG_PRINT(F(" of 10 tries) STATE == ")); - DEBUG_PRINTLN(state); - DEBUG_PRINTLN(F("Resetting ...")); + RADIOLIB_DEBUG_PRINT(F("XBee not found! (")); + RADIOLIB_DEBUG_PRINT(i + 1); + RADIOLIB_DEBUG_PRINT(F(" of 10 tries) STATE == ")); + RADIOLIB_DEBUG_PRINTLN(state); + RADIOLIB_DEBUG_PRINTLN(F("Resetting ...")); reset(); delay(1000); _mod->ATemptyBuffer(); i++; } } - + if(!flagFound) { - DEBUG_PRINTLN(F("No XBee found!")); + RADIOLIB_DEBUG_PRINTLN(F("No XBee found!")); return(ERR_CMD_MODE_FAILED); } else { - DEBUG_PRINTLN(F("Found XBee!")); + RADIOLIB_DEBUG_PRINTLN(F("Found XBee!")); } - + return(ERR_NONE); } @@ -75,12 +75,12 @@ int16_t XBee::transmit(uint8_t* dest, uint8_t* destNetwork, const char* payload, cmd[10] = radius; cmd[11] = 0x01; // options: no retries memcpy(cmd + 12, payload, payloadLen); - + // send frame uint8_t frameID = _frameID++; sendApiFrame(XBEE_API_FRAME_ZIGBEE_TRANSMIT_REQUEST, frameID, cmd, dataLen); delete[] cmd; - + // get response code return(readApiFrame(frameID, 5)); } @@ -90,35 +90,35 @@ size_t XBee::available() { size_t serialBytes = _mod->ModuleSerial->available(); if(serialBytes < 3) { return(0); - } - + } + uint8_t header[3]; if(!_frameHeaderProcessed) { // read frame header for(uint8_t i = 0; i < 3; i++) { header[i] = _mod->ModuleSerial->read(); } - + // check if we received API frame if(header[0] != XBEE_API_START) { return(0); } - + // get expected frame length _frameLength = ((header[1] << 8) | header[2]) + 1; _frameHeaderProcessed = true; } - + // check if the header is complete if(serialBytes < _frameLength) { return(0); } - + uint8_t* frame = new uint8_t[_frameLength]; //24 for(size_t i = 0; i < _frameLength; i++) { frame[i] = _mod->ModuleSerial->read(); } - + // save packet source and data size_t payloadLength = _frameLength - 12; delete[] _packetData; @@ -126,11 +126,11 @@ size_t XBee::available() { memcpy(_packetData, frame + 12, payloadLength - 1); _packetData[payloadLength - 1] = '\0'; memcpy(_packetSource, frame + 1, 8); - + delete[] frame; _frameLength = 0; _frameHeaderProcessed = false; - + // return number of bytes in payload return(payloadLength); } @@ -153,23 +153,23 @@ int16_t XBee::setPanId(uint8_t* panId) { uint8_t cmd[10]; memcpy(cmd, "ID", 2); memcpy(cmd + 2, panId, 8); - + // send frame uint8_t frameID = _frameID++; sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, cmd, 10); - + // get response code int16_t state = readApiFrame(frameID, 4); if(state != ERR_NONE) { return(state); } - + // confirm changes return(confirmChanges()); } XBeeSerial::XBeeSerial(Module* mod) : ISerial(mod) { - + } int16_t XBeeSerial::begin(long speed) { @@ -177,24 +177,24 @@ int16_t XBeeSerial::begin(long speed) { _mod->AtLineFeed = "\r"; _mod->baudrate = speed; _mod->init(USE_UART, INT_NONE); - + // empty UART buffer (garbage data) _mod->ATemptyBuffer(); - + // enter command mode - DEBUG_PRINTLN(F("Entering command mode ...")); + RADIOLIB_DEBUG_PRINTLN(F("Entering command mode ...")); if(!enterCmdMode()) { return(ERR_CMD_MODE_FAILED); } - + // test AT setup - DEBUG_PRINTLN(F("Sending test command ...")); + RADIOLIB_DEBUG_PRINTLN(F("Sending test command ...")); if(!_mod->ATsendCommand("AT")) { return(ERR_AT_FAILED); } - + // exit command mode - DEBUG_PRINTLN(F("Exiting command mode ...")); + RADIOLIB_DEBUG_PRINTLN(F("Exiting command mode ...")); if(!_mod->ATsendCommand("ATCN")) { return(ERR_AT_FAILED); } @@ -212,13 +212,13 @@ void XBeeSerial::reset() { int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, const char* destinationAddressLow) { // enter command mode - DEBUG_PRINTLN(F("Entering command mode ...")); + RADIOLIB_DEBUG_PRINTLN(F("Entering command mode ...")); if(!enterCmdMode()) { return(ERR_CMD_MODE_FAILED); } - + // set higher address bytes - DEBUG_PRINTLN(F("Setting address (high) ...")); + RADIOLIB_DEBUG_PRINTLN(F("Setting address (high) ...")); char* addressHigh = new char[strlen(destinationAddressHigh) + 4]; strcpy(addressHigh, "ATDH"); strcat(addressHigh, destinationAddressHigh); @@ -227,9 +227,9 @@ int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, co if(!res) { return(ERR_AT_FAILED); } - + // set lower address bytes - DEBUG_PRINTLN(F("Setting address (low) ...")); + RADIOLIB_DEBUG_PRINTLN(F("Setting address (low) ...")); char* addressLow = new char[strlen(destinationAddressLow) + 4]; strcpy(addressLow, "ATDL"); strcat(addressLow, destinationAddressLow); @@ -238,25 +238,25 @@ int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, co if(!res) { return(ERR_AT_FAILED); } - + // exit command mode - DEBUG_PRINTLN(F("Exiting command mode ...")); + RADIOLIB_DEBUG_PRINTLN(F("Exiting command mode ...")); if(!_mod->ATsendCommand("ATCN")) { return(ERR_AT_FAILED); } - + return(ERR_NONE); } int16_t XBeeSerial::setPanId(const char* panId) { // enter command mode - DEBUG_PRINTLN(F("Entering command mode ...")); + RADIOLIB_DEBUG_PRINTLN(F("Entering command mode ...")); if(!enterCmdMode()) { return(ERR_CMD_MODE_FAILED); } - + // set PAN ID - DEBUG_PRINTLN(F("Setting PAN ID ...")); + RADIOLIB_DEBUG_PRINTLN(F("Setting PAN ID ...")); char* cmd = new char[strlen(panId) + 4]; strcpy(cmd, "ATID"); strcat(cmd, panId); @@ -265,40 +265,40 @@ int16_t XBeeSerial::setPanId(const char* panId) { if(!res) { return(ERR_AT_FAILED); } - + // exit command mode - DEBUG_PRINTLN(F("Exiting command mode ...")); + RADIOLIB_DEBUG_PRINTLN(F("Exiting command mode ...")); if(!_mod->ATsendCommand("ATCN")) { return(ERR_AT_FAILED); } - + return(ERR_NONE); } bool XBeeSerial::enterCmdMode() { for(uint8_t i = 0; i < 10; i++) { delay(1000); - + _mod->ModuleSerial->write('+'); _mod->ModuleSerial->write('+'); _mod->ModuleSerial->write('+'); - + delay(1000); - + if(_mod->ATgetResponse()) { return(true); } else { - DEBUG_PRINT(F("Unable to enter command mode! (")); - DEBUG_PRINT(i + 1); - DEBUG_PRINTLN(F(" of 10 tries)")); - + RADIOLIB_DEBUG_PRINT(F("Unable to enter command mode! (")); + RADIOLIB_DEBUG_PRINT(i + 1); + RADIOLIB_DEBUG_PRINTLN(F(" of 10 tries)")); + reset(); - + _mod->ATsendCommand("ATCN"); } } - - DEBUG_PRINTLN(F("Terminated, check your wiring. Is AT FW uploaded?")); + + RADIOLIB_DEBUG_PRINTLN(F("Terminated, check your wiring. Is AT FW uploaded?")); return(false); } @@ -306,23 +306,23 @@ int16_t XBee::confirmChanges() { // save changes to non-volatile memory uint8_t frameID = _frameID++; sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "WR"); - + // get response code int16_t state = readApiFrame(frameID, 4); if(state != ERR_NONE) { return(state); } - + // apply changes frameID = _frameID++; sendApiFrame(XBEE_API_FRAME_AT_COMMAND_QUEUE, frameID, "AC"); - + // get response code state = readApiFrame(frameID, 4); if(state != ERR_NONE) { return(state); } - + return(state); } @@ -334,42 +334,42 @@ void XBee::sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length // build the API frame size_t frameLength = 1 + 2 + length + 1 + 2; uint8_t* frame = new uint8_t[frameLength]; - + frame[0] = 0x7E; // start delimiter frame[1] = ((length + 2) & 0xFF00) >> 8; // length MSB frame[2] = (length + 2) & 0x00FF; // length LSB frame[3] = type; // frame type frame[4] = id; // frame ID memcpy(frame + 5, data, length); // data - + // calculate the checksum uint8_t checksum = 0; for(uint16_t i = 3; i < frameLength - 1; i++) { checksum += frame[i]; } frame[5 + length] = 0xFF - checksum; - + // send the frame for(uint16_t i = 0; i < frameLength; i++) { _mod->ModuleSerial->write(frame[i]); } - + // deallocate memory delete[] frame; } int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) { // TODO: modemStatus frames may be sent at any time, interfering with frame parsing. Add check to make sure this does not happen. - + // get number of bytes in response (must be enough to read the length field uint16_t numBytes = getNumBytes(timeout/2, 3); if(numBytes == 0) { return(ERR_FRAME_NO_RESPONSE); } - + // checksum byte is not included in length field numBytes++; - + // wait until all response bytes are available (5s timeout) uint32_t start = millis(); while(_mod->ModuleSerial->available() < (int16_t)numBytes) { @@ -377,37 +377,37 @@ int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) { return(ERR_FRAME_MALFORMED); } } - DEBUG_PRINT(F("frame data field length: ")); - DEBUG_PRINTLN(numBytes); - + RADIOLIB_DEBUG_PRINT(F("frame data field length: ")); + RADIOLIB_DEBUG_PRINTLN(numBytes); + // read the response uint8_t* resp = new uint8_t[numBytes]; for(uint16_t i = 0; i < numBytes; i++) { resp[i] = _mod->ModuleSerial->read(); } - - // verify checksum + + // verify checksum uint8_t checksum = 0; for(uint16_t i = 0; i < numBytes; i++) { - DEBUG_PRINT(resp[i], HEX); - DEBUG_PRINT('\t'); + RADIOLIB_DEBUG_PRINT(resp[i], HEX); + RADIOLIB_DEBUG_PRINT('\t'); checksum += resp[i]; } - DEBUG_PRINTLN(); + RADIOLIB_DEBUG_PRINTLN(); if(checksum != 0xFF) { - DEBUG_PRINTLN(checksum, HEX); + RADIOLIB_DEBUG_PRINTLN(checksum, HEX); return(ERR_FRAME_INCORRECT_CHECKSUM); } - + // check frame ID if(resp[1] != frameID) { - DEBUG_PRINT(F("received frame ID: ")); - DEBUG_PRINTLN(resp[1]); - DEBUG_PRINT(F("expected frame ID: ")); - DEBUG_PRINTLN(frameID); + RADIOLIB_DEBUG_PRINT(F("received frame ID: ")); + RADIOLIB_DEBUG_PRINTLN(resp[1]); + RADIOLIB_DEBUG_PRINT(F("expected frame ID: ")); + RADIOLIB_DEBUG_PRINTLN(frameID); return(ERR_FRAME_UNEXPECTED_ID); } - + // codePos does not include start delimiter and frame ID uint8_t code = resp[codePos]; delete[] resp; @@ -422,21 +422,21 @@ uint16_t XBee::getNumBytes(uint32_t timeout, size_t minBytes) { return(0); } } - + // read response uint8_t resp[3]; uint8_t i = 0; - DEBUG_PRINT(F("reading frame length: ")); + RADIOLIB_DEBUG_PRINT(F("reading frame length: ")); while(_mod->ModuleSerial->available() > 0) { uint8_t b = _mod->ModuleSerial->read(); - DEBUG_PRINT(b, HEX); - DEBUG_PRINT('\t'); + RADIOLIB_DEBUG_PRINT(b, HEX); + RADIOLIB_DEBUG_PRINT('\t'); resp[i++] = b; if(i == 3) { break; } } - DEBUG_PRINTLN(); - + RADIOLIB_DEBUG_PRINTLN(); + return((resp[1] << 8) | resp[2]); } diff --git a/src/modules/nRF24.cpp b/src/modules/nRF24.cpp index 0c776ce1..55c47d73 100644 --- a/src/modules/nRF24.cpp +++ b/src/modules/nRF24.cpp @@ -20,7 +20,7 @@ int16_t nRF24::begin(int16_t freq, int16_t dataRate, int8_t power, uint8_t addrW // check SPI connection int16_t val = _mod->SPIgetRegValue(NRF24_REG_SETUP_AW); if(!((val >= 1) && (val <= 3))) { - DEBUG_PRINTLN(F("No nRF24 found!")); + RADIOLIB_DEBUG_PRINTLN(F("No nRF24 found!")); _mod->term(); return(ERR_CHIP_NOT_FOUND); } diff --git a/src/protocols/Morse.cpp b/src/protocols/Morse.cpp index e874c722..83137abf 100644 --- a/src/protocols/Morse.cpp +++ b/src/protocols/Morse.cpp @@ -119,9 +119,9 @@ size_t MorseClient::write(uint8_t b) { // check if the requested code was found in the array if(found) { - DEBUG_PRINT(mc.c); - DEBUG_PRINT('\t'); - DEBUG_PRINTLN(mc.m); + RADIOLIB_DEBUG_PRINT(mc.c); + RADIOLIB_DEBUG_PRINT('\t'); + RADIOLIB_DEBUG_PRINTLN(mc.m); // iterate over Morse code representation and output appropriate tones for(uint8_t i = 0; i < strlen(mc.m); i++) { @@ -145,7 +145,7 @@ size_t MorseClient::write(uint8_t b) { } // letter space - DEBUG_PRINTLN(); + RADIOLIB_DEBUG_PRINTLN(); delay(_dotLength * 3); return(1); From 11b501cbc94744c58254e8157307a51097cca80a Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 10:39:20 +0200 Subject: [PATCH 10/83] Added software serial platform macro --- src/Module.cpp | 6 +++--- src/TypeDef.h | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Module.cpp b/src/Module.cpp index 5ca9a77d..8c2e6964 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -7,8 +7,8 @@ Module::Module(int rx, int tx, HardwareSerial* useSer) { _int0 = -1; _int1 = -1; -#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32) - ModuleSerial = useSer; +#if SOFTWARE_SERIAL_UNSUPPORTED + ModuleSerial = useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); #endif @@ -33,7 +33,7 @@ Module::Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi, SPISet _spi = &spi; _spiSettings = spiSettings; -#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32) +#if SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); diff --git a/src/TypeDef.h b/src/TypeDef.h index a3f89aed..e36218ef 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -7,6 +7,9 @@ #error "Unsupported Arduino version (< 1.0.0)" #endif +// the following platforms do not support SoftwareSerial library +#define SOFTWARE_SERIAL_UNSUPPORTED (defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32)) + #define RADIOLIB_DEBUG_PORT Serial //#define RADIOLIB_DEBUG From 9ae3a228948b86f0d72e355dfbae2e9eb1a7183c Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 11:58:06 +0200 Subject: [PATCH 11/83] [SX126x] Fixed presence check --- src/modules/SX126x.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 0d36f05e..8745f41d 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1297,12 +1297,13 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d // check status if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || - ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED) || - in == 0x00 || in == 0xFF) { + ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { status = in; + } else if(in == 0x00 || in == 0xFF) { + status = ERR_CHIP_NOT_FOUND; } } - RADIOLIB_VERBOSE_PRINT(); + RADIOLIB_VERBOSE_PRINTLN(); } else { // skip the first byte for read-type commands (status-only) uint8_t in = spi->transfer(SX126X_CMD_NOP); @@ -1314,9 +1315,10 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d // check status if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || - ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED) || - in == 0x00 || in == 0xFF) { + ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { status = in; + } else if(in == 0x00 || in == 0xFF) { + status = ERR_CHIP_NOT_FOUND; } for(uint8_t n = 0; n < numBytes; n++) { dataIn[n] = spi->transfer(SX126X_CMD_NOP); @@ -1325,7 +1327,7 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX); RADIOLIB_VERBOSE_PRINT('\t'); } - RADIOLIB_VERBOSE_PRINT(); + RADIOLIB_VERBOSE_PRINTLN(); } // stop transfer @@ -1351,8 +1353,7 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d return(ERR_SPI_CMD_INVALID); case SX126X_STATUS_CMD_FAILED: return(ERR_SPI_CMD_FAILED); - case(0x00): - case(0xFF): + case(ERR_CHIP_NOT_FOUND): return(ERR_CHIP_NOT_FOUND); default: return(ERR_NONE); From 1ddc54c229d4270136eef49632d39c71f19746e6 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 12:22:31 +0200 Subject: [PATCH 12/83] [SX126x] Added SX126X_STATUS_SPI_FAILED --- src/modules/SX126x.cpp | 16 ++++++++-------- src/modules/SX126x.h | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 8745f41d..74029d5f 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1294,13 +1294,13 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d RADIOLIB_VERBOSE_PRINT(in, HEX); RADIOLIB_VERBOSE_PRINT('\t'); - // check status - if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || + // check status - SX126X_STATUS_CMD_TIMEOUT is disabled due to regular timeouts + if(//((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { - status = in; + status = in & 0b00001110; } else if(in == 0x00 || in == 0xFF) { - status = ERR_CHIP_NOT_FOUND; + status = SX126X_STATUS_SPI_FAILED; } } RADIOLIB_VERBOSE_PRINTLN(); @@ -1313,12 +1313,12 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d RADIOLIB_VERBOSE_PRINT('\t') // check status - if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || + if(//((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { - status = in; + status = in & 0b00001110; } else if(in == 0x00 || in == 0xFF) { - status = ERR_CHIP_NOT_FOUND; + status = SX126X_STATUS_SPI_FAILED; } for(uint8_t n = 0; n < numBytes; n++) { dataIn[n] = spi->transfer(SX126X_CMD_NOP); @@ -1353,7 +1353,7 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d return(ERR_SPI_CMD_INVALID); case SX126X_STATUS_CMD_FAILED: return(ERR_SPI_CMD_FAILED); - case(ERR_CHIP_NOT_FOUND): + case SX126X_STATUS_SPI_FAILED: return(ERR_CHIP_NOT_FOUND); default: return(ERR_NONE); diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 80a3841e..641d6445 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -289,6 +289,7 @@ #define SX126X_STATUS_CMD_INVALID 0b00001000 // 3 1 invalid SPI command #define SX126X_STATUS_CMD_FAILED 0b00001010 // 3 1 SPI command failed to execute #define SX126X_STATUS_TX_DONE 0b00001100 // 3 1 packet transmission done +#define SX126X_STATUS_SPI_FAILED 0b11111111 // 7 0 SPI transaction failed //SX126X_CMD_GET_PACKET_STATUS #define SX126X_GFSK_RX_STATUS_PREAMBLE_ERR 0b10000000 // 7 7 GFSK Rx status: preamble error From de9c74dd9ad7c70e0ec0412f84ae0a6d61570a68 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 12:22:52 +0200 Subject: [PATCH 13/83] Suppressed unused variable warning --- src/Module.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Module.cpp b/src/Module.cpp index 8c2e6964..438eda19 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -11,6 +11,7 @@ Module::Module(int rx, int tx, HardwareSerial* useSer) { ModuleSerial = useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); + (void)useSer; #endif } @@ -37,6 +38,7 @@ Module::Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi, SPISet ModuleSerial = useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); + (void)useSer; #endif } From d7e2dadb9fa5b5e791e290642fe300ac2c60b917 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 12:23:27 +0200 Subject: [PATCH 14/83] [SX126x] Added note about TCXO modules --- .../SX126x/SX126x_Receive/SX126x_Receive.ino | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino index 9bb83c9d..2f6f8319 100644 --- a/examples/SX126x/SX126x_Receive/SX126x_Receive.ino +++ b/examples/SX126x/SX126x_Receive/SX126x_Receive.ino @@ -53,6 +53,28 @@ void setup() { Serial.println(state); while (true); } + + // NOTE: Some SX126x modules use TCXO + // (Temprature-Compensated Crystal Oscillator). + // To be able to use these modules, TCXO + // control must be enabled by calling + // setTCXO() and specifying the reference + // voltage. + + /* + Serial.print(F("[SX1262] Setting TCXO reference ... ")); + // enable TCXO + // reference voltage: 1.6 V + // timeout: 5000 us + state = lora.setTCXO(1.6); + if (state == ERR_NONE) { + Serial.println(F("success!")); + } else { + Serial.print(F("failed, code ")); + Serial.println(state); + while (true); + } + */ } void loop() { From adcde6fb6cd2e4a8e13345dd0d88f3929a5398da Mon Sep 17 00:00:00 2001 From: jgromes Date: Sat, 28 Sep 2019 12:49:44 +0200 Subject: [PATCH 15/83] Added option to use only static allocations --- src/TypeDef.h | 5 + src/modules/ESP8266.cpp | 42 +++++-- src/modules/SX126x.cpp | 38 ++++-- src/modules/XBee.cpp | 77 +++++++++--- src/modules/XBee.h | 6 +- src/protocols/MQTT.cpp | 216 ++++++++++++++++++++------------ src/protocols/PhysicalLayer.cpp | 42 +++++-- src/protocols/RTTY.cpp | 26 ++-- src/protocols/RTTY.h | 6 +- 9 files changed, 319 insertions(+), 139 deletions(-) diff --git a/src/TypeDef.h b/src/TypeDef.h index e36218ef..2099187c 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -10,6 +10,11 @@ // the following platforms do not support SoftwareSerial library #define SOFTWARE_SERIAL_UNSUPPORTED (defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32)) +// uncomment to enable static-only memory management: no dynamic allocation will be performed +// Warning: Large static arrays will be created in some methods. It is also not advised to send large packets in this mode. +//#define STATIC_ONLY +#define STATIC_ARRAY_SIZE 256 + #define RADIOLIB_DEBUG_PORT Serial //#define RADIOLIB_DEBUG diff --git a/src/modules/ESP8266.cpp b/src/modules/ESP8266.cpp index 7f7e47b5..6160dc9b 100644 --- a/src/modules/ESP8266.cpp +++ b/src/modules/ESP8266.cpp @@ -52,8 +52,12 @@ int16_t ESP8266::join(const char* ssid, const char* password) { // build AT command const char* atStr = "AT+CWJAP_CUR=\""; - uint8_t cmdLen = strlen(atStr) + strlen(ssid) + strlen(password) + 4; - char* cmd = new char[cmdLen + 1]; + #ifdef STATIC_ONLY + char cmd[STATIC_ARRAY_SIZE]; + #else + uint8_t cmdLen = strlen(atStr) + strlen(ssid) + strlen(password) + 4; + char* cmd = new char[cmdLen + 1]; + #endif strcpy(cmd, atStr); strcat(cmd, ssid); strcat(cmd, "\",\""); @@ -62,7 +66,9 @@ int16_t ESP8266::join(const char* ssid, const char* password) { // send command bool res = _mod->ATsendCommand(cmd); - delete[] cmd; + #ifndef STATIC_ONLY + delete[] cmd; + #endif if(!res) { return(ERR_AT_FAILED); } @@ -87,7 +93,11 @@ int16_t ESP8266::openTransportConnection(const char* host, const char* protocol, if((strcmp(protocol, "TCP") == 0) && (tcpKeepAlive > 0)) { cmdLen += strlen(tcpKeepAliveStr) + 1; } - char* cmd = new char[cmdLen + 1]; + #ifdef STATIC_ONLY + char cmd[STATIC_ARRAY_SIZE]; + #else + char* cmd = new char[cmdLen + 1]; + #endif strcpy(cmd, atStr); strcat(cmd, protocol); strcat(cmd, "\",\""); @@ -101,7 +111,9 @@ int16_t ESP8266::openTransportConnection(const char* host, const char* protocol, // send command bool res = _mod->ATsendCommand(cmd); - delete[] cmd; + #ifndef STATIC_ONLY + delete[] cmd; + #endif if(!res) { return(ERR_AT_FAILED); } @@ -122,13 +134,19 @@ int16_t ESP8266::send(const char* data) { char lenStr[8]; itoa(strlen(data), lenStr, 10); const char* atStr = "AT+CIPSEND="; - char* cmd = new char[strlen(atStr) + strlen(lenStr) + 1]; + #ifdef STATIC_ONLY + char cmd[STATIC_ARRAY_SIZE]; + #else + char* cmd = new char[strlen(atStr) + strlen(lenStr) + 1]; + #endif strcpy(cmd, atStr); strcat(cmd, lenStr); // send command bool res = _mod->ATsendCommand(cmd); - delete[] cmd; + #ifndef STATIC_ONLY + delete[] cmd; + #endif if(!res) { return(ERR_AT_FAILED); } @@ -146,13 +164,19 @@ int16_t ESP8266::send(uint8_t* data, uint32_t len) { char lenStr[8]; itoa(len, lenStr, 10); const char atStr[] = "AT+CIPSEND="; - char* cmd = new char[strlen(atStr) + strlen(lenStr) + 1]; + #ifdef STATIC_ONLY + char cmd[STATIC_ARRAY_SIZE]; + #else + char* cmd = new char[strlen(atStr) + strlen(lenStr) + 1]; + #endif strcpy(cmd, atStr); strcat(cmd, lenStr); // send command bool res = _mod->ATsendCommand(cmd); - delete[] cmd; + #ifndef STATIC_ONLY + delete[] cmd; + #endif if(!res) { return(ERR_AT_FAILED); } diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 74029d5f..16b04a1d 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1030,12 +1030,18 @@ int16_t SX126x::setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMa } int16_t SX126x::writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) { - uint8_t* dat = new uint8_t[2 + numBytes]; + #ifdef STATIC_ONLY + uint8_t dat[STATIC_ARRAY_SIZE + 2]; + #else + uint8_t* dat = new uint8_t[2 + numBytes]; + #endif dat[0] = (uint8_t)((addr >> 8) & 0xFF); dat[1] = (uint8_t)(addr & 0xFF); memcpy(dat + 2, data, numBytes); int16_t state = SPIwriteCommand(SX126X_CMD_WRITE_REGISTER, dat, 2 + numBytes); - delete[] dat; + #ifndef STATIC_ONLY + delete[] dat; + #endif return(state); } @@ -1045,22 +1051,34 @@ int16_t SX126x::readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) { } int16_t SX126x::writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset) { - uint8_t* dat = new uint8_t[1 + numBytes]; + #ifdef STATIC_ONLY + uint8_t dat[STATIC_ARRAY_SIZE + 1]; + #else + uint8_t* dat = new uint8_t[1 + numBytes]; + #endif dat[0] = offset; memcpy(dat + 1, data, numBytes); int16_t state = SPIwriteCommand(SX126X_CMD_WRITE_BUFFER, dat, 1 + numBytes); - delete[] dat; + #ifndef STATIC_ONLY + delete[] dat; + #endif return(state); } int16_t SX126x::readBuffer(uint8_t* data, uint8_t numBytes) { // offset will be always set to 0 (one extra NOP is sent) - uint8_t* dat = new uint8_t[1 + numBytes]; + #ifdef STATIC_ONLY + uint8_t dat[STATIC_ARRAY_SIZE + 1]; + #else + uint8_t* dat = new uint8_t[1 + numBytes]; + #endif dat[0] = SX126X_CMD_NOP; memcpy(dat + 1, data, numBytes); int16_t state = SPIreadCommand(SX126X_CMD_READ_BUFFER, dat, 1 + numBytes); memcpy(data, dat + 1, numBytes); - delete[] dat; + #ifndef STATIC_ONLY + delete[] dat; + #endif return(state); } @@ -1180,7 +1198,7 @@ int16_t SX126x::setFrequencyRaw(float freq) { int16_t SX126x::config(uint8_t modem) { // set regulator mode - uint8_t* data = new uint8_t[1]; + uint8_t data[7]; data[0] = SX126X_REGULATOR_DC_DC; int16_t state = SPIwriteCommand(SX126X_CMD_SET_REGULATOR_MODE, data, 1); if(state != ERR_NONE) { @@ -1208,8 +1226,6 @@ int16_t SX126x::config(uint8_t modem) { } // set CAD parameters - delete[] data; - data = new uint8_t[7]; data[0] = SX126X_CAD_ON_8_SYMB; data[1] = _sf + 13; data[2] = 10; @@ -1230,8 +1246,6 @@ int16_t SX126x::config(uint8_t modem) { } // calibrate all blocks - delete[] data; - data = new uint8_t[1]; data[0] = SX126X_CALIBRATE_ALL; state = SPIwriteCommand(SX126X_CMD_CALIBRATE, data, 1); if(state != ERR_NONE) { @@ -1242,8 +1256,6 @@ int16_t SX126x::config(uint8_t modem) { delayMicroseconds(1); while(digitalRead(_mod->getRx())); - delete[] data; - return(ERR_NONE); } diff --git a/src/modules/XBee.cpp b/src/modules/XBee.cpp index 9be17456..a2397d61 100644 --- a/src/modules/XBee.cpp +++ b/src/modules/XBee.cpp @@ -5,7 +5,6 @@ XBee::XBee(Module* mod) { _frameID = 0x01; _frameLength = 0; _frameHeaderProcessed = false; - _packetData = new char[0]; } int16_t XBee::begin(long speed) { @@ -69,7 +68,11 @@ int16_t XBee::transmit(uint8_t* dest, uint8_t* destNetwork, const char* payload, // build the frame size_t payloadLen = strlen(payload); size_t dataLen = 8 + 2 + 1 + 1 + payloadLen; - uint8_t* cmd = new uint8_t[dataLen]; + #ifdef STATIC_ONLY + uint8_t cmd[STATIC_ARRAY_SIZE]; + #else + uint8_t* cmd = new uint8_t[dataLen]; + #endif memcpy(cmd, dest, 8); memcpy(cmd + 8, destNetwork, 2); cmd[10] = radius; @@ -79,7 +82,9 @@ int16_t XBee::transmit(uint8_t* dest, uint8_t* destNetwork, const char* payload, // send frame uint8_t frameID = _frameID++; sendApiFrame(XBEE_API_FRAME_ZIGBEE_TRANSMIT_REQUEST, frameID, cmd, dataLen); - delete[] cmd; + #ifndef STATIC_ONLY + delete[] cmd; + #endif // get response code return(readApiFrame(frameID, 5)); @@ -114,20 +119,28 @@ size_t XBee::available() { return(0); } - uint8_t* frame = new uint8_t[_frameLength]; //24 + #ifdef STATIC_ONLY + char frame[STATIC_ARRAY_SIZE]; + #else + uint8_t* frame = new uint8_t[_frameLength]; + #endif for(size_t i = 0; i < _frameLength; i++) { frame[i] = _mod->ModuleSerial->read(); } // save packet source and data size_t payloadLength = _frameLength - 12; - delete[] _packetData; - _packetData = new char[payloadLength]; + #ifndef STATIC_ONLY + delete[] _packetData; + _packetData = new char[payloadLength]; + #endif memcpy(_packetData, frame + 12, payloadLength - 1); _packetData[payloadLength - 1] = '\0'; memcpy(_packetSource, frame + 1, 8); - delete[] frame; + #ifndef STATIC_ONLY + delete[] frame; + #endif _frameLength = 0; _frameHeaderProcessed = false; @@ -219,22 +232,34 @@ int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, co // set higher address bytes RADIOLIB_DEBUG_PRINTLN(F("Setting address (high) ...")); - char* addressHigh = new char[strlen(destinationAddressHigh) + 4]; + #ifdef STATIC_ONLY + char addressHigh[13]; + #else + char* addressHigh = new char[strlen(destinationAddressHigh) + 4]; + #endif strcpy(addressHigh, "ATDH"); strcat(addressHigh, destinationAddressHigh); bool res = _mod->ATsendCommand(addressHigh); - delete[] addressHigh; + #ifndef STATIC_ONLY + delete[] addressHigh; + #endif if(!res) { return(ERR_AT_FAILED); } // set lower address bytes RADIOLIB_DEBUG_PRINTLN(F("Setting address (low) ...")); - char* addressLow = new char[strlen(destinationAddressLow) + 4]; + #ifdef STATIC_ONLY + char addressLow[13]; + #else + char* addressLow = new char[strlen(destinationAddressLow) + 4]; + #endif strcpy(addressLow, "ATDL"); strcat(addressLow, destinationAddressLow); res = _mod->ATsendCommand(addressLow); - delete[] addressLow; + #ifndef STATIC_ONLY + delete[] addressLow; + #endif if(!res) { return(ERR_AT_FAILED); } @@ -257,11 +282,17 @@ int16_t XBeeSerial::setPanId(const char* panId) { // set PAN ID RADIOLIB_DEBUG_PRINTLN(F("Setting PAN ID ...")); - char* cmd = new char[strlen(panId) + 4]; + #ifdef STATIC_ONLY + char cmd[21]; + #else + char* cmd = new char[strlen(panId) + 4]; + #endif strcpy(cmd, "ATID"); strcat(cmd, panId); bool res = _mod->ATsendCommand(cmd); - delete[] cmd; + #ifndef STATIC_ONLY + delete[] cmd; + #endif if(!res) { return(ERR_AT_FAILED); } @@ -333,7 +364,11 @@ void XBee::sendApiFrame(uint8_t type, uint8_t id, const char* data) { void XBee::sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length) { // build the API frame size_t frameLength = 1 + 2 + length + 1 + 2; - uint8_t* frame = new uint8_t[frameLength]; + #ifdef STATIC_ONLY + uint8_t frame[STATIC_ARRAY_SIZE]; + #else + uint8_t* frame = new uint8_t[frameLength]; + #endif frame[0] = 0x7E; // start delimiter frame[1] = ((length + 2) & 0xFF00) >> 8; // length MSB @@ -355,7 +390,9 @@ void XBee::sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length } // deallocate memory - delete[] frame; + #ifndef STATIC_ONLY + delete[] frame; + #endif } int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) { @@ -381,7 +418,11 @@ int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) { RADIOLIB_DEBUG_PRINTLN(numBytes); // read the response - uint8_t* resp = new uint8_t[numBytes]; + #ifdef STATIC_ONLY + uint8_t resp[STATIC_ARRAY_SIZE]; + #else + uint8_t* resp = new uint8_t[numBytes]; + #endif for(uint16_t i = 0; i < numBytes; i++) { resp[i] = _mod->ModuleSerial->read(); } @@ -410,7 +451,9 @@ int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) { // codePos does not include start delimiter and frame ID uint8_t code = resp[codePos]; - delete[] resp; + #ifndef STATIC_ONLY + delete[] resp; + #endif return(code); } diff --git a/src/modules/XBee.h b/src/modules/XBee.h index 470d7b7c..9091c9cc 100644 --- a/src/modules/XBee.h +++ b/src/modules/XBee.h @@ -176,7 +176,11 @@ class XBee { size_t _frameLength; bool _frameHeaderProcessed; - char* _packetData; + #ifdef STATIC_ONLY + char _packetData[STATIC_ARRAY_SIZE]; + #else + char* _packetData = new char[0]; + #endif uint8_t _packetSource[8]; int16_t confirmChanges(); diff --git a/src/protocols/MQTT.cpp b/src/protocols/MQTT.cpp index cf151caf..a5291326 100644 --- a/src/protocols/MQTT.cpp +++ b/src/protocols/MQTT.cpp @@ -18,21 +18,25 @@ int16_t MQTTClient::connect(const char* host, const char* clientId, const char* remainingLength += (2 + userNameLen); } if(passwordLen > 0) { - remainingLength += (2 + passwordLen); + remainingLength += (2 + passwordLen); } if((willTopicLen > 0) && (willMessageLen > 0)) { remainingLength += (2 + willTopicLen) + (2 + willMessageLen); } uint8_t encoded[] = {0, 0, 0, 0}; size_t encodedBytes = encodeLength(remainingLength, encoded); - + // build the CONNECT packet - uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; - + #ifdef STATIC_ONLY + uint8_t packet[256]; + #else + uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; + #endif + // fixed header packet[0] = (MQTT_CONNECT << 4) | 0b0000; memcpy(packet + 1, encoded, encodedBytes); - + // variable header // protocol name size_t pos = encodedBytes + 1; @@ -40,42 +44,42 @@ int16_t MQTTClient::connect(const char* host, const char* clientId, const char* packet[pos++] = 0x04; memcpy(packet + pos, "MQTT", 4); pos += 4; - + // protocol level - packet[pos++] = 0x04; - - // flags + packet[pos++] = 0x04; + + // flags packet[pos++] = 0x00; if(cleanSession) { packet[encodedBytes + 8] |= MQTT_CONNECT_CLEAN_SESSION; } - + // keep alive interval in seconds packet[pos++] = (keepAlive & 0xFF00) >> 8; packet[pos++] = keepAlive & 0x00FF; - + // payload // clientId packet[pos++] = (clientIdLen & 0xFF00) >> 8; packet[pos++] = clientIdLen & 0x00FF; memcpy(packet + pos, clientId, clientIdLen); pos += clientIdLen; - + // will topic and message if((willTopicLen > 0) && (willMessageLen > 0)) { packet[encodedBytes + 8] |= MQTT_CONNECT_WILL_FLAG; - + packet[pos++] = (willTopicLen & 0xFF00) >> 8; packet[pos++] = willTopicLen & 0x00FF; memcpy(packet + pos, willTopic, willTopicLen); pos += willTopicLen; - + packet[pos++] = (willMessageLen & 0xFF00) >> 8; packet[pos++] = willMessageLen & 0x00FF; memcpy(packet + pos, willMessage, willMessageLen); pos += willMessageLen; } - + // user name if(userNameLen > 0) { packet[encodedBytes + 8] |= MQTT_CONNECT_USER_NAME_FLAG; @@ -84,7 +88,7 @@ int16_t MQTTClient::connect(const char* host, const char* clientId, const char* memcpy(packet + pos, userName, userNameLen); pos += userNameLen; } - + // password if(passwordLen > 0) { packet[encodedBytes + 8] |= MQTT_CONNECT_PASSWORD_FLAG; @@ -93,54 +97,66 @@ int16_t MQTTClient::connect(const char* host, const char* clientId, const char* memcpy(packet + pos, password, passwordLen); pos += passwordLen; } - + // create TCP connection int16_t state = _tl->openTransportConnection(host, "TCP", _port, keepAlive); if(state != ERR_NONE) { - delete[] packet; + #ifndef STATIC_ONLY + delete[] packet; + #endif return(state); } - + // send MQTT packet state = _tl->send(packet, 1 + encodedBytes + remainingLength); - delete[] packet; + #ifndef STATIC_ONLY + delete[] packet; + #endif if(state != ERR_NONE) { return(state); } - + // get the response length (MQTT CONNACK response has to be 4 bytes long) size_t numBytes = _tl->getNumBytes(); if(numBytes != 4) { return(ERR_RESPONSE_MALFORMED_AT); } - + // read the response - uint8_t* response = new uint8_t[numBytes]; + #ifdef STATIC_ONLY + uint8_t response[STATIC_ARRAY_SIZE]; + #else + uint8_t* response = new uint8_t[numBytes]; + #endif _tl->receive(response, numBytes); if((response[0] == MQTT_CONNACK << 4) && (response[1] == 2)) { uint8_t returnCode = response[3]; - delete[] response; + #ifndef STATIC_ONLY + delete[] response; + #endif return(returnCode); } - - delete[] response; + + #ifndef STATIC_ONLY + delete[] response; + #endif return(ERR_RESPONSE_MALFORMED); } int16_t MQTTClient::disconnect() { // build the DISCONNECT packet uint8_t packet[2]; - + // fixed header packet[0] = (MQTT_DISCONNECT << 4) | 0b0000; packet[1] = 0x00; - + // send MQTT packet int16_t state = _tl->send(packet, 2); if(state != ERR_NONE) { return(state); } - + // close tl connection return(_tl->closeTransportConnection()); } @@ -156,14 +172,18 @@ int16_t MQTTClient::publish(const char* topic, const char* message) { uint32_t remainingLength = (2 + topicLen) + messageLen; uint8_t encoded[] = {0, 0, 0, 0}; size_t encodedBytes = encodeLength(remainingLength, encoded); - + // build the PUBLISH packet - uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; - + #ifdef STATIC_ONLY + uint8_t packet[STATIC_ARRAY_SIZE]; + #else + uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; + #endif + // fixed header packet[0] = (MQTT_PUBLISH << 4) | 0b0000; memcpy(packet + 1, encoded, encodedBytes); - + // variable header // topic name size_t pos = encodedBytes + 1; @@ -171,19 +191,21 @@ int16_t MQTTClient::publish(const char* topic, const char* message) { packet[pos++] = topicLen & 0x00FF; memcpy(packet + pos, topic, topicLen); pos += topicLen; - + // packet ID - + // payload // message memcpy(packet + pos, message, messageLen); pos += messageLen; - + // send MQTT packet int16_t state = _tl->send(packet, 1 + encodedBytes + remainingLength); - delete[] packet; + #ifndef STATIC_ONLY + delete[] packet; + #endif return(state); - + //TODO: implement QoS > 0 and PUBACK response checking } @@ -193,21 +215,25 @@ int16_t MQTTClient::subscribe(const char* topicFilter) { uint32_t remainingLength = 2 + (2 + topicFilterLen + 1); uint8_t encoded[] = {0, 0, 0, 0}; size_t encodedBytes = encodeLength(remainingLength, encoded); - + // build the SUBSCRIBE packet - uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; - + #ifdef STATIC_ONLY + uint8_t packet[STATIC_ARRAY_SIZE]; + #else + uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; + #endif + // fixed header packet[0] = (MQTT_SUBSCRIBE << 4) | 0b0010; memcpy(packet + 1, encoded, encodedBytes); - + // variable header // packet ID size_t pos = encodedBytes + 1; uint16_t packetId = _packetId++; packet[pos++] = (packetId & 0xFF00) >> 8; packet[pos++] = packetId & 0x00FF; - + // payload // topic filter packet[pos++] = (topicFilterLen & 0xFF00) >> 8;; @@ -215,35 +241,45 @@ int16_t MQTTClient::subscribe(const char* topicFilter) { memcpy(packet + pos, topicFilter, topicFilterLen); pos += topicFilterLen; packet[pos++] = 0x00; // QoS 0 - + // send MQTT packet int16_t state = _tl->send(packet, 1 + encodedBytes + remainingLength); - delete[] packet; + #ifndef STATIC_ONLY + delete[] packet; + #endif if(state != ERR_NONE) { return(state); } - + // get the response length (MQTT SUBACK response has to be 5 bytes long for single subscription) size_t numBytes = _tl->getNumBytes(); if(numBytes != 5) { return(ERR_RESPONSE_MALFORMED_AT); } - + // read the response - uint8_t* response = new uint8_t[numBytes]; + #ifdef STATIC_ONLY + uint8_t response[STATIC_ARRAY_SIZE]; + #else + uint8_t* response = new uint8_t[numBytes]; + #endif _tl->receive(response, numBytes); if((response[0] == MQTT_SUBACK << 4) && (response[1] == 3)) { // check packet ID uint16_t receivedId = response[3] | response[2] << 8; int16_t returnCode = response[4]; - delete[] response; + #ifndef STATIC_ONLY + delete[] response; + #endif if(receivedId != packetId) { return(ERR_MQTT_UNEXPECTED_PACKET_ID); } return(returnCode); } - - delete[] response; + + #ifndef STATIC_ONLY + delete[] response; + #endif return(ERR_RESPONSE_MALFORMED); } @@ -253,87 +289,109 @@ int16_t MQTTClient::unsubscribe(const char* topicFilter) { uint32_t remainingLength = 2 + (2 + topicFilterLen); uint8_t encoded[] = {0, 0, 0, 0}; size_t encodedBytes = encodeLength(remainingLength, encoded); - + // build the UNSUBSCRIBE packet - uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; - + #ifdef STATIC_ONLY + uint8_t packet[STATIC_ARRAY_SIZE]; + #else + uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; + #endif + // fixed header packet[0] = (MQTT_UNSUBSCRIBE << 4) | 0b0010; memcpy(packet + 1, encoded, encodedBytes); - + // variable header // packet ID size_t pos = encodedBytes + 1; uint16_t packetId = _packetId++; packet[pos++] = (packetId & 0xFF00) >> 8; packet[pos++] = packetId & 0x00FF; - + // payload // topic filter packet[pos++] = (topicFilterLen & 0xFF00) >> 8;; packet[pos++] = topicFilterLen & 0x00FF; memcpy(packet + pos, topicFilter, topicFilterLen); pos += topicFilterLen; - + // send MQTT packet int16_t state = _tl->send(packet, 1 + encodedBytes + remainingLength); - delete[] packet; + #ifndef STATIC_ONLY + delete[] packet; + #endif if(state != ERR_NONE) { return(state); } - + // get the response length (MQTT UNSUBACK response has to be 4 bytes long) size_t numBytes = _tl->getNumBytes(); if(numBytes != 4) { return(ERR_RESPONSE_MALFORMED_AT); } - + // read the response - uint8_t* response = new uint8_t[numBytes]; + #ifdef STATIC_ONLY + uint8_t response[STATIC_ARRAY_SIZE]; + #else + uint8_t* response = new uint8_t[numBytes]; + #endif _tl->receive(response, numBytes); if((response[0] == MQTT_UNSUBACK << 4) && (response[1] == 2)) { // check packet ID uint16_t receivedId = response[3] | response[2] << 8; - delete[] response; + #ifndef STATIC_ONLY + delete[] response; + #endif if(receivedId != packetId) { return(ERR_MQTT_UNEXPECTED_PACKET_ID); } return(ERR_NONE); } - - delete[] response; + + #ifndef STATIC_ONLY + delete[] response; + #endif return(ERR_RESPONSE_MALFORMED); } int16_t MQTTClient::ping() { // build the PINGREQ packet uint8_t packet[2]; - + // fixed header packet[0] = (MQTT_PINGREQ << 4) | 0b0000; packet[1] = 0x00; - + // send MQTT packet int16_t state = _tl->send(packet, 2); if(state != ERR_NONE) { return(state); } - + // get the response length (MQTT PINGRESP response has to be 2 bytes long) size_t numBytes = _tl->getNumBytes(); if(numBytes != 2) { return(ERR_RESPONSE_MALFORMED_AT); } - + // read the response - uint8_t* response = new uint8_t[numBytes]; + #ifdef STATIC_ONLY + uint8_t response[STATIC_ARRAY_SIZE]; + #else + uint8_t* response = new uint8_t[numBytes]; + #endif _tl->receive(response, numBytes); if((response[0] == MQTT_PINGRESP << 4) && (response[1] == 0)) { - delete[] response; + #ifndef STATIC_ONLY + delete[] response; + #endif return(ERR_NONE); } - - delete[] response; + + #ifndef STATIC_ONLY + delete[] response; + #endif return(ERR_RESPONSE_MALFORMED); } @@ -343,42 +401,42 @@ int16_t MQTTClient::check(void (*func)(const char*, const char*)) { if(state != ERR_NONE) { return(state); } - + // check new data size_t numBytes = _tl->getNumBytes(); if(numBytes == 0) { return(ERR_MQTT_NO_NEW_PACKET_AVAILABLE); } - + // read the PUBLISH packet from server uint8_t* dataIn = new uint8_t[numBytes]; _tl->receive(dataIn, numBytes); if(dataIn[0] == MQTT_PUBLISH << 4) { // TODO: properly decode remaining length uint8_t remainingLength = dataIn[1]; - + // get the topic size_t topicLength = dataIn[3] | dataIn[2] << 8; char* topic = new char[topicLength + 1]; memcpy(topic, dataIn + 4, topicLength); topic[topicLength] = 0x00; - + // get the message size_t messageLength = remainingLength - topicLength - 2; char* message = new char[messageLength + 1]; memcpy(message, dataIn + 4 + topicLength, messageLength); message[messageLength] = 0x00; - + // execute the callback function provided by user func(topic, message); - + delete[] topic; delete[] message; delete[] dataIn; return(ERR_NONE); } delete[] dataIn; - + return(ERR_MQTT_NO_NEW_PACKET_AVAILABLE); } diff --git a/src/protocols/PhysicalLayer.cpp b/src/protocols/PhysicalLayer.cpp index 23fb798c..d27735bd 100644 --- a/src/protocols/PhysicalLayer.cpp +++ b/src/protocols/PhysicalLayer.cpp @@ -19,7 +19,11 @@ int16_t PhysicalLayer::transmit(__FlashStringHelper* fstr, uint8_t addr) { } // dynamically allocate memory - char* str = new char[len]; + #ifdef STATIC_ONLY + char str[STATIC_ARRAY_SIZE]; + #else + char* str = new char[len]; + #endif // copy string from flash p = reinterpret_cast(fstr); @@ -29,7 +33,9 @@ int16_t PhysicalLayer::transmit(__FlashStringHelper* fstr, uint8_t addr) { // transmit string int16_t state = transmit(str, addr); - delete[] str; + #ifndef STATIC_ONLY + delete[] str; + #endif return(state); } @@ -62,10 +68,14 @@ int16_t PhysicalLayer::readData(String& str, size_t len) { } // build a temporary buffer - uint8_t* data = new uint8_t[length + 1]; - if(!data) { - return(ERR_MEMORY_ALLOCATION_FAILED); - } + #ifdef STATIC_ONLY + uint8_t data[STATIC_ARRAY_SIZE + 1]; + #else + uint8_t* data = new uint8_t[length + 1]; + if(!data) { + return(ERR_MEMORY_ALLOCATION_FAILED); + } + #endif // read the received data state = readData(data, length); @@ -79,7 +89,9 @@ int16_t PhysicalLayer::readData(String& str, size_t len) { } // deallocate temporary buffer - delete[] data; + #ifndef STATIC_ONLY + delete[] data; + #endif return(state); } @@ -96,10 +108,14 @@ int16_t PhysicalLayer::receive(String& str, size_t len) { } // build a temporary buffer - uint8_t* data = new uint8_t[length + 1]; - if(!data) { - return(ERR_MEMORY_ALLOCATION_FAILED); - } + #ifdef STATIC_ONLY + uint8_t data[STATIC_ARRAY_SIZE + 1]; + #else + uint8_t* data = new uint8_t[length + 1]; + if(!data) { + return(ERR_MEMORY_ALLOCATION_FAILED); + } + #endif // attempt packet reception state = receive(data, length); @@ -118,7 +134,9 @@ int16_t PhysicalLayer::receive(String& str, size_t len) { } // deallocate temporary buffer - delete[] data; + #ifndef STATIC_ONLY + delete[] data; + #endif return(state); } diff --git a/src/protocols/RTTY.cpp b/src/protocols/RTTY.cpp index e0f6d90b..c56f0b0b 100644 --- a/src/protocols/RTTY.cpp +++ b/src/protocols/RTTY.cpp @@ -2,20 +2,20 @@ ITA2String::ITA2String(char c) { _len = 1; - _str = new char[1]; _str[0] = c; _ita2Len = 0; } ITA2String::ITA2String(const char* str) { _len = strlen(str); - _str = new char[_len]; strcpy(_str, str); _ita2Len = 0; } ITA2String::~ITA2String() { - delete[] _str; + #ifndef STATIC_ONLY + delete[] _str; + #endif } size_t ITA2String::length() { @@ -32,7 +32,11 @@ size_t ITA2String::length() { uint8_t* ITA2String::byteArr() { // create temporary array 2x the string length (figures may be 3 bytes) - uint8_t* temp = new uint8_t[_len*2 + 1]; + #ifdef STATIC_ONLY + uint8_t temp[STATIC_ARRAY_SIZE*2 + 1]; + #else + uint8_t* temp = new uint8_t[_len*2 + 1]; + #endif size_t arrayLen = 0; bool flagFigure = false; @@ -75,7 +79,9 @@ uint8_t* ITA2String::byteArr() { uint8_t* arr = new uint8_t[arrayLen]; memcpy(arr, temp, arrayLen); - delete[] temp; + #ifndef STATIC_ONLY + delete[] temp; + #endif return(arr); } @@ -202,7 +208,11 @@ size_t RTTYClient::print(__FlashStringHelper* fstr) { } // dynamically allocate memory - char* str = new char[len]; + #ifdef STATIC_ONLY + char str[STATIC_ARRAY_SIZE]; + #else + char* str = new char[len]; + #endif // copy string from flash p = reinterpret_cast(fstr); @@ -217,7 +227,9 @@ size_t RTTYClient::print(__FlashStringHelper* fstr) { } else if((_encoding == ASCII) || (_encoding == ASCII_EXTENDED)) { n = RTTYClient::write((uint8_t*)str, len); } - delete[] str; + #ifndef STATIC_ONLY + delete[] str; + #endif return(n); } diff --git a/src/protocols/RTTY.h b/src/protocols/RTTY.h index 6a4e9332..06aeac55 100644 --- a/src/protocols/RTTY.h +++ b/src/protocols/RTTY.h @@ -58,7 +58,11 @@ class ITA2String { uint8_t* byteArr(); private: - char* _str; + #ifdef STATIC_ONLY + char _str[STATIC_ARRAY_SIZE]; + #else + char* _str = new char[1]; + #endif size_t _len; size_t _ita2Len; From 4fc2539a5515634b2c2fc969ab1772bf68491bb8 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 29 Sep 2019 10:02:49 +0200 Subject: [PATCH 16/83] Added missing software serial platform macro --- src/Module.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Module.h b/src/Module.h index c6684d39..aae70da8 100644 --- a/src/Module.h +++ b/src/Module.h @@ -1,15 +1,14 @@ #ifndef _RADIOLIB_MODULE_H #define _RADIOLIB_MODULE_H +#include "TypeDef.h" + #include //#include -#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32) -#else +#if !(SOFTWARE_SERIAL_UNSUPPORTED) #include #endif -#include "TypeDef.h" - /*! \class Module @@ -28,7 +27,7 @@ class Module { \param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1 */ -#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32) +#if SOFTWARE_SERIAL_UNSUPPORTED Module(int tx, int rx, HardwareSerial* useSer = &Serial1); #else Module(int tx, int rx, HardwareSerial* useSer = nullptr); @@ -85,7 +84,7 @@ class Module { \param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1 */ -#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32) +#if SOFTWARE_SERIAL_UNSUPPORTED 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); @@ -97,7 +96,7 @@ class Module { /*! \brief Internal SoftwareSerial instance. */ -#if defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32) +#if SOFTWARE_SERIAL_UNSUPPORTED HardwareSerial* ModuleSerial; #else SoftwareSerial* ModuleSerial; From 5d4680709fc04325e726f349076b9927fee7e08b Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 2 Oct 2019 18:54:55 +0200 Subject: [PATCH 17/83] [SX126x] Fixed incorrect example (#50) --- .../SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino index 3be3d64b..84434f93 100644 --- a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino +++ b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino @@ -110,6 +110,9 @@ void loop() { // reset flag receivedFlag = false; + // put module to standby while reading data + lora.standby(); + // you can read received data as an Arduino String String str; int state = lora.readData(str); @@ -149,6 +152,9 @@ void loop() { } + // put module back to listen mode + lora.startReceive(); + // we're ready to receive more packets, // enable interrupt service routine enableInterrupt = true; From f3ba8cf86af71bd97bdfb9dbbd877312e05a7823 Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 2 Oct 2019 18:58:46 +0200 Subject: [PATCH 18/83] [SX126x] Fixed missing standby in blocking receive --- src/modules/SX126x.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 16b04a1d..829d8e66 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -256,6 +256,12 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { } } + // put radio to standby + state = standby(); + if(state != ERR_NONE) { + return(state); + } + // read the received data return(readData(data, len)); } From b8128c15a6cc16762cf173880de8cd57c6c6cf2a Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 2 Oct 2019 19:34:48 +0200 Subject: [PATCH 19/83] [SX126x] Moved standby call to readData --- .../SX126x_Receive_Interrupt.ino | 4 +--- src/modules/SX126x.cpp | 14 +++++++------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino index 84434f93..f61f1602 100644 --- a/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino +++ b/examples/SX126x/SX126x_Receive_Interrupt/SX126x_Receive_Interrupt.ino @@ -77,6 +77,7 @@ void setup() { // lora.sleep() // lora.transmit(); // lora.receive(); + // lora.readData(); // lora.scanChannel(); } @@ -110,9 +111,6 @@ void loop() { // reset flag receivedFlag = false; - // put module to standby while reading data - lora.standby(); - // you can read received data as an Arduino String String str; int state = lora.readData(str); diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 829d8e66..e38b594c 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -256,12 +256,6 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { } } - // put radio to standby - state = standby(); - if(state != ERR_NONE) { - return(state); - } - // read the received data return(readData(data, len)); } @@ -446,6 +440,12 @@ int16_t SX126x::startReceive(uint32_t timeout) { } int16_t SX126x::readData(uint8_t* data, size_t len) { + // set mode to standby + int16_t state = standby(); + if(state != ERR_NONE) { + return(state); + } + // check integrity CRC uint16_t irq = getIrqStatus(); if((irq & SX126X_IRQ_CRC_ERR) || (irq & SX126X_IRQ_HEADER_ERR)) { @@ -460,7 +460,7 @@ int16_t SX126x::readData(uint8_t* data, size_t len) { } // read packet data - int16_t state = readBuffer(data, length); + state = readBuffer(data, length); if(state != ERR_NONE) { return(state); } From 47be7923da1569d880ba1d42bbfe610138f5a0cb Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 2 Oct 2019 19:41:31 +0200 Subject: [PATCH 20/83] Fixed software serial macro warnings --- src/Module.cpp | 4 ++-- src/Module.h | 6 +++--- src/TypeDef.h | 4 +++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Module.cpp b/src/Module.cpp index 438eda19..1c994eff 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -7,7 +7,7 @@ Module::Module(int rx, int tx, HardwareSerial* useSer) { _int0 = -1; _int1 = -1; -#if SOFTWARE_SERIAL_UNSUPPORTED +#ifdef SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); @@ -34,7 +34,7 @@ Module::Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi, SPISet _spi = &spi; _spiSettings = spiSettings; -#if SOFTWARE_SERIAL_UNSUPPORTED +#ifdef SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); diff --git a/src/Module.h b/src/Module.h index aae70da8..8bddd4b3 100644 --- a/src/Module.h +++ b/src/Module.h @@ -27,7 +27,7 @@ class Module { \param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1 */ -#if SOFTWARE_SERIAL_UNSUPPORTED +#ifdef SOFTWARE_SERIAL_UNSUPPORTED Module(int tx, int rx, HardwareSerial* useSer = &Serial1); #else Module(int tx, int rx, HardwareSerial* useSer = nullptr); @@ -84,7 +84,7 @@ class Module { \param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1 */ -#if SOFTWARE_SERIAL_UNSUPPORTED +#ifdef SOFTWARE_SERIAL_UNSUPPORTED 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); @@ -96,7 +96,7 @@ class Module { /*! \brief Internal SoftwareSerial instance. */ -#if SOFTWARE_SERIAL_UNSUPPORTED +#ifdef SOFTWARE_SERIAL_UNSUPPORTED HardwareSerial* ModuleSerial; #else SoftwareSerial* ModuleSerial; diff --git a/src/TypeDef.h b/src/TypeDef.h index 2099187c..41f4ba5c 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -8,7 +8,9 @@ #endif // the following platforms do not support SoftwareSerial library -#define SOFTWARE_SERIAL_UNSUPPORTED (defined(ESP32) || defined(SAMD_SERIES) || defined (ARDUINO_ARCH_STM32)) +#if defined(ESP32) || defined(SAMD_SERIES) || defined(ARDUINO_ARCH_STM32) + #define SOFTWARE_SERIAL_UNSUPPORTED +#endif // uncomment to enable static-only memory management: no dynamic allocation will be performed // Warning: Large static arrays will be created in some methods. It is also not advised to send large packets in this mode. From f330d1478d8eb4ccb985d45f09f5c2c97015ec7d Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 2 Oct 2019 19:41:37 +0200 Subject: [PATCH 21/83] Advanced version to 1.7.1 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index b349f77e..c7a6fdea 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=1.6.1 +version=1.7.1 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino From e901f26faa543a8c4b2f203c063e5272fd615503 Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 2 Oct 2019 20:07:43 +0200 Subject: [PATCH 22/83] Rollback to 1.6.1 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index c7a6fdea..b349f77e 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=1.7.1 +version=1.6.1 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino From eb0f9178b9f4a391b699b0b5423595b1982e514d Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 2 Oct 2019 20:13:14 +0200 Subject: [PATCH 23/83] Fixed the incorrect macr --- src/Module.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Module.h b/src/Module.h index 8bddd4b3..09ca6566 100644 --- a/src/Module.h +++ b/src/Module.h @@ -5,7 +5,7 @@ #include //#include -#if !(SOFTWARE_SERIAL_UNSUPPORTED) +#ifdef SOFTWARE_SERIAL_UNSUPPORTED #include #endif From 23a0e9e001e350ef1f66aac706ba062e0d6d0619 Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 2 Oct 2019 20:16:54 +0200 Subject: [PATCH 24/83] Fixed incorrect macro logic --- src/Module.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Module.h b/src/Module.h index 09ca6566..1a7ff1de 100644 --- a/src/Module.h +++ b/src/Module.h @@ -5,7 +5,7 @@ #include //#include -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifndef SOFTWARE_SERIAL_UNSUPPORTED #include #endif From ff078d69dd993f3604dadbe2fd25f46195e225de Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 2 Oct 2019 20:50:27 +0200 Subject: [PATCH 25/83] Advanced version to 1.7.0 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index b349f77e..e89906e6 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=1.6.1 +version=1.7.0 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino From f0d9fdda118ddaee70b7a6a5249f60c023a7953f Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 27 Oct 2019 17:12:59 +0100 Subject: [PATCH 26/83] [SX127x] Added missing standby command --- src/modules/SX127x.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/SX127x.cpp b/src/modules/SX127x.cpp index c0739db9..72fa605a 100644 --- a/src/modules/SX127x.cpp +++ b/src/modules/SX127x.cpp @@ -467,6 +467,9 @@ int16_t SX127x::readData(uint8_t* data, size_t len) { int16_t modem = getActiveModem(); size_t length = len; + // put module to standby + standby(); + if(modem == SX127X_LORA) { // len set to maximum indicates unknown packet length, read the number of actually received bytes if(len == SX127X_MAX_PACKET_LENGTH) { From c57d7d90454203eebe80cc04a49554171fcd578a Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 27 Oct 2019 17:18:37 +0100 Subject: [PATCH 27/83] Added support for Arduino Due --- .travis.yml | 3 +++ README.md | 3 ++- src/ISerial.cpp | 8 ++++---- src/TypeDef.h | 2 +- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 69cb0753..1cc541cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ env: - BOARD="STM32:stm32:GenF1:pnum=BLUEPILL_F103C6" - BOARD="esp8266:esp8266:generic:xtal=80,ResetMethod=ck,CrystalFreq=26,FlashFreq=40,FlashMode=qio,eesz=512K" - BOARD="arduino:samd:arduino_zero_native" + - BOARD="arduino:sam:arduino_due_x" - BOARD="arduino:avr:uno" - BOARD="arduino:avr:leonardo" - BOARD="arduino:avr:mega:cpu=atmega2560" @@ -38,6 +39,8 @@ before_install: arduino --install-boards STM32:stm32; elif [[ "$BOARD" =~ "arduino:samd:" ]]; then arduino --install-boards arduino:samd; + elif [[ "$BOARD" =~ "arduino:sam:" ]]; then + arduino --install-boards arduino:sam; fi # create directory to save the library and create symbolic link diff --git a/README.md b/README.md index 5ac65bb0..935a15ac 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,9 @@ RadioLib was originally created as a driver for [__RadioShield__](https://github * __Arduino AVR boards__ - tested on Uno, Mega and Leonardo * __ESP8266 boards__ - NodeMCU, Wemos D1, etc. * __ESP32 boards__ - tested on ESP-WROOM-32 -* __STM32 boards__ - tested on BluePill F103C8, STM32VL-Discovery F100RB (with [custom definitions](https://github.com/stm32duino/wiki/wiki/Custom-definitions) in variant.h) +* __STM32 boards__ - tested on Nucleo L452RE-P * __SAMD boards__ - Arduino Zero +* __SAM boards__ - Arduino Due ### In development: * __SIM800C__ GSM module diff --git a/src/ISerial.cpp b/src/ISerial.cpp index 7ff0be0a..bc280e68 100644 --- a/src/ISerial.cpp +++ b/src/ISerial.cpp @@ -9,7 +9,7 @@ void ISerial::begin(long speed) { } bool ISerial::listen() { -#if defined ( ESP32 ) || defined (SAMD_SERIES) || defined (ARDUINO_ARCH_STM32) +#ifdef SOFTWARE_SERIAL_UNSUPPORTED return true; #else return(_mod->ModuleSerial->listen()); @@ -21,7 +21,7 @@ void ISerial::end() { } bool ISerial::isListening() { -#if defined( ESP32 ) || defined ( SAMD_SERIES ) || defined (ARDUINO_ARCH_STM32) +#ifdef SOFTWARE_SERIAL_UNSUPPORTED return true; #else return(_mod->ModuleSerial->isListening()); @@ -29,7 +29,7 @@ bool ISerial::isListening() { } bool ISerial::stopListening() { -#if defined( ESP32 ) || defined ( SAMD_SERIES ) || defined (ARDUINO_ARCH_STM32) +#ifdef SOFTWARE_SERIAL_UNSUPPORTED return true; #else return(_mod->ModuleSerial->stopListening()); @@ -37,7 +37,7 @@ bool ISerial::stopListening() { } bool ISerial::overflow() { -#if defined( ESP32 ) || defined ( SAMD_SERIES ) || defined (ARDUINO_ARCH_STM32) +#ifdef SOFTWARE_SERIAL_UNSUPPORTED return false; #else return(_mod->ModuleSerial->overflow()); diff --git a/src/TypeDef.h b/src/TypeDef.h index 41f4ba5c..f1675bcd 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -8,7 +8,7 @@ #endif // the following platforms do not support SoftwareSerial library -#if defined(ESP32) || defined(SAMD_SERIES) || defined(ARDUINO_ARCH_STM32) +#if defined(ESP32) || defined(SAMD_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__SAM3X8E__) #define SOFTWARE_SERIAL_UNSUPPORTED #endif From 2c2fe8b20e6ca3cf959fc242ea3980e038101c83 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 28 Oct 2019 19:37:13 +0100 Subject: [PATCH 28/83] [SX126x] Simplified debug output --- src/modules/SX126x.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index e38b594c..f8464415 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1293,17 +1293,21 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d spi->beginTransaction(spiSettings); // send command byte(s) + RADIOLIB_VERBOSE_PRINT("CMD\t"); for(uint8_t n = 0; n < cmdLen; n++) { spi->transfer(cmd[n]); RADIOLIB_VERBOSE_PRINT(cmd[n], HEX); RADIOLIB_VERBOSE_PRINT('\t'); } + RADIOLIB_VERBOSE_PRINTLN(); // variable to save error during SPI transfer uint8_t status = 0; // send/receive all bytes + RADIOLIB_VERBOSE_PRINT("DAT"); if(write) { + RADIOLIB_VERBOSE_PRINT("W\t"); for(uint8_t n = 0; n < numBytes; n++) { // send byte uint8_t in = spi->transfer(dataOut[n]); @@ -1323,6 +1327,7 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d } RADIOLIB_VERBOSE_PRINTLN(); } else { + RADIOLIB_VERBOSE_PRINT("R\t"); // skip the first byte for read-type commands (status-only) uint8_t in = spi->transfer(SX126X_CMD_NOP); RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); @@ -1347,6 +1352,7 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d } RADIOLIB_VERBOSE_PRINTLN(); } + RADIOLIB_VERBOSE_PRINTLN(); // stop transfer spi->endTransaction(); From 1adae1bdbd1bc16a1e19526bfee9aaef27b83031 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 1 Nov 2019 16:44:26 +0100 Subject: [PATCH 29/83] Added note about SX127x issues --- CONTRIBUTING.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e073ea03..17d073ff 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,6 +15,8 @@ To report bugs or suggest new features, use the provided issue templates. Use th Issues with generic titles (e.g. "not working", "lora", etc.) will be **CLOSED** until the title is fixed, since the title is supposed to categorize the issue. The same applies for issues with very little information and extensive grammatical or formatting errors that make it difficult to find out what is the actual issue. 4. **Issues deserve some attention too.** Issues that are left for 2 weeks without response by the original author when asked for further information will be closed due to inactivity. This is to keep track of important issues, the author is encouraged to reopen the issue at a later date. +5. **LoRaLib is a separate project.** +RadioLib was created as an extension of LoRaLib for radios other than SX127x. However, LoRaLib project is still active and RadioLib is reusing its code. **Because of that, please open issues/PRs related to SX127x in [LoRaLib](https://github.com/jgromes/LoRaLib)**. ## Code style guidelines @@ -22,6 +24,7 @@ I like pretty code! Or at least, I like *consistent* code style. When creating p 1. **Bracket style** This library uses the following style of bracket indentation (1TBS, or "javascript" style): + ```c++ if (foo) { bar(); @@ -35,6 +38,7 @@ Use 2 space characters for tabs. 3. **Single-line comments** Comments can be very useful - and they can become the bane of readability. Every single-line comment should start at new line, have one space between comment delimiter `//` and the start of the comment itself. The comment should also start with a lower-case letter. + ```c++ // this function does something foo("bar"); @@ -45,6 +49,7 @@ foo(12345); 4. **Split code into blocks** It is very easy to write code that machine can read. It is much harder to write one that humans can read. That's why it's a great idea to split code into blocks - even if the block is just a single line! + ```c++ // build a temporary buffer (first block) uint8_t* data = new uint8_t[len + 1]; @@ -63,4 +68,4 @@ data[len] = 0; If you're adding a new method, make sure to add appropriate Doxygen comments, so that the documentation is always complete. 6. **Keywords** -This is an Arduino library, so it needs to comply with the Arduino library specification. To add a new keyword to the Arduino IDE syntax highlighting, add it to the keywords.txt file. **Use true tabs in keywords.txt! No spaces there!" +This is an Arduino library, so it needs to comply with the Arduino library specification. To add a new keyword to the Arduino IDE syntax highlighting, add it to the keywords.txt file. **Use true tabs in keywords.txt! No spaces there!** From b599a35879ab36f1ba5326ba26a2a779450ac297 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Wed, 6 Nov 2019 01:41:08 +0100 Subject: [PATCH 30/83] Using defined debug port and not Serial --- src/modules/RF69.cpp | 12 ++++++------ src/modules/SX1231.cpp | 12 ++++++------ src/modules/SX127x.cpp | 32 ++++++++++++++++---------------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 8e7f56b0..029e8eb8 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -19,15 +19,15 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe flagFound = true; } else { #ifdef RADIOLIB_DEBUG - Serial.print(F("RF69 not found! (")); - Serial.print(i + 1); - Serial.print(F(" of 10 tries) RF69_REG_VERSION == ")); + RADIOLIB_DEBUG_PRINT(F("RF69 not found! (")); + RADIOLIB_DEBUG_PRINT(i + 1); + RADIOLIB_DEBUG_PRINT(F(" of 10 tries) RF69_REG_VERSION == ")); char buffHex[7]; sprintf(buffHex, "0x%04X", version); - Serial.print(buffHex); - Serial.print(F(", expected 0x0024")); - Serial.println(); + RADIOLIB_DEBUG_PRINT(buffHex); + RADIOLIB_DEBUG_PRINT(F(", expected 0x0024")); + RADIOLIB_DEBUG_PRINTLN(); #endif delay(1000); i++; diff --git a/src/modules/SX1231.cpp b/src/modules/SX1231.cpp index 63767987..c5cdf00b 100644 --- a/src/modules/SX1231.cpp +++ b/src/modules/SX1231.cpp @@ -18,15 +18,15 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po _chipRevision = version; } else { #ifdef RADIOLIB_DEBUG - Serial.print(F("SX127x not found! (")); - Serial.print(i + 1); - Serial.print(F(" of 10 tries) SX127X_REG_VERSION == ")); + RADIOLIB_DEBUG_PRINT(F("SX127x not found! (")); + RADIOLIB_DEBUG_PRINT(i + 1); + RADIOLIB_DEBUG_PRINT(F(" of 10 tries) SX127X_REG_VERSION == ")); char buffHex[7]; sprintf(buffHex, "0x%04X", version); - Serial.print(buffHex); - Serial.print(F(", expected 0x0021 / 0x0022 / 0x0023")); - Serial.println(); + RADIOLIB_DEBUG_PRINT(buffHex); + RADIOLIB_DEBUG_PRINT(F(", expected 0x0021 / 0x0022 / 0x0023")); + RADIOLIB_DEBUG_PRINTLN(); #endif delay(1000); i++; diff --git a/src/modules/SX127x.cpp b/src/modules/SX127x.cpp index 72fa605a..b3e8603a 100644 --- a/src/modules/SX127x.cpp +++ b/src/modules/SX127x.cpp @@ -955,16 +955,16 @@ bool SX127x::findChip(uint8_t ver) { flagFound = true; } else { #ifdef RADIOLIB_DEBUG - Serial.print(F("SX127x not found! (")); - Serial.print(i + 1); - Serial.print(F(" of 10 tries) SX127X_REG_VERSION == ")); + RADIOLIB_DEBUG_PRINT(F("SX127x not found! (")); + RADIOLIB_DEBUG_PRINT(i + 1); + RADIOLIB_DEBUG_PRINT(F(" of 10 tries) SX127X_REG_VERSION == ")); char buffHex[5]; sprintf(buffHex, "0x%02X", version); - Serial.print(buffHex); - Serial.print(F(", expected 0x00")); - Serial.print(ver, HEX); - Serial.println(); + RADIOLIB_DEBUG_PRINT(buffHex); + RADIOLIB_DEBUG_PRINT(F(", expected 0x00")); + RADIOLIB_DEBUG_PRINT(ver, HEX); + RADIOLIB_DEBUG_PRINTLN(); #endif delay(1000); i++; @@ -1013,23 +1013,23 @@ void SX127x::clearFIFO(size_t count) { #ifdef RADIOLIB_DEBUG void SX127x::regDump() { - Serial.println(); - Serial.println(F("ADDR\tVALUE")); + RADIOLIB_DEBUG_PRINTLN(); + RADIOLIB_DEBUG_PRINTLN(F("ADDR\tVALUE")); for(uint16_t addr = 0x01; addr <= 0x70; addr++) { if(addr <= 0x0F) { - Serial.print(F("0x0")); + RADIOLIB_DEBUG_PRINT(F("0x0")); } else { - Serial.print(F("0x")); + RADIOLIB_DEBUG_PRINT(F("0x")); } - Serial.print(addr, HEX); - Serial.print('\t'); + RADIOLIB_DEBUG_PRINT(addr, HEX); + RADIOLIB_DEBUG_PRINT('\t'); uint8_t val = _mod->SPIreadRegister(addr); if(val <= 0x0F) { - Serial.print(F("0x0")); + RADIOLIB_DEBUG_PRINT(F("0x0")); } else { - Serial.print(F("0x")); + RADIOLIB_DEBUG_PRINT(F("0x")); } - Serial.println(val, HEX); + RADIOLIB_DEBUG_PRINTLN(val, HEX); delay(50); } From 7e42f77c95d6b5c6f36b7c555ae4d66091c48d61 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Wed, 6 Nov 2019 02:34:40 +0100 Subject: [PATCH 31/83] Added length mode configuration methods and handling --- src/modules/CC1101.cpp | 57 +++++++++++++++++++++++++++++++++++------- src/modules/CC1101.h | 19 ++++++++++++++ 2 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index 42fe5d7f..905fcac9 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -3,6 +3,7 @@ CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_EXPONENT, CC1101_MAX_PACKET_LENGTH) { _mod = module; _packetLengthQueried = false; + _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; } int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { @@ -20,15 +21,15 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po flagFound = true; } else { #ifdef RADIOLIB_DEBUG - Serial.print(F("CC1101 not found! (")); - Serial.print(i + 1); - Serial.print(F(" of 10 tries) CC1101_REG_VERSION == ")); + RADIOLIB_DEBUG_PRINT(F("CC1101 not found! (")); + RADIOLIB_DEBUG_PRINT(i + 1); + RADIOLIB_DEBUG_PRINT(F(" of 10 tries) CC1101_REG_VERSION == ")); char buffHex[7]; sprintf(buffHex, "0x%04X", version); - Serial.print(buffHex); - Serial.print(F(", expected 0x0014")); - Serial.println(); + RADIOLIB_DEBUG_PRINT(buffHex); + RADIOLIB_DEBUG_PRINT(F(", expected 0x0014")); + RADIOLIB_DEBUG_PRINTLN(); #endif delay(1000); i++; @@ -192,8 +193,10 @@ int16_t CC1101::startTransmit(uint8_t* data, size_t len, uint8_t addr) { return(state); } - // write packet length - SPIwriteRegister(CC1101_REG_FIFO, len); + // optionally write packet length + if (_packetLengthConfig == CC1101_LENGTH_CONFIG_VARIABLE) { + SPIwriteRegister(CC1101_REG_FIFO, len); + } // check address filtering uint8_t filter = SPIgetRegValue(CC1101_REG_PKTCTRL1, 1, 0); @@ -477,7 +480,11 @@ uint8_t CC1101::getLQI() { size_t CC1101::getPacketLength(bool update) { if(!_packetLengthQueried && update) { - _packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO); + + uint8_t format = SPIgetRegValue(CC1101_REG_PKTCTRL0, 1, 0); + if (format == CC1101_LENGTH_CONFIG_VARIABLE) { + _packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO); + } _packetLengthQueried = true; } @@ -497,6 +504,38 @@ int16_t CC1101::config() { return(state); } +int16_t CC1101::fixedPacketLengthMode(uint8_t len) { + if (len > CC1101_MAX_PACKET_LENGTH) { + return(ERR_PACKET_TOO_LONG); + } + + uint16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_FIXED, 1, 0); + if (state != ERR_NONE) { + return(state); + } + + state = SPIsetRegValue(CC1101_REG_PKTLEN, len); + if (state != ERR_NONE) { + return(state); + } +} + +int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { + if (maxLen > CC1101_MAX_PACKET_LENGTH) { + return(ERR_PACKET_TOO_LONG); + } + + uint16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_VARIABLE, 1, 0); + if (state != ERR_NONE) { + return(state); + } + + state = SPIsetRegValue(CC1101_REG_PKTLEN, maxLen); + if (state != ERR_NONE) { + return(state); + } +} + int16_t CC1101::directMode() { // set mode to standby SPIsendCommand(CC1101_CMD_IDLE); diff --git a/src/modules/CC1101.h b/src/modules/CC1101.h index a2060819..c57a7e6d 100644 --- a/src/modules/CC1101.h +++ b/src/modules/CC1101.h @@ -739,6 +739,24 @@ class CC1101: public PhysicalLayer { */ size_t getPacketLength(bool update = true); + /*! + \brief Set modem in fixed packet length mode. + + \param len Packet length. + + \returns \ref status_codes + */ + int16_t fixedPacketLengthMode(uint8_t len = CC1101_MAX_PACKET_LENGTH); + + /*! + \brief Set modem in variable packet length mode. + + \param len Maximum packet length. + + \returns \ref status_codes + */ + int16_t variablePacketLengthMode(uint8_t maxLen = CC1101_MAX_PACKET_LENGTH); + private: Module* _mod; @@ -748,6 +766,7 @@ class CC1101: public PhysicalLayer { size_t _packetLength; bool _packetLengthQueried; + uint8_t _packetLengthConfig; int16_t config(); int16_t directMode(); From 121110d9f469e224d159572ecb5db7b849107cc5 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Thu, 7 Nov 2019 17:02:32 +0100 Subject: [PATCH 32/83] Update CC1101.cpp Updating _packetLengthConfig and _packetLength properly --- src/modules/CC1101.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index 905fcac9..f2227774 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -480,11 +480,12 @@ uint8_t CC1101::getLQI() { size_t CC1101::getPacketLength(bool update) { if(!_packetLengthQueried && update) { - - uint8_t format = SPIgetRegValue(CC1101_REG_PKTCTRL0, 1, 0); - if (format == CC1101_LENGTH_CONFIG_VARIABLE) { + if (_packetLengthConfig == CC1101_LENGTH_CONFIG_VARIABLE) { _packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO); - } + } else { + _packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO); + } + _packetLengthQueried = true; } @@ -509,15 +510,22 @@ int16_t CC1101::fixedPacketLengthMode(uint8_t len) { return(ERR_PACKET_TOO_LONG); } - uint16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_FIXED, 1, 0); + // set to fixed packet length + int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_FIXED, 1, 0); if (state != ERR_NONE) { return(state); } + // set max length to register state = SPIsetRegValue(CC1101_REG_PKTLEN, len); if (state != ERR_NONE) { return(state); } + + // all went well: cache the reg value + _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; + + return(state); } int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { @@ -525,15 +533,14 @@ int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { return(ERR_PACKET_TOO_LONG); } - uint16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_VARIABLE, 1, 0); + int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_VARIABLE, 1, 0); if (state != ERR_NONE) { return(state); } + _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; state = SPIsetRegValue(CC1101_REG_PKTLEN, maxLen); - if (state != ERR_NONE) { - return(state); - } + return(state); } int16_t CC1101::directMode() { From 47a45fa0097d7cc8fc7196c956e8bafbb309f64d Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Thu, 7 Nov 2019 20:07:31 +0100 Subject: [PATCH 33/83] Moving CC1101::variablePacketLengthMode and CC1101::fixedPacketLengthMode before CC1101::config so as to maintain the same order as in the header file --- src/modules/CC1101.cpp | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index f2227774..81952792 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -56,26 +56,36 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po return(state); } + // configure bitrate state = setBitRate(br); if(state != ERR_NONE) { return(state); } + // configure default RX bandwidth state = setRxBandwidth(rxBw); if(state != ERR_NONE) { return(state); } + // configure default frequency deviation state = setFrequencyDeviation(freqDev); if(state != ERR_NONE) { return(state); } + // configure default TX output power state = setOutputPower(power); if(state != ERR_NONE) { return(state); } + // set default packet length mode + state = variablePacketLengthMode(); + if (state != ERR_NONE) { + return(state); + } + // flush FIFOs SPIsendCommand(CC1101_CMD_FLUSH_RX); SPIsendCommand(CC1101_CMD_FLUSH_TX); @@ -163,7 +173,7 @@ int16_t CC1101::receiveDirect() { int16_t CC1101::packetMode() { int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL1, CC1101_CRC_AUTOFLUSH_OFF | CC1101_APPEND_STATUS_ON | CC1101_ADR_CHK_NONE, 3, 0); state |= SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_WHITE_DATA_OFF | CC1101_PKT_FORMAT_NORMAL, 6, 4); - state |= SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_ON | CC1101_LENGTH_CONFIG_VARIABLE, 2, 0); + state |= SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_ON | _packetLengthConfig, 2, 0); return(state); } @@ -492,19 +502,6 @@ size_t CC1101::getPacketLength(bool update) { return(_packetLength); } -int16_t CC1101::config() { - // enable automatic frequency synthesizer calibration - int16_t state = SPIsetRegValue(CC1101_REG_MCSM0, CC1101_FS_AUTOCAL_IDLE_TO_RXTX, 5, 4); - if(state != ERR_NONE) { - return(state); - } - - // set packet mode - state = packetMode(); - - return(state); -} - int16_t CC1101::fixedPacketLengthMode(uint8_t len) { if (len > CC1101_MAX_PACKET_LENGTH) { return(ERR_PACKET_TOO_LONG); @@ -543,6 +540,19 @@ int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { return(state); } +int16_t CC1101::config() { + // enable automatic frequency synthesizer calibration + int16_t state = SPIsetRegValue(CC1101_REG_MCSM0, CC1101_FS_AUTOCAL_IDLE_TO_RXTX, 5, 4); + if(state != ERR_NONE) { + return(state); + } + + // set packet mode + state = packetMode(); + + return(state); +} + int16_t CC1101::directMode() { // set mode to standby SPIsendCommand(CC1101_CMD_IDLE); From 87bf46ed34447f65bd3ab1dbe75e5e9ae6e0089f Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Thu, 7 Nov 2019 20:14:29 +0100 Subject: [PATCH 34/83] CC1101::fixedPacketFormat now correctly sets _packetLengthConfig --- src/modules/CC1101.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index 81952792..bbfbb5a2 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -520,7 +520,7 @@ int16_t CC1101::fixedPacketLengthMode(uint8_t len) { } // all went well: cache the reg value - _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; + _packetLengthConfig = CC1101_LENGTH_CONFIG_FIXED; return(state); } From b5f273b187afa3e04a5ccb56d67962cc0eb99cdf Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 8 Nov 2019 09:29:00 +0100 Subject: [PATCH 35/83] [SX126x] Moved debug output out of SPI transaction --- src/modules/SX126x.cpp | 92 +++++++++++++++++++++++++++++------------- 1 file changed, 63 insertions(+), 29 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index f8464415..e47ad31c 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1280,7 +1280,12 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d SPIClass* spi = _mod->getSpi(); SPISettings spiSettings = _mod->getSpiSettings(); + #ifdef RADIOLIB_VERBOSE + uint8_t debugBuff[256]; + #endif + // ensure BUSY is low (state meachine ready) + RADIOLIB_VERBOSE_PRINTLN(F("Wait for BUSY ... ")); uint32_t start = millis(); while(digitalRead(_mod->getRx())) { if(millis() - start >= timeout) { @@ -1293,66 +1298,54 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d spi->beginTransaction(spiSettings); // send command byte(s) - RADIOLIB_VERBOSE_PRINT("CMD\t"); for(uint8_t n = 0; n < cmdLen; n++) { spi->transfer(cmd[n]); - RADIOLIB_VERBOSE_PRINT(cmd[n], HEX); - RADIOLIB_VERBOSE_PRINT('\t'); } - RADIOLIB_VERBOSE_PRINTLN(); // variable to save error during SPI transfer uint8_t status = 0; // send/receive all bytes - RADIOLIB_VERBOSE_PRINT("DAT"); if(write) { - RADIOLIB_VERBOSE_PRINT("W\t"); for(uint8_t n = 0; n < numBytes; n++) { // send byte uint8_t in = spi->transfer(dataOut[n]); - RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX); - RADIOLIB_VERBOSE_PRINT('\t'); - RADIOLIB_VERBOSE_PRINT(in, HEX); - RADIOLIB_VERBOSE_PRINT('\t'); + #ifdef RADIOLIB_VERBOSE + debugBuff[n] = in; + #endif - // check status - SX126X_STATUS_CMD_TIMEOUT is disabled due to regular timeouts - if(//((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || + // check status + if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { status = in & 0b00001110; + break; } else if(in == 0x00 || in == 0xFF) { status = SX126X_STATUS_SPI_FAILED; + break; } } - RADIOLIB_VERBOSE_PRINTLN(); + } else { - RADIOLIB_VERBOSE_PRINT("R\t"); // skip the first byte for read-type commands (status-only) uint8_t in = spi->transfer(SX126X_CMD_NOP); - RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); - RADIOLIB_VERBOSE_PRINT('\t'); - RADIOLIB_VERBOSE_PRINT(in, HEX); - RADIOLIB_VERBOSE_PRINT('\t') + #ifdef RADIOLIB_VERBOSE + debugBuff[0] = in; + #endif // check status - if(//((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || + if(((in & 0b00001110) == SX126X_STATUS_CMD_TIMEOUT) || ((in & 0b00001110) == SX126X_STATUS_CMD_INVALID) || ((in & 0b00001110) == SX126X_STATUS_CMD_FAILED)) { status = in & 0b00001110; } else if(in == 0x00 || in == 0xFF) { status = SX126X_STATUS_SPI_FAILED; + } else { + for(uint8_t n = 0; n < numBytes; n++) { + dataIn[n] = spi->transfer(SX126X_CMD_NOP); + } } - for(uint8_t n = 0; n < numBytes; n++) { - dataIn[n] = spi->transfer(SX126X_CMD_NOP); - RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); - RADIOLIB_VERBOSE_PRINT('\t'); - RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX); - RADIOLIB_VERBOSE_PRINT('\t'); - } - RADIOLIB_VERBOSE_PRINTLN(); } - RADIOLIB_VERBOSE_PRINTLN(); // stop transfer spi->endTransaction(); @@ -1364,11 +1357,52 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d start = millis(); while(digitalRead(_mod->getRx())) { if(millis() - start >= timeout) { - return(ERR_SPI_CMD_TIMEOUT); + status = SX126X_STATUS_CMD_TIMEOUT; + break; } } } + // print debug output + #ifdef RADIOLIB_VERBOSE + // print command byte(s) + RADIOLIB_VERBOSE_PRINT("CMD\t"); + for(uint8_t n = 0; n < cmdLen; n++) { + RADIOLIB_VERBOSE_PRINT(cmd[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + } + RADIOLIB_VERBOSE_PRINTLN(); + + // print data bytes + RADIOLIB_VERBOSE_PRINT("DAT"); + if(write) { + RADIOLIB_VERBOSE_PRINT("W\t"); + for(uint8_t n = 0; n < numBytes; n++) { + RADIOLIB_VERBOSE_PRINT(dataOut[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(debugBuff[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + } + RADIOLIB_VERBOSE_PRINTLN(); + } else { + RADIOLIB_VERBOSE_PRINT("R\t"); + // skip the first byte for read-type commands (status-only) + RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(debugBuff[0], HEX); + RADIOLIB_VERBOSE_PRINT('\t') + + for(uint8_t n = 0; n < numBytes; n++) { + RADIOLIB_VERBOSE_PRINT(SX126X_CMD_NOP, HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + RADIOLIB_VERBOSE_PRINT(dataIn[n], HEX); + RADIOLIB_VERBOSE_PRINT('\t'); + } + RADIOLIB_VERBOSE_PRINTLN(); + } + RADIOLIB_VERBOSE_PRINTLN(); + #endif + // parse status switch(status) { case SX126X_STATUS_CMD_TIMEOUT: From a2e64f1645a9f6630e7ef2b9ec9abc7e6c335349 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Fri, 8 Nov 2019 15:58:13 +0100 Subject: [PATCH 36/83] Added to keywords.txt, comments, reading fixed len properly --- keywords.txt | 2 ++ src/modules/CC1101.cpp | 13 ++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/keywords.txt b/keywords.txt index 76cf9f20..4968ef5b 100644 --- a/keywords.txt +++ b/keywords.txt @@ -88,6 +88,8 @@ setDataShaping KEYWORD2 setOOK KEYWORD2 setDataShapingOOK KEYWORD2 setCRC KEYWORD2 +variablePacketLengthMode KEYWORD2 +fixedPacketLengthMode KEYWORD2 # RF69-specific setAESKey KEYWORD2 diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index bbfbb5a2..657400a0 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -493,7 +493,7 @@ size_t CC1101::getPacketLength(bool update) { if (_packetLengthConfig == CC1101_LENGTH_CONFIG_VARIABLE) { _packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO); } else { - _packetLength = _mod->SPIreadRegister(CC1101_REG_FIFO); + _packetLength = _mod->SPIreadRegister(CC1101_REG_PKTLEN); } _packetLengthQueried = true; @@ -513,7 +513,7 @@ int16_t CC1101::fixedPacketLengthMode(uint8_t len) { return(state); } - // set max length to register + // set length to register state = SPIsetRegValue(CC1101_REG_PKTLEN, len); if (state != ERR_NONE) { return(state); @@ -530,13 +530,20 @@ int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { return(ERR_PACKET_TOO_LONG); } + // set to fixed packet length int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_VARIABLE, 1, 0); if (state != ERR_NONE) { return(state); } - _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; + // set max length to register state = SPIsetRegValue(CC1101_REG_PKTLEN, maxLen); + if (state != ERR_NONE) { + return(state); + } + + // all went well: cache the reg value + _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; return(state); } From f44f6ffb56cbddeeee1b86c8b7ef82b967ff7785 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Fri, 8 Nov 2019 16:32:09 +0100 Subject: [PATCH 37/83] Used true TAB char separator --- keywords.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keywords.txt b/keywords.txt index 4968ef5b..2ffc5a94 100644 --- a/keywords.txt +++ b/keywords.txt @@ -88,7 +88,7 @@ setDataShaping KEYWORD2 setOOK KEYWORD2 setDataShapingOOK KEYWORD2 setCRC KEYWORD2 -variablePacketLengthMode KEYWORD2 +variablePacketLengthMode KEYWORD2 fixedPacketLengthMode KEYWORD2 # RF69-specific From a5295432d7f5a99076bb0dc0f05da9ad859bff5a Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Fri, 8 Nov 2019 16:43:23 +0100 Subject: [PATCH 38/83] Variable/fixed packet length mode config for RF69/SX1231 --- src/modules/RF69.cpp | 68 +++++++++++++++++++++++++++++++++++++++++- src/modules/RF69.h | 21 ++++++++++++- src/modules/SX1231.cpp | 10 +++++++ 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 029e8eb8..26d479dc 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -4,6 +4,7 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT, _mod = module; _tempOffset = 0; _packetLengthQueried = false; + _packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE; } int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { @@ -54,27 +55,37 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe return(state); } + // configure bitrate _rxBw = 125.0; state = setBitRate(br); if(state != ERR_NONE) { return(state); } + // configure default RX bandwidth state = setRxBandwidth(rxBw); if(state != ERR_NONE) { return(state); } + // configure default frequency deviation state = setFrequencyDeviation(freqDev); if(state != ERR_NONE) { return(state); } + // configure default TX output power state = setOutputPower(power); if(state != ERR_NONE) { return(state); } + // set default packet length mode + state = variablePacketLengthMode(); + if (state != ERR_NONE) { + return(state); + } + // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library uint8_t syncWord[] = {0x2D, 0x01}; state = setSyncWord(syncWord, 2); @@ -250,6 +261,11 @@ int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // set packet length _mod->SPIwriteRegister(RF69_REG_FIFO, len); + // optionally write packet length + if (_packetLengthConfig == RF69_PACKET_FORMAT_VARIABLE) { + SPIwriteRegister(RF69_REG_FIFO, len); + } + // check address filtering uint8_t filter = _mod->SPIgetRegValue(RF69_REG_PACKET_CONFIG_1, 2, 1); if((filter == RF69_ADDRESS_FILTERING_NODE) || (filter == RF69_ADDRESS_FILTERING_NODE_BROADCAST)) { @@ -563,13 +579,63 @@ int16_t RF69::getTemperature() { size_t RF69::getPacketLength(bool update) { if(!_packetLengthQueried && update) { - _packetLength = _mod->SPIreadRegister(RF69_REG_FIFO); + if (_packetLengthConfig == RF69_PACKET_FORMAT_VARIABLE) { + _packetLength = _mod->SPIreadRegister(RF69_REG_FIFO); + } else { + _packetLength = _mod->SPIreadRegister(RF69_REG_PAYLOAD_LENGTH); + } _packetLengthQueried = true; } return(_packetLength); } +int16_t RF69::fixedPacketLengthMode(uint8_t len) { + if (len > RF69_MAX_PACKET_LENGTH) { + return(ERR_PACKET_TOO_LONG); + } + + // set to fixed packet length + int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_FIXED, 7, 7); + if (state != ERR_NONE) { + return(state); + } + + // set length to register + state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, len); + if (state != ERR_NONE) { + return(state); + } + + // all went well: cache the reg value + _packetLengthConfig = RF69_PACKET_FORMAT_FIXED; + + return(state); +} + +int16_t RF69::variablePacketLengthMode(uint8_t maxLen) { + if (maxLen > RF69_MAX_PACKET_LENGTH) { + return(ERR_PACKET_TOO_LONG); + } + + // set to variable packet length + int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_VARIABLE, 7, 7); + if (state != ERR_NONE) { + return(state); + } + + // set max length to register + state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, maxLen); + if (state != ERR_NONE) { + return(state); + } + + // all went well: cache the reg value + _packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE; + + return(state); +} + int16_t RF69::config() { int16_t state = ERR_NONE; diff --git a/src/modules/RF69.h b/src/modules/RF69.h index 15fe18dc..9820d539 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69.h @@ -697,7 +697,7 @@ class RF69: public PhysicalLayer { */ int16_t getTemperature(); - /*! + /*! \brief Query modem for the packet length of received payload. \param update Update received packet length. Will return cached value when set to false. @@ -706,6 +706,24 @@ class RF69: public PhysicalLayer { */ size_t getPacketLength(bool update = true); + /*! + \brief Set modem in fixed packet length mode. + + \param len Packet length. + + \returns \ref status_codes + */ + int16_t fixedPacketLengthMode(uint8_t len = RF69_MAX_PACKET_LENGTH); + + /*! + \brief Set modem in variable packet length mode. + + \param len Maximum packet length. + + \returns \ref status_codes + */ + int16_t variablePacketLengthMode(uint8_t maxLen = RF69_MAX_PACKET_LENGTH); + protected: Module* _mod; @@ -715,6 +733,7 @@ class RF69: public PhysicalLayer { size_t _packetLength; bool _packetLengthQueried; + uint8_t _packetLengthConfig; int16_t config(); int16_t directMode(); diff --git a/src/modules/SX1231.cpp b/src/modules/SX1231.cpp index c5cdf00b..375e4b69 100644 --- a/src/modules/SX1231.cpp +++ b/src/modules/SX1231.cpp @@ -53,22 +53,26 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po return(state); } + // configure bitrate _rxBw = 125.0; state = setBitRate(br); if(state != ERR_NONE) { return(state); } + // configure default RX bandwidth state = setRxBandwidth(rxBw); if(state != ERR_NONE) { return(state); } + // configure default frequency deviation state = setFrequencyDeviation(freqDev); if(state != ERR_NONE) { return(state); } + // configure default TX output power state = setOutputPower(power); if(state != ERR_NONE) { return(state); @@ -81,6 +85,12 @@ int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t po return(state); } + // set default packet length mode + state = variablePacketLengthMode(); + if (state != ERR_NONE) { + return(state); + } + // SX1231 V2a only if(_chipRevision == SX1231_CHIP_REVISION_2_A) { // modify default OOK threshold value From da6072cf7324de205012de8b407c23bc27b0321a Mon Sep 17 00:00:00 2001 From: BarryPSmith Date: Fri, 8 Nov 2019 08:20:52 -0800 Subject: [PATCH 39/83] Adjusted setPaConfig in SX126x setOutputPower. --- src/modules/SX1261.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/modules/SX1261.h | 15 ++++++++++++++- src/modules/SX1262.cpp | 27 +++++++++++++++++++++------ 3 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 src/modules/SX1261.cpp diff --git a/src/modules/SX1261.cpp b/src/modules/SX1261.cpp new file mode 100644 index 00000000..15d6e1fa --- /dev/null +++ b/src/modules/SX1261.cpp @@ -0,0 +1,40 @@ +#include "SX1261.h" + +// note that this is untested (lacking the hardware) and based purely on the datasheet. +int16_t SX1261::setOutputPower(int8_t power) { + // check allowed power range + if (!((power >= -17) && (power <= 14))) { + return(ERR_INVALID_OUTPUT_POWER); + } + + // get current OCP configuration + uint8_t ocp = 0; + int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + if (state != ERR_NONE) { + return(state); + } + + // set PA config for optimal consumption as described in section 13-21 of the datasheet: + // the final column of Table 13-21 suggests that the value passed in SetTxParams is actually scaled depending on the parameters of setPaConfig. However, testing suggests this isn't the case. + if (power > 10) { + state = SX126x::setPaConfig(0x04, 0x00, SX126X_PA_CONFIG_HP_MAX/*0x07*/); + } + else { + state = SX126x::setPaConfig(0x01, 0x00, 0x05); + } + if (state != ERR_NONE) { + return(state); + } + // TODO investigate if better power efficiency can be achieved using undocumented even lower settings + + // set output power + // TODO power ramp time configuration + state = SX126x::setTxParams(power); + if (state != ERR_NONE) { + return state; + } + + + // restore OCP configuration + return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); +} diff --git a/src/modules/SX1261.h b/src/modules/SX1261.h index cb8a5758..b9c8c741 100644 --- a/src/modules/SX1261.h +++ b/src/modules/SX1261.h @@ -11,6 +11,19 @@ #define SX126X_PA_CONFIG_SX1262 0x00 // TODO: implement SX1261 class -using SX1261 = SX1262; +class SX1261 : public SX1262 { +public: + /*! + \brief Default constructor. + + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1261(Module* mod) + : SX1262(mod) { + } + + int16_t setOutputPower(int8_t power); +}; + #endif diff --git a/src/modules/SX1262.cpp b/src/modules/SX1262.cpp index 0bcce47d..d2482593 100644 --- a/src/modules/SX1262.cpp +++ b/src/modules/SX1262.cpp @@ -85,7 +85,7 @@ int16_t SX1262::setFrequency(float freq, bool calibrate) { int16_t SX1262::setOutputPower(int8_t power) { // check allowed power range - if(!((power >= -17) && (power <= 22))) { + if(!((power >= -9) && (power <= 22))) { return(ERR_INVALID_OUTPUT_POWER); } @@ -96,16 +96,31 @@ int16_t SX1262::setOutputPower(int8_t power) { return(state); } - // enable high power PA for output power higher than 14 dBm - if(power > 13) { - SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1262); + // set PA config for optimal consumption as described in section 13-21 of the datasheet: + // the final column of Table 13-21 suggests that the value passed in SetTxParams is actually scaled depending on the parameters of setPaConfig. However, testing suggests this isn't the case. + if (power >= 21) { + state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1262, SX126X_PA_CONFIG_HP_MAX/*0x07*/); + } else if (power >= 18) { + state = SX126x::setPaConfig(0x03, SX126X_PA_CONFIG_SX1262, 0x05); + } else if (power >= 15) { + state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262, 0x03); } else { - SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1261); + state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262, 0x02); } + if (state != ERR_NONE) { + return(state); + } + // TODO investigate if better power efficiency can be achieved using undocumented even lower settings + + // note that we set SX126X_PA_CONFIG_SX1262 for all power levels - setting SX126X_PA_CONFIG_SX1261 causes no output (on the nameless module I have). // set output power // TODO power ramp time configuration - SX126x::setTxParams(power); + state = SX126x::setTxParams(power); + if (state != ERR_NONE) { + return state; + } + // restore OCP configuration return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); From 111d9fa6253a8bba6d086a11a588bf8b06ae03a2 Mon Sep 17 00:00:00 2001 From: BarryPSmith Date: Fri, 8 Nov 2019 08:44:42 -0800 Subject: [PATCH 40/83] Missed SX1261 PA Config flag in previous commit --- src/modules/SX1261.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/SX1261.cpp b/src/modules/SX1261.cpp index 15d6e1fa..6f86e79b 100644 --- a/src/modules/SX1261.cpp +++ b/src/modules/SX1261.cpp @@ -17,10 +17,10 @@ int16_t SX1261::setOutputPower(int8_t power) { // set PA config for optimal consumption as described in section 13-21 of the datasheet: // the final column of Table 13-21 suggests that the value passed in SetTxParams is actually scaled depending on the parameters of setPaConfig. However, testing suggests this isn't the case. if (power > 10) { - state = SX126x::setPaConfig(0x04, 0x00, SX126X_PA_CONFIG_HP_MAX/*0x07*/); + state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1261, 0x00); } else { - state = SX126x::setPaConfig(0x01, 0x00, 0x05); + state = SX126x::setPaConfig(0x01, SX126X_PA_CONFIG_SX1261, 0x00); } if (state != ERR_NONE) { return(state); From 39a4614a775f0f81fd00cafb4af4b50c8eeaf314 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Fri, 8 Nov 2019 18:07:36 +0100 Subject: [PATCH 41/83] Call `_mod->SPIwriteRegister()` not `SPIwriteRegister()` --- src/modules/RF69.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 26d479dc..a0febe19 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -263,7 +263,7 @@ int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) { // optionally write packet length if (_packetLengthConfig == RF69_PACKET_FORMAT_VARIABLE) { - SPIwriteRegister(RF69_REG_FIFO, len); + _mod->SPIwriteRegister(RF69_REG_FIFO, len); } // check address filtering From 5b04badb3628c1162fc8eab9bfe296bcf227d904 Mon Sep 17 00:00:00 2001 From: BarryPSmith Date: Mon, 11 Nov 2019 11:26:41 -0800 Subject: [PATCH 42/83] Implemented power scaling in setOutputPower, in accordance with datasheet. --- src/modules/SX1262.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/modules/SX1262.cpp b/src/modules/SX1262.cpp index d2482593..d4342243 100644 --- a/src/modules/SX1262.cpp +++ b/src/modules/SX1262.cpp @@ -85,27 +85,37 @@ int16_t SX1262::setFrequency(float freq, bool calibrate) { int16_t SX1262::setOutputPower(int8_t power) { // check allowed power range - if(!((power >= -9) && (power <= 22))) { + if (!((power >= -17) && (power <= 22))) { return(ERR_INVALID_OUTPUT_POWER); } // get current OCP configuration uint8_t ocp = 0; int16_t state = readRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); - if(state != ERR_NONE) { + if (state != ERR_NONE) { return(state); } + int8_t scaledPower; // set PA config for optimal consumption as described in section 13-21 of the datasheet: - // the final column of Table 13-21 suggests that the value passed in SetTxParams is actually scaled depending on the parameters of setPaConfig. However, testing suggests this isn't the case. + // the final column of Table 13-21 suggests that the value passed in SetTxParams + // is actually scaled depending on the parameters of setPaConfig. + // Testing confirms this is approximately right if (power >= 21) { state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1262, SX126X_PA_CONFIG_HP_MAX/*0x07*/); - } else if (power >= 18) { + scaledPower = power; + } + else if (power >= 18) { state = SX126x::setPaConfig(0x03, SX126X_PA_CONFIG_SX1262, 0x05); - } else if (power >= 15) { + scaledPower = power + 2; + } + else if (power >= 15) { state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262, 0x03); - } else { + scaledPower = power + 5; + } + else { state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262, 0x02); + scaledPower = power + 8; } if (state != ERR_NONE) { return(state); @@ -116,7 +126,7 @@ int16_t SX1262::setOutputPower(int8_t power) { // set output power // TODO power ramp time configuration - state = SX126x::setTxParams(power); + state = SX126x::setTxParams(scaledPower); if (state != ERR_NONE) { return state; } From cc399297043c05ab982337cf7b461f5cab6a94af Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Tue, 12 Nov 2019 12:00:08 +0100 Subject: [PATCH 43/83] Added fixed-length example for CC1101 --- .../CC1101_Receive_Fixed.ino | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 examples/CC1101/CC1101_Receive_Fixed/CC1101_Receive_Fixed.ino diff --git a/examples/CC1101/CC1101_Receive_Fixed/CC1101_Receive_Fixed.ino b/examples/CC1101/CC1101_Receive_Fixed/CC1101_Receive_Fixed.ino new file mode 100644 index 00000000..fbf20062 --- /dev/null +++ b/examples/CC1101/CC1101_Receive_Fixed/CC1101_Receive_Fixed.ino @@ -0,0 +1,98 @@ +/* + RadioLib CC1101 Receive Example (fixed length mode) + + This example receives packets using CC1101 FSK radio module. + To successfully receive data, the following settings have to be the same + on both transmitter and receiver: + - carrier frequency + - bit rate + - frequency deviation + - sync word + + For full API reference, see the GitHub Pages + https://jgromes.github.io/RadioLib/ +*/ + +// receive 9 bytes of payload after the sync word +#define FIXED_PKT_LEN 9 + +// include the library +#include + +// CC1101 has the following connections: +// NSS pin: 10 +// GDO0 pin: 2 +// GDO2 pin: 3 +CC1101 cc = new Module(10, 2, 3); + +// or using RadioShield +// https://github.com/jgromes/RadioShield +//CC1101 cc = RadioShield.ModuleA; + +void setup() { + Serial.begin(9600); + + // initialize CC1101 with default settings + Serial.print(F("[CC1101] Initializing ... ")); + // carrier frequency: 868.0 MHz + // bit rate: 4.8 kbps + // Rx bandwidth: 325.0 kHz + // frequency deviation: 48.0 kHz + // sync word: 0xD391 + int state = cc.begin(); + + // Fixed packet length mode (non-default setting) + state = cc.fixedPacketLengthMode(FIXED_PKT_LEN); + + if (state == ERR_NONE) { + Serial.println(F("success!")); + } else { + Serial.print(F("failed, code ")); + Serial.println(state); + while (true); + } +} + +void loop() { + Serial.print(F("[CC1101] Waiting for incoming transmission ... ")); + + // you can receive data as an Arduino String + String str; + int state = cc.receive(str); + + // you can also receive data as byte array + /* + byte byteArr[8]; + int state = cc.receive(byteArr, 8); + */ + + if (state == ERR_NONE) { + // packet was successfully received + Serial.println(F("success!")); + + // print the data of the packet + Serial.print(F("[CC1101] Data:\t\t")); + Serial.println(str); + + // print RSSI (Received Signal Strength Indicator) + // of the last received packet + Serial.print(F("[CC1101] RSSI:\t\t")); + Serial.print(cc.getRSSI()); + Serial.println(F(" dBm")); + + // print LQI (Link Quality Indicator) + // of the last received packet, lower is better + Serial.print(F("[CC1101] LQI:\t\t")); + Serial.println(cc.getLQI()); + + } else if (state == ERR_CRC_MISMATCH) { + // packet was received, but is malformed + Serial.println(F("CRC error!")); + + } else { + // some other error occurred + Serial.print(F("failed, code ")); + Serial.println(state); + + } +} From 1f26d3d5a3848b3dea77bae4f4740bc7bc64c46f Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 12 Nov 2019 17:24:49 +0100 Subject: [PATCH 44/83] Fixed SoftwareSerial for ESP8266 core 2.6.0 --- src/ISerial.cpp | 4 ++++ src/Module.cpp | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/src/ISerial.cpp b/src/ISerial.cpp index bc280e68..4bc72a9d 100644 --- a/src/ISerial.cpp +++ b/src/ISerial.cpp @@ -5,7 +5,11 @@ ISerial::ISerial(Module* mod) { } void ISerial::begin(long speed) { +#if defined(ESP8266) + _mod->ModuleSerial->begin(speed, _mod->getRx(), _mod->getTx(), SWSERIAL_8N1); +#else _mod->ModuleSerial->begin(speed); +#endif } bool ISerial::listen() { diff --git a/src/Module.cpp b/src/Module.cpp index 1c994eff..b706c56e 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -9,6 +9,9 @@ Module::Module(int rx, int tx, HardwareSerial* useSer) { #ifdef SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; +#elif defined(ESP8266) + ModuleSerial = new SoftwareSerial(); + (void)useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); (void)useSer; @@ -36,6 +39,9 @@ Module::Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi, SPISet #ifdef SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; +#elif defined(ESP8266) + ModuleSerial = new SoftwareSerial(); + (void)useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); (void)useSer; @@ -63,6 +69,8 @@ void Module::init(uint8_t interface, uint8_t gpio) { case USE_UART: #if defined(ESP32) ModuleSerial->begin(baudrate, SERIAL_8N1, _rx, _tx); +#elif defined(ESP8266) + ModuleSerial->begin(baudrate, _rx, _tx, SWSERIAL_8N1); #else ModuleSerial->begin(baudrate); #endif From 50f400eb109f124573fda4112df2e3963b46b876 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 12 Nov 2019 17:26:15 +0100 Subject: [PATCH 45/83] Fixed keyword separator --- keywords.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keywords.txt b/keywords.txt index 2ffc5a94..dcec71c7 100644 --- a/keywords.txt +++ b/keywords.txt @@ -88,8 +88,8 @@ setDataShaping KEYWORD2 setOOK KEYWORD2 setDataShapingOOK KEYWORD2 setCRC KEYWORD2 -variablePacketLengthMode KEYWORD2 -fixedPacketLengthMode KEYWORD2 +variablePacketLengthMode KEYWORD2 +fixedPacketLengthMode KEYWORD2 # RF69-specific setAESKey KEYWORD2 From 35361ce198a3f4b0cb40a9dacf6e0cfe3f7a5b26 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Tue, 12 Nov 2019 17:56:36 +0100 Subject: [PATCH 46/83] Implemented promiscuous mode for CC1101 and RF69 --- src/modules/CC1101.cpp | 106 +++++++++++++++++++++++++++++++++++++++-- src/modules/CC1101.h | 65 ++++++++++++++++++++++++- src/modules/RF69.cpp | 85 ++++++++++++++++++++++++++++++--- src/modules/RF69.h | 49 ++++++++++++++++++- 4 files changed, 290 insertions(+), 15 deletions(-) diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index 657400a0..089323dd 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -4,6 +4,8 @@ CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_E _mod = module; _packetLengthQueried = false; _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; + + _syncWordLength = CC1101_DEFAULT_SYNC_WORD_LENGTH; } int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { @@ -441,11 +443,35 @@ int16_t CC1101::setOutputPower(int8_t power) { return(SPIsetRegValue(CC1101_REG_PATABLE, powerRaw)); } -int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL) { - // set sync word - int16_t state = SPIsetRegValue(CC1101_REG_SYNC1, syncH); - state |= SPIsetRegValue(CC1101_REG_SYNC0, syncL); - return(state); +int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) { + if(maxErrBits > 1) { + return(ERR_INVALID_SYNC_WORD); + } + + // sync word must not contain value 0x00 + for(uint8_t i = 0; i < len; i++) { + if(syncWord[i] == 0x00) { + return(ERR_INVALID_SYNC_WORD); + } + } + + _syncWordLength = len; + + // enable sync word filtering + int16_t state = enableSyncWordFiltering(maxErrBits); + if (state != ERR_NONE) { + return(state); + } + + // set sync word register + _mod->SPIwriteRegisterBurst(CC1101_REG_SYNC1, syncWord, len); + + return(ERR_NONE); +} + +int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits) { + uint8_t syncWord[] = { syncH, syncL }; + return(setSyncWord(syncWord, sizeof(syncWord), maxErrBits)); } int16_t CC1101::setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs) { @@ -547,6 +573,76 @@ int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { return(state); } +int16_t CC1101::enableSyncWordFiltering(uint8_t maxErrBits) { + if (maxErrBits > 1) { + return(ERR_INVALID_SYNC_WORD); + } + + if (maxErrBits == 0) { + if (_syncWordLength == 1) { + // in 16 bit sync word, expect all 16 bits + return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_16_16, 2, 0)); + } else if (_syncWordLength == 2) { + // there's no 32 of 32 case, so we resort to 30 of 32 bits required + return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_30_32, 2, 0)); + } + } + + if (maxErrBits == 1) { + if (_syncWordLength == 1) { + // in 16 bit sync word, expect at least 15 bits + return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_15_16, 2, 0)); + } else if (_syncWordLength == 2) { + // in 32 bits sync word (16 + 16), expect 30 of 32 to match + return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_30_32, 2, 0)); + } + } + + return(ERR_NONE); +} + +int16_t CC1101::disableSyncWordFiltering() { + return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_NONE, 2, 0)); +} + +int16_t CC1101::enableCrcFiltering() { + return(SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_ON, 2, 2)); +} + +int16_t CC1101::disableCrcFiltering() { + return(SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_OFF, 2, 2)); +} + +int16_t CC1101::promiscuousMode(bool promiscuous) { + int16_t state = ERR_NONE; + + if (_promiscuous == promiscuous) { + return(state); + } + + if (promiscuous == true) { + // disable preamble and sync word filtering and insertion + state = disableSyncWordFiltering(); + if (state != ERR_NONE) { + return(state); + } + + // disable CRC filtering + state = disableCrcFiltering(); + } else { + // enable preamble and sync word filtering and insertion + state = enableSyncWordFiltering(); + if (state != ERR_NONE) { + return(state); + } + + // enable CRC filtering + state = enableCrcFiltering(); + } + + return(state); +} + int16_t CC1101::config() { // enable automatic frequency synthesizer calibration int16_t state = SPIsetRegValue(CC1101_REG_MCSM0, CC1101_FS_AUTOCAL_IDLE_TO_RXTX, 5, 4); diff --git a/src/modules/CC1101.h b/src/modules/CC1101.h index c57a7e6d..2fbc0d1c 100644 --- a/src/modules/CC1101.h +++ b/src/modules/CC1101.h @@ -10,6 +10,9 @@ #define CC1101_CRYSTAL_FREQ 26.0 #define CC1101_DIV_EXPONENT 16 #define CC1101_MAX_PACKET_LENGTH 63 +#define CC1101_MAX_SYNC_WORD_LENGTH 2 +#define CC1101_DEFAULT_SYNC_WORD_LENGTH 2 +#define CC1101_DEFAULT_SYNC_WORD { 0xD3, 0x91 } // CC1101 SPI commands #define CC1101_CMD_READ 0b10000000 @@ -237,7 +240,7 @@ #define CC1101_MOD_FORMAT_MFSK 0b01110000 // 6 4 MFSK - only for data rates above 26 kBaud #define CC1101_MANCHESTER_EN_OFF 0b00000000 // 3 3 Manchester encoding: disabled (default) #define CC1101_MANCHESTER_EN_ON 0b00001000 // 3 3 enabled -#define CC1101_SYNC_MODE_NONE 0b00000000 // 2 0 synchronization: no preamble sync +#define CC1101_SYNC_MODE_NONE 0b00000000 // 2 0 synchronization: no preamble/sync #define CC1101_SYNC_MODE_15_16 0b00000001 // 2 0 15/16 sync word bits #define CC1101_SYNC_MODE_16_16 0b00000010 // 2 0 16/16 sync word bits (default) #define CC1101_SYNC_MODE_30_32 0b00000011 // 2 0 30/32 sync word bits @@ -694,9 +697,24 @@ class CC1101: public PhysicalLayer { \param syncL LSB of the sync word. + \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. + \returns \ref status_codes */ - int16_t setSyncWord(uint8_t syncH, uint8_t syncL); + int16_t setSyncWord(uint8_t syncH, uint8_t syncL, uint8_t maxErrBits = 0); + + /*! + \brief Sets 1 or 2 bytes of sync word. + + \param syncWord Pointer to the array of sync word bytes. + + \param len Sync word length in bytes. + + \param maxErrBits Maximum allowed number of bit errors in received sync word. Defaults to 0. + + \returns \ref status_codes + */ + int16_t setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits = 0); /*! \brief Sets node and broadcast addresses. Calling this method will also enable address filtering. @@ -757,6 +775,45 @@ class CC1101: public PhysicalLayer { */ int16_t variablePacketLengthMode(uint8_t maxLen = CC1101_MAX_PACKET_LENGTH); + /*! + \brief Enable sync word filtering and generation. + + \param len Size of sync word (1 or 2 bytes). + + \returns \ref status_codes + */ + int16_t enableSyncWordFiltering(uint8_t len = CC1101_DEFAULT_SYNC_WORD_LENGTH); + + /*! + \brief Disable preamble and sync word filtering and generation. + + \returns \ref status_codes + */ + int16_t disableSyncWordFiltering(); + + /*! + \brief Enable CRC filtering and generation. + + \returns \ref status_codes + */ + int16_t enableCrcFiltering(); + + /*! + \brief Disable CRC filtering and generation. + + \returns \ref status_codes + */ + int16_t disableCrcFiltering(); + + /*! + \brief Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address, CRC). + + \param promiscuous Set or unset promiscuous mode. + + \returns \ref status_codes + */ + int16_t promiscuousMode(bool promiscuous = true); + private: Module* _mod; @@ -768,6 +825,10 @@ class CC1101: public PhysicalLayer { bool _packetLengthQueried; uint8_t _packetLengthConfig; + bool _promiscuous; + + uint8_t _syncWordLength; + int16_t config(); int16_t directMode(); void getExpMant(float target, uint16_t mantOffset, uint8_t divExp, uint8_t expMax, uint8_t& exp, uint8_t& mant); diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index a0febe19..35fa9b9a 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -3,8 +3,13 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT, RF69_MAX_PACKET_LENGTH) { _mod = module; _tempOffset = 0; + _packetLengthQueried = false; _packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE; + + _promiscuous = false; + + _syncWordLength = RF69_DEFAULT_SYNC_WORD_LENGTH; } int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { @@ -87,8 +92,8 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe } // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library - uint8_t syncWord[] = {0x2D, 0x01}; - state = setSyncWord(syncWord, 2); + uint8_t syncWord[] = RF69_DEFAULT_SYNC_WORD; + state = setSyncWord(syncWord, sizeof(syncWord)); if(state != ERR_NONE) { return(state); } @@ -495,7 +500,7 @@ int16_t RF69::setOutputPower(int8_t power) { int16_t RF69::setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits) { // check constraints - if((maxErrBits > 7) || (len > 8)) { + if((maxErrBits > 7) || (len > RF69_MAX_SYNC_WORD_LENGTH)) { return(ERR_INVALID_SYNC_WORD); } @@ -506,13 +511,14 @@ int16_t RF69::setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits) { } } - // enable sync word recognition - int16_t state = _mod->SPIsetRegValue(RF69_REG_SYNC_CONFIG, RF69_SYNC_ON | RF69_FIFO_FILL_CONDITION_SYNC | (len - 1) << 3 | maxErrBits, 7, 0); - if(state != ERR_NONE) { + _syncWordLength = len; + + int16_t state = enableSyncWordFiltering(maxErrBits); + if (state != ERR_NONE) { return(state); } - // set sync word + // set sync word register _mod->SPIwriteRegisterBurst(RF69_REG_SYNC_VALUE_1, syncWord, len); return(ERR_NONE); } @@ -636,6 +642,71 @@ int16_t RF69::variablePacketLengthMode(uint8_t maxLen) { return(state); } +int16_t RF69::enableSyncWordFiltering(uint8_t maxErrBits) { + // enable sync word recognition + int16_t state = _mod->SPIsetRegValue(RF69_REG_SYNC_CONFIG, RF69_SYNC_ON | RF69_FIFO_FILL_CONDITION_SYNC | (_syncWordLength - 1) << 3 | maxErrBits, 7, 0); + if(state != ERR_NONE) { + return(state); + } + + return(state); +} + +int16_t RF69::disableSyncWordFiltering() { + // disable preamble detection and generation + int16_t state = _mod->SPIsetRegValue(RF69_REG_PREAMBLE_LSB, 0, 7, 0); + state |= _mod->SPIsetRegValue(RF69_REG_PREAMBLE_MSB, 0, 7, 0); + if (state != ERR_NONE) { + return(state); + } + + // disable sync word detection and generation + state = _mod->SPIsetRegValue(RF69_REG_SYNC_CONFIG, RF69_SYNC_OFF | RF69_FIFO_FILL_CONDITION, 7, 6); + if (state != ERR_NONE) { + return(state); + } + + return(state); +} + +int16_t RF69::enableCrcFiltering() { + return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_CRC_ON), 4, 4); +} + +int16_t RF69::disableCrcFiltering() { + return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_CRC_OFF), 4, 4); +} + +int16_t RF69::promiscuousMode(bool promiscuous) { + int16_t state = ERR_NONE; + + if (_promiscuous == promiscuous) { + return(state); + } + + if (promiscuous == true) { + // disable preamble and sync word filtering and insertion + state = disableSyncWordFiltering(); + if (state != ERR_NONE) { + return(state); + } + + // disable CRC filtering + state = disableCrcFiltering(); + } else { + // enable preamble and sync word filtering and insertion + state = enableSyncWordFiltering(); + if (state != ERR_NONE) { + return(state); + } + + // enable CRC filtering + state = enableCrcFiltering(); + } + + return(state); +} + int16_t RF69::config() { int16_t state = ERR_NONE; diff --git a/src/modules/RF69.h b/src/modules/RF69.h index 9820d539..26c71108 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69.h @@ -10,6 +10,10 @@ #define RF69_CRYSTAL_FREQ 32.0 #define RF69_DIV_EXPONENT 19 #define RF69_MAX_PACKET_LENGTH 64 +#define RF69_MAX_PREAMBLE_LENGTH 4 +#define RF69_MAX_SYNC_WORD_LENGTH 8 +#define RF69_DEFAULT_SYNC_WORD_LENGTH 2 +#define RF69_DEFAULT_SYNC_WORD { 0x2D, 0x01 } // RF69 register map #define RF69_REG_FIFO 0x00 @@ -646,7 +650,7 @@ class RF69: public PhysicalLayer { int16_t setOutputPower(int8_t power); /*! - \brief Sets sync word. Up to 8 bytes can be set as snyc word. + \brief Sets sync word. Up to 8 bytes can be set as sync word. \param syncWord Pointer to the array of sync word bytes. @@ -724,6 +728,45 @@ class RF69: public PhysicalLayer { */ int16_t variablePacketLengthMode(uint8_t maxLen = RF69_MAX_PACKET_LENGTH); + /*! + \brief Enable sync word filtering and generation. + + \param numBits Sync word length in bits. + + \returns \ref status_codes + */ + int16_t enableSyncWordFiltering(uint8_t numBits = 16); + + /*! + \brief Disable preamble and sync word filtering and generation. + + \returns \ref status_codes + */ + int16_t disableSyncWordFiltering(); + + /*! + \brief Enable CRC filtering and generation. + + \returns \ref status_codes + */ + int16_t enableCrcFiltering(); + + /*! + \brief Disable CRC filtering and generation. + + \returns \ref status_codes + */ + int16_t disableCrcFiltering(); + + /*! + \brief Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address, CRC). + + \param promiscuous Set or unset promiscuous mode. + + \returns \ref status_codes + */ + int16_t promiscuousMode(bool promiscuous = true); + protected: Module* _mod; @@ -735,6 +778,10 @@ class RF69: public PhysicalLayer { bool _packetLengthQueried; uint8_t _packetLengthConfig; + bool _promiscuous; + + uint8_t _syncWordLength; + int16_t config(); int16_t directMode(); From fc27b5a427fdecae1293d0bd3c25757f8a63c986 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 12 Nov 2019 18:40:36 +0100 Subject: [PATCH 47/83] Fixed link to ESP32 package index --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1cc541cd..5a7c5598 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ before_install: - sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # install 3rd party boards - - arduino --pref "boardsmanager.additional.urls=http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://dl.espressif.com/dl/package_esp32_index.json,https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json" --save-prefs 2>&1 + - arduino --pref "boardsmanager.additional.urls=http://arduino.esp8266.com/stable/package_esp8266com_index.json,https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json,https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json" --save-prefs 2>&1 - if [[ "$BOARD" =~ "esp8266:esp8266:" ]]; then arduino --install-boards esp8266:esp8266; export SKIP_PAT='(HTTP|MQTT).*ino'; From 621da8a11d305bbad317792560000d345119e7c0 Mon Sep 17 00:00:00 2001 From: BarryPSmith Date: Tue, 12 Nov 2019 10:28:14 -0800 Subject: [PATCH 48/83] Implemented optimal PA settings for SX1268. Ensured OCP is always restored when changing power. Slight refactor to avoid duplicated SX1262 / SX1268 code. --- src/modules/SX1261.cpp | 42 +++++++++++++++++++++----------------- src/modules/SX1261.h | 24 +++++++++++----------- src/modules/SX1262.cpp | 46 ++++++++++++------------------------------ src/modules/SX1262.h | 2 -- src/modules/SX1268.cpp | 19 +++++++++++++---- src/modules/SX126x.cpp | 26 ++++++++++++++++++++++++ src/modules/SX126x.h | 3 +++ 7 files changed, 93 insertions(+), 69 deletions(-) diff --git a/src/modules/SX1261.cpp b/src/modules/SX1261.cpp index 6f86e79b..8d8cd0ab 100644 --- a/src/modules/SX1261.cpp +++ b/src/modules/SX1261.cpp @@ -14,27 +14,33 @@ int16_t SX1261::setOutputPower(int8_t power) { return(state); } - // set PA config for optimal consumption as described in section 13-21 of the datasheet: - // the final column of Table 13-21 suggests that the value passed in SetTxParams is actually scaled depending on the parameters of setPaConfig. However, testing suggests this isn't the case. - if (power > 10) { + state = setOptimalLowPowerPaConfig(&power); + + // set output power + // TODO power ramp time configuration + if (state == ERR_NONE) { + state = SX126x::setTxParams(power); + } + + // restore OCP configuration + int16_t state2 = writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + + if (state != ERR_NONE) { + return state; + } else { + return state2; + } +} + +int16_t SX1261::setOptimalLowPowerPaConfig(int8_t* inOutPower) +{ + int16_t state; + if (*inOutPower > 10) { state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1261, 0x00); } else { state = SX126x::setPaConfig(0x01, SX126X_PA_CONFIG_SX1261, 0x00); + *inOutPower -= 4; } - if (state != ERR_NONE) { - return(state); - } - // TODO investigate if better power efficiency can be achieved using undocumented even lower settings - - // set output power - // TODO power ramp time configuration - state = SX126x::setTxParams(power); - if (state != ERR_NONE) { - return state; - } - - - // restore OCP configuration - return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); + return state; } diff --git a/src/modules/SX1261.h b/src/modules/SX1261.h index b9c8c741..4b1ce8fc 100644 --- a/src/modules/SX1261.h +++ b/src/modules/SX1261.h @@ -6,23 +6,23 @@ #include "SX126x.h" #include "SX1262.h" -//SX126X_CMD_SET_PA_CONFIG -#define SX126X_PA_CONFIG_SX1261 0x01 -#define SX126X_PA_CONFIG_SX1262 0x00 // TODO: implement SX1261 class class SX1261 : public SX1262 { -public: - /*! - \brief Default constructor. + public: + /*! + \brief Default constructor. - \param mod Instance of Module that will be used to communicate with the radio. - */ - SX1261(Module* mod) - : SX1262(mod) { - } + \param mod Instance of Module that will be used to communicate with the radio. + */ + SX1261(Module* mod) + : SX1262(mod) { + } - int16_t setOutputPower(int8_t power); + int16_t setOutputPower(int8_t power); + + private: + int16_t setOptimalLowPowerPaConfig(int8_t* inOutPower); }; diff --git a/src/modules/SX1262.cpp b/src/modules/SX1262.cpp index d4342243..94f94837 100644 --- a/src/modules/SX1262.cpp +++ b/src/modules/SX1262.cpp @@ -85,7 +85,7 @@ int16_t SX1262::setFrequency(float freq, bool calibrate) { int16_t SX1262::setOutputPower(int8_t power) { // check allowed power range - if (!((power >= -17) && (power <= 22))) { + if (!(power >= -17 && power <= 22)) { return(ERR_INVALID_OUTPUT_POWER); } @@ -96,42 +96,22 @@ int16_t SX1262::setOutputPower(int8_t power) { return(state); } - int8_t scaledPower; - // set PA config for optimal consumption as described in section 13-21 of the datasheet: - // the final column of Table 13-21 suggests that the value passed in SetTxParams - // is actually scaled depending on the parameters of setPaConfig. - // Testing confirms this is approximately right - if (power >= 21) { - state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1262, SX126X_PA_CONFIG_HP_MAX/*0x07*/); - scaledPower = power; - } - else if (power >= 18) { - state = SX126x::setPaConfig(0x03, SX126X_PA_CONFIG_SX1262, 0x05); - scaledPower = power + 2; - } - else if (power >= 15) { - state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262, 0x03); - scaledPower = power + 5; - } - else { - state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262, 0x02); - scaledPower = power + 8; - } - if (state != ERR_NONE) { - return(state); - } - // TODO investigate if better power efficiency can be achieved using undocumented even lower settings - - // note that we set SX126X_PA_CONFIG_SX1262 for all power levels - setting SX126X_PA_CONFIG_SX1261 causes no output (on the nameless module I have). + // this function sets the optimal PA settings + // and scales our requested power based + state = SX126x::setOptimalHiPowerPaConfig(&power); // set output power // TODO power ramp time configuration - state = SX126x::setTxParams(scaledPower); - if (state != ERR_NONE) { - return state; + if (state == ERR_NONE) { + state = SX126x::setTxParams(power); } - // restore OCP configuration - return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); + int16_t state2 = writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + + if (state != ERR_NONE) { + return state; + } else { + return state2; + } } diff --git a/src/modules/SX1262.h b/src/modules/SX1262.h index 88a49576..b9a26a5f 100644 --- a/src/modules/SX1262.h +++ b/src/modules/SX1262.h @@ -6,8 +6,6 @@ #include "SX126x.h" //SX126X_CMD_SET_PA_CONFIG -#define SX126X_PA_CONFIG_SX1261 0x01 -#define SX126X_PA_CONFIG_SX1262 0x00 /*! \class SX1262 diff --git a/src/modules/SX1268.cpp b/src/modules/SX1268.cpp index c0b01a80..a752c638 100644 --- a/src/modules/SX1268.cpp +++ b/src/modules/SX1268.cpp @@ -78,6 +78,9 @@ int16_t SX1268::setFrequency(float freq, bool calibrate) { int16_t SX1268::setOutputPower(int8_t power) { // check allowed power range + // TODO with optimal PA config + // it's likely possible this could be expanded to go down to -17 just like for SX1262. + // but the datasheet doesn't explicitly state that and I don't have SX1268 unit to test with if(!((power >= -9) && (power <= 22))) { return(ERR_INVALID_OUTPUT_POWER); } @@ -89,13 +92,21 @@ int16_t SX1268::setOutputPower(int8_t power) { return(state); } - // enable high power PA - SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1268); + // enable optimal PA + state = SX126x::setOptimalHiPowerPaConfig(&power); // set output power // TODO power ramp time configuration - SX126x::setTxParams(power); + if (state == ERR_NONE) { + state = SX126x::setTxParams(power); + } // restore OCP configuration - return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); + int16_t state2 = writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); + + if (state != ERR_NONE) { + return state; + } else { + return state2; + } } diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index e47ad31c..2e759226 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1127,6 +1127,32 @@ int16_t SX126x::setTxParams(uint8_t power, uint8_t rampTime) { return(SPIwriteCommand(SX126X_CMD_SET_TX_PARAMS, data, 2)); } +// set PA config for optimal consumption as described in section 13-21 of the datasheet: +// the final column of Table 13-21 suggests that the value passed in SetTxParams +// is actually scaled depending on the parameters of setPaConfig. +// Testing confirms this is approximately right +int16_t SX126x::setOptimalHiPowerPaConfig(int8_t* inOutPower) +{ + int16_t state; + if (*inOutPower >= 21) { + state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1262_8, SX126X_PA_CONFIG_HP_MAX/*0x07*/); + } + else if (*inOutPower >= 18) { + state = SX126x::setPaConfig(0x03, SX126X_PA_CONFIG_SX1262_8, 0x05); + *inOutPower += 2; + } + else if (*inOutPower >= 15) { + state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262_8, 0x03); + *inOutPower += 5; + } + else { + state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262_8, 0x02); + *inOutPower += 8; + } + // TODO investigate if better power efficiency can be achieved using undocumented even lower settings + return state; +} + int16_t SX126x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro) { // calculate symbol length and enable low data rate optimization, if needed if(ldro == 0xFF) { diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 641d6445..2bcd47ff 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -152,6 +152,8 @@ //SX126X_CMD_SET_PA_CONFIG #define SX126X_PA_CONFIG_HP_MAX 0x07 #define SX126X_PA_CONFIG_PA_LUT 0x01 +#define SX126X_PA_CONFIG_SX1261 0x01 +#define SX126X_PA_CONFIG_SX1262_8 0x00 //SX126X_CMD_SET_RX_TX_FALLBACK_MODE #define SX126X_RX_TX_FALLBACK_MODE_FS 0x40 // 7 0 after Rx/Tx go to: FS mode @@ -739,6 +741,7 @@ class SX126x: public PhysicalLayer { int16_t calibrateImage(uint8_t* data); uint8_t getPacketType(); int16_t setTxParams(uint8_t power, uint8_t rampTime = SX126X_PA_RAMP_200U); + int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); int16_t setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro = 0xFF); int16_t setModulationParamsFSK(uint32_t br, uint8_t pulseShape, uint8_t rxBw, uint32_t freqDev); int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength = 0xFF, uint8_t headerType = SX126X_LORA_HEADER_EXPLICIT, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); From 25f4e775c952266813f0ba439651898d00342cd9 Mon Sep 17 00:00:00 2001 From: BarryPSmith Date: Tue, 12 Nov 2019 13:01:50 -0800 Subject: [PATCH 49/83] Removed memory allocation and copying from SX126X read* and write* functions --- src/modules/SX126x.cpp | 57 +++++++++++++----------------------------- src/modules/SX126x.h | 2 ++ 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index e47ad31c..9964a4e5 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1036,18 +1036,8 @@ int16_t SX126x::setPaConfig(uint8_t paDutyCycle, uint8_t deviceSel, uint8_t hpMa } int16_t SX126x::writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) { - #ifdef STATIC_ONLY - uint8_t dat[STATIC_ARRAY_SIZE + 2]; - #else - uint8_t* dat = new uint8_t[2 + numBytes]; - #endif - dat[0] = (uint8_t)((addr >> 8) & 0xFF); - dat[1] = (uint8_t)(addr & 0xFF); - memcpy(dat + 2, data, numBytes); - int16_t state = SPIwriteCommand(SX126X_CMD_WRITE_REGISTER, dat, 2 + numBytes); - #ifndef STATIC_ONLY - delete[] dat; - #endif + uint8_t cmd[] = { SX126X_CMD_WRITE_REGISTER, (uint8_t)((addr >> 8) & 0xFF), (uint8_t)(addr & 0xFF) }; + int16_t state = SPIwriteCommand(cmd, 3, data, numBytes); return(state); } @@ -1057,34 +1047,15 @@ int16_t SX126x::readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes) { } int16_t SX126x::writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset) { - #ifdef STATIC_ONLY - uint8_t dat[STATIC_ARRAY_SIZE + 1]; - #else - uint8_t* dat = new uint8_t[1 + numBytes]; - #endif - dat[0] = offset; - memcpy(dat + 1, data, numBytes); - int16_t state = SPIwriteCommand(SX126X_CMD_WRITE_BUFFER, dat, 1 + numBytes); - #ifndef STATIC_ONLY - delete[] dat; - #endif + uint8_t cmd[] = { SX126X_CMD_WRITE_BUFFER, offset }; + int16_t state = SPIwriteCommand(cmd, 2, data, numBytes); + return(state); } int16_t SX126x::readBuffer(uint8_t* data, uint8_t numBytes) { - // offset will be always set to 0 (one extra NOP is sent) - #ifdef STATIC_ONLY - uint8_t dat[STATIC_ARRAY_SIZE + 1]; - #else - uint8_t* dat = new uint8_t[1 + numBytes]; - #endif - dat[0] = SX126X_CMD_NOP; - memcpy(dat + 1, data, numBytes); - int16_t state = SPIreadCommand(SX126X_CMD_READ_BUFFER, dat, 1 + numBytes); - memcpy(data, dat + 1, numBytes); - #ifndef STATIC_ONLY - delete[] dat; - #endif + uint8_t cmd[] = { SX126X_CMD_READ_BUFFER, SX126X_CMD_NOP }; + int16_t state = SPIreadCommand(cmd, 2, data, numBytes); return(state); } @@ -1265,14 +1236,20 @@ int16_t SX126x::config(uint8_t modem) { return(ERR_NONE); } +int16_t SX126x::SPIwriteCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy) { + return(SX126x::SPItransfer(cmd, cmdLen, true, data, NULL, numBytes, waitForBusy)); +} + int16_t SX126x::SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy) { - uint8_t cmdBuffer[] = {cmd}; - return(SX126x::SPItransfer(cmdBuffer, 1, true, data, NULL, numBytes, waitForBusy)); + return(SX126x::SPItransfer(&cmd, 1, true, data, NULL, numBytes, waitForBusy)); +} + +int16_t SX126x::SPIreadCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy) { + return(SX126x::SPItransfer(cmd, cmdLen, false, NULL, data, numBytes, waitForBusy)); } int16_t SX126x::SPIreadCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy) { - uint8_t cmdBuffer[] = {cmd}; - return(SX126x::SPItransfer(cmdBuffer, 1, false, NULL, data, numBytes, waitForBusy)); + return(SX126x::SPItransfer(&cmd, 1, false, NULL, data, numBytes, waitForBusy)); } int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes, bool waitForBusy, uint32_t timeout) { diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 641d6445..207fdd7b 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -769,7 +769,9 @@ class SX126x: public PhysicalLayer { // common low-level SPI interface int16_t SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy = true); + int16_t SPIwriteCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy = true); int16_t SPIreadCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy = true); + int16_t SPIreadCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy = true); int16_t SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* dataOut, uint8_t* dataIn, uint8_t numBytes, bool waitForBusy, uint32_t timeout = 5000); }; From b2f64a03ac1101ef0dcc93dbe165be3bd069bba0 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Wed, 13 Nov 2019 11:51:10 +0100 Subject: [PATCH 50/83] Removed CC1101 example fixed length as too specific --- .../CC1101_Receive_Fixed.ino | 98 ------------------- 1 file changed, 98 deletions(-) delete mode 100644 examples/CC1101/CC1101_Receive_Fixed/CC1101_Receive_Fixed.ino diff --git a/examples/CC1101/CC1101_Receive_Fixed/CC1101_Receive_Fixed.ino b/examples/CC1101/CC1101_Receive_Fixed/CC1101_Receive_Fixed.ino deleted file mode 100644 index fbf20062..00000000 --- a/examples/CC1101/CC1101_Receive_Fixed/CC1101_Receive_Fixed.ino +++ /dev/null @@ -1,98 +0,0 @@ -/* - RadioLib CC1101 Receive Example (fixed length mode) - - This example receives packets using CC1101 FSK radio module. - To successfully receive data, the following settings have to be the same - on both transmitter and receiver: - - carrier frequency - - bit rate - - frequency deviation - - sync word - - For full API reference, see the GitHub Pages - https://jgromes.github.io/RadioLib/ -*/ - -// receive 9 bytes of payload after the sync word -#define FIXED_PKT_LEN 9 - -// include the library -#include - -// CC1101 has the following connections: -// NSS pin: 10 -// GDO0 pin: 2 -// GDO2 pin: 3 -CC1101 cc = new Module(10, 2, 3); - -// or using RadioShield -// https://github.com/jgromes/RadioShield -//CC1101 cc = RadioShield.ModuleA; - -void setup() { - Serial.begin(9600); - - // initialize CC1101 with default settings - Serial.print(F("[CC1101] Initializing ... ")); - // carrier frequency: 868.0 MHz - // bit rate: 4.8 kbps - // Rx bandwidth: 325.0 kHz - // frequency deviation: 48.0 kHz - // sync word: 0xD391 - int state = cc.begin(); - - // Fixed packet length mode (non-default setting) - state = cc.fixedPacketLengthMode(FIXED_PKT_LEN); - - if (state == ERR_NONE) { - Serial.println(F("success!")); - } else { - Serial.print(F("failed, code ")); - Serial.println(state); - while (true); - } -} - -void loop() { - Serial.print(F("[CC1101] Waiting for incoming transmission ... ")); - - // you can receive data as an Arduino String - String str; - int state = cc.receive(str); - - // you can also receive data as byte array - /* - byte byteArr[8]; - int state = cc.receive(byteArr, 8); - */ - - if (state == ERR_NONE) { - // packet was successfully received - Serial.println(F("success!")); - - // print the data of the packet - Serial.print(F("[CC1101] Data:\t\t")); - Serial.println(str); - - // print RSSI (Received Signal Strength Indicator) - // of the last received packet - Serial.print(F("[CC1101] RSSI:\t\t")); - Serial.print(cc.getRSSI()); - Serial.println(F(" dBm")); - - // print LQI (Link Quality Indicator) - // of the last received packet, lower is better - Serial.print(F("[CC1101] LQI:\t\t")); - Serial.println(cc.getLQI()); - - } else if (state == ERR_CRC_MISMATCH) { - // packet was received, but is malformed - Serial.println(F("CRC error!")); - - } else { - // some other error occurred - Serial.print(F("failed, code ")); - Serial.println(state); - - } -} From fb872dd41306a8870b8522a35fea68935cab0c66 Mon Sep 17 00:00:00 2001 From: BarryPSmith Date: Wed, 13 Nov 2019 05:02:22 -0800 Subject: [PATCH 51/83] Comment and error checking cleanup. Fixed power adjustment for SX1261 --- src/modules/SX1261.cpp | 26 +++++++++++++++----------- src/modules/SX1261.h | 13 ++++++++++--- src/modules/SX1262.cpp | 21 ++++++++++----------- src/modules/SX1268.cpp | 21 ++++++++------------- src/modules/SX126x.cpp | 20 ++++++++++---------- src/modules/SX126x.h | 1 - 6 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/modules/SX1261.cpp b/src/modules/SX1261.cpp index 8d8cd0ab..06e37d73 100644 --- a/src/modules/SX1261.cpp +++ b/src/modules/SX1261.cpp @@ -1,6 +1,10 @@ #include "SX1261.h" -// note that this is untested (lacking the hardware) and based purely on the datasheet. +SX1261::SX1261(Module* mod) + : SX1262(mod) { + +} + int16_t SX1261::setOutputPower(int8_t power) { // check allowed power range if (!((power >= -17) && (power <= 14))) { @@ -15,21 +19,19 @@ int16_t SX1261::setOutputPower(int8_t power) { } state = setOptimalLowPowerPaConfig(&power); + if (state != ERR_NONE) { + return(state); + } // set output power // TODO power ramp time configuration - if (state == ERR_NONE) { - state = SX126x::setTxParams(power); + state = SX126x::setTxParams(power); + if (state != ERR_NONE) { + return(state); } // restore OCP configuration - int16_t state2 = writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); - - if (state != ERR_NONE) { - return state; - } else { - return state2; - } + return writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); } int16_t SX1261::setOptimalLowPowerPaConfig(int8_t* inOutPower) @@ -40,7 +42,9 @@ int16_t SX1261::setOptimalLowPowerPaConfig(int8_t* inOutPower) } else { state = SX126x::setPaConfig(0x01, SX126X_PA_CONFIG_SX1261, 0x00); - *inOutPower -= 4; + // changing the PaConfig means output power is now scaled so we get 3 dB less than requested. + // see datasheet table 13-21 and comments in setOptimalHiPowerPaConfig. + *inOutPower -= 3; } return state; } diff --git a/src/modules/SX1261.h b/src/modules/SX1261.h index 4b1ce8fc..48667055 100644 --- a/src/modules/SX1261.h +++ b/src/modules/SX1261.h @@ -6,6 +6,8 @@ #include "SX126x.h" #include "SX1262.h" +//SX126X_CMD_SET_PA_CONFIG +#define SX126X_PA_CONFIG_SX1261 0x01 // TODO: implement SX1261 class class SX1261 : public SX1262 { @@ -15,10 +17,15 @@ class SX1261 : public SX1262 { \param mod Instance of Module that will be used to communicate with the radio. */ - SX1261(Module* mod) - : SX1262(mod) { - } + SX1261(Module* mod); + /*! + \brief Sets output power. Allowed values are in range from -17 to 14 dBm. + + \param power Output power to be set in dBm. + + \returns \ref status_codes + */ int16_t setOutputPower(int8_t power); private: diff --git a/src/modules/SX1262.cpp b/src/modules/SX1262.cpp index 94f94837..73731972 100644 --- a/src/modules/SX1262.cpp +++ b/src/modules/SX1262.cpp @@ -85,7 +85,7 @@ int16_t SX1262::setFrequency(float freq, bool calibrate) { int16_t SX1262::setOutputPower(int8_t power) { // check allowed power range - if (!(power >= -17 && power <= 22)) { + if (!((power >= -17) && (power <= 22))) { return(ERR_INVALID_OUTPUT_POWER); } @@ -97,21 +97,20 @@ int16_t SX1262::setOutputPower(int8_t power) { } // this function sets the optimal PA settings - // and scales our requested power based + // and adjusts power based on the PA settings chosen + // so that output power matches requested power. state = SX126x::setOptimalHiPowerPaConfig(&power); + if (state != ERR_NONE) { + return(state); + } // set output power // TODO power ramp time configuration - if (state == ERR_NONE) { - state = SX126x::setTxParams(power); + state = SX126x::setTxParams(power); + if (state != ERR_NONE) { + return(state); } // restore OCP configuration - int16_t state2 = writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); - - if (state != ERR_NONE) { - return state; - } else { - return state2; - } + return writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); } diff --git a/src/modules/SX1268.cpp b/src/modules/SX1268.cpp index a752c638..3ffb9a2a 100644 --- a/src/modules/SX1268.cpp +++ b/src/modules/SX1268.cpp @@ -78,9 +78,6 @@ int16_t SX1268::setFrequency(float freq, bool calibrate) { int16_t SX1268::setOutputPower(int8_t power) { // check allowed power range - // TODO with optimal PA config - // it's likely possible this could be expanded to go down to -17 just like for SX1262. - // but the datasheet doesn't explicitly state that and I don't have SX1268 unit to test with if(!((power >= -9) && (power <= 22))) { return(ERR_INVALID_OUTPUT_POWER); } @@ -92,21 +89,19 @@ int16_t SX1268::setOutputPower(int8_t power) { return(state); } - // enable optimal PA + // enable optimal PA - this changes the value of power. state = SX126x::setOptimalHiPowerPaConfig(&power); + if (state != ERR_NONE) { + return(state); + } // set output power // TODO power ramp time configuration - if (state == ERR_NONE) { - state = SX126x::setTxParams(power); + state = SX126x::setTxParams(power); + if (state != ERR_NONE) { + return(state); } // restore OCP configuration - int16_t state2 = writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); - - if (state != ERR_NONE) { - return state; - } else { - return state2; - } + return writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1); } diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 2e759226..3868e098 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1127,29 +1127,29 @@ int16_t SX126x::setTxParams(uint8_t power, uint8_t rampTime) { return(SPIwriteCommand(SX126X_CMD_SET_TX_PARAMS, data, 2)); } -// set PA config for optimal consumption as described in section 13-21 of the datasheet: -// the final column of Table 13-21 suggests that the value passed in SetTxParams -// is actually scaled depending on the parameters of setPaConfig. -// Testing confirms this is approximately right -int16_t SX126x::setOptimalHiPowerPaConfig(int8_t* inOutPower) +// set PA config for optimal consumption as described in section 13-21 of the datasheet. +int16_t SX126x::setOptimalHiPowerPaConfig(int8_t * inOutPower) { + // the final column of Table 13-21 suggests that the value passed in SetTxParams + // is actually scaled depending on the parameters of setPaConfig. + // Testing confirms this is approximately right int16_t state; if (*inOutPower >= 21) { state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1262_8, SX126X_PA_CONFIG_HP_MAX/*0x07*/); } else if (*inOutPower >= 18) { state = SX126x::setPaConfig(0x03, SX126X_PA_CONFIG_SX1262_8, 0x05); + // datasheet instructs request 22 dBm for 20 dBm actual output power *inOutPower += 2; - } - else if (*inOutPower >= 15) { + } else if (*inOutPower >= 15) { state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262_8, 0x03); + // datasheet instructs request 22 dBm for 17 dBm actual output power *inOutPower += 5; - } - else { + } else { state = SX126x::setPaConfig(0x02, SX126X_PA_CONFIG_SX1262_8, 0x02); + // datasheet instructs request 22 dBm for 14 dBm actual output power. *inOutPower += 8; } - // TODO investigate if better power efficiency can be achieved using undocumented even lower settings return state; } diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 2bcd47ff..4c3dc61c 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -152,7 +152,6 @@ //SX126X_CMD_SET_PA_CONFIG #define SX126X_PA_CONFIG_HP_MAX 0x07 #define SX126X_PA_CONFIG_PA_LUT 0x01 -#define SX126X_PA_CONFIG_SX1261 0x01 #define SX126X_PA_CONFIG_SX1262_8 0x00 //SX126X_CMD_SET_RX_TX_FALLBACK_MODE From 2e019c370036f89a99888668942cd211dae27cf3 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Wed, 13 Nov 2019 16:27:08 +0100 Subject: [PATCH 52/83] Added methods to keywords --- keywords.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/keywords.txt b/keywords.txt index dcec71c7..1bb6c6f8 100644 --- a/keywords.txt +++ b/keywords.txt @@ -90,6 +90,10 @@ setDataShapingOOK KEYWORD2 setCRC KEYWORD2 variablePacketLengthMode KEYWORD2 fixedPacketLengthMode KEYWORD2 +setCrcFiltering KEYWORD2 +enableSyncWordFiltering KEYWORD2 +disableSyncWordFiltering KEYWORD2 +setPromiscuous KEYWORD2 # RF69-specific setAESKey KEYWORD2 From c56a76d296130bd4cf695e5206d01887ccc2ed67 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Wed, 13 Nov 2019 16:27:39 +0100 Subject: [PATCH 53/83] enable/disable to set + bool --- src/modules/CC1101.cpp | 18 +++++++++--------- src/modules/CC1101.h | 15 +++++---------- src/modules/RF69.cpp | 18 +++++++++--------- src/modules/RF69.h | 13 ++++--------- 4 files changed, 27 insertions(+), 37 deletions(-) diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index 089323dd..2f86d0ee 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -605,15 +605,15 @@ int16_t CC1101::disableSyncWordFiltering() { return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_NONE, 2, 0)); } -int16_t CC1101::enableCrcFiltering() { - return(SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_ON, 2, 2)); +int16_t CC1101::setCrcFiltering(bool crcOn) { + if (crcOn == true) { + return(SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_ON, 2, 2)); + } else { + return(SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_OFF, 2, 2)); + } } -int16_t CC1101::disableCrcFiltering() { - return(SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_CRC_OFF, 2, 2)); -} - -int16_t CC1101::promiscuousMode(bool promiscuous) { +int16_t CC1101::setPromiscuousMode(bool promiscuous) { int16_t state = ERR_NONE; if (_promiscuous == promiscuous) { @@ -628,7 +628,7 @@ int16_t CC1101::promiscuousMode(bool promiscuous) { } // disable CRC filtering - state = disableCrcFiltering(); + state = setCrcFiltering(false); } else { // enable preamble and sync word filtering and insertion state = enableSyncWordFiltering(); @@ -637,7 +637,7 @@ int16_t CC1101::promiscuousMode(bool promiscuous) { } // enable CRC filtering - state = enableCrcFiltering(); + state = setCrcFiltering(true); } return(state); diff --git a/src/modules/CC1101.h b/src/modules/CC1101.h index 2fbc0d1c..92440449 100644 --- a/src/modules/CC1101.h +++ b/src/modules/CC1101.h @@ -778,11 +778,11 @@ class CC1101: public PhysicalLayer { /*! \brief Enable sync word filtering and generation. - \param len Size of sync word (1 or 2 bytes). + \param numBits Sync word length in bits. \returns \ref status_codes */ - int16_t enableSyncWordFiltering(uint8_t len = CC1101_DEFAULT_SYNC_WORD_LENGTH); + int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0); /*! \brief Disable preamble and sync word filtering and generation. @@ -794,16 +794,11 @@ class CC1101: public PhysicalLayer { /*! \brief Enable CRC filtering and generation. - \returns \ref status_codes - */ - int16_t enableCrcFiltering(); - - /*! - \brief Disable CRC filtering and generation. + \param crcOn Set or unset promiscuous mode. \returns \ref status_codes */ - int16_t disableCrcFiltering(); + int16_t setCrcFiltering(bool crcOn = true); /*! \brief Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address, CRC). @@ -812,7 +807,7 @@ class CC1101: public PhysicalLayer { \returns \ref status_codes */ - int16_t promiscuousMode(bool promiscuous = true); + int16_t setPromiscuousMode(bool promiscuous = true); private: Module* _mod; diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 35fa9b9a..882ca15d 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -669,15 +669,15 @@ int16_t RF69::disableSyncWordFiltering() { return(state); } -int16_t RF69::enableCrcFiltering() { - return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_CRC_ON), 4, 4); +int16_t RF69::setCrcFiltering(bool crcOn) { + if (crcOn == true) { + return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_CRC_ON, 4, 4)); + } else { + return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_CRC_OFF, 4, 4)); + } } -int16_t RF69::disableCrcFiltering() { - return(_mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_CRC_OFF), 4, 4); -} - -int16_t RF69::promiscuousMode(bool promiscuous) { +int16_t RF69::setPromiscuousMode(bool promiscuous) { int16_t state = ERR_NONE; if (_promiscuous == promiscuous) { @@ -692,7 +692,7 @@ int16_t RF69::promiscuousMode(bool promiscuous) { } // disable CRC filtering - state = disableCrcFiltering(); + state = setCrcFiltering(false); } else { // enable preamble and sync word filtering and insertion state = enableSyncWordFiltering(); @@ -701,7 +701,7 @@ int16_t RF69::promiscuousMode(bool promiscuous) { } // enable CRC filtering - state = enableCrcFiltering(); + state = setCrcFiltering(true); } return(state); diff --git a/src/modules/RF69.h b/src/modules/RF69.h index 26c71108..5318b7e8 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69.h @@ -735,7 +735,7 @@ class RF69: public PhysicalLayer { \returns \ref status_codes */ - int16_t enableSyncWordFiltering(uint8_t numBits = 16); + int16_t enableSyncWordFiltering(uint8_t maxErrBits = 0); /*! \brief Disable preamble and sync word filtering and generation. @@ -747,16 +747,11 @@ class RF69: public PhysicalLayer { /*! \brief Enable CRC filtering and generation. - \returns \ref status_codes - */ - int16_t enableCrcFiltering(); - - /*! - \brief Disable CRC filtering and generation. + \param crcOn Set or unset promiscuous mode. \returns \ref status_codes */ - int16_t disableCrcFiltering(); + int16_t setCrcFiltering(bool crcOn = true); /*! \brief Set modem in "sniff" mode: no packet filtering (e.g., no preamble, sync word, address, CRC). @@ -765,7 +760,7 @@ class RF69: public PhysicalLayer { \returns \ref status_codes */ - int16_t promiscuousMode(bool promiscuous = true); + int16_t setPromiscuousMode(bool promiscuous = true); protected: Module* _mod; From 2a09dc302af0a23197162a035ca3343cf4de2ca6 Mon Sep 17 00:00:00 2001 From: Federico Maggi Date: Wed, 13 Nov 2019 16:34:47 +0100 Subject: [PATCH 54/83] sync word length check + removed `else if` --- src/modules/CC1101.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index 2f86d0ee..658a3ba2 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -444,7 +444,7 @@ int16_t CC1101::setOutputPower(int8_t power) { } int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) { - if(maxErrBits > 1) { + if((maxErrBits > 1) || (len > CC1101_MAX_SYNC_WORD_LENGTH)) { return(ERR_INVALID_SYNC_WORD); } @@ -582,7 +582,7 @@ int16_t CC1101::enableSyncWordFiltering(uint8_t maxErrBits) { if (_syncWordLength == 1) { // in 16 bit sync word, expect all 16 bits return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_16_16, 2, 0)); - } else if (_syncWordLength == 2) { + } else { // there's no 32 of 32 case, so we resort to 30 of 32 bits required return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_30_32, 2, 0)); } @@ -592,13 +592,13 @@ int16_t CC1101::enableSyncWordFiltering(uint8_t maxErrBits) { if (_syncWordLength == 1) { // in 16 bit sync word, expect at least 15 bits return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_15_16, 2, 0)); - } else if (_syncWordLength == 2) { + } else { // in 32 bits sync word (16 + 16), expect 30 of 32 to match return(SPIsetRegValue(CC1101_REG_MDMCFG2, CC1101_SYNC_MODE_30_32, 2, 0)); } } - return(ERR_NONE); + return(ERR_UNKNOWN); } int16_t CC1101::disableSyncWordFiltering() { From 078641d64d31a7a88e3546bedc2c828a38ba8222 Mon Sep 17 00:00:00 2001 From: BarryPSmith Date: Mon, 11 Nov 2019 09:11:35 -0800 Subject: [PATCH 55/83] Implemented TX PA Clamping, datasheet section 15.2 --- src/modules/SX1262.cpp | 15 +++++++++++++++ src/modules/SX1262.h | 7 +++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/modules/SX1262.cpp b/src/modules/SX1262.cpp index 0bcce47d..59ee7225 100644 --- a/src/modules/SX1262.cpp +++ b/src/modules/SX1262.cpp @@ -22,6 +22,11 @@ int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint16_t syn return(state); } + state = fixPaClamping(); + if (state != ERR_NONE) { + return state; + } + return(state); } @@ -110,3 +115,13 @@ int16_t SX1262::setOutputPower(int8_t power) { // restore OCP configuration return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); } + +int16_t SX1262::fixPaClamping() { + uint8_t clampConfig; + uint16_t state = readRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); + if (state != ERR_NONE) { + return state; + } + clampConfig |= 0x1E; + return writeRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); +} diff --git a/src/modules/SX1262.h b/src/modules/SX1262.h index 88a49576..5e23d73f 100644 --- a/src/modules/SX1262.h +++ b/src/modules/SX1262.h @@ -8,6 +8,7 @@ //SX126X_CMD_SET_PA_CONFIG #define SX126X_PA_CONFIG_SX1261 0x01 #define SX126X_PA_CONFIG_SX1262 0x00 +#define SX126X_REG_TX_CLAMP_CONFIG 0x08D8 //Datasheet 15.2 /*! \class SX1262 @@ -94,8 +95,10 @@ class SX1262: public SX126x { int16_t setOutputPower(int8_t power); private: - - + /*! + \brief Fixes overly eager PA clamping, as described in section 15.2 of the datasheet + */ + int16_t fixPaClamping(); }; #endif From b8b05262bc15fc14c4c2bc51cbd0a1d7b62fccc4 Mon Sep 17 00:00:00 2001 From: BarryPSmith Date: Tue, 12 Nov 2019 10:39:44 -0800 Subject: [PATCH 56/83] Added PA Clamping fix to FSK and SX1268 --- src/modules/SX1262.cpp | 19 +++++++------------ src/modules/SX1262.h | 5 ----- src/modules/SX1268.cpp | 10 ++++++++++ src/modules/SX126x.cpp | 10 ++++++++++ src/modules/SX126x.h | 5 +++++ 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/modules/SX1262.cpp b/src/modules/SX1262.cpp index 59ee7225..a3b3ad47 100644 --- a/src/modules/SX1262.cpp +++ b/src/modules/SX1262.cpp @@ -22,7 +22,7 @@ int16_t SX1262::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint16_t syn return(state); } - state = fixPaClamping(); + state = SX126x::fixPaClamping(); if (state != ERR_NONE) { return state; } @@ -48,6 +48,11 @@ int16_t SX1262::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t return(state); } + state = SX126x::fixPaClamping(); + if (state != ERR_NONE) { + return state; + } + return(state); } @@ -114,14 +119,4 @@ int16_t SX1262::setOutputPower(int8_t power) { // restore OCP configuration return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); -} - -int16_t SX1262::fixPaClamping() { - uint8_t clampConfig; - uint16_t state = readRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); - if (state != ERR_NONE) { - return state; - } - clampConfig |= 0x1E; - return writeRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); -} +} \ No newline at end of file diff --git a/src/modules/SX1262.h b/src/modules/SX1262.h index 5e23d73f..3aef48ee 100644 --- a/src/modules/SX1262.h +++ b/src/modules/SX1262.h @@ -8,7 +8,6 @@ //SX126X_CMD_SET_PA_CONFIG #define SX126X_PA_CONFIG_SX1261 0x01 #define SX126X_PA_CONFIG_SX1262 0x00 -#define SX126X_REG_TX_CLAMP_CONFIG 0x08D8 //Datasheet 15.2 /*! \class SX1262 @@ -95,10 +94,6 @@ class SX1262: public SX126x { int16_t setOutputPower(int8_t power); private: - /*! - \brief Fixes overly eager PA clamping, as described in section 15.2 of the datasheet - */ - int16_t fixPaClamping(); }; #endif diff --git a/src/modules/SX1268.cpp b/src/modules/SX1268.cpp index c0b01a80..bd5297d9 100644 --- a/src/modules/SX1268.cpp +++ b/src/modules/SX1268.cpp @@ -22,6 +22,11 @@ int16_t SX1268::begin(float freq, float bw, uint8_t sf, uint8_t cr, uint16_t syn return(state); } + state = SX126x::fixPaClamping(); + if (state != ERR_NONE) { + return state; + } + return(state); } int16_t SX1268::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t power, float currentLimit, uint16_t preambleLength, float dataShaping) { @@ -42,6 +47,11 @@ int16_t SX1268::beginFSK(float freq, float br, float freqDev, float rxBw, int8_t return(state); } + state = SX126x::fixPaClamping(); + if (state != ERR_NONE) { + return state; + } + return(state); } diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index e47ad31c..6d8a934b 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1202,6 +1202,16 @@ int16_t SX126x::setFrequencyRaw(float freq) { return(ERR_NONE); } +int16_t SX126x::fixPaClamping() { + uint8_t clampConfig; + uint16_t state = readRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); + if (state != ERR_NONE) { + return state; + } + clampConfig |= 0x1E; + return writeRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); +} + int16_t SX126x::config(uint8_t modem) { // set regulator mode uint8_t data[7]; diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index 641d6445..a73eb44d 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -92,6 +92,7 @@ #define SX126X_REG_OCP_CONFIGURATION 0x08E7 #define SX126X_REG_XTA_TRIM 0x0911 #define SX126X_REG_XTB_TRIM 0x0912 +#define SX126X_REG_TX_CLAMP_CONFIG 0x08D8 //Datasheet 15.2 // SX126X SPI command variables @@ -751,6 +752,10 @@ class SX126x: public PhysicalLayer { int16_t setFrequencyRaw(float freq); + /*! + \brief Fixes overly eager PA clamping on SX1262 / SX1268, as described in section 15.2 of the datasheet + */ + int16_t fixPaClamping(); private: Module* _mod; From 5acaf1dfb6e44be22692d93ec6617ad4ddb24a2d Mon Sep 17 00:00:00 2001 From: BarryPSmith Date: Wed, 13 Nov 2019 07:20:21 -0800 Subject: [PATCH 57/83] Fixed a conflict with return brackets. --- src/modules/SX1262.cpp | 2 +- src/modules/SX126x.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/SX1262.cpp b/src/modules/SX1262.cpp index a3b3ad47..75030e54 100644 --- a/src/modules/SX1262.cpp +++ b/src/modules/SX1262.cpp @@ -119,4 +119,4 @@ int16_t SX1262::setOutputPower(int8_t power) { // restore OCP configuration return(writeRegister(SX126X_REG_OCP_CONFIGURATION, &ocp, 1)); -} \ No newline at end of file +} diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index a73eb44d..70b46dad 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -772,6 +772,8 @@ class SX126x: public PhysicalLayer { int16_t config(uint8_t modem); + + // common low-level SPI interface int16_t SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy = true); int16_t SPIreadCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy = true); From 300e7f48fddad455c96df67df806593b6a2a6895 Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 14 Nov 2019 15:33:14 +0100 Subject: [PATCH 58/83] Updated comments --- src/modules/SX1261.h | 6 +++++- src/modules/SX1262.h | 2 -- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/modules/SX1261.h b/src/modules/SX1261.h index 48667055..22c7cadd 100644 --- a/src/modules/SX1261.h +++ b/src/modules/SX1261.h @@ -9,7 +9,11 @@ //SX126X_CMD_SET_PA_CONFIG #define SX126X_PA_CONFIG_SX1261 0x01 -// TODO: implement SX1261 class +/*! + \class SX1261 + + \brief Derived class for %SX1261 modules. +*/ class SX1261 : public SX1262 { public: /*! diff --git a/src/modules/SX1262.h b/src/modules/SX1262.h index a45aa092..38180464 100644 --- a/src/modules/SX1262.h +++ b/src/modules/SX1262.h @@ -5,8 +5,6 @@ #include "Module.h" #include "SX126x.h" -//SX126X_CMD_SET_PA_CONFIG - /*! \class SX1262 From 3db513436700ee526f2e25ec6608b7bcbc972478 Mon Sep 17 00:00:00 2001 From: jgromes Date: Thu, 14 Nov 2019 21:11:17 +0100 Subject: [PATCH 59/83] [SX126x] Fixed wakeup sequence - NSS first, BUSY second (#69) --- src/modules/SX126x.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 639c5106..5603de76 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -1101,7 +1101,7 @@ int16_t SX126x::setTxParams(uint8_t power, uint8_t rampTime) { // set PA config for optimal consumption as described in section 13-21 of the datasheet. int16_t SX126x::setOptimalHiPowerPaConfig(int8_t * inOutPower) { - // the final column of Table 13-21 suggests that the value passed in SetTxParams + // the final column of Table 13-21 suggests that the value passed in SetTxParams // is actually scaled depending on the parameters of setPaConfig. // Testing confirms this is approximately right int16_t state; @@ -1297,6 +1297,9 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d uint8_t debugBuff[256]; #endif + // pull NSS low + digitalWrite(_mod->getCs(), LOW); + // ensure BUSY is low (state meachine ready) RADIOLIB_VERBOSE_PRINTLN(F("Wait for BUSY ... ")); uint32_t start = millis(); @@ -1307,7 +1310,6 @@ int16_t SX126x::SPItransfer(uint8_t* cmd, uint8_t cmdLen, bool write, uint8_t* d } // start transfer - digitalWrite(_mod->getCs(), LOW); spi->beginTransaction(spiSettings); // send command byte(s) From a3c46d00566f639a5f9e2e769c6175e5a6363375 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 17 Nov 2019 10:07:23 +0100 Subject: [PATCH 60/83] [RTTY] Fixed incorrect type --- src/protocols/RTTY.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/protocols/RTTY.h b/src/protocols/RTTY.h index 06aeac55..60270429 100644 --- a/src/protocols/RTTY.h +++ b/src/protocols/RTTY.h @@ -147,7 +147,7 @@ class RTTYClient { uint8_t _encoding; uint32_t _base; uint32_t _shift; - uint16_t _bitDuration; + uint32_t _bitDuration; uint8_t _dataBits; uint8_t _stopBits; From 7d7af7ac0b7ea292a528c576242eaa8f5af0cebf Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Mon, 18 Nov 2019 17:01:37 +0100 Subject: [PATCH 61/83] Variable PreambleLength for CC1101 --- src/modules/CC1101.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/modules/CC1101.h | 9 +++++++++ 2 files changed, 46 insertions(+) diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index 657400a0..8c1a5ab1 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -448,6 +448,43 @@ int16_t CC1101::setSyncWord(uint8_t syncH, uint8_t syncL) { return(state); } +int16_t CC1101::setPreambleLength(uint8_t preambleLength) { + // check allowed values + uint8_t value; + switch(preambleLength){ + case 2: + value = CC1101_NUM_PREAMBLE_2; + break; + case 3: + value = CC1101_NUM_PREAMBLE_3; + break; + case 4: + value = CC1101_NUM_PREAMBLE_4; + break; + case 6: + value = CC1101_NUM_PREAMBLE_6; + break; + case 8: + value = CC1101_NUM_PREAMBLE_8; + break; + case 12: + value = CC1101_NUM_PREAMBLE_12; + break; + case 16: + value = CC1101_NUM_PREAMBLE_16; + break; + case 24: + value = CC1101_NUM_PREAMBLE_24; + break; + default: + return(ERR_INVALID_PREAMBLE_LENGTH); + } + + + return SPIsetRegValue(CC1101_REG_MDMCFG1, value, 6, 4); +} + + int16_t CC1101::setNodeAddress(uint8_t nodeAddr, uint8_t numBroadcastAddrs) { if(!(numBroadcastAddrs > 0) && (numBroadcastAddrs <= 2)) { return(ERR_INVALID_NUM_BROAD_ADDRS); diff --git a/src/modules/CC1101.h b/src/modules/CC1101.h index c57a7e6d..16b23a6e 100644 --- a/src/modules/CC1101.h +++ b/src/modules/CC1101.h @@ -698,6 +698,15 @@ class CC1101: public PhysicalLayer { */ int16_t setSyncWord(uint8_t syncH, uint8_t syncL); + /*! + \brief Sets preamble length. + + \param preambleLength Preamble length to be set, allowed values: 2, 3, 4, 6, 8, 12, 16, 24 + + \returns \ref status_codes + */ + int16_t setPreambleLength(uint8_t preambleLength); + /*! \brief Sets node and broadcast addresses. Calling this method will also enable address filtering. From 13cb93495d8a3b918d6f0dc09714eec4c2da9a7a Mon Sep 17 00:00:00 2001 From: Andrea Guglielmini Date: Mon, 18 Nov 2019 18:14:40 +0100 Subject: [PATCH 62/83] Better docs + preambleLength in begin() --- src/modules/CC1101.cpp | 8 +++++++- src/modules/CC1101.h | 6 ++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index f841fbd5..c39c48e6 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -8,7 +8,7 @@ CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_E _syncWordLength = CC1101_DEFAULT_SYNC_WORD_LENGTH; } -int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { +int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power, uint8_t preambleLength) { // set module properties _mod->SPIreadCommand = CC1101_CMD_READ; _mod->SPIwriteCommand = CC1101_CMD_WRITE; @@ -88,6 +88,12 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po return(state); } + // configure default preamble lenght + state = setPreambleLength(preambleLength); + if (state != ERR_NONE) { + return(state); + } + // flush FIFOs SPIsendCommand(CC1101_CMD_FLUSH_RX); SPIsendCommand(CC1101_CMD_FLUSH_TX); diff --git a/src/modules/CC1101.h b/src/modules/CC1101.h index 5c8ef657..30e64353 100644 --- a/src/modules/CC1101.h +++ b/src/modules/CC1101.h @@ -533,9 +533,11 @@ class CC1101: public PhysicalLayer { \param power Output power in dBm. Defaults to 0 dBm. + \param preambleLength Preamble Length in bytes. Defaults to 4 bytes. + \returns \ref status_codes */ - int16_t begin(float freq = 868.0, float br = 4.8, float rxBw = 325.0, float freqDev = 48.0, int8_t power = 0); + int16_t begin(float freq = 868.0, float br = 4.8, float rxBw = 325.0, float freqDev = 48.0, int8_t power = 0, uint8_t preambleLength = 4); /*! \brief Blocking binary transmit method. @@ -719,7 +721,7 @@ class CC1101: public PhysicalLayer { /*! \brief Sets preamble length. - \param preambleLength Preamble length to be set, allowed values: 2, 3, 4, 6, 8, 12, 16, 24 + \param preambleLength Preamble length to be set (in bytes), allowed values: 2, 3, 4, 6, 8, 12, 16, 24 \returns \ref status_codes */ From b873127155dbbd9f224768381de18e3c07508227 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 18 Nov 2019 18:29:06 +0100 Subject: [PATCH 63/83] Fixed SoftwareSerial for ESP8266 core 2.6.1 --- src/ISerial.cpp | 4 ---- src/Module.cpp | 8 -------- 2 files changed, 12 deletions(-) diff --git a/src/ISerial.cpp b/src/ISerial.cpp index 4bc72a9d..bc280e68 100644 --- a/src/ISerial.cpp +++ b/src/ISerial.cpp @@ -5,11 +5,7 @@ ISerial::ISerial(Module* mod) { } void ISerial::begin(long speed) { -#if defined(ESP8266) - _mod->ModuleSerial->begin(speed, _mod->getRx(), _mod->getTx(), SWSERIAL_8N1); -#else _mod->ModuleSerial->begin(speed); -#endif } bool ISerial::listen() { diff --git a/src/Module.cpp b/src/Module.cpp index b706c56e..1c994eff 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -9,9 +9,6 @@ Module::Module(int rx, int tx, HardwareSerial* useSer) { #ifdef SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; -#elif defined(ESP8266) - ModuleSerial = new SoftwareSerial(); - (void)useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); (void)useSer; @@ -39,9 +36,6 @@ Module::Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi, SPISet #ifdef SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; -#elif defined(ESP8266) - ModuleSerial = new SoftwareSerial(); - (void)useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); (void)useSer; @@ -69,8 +63,6 @@ void Module::init(uint8_t interface, uint8_t gpio) { case USE_UART: #if defined(ESP32) ModuleSerial->begin(baudrate, SERIAL_8N1, _rx, _tx); -#elif defined(ESP8266) - ModuleSerial->begin(baudrate, _rx, _tx, SWSERIAL_8N1); #else ModuleSerial->begin(baudrate); #endif From 6949ccf363281cfa2a58b264a19dfff384ad85c4 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 17:08:59 +0100 Subject: [PATCH 64/83] [SX127x] Sync with LoRaLib 8.2.0 --- keywords.txt | 5 ++++ src/TypeDef.h | 15 ++++++++++ src/modules/SX1272.cpp | 41 +++++++++++++++++---------- src/modules/SX1272.h | 6 ++-- src/modules/SX1278.cpp | 47 +++++++++++++++++++------------ src/modules/SX1278.h | 6 ++-- src/modules/SX127x.cpp | 63 ++++++++++++++++++++++++++++++++++++++++-- src/modules/SX127x.h | 21 ++++++++++++++ 8 files changed, 163 insertions(+), 41 deletions(-) diff --git a/keywords.txt b/keywords.txt index 1bb6c6f8..02739f5a 100644 --- a/keywords.txt +++ b/keywords.txt @@ -94,6 +94,8 @@ setCrcFiltering KEYWORD2 enableSyncWordFiltering KEYWORD2 disableSyncWordFiltering KEYWORD2 setPromiscuous KEYWORD2 +setRSSIConfig KEYWORD2 +setEncoding KEYWORD2 # RF69-specific setAESKey KEYWORD2 @@ -189,6 +191,9 @@ ERR_INVALID_CURRENT_LIMIT LITERAL1 ERR_INVALID_PREAMBLE_LENGTH LITERAL1 ERR_INVALID_GAIN LITERAL1 ERR_WRONG_MODEM LITERAL1 +ERR_INVALID_NUM_SAMPLES LITERAL1 +ERR_INVALID_RSSI_OFFSET LITERAL1 +ERR_INVALID_ENCODING LITERAL1 ERR_INVALID_BIT_RATE LITERAL1 ERR_INVALID_FREQUENCY_DEVIATION LITERAL1 diff --git a/src/TypeDef.h b/src/TypeDef.h index f1675bcd..4814dd7d 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -263,6 +263,21 @@ */ #define ERR_WRONG_MODEM -20 +/*! + \brief The supplied number of RSSI samples is invalid. +*/ +#define ERR_INVALID_NUM_SAMPLES -21 + +/*! + \brief The supplied RSSI offset is invalid. +*/ +#define ERR_INVALID_RSSI_OFFSET -22 + +/*! + \brief The supplied encoding is invalid. +*/ +#define ERR_INVALID_ENCODING -23 + // RF69-specific status codes /*! diff --git a/src/modules/SX1272.cpp b/src/modules/SX1272.cpp index 86d058d7..1221bb27 100644 --- a/src/modules/SX1272.cpp +++ b/src/modules/SX1272.cpp @@ -342,22 +342,33 @@ int16_t SX1272::setDataShapingOOK(uint8_t sh) { return(state); } -int8_t SX1272::getRSSI() { - // check active modem - if(getActiveModem() != SX127X_LORA) { - return(0); +float SX1272::getRSSI() { + if(getActiveModem() == SX127X_LORA) { + // RSSI calculation uses different constant for low-frequency and high-frequency ports + float lastPacketRSSI = -139 + _mod->SPIgetRegValue(SX127X_REG_PKT_RSSI_VALUE); + + // spread-spectrum modulation signal can be received below noise floor + // check last packet SNR and if it's less than 0, add it to reported RSSI to get the correct value + float lastPacketSNR = SX127x::getSNR(); + if(lastPacketSNR < 0.0) { + lastPacketRSSI += lastPacketSNR; + } + + return(lastPacketRSSI); + + } else { + // enable listen mode + startReceive(); + + // read the value for FSK + float rssi = (float)_mod->SPIgetRegValue(SX127X_REG_RSSI_VALUE_FSK) / -2.0; + + // set mode back to standby + standby(); + + // return the value + return(rssi); } - - int8_t lastPacketRSSI = -139 + _mod->SPIgetRegValue(SX127X_REG_PKT_RSSI_VALUE); - - // spread-spectrum modulation signal can be received below noise floor - // check last packet SNR and if it's less than 0, add it to reported RSSI to get the correct value - float lastPacketSNR = SX127x::getSNR(); - if(lastPacketSNR < 0.0) { - lastPacketRSSI += lastPacketSNR; - } - - return(lastPacketRSSI); } int16_t SX1272::setCRC(bool enableCRC) { diff --git a/src/modules/SX1272.h b/src/modules/SX1272.h index 95f4068f..26f8ac9f 100644 --- a/src/modules/SX1272.h +++ b/src/modules/SX1272.h @@ -235,11 +235,11 @@ class SX1272: public SX127x { int16_t setDataShapingOOK(uint8_t sh); /*! - \brief Gets recorded signal strength indicator of the latest received packet. + \brief Gets recorded signal strength indicator of the latest received packet for LoRa modem, or current RSSI level for FSK modem. - \returns Last packet recorded signal strength indicator (RSSI). + \returns Last packet RSSI for LoRa modem, or current RSSI level for FSK modem. */ - int8_t getRSSI(); + float getRSSI(); /*! \brief Enables/disables CRC check of received packets. diff --git a/src/modules/SX1278.cpp b/src/modules/SX1278.cpp index 64f2245a..f56392be 100644 --- a/src/modules/SX1278.cpp +++ b/src/modules/SX1278.cpp @@ -411,29 +411,40 @@ int16_t SX1278::setDataShapingOOK(uint8_t sh) { return(state); } -int8_t SX1278::getRSSI() { - // check active modem - if(getActiveModem() != SX127X_LORA) { - return(0); - } +float SX1278::getRSSI() { + if(getActiveModem() == SX127X_LORA) { + // for LoRa, get RSSI of the last packet + float lastPacketRSSI; - int8_t lastPacketRSSI; + // RSSI calculation uses different constant for low-frequency and high-frequency ports + if(_freq < 868.0) { + lastPacketRSSI = -164 + _mod->SPIgetRegValue(SX127X_REG_PKT_RSSI_VALUE); + } else { + lastPacketRSSI = -157 + _mod->SPIgetRegValue(SX127X_REG_PKT_RSSI_VALUE); + } + + // spread-spectrum modulation signal can be received below noise floor + // check last packet SNR and if it's less than 0, add it to reported RSSI to get the correct value + float lastPacketSNR = SX127x::getSNR(); + if(lastPacketSNR < 0.0) { + lastPacketRSSI += lastPacketSNR; + } + + return(lastPacketRSSI); - // RSSI calculation uses different constant for low-frequency and high-frequency ports - if(_freq < 868.0) { - lastPacketRSSI = -164 + _mod->SPIgetRegValue(SX127X_REG_PKT_RSSI_VALUE); } else { - lastPacketRSSI = -157 + _mod->SPIgetRegValue(SX127X_REG_PKT_RSSI_VALUE); - } + // enable listen mode + startReceive(); - // spread-spectrum modulation signal can be received below noise floor - // check last packet SNR and if it's less than 0, add it to reported RSSI to get the correct value - float lastPacketSNR = SX127x::getSNR(); - if(lastPacketSNR < 0.0) { - lastPacketRSSI += lastPacketSNR; - } + // read the value for FSK + float rssi = (float)_mod->SPIgetRegValue(SX127X_REG_RSSI_VALUE_FSK) / -2.0; - return(lastPacketRSSI); + // set mode back to standby + standby(); + + // return the value + return(rssi); + } } int16_t SX1278::setCRC(bool enableCRC) { diff --git a/src/modules/SX1278.h b/src/modules/SX1278.h index 937b0c58..1715e4b1 100644 --- a/src/modules/SX1278.h +++ b/src/modules/SX1278.h @@ -244,11 +244,11 @@ class SX1278: public SX127x { int16_t setDataShapingOOK(uint8_t sh); /*! - \brief Gets recorded signal strength indicator of the latest received packet. + \brief Gets recorded signal strength indicator of the latest received packet for LoRa modem, or current RSSI level for FSK modem. - \returns Last packet recorded signal strength indicator (RSSI). + \returns Last packet RSSI for LoRa modem, or current RSSI level for FSK modem. */ - int8_t getRSSI(); + float getRSSI(); /*! \brief Enables/disables CRC check of received packets. diff --git a/src/modules/SX127x.cpp b/src/modules/SX127x.cpp index b3e8603a..7411e998 100644 --- a/src/modules/SX127x.cpp +++ b/src/modules/SX127x.cpp @@ -117,6 +117,18 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB // enable/disable OOK state = setOOK(enableOOK); + if(state != ERR_NONE) { + return(state); + } + + // set default RSSI measurement config + state = setRSSIConfig(2); + if(state != ERR_NONE) { + return(state); + } + + // set default encoding + state = setEncoding(0); return(state); } @@ -174,6 +186,8 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { return(ERR_TX_TIMEOUT); } } + } else { + return(ERR_UNKNOWN); } // update data rate @@ -891,6 +905,52 @@ size_t SX127x::getPacketLength(bool update) { return(_packetLength); } +int16_t SX127x::setRSSIConfig(uint8_t smoothingSamples, int8_t offset) { + // check active modem + if(getActiveModem() != SX127X_FSK_OOK) { + return(ERR_WRONG_MODEM); + } + + // set mode to standby + int16_t state = standby(); + if(state != ERR_NONE) { + return(state); + } + + // check provided values + if(!(smoothingSamples <= 7)) { + return(ERR_INVALID_NUM_SAMPLES); + } + + if(!((offset >= -16) && (offset <= 15))) { + return(ERR_INVALID_RSSI_OFFSET); + } + + // set new register values + state = _mod->SPIsetRegValue(SX127X_REG_RSSI_CONFIG, offset, 7, 3); + state |= _mod->SPIsetRegValue(SX127X_REG_RSSI_CONFIG, smoothingSamples, 2, 0); + return(state); +} + +int16_t SX127x::setEncoding(uint8_t encoding) { + // check active modem + if(getActiveModem() != SX127X_FSK_OOK) { + return(ERR_WRONG_MODEM); + } + + // set encoding + switch(encoding) { + case 0: + return(_mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, SX127X_DC_FREE_NONE, 6, 5)); + case 1: + return(_mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, SX127X_DC_FREE_MANCHESTER, 6, 5)); + case 2: + return(_mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, SX127X_DC_FREE_WHITENING, 6, 5)); + default: + return(ERR_INVALID_ENCODING); + } +} + int16_t SX127x::config() { // turn off frequency hopping int16_t state = _mod->SPIsetRegValue(SX127X_REG_HOP_PERIOD, SX127X_HOP_PERIOD_OFF); @@ -963,8 +1023,7 @@ bool SX127x::findChip(uint8_t ver) { sprintf(buffHex, "0x%02X", version); RADIOLIB_DEBUG_PRINT(buffHex); RADIOLIB_DEBUG_PRINT(F(", expected 0x00")); - RADIOLIB_DEBUG_PRINT(ver, HEX); - RADIOLIB_DEBUG_PRINTLN(); + RADIOLIB_DEBUG_PRINTLN(ver, HEX); #endif delay(1000); i++; diff --git a/src/modules/SX127x.h b/src/modules/SX127x.h index 5236e595..05f1e5cf 100644 --- a/src/modules/SX127x.h +++ b/src/modules/SX127x.h @@ -842,6 +842,27 @@ class SX127x: public PhysicalLayer { */ size_t getPacketLength(bool update = true); + /*! + \brief Sets RSSI measurement configuration in FSK mode. + + \param smoothingSamples Number of samples taken to avergae the RSSI result. + numSamples = 2 ^ (1 + smoothingSamples), allowed values are in range 0 (2 samples) - 7 (256 samples) + + \param offset Signed RSSI offset that will be automatically compensated. 1 dB per LSB, defaults to 0, allowed values are in range -16 dB to +15 dB. + + \returns \ref status_codes + */ + int16_t setRSSIConfig(uint8_t smoothingSamples, int8_t offset = 0); + + /*! + \brief Sets transmission encoding. Only available in FSK mode. + + \param encoding Encoding to be used. Set to 0 for NRZ, 1 for Manchester and 2 for whitening. + + \returns \ref status_codes + */ + int16_t setEncoding(uint8_t encoding); + #ifdef RADIOLIB_DEBUG void regDump(); #endif From 42050716151cde7d5b7d9e9c8cf89bfb78030218 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 17:39:00 +0100 Subject: [PATCH 65/83] Changed Travis script to use STM32L452RE-P --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5a7c5598..96d4f9b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ env: # see https://github.com/arduino/Arduino/blob/master/build/shared/manpage.adoc#options # and https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification#boardstxt - BOARD="esp32:esp32:esp32" - - BOARD="STM32:stm32:GenF1:pnum=BLUEPILL_F103C6" + - BOARD="STM32:stm32:GenF1:pnum=NUCLEO_L452REP" - BOARD="esp8266:esp8266:generic:xtal=80,ResetMethod=ck,CrystalFreq=26,FlashFreq=40,FlashMode=qio,eesz=512K" - BOARD="arduino:samd:arduino_zero_native" - BOARD="arduino:sam:arduino_due_x" From 201fd4a29d1af997ffbbf7b3de854f268b26857c Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 17:40:13 +0100 Subject: [PATCH 66/83] Fixed Travis STM32 board --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 96d4f9b1..b93c1fc7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ env: # see https://github.com/arduino/Arduino/blob/master/build/shared/manpage.adoc#options # and https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification#boardstxt - BOARD="esp32:esp32:esp32" - - BOARD="STM32:stm32:GenF1:pnum=NUCLEO_L452REP" + - BOARD="STM32:stm32:Nucleo_64:pnum=NUCLEO_L452REP" - BOARD="esp8266:esp8266:generic:xtal=80,ResetMethod=ck,CrystalFreq=26,FlashFreq=40,FlashMode=qio,eesz=512K" - BOARD="arduino:samd:arduino_zero_native" - BOARD="arduino:sam:arduino_due_x" From 4bf2289353081e5f9a96077ee40a18a7cf77e8b6 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 17:50:55 +0100 Subject: [PATCH 67/83] Set Travis to STM32L452RE --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b93c1fc7..e908bec0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ env: # see https://github.com/arduino/Arduino/blob/master/build/shared/manpage.adoc#options # and https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification#boardstxt - BOARD="esp32:esp32:esp32" - - BOARD="STM32:stm32:Nucleo_64:pnum=NUCLEO_L452REP" + - BOARD="STM32:stm32:Nucleo_64:pnum=NUCLEO_L452RE" - BOARD="esp8266:esp8266:generic:xtal=80,ResetMethod=ck,CrystalFreq=26,FlashFreq=40,FlashMode=qio,eesz=512K" - BOARD="arduino:samd:arduino_zero_native" - BOARD="arduino:sam:arduino_due_x" From 1b96a00cb5ede2e69a7ad74959054d80041e0bb6 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 17:54:43 +0100 Subject: [PATCH 68/83] [RF69] Added missing standby command --- src/modules/RF69.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 882ca15d..96ec2a58 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -289,6 +289,12 @@ int16_t RF69::startTransmit(uint8_t* data, size_t len, uint8_t addr) { } int16_t RF69::readData(uint8_t* data, size_t len) { + // set mdoe to standby + int16_t state = standby(); + if(state != ERR_NONE) { + return(state); + } + // get packet length size_t length = len; if(len == RF69_MAX_PACKET_LENGTH) { From 2d7790d6582e8b5b7d7df321b59c0304263a01cf Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 17:56:04 +0100 Subject: [PATCH 69/83] [SX127x] Added missing listen mode command (#72) --- .../SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino b/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino index 3fd250da..d204348b 100644 --- a/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino +++ b/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino @@ -76,6 +76,7 @@ void setup() { // lora.sleep() // lora.transmit(); // lora.receive(); + // lora.readData(); // lora.scanChannel(); } @@ -153,6 +154,9 @@ void loop() { } + // put module back to listen mode + lora.startReceive(); + // we're ready to receive more packets, // enable interrupt service routine enableInterrupt = true; From 7ce656dd815633c44f144013357cd7cc757e0a98 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 17:56:14 +0100 Subject: [PATCH 70/83] [RF69] Added missing listen mode command (#72) --- .../RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino b/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino index 336f41a1..a38ec020 100644 --- a/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino +++ b/examples/RF69/RF69_Receive_Interrupt/RF69_Receive_Interrupt.ino @@ -64,6 +64,7 @@ void setup() { // rf.sleep() // rf.transmit(); // rf.receive(); + // rf.readData(); } // flag to indicate that a packet was received @@ -125,6 +126,9 @@ void loop() { } + // put module back to listen mode + rf.startReceive(); + // we're ready to receive more packets, // enable interrupt service routine enableInterrupt = true; From 52b08a02e41842cc5c49b09dfc9aca772866e126 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 17:56:24 +0100 Subject: [PATCH 71/83] [CC1101] Added missing listen mode command (#72) --- .../CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino b/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino index 9fcae3fe..a4307ab4 100644 --- a/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino +++ b/examples/CC1101/CC1101_Receive_Interrupt/CC1101_Receive_Interrupt.ino @@ -70,6 +70,7 @@ void setup() { // cc.sleep() // cc.transmit(); // cc.receive(); + // cc.readData(); } // flag to indicate that a packet was received @@ -142,6 +143,9 @@ void loop() { } + // put module back to listen mode + cc.startReceive(); + // we're ready to receive more packets, // enable interrupt service routine enableInterrupt = true; From a576a216b815788b8b4c86d50b4097750aa05658 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 18:28:38 +0100 Subject: [PATCH 72/83] Set Travis to STM32F303CC --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e908bec0..0d669626 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ env: # see https://github.com/arduino/Arduino/blob/master/build/shared/manpage.adoc#options # and https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5-3rd-party-Hardware-specification#boardstxt - BOARD="esp32:esp32:esp32" - - BOARD="STM32:stm32:Nucleo_64:pnum=NUCLEO_L452RE" + - BOARD="STM32:stm32:GenF3:pnum=BLACKPILL_F303CC" - BOARD="esp8266:esp8266:generic:xtal=80,ResetMethod=ck,CrystalFreq=26,FlashFreq=40,FlashMode=qio,eesz=512K" - BOARD="arduino:samd:arduino_zero_native" - BOARD="arduino:sam:arduino_due_x" From e89c02bf5689bc2752b1253382a8bbfd617b9b80 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 19 Nov 2019 19:07:35 +0100 Subject: [PATCH 73/83] Advanced version to 1.8.0 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index e89906e6..cd1158c1 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=RadioLib -version=1.7.0 +version=1.8.0 author=Jan Gromes maintainer=Jan Gromes sentence=Universal wireless communication library for Arduino From cd1c799a645918add9b39039b5d77d8a526bc33a Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 20 Nov 2019 16:22:50 +0100 Subject: [PATCH 74/83] Updated macro names --- src/ISerial.cpp | 8 ++--- src/Module.cpp | 18 +++++------ src/Module.h | 8 ++--- src/TypeDef.h | 55 ++++++++++++++++++++++---------- src/modules/CC1101.cpp | 2 +- src/modules/ESP8266.cpp | 26 +++++++-------- src/modules/HC05.cpp | 2 +- src/modules/JDY08.cpp | 2 +- src/modules/RF69.cpp | 2 +- src/modules/SX1231.cpp | 2 +- src/modules/SX126x.cpp | 4 +-- src/modules/SX127x.cpp | 4 +-- src/modules/XBee.cpp | 42 ++++++++++++------------- src/modules/XBee.h | 4 +-- src/modules/nRF24.cpp | 2 +- src/protocols/MQTT.cpp | 56 ++++++++++++++++----------------- src/protocols/PhysicalLayer.cpp | 18 +++++------ src/protocols/RTTY.cpp | 14 ++++----- src/protocols/RTTY.h | 4 +-- 19 files changed, 147 insertions(+), 126 deletions(-) diff --git a/src/ISerial.cpp b/src/ISerial.cpp index bc280e68..8cd4c65a 100644 --- a/src/ISerial.cpp +++ b/src/ISerial.cpp @@ -9,7 +9,7 @@ void ISerial::begin(long speed) { } bool ISerial::listen() { -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED return true; #else return(_mod->ModuleSerial->listen()); @@ -21,7 +21,7 @@ void ISerial::end() { } bool ISerial::isListening() { -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED return true; #else return(_mod->ModuleSerial->isListening()); @@ -29,7 +29,7 @@ bool ISerial::isListening() { } bool ISerial::stopListening() { -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED return true; #else return(_mod->ModuleSerial->stopListening()); @@ -37,7 +37,7 @@ bool ISerial::stopListening() { } bool ISerial::overflow() { -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED return false; #else return(_mod->ModuleSerial->overflow()); diff --git a/src/Module.cpp b/src/Module.cpp index 1c994eff..2c1bc7fc 100644 --- a/src/Module.cpp +++ b/src/Module.cpp @@ -7,7 +7,7 @@ Module::Module(int rx, int tx, HardwareSerial* useSer) { _int0 = -1; _int1 = -1; -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); @@ -34,7 +34,7 @@ Module::Module(int cs, int int0, int int1, int rx, int tx, SPIClass& spi, SPISet _spi = &spi; _spiSettings = spiSettings; -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED ModuleSerial = useSer; #else ModuleSerial = new SoftwareSerial(_rx, _tx); @@ -55,33 +55,33 @@ Module::Module(int cs, int int0, int int1, int int2, SPIClass& spi, SPISettings void Module::init(uint8_t interface, uint8_t gpio) { // select interface switch(interface) { - case USE_SPI: + case RADIOLIB_USE_SPI: pinMode(_cs, OUTPUT); digitalWrite(_cs, HIGH); _spi->begin(); break; - case USE_UART: + case RADIOLIB_USE_UART: #if defined(ESP32) ModuleSerial->begin(baudrate, SERIAL_8N1, _rx, _tx); #else ModuleSerial->begin(baudrate); #endif break; - case USE_I2C: + case RADIOLIB_USE_I2C: break; } // select GPIO switch(gpio) { - case INT_NONE: + case RADIOLIB_INT_NONE: break; - case INT_0: + case RADIOLIB_INT_0: pinMode(_int0, INPUT); break; - case INT_1: + case RADIOLIB_INT_1: pinMode(_int1, INPUT); break; - case INT_BOTH: + case RADIOLIB_INT_BOTH: pinMode(_int0, INPUT); pinMode(_int1, INPUT); break; diff --git a/src/Module.h b/src/Module.h index 1a7ff1de..1b4861b6 100644 --- a/src/Module.h +++ b/src/Module.h @@ -5,7 +5,7 @@ #include //#include -#ifndef SOFTWARE_SERIAL_UNSUPPORTED +#ifndef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED #include #endif @@ -27,7 +27,7 @@ class Module { \param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1 */ -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED Module(int tx, int rx, HardwareSerial* useSer = &Serial1); #else Module(int tx, int rx, HardwareSerial* useSer = nullptr); @@ -84,7 +84,7 @@ class Module { \param serial HardwareSerial to be used on ESP32 and SAMD. Defaults to 1 */ -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED 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); @@ -96,7 +96,7 @@ class Module { /*! \brief Internal SoftwareSerial instance. */ -#ifdef SOFTWARE_SERIAL_UNSUPPORTED +#ifdef RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED HardwareSerial* ModuleSerial; #else SoftwareSerial* ModuleSerial; diff --git a/src/TypeDef.h b/src/TypeDef.h index 4814dd7d..25593d80 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -1,27 +1,34 @@ #ifndef _RADIOLIB_TYPES_H #define _RADIOLIB_TYPES_H - #if ARDUINO >= 100 #include "Arduino.h" #else #error "Unsupported Arduino version (< 1.0.0)" #endif -// the following platforms do not support SoftwareSerial library -#if defined(ESP32) || defined(SAMD_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__SAM3X8E__) - #define SOFTWARE_SERIAL_UNSUPPORTED -#endif +/* + * Uncomment to enable static-only memory management: no dynamic allocation will be performed. + * Warning: Large static arrays will be created in some methods. It is not advised to send large packets in this mode. + */ -// uncomment to enable static-only memory management: no dynamic allocation will be performed -// Warning: Large static arrays will be created in some methods. It is also not advised to send large packets in this mode. -//#define STATIC_ONLY -#define STATIC_ARRAY_SIZE 256 +//#define RADIOLIB_STATIC_ONLY -#define RADIOLIB_DEBUG_PORT Serial +// set the size of static arrays to use +#define RADIOLIB_STATIC_ARRAY_SIZE 256 + +/* + * Uncomment to enable debug output. + * Warning: Debug output will slow down the whole system significantly + * Levels: debug - only main info + * verbose - full transcript of all SPI/UART communication + */ //#define RADIOLIB_DEBUG //#define RADIOLIB_VERBOSE +// set which Serial port should be used for debug output +#define RADIOLIB_DEBUG_PORT Serial + #ifdef RADIOLIB_DEBUG #define RADIOLIB_DEBUG_PRINT(...) { RADIOLIB_DEBUG_PORT.print(__VA_ARGS__); } #define RADIOLIB_DEBUG_PRINTLN(...) { RADIOLIB_DEBUG_PORT.println(__VA_ARGS__); } @@ -38,6 +45,20 @@ #define RADIOLIB_VERBOSE_PRINTLN(...) {} #endif +/* + * Uncomment to enable god mode - all methods and member variables in all classes will be made public, thus making them accessible from Arduino code. + * Warning: Come on, it's called GOD mode - obviously only use this if you know what you're doing. + * Failure to heed the above warning may result in bricked module. + */ +//#define RADIOLIB_GODMODE + +/* + * The following platforms do not support SoftwareSerial library. + */ +#if defined(ESP32) || defined(SAMD_SERIES) || defined(ARDUINO_ARCH_STM32) || defined(__SAM3X8E__) + #define RADIOLIB_SOFTWARE_SERIAL_UNSUPPORTED +#endif + /*! \defgroup shield_config Shield Configuration @@ -47,37 +68,37 @@ /*! \brief Use SPI interface. */ -#define USE_SPI 0x00 +#define RADIOLIB_USE_SPI 0x00 /*! \brief Use UART interface. */ -#define USE_UART 0x01 +#define RADIOLIB_USE_UART 0x01 /*! \brief Use I2C interface. */ -#define USE_I2C 0x02 +#define RADIOLIB_USE_I2C 0x02 /*! \brief Do not use any interrupts/GPIOs. */ -#define INT_NONE 0x00 +#define RADIOLIB_INT_NONE 0x00 /*! \brief Use interrupt/GPIO 0. */ -#define INT_0 0x01 +#define RADIOLIB_INT_0 0x01 /*! \brief Use interrupt/GPIO 1. */ -#define INT_1 0x02 +#define RADIOLIB_INT_1 0x02 /*! \brief Use both interrupts/GPIOs. */ -#define INT_BOTH 0x03 +#define RADIOLIB_INT_BOTH 0x03 /*! \} diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101.cpp index c39c48e6..d94d3fca 100644 --- a/src/modules/CC1101.cpp +++ b/src/modules/CC1101.cpp @@ -12,7 +12,7 @@ int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t po // set module properties _mod->SPIreadCommand = CC1101_CMD_READ; _mod->SPIwriteCommand = CC1101_CMD_WRITE; - _mod->init(USE_SPI, INT_0); + _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_0); // try to find the CC1101 chip uint8_t i = 0; diff --git a/src/modules/ESP8266.cpp b/src/modules/ESP8266.cpp index 6160dc9b..e3ff2fbb 100644 --- a/src/modules/ESP8266.cpp +++ b/src/modules/ESP8266.cpp @@ -9,7 +9,7 @@ int16_t ESP8266::begin(long speed) { // set module properties _mod->AtLineFeed = "\r\n"; _mod->baudrate = speed; - _mod->init(USE_UART, INT_NONE); + _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_NONE); // empty UART buffer (garbage data) _mod->ATemptyBuffer(); @@ -52,8 +52,8 @@ int16_t ESP8266::join(const char* ssid, const char* password) { // build AT command const char* atStr = "AT+CWJAP_CUR=\""; - #ifdef STATIC_ONLY - char cmd[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + char cmd[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t cmdLen = strlen(atStr) + strlen(ssid) + strlen(password) + 4; char* cmd = new char[cmdLen + 1]; @@ -66,7 +66,7 @@ int16_t ESP8266::join(const char* ssid, const char* password) { // send command bool res = _mod->ATsendCommand(cmd); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] cmd; #endif if(!res) { @@ -93,8 +93,8 @@ int16_t ESP8266::openTransportConnection(const char* host, const char* protocol, if((strcmp(protocol, "TCP") == 0) && (tcpKeepAlive > 0)) { cmdLen += strlen(tcpKeepAliveStr) + 1; } - #ifdef STATIC_ONLY - char cmd[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + char cmd[RADIOLIB_STATIC_ARRAY_SIZE]; #else char* cmd = new char[cmdLen + 1]; #endif @@ -111,7 +111,7 @@ int16_t ESP8266::openTransportConnection(const char* host, const char* protocol, // send command bool res = _mod->ATsendCommand(cmd); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] cmd; #endif if(!res) { @@ -134,8 +134,8 @@ int16_t ESP8266::send(const char* data) { char lenStr[8]; itoa(strlen(data), lenStr, 10); const char* atStr = "AT+CIPSEND="; - #ifdef STATIC_ONLY - char cmd[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + char cmd[RADIOLIB_STATIC_ARRAY_SIZE]; #else char* cmd = new char[strlen(atStr) + strlen(lenStr) + 1]; #endif @@ -144,7 +144,7 @@ int16_t ESP8266::send(const char* data) { // send command bool res = _mod->ATsendCommand(cmd); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] cmd; #endif if(!res) { @@ -164,8 +164,8 @@ int16_t ESP8266::send(uint8_t* data, uint32_t len) { char lenStr[8]; itoa(len, lenStr, 10); const char atStr[] = "AT+CIPSEND="; - #ifdef STATIC_ONLY - char cmd[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + char cmd[RADIOLIB_STATIC_ARRAY_SIZE]; #else char* cmd = new char[strlen(atStr) + strlen(lenStr) + 1]; #endif @@ -174,7 +174,7 @@ int16_t ESP8266::send(uint8_t* data, uint32_t len) { // send command bool res = _mod->ATsendCommand(cmd); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] cmd; #endif if(!res) { diff --git a/src/modules/HC05.cpp b/src/modules/HC05.cpp index 0dc409d3..be54f672 100644 --- a/src/modules/HC05.cpp +++ b/src/modules/HC05.cpp @@ -7,5 +7,5 @@ HC05::HC05(Module* mod) : ISerial(mod) { void HC05::begin(long speed) { // set module properties _mod->baudrate = speed; - _mod->init(USE_UART, INT_NONE); + _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_NONE); } diff --git a/src/modules/JDY08.cpp b/src/modules/JDY08.cpp index 36a759dd..c4eee4a3 100644 --- a/src/modules/JDY08.cpp +++ b/src/modules/JDY08.cpp @@ -8,5 +8,5 @@ void JDY08::begin(long speed) { // set module properties _mod->AtLineFeed = ""; _mod->baudrate = speed; - _mod->init(USE_UART, INT_NONE); + _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_NONE); } diff --git a/src/modules/RF69.cpp b/src/modules/RF69.cpp index 96ec2a58..1c308030 100644 --- a/src/modules/RF69.cpp +++ b/src/modules/RF69.cpp @@ -14,7 +14,7 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT, int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { // set module properties - _mod->init(USE_SPI, INT_0); + _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_0); // try to find the RF69 chip uint8_t i = 0; diff --git a/src/modules/SX1231.cpp b/src/modules/SX1231.cpp index 375e4b69..7e1e93d4 100644 --- a/src/modules/SX1231.cpp +++ b/src/modules/SX1231.cpp @@ -6,7 +6,7 @@ SX1231::SX1231(Module* mod) : RF69(mod) { int16_t SX1231::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { // set module properties - _mod->init(USE_SPI, INT_BOTH); + _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); // try to find the SX1231 chip uint8_t i = 0; diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x.cpp index 5603de76..fe2b09ea 100644 --- a/src/modules/SX126x.cpp +++ b/src/modules/SX126x.cpp @@ -6,7 +6,7 @@ SX126x::SX126x(Module* mod) : PhysicalLayer(SX126X_CRYSTAL_FREQ, SX126X_DIV_EXPO int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float currentLimit, uint16_t preambleLength) { // set module properties - _mod->init(USE_SPI, INT_BOTH); + _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); pinMode(_mod->getRx(), INPUT); // BW in kHz and SF are required in order to calculate LDRO for setModulationParams @@ -71,7 +71,7 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint16_t syncWord, float int16_t SX126x::beginFSK(float br, float freqDev, float rxBw, float currentLimit, uint16_t preambleLength, float dataShaping) { // set module properties - _mod->init(USE_SPI, INT_BOTH); + _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); pinMode(_mod->getRx(), INPUT); // initialize configuration variables (will be overwritten during public settings configuration) diff --git a/src/modules/SX127x.cpp b/src/modules/SX127x.cpp index 7411e998..771de33a 100644 --- a/src/modules/SX127x.cpp +++ b/src/modules/SX127x.cpp @@ -7,7 +7,7 @@ SX127x::SX127x(Module* mod) : PhysicalLayer(SX127X_CRYSTAL_FREQ, SX127X_DIV_EXPO int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimit, uint16_t preambleLength) { // set module properties - _mod->init(USE_SPI, INT_BOTH); + _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); // try to find the SX127x chip if(!SX127x::findChip(chipVersion)) { @@ -51,7 +51,7 @@ int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimi int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxBw, uint8_t currentLimit, uint16_t preambleLength, bool enableOOK) { // set module properties - _mod->init(USE_SPI, INT_BOTH); + _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); // try to find the SX127x chip if(!SX127x::findChip(chipVersion)) { diff --git a/src/modules/XBee.cpp b/src/modules/XBee.cpp index a2397d61..87a93a8d 100644 --- a/src/modules/XBee.cpp +++ b/src/modules/XBee.cpp @@ -10,7 +10,7 @@ XBee::XBee(Module* mod) { int16_t XBee::begin(long speed) { // set module properties _mod->baudrate = speed; - _mod->init(USE_UART, INT_1); + _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_1); // reset module reset(); @@ -68,8 +68,8 @@ int16_t XBee::transmit(uint8_t* dest, uint8_t* destNetwork, const char* payload, // build the frame size_t payloadLen = strlen(payload); size_t dataLen = 8 + 2 + 1 + 1 + payloadLen; - #ifdef STATIC_ONLY - uint8_t cmd[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t cmd[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* cmd = new uint8_t[dataLen]; #endif @@ -82,7 +82,7 @@ int16_t XBee::transmit(uint8_t* dest, uint8_t* destNetwork, const char* payload, // send frame uint8_t frameID = _frameID++; sendApiFrame(XBEE_API_FRAME_ZIGBEE_TRANSMIT_REQUEST, frameID, cmd, dataLen); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] cmd; #endif @@ -119,8 +119,8 @@ size_t XBee::available() { return(0); } - #ifdef STATIC_ONLY - char frame[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + char frame[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* frame = new uint8_t[_frameLength]; #endif @@ -130,7 +130,7 @@ size_t XBee::available() { // save packet source and data size_t payloadLength = _frameLength - 12; - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] _packetData; _packetData = new char[payloadLength]; #endif @@ -138,7 +138,7 @@ size_t XBee::available() { _packetData[payloadLength - 1] = '\0'; memcpy(_packetSource, frame + 1, 8); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] frame; #endif _frameLength = 0; @@ -189,7 +189,7 @@ int16_t XBeeSerial::begin(long speed) { // set module properties _mod->AtLineFeed = "\r"; _mod->baudrate = speed; - _mod->init(USE_UART, INT_NONE); + _mod->init(RADIOLIB_USE_UART, RADIOLIB_INT_NONE); // empty UART buffer (garbage data) _mod->ATemptyBuffer(); @@ -232,7 +232,7 @@ int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, co // set higher address bytes RADIOLIB_DEBUG_PRINTLN(F("Setting address (high) ...")); - #ifdef STATIC_ONLY + #ifdef RADIOLIB_STATIC_ONLY char addressHigh[13]; #else char* addressHigh = new char[strlen(destinationAddressHigh) + 4]; @@ -240,7 +240,7 @@ int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, co strcpy(addressHigh, "ATDH"); strcat(addressHigh, destinationAddressHigh); bool res = _mod->ATsendCommand(addressHigh); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] addressHigh; #endif if(!res) { @@ -249,7 +249,7 @@ int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, co // set lower address bytes RADIOLIB_DEBUG_PRINTLN(F("Setting address (low) ...")); - #ifdef STATIC_ONLY + #ifdef RADIOLIB_STATIC_ONLY char addressLow[13]; #else char* addressLow = new char[strlen(destinationAddressLow) + 4]; @@ -257,7 +257,7 @@ int16_t XBeeSerial::setDestinationAddress(const char* destinationAddressHigh, co strcpy(addressLow, "ATDL"); strcat(addressLow, destinationAddressLow); res = _mod->ATsendCommand(addressLow); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] addressLow; #endif if(!res) { @@ -282,7 +282,7 @@ int16_t XBeeSerial::setPanId(const char* panId) { // set PAN ID RADIOLIB_DEBUG_PRINTLN(F("Setting PAN ID ...")); - #ifdef STATIC_ONLY + #ifdef RADIOLIB_STATIC_ONLY char cmd[21]; #else char* cmd = new char[strlen(panId) + 4]; @@ -290,7 +290,7 @@ int16_t XBeeSerial::setPanId(const char* panId) { strcpy(cmd, "ATID"); strcat(cmd, panId); bool res = _mod->ATsendCommand(cmd); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] cmd; #endif if(!res) { @@ -364,8 +364,8 @@ void XBee::sendApiFrame(uint8_t type, uint8_t id, const char* data) { void XBee::sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length) { // build the API frame size_t frameLength = 1 + 2 + length + 1 + 2; - #ifdef STATIC_ONLY - uint8_t frame[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t frame[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* frame = new uint8_t[frameLength]; #endif @@ -390,7 +390,7 @@ void XBee::sendApiFrame(uint8_t type, uint8_t id, uint8_t* data, uint16_t length } // deallocate memory - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] frame; #endif } @@ -418,8 +418,8 @@ int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) { RADIOLIB_DEBUG_PRINTLN(numBytes); // read the response - #ifdef STATIC_ONLY - uint8_t resp[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t resp[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* resp = new uint8_t[numBytes]; #endif @@ -451,7 +451,7 @@ int16_t XBee::readApiFrame(uint8_t frameID, uint8_t codePos, uint16_t timeout) { // codePos does not include start delimiter and frame ID uint8_t code = resp[codePos]; - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] resp; #endif return(code); diff --git a/src/modules/XBee.h b/src/modules/XBee.h index 9091c9cc..ff6bc394 100644 --- a/src/modules/XBee.h +++ b/src/modules/XBee.h @@ -176,8 +176,8 @@ class XBee { size_t _frameLength; bool _frameHeaderProcessed; - #ifdef STATIC_ONLY - char _packetData[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + char _packetData[RADIOLIB_STATIC_ARRAY_SIZE]; #else char* _packetData = new char[0]; #endif diff --git a/src/modules/nRF24.cpp b/src/modules/nRF24.cpp index 55c47d73..8fb205fc 100644 --- a/src/modules/nRF24.cpp +++ b/src/modules/nRF24.cpp @@ -8,7 +8,7 @@ int16_t nRF24::begin(int16_t freq, int16_t dataRate, int8_t power, uint8_t addrW // set module properties _mod->SPIreadCommand = NRF24_CMD_READ; _mod->SPIwriteCommand = NRF24_CMD_WRITE; - _mod->init(USE_SPI, INT_BOTH); + _mod->init(RADIOLIB_USE_SPI, RADIOLIB_INT_BOTH); // override pin mode on INT0 (connected to nRF24 CE pin) pinMode(_mod->getInt0(), OUTPUT); diff --git a/src/protocols/MQTT.cpp b/src/protocols/MQTT.cpp index a5291326..92583cbb 100644 --- a/src/protocols/MQTT.cpp +++ b/src/protocols/MQTT.cpp @@ -27,7 +27,7 @@ int16_t MQTTClient::connect(const char* host, const char* clientId, const char* size_t encodedBytes = encodeLength(remainingLength, encoded); // build the CONNECT packet - #ifdef STATIC_ONLY + #ifdef RADIOLIB_STATIC_ONLY uint8_t packet[256]; #else uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; @@ -101,7 +101,7 @@ int16_t MQTTClient::connect(const char* host, const char* clientId, const char* // create TCP connection int16_t state = _tl->openTransportConnection(host, "TCP", _port, keepAlive); if(state != ERR_NONE) { - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] packet; #endif return(state); @@ -109,7 +109,7 @@ int16_t MQTTClient::connect(const char* host, const char* clientId, const char* // send MQTT packet state = _tl->send(packet, 1 + encodedBytes + remainingLength); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] packet; #endif if(state != ERR_NONE) { @@ -123,21 +123,21 @@ int16_t MQTTClient::connect(const char* host, const char* clientId, const char* } // read the response - #ifdef STATIC_ONLY - uint8_t response[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t response[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* response = new uint8_t[numBytes]; #endif _tl->receive(response, numBytes); if((response[0] == MQTT_CONNACK << 4) && (response[1] == 2)) { uint8_t returnCode = response[3]; - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] response; #endif return(returnCode); } - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] response; #endif return(ERR_RESPONSE_MALFORMED); @@ -174,8 +174,8 @@ int16_t MQTTClient::publish(const char* topic, const char* message) { size_t encodedBytes = encodeLength(remainingLength, encoded); // build the PUBLISH packet - #ifdef STATIC_ONLY - uint8_t packet[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t packet[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; #endif @@ -201,7 +201,7 @@ int16_t MQTTClient::publish(const char* topic, const char* message) { // send MQTT packet int16_t state = _tl->send(packet, 1 + encodedBytes + remainingLength); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] packet; #endif return(state); @@ -217,8 +217,8 @@ int16_t MQTTClient::subscribe(const char* topicFilter) { size_t encodedBytes = encodeLength(remainingLength, encoded); // build the SUBSCRIBE packet - #ifdef STATIC_ONLY - uint8_t packet[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t packet[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; #endif @@ -244,7 +244,7 @@ int16_t MQTTClient::subscribe(const char* topicFilter) { // send MQTT packet int16_t state = _tl->send(packet, 1 + encodedBytes + remainingLength); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] packet; #endif if(state != ERR_NONE) { @@ -258,8 +258,8 @@ int16_t MQTTClient::subscribe(const char* topicFilter) { } // read the response - #ifdef STATIC_ONLY - uint8_t response[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t response[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* response = new uint8_t[numBytes]; #endif @@ -268,7 +268,7 @@ int16_t MQTTClient::subscribe(const char* topicFilter) { // check packet ID uint16_t receivedId = response[3] | response[2] << 8; int16_t returnCode = response[4]; - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] response; #endif if(receivedId != packetId) { @@ -277,7 +277,7 @@ int16_t MQTTClient::subscribe(const char* topicFilter) { return(returnCode); } - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] response; #endif return(ERR_RESPONSE_MALFORMED); @@ -291,8 +291,8 @@ int16_t MQTTClient::unsubscribe(const char* topicFilter) { size_t encodedBytes = encodeLength(remainingLength, encoded); // build the UNSUBSCRIBE packet - #ifdef STATIC_ONLY - uint8_t packet[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t packet[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* packet = new uint8_t[1 + encodedBytes + remainingLength]; #endif @@ -317,7 +317,7 @@ int16_t MQTTClient::unsubscribe(const char* topicFilter) { // send MQTT packet int16_t state = _tl->send(packet, 1 + encodedBytes + remainingLength); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] packet; #endif if(state != ERR_NONE) { @@ -331,8 +331,8 @@ int16_t MQTTClient::unsubscribe(const char* topicFilter) { } // read the response - #ifdef STATIC_ONLY - uint8_t response[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t response[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* response = new uint8_t[numBytes]; #endif @@ -340,7 +340,7 @@ int16_t MQTTClient::unsubscribe(const char* topicFilter) { if((response[0] == MQTT_UNSUBACK << 4) && (response[1] == 2)) { // check packet ID uint16_t receivedId = response[3] | response[2] << 8; - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] response; #endif if(receivedId != packetId) { @@ -349,7 +349,7 @@ int16_t MQTTClient::unsubscribe(const char* topicFilter) { return(ERR_NONE); } - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] response; #endif return(ERR_RESPONSE_MALFORMED); @@ -376,20 +376,20 @@ int16_t MQTTClient::ping() { } // read the response - #ifdef STATIC_ONLY - uint8_t response[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t response[RADIOLIB_STATIC_ARRAY_SIZE]; #else uint8_t* response = new uint8_t[numBytes]; #endif _tl->receive(response, numBytes); if((response[0] == MQTT_PINGRESP << 4) && (response[1] == 0)) { - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] response; #endif return(ERR_NONE); } - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] response; #endif return(ERR_RESPONSE_MALFORMED); diff --git a/src/protocols/PhysicalLayer.cpp b/src/protocols/PhysicalLayer.cpp index d27735bd..75425fd8 100644 --- a/src/protocols/PhysicalLayer.cpp +++ b/src/protocols/PhysicalLayer.cpp @@ -19,8 +19,8 @@ int16_t PhysicalLayer::transmit(__FlashStringHelper* fstr, uint8_t addr) { } // dynamically allocate memory - #ifdef STATIC_ONLY - char str[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + char str[RADIOLIB_STATIC_ARRAY_SIZE]; #else char* str = new char[len]; #endif @@ -33,7 +33,7 @@ int16_t PhysicalLayer::transmit(__FlashStringHelper* fstr, uint8_t addr) { // transmit string int16_t state = transmit(str, addr); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] str; #endif return(state); @@ -68,8 +68,8 @@ int16_t PhysicalLayer::readData(String& str, size_t len) { } // build a temporary buffer - #ifdef STATIC_ONLY - uint8_t data[STATIC_ARRAY_SIZE + 1]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t data[RADIOLIB_STATIC_ARRAY_SIZE + 1]; #else uint8_t* data = new uint8_t[length + 1]; if(!data) { @@ -89,7 +89,7 @@ int16_t PhysicalLayer::readData(String& str, size_t len) { } // deallocate temporary buffer - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] data; #endif @@ -108,8 +108,8 @@ int16_t PhysicalLayer::receive(String& str, size_t len) { } // build a temporary buffer - #ifdef STATIC_ONLY - uint8_t data[STATIC_ARRAY_SIZE + 1]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t data[RADIOLIB_STATIC_ARRAY_SIZE + 1]; #else uint8_t* data = new uint8_t[length + 1]; if(!data) { @@ -134,7 +134,7 @@ int16_t PhysicalLayer::receive(String& str, size_t len) { } // deallocate temporary buffer - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] data; #endif diff --git a/src/protocols/RTTY.cpp b/src/protocols/RTTY.cpp index c56f0b0b..0ea4e06f 100644 --- a/src/protocols/RTTY.cpp +++ b/src/protocols/RTTY.cpp @@ -13,7 +13,7 @@ ITA2String::ITA2String(const char* str) { } ITA2String::~ITA2String() { - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] _str; #endif } @@ -32,8 +32,8 @@ size_t ITA2String::length() { uint8_t* ITA2String::byteArr() { // create temporary array 2x the string length (figures may be 3 bytes) - #ifdef STATIC_ONLY - uint8_t temp[STATIC_ARRAY_SIZE*2 + 1]; + #ifdef RADIOLIB_STATIC_ONLY + uint8_t temp[RADIOLIB_STATIC_ARRAY_SIZE*2 + 1]; #else uint8_t* temp = new uint8_t[_len*2 + 1]; #endif @@ -79,7 +79,7 @@ uint8_t* ITA2String::byteArr() { uint8_t* arr = new uint8_t[arrayLen]; memcpy(arr, temp, arrayLen); - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] temp; #endif @@ -208,8 +208,8 @@ size_t RTTYClient::print(__FlashStringHelper* fstr) { } // dynamically allocate memory - #ifdef STATIC_ONLY - char str[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + char str[RADIOLIB_STATIC_ARRAY_SIZE]; #else char* str = new char[len]; #endif @@ -227,7 +227,7 @@ size_t RTTYClient::print(__FlashStringHelper* fstr) { } else if((_encoding == ASCII) || (_encoding == ASCII_EXTENDED)) { n = RTTYClient::write((uint8_t*)str, len); } - #ifndef STATIC_ONLY + #ifndef RADIOLIB_STATIC_ONLY delete[] str; #endif return(n); diff --git a/src/protocols/RTTY.h b/src/protocols/RTTY.h index 60270429..ae1d286c 100644 --- a/src/protocols/RTTY.h +++ b/src/protocols/RTTY.h @@ -58,8 +58,8 @@ class ITA2String { uint8_t* byteArr(); private: - #ifdef STATIC_ONLY - char _str[STATIC_ARRAY_SIZE]; + #ifdef RADIOLIB_STATIC_ONLY + char _str[RADIOLIB_STATIC_ARRAY_SIZE]; #else char* _str = new char[1]; #endif From 2fc641449a6fe40b8bda7e1e3257578cfb9cf70d Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 20 Nov 2019 16:55:11 +0100 Subject: [PATCH 75/83] Implemented god mode --- src/ISerial.h | 2 ++ src/Module.h | 2 ++ src/RadioLib.h | 6 ++++ src/TypeDef.h | 3 +- src/modules/CC1101.h | 2 ++ src/modules/ESP8266.h | 2 ++ src/modules/RF69.h | 4 +++ src/modules/RFM95.h | 46 +++++++++++++++--------------- src/modules/RFM96.h | 48 ++++++++++++++++--------------- src/modules/RFM97.h | 19 +++++++------ src/modules/SX1231.h | 2 ++ src/modules/SX1261.h | 2 ++ src/modules/SX1262.h | 3 ++ src/modules/SX1268.h | 5 ++++ src/modules/SX126x.h | 7 +++-- src/modules/SX1272.h | 6 +++- src/modules/SX1273.h | 47 +++++++++++++++++-------------- src/modules/SX1276.h | 47 +++++++++++++++++-------------- src/modules/SX1277.h | 53 +++++++++++++++++++---------------- src/modules/SX1278.h | 6 +++- src/modules/SX1279.h | 47 +++++++++++++++++-------------- src/modules/SX127x.h | 5 +++- src/modules/XBee.h | 4 +++ src/modules/nRF24.h | 2 ++ src/protocols/HTTP.h | 2 ++ src/protocols/MQTT.h | 2 ++ src/protocols/Morse.h | 2 ++ src/protocols/PhysicalLayer.h | 4 ++- src/protocols/RTTY.h | 4 +++ 29 files changed, 237 insertions(+), 147 deletions(-) diff --git a/src/ISerial.h b/src/ISerial.h index cc45cec5..d086beaf 100644 --- a/src/ISerial.h +++ b/src/ISerial.h @@ -54,7 +54,9 @@ class ISerial { size_t println(const Printable&); size_t println(void); +#ifndef RADIOLIB_GODMODE protected: +#endif Module* _mod; }; diff --git a/src/Module.h b/src/Module.h index 1b4861b6..d4b55321 100644 --- a/src/Module.h +++ b/src/Module.h @@ -310,7 +310,9 @@ class Module { */ SPISettings getSpiSettings() const { return(_spiSettings); } +#ifndef RADIOLIB_GODMODE private: +#endif int _cs; int _tx; int _rx; diff --git a/src/RadioLib.h b/src/RadioLib.h index b9951e52..cb492167 100644 --- a/src/RadioLib.h +++ b/src/RadioLib.h @@ -38,6 +38,10 @@ #include "TypeDef.h" #include "Module.h" +#ifdef RADIOLIB_GODMODE + #warning "God mode active, I hope it was intentional. Buckle up, lads." +#endif + #include "modules/CC1101.h" #ifndef ESP8266 #include "modules/ESP8266.h" @@ -101,7 +105,9 @@ class Radio { Module* ModuleA; Module* ModuleB; +#ifndef RADIOLIB_GODMODE private: +#endif }; diff --git a/src/TypeDef.h b/src/TypeDef.h index 25593d80..1c782564 100644 --- a/src/TypeDef.h +++ b/src/TypeDef.h @@ -18,7 +18,8 @@ /* * Uncomment to enable debug output. - * Warning: Debug output will slow down the whole system significantly + * Warning: Debug output will slow down the whole system significantly. + * Also, it will result in larger compiled binary. * Levels: debug - only main info * verbose - full transcript of all SPI/UART communication */ diff --git a/src/modules/CC1101.h b/src/modules/CC1101.h index 30e64353..b4583389 100644 --- a/src/modules/CC1101.h +++ b/src/modules/CC1101.h @@ -820,7 +820,9 @@ class CC1101: public PhysicalLayer { */ int16_t setPromiscuousMode(bool promiscuous = true); +#ifndef RADIOLIB_GODMODE private: +#endif Module* _mod; float _freq; diff --git a/src/modules/ESP8266.h b/src/modules/ESP8266.h index 8d5d0a9e..f8baa27e 100644 --- a/src/modules/ESP8266.h +++ b/src/modules/ESP8266.h @@ -54,7 +54,9 @@ class ESP8266: public TransportLayer { size_t receive(uint8_t* data, size_t len, uint32_t timeout = 10000); size_t getNumBytes(uint32_t timeout = 10000, size_t minBytes = 10); +#ifndef RADIOLIB_GODMODE private: +#endif Module* _mod; }; diff --git a/src/modules/RF69.h b/src/modules/RF69.h index 5318b7e8..a7847d61 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69.h @@ -762,7 +762,9 @@ class RF69: public PhysicalLayer { */ int16_t setPromiscuousMode(bool promiscuous = true); +#ifndef RADIOLIB_GODMODE protected: +#endif Module* _mod; float _br; @@ -780,7 +782,9 @@ class RF69: public PhysicalLayer { int16_t config(); int16_t directMode(); +#ifndef RADIOLIB_GODMODE private: +#endif int16_t setMode(uint8_t mode); void clearIRQFlags(); }; diff --git a/src/modules/RFM95.h b/src/modules/RFM95.h index 3865ef83..6409f968 100644 --- a/src/modules/RFM95.h +++ b/src/modules/RFM95.h @@ -16,59 +16,61 @@ */ class RFM95: public SX1278 { public: - + // constructor - + /*! \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. - + \param mod Instance of Module that will be used to communicate with the %LoRa chip. */ RFM95(Module* mod); - + // basic methods - + /*! \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. - + \param freq Carrier frequency in MHz. Allowed values range from 868.0 MHz to 915.0 MHz. - + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. - + \param sf %LoRa link spreading factor. Allowed values range from 6 to 12. - + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. - + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. - + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. - - \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. + + \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. Set to 0 to disable OCP (not recommended). - - \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. Allowed values range from 6 to 65535. - + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. Set to 0 to enable automatic gain control (recommended). - + \returns \ref status_codes */ int16_t begin(float freq = 915.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0); - + // configuration methods - + /*! \brief Sets carrier frequency. Allowed values range from 868.0 MHz to 915.0 MHz. - + \param freq Carrier frequency to be set in MHz. - + \returns \ref status_codes */ int16_t setFrequency(float freq); +#ifndef RADIOLIB_GODMODE private: - +#endif + }; #endif diff --git a/src/modules/RFM96.h b/src/modules/RFM96.h index 2190e80d..9683ff2b 100644 --- a/src/modules/RFM96.h +++ b/src/modules/RFM96.h @@ -16,59 +16,61 @@ */ class RFM96: public SX1278 { public: - + // constructor - + /*! \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. - + \param mod Instance of Module that will be used to communicate with the %LoRa chip. */ RFM96(Module* mod); - + // basic methods - + /*! \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. - + \param freq Carrier frequency in MHz. Allowed values range from 433.0 MHz to 470.0 MHz. - + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. - + \param sf %LoRa link spreading factor. Allowed values range from 6 to 12. - + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. - + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. - + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. - - \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. + + \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. Set to 0 to disable OCP (not recommended). - - \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. Allowed values range from 6 to 65535. - + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. Set to 0 to enable automatic gain control (recommended). - + \returns \ref status_codes */ int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0); - + // configuration methods - + /*! \brief Sets carrier frequency. Allowed values range from 433.0 MHz to 470.0 MHz. - + \param freq Carrier frequency to be set in MHz. - + \returns \ref status_codes */ int16_t setFrequency(float freq); - + +#ifndef RADIOLIB_GODMODE private: - +#endif + }; /*! diff --git a/src/modules/RFM97.h b/src/modules/RFM97.h index a85e7ab7..7834efbf 100644 --- a/src/modules/RFM97.h +++ b/src/modules/RFM97.h @@ -14,28 +14,31 @@ */ class RFM97: public RFM95 { public: - + // constructor - + /*! \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. - + \param mod Instance of Module that will be used to communicate with the %LoRa chip. */ RFM97(Module* mod); - + // configuration methods - + /*! \brief Sets %LoRa link spreading factor. Allowed values range from 6 to 9. Only available in %LoRa mode. - + \param sf %LoRa link spreading factor to be set. - + \returns \ref status_codes */ int16_t setSpreadingFactor(uint8_t sf); - + +#ifndef RADIOLIB_GODMODE private: +#endif + }; #endif diff --git a/src/modules/SX1231.h b/src/modules/SX1231.h index 00d6b802..06d16d86 100644 --- a/src/modules/SX1231.h +++ b/src/modules/SX1231.h @@ -46,7 +46,9 @@ class SX1231: public RF69 { */ int16_t begin(float freq = 434.0, float br = 48.0, float rxBw = 125.0, float freqDev = 50.0, int8_t power = 13); +#ifndef RADIOLIB_GODMODE private: +#endif uint8_t _chipRevision; }; diff --git a/src/modules/SX1261.h b/src/modules/SX1261.h index 22c7cadd..33be28cd 100644 --- a/src/modules/SX1261.h +++ b/src/modules/SX1261.h @@ -32,7 +32,9 @@ class SX1261 : public SX1262 { */ int16_t setOutputPower(int8_t power); +#ifndef RADIOLIB_GODMODE private: +#endif int16_t setOptimalLowPowerPaConfig(int8_t* inOutPower); }; diff --git a/src/modules/SX1262.h b/src/modules/SX1262.h index 38180464..e0a207a5 100644 --- a/src/modules/SX1262.h +++ b/src/modules/SX1262.h @@ -89,7 +89,10 @@ class SX1262: public SX126x { */ int16_t setOutputPower(int8_t power); +#ifndef RADIOLIB_GODMODE private: +#endif + }; #endif diff --git a/src/modules/SX1268.h b/src/modules/SX1268.h index 9c05529d..af6f492b 100644 --- a/src/modules/SX1268.h +++ b/src/modules/SX1268.h @@ -91,6 +91,11 @@ class SX1268: public SX126x { \returns \ref status_codes */ int16_t setOutputPower(int8_t power); + +#ifndef RADIOLIB_GODMODE + private: +#endif + }; #endif diff --git a/src/modules/SX126x.h b/src/modules/SX126x.h index d82721c5..c33bb9e7 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x.h @@ -724,7 +724,9 @@ class SX126x: public PhysicalLayer { */ uint32_t getTimeOnAir(size_t len); +#ifndef RADIOLIB_GODMODE protected: +#endif // SX1276x SPI command implementations int16_t setTx(uint32_t timeout = 0); int16_t setRx(uint32_t timeout); @@ -758,7 +760,10 @@ class SX126x: public PhysicalLayer { \brief Fixes overly eager PA clamping on SX1262 / SX1268, as described in section 15.2 of the datasheet */ int16_t fixPaClamping(); + +#ifndef RADIOLIB_GODMODE private: +#endif Module* _mod; uint8_t _bw, _sf, _cr, _ldro, _crcType; @@ -774,8 +779,6 @@ class SX126x: public PhysicalLayer { int16_t config(uint8_t modem); - - // common low-level SPI interface int16_t SPIwriteCommand(uint8_t cmd, uint8_t* data, uint8_t numBytes, bool waitForBusy = true); int16_t SPIwriteCommand(uint8_t* cmd, uint8_t cmdLen, uint8_t* data, uint8_t numBytes, bool waitForBusy = true); diff --git a/src/modules/SX1272.h b/src/modules/SX1272.h index 26f8ac9f..2c707b63 100644 --- a/src/modules/SX1272.h +++ b/src/modules/SX1272.h @@ -250,15 +250,19 @@ class SX1272: public SX127x { */ int16_t setCRC(bool enableCRC); +#ifndef RADIOLIB_GODMODE protected: +#endif int16_t setBandwidthRaw(uint8_t newBandwidth); int16_t setSpreadingFactorRaw(uint8_t newSpreadingFactor); int16_t setCodingRateRaw(uint8_t newCodingRate); int16_t configFSK(); +#ifndef RADIOLIB_GODMODE private: - +#endif + }; #endif diff --git a/src/modules/SX1273.h b/src/modules/SX1273.h index 03c55b6e..4a78229d 100644 --- a/src/modules/SX1273.h +++ b/src/modules/SX1273.h @@ -11,56 +11,61 @@ */ class SX1273: public SX1272 { public: - + // constructor - + /*! \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. - + \param mod Instance of Module that will be used to communicate with the %LoRa chip. */ SX1273(Module* mod); - + // basic methods - + /*! \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. - + \param freq Carrier frequency in MHz. Allowed values range from 860.0 MHz to 1020.0 MHz. - + \param bw %LoRa link bandwidth in kHz. Allowed values are 125, 250 and 500 kHz. - + \param sf %LoRa link spreading factor. Allowed values range from 6 to 9. - + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. - + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. - + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. - - \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. + + \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. Set to 0 to disable OCP (not recommended). - - \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. Allowed values range from 6 to 65535. - + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. Set to 0 to enable automatic gain control (recommended). - + \returns \ref status_codes */ int16_t begin(float freq = 915.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0); - + // configuration methods - + /*! \brief Sets %LoRa link spreading factor. Allowed values range from 6 to 9. Only available in %LoRa mode. - + \param sf %LoRa link spreading factor to be set. - + \returns \ref status_codes */ int16_t setSpreadingFactor(uint8_t sf); + +#ifndef RADIOLIB_GODMODE + private: +#endif + }; #endif diff --git a/src/modules/SX1276.h b/src/modules/SX1276.h index fe1fc23d..fbf7faae 100644 --- a/src/modules/SX1276.h +++ b/src/modules/SX1276.h @@ -11,56 +11,61 @@ */ class SX1276: public SX1278 { public: - + // constructor - + /*! \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. - + \param mod Instance of Module that will be used to communicate with the %LoRa chip. */ SX1276(Module* mod); - + // basic methods - + /*! \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. - + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 1020.0 MHz. - + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. - + \param sf %LoRa link spreading factor. Allowed values range from 6 to 12. - + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. - + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. - + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. - - \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. + + \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. Set to 0 to disable OCP (not recommended). - - \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. Allowed values range from 6 to 65535. - + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. Set to 0 to enable automatic gain control (recommended). - + \returns \ref status_codes */ int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0); - + // configuration methods - + /*! \brief Sets carrier frequency. Allowed values range from 137.0 MHz to 1020.0 MHz. - + \param freq Carrier frequency to be set in MHz. - + \returns \ref status_codes */ int16_t setFrequency(float freq); + +#ifndef RADIOLIB_GODMODE + private: +#endif + }; #endif diff --git a/src/modules/SX1277.h b/src/modules/SX1277.h index 73f65610..53727990 100644 --- a/src/modules/SX1277.h +++ b/src/modules/SX1277.h @@ -11,65 +11,70 @@ */ class SX1277: public SX1278 { public: - + // constructor - + /*! \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. - + \param mod Instance of Module that will be used to communicate with the %LoRa chip. */ SX1277(Module* mod); - + // basic methods - + /*! \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. - + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 1020.0 MHz. - + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. - + \param sf %LoRa link spreading factor. Allowed values range from 6 to 9. - + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. - + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. - + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. - - \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. + + \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. Set to 0 to disable OCP (not recommended). - - \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. Allowed values range from 6 to 65535. - + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. Set to 0 to enable automatic gain control (recommended). - + \returns \ref status_codes */ int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0); - + // configuration methods - + /*! \brief Sets carrier frequency. Allowed values range from 137.0 MHz to 1020.0 MHz. - + \param freq Carrier frequency to be set in MHz. - + \returns \ref status_codes */ int16_t setFrequency(float freq); - + /*! \brief Sets %LoRa link spreading factor. Allowed values range from 6 to 9. Only available in %LoRa mode. - + \param sf %LoRa link spreading factor to be set. - + \returns \ref status_codes */ int16_t setSpreadingFactor(uint8_t sf); + +#ifndef RADIOLIB_GODMODE + private: +#endif + }; #endif diff --git a/src/modules/SX1278.h b/src/modules/SX1278.h index 1715e4b1..92322b25 100644 --- a/src/modules/SX1278.h +++ b/src/modules/SX1278.h @@ -259,15 +259,19 @@ class SX1278: public SX127x { */ int16_t setCRC(bool enableCRC); +#ifndef RADIOLIB_GODMODE protected: +#endif int16_t setBandwidthRaw(uint8_t newBandwidth); int16_t setSpreadingFactorRaw(uint8_t newSpreadingFactor); int16_t setCodingRateRaw(uint8_t newCodingRate); int16_t configFSK(); +#ifndef RADIOLIB_GODMODE private: - +#endif + }; #endif diff --git a/src/modules/SX1279.h b/src/modules/SX1279.h index 26607bfd..d625ec0c 100644 --- a/src/modules/SX1279.h +++ b/src/modules/SX1279.h @@ -11,56 +11,61 @@ */ class SX1279: public SX1278 { public: - + // constructor - + /*! \brief Default constructor. Called from Arduino sketch when creating new LoRa instance. - + \param mod Instance of Module that will be used to communicate with the %LoRa chip. */ SX1279(Module* mod); - + // basic methods - + /*! \brief %LoRa modem initialization method. Must be called at least once from Arduino sketch to initialize the module. - + \param freq Carrier frequency in MHz. Allowed values range from 137.0 MHz to 960.0 MHz. - + \param bw %LoRa link bandwidth in kHz. Allowed values are 10.4, 15.6, 20.8, 31.25, 41.7, 62.5, 125, 250 and 500 kHz. - + \param sf %LoRa link spreading factor. Allowed values range from 6 to 12. - + \param cr %LoRa link coding rate denominator. Allowed values range from 5 to 8. - + \param syncWord %LoRa sync word. Can be used to distinguish different networks. Note that value 0x34 is reserved for LoRaWAN networks. - + \param power Transmission output power in dBm. Allowed values range from 2 to 17 dBm. - - \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. + + \param currentLimit Trim value for OCP (over current protection) in mA. Can be set to multiplies of 5 in range 45 to 120 mA and to multiples of 10 in range 120 to 240 mA. Set to 0 to disable OCP (not recommended). - - \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. + + \param preambleLength Length of %LoRa transmission preamble in symbols. The actual preamble length is 4.25 symbols longer than the set number. Allowed values range from 6 to 65535. - + \param gain Gain of receiver LNA (low-noise amplifier). Can be set to any integer in range 1 to 6 where 1 is the highest gain. Set to 0 to enable automatic gain control (recommended). - + \returns \ref status_codes */ int16_t begin(float freq = 434.0, float bw = 125.0, uint8_t sf = 9, uint8_t cr = 7, uint8_t syncWord = SX127X_SYNC_WORD, int8_t power = 17, uint8_t currentLimit = 100, uint16_t preambleLength = 8, uint8_t gain = 0); - + // configuration methods - + /*! \brief Sets carrier frequency. Allowed values range from 137.0 MHz to 960.0 MHz. - + \param freq Carrier frequency to be set in MHz. - + \returns \ref status_codes */ int16_t setFrequency(float freq); + +#ifndef RADIOLIB_GODMODE + private: +#endif + }; #endif diff --git a/src/modules/SX127x.h b/src/modules/SX127x.h index 05f1e5cf..a1df3ee7 100644 --- a/src/modules/SX127x.h +++ b/src/modules/SX127x.h @@ -867,7 +867,9 @@ class SX127x: public PhysicalLayer { void regDump(); #endif +#ifndef RADIOLIB_GODMODE protected: +#endif Module* _mod; float _freq; @@ -884,8 +886,9 @@ class SX127x: public PhysicalLayer { int16_t getActiveModem(); int16_t directMode(); - +#ifndef RADIOLIB_GODMODE private: +#endif float _dataRate; size_t _packetLength; bool _packetLengthQueried; // FSK packet length is the first byte in FIFO, length can only be queried once diff --git a/src/modules/XBee.h b/src/modules/XBee.h index ff6bc394..6eca70f0 100644 --- a/src/modules/XBee.h +++ b/src/modules/XBee.h @@ -81,7 +81,9 @@ class XBeeSerial: public ISerial { */ int16_t setPanId(const char* panID); +#ifndef RADIOLIB_GODMODE private: +#endif bool enterCmdMode(); }; @@ -170,7 +172,9 @@ class XBee { */ int16_t setPanId(uint8_t* panID); +#ifndef RADIOLIB_GODMODE private: +#endif Module* _mod; uint8_t _frameID; size_t _frameLength; diff --git a/src/modules/nRF24.h b/src/modules/nRF24.h index 6b577576..4ab07353 100644 --- a/src/modules/nRF24.h +++ b/src/modules/nRF24.h @@ -408,7 +408,9 @@ class nRF24: public PhysicalLayer { */ size_t getPacketLength(bool update = true); +#ifndef RADIOLIB_GODMODE private: +#endif Module* _mod; uint8_t _addrWidth; diff --git a/src/protocols/HTTP.h b/src/protocols/HTTP.h index b0309853..cc5575b5 100644 --- a/src/protocols/HTTP.h +++ b/src/protocols/HTTP.h @@ -58,7 +58,9 @@ class HTTPClient { */ int16_t post(const char* url, const char* content, String& response, const char* contentType = "text/plain"); +#ifndef RADIOLIB_GODMODE private: +#endif TransportLayer* _tl; uint16_t _port; diff --git a/src/protocols/MQTT.h b/src/protocols/MQTT.h index d2710047..0062c1cd 100644 --- a/src/protocols/MQTT.h +++ b/src/protocols/MQTT.h @@ -127,7 +127,9 @@ class MQTTClient { */ int16_t check(void (*func)(const char*, const char*)); +#ifndef RADIOLIB_GODMODE private: +#endif TransportLayer* _tl; uint16_t _port; diff --git a/src/protocols/Morse.h b/src/protocols/Morse.h index 7e04e854..28d73a90 100644 --- a/src/protocols/Morse.h +++ b/src/protocols/Morse.h @@ -67,7 +67,9 @@ class MorseClient { size_t println(unsigned long, int = DEC); size_t println(double, int = 2); +#ifndef RADIOLIB_GODMODE private: +#endif PhysicalLayer* _phy; uint32_t _base; uint16_t _dotLength; diff --git a/src/protocols/PhysicalLayer.h b/src/protocols/PhysicalLayer.h index 51c01b98..ec5b8728 100644 --- a/src/protocols/PhysicalLayer.h +++ b/src/protocols/PhysicalLayer.h @@ -87,7 +87,7 @@ class PhysicalLayer { /*! \brief Sets module to standby. - + \returns \ref status_codes */ virtual int16_t standby() = 0; @@ -215,7 +215,9 @@ class PhysicalLayer { */ virtual size_t getPacketLength(bool update = true) = 0; +#ifndef RADIOLIB_GODMODE private: +#endif float _crystalFreq; uint8_t _divExponent; size_t _maxPacketLength; diff --git a/src/protocols/RTTY.h b/src/protocols/RTTY.h index ae1d286c..646b45dd 100644 --- a/src/protocols/RTTY.h +++ b/src/protocols/RTTY.h @@ -57,7 +57,9 @@ class ITA2String { */ uint8_t* byteArr(); +#ifndef RADIOLIB_GODMODE private: +#endif #ifdef RADIOLIB_STATIC_ONLY char _str[RADIOLIB_STATIC_ARRAY_SIZE]; #else @@ -141,7 +143,9 @@ class RTTYClient { size_t println(unsigned long, int = DEC); size_t println(double, int = 2); +#ifndef RADIOLIB_GODMODE private: +#endif PhysicalLayer* _phy; uint8_t _encoding; From 915f3780cc22938c7822d41080ee609d74c56e72 Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 20 Nov 2019 17:19:15 +0100 Subject: [PATCH 76/83] Reworked directory structure --- src/RadioLib.cpp | 8 --- src/RadioLib.h | 65 ++++++++++--------- src/modules/{ => CC1101}/CC1101.cpp | 0 src/modules/{ => CC1101}/CC1101.h | 6 +- src/modules/{ => ESP8266}/ESP8266.cpp | 0 src/modules/{ => ESP8266}/ESP8266.h | 4 +- src/modules/{ => HC05}/HC05.cpp | 0 src/modules/{ => HC05}/HC05.h | 2 +- src/modules/{ => JDY08}/JDY08.cpp | 0 src/modules/{ => JDY08}/JDY08.h | 2 +- src/modules/{ => RF69}/RF69.cpp | 0 src/modules/{ => RF69}/RF69.h | 6 +- src/modules/{ => RFM9x}/RFM95.cpp | 0 src/modules/{ => RFM9x}/RFM95.h | 10 +-- src/modules/{ => RFM9x}/RFM96.cpp | 0 src/modules/{ => RFM9x}/RFM96.h | 8 +-- src/modules/{ => RFM9x}/RFM97.cpp | 0 src/modules/{ => RFM9x}/RFM97.h | 8 +-- src/modules/{ => SX1231}/SX1231.cpp | 0 src/modules/{ => SX1231}/SX1231.h | 6 +- src/modules/{ => SX126x}/SX1261.cpp | 0 src/modules/{ => SX126x}/SX1261.h | 4 +- src/modules/{ => SX126x}/SX1262.cpp | 0 src/modules/{ => SX126x}/SX1262.h | 4 +- src/modules/{ => SX126x}/SX1268.cpp | 0 src/modules/{ => SX126x}/SX1268.h | 6 +- src/modules/{ => SX126x}/SX126x.cpp | 0 src/modules/{ => SX126x}/SX126x.h | 6 +- src/modules/{ => SX127x}/SX1272.cpp | 0 src/modules/{ => SX127x}/SX1272.h | 6 +- src/modules/{ => SX127x}/SX1273.cpp | 0 src/modules/{ => SX127x}/SX1273.h | 2 +- src/modules/{ => SX127x}/SX1276.cpp | 0 src/modules/{ => SX127x}/SX1276.h | 2 +- src/modules/{ => SX127x}/SX1277.cpp | 0 src/modules/{ => SX127x}/SX1277.h | 2 +- src/modules/{ => SX127x}/SX1278.cpp | 0 src/modules/{ => SX127x}/SX1278.h | 6 +- src/modules/{ => SX127x}/SX1279.cpp | 0 src/modules/{ => SX127x}/SX1279.h | 4 +- src/modules/{ => SX127x}/SX127x.cpp | 0 src/modules/{ => SX127x}/SX127x.h | 6 +- src/modules/{ => XBee}/XBee.cpp | 0 src/modules/{ => XBee}/XBee.h | 4 +- src/modules/{ => nRF24}/nRF24.cpp | 0 src/modules/{ => nRF24}/nRF24.h | 6 +- src/protocols/{ => HTTP}/HTTP.cpp | 0 src/protocols/{ => HTTP}/HTTP.h | 4 +- src/protocols/{ => MQTT}/MQTT.cpp | 0 src/protocols/{ => MQTT}/MQTT.h | 4 +- src/protocols/{ => Morse}/Morse.cpp | 0 src/protocols/{ => Morse}/Morse.h | 4 +- .../{ => PhysicalLayer}/PhysicalLayer.cpp | 0 .../{ => PhysicalLayer}/PhysicalLayer.h | 2 +- src/protocols/{ => RTTY}/RTTY.cpp | 0 src/protocols/{ => RTTY}/RTTY.h | 4 +- .../{ => TransportLayer}/TransportLayer.h | 2 +- 57 files changed, 99 insertions(+), 104 deletions(-) delete mode 100644 src/RadioLib.cpp rename src/modules/{ => CC1101}/CC1101.cpp (100%) rename src/modules/{ => CC1101}/CC1101.h (99%) rename src/modules/{ => ESP8266}/ESP8266.cpp (100%) rename src/modules/{ => ESP8266}/ESP8266.h (94%) rename src/modules/{ => HC05}/HC05.cpp (100%) rename src/modules/{ => HC05}/HC05.h (95%) rename src/modules/{ => JDY08}/JDY08.cpp (100%) rename src/modules/{ => JDY08}/JDY08.h (95%) rename src/modules/{ => RF69}/RF69.cpp (100%) rename src/modules/{ => RF69}/RF69.h (99%) rename src/modules/{ => RFM9x}/RFM95.cpp (100%) rename src/modules/{ => RFM9x}/RFM95.h (95%) rename src/modules/{ => RFM9x}/RFM96.cpp (100%) rename src/modules/{ => RFM9x}/RFM96.h (96%) rename src/modules/{ => RFM9x}/RFM97.cpp (100%) rename src/modules/{ => RFM9x}/RFM97.h (88%) rename src/modules/{ => SX1231}/SX1231.cpp (100%) rename src/modules/{ => SX1231}/SX1231.h (94%) rename src/modules/{ => SX126x}/SX1261.cpp (100%) rename src/modules/{ => SX126x}/SX1261.h (93%) rename src/modules/{ => SX126x}/SX1262.cpp (100%) rename src/modules/{ => SX126x}/SX1262.h (98%) rename src/modules/{ => SX126x}/SX1268.cpp (100%) rename src/modules/{ => SX126x}/SX1268.h (98%) rename src/modules/{ => SX126x}/SX126x.cpp (100%) rename src/modules/{ => SX126x}/SX126x.h (99%) rename src/modules/{ => SX127x}/SX1272.cpp (100%) rename src/modules/{ => SX127x}/SX1272.h (99%) rename src/modules/{ => SX127x}/SX1273.cpp (100%) rename src/modules/{ => SX127x}/SX1273.h (98%) rename src/modules/{ => SX127x}/SX1276.cpp (100%) rename src/modules/{ => SX127x}/SX1276.h (98%) rename src/modules/{ => SX127x}/SX1277.cpp (100%) rename src/modules/{ => SX127x}/SX1277.h (99%) rename src/modules/{ => SX127x}/SX1278.cpp (100%) rename src/modules/{ => SX127x}/SX1278.h (99%) rename src/modules/{ => SX127x}/SX1279.cpp (100%) rename src/modules/{ => SX127x}/SX1279.h (98%) rename src/modules/{ => SX127x}/SX127x.cpp (100%) rename src/modules/{ => SX127x}/SX127x.h (99%) rename src/modules/{ => XBee}/XBee.cpp (100%) rename src/modules/{ => XBee}/XBee.h (99%) rename src/modules/{ => nRF24}/nRF24.cpp (100%) rename src/modules/{ => nRF24}/nRF24.h (99%) rename src/protocols/{ => HTTP}/HTTP.cpp (100%) rename src/protocols/{ => HTTP}/HTTP.h (95%) rename src/protocols/{ => MQTT}/MQTT.cpp (100%) rename src/protocols/{ => MQTT}/MQTT.h (98%) rename src/protocols/{ => Morse}/Morse.cpp (100%) rename src/protocols/{ => Morse}/Morse.h (96%) rename src/protocols/{ => PhysicalLayer}/PhysicalLayer.cpp (100%) rename src/protocols/{ => PhysicalLayer}/PhysicalLayer.h (99%) rename src/protocols/{ => RTTY}/RTTY.cpp (100%) rename src/protocols/{ => RTTY}/RTTY.h (98%) rename src/protocols/{ => TransportLayer}/TransportLayer.h (98%) diff --git a/src/RadioLib.cpp b/src/RadioLib.cpp deleted file mode 100644 index 2ab960cd..00000000 --- a/src/RadioLib.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "RadioLib.h" - -Radio::Radio() { - ModuleA = new Module(RADIOSHIELD_CS_A, RADIOSHIELD_INT_0, RADIOSHIELD_INT_1, RADIOSHIELD_RX_A, RADIOSHIELD_TX_A, SPI, SPISettings(2000000, MSBFIRST, SPI_MODE0), nullptr); - ModuleB = new Module(RADIOSHIELD_CS_B, RADIOSHIELD_INT_0, RADIOSHIELD_INT_1, RADIOSHIELD_RX_B, RADIOSHIELD_TX_B, SPI, SPISettings(2000000, MSBFIRST, SPI_MODE0), nullptr); -} - -Radio RadioShield; diff --git a/src/RadioLib.h b/src/RadioLib.h index cb492167..db927d6a 100644 --- a/src/RadioLib.h +++ b/src/RadioLib.h @@ -42,39 +42,39 @@ #warning "God mode active, I hope it was intentional. Buckle up, lads." #endif -#include "modules/CC1101.h" +#include "modules/CC1101/CC1101.h" #ifndef ESP8266 -#include "modules/ESP8266.h" +#include "modules/ESP8266/ESP8266.h" #endif -#include "modules/HC05.h" -#include "modules/JDY08.h" -#include "modules/nRF24.h" -#include "modules/RF69.h" -#include "modules/RFM95.h" -#include "modules/RFM96.h" -#include "modules/RFM97.h" -#include "modules/SX1231.h" -#include "modules/SX1261.h" -#include "modules/SX1262.h" -#include "modules/SX1268.h" -#include "modules/SX1272.h" -#include "modules/SX1273.h" -#include "modules/SX1276.h" -#include "modules/SX1277.h" -#include "modules/SX1278.h" -#include "modules/SX1279.h" -#include "modules/XBee.h" +#include "modules/HC05/HC05.h" +#include "modules/JDY08/JDY08.h" +#include "modules/nRF24/nRF24.h" +#include "modules/RF69/RF69.h" +#include "modules/RFM9x/RFM95.h" +#include "modules/RFM9x/RFM96.h" +#include "modules/RFM9x/RFM97.h" +#include "modules/SX1231/SX1231.h" +#include "modules/SX126x/SX1261.h" +#include "modules/SX126x/SX1262.h" +#include "modules/SX126x/SX1268.h" +#include "modules/SX127x/SX1272.h" +#include "modules/SX127x/SX1273.h" +#include "modules/SX127x/SX1276.h" +#include "modules/SX127x/SX1277.h" +#include "modules/SX127x/SX1278.h" +#include "modules/SX127x/SX1279.h" +#include "modules/XBee/XBee.h" // physical layer protocols -#include "protocols/PhysicalLayer.h" -#include "protocols/Morse.h" -#include "protocols/RTTY.h" +#include "protocols/PhysicalLayer/PhysicalLayer.h" +#include "protocols/Morse/Morse.h" +#include "protocols/RTTY/RTTY.h" // transport layer protocols #ifndef ESP8266 -#include "protocols/TransportLayer.h" -#include "protocols/HTTP.h" -#include "protocols/MQTT.h" +#include "protocols/TransportLayer/TransportLayer.h" +#include "protocols/HTTP/HTTP.h" +#include "protocols/MQTT/MQTT.h" #endif // RadioShield pin definitions @@ -97,13 +97,16 @@ class Radio { public: + Module* ModuleA; + Module* ModuleB; + /*! \brief Default constructor. Only used to set ModuleA and ModuleB configuration. */ - Radio(); - - Module* ModuleA; - Module* ModuleB; + Radio() { + ModuleA = new Module(RADIOSHIELD_CS_A, RADIOSHIELD_INT_0, RADIOSHIELD_INT_1, RADIOSHIELD_RX_A, RADIOSHIELD_TX_A, SPI, SPISettings(2000000, MSBFIRST, SPI_MODE0), nullptr); + ModuleB = new Module(RADIOSHIELD_CS_B, RADIOSHIELD_INT_0, RADIOSHIELD_INT_1, RADIOSHIELD_RX_B, RADIOSHIELD_TX_B, SPI, SPISettings(2000000, MSBFIRST, SPI_MODE0), nullptr); + } #ifndef RADIOLIB_GODMODE private: @@ -111,6 +114,6 @@ class Radio { }; -extern Radio RadioShield; +Radio RadioShield; #endif diff --git a/src/modules/CC1101.cpp b/src/modules/CC1101/CC1101.cpp similarity index 100% rename from src/modules/CC1101.cpp rename to src/modules/CC1101/CC1101.cpp diff --git a/src/modules/CC1101.h b/src/modules/CC1101/CC1101.h similarity index 99% rename from src/modules/CC1101.h rename to src/modules/CC1101/CC1101.h index b4583389..fffde12a 100644 --- a/src/modules/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -1,10 +1,10 @@ #ifndef _RADIOLIB_CC1101_H #define _RADIOLIB_CC1101_H -#include "TypeDef.h" -#include "Module.h" +#include "../../TypeDef.h" +#include "../../Module.h" -#include "../protocols/PhysicalLayer.h" +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" // CC1101 physical layer properties #define CC1101_CRYSTAL_FREQ 26.0 diff --git a/src/modules/ESP8266.cpp b/src/modules/ESP8266/ESP8266.cpp similarity index 100% rename from src/modules/ESP8266.cpp rename to src/modules/ESP8266/ESP8266.cpp diff --git a/src/modules/ESP8266.h b/src/modules/ESP8266/ESP8266.h similarity index 94% rename from src/modules/ESP8266.h rename to src/modules/ESP8266/ESP8266.h index f8baa27e..aa4e145c 100644 --- a/src/modules/ESP8266.h +++ b/src/modules/ESP8266/ESP8266.h @@ -1,9 +1,9 @@ #if !defined(_RADIOLIB_ESP8266_H) && !defined(ESP8266) #define _RADIOLIB_ESP8266_H -#include "Module.h" +#include "../../Module.h" -#include "../protocols/TransportLayer.h" +#include "../../protocols/TransportLayer/TransportLayer.h" /*! \class ESP8266 diff --git a/src/modules/HC05.cpp b/src/modules/HC05/HC05.cpp similarity index 100% rename from src/modules/HC05.cpp rename to src/modules/HC05/HC05.cpp diff --git a/src/modules/HC05.h b/src/modules/HC05/HC05.h similarity index 95% rename from src/modules/HC05.h rename to src/modules/HC05/HC05.h index 5908a92e..2bfacb48 100644 --- a/src/modules/HC05.h +++ b/src/modules/HC05/HC05.h @@ -1,7 +1,7 @@ #ifndef _RADIOLIB_HC05_H #define _RADIOLIB_HC05_H -#include "ISerial.h" +#include "../../ISerial.h" /*! \class HC05 diff --git a/src/modules/JDY08.cpp b/src/modules/JDY08/JDY08.cpp similarity index 100% rename from src/modules/JDY08.cpp rename to src/modules/JDY08/JDY08.cpp diff --git a/src/modules/JDY08.h b/src/modules/JDY08/JDY08.h similarity index 95% rename from src/modules/JDY08.h rename to src/modules/JDY08/JDY08.h index a7cf61af..be01ef19 100644 --- a/src/modules/JDY08.h +++ b/src/modules/JDY08/JDY08.h @@ -1,7 +1,7 @@ #ifndef _RADIOLIB_JDY08_H #define _RADIOLIB_JDY08_H -#include "ISerial.h" +#include "../../ISerial.h" /*! \class JDY08 diff --git a/src/modules/RF69.cpp b/src/modules/RF69/RF69.cpp similarity index 100% rename from src/modules/RF69.cpp rename to src/modules/RF69/RF69.cpp diff --git a/src/modules/RF69.h b/src/modules/RF69/RF69.h similarity index 99% rename from src/modules/RF69.h rename to src/modules/RF69/RF69.h index a7847d61..992cc17e 100644 --- a/src/modules/RF69.h +++ b/src/modules/RF69/RF69.h @@ -1,10 +1,10 @@ #ifndef _RADIOLIB_RF69_H #define _RADIOLIB_RF69_H -#include "TypeDef.h" -#include "Module.h" +#include "../../TypeDef.h" +#include "../../Module.h" -#include "../protocols/PhysicalLayer.h" +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" // RF69 physical layer properties #define RF69_CRYSTAL_FREQ 32.0 diff --git a/src/modules/RFM95.cpp b/src/modules/RFM9x/RFM95.cpp similarity index 100% rename from src/modules/RFM95.cpp rename to src/modules/RFM9x/RFM95.cpp diff --git a/src/modules/RFM95.h b/src/modules/RFM9x/RFM95.h similarity index 95% rename from src/modules/RFM95.h rename to src/modules/RFM9x/RFM95.h index 6409f968..78758971 100644 --- a/src/modules/RFM95.h +++ b/src/modules/RFM9x/RFM95.h @@ -1,10 +1,10 @@ #ifndef _RADIOLIB_RFM95_H #define _RADIOLIB_RFM95_H -#include "TypeDef.h" -#include "Module.h" -#include "SX127x.h" -#include "SX1278.h" +#include "../../TypeDef.h" +#include "../../Module.h" +#include "../SX127x/SX127x.h" +#include "../SX127x/SX1278.h" // SX127X_REG_VERSION #define RFM95_CHIP_VERSION 0x11 @@ -66,7 +66,7 @@ class RFM95: public SX1278 { \returns \ref status_codes */ int16_t setFrequency(float freq); - + #ifndef RADIOLIB_GODMODE private: #endif diff --git a/src/modules/RFM96.cpp b/src/modules/RFM9x/RFM96.cpp similarity index 100% rename from src/modules/RFM96.cpp rename to src/modules/RFM9x/RFM96.cpp diff --git a/src/modules/RFM96.h b/src/modules/RFM9x/RFM96.h similarity index 96% rename from src/modules/RFM96.h rename to src/modules/RFM9x/RFM96.h index 9683ff2b..1288c797 100644 --- a/src/modules/RFM96.h +++ b/src/modules/RFM9x/RFM96.h @@ -1,10 +1,10 @@ #ifndef _RADIOLIB_RFM96_H #define _RADIOLIB_RFM96_H -#include "TypeDef.h" -#include "Module.h" -#include "SX127x.h" -#include "SX1278.h" +#include "../../TypeDef.h" +#include "../../Module.h" +#include "../SX127x/SX127x.h" +#include "../SX127x/SX1278.h" // SX127X_REG_VERSION #define RFM9X_CHIP_VERSION 0x12 // according to datasheet, this should be 0x11, but all modules seem to have 0x12 diff --git a/src/modules/RFM97.cpp b/src/modules/RFM9x/RFM97.cpp similarity index 100% rename from src/modules/RFM97.cpp rename to src/modules/RFM9x/RFM97.cpp diff --git a/src/modules/RFM97.h b/src/modules/RFM9x/RFM97.h similarity index 88% rename from src/modules/RFM97.h rename to src/modules/RFM9x/RFM97.h index 7834efbf..b5dcbbdf 100644 --- a/src/modules/RFM97.h +++ b/src/modules/RFM9x/RFM97.h @@ -1,10 +1,10 @@ #ifndef _RADIOLIB_RFM97_H #define _RADIOLIB_RFM97_H -#include "TypeDef.h" -#include "Module.h" -#include "SX127x.h" -#include "SX1278.h" +#include "../../TypeDef.h" +#include "../../Module.h" +#include "../SX127x/SX127x.h" +#include "../SX127x/SX1278.h" #include "RFM95.h" /*! diff --git a/src/modules/SX1231.cpp b/src/modules/SX1231/SX1231.cpp similarity index 100% rename from src/modules/SX1231.cpp rename to src/modules/SX1231/SX1231.cpp diff --git a/src/modules/SX1231.h b/src/modules/SX1231/SX1231.h similarity index 94% rename from src/modules/SX1231.h rename to src/modules/SX1231/SX1231.h index 06d16d86..d048fd02 100644 --- a/src/modules/SX1231.h +++ b/src/modules/SX1231/SX1231.h @@ -1,9 +1,9 @@ #ifndef _RADIOLIB_SX1231_H #define _RADIOLIB_SX1231_H -#include "TypeDef.h" -#include "Module.h" -#include "RF69.h" +#include "../../TypeDef.h" +#include "../../Module.h" +#include "../RF69/RF69.h" #define SX1231_CHIP_REVISION_2_A 0x21 #define SX1231_CHIP_REVISION_2_B 0x22 diff --git a/src/modules/SX1261.cpp b/src/modules/SX126x/SX1261.cpp similarity index 100% rename from src/modules/SX1261.cpp rename to src/modules/SX126x/SX1261.cpp diff --git a/src/modules/SX1261.h b/src/modules/SX126x/SX1261.h similarity index 93% rename from src/modules/SX1261.h rename to src/modules/SX126x/SX1261.h index 33be28cd..3331c1bc 100644 --- a/src/modules/SX1261.h +++ b/src/modules/SX126x/SX1261.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_SX1261_H #define _RADIOLIB_SX1261_H -#include "TypeDef.h" -#include "Module.h" +#include "../../TypeDef.h" +#include "../../Module.h" #include "SX126x.h" #include "SX1262.h" diff --git a/src/modules/SX1262.cpp b/src/modules/SX126x/SX1262.cpp similarity index 100% rename from src/modules/SX1262.cpp rename to src/modules/SX126x/SX1262.cpp diff --git a/src/modules/SX1262.h b/src/modules/SX126x/SX1262.h similarity index 98% rename from src/modules/SX1262.h rename to src/modules/SX126x/SX1262.h index e0a207a5..de0b5888 100644 --- a/src/modules/SX1262.h +++ b/src/modules/SX126x/SX1262.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_SX1262_H #define _RADIOLIB_SX1262_H -#include "TypeDef.h" -#include "Module.h" +#include "../../TypeDef.h" +#include "../../Module.h" #include "SX126x.h" /*! diff --git a/src/modules/SX1268.cpp b/src/modules/SX126x/SX1268.cpp similarity index 100% rename from src/modules/SX1268.cpp rename to src/modules/SX126x/SX1268.cpp diff --git a/src/modules/SX1268.h b/src/modules/SX126x/SX1268.h similarity index 98% rename from src/modules/SX1268.h rename to src/modules/SX126x/SX1268.h index af6f492b..8f989498 100644 --- a/src/modules/SX1268.h +++ b/src/modules/SX126x/SX1268.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_SX1268_H #define _RADIOLIB_SX1268_H -#include "TypeDef.h" -#include "Module.h" +#include "../../TypeDef.h" +#include "../../Module.h" #include "SX126x.h" //SX126X_CMD_SET_PA_CONFIG @@ -95,7 +95,7 @@ class SX1268: public SX126x { #ifndef RADIOLIB_GODMODE private: #endif - + }; #endif diff --git a/src/modules/SX126x.cpp b/src/modules/SX126x/SX126x.cpp similarity index 100% rename from src/modules/SX126x.cpp rename to src/modules/SX126x/SX126x.cpp diff --git a/src/modules/SX126x.h b/src/modules/SX126x/SX126x.h similarity index 99% rename from src/modules/SX126x.h rename to src/modules/SX126x/SX126x.h index c33bb9e7..4d4efaf7 100644 --- a/src/modules/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -1,10 +1,10 @@ #ifndef _RADIOLIB_SX126X_H #define _RADIOLIB_SX126X_H -#include "TypeDef.h" -#include "Module.h" +#include "../../TypeDef.h" +#include "../../Module.h" -#include "../protocols/PhysicalLayer.h" +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" // SX126X physical layer properties #define SX126X_CRYSTAL_FREQ 32.0 diff --git a/src/modules/SX1272.cpp b/src/modules/SX127x/SX1272.cpp similarity index 100% rename from src/modules/SX1272.cpp rename to src/modules/SX127x/SX1272.cpp diff --git a/src/modules/SX1272.h b/src/modules/SX127x/SX1272.h similarity index 99% rename from src/modules/SX1272.h rename to src/modules/SX127x/SX1272.h index 2c707b63..dd90b739 100644 --- a/src/modules/SX1272.h +++ b/src/modules/SX127x/SX1272.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_SX1272_H #define _RADIOLIB_SX1272_H -#include "TypeDef.h" -#include "Module.h" +#include "../../TypeDef.h" +#include "../../Module.h" #include "SX127x.h" // SX1272 specific register map @@ -262,7 +262,7 @@ class SX1272: public SX127x { #ifndef RADIOLIB_GODMODE private: #endif - + }; #endif diff --git a/src/modules/SX1273.cpp b/src/modules/SX127x/SX1273.cpp similarity index 100% rename from src/modules/SX1273.cpp rename to src/modules/SX127x/SX1273.cpp diff --git a/src/modules/SX1273.h b/src/modules/SX127x/SX1273.h similarity index 98% rename from src/modules/SX1273.h rename to src/modules/SX127x/SX1273.h index 4a78229d..52ffafd1 100644 --- a/src/modules/SX1273.h +++ b/src/modules/SX127x/SX1273.h @@ -1,7 +1,7 @@ #ifndef _RADIOLIB_SX1273_H #define _RADIOLIB_SX1273_H -#include "TypeDef.h" +#include "../../TypeDef.h" #include "SX1272.h" /*! diff --git a/src/modules/SX1276.cpp b/src/modules/SX127x/SX1276.cpp similarity index 100% rename from src/modules/SX1276.cpp rename to src/modules/SX127x/SX1276.cpp diff --git a/src/modules/SX1276.h b/src/modules/SX127x/SX1276.h similarity index 98% rename from src/modules/SX1276.h rename to src/modules/SX127x/SX1276.h index fbf7faae..8a320ec8 100644 --- a/src/modules/SX1276.h +++ b/src/modules/SX127x/SX1276.h @@ -1,7 +1,7 @@ #ifndef _RADIOLIB_SX1276_H #define _RADIOLIB_SX1276_H -#include "TypeDef.h" +#include "../../TypeDef.h" #include "SX1278.h" /*! diff --git a/src/modules/SX1277.cpp b/src/modules/SX127x/SX1277.cpp similarity index 100% rename from src/modules/SX1277.cpp rename to src/modules/SX127x/SX1277.cpp diff --git a/src/modules/SX1277.h b/src/modules/SX127x/SX1277.h similarity index 99% rename from src/modules/SX1277.h rename to src/modules/SX127x/SX1277.h index 53727990..cee312a3 100644 --- a/src/modules/SX1277.h +++ b/src/modules/SX127x/SX1277.h @@ -1,7 +1,7 @@ #ifndef _RADIOLIB_SX1277_H #define _RADIOLIB_SX1277_H -#include "TypeDef.h" +#include "../../TypeDef.h" #include "SX1278.h" /*! diff --git a/src/modules/SX1278.cpp b/src/modules/SX127x/SX1278.cpp similarity index 100% rename from src/modules/SX1278.cpp rename to src/modules/SX127x/SX1278.cpp diff --git a/src/modules/SX1278.h b/src/modules/SX127x/SX1278.h similarity index 99% rename from src/modules/SX1278.h rename to src/modules/SX127x/SX1278.h index 92322b25..c081e76c 100644 --- a/src/modules/SX1278.h +++ b/src/modules/SX127x/SX1278.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_SX1278_H #define _RADIOLIB_SX1278_H -#include "TypeDef.h" -#include "Module.h" +#include "../../TypeDef.h" +#include "../../Module.h" #include "SX127x.h" // SX1278 specific register map @@ -271,7 +271,7 @@ class SX1278: public SX127x { #ifndef RADIOLIB_GODMODE private: #endif - + }; #endif diff --git a/src/modules/SX1279.cpp b/src/modules/SX127x/SX1279.cpp similarity index 100% rename from src/modules/SX1279.cpp rename to src/modules/SX127x/SX1279.cpp diff --git a/src/modules/SX1279.h b/src/modules/SX127x/SX1279.h similarity index 98% rename from src/modules/SX1279.h rename to src/modules/SX127x/SX1279.h index d625ec0c..f0953ecd 100644 --- a/src/modules/SX1279.h +++ b/src/modules/SX127x/SX1279.h @@ -1,7 +1,7 @@ #ifndef _RADIOLIB_SX1279_H #define _RADIOLIB_SX1279_H -#include "TypeDef.h" +#include "../../TypeDef.h" #include "SX1278.h" /*! @@ -65,7 +65,7 @@ class SX1279: public SX1278 { #ifndef RADIOLIB_GODMODE private: #endif - + }; #endif diff --git a/src/modules/SX127x.cpp b/src/modules/SX127x/SX127x.cpp similarity index 100% rename from src/modules/SX127x.cpp rename to src/modules/SX127x/SX127x.cpp diff --git a/src/modules/SX127x.h b/src/modules/SX127x/SX127x.h similarity index 99% rename from src/modules/SX127x.h rename to src/modules/SX127x/SX127x.h index a1df3ee7..956f3c49 100644 --- a/src/modules/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -1,10 +1,10 @@ #ifndef _RADIOLIB_SX127X_H #define _RADIOLIB_SX127X_H -#include "TypeDef.h" -#include "Module.h" +#include "../../TypeDef.h" +#include "../../Module.h" -#include "../protocols/PhysicalLayer.h" +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" // SX127x physical layer properties #define SX127X_CRYSTAL_FREQ 32.0 diff --git a/src/modules/XBee.cpp b/src/modules/XBee/XBee.cpp similarity index 100% rename from src/modules/XBee.cpp rename to src/modules/XBee/XBee.cpp diff --git a/src/modules/XBee.h b/src/modules/XBee/XBee.h similarity index 99% rename from src/modules/XBee.h rename to src/modules/XBee/XBee.h index 6eca70f0..1cb9607a 100644 --- a/src/modules/XBee.h +++ b/src/modules/XBee/XBee.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_XBEE_H #define _RADIOLIB_XBEE_H -#include "ISerial.h" -#include "TypeDef.h" +#include "../../ISerial.h" +#include "../../TypeDef.h" // API reserved characters #define XBEE_API_START 0x7E diff --git a/src/modules/nRF24.cpp b/src/modules/nRF24/nRF24.cpp similarity index 100% rename from src/modules/nRF24.cpp rename to src/modules/nRF24/nRF24.cpp diff --git a/src/modules/nRF24.h b/src/modules/nRF24/nRF24.h similarity index 99% rename from src/modules/nRF24.h rename to src/modules/nRF24/nRF24.h index 4ab07353..1ca8a080 100644 --- a/src/modules/nRF24.h +++ b/src/modules/nRF24/nRF24.h @@ -1,10 +1,10 @@ #ifndef _RADIOLIB_NRF24_H #define _RADIOLIB_NRF24_H -#include "Module.h" -#include "TypeDef.h" +#include "../../Module.h" +#include "../../TypeDef.h" -#include "../protocols/PhysicalLayer.h" +#include "../../protocols/PhysicalLayer/PhysicalLayer.h" // nRF24 physical layer properties (dummy only) #define NRF24_CRYSTAL_FREQ 1.0 diff --git a/src/protocols/HTTP.cpp b/src/protocols/HTTP/HTTP.cpp similarity index 100% rename from src/protocols/HTTP.cpp rename to src/protocols/HTTP/HTTP.cpp diff --git a/src/protocols/HTTP.h b/src/protocols/HTTP/HTTP.h similarity index 95% rename from src/protocols/HTTP.h rename to src/protocols/HTTP/HTTP.h index cc5575b5..118df7ec 100644 --- a/src/protocols/HTTP.h +++ b/src/protocols/HTTP/HTTP.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_HTTP_H #define _RADIOLIB_HTTP_H -#include "TypeDef.h" -#include "TransportLayer.h" +#include "../../TypeDef.h" +#include "../TransportLayer/TransportLayer.h" /*! diff --git a/src/protocols/MQTT.cpp b/src/protocols/MQTT/MQTT.cpp similarity index 100% rename from src/protocols/MQTT.cpp rename to src/protocols/MQTT/MQTT.cpp diff --git a/src/protocols/MQTT.h b/src/protocols/MQTT/MQTT.h similarity index 98% rename from src/protocols/MQTT.h rename to src/protocols/MQTT/MQTT.h index 0062c1cd..b7a94bdb 100644 --- a/src/protocols/MQTT.h +++ b/src/protocols/MQTT/MQTT.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_MQTT_H #define _RADIOLIB_MQTT_H -#include "TypeDef.h" -#include "TransportLayer.h" +#include "../../TypeDef.h" +#include "../TransportLayer/TransportLayer.h" // MQTT packet types #define MQTT_CONNECT 0x01 diff --git a/src/protocols/Morse.cpp b/src/protocols/Morse/Morse.cpp similarity index 100% rename from src/protocols/Morse.cpp rename to src/protocols/Morse/Morse.cpp diff --git a/src/protocols/Morse.h b/src/protocols/Morse/Morse.h similarity index 96% rename from src/protocols/Morse.h rename to src/protocols/Morse/Morse.h index 28d73a90..317a8066 100644 --- a/src/protocols/Morse.h +++ b/src/protocols/Morse/Morse.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_MORSE_H #define _RADIOLIB_MORSE_H -#include "TypeDef.h" -#include "PhysicalLayer.h" +#include "../../TypeDef.h" +#include "../PhysicalLayer/PhysicalLayer.h" #define MORSE_LENGTH 52 diff --git a/src/protocols/PhysicalLayer.cpp b/src/protocols/PhysicalLayer/PhysicalLayer.cpp similarity index 100% rename from src/protocols/PhysicalLayer.cpp rename to src/protocols/PhysicalLayer/PhysicalLayer.cpp diff --git a/src/protocols/PhysicalLayer.h b/src/protocols/PhysicalLayer/PhysicalLayer.h similarity index 99% rename from src/protocols/PhysicalLayer.h rename to src/protocols/PhysicalLayer/PhysicalLayer.h index ec5b8728..38f2974d 100644 --- a/src/protocols/PhysicalLayer.h +++ b/src/protocols/PhysicalLayer/PhysicalLayer.h @@ -1,7 +1,7 @@ #ifndef _RADIOLIB_PHYSICAL_LAYER_H #define _RADIOLIB_PHYSICAL_LAYER_H -#include "TypeDef.h" +#include "../../TypeDef.h" /*! \class PhysicalLayer diff --git a/src/protocols/RTTY.cpp b/src/protocols/RTTY/RTTY.cpp similarity index 100% rename from src/protocols/RTTY.cpp rename to src/protocols/RTTY/RTTY.cpp diff --git a/src/protocols/RTTY.h b/src/protocols/RTTY/RTTY.h similarity index 98% rename from src/protocols/RTTY.h rename to src/protocols/RTTY/RTTY.h index 646b45dd..5c22568c 100644 --- a/src/protocols/RTTY.h +++ b/src/protocols/RTTY/RTTY.h @@ -1,8 +1,8 @@ #ifndef _RADIOLIB_RTTY_H #define _RADIOLIB_RTTY_H -#include "TypeDef.h" -#include "PhysicalLayer.h" +#include "../../TypeDef.h" +#include "../PhysicalLayer/PhysicalLayer.h" #define ITA2_FIGS 0x1B #define ITA2_LTRS 0x1F diff --git a/src/protocols/TransportLayer.h b/src/protocols/TransportLayer/TransportLayer.h similarity index 98% rename from src/protocols/TransportLayer.h rename to src/protocols/TransportLayer/TransportLayer.h index bf17782a..ecf3ad5b 100644 --- a/src/protocols/TransportLayer.h +++ b/src/protocols/TransportLayer/TransportLayer.h @@ -1,7 +1,7 @@ #ifndef _RADIOLIB_TRANSPORT_LAYER_H #define _RADIOLIB_TRANSPORT_LAYER_H -#include "TypeDef.h" +#include "../../TypeDef.h" /*! \class TransportLayer From e74cbe4c51f50bb6c0613aa1f453b91b18f5494b Mon Sep 17 00:00:00 2001 From: jgromes Date: Wed, 20 Nov 2019 17:21:43 +0100 Subject: [PATCH 77/83] Added missing godmode guard --- extras/ModuleTemplate.h | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/extras/ModuleTemplate.h b/extras/ModuleTemplate.h index 73daec95..dcb7b0f9 100644 --- a/extras/ModuleTemplate.h +++ b/extras/ModuleTemplate.h @@ -1,6 +1,6 @@ -/* +/* RadioLib Module Template header file - + Before opening pull request, please make sure that: 1. All files MUST be compiled without errors using default Arduino IDE settings. 2. All files SHOULD be compiled without warnings with compiler warnings set to "All". @@ -8,7 +8,7 @@ 4. Writing style SHOULD be consistent. 5. Comments SHOULD be in place for the most important chunks of code and SHOULD be free of typos. 6. To indent, 2 spaces MUST be used. - + If at any point you are unsure about the required style, please refer to the rest of the modules. */ @@ -21,33 +21,33 @@ */ #include "Module.h" -/* +/* Only use the following include if the module implements methods for OSI transport layer control. - This concerns only modules similar to e.g. ESP8266. - + This concerns only modules similar to e.g. ESP8266. + In this case, your class MUST implement all virtual methods of TransportLayer class. You also MUST provide crystal oscillator frequency and frequency configuration divisor step resolution to the TransportLayer constructor. */ //#include "../protocols/TransportLayer.h" -/* +/* Only use the following include if the module implements methods for OSI physical layer control. This concerns only modules similar to SX127x/RF69/CC1101 etc. - - In this case, your class MUST implement all virtual methods of PhysicalLayer class. + + In this case, your class MUST implement all virtual methods of PhysicalLayer class. */ //#include "../protocols/PhysicalLayer.h" -/* +/* Register map Definition of SPI/I2C register map SHOULD be placed here. The register map SHOULD have two parts: - + 1 - Address map: only defines register names and addresses. Register names MUST match names in official documentation (datasheets etc.). 2 - Variable map: defines variables inside register. This functions as a bit range map for a specific register. Bit range (MSB and LSB) as well as short description for each variable MUST be provided in a comment. - + See RF69 and SX127x header files for examples of register maps. */ // register map | spaces up to this point @@ -59,9 +59,9 @@ /* Module class definition - + The module class MAY inherit from the following classes: - + 1 - ISerial: Interface for Arduino Serial class, intended as a thin wrapper for modules that directly take Serial input (e.g. HC-05). 2 - TransportLayer: In case the module implements methods for OSI transport layer control (e.g. ESP8266). @@ -75,29 +75,31 @@ class { */ // constructor (Module* module); - + /* The class MUST implement at least one basic method called "begin". The "begin" method MUST initialize the module and return the status as int16_t type. */ // basic methods int16_t begin(); - + /* The class MAY implement additional methods. All implemented methods SHOULD return the status as int16_t type. */ - + +#ifndef RADIOLIB_GODMODE private: +#endif /* The class MUST contain private member "Module* _mod" */ Module* _mod; - + /* The class MAY contain additional private variables and/or methods. Private member variables MUST have a name prefixed with "_" (underscore, ASCII 0x5F) - + Usually, these are variables for saving module configuration, or methods that do not have to be exposed to the end user. */ }; From 02b6024e65a4d56d94f215157faca8790566ac02 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 22 Nov 2019 12:32:04 +0100 Subject: [PATCH 78/83] [SX126x] Added fixes for errata and datasheet updates --- src/modules/SX126x/SX126x.cpp | 125 +++++++++++++++++++++++++++++----- src/modules/SX126x/SX126x.h | 22 ++++-- 2 files changed, 125 insertions(+), 22 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index fe2b09ea..e34f1bc6 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -251,11 +251,18 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { uint32_t start = micros(); while(!digitalRead(_mod->getInt0())) { if(micros() - start > timeout) { + fixImplicitTimeout(); clearIrqStatus(); return(ERR_RX_TIMEOUT); } } + // timeout fix is recommended after any reception with active timeout + state = fixImplicitTimeout(); + if(state != ERR_NONE) { + return(state); + } + // read the received data return(readData(data, len)); } @@ -364,6 +371,11 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { return(ERR_PACKET_TOO_LONG); } + // maximum packet length is decreased by 1 when address filtering is active + if((_addrComp != SX126X_GFSK_ADDRESS_FILT_OFF) && (len > SX126X_MAX_PACKET_LENGTH - 1)) { + return(ERR_PACKET_TOO_LONG); + } + // set packet Length int16_t state = ERR_NONE; uint8_t modem = getPacketType(); @@ -402,6 +414,12 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { return(state); } + // fix sensitivity + state = fixSensitivity(); + if(state != ERR_NONE) { + return(state); + } + // start transmission state = setTx(SX126X_TX_TIMEOUT_NONE); if(state != ERR_NONE) { @@ -968,10 +986,15 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } -int16_t SX126x::setTCXO(float voltage, uint32_t timeout) { +int16_t SX126x::setTCXO(float voltage, uint32_t delay) { // set mode to standby standby(); + // check SX126X_XOSC_START_ERR flag and clear it + if(getDeviceErrors() & SX126X_XOSC_START_ERR) { + clearDeviceErrors(); + } + // check alowed voltage values uint8_t data[4]; if(abs(voltage - 1.6) <= 0.001) { @@ -994,11 +1017,11 @@ int16_t SX126x::setTCXO(float voltage, uint32_t timeout) { return(ERR_INVALID_TCXO_VOLTAGE); } - // calculate timeout - uint32_t timeoutValue = (float)timeout / 15.625; - data[1] = (uint8_t)((timeoutValue >> 16) & 0xFF); - data[2] = (uint8_t)((timeoutValue >> 8) & 0xFF); - data[3] = (uint8_t)(timeoutValue & 0xFF); + // calculate delay + uint32_t delayValue = (float)delay / 15.625; + data[1] = (uint8_t)((delayValue >> 16) & 0xFF); + data[2] = (uint8_t)((delayValue >> 8) & 0xFF); + data[3] = (uint8_t)(delayValue & 0xFF); // enable TCXO control on DIO3 SPIwriteCommand(SX126X_CMD_SET_DIO3_AS_TCXO_CTRL, data, 4); @@ -1098,12 +1121,10 @@ int16_t SX126x::setTxParams(uint8_t power, uint8_t rampTime) { return(SPIwriteCommand(SX126X_CMD_SET_TX_PARAMS, data, 2)); } -// set PA config for optimal consumption as described in section 13-21 of the datasheet. -int16_t SX126x::setOptimalHiPowerPaConfig(int8_t * inOutPower) -{ +int16_t SX126x::setOptimalHiPowerPaConfig(int8_t * inOutPower) { + // set PA config for optimal consumption as described in section 13-21 of SX1268 datasheet v1.1 // the final column of Table 13-21 suggests that the value passed in SetTxParams - // is actually scaled depending on the parameters of setPaConfig. - // Testing confirms this is approximately right + // is actually scaled depending on the parameters of setPaConfig int16_t state; if (*inOutPower >= 21) { state = SX126x::setPaConfig(0x04, SX126X_PA_CONFIG_SX1262_8, SX126X_PA_CONFIG_HP_MAX/*0x07*/); @@ -1152,6 +1173,7 @@ int16_t SX126x::setModulationParamsFSK(uint32_t br, uint8_t pulseShape, uint8_t } int16_t SX126x::setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength, uint8_t headerType, uint8_t invertIQ) { + fixInvertedIQ(invertIQ); uint8_t data[6] = {(uint8_t)((preambleLength >> 8) & 0xFF), (uint8_t)(preambleLength & 0xFF), headerType, payloadLength, crcType, invertIQ}; return(SPIwriteCommand(SX126X_CMD_SET_PACKET_PARAMS, data, 6)); } @@ -1188,8 +1210,8 @@ uint16_t SX126x::getDeviceErrors() { } int16_t SX126x::clearDeviceErrors() { - uint8_t data[1] = {SX126X_CMD_NOP}; - return(SPIwriteCommand(SX126X_CMD_CLEAR_DEVICE_ERRORS, data, 1)); + uint8_t data[2] = {SX126X_CMD_NOP, SX126X_CMD_NOP}; + return(SPIwriteCommand(SX126X_CMD_CLEAR_DEVICE_ERRORS, data, 2)); } int16_t SX126x::setFrequencyRaw(float freq) { @@ -1199,14 +1221,85 @@ int16_t SX126x::setFrequencyRaw(float freq) { return(ERR_NONE); } +int16_t SX126x::fixSensitivity() { + // fix receiver sensitivity for 500 kHz LoRa + // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.1 for details + + // read current sensitivity configuration + uint8_t sensitivityConfig = 0; + int16_t state = readRegister(SX126X_REG_SENSITIVITY_CONFIG, &sensitivityConfig, 1); + if(state != ERR_NONE) { + return(state); + } + + // fix the value for LoRa with 500 kHz bandwidth + if((getPacketType() == SX126X_PACKET_TYPE_LORA) && (abs(_bwKhz - 500.0) <= 0.001)) { + sensitivityConfig &= 0xFB; + } else { + sensitivityConfig |= 0x04; + } + return(writeRegister(SX126X_REG_SENSITIVITY_CONFIG, &sensitivityConfig, 1)); +} + int16_t SX126x::fixPaClamping() { - uint8_t clampConfig; - uint16_t state = readRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); + // fixes overly eager PA clamping + // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.2 for details + + // read current clamping configuration + uint8_t clampConfig = 0; + int16_t state = readRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); if (state != ERR_NONE) { return state; } + + // update with the new value clampConfig |= 0x1E; - return writeRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1); + return(writeRegister(SX126X_REG_TX_CLAMP_CONFIG, &clampConfig, 1)); +} + +int16_t SX126x::fixImplicitTimeout() { + // fixes timeout in implicit header mode + // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.3 for details + + // stop RTC counter + uint8_t rtcStop = 0x00; + int16_t state = writeRegister(SX126X_REG_RTC_STOP, &rtcStop, 1); + if(state != ERR_NONE) { + return(state); + } + + // read currently active event + uint8_t rtcEvent = 0; + state = readRegister(SX126X_REG_RTC_EVENT, &rtcEvent, 1); + if(state != ERR_NONE) { + return(state); + } + + // clear events + rtcEvent |= 0x02; + return(writeRegister(SX126X_REG_RTC_EVENT, &rtcEvent, 1)); +} + +int16_t SX126x::fixInvertedIQ(uint8_t iqConfig) { + // fixes IQ configuration for inverted IQ + // see SX1262/SX1268 datasheet, chapter 15 Known Limitations, section 15.4 for details + + // read current IQ configuration + uint8_t iqConfigCurrent = 0; + int16_t state = readRegister(SX126X_REG_IQ_CONFIG, &iqConfigCurrent, 1); + if(state != ERR_NONE) { + return(state); + } + + // set correct IQ configuration + if(iqConfig == SX126X_LORA_IQ_STANDARD) { + iqConfigCurrent &= 0xFB; + } else { + iqConfigCurrent |= 0x04; + } + + // update with the new value + return(writeRegister(SX126X_REG_IQ_CONFIG, &iqConfigCurrent, 1)); } int16_t SX126x::config(uint8_t modem) { diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 4d4efaf7..99668cfb 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -92,7 +92,16 @@ #define SX126X_REG_OCP_CONFIGURATION 0x08E7 #define SX126X_REG_XTA_TRIM 0x0911 #define SX126X_REG_XTB_TRIM 0x0912 -#define SX126X_REG_TX_CLAMP_CONFIG 0x08D8 //Datasheet 15.2 + +// undocumented registers +#define SX126X_REG_SENSITIVITY_CONFIG 0x0889 // SX1268 datasheet v1.1, section 15.1 +#define SX126X_REG_TX_CLAMP_CONFIG 0x08D8 // SX1268 datasheet v1.1, section 15.2 +#define SX126X_REG_RTC_STOP 0x0920 // SX1268 datasheet v1.1, section 15.3 +#define SX126X_REG_RTC_EVENT 0x0944 // SX1268 datasheet v1.1, section 15.3 +#define SX126X_REG_IQ_CONFIG 0x0736 // SX1268 datasheet v1.1, section 15.4 +#define SX126X_REG_RX_GAIN_RETENTION_0 0x029F // SX1268 datasheet v1.1, section 9.6 +#define SX126X_REG_RX_GAIN_RETENTION_1 0x02A0 // SX1268 datasheet v1.1, section 9.6 +#define SX126X_REG_RX_GAIN_RETENTION_2 0x02A1 // SX1268 datasheet v1.1, section 9.6 // SX126X SPI command variables @@ -676,7 +685,7 @@ class SX126x: public PhysicalLayer { \param TCXO timeout in us. Defaults to 5000 us. */ - int16_t setTCXO(float voltage, uint32_t timeout = 5000); + int16_t setTCXO(float voltage, uint32_t delay = 5000); /*! \brief Set DIO2 to function as RF switch (default in Semtech example designs). @@ -743,7 +752,6 @@ class SX126x: public PhysicalLayer { int16_t calibrateImage(uint8_t* data); uint8_t getPacketType(); int16_t setTxParams(uint8_t power, uint8_t rampTime = SX126X_PA_RAMP_200U); - int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); int16_t setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro = 0xFF); int16_t setModulationParamsFSK(uint32_t br, uint8_t pulseShape, uint8_t rxBw, uint32_t freqDev); int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength = 0xFF, uint8_t headerType = SX126X_LORA_HEADER_EXPLICIT, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); @@ -755,11 +763,13 @@ class SX126x: public PhysicalLayer { int16_t clearDeviceErrors(); int16_t setFrequencyRaw(float freq); + int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); - /*! - \brief Fixes overly eager PA clamping on SX1262 / SX1268, as described in section 15.2 of the datasheet - */ + // fixes to errata + int16_t fixSensitivity(); int16_t fixPaClamping(); + int16_t fixImplicitTimeout(); + int16_t fixInvertedIQ(uint8_t iqConfig); #ifndef RADIOLIB_GODMODE private: From 610a0c2de98206c9877926f3f7a45a3ab6eacc06 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 22 Nov 2019 13:01:10 +0100 Subject: [PATCH 79/83] [CC1101] Minor formatting changes --- src/modules/CC1101/CC1101.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index d94d3fca..eaecbd97 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -588,9 +588,8 @@ int16_t CC1101::fixedPacketLengthMode(uint8_t len) { return(state); } - // all went well: cache the reg value + // update cached value _packetLengthConfig = CC1101_LENGTH_CONFIG_FIXED; - return(state); } @@ -599,7 +598,7 @@ int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { return(ERR_PACKET_TOO_LONG); } - // set to fixed packet length + // set to variable packet length int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_VARIABLE, 1, 0); if (state != ERR_NONE) { return(state); @@ -611,7 +610,7 @@ int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { return(state); } - // all went well: cache the reg value + // update cached value _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; return(state); } From bd2161cc471e2e621e8e8596d4b9955f6fb6a540 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 22 Nov 2019 13:29:19 +0100 Subject: [PATCH 80/83] [CC1101] Extracted common packet mode code --- src/modules/CC1101/CC1101.cpp | 67 ++++++++++++++--------------------- src/modules/CC1101/CC1101.h | 4 +-- 2 files changed, 28 insertions(+), 43 deletions(-) diff --git a/src/modules/CC1101/CC1101.cpp b/src/modules/CC1101/CC1101.cpp index eaecbd97..6ee5cdad 100644 --- a/src/modules/CC1101/CC1101.cpp +++ b/src/modules/CC1101/CC1101.cpp @@ -5,7 +5,7 @@ CC1101::CC1101(Module* module) : PhysicalLayer(CC1101_CRYSTAL_FREQ, CC1101_DIV_E _packetLengthQueried = false; _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; - _syncWordLength = CC1101_DEFAULT_SYNC_WORD_LENGTH; + _syncWordLength = 2; } int16_t CC1101::begin(float freq, float br, float rxBw, float freqDev, int8_t power, uint8_t preambleLength) { @@ -450,7 +450,7 @@ int16_t CC1101::setOutputPower(int8_t power) { } int16_t CC1101::setSyncWord(uint8_t* syncWord, uint8_t len, uint8_t maxErrBits) { - if((maxErrBits > 1) || (len > CC1101_MAX_SYNC_WORD_LENGTH)) { + if((maxErrBits > 1) || (len > 2)) { return(ERR_INVALID_SYNC_WORD); } @@ -572,47 +572,11 @@ size_t CC1101::getPacketLength(bool update) { } int16_t CC1101::fixedPacketLengthMode(uint8_t len) { - if (len > CC1101_MAX_PACKET_LENGTH) { - return(ERR_PACKET_TOO_LONG); - } - - // set to fixed packet length - int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_FIXED, 1, 0); - if (state != ERR_NONE) { - return(state); - } - - // set length to register - state = SPIsetRegValue(CC1101_REG_PKTLEN, len); - if (state != ERR_NONE) { - return(state); - } - - // update cached value - _packetLengthConfig = CC1101_LENGTH_CONFIG_FIXED; - return(state); + return(setPacketMode(CC1101_LENGTH_CONFIG_FIXED, len)); } int16_t CC1101::variablePacketLengthMode(uint8_t maxLen) { - if (maxLen > CC1101_MAX_PACKET_LENGTH) { - return(ERR_PACKET_TOO_LONG); - } - - // set to variable packet length - int16_t state = SPIsetRegValue(CC1101_REG_PKTCTRL0, CC1101_LENGTH_CONFIG_VARIABLE, 1, 0); - if (state != ERR_NONE) { - return(state); - } - - // set max length to register - state = SPIsetRegValue(CC1101_REG_PKTLEN, maxLen); - if (state != ERR_NONE) { - return(state); - } - - // update cached value - _packetLengthConfig = CC1101_LENGTH_CONFIG_VARIABLE; - return(state); + return(setPacketMode(CC1101_LENGTH_CONFIG_VARIABLE, maxLen)); } int16_t CC1101::enableSyncWordFiltering(uint8_t maxErrBits) { @@ -737,6 +701,29 @@ void CC1101::getExpMant(float target, uint16_t mantOffset, uint8_t divExp, uint8 } } +int16_t CC1101::setPacketMode(uint8_t mode, uint8_t len) { + // check length + if (len > CC1101_MAX_PACKET_LENGTH) { + return(ERR_PACKET_TOO_LONG); + } + + // set to fixed packet length + int16_t state = _mod->SPIsetRegValue(CC1101_REG_PKTCTRL0, mode, 7, 7); + if (state != ERR_NONE) { + return(state); + } + + // set length to register + state = _mod->SPIsetRegValue(CC1101_REG_PKTLEN, len); + if (state != ERR_NONE) { + return(state); + } + + // update the cached value + _packetLengthConfig = mode; + return(state); +} + int16_t CC1101::SPIgetRegValue(uint8_t reg, uint8_t msb, uint8_t lsb) { // status registers require special command if(reg > CC1101_REG_TEST0) { diff --git a/src/modules/CC1101/CC1101.h b/src/modules/CC1101/CC1101.h index fffde12a..7622efcd 100644 --- a/src/modules/CC1101/CC1101.h +++ b/src/modules/CC1101/CC1101.h @@ -10,9 +10,6 @@ #define CC1101_CRYSTAL_FREQ 26.0 #define CC1101_DIV_EXPONENT 16 #define CC1101_MAX_PACKET_LENGTH 63 -#define CC1101_MAX_SYNC_WORD_LENGTH 2 -#define CC1101_DEFAULT_SYNC_WORD_LENGTH 2 -#define CC1101_DEFAULT_SYNC_WORD { 0xD3, 0x91 } // CC1101 SPI commands #define CC1101_CMD_READ 0b10000000 @@ -840,6 +837,7 @@ class CC1101: public PhysicalLayer { int16_t config(); int16_t directMode(); void getExpMant(float target, uint16_t mantOffset, uint8_t divExp, uint8_t expMax, uint8_t& exp, uint8_t& mant); + int16_t setPacketMode(uint8_t mode, uint8_t len); // SPI read overrides to set bit for burst write and status registers access int16_t SPIgetRegValue(uint8_t reg, uint8_t msb = 7, uint8_t lsb = 0); From 57fab02e2047c9748281f9fb0d550a37dae484a0 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 22 Nov 2019 13:29:33 +0100 Subject: [PATCH 81/83] [RF69] Extracted common packet mode code --- src/modules/RF69/RF69.cpp | 71 +++++++++++++++------------------------ src/modules/RF69/RF69.h | 5 +-- 2 files changed, 29 insertions(+), 47 deletions(-) diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 1c308030..1f236485 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -9,7 +9,7 @@ RF69::RF69(Module* module) : PhysicalLayer(RF69_CRYSTAL_FREQ, RF69_DIV_EXPONENT, _promiscuous = false; - _syncWordLength = RF69_DEFAULT_SYNC_WORD_LENGTH; + _syncWordLength = 2; } int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t power) { @@ -92,7 +92,7 @@ int16_t RF69::begin(float freq, float br, float rxBw, float freqDev, int8_t powe } // default sync word values 0x2D01 is the same as the default in LowPowerLab RFM69 library - uint8_t syncWord[] = RF69_DEFAULT_SYNC_WORD; + uint8_t syncWord[] = {0x2D, 0x01}; state = setSyncWord(syncWord, sizeof(syncWord)); if(state != ERR_NONE) { return(state); @@ -506,7 +506,7 @@ int16_t RF69::setOutputPower(int8_t power) { int16_t RF69::setSyncWord(uint8_t* syncWord, size_t len, uint8_t maxErrBits) { // check constraints - if((maxErrBits > 7) || (len > RF69_MAX_SYNC_WORD_LENGTH)) { + if((maxErrBits > 7) || (len > 8)) { return(ERR_INVALID_SYNC_WORD); } @@ -603,49 +603,11 @@ size_t RF69::getPacketLength(bool update) { } int16_t RF69::fixedPacketLengthMode(uint8_t len) { - if (len > RF69_MAX_PACKET_LENGTH) { - return(ERR_PACKET_TOO_LONG); - } - - // set to fixed packet length - int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_FIXED, 7, 7); - if (state != ERR_NONE) { - return(state); - } - - // set length to register - state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, len); - if (state != ERR_NONE) { - return(state); - } - - // all went well: cache the reg value - _packetLengthConfig = RF69_PACKET_FORMAT_FIXED; - - return(state); + return(setPacketMode(RF69_PACKET_FORMAT_FIXED, len)); } int16_t RF69::variablePacketLengthMode(uint8_t maxLen) { - if (maxLen > RF69_MAX_PACKET_LENGTH) { - return(ERR_PACKET_TOO_LONG); - } - - // set to variable packet length - int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, RF69_PACKET_FORMAT_VARIABLE, 7, 7); - if (state != ERR_NONE) { - return(state); - } - - // set max length to register - state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, maxLen); - if (state != ERR_NONE) { - return(state); - } - - // all went well: cache the reg value - _packetLengthConfig = RF69_PACKET_FORMAT_VARIABLE; - - return(state); + return(setPacketMode(RF69_PACKET_FORMAT_VARIABLE, maxLen)); } int16_t RF69::enableSyncWordFiltering(uint8_t maxErrBits) { @@ -792,6 +754,29 @@ int16_t RF69::config() { return(ERR_NONE); } +int16_t RF69::setPacketMode(uint8_t mode, uint8_t len) { + // check length + if (len > RF69_MAX_PACKET_LENGTH) { + return(ERR_PACKET_TOO_LONG); + } + + // set to fixed packet length + int16_t state = _mod->SPIsetRegValue(RF69_REG_PACKET_CONFIG_1, mode, 7, 7); + if (state != ERR_NONE) { + return(state); + } + + // set length to register + state = _mod->SPIsetRegValue(RF69_REG_PAYLOAD_LENGTH, len); + if (state != ERR_NONE) { + return(state); + } + + // update the cached value + _packetLengthConfig = mode; + return(state); +} + int16_t RF69::setMode(uint8_t mode) { return(_mod->SPIsetRegValue(RF69_REG_OP_MODE, mode, 4, 2)); } diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h index 992cc17e..fbe8abb2 100644 --- a/src/modules/RF69/RF69.h +++ b/src/modules/RF69/RF69.h @@ -10,10 +10,6 @@ #define RF69_CRYSTAL_FREQ 32.0 #define RF69_DIV_EXPONENT 19 #define RF69_MAX_PACKET_LENGTH 64 -#define RF69_MAX_PREAMBLE_LENGTH 4 -#define RF69_MAX_SYNC_WORD_LENGTH 8 -#define RF69_DEFAULT_SYNC_WORD_LENGTH 2 -#define RF69_DEFAULT_SYNC_WORD { 0x2D, 0x01 } // RF69 register map #define RF69_REG_FIFO 0x00 @@ -781,6 +777,7 @@ class RF69: public PhysicalLayer { int16_t config(); int16_t directMode(); + int16_t setPacketMode(uint8_t mode, uint8_t len); #ifndef RADIOLIB_GODMODE private: From 05d6a1c1c8e1fd27838d46f819adf7425aae9b79 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 22 Nov 2019 13:30:02 +0100 Subject: [PATCH 82/83] [SX127x] Added fixed packet mode for FSK modem --- src/modules/SX127x/SX127x.cpp | 52 +++++++++++++++++++++++++++++++++-- src/modules/SX127x/SX127x.h | 23 +++++++++++++++- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 771de33a..9347f44c 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -42,6 +42,9 @@ int16_t SX127x::begin(uint8_t chipVersion, uint8_t syncWord, uint8_t currentLimi // set preamble length state = SX127x::setPreambleLength(preambleLength); + if(state != ERR_NONE) { + return(state); + } // initalize internal variables _dataRate = 0.0; @@ -129,6 +132,15 @@ int16_t SX127x::beginFSK(uint8_t chipVersion, float br, float freqDev, float rxB // set default encoding state = setEncoding(0); + if(state != ERR_NONE) { + return(state); + } + + // set default packet length mode + state = variablePacketLengthMode(); + if (state != ERR_NONE) { + return(state); + } return(state); } @@ -413,7 +425,7 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { int16_t modem = getActiveModem(); if(modem == SX127X_LORA) { // check packet length - if(len >= 256) { + if(len >= SX127X_MAX_PACKET_LENGTH) { return(ERR_PACKET_TOO_LONG); } @@ -443,7 +455,7 @@ int16_t SX127x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { } else if(modem == SX127X_FSK_OOK) { // check packet length - if(len >= 64) { + if(len >= SX127X_MAX_PACKET_LENGTH_FSK) { return(ERR_PACKET_TOO_LONG); } @@ -905,6 +917,14 @@ size_t SX127x::getPacketLength(bool update) { return(_packetLength); } +int16_t SX127x::fixedPacketLengthMode(uint8_t len) { + return(SX127x::setPacketMode(SX127X_PACKET_FIXED, len)); +} + +int16_t SX127x::variablePacketLengthMode(uint8_t maxLen) { + return(SX127x::setPacketMode(SX127X_PACKET_VARIABLE, maxLen)); +} + int16_t SX127x::setRSSIConfig(uint8_t smoothingSamples, int8_t offset) { // check active modem if(getActiveModem() != SX127X_FSK_OOK) { @@ -1006,6 +1026,34 @@ int16_t SX127x::configFSK() { return(state); } +int16_t SX127x::setPacketMode(uint8_t mode, uint8_t len) { + // check packet length + if (len > SX127X_MAX_PACKET_LENGTH_FSK) { + return(ERR_PACKET_TOO_LONG); + } + + // check active modem + if(getActiveModem() != SX127X_FSK_OOK) { + return(ERR_WRONG_MODEM); + } + + // set to fixed packet length + int16_t state = _mod->SPIsetRegValue(SX127X_REG_PACKET_CONFIG_1, mode, 7, 7); + if(state != ERR_NONE) { + return(state); + } + + // set length to register + state = _mod->SPIsetRegValue(SX127X_REG_PAYLOAD_LENGTH_FSK, len); + if(state != ERR_NONE) { + return(state); + } + + // update cached value + _packetLengthConfig = mode; + return(state); +} + bool SX127x::findChip(uint8_t ver) { uint8_t i = 0; bool flagFound = false; diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 956f3c49..c805f5f9 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -9,7 +9,8 @@ // SX127x physical layer properties #define SX127X_CRYSTAL_FREQ 32.0 #define SX127X_DIV_EXPONENT 19 -#define SX127X_MAX_PACKET_LENGTH 256 +#define SX127X_MAX_PACKET_LENGTH 255 +#define SX127X_MAX_PACKET_LENGTH_FSK 64 // SX127x series common LoRa registers #define SX127X_REG_FIFO 0x00 @@ -842,6 +843,24 @@ class SX127x: public PhysicalLayer { */ size_t getPacketLength(bool update = true); + /*! + \brief Set modem in fixed packet length mode. Available in FSK mode only. + + \param len Packet length. + + \returns \ref status_codes + */ + int16_t fixedPacketLengthMode(uint8_t len = SX127X_MAX_PACKET_LENGTH_FSK); + + /*! + \brief Set modem in variable packet length mode. Available in FSK mode only. + + \param len Maximum packet length. + + \returns \ref status_codes + */ + int16_t variablePacketLengthMode(uint8_t maxLen = SX127X_MAX_PACKET_LENGTH_FSK); + /*! \brief Sets RSSI measurement configuration in FSK mode. @@ -885,6 +904,7 @@ class SX127x: public PhysicalLayer { int16_t configFSK(); int16_t getActiveModem(); int16_t directMode(); + int16_t setPacketMode(uint8_t mode, uint8_t len); #ifndef RADIOLIB_GODMODE private: @@ -892,6 +912,7 @@ class SX127x: public PhysicalLayer { float _dataRate; size_t _packetLength; bool _packetLengthQueried; // FSK packet length is the first byte in FIFO, length can only be queried once + uint8_t _packetLengthConfig; bool findChip(uint8_t ver); int16_t setMode(uint8_t mode); From a8b3823bc309b463a46b02caeb6a85f5e63a6716 Mon Sep 17 00:00:00 2001 From: jgromes Date: Fri, 22 Nov 2019 14:09:58 +0100 Subject: [PATCH 83/83] [SX126x] Added fixed packet mode for FSK modem --- src/modules/SX126x/SX126x.cpp | 45 +++++++++++++++++++++++++++-------- src/modules/SX126x/SX126x.h | 23 ++++++++++++++++-- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index e34f1bc6..3df6d8d0 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -382,7 +382,7 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { if(modem == SX126X_PACKET_TYPE_LORA) { state = setPacketParams(_preambleLength, _crcType, len); } else if(modem == SX126X_PACKET_TYPE_GFSK) { - state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, len); + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType, len); } else { return(ERR_UNKNOWN); } @@ -583,7 +583,7 @@ int16_t SX126x::setPreambleLength(uint16_t preambleLength) { return(setPacketParams(_preambleLength, _crcType)); } else if(modem == SX126X_PACKET_TYPE_GFSK) { _preambleLengthFSK = preambleLength; - return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening)); + return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType)); } return(ERR_UNKNOWN); @@ -745,7 +745,7 @@ int16_t SX126x::setSyncWord(uint8_t* syncWord, uint8_t len) { // update packet parameters _syncWordLength = len * 8; - state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); return(state); } @@ -774,7 +774,7 @@ int16_t SX126x::setSyncBits(uint8_t *syncWord, uint8_t bitsLen) { // update packet parameters _syncWordLength = bitsLen; - state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); return(state); } @@ -787,7 +787,7 @@ int16_t SX126x::setNodeAddress(uint8_t nodeAddr) { // enable address filtering (node only) _addrComp = SX126X_GFSK_ADDRESS_FILT_NODE; - int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); + int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); if(state != ERR_NONE) { return(state); } @@ -806,7 +806,7 @@ int16_t SX126x::setBroadcastAddress(uint8_t broadAddr) { // enable address filtering (node and broadcast) _addrComp = SX126X_GFSK_ADDRESS_FILT_NODE_BROADCAST; - int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); + int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); if(state != ERR_NONE) { return(state); } @@ -856,7 +856,7 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool return(ERR_INVALID_CRC_CONFIGURATION); } - int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); + int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); if(state != ERR_NONE) { return(state); } @@ -902,7 +902,7 @@ int16_t SX126x::setWhitening(bool enabled, uint16_t initial) { // disable whitening _whitening = SX126X_GFSK_WHITENING_OFF; - state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); if(state != ERR_NONE) { return(state); } @@ -927,7 +927,7 @@ int16_t SX126x::setWhitening(bool enabled, uint16_t initial) { return(state); } - state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening); + state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType); if(state != ERR_NONE) { return(state); } @@ -965,6 +965,14 @@ size_t SX126x::getPacketLength(bool update) { return((size_t)rxBufStatus[0]); } +int16_t SX126x::fixedPacketLengthMode(uint8_t len) { + return(setPacketMode(SX126X_GFSK_PACKET_FIXED, len)); +} + +int16_t SX126x::variablePacketLengthMode(uint8_t maxLen) { + return(setPacketMode(SX126X_GFSK_PACKET_VARIABLE, maxLen)); +} + uint32_t SX126x::getTimeOnAir(size_t len) { if(getPacketType() == SX126X_PACKET_TYPE_LORA) { float symbolLength = (float)((uint32_t)(1) << _sf) / (float)_bwKhz; @@ -1145,6 +1153,23 @@ int16_t SX126x::setOptimalHiPowerPaConfig(int8_t * inOutPower) { return state; } +int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { + // check active modem + if(getPacketType() != SX126X_PACKET_TYPE_GFSK) { + return(ERR_WRONG_MODEM); + } + + // set requested packet mode + int16_t state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, mode, len); + if(state != ERR_NONE) { + return(state); + } + + // update cached value + _packetType = mode; + return(state); +} + int16_t SX126x::setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro) { // calculate symbol length and enable low data rate optimization, if needed if(ldro == 0xFF) { @@ -1178,7 +1203,7 @@ int16_t SX126x::setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_ return(SPIwriteCommand(SX126X_CMD_SET_PACKET_PARAMS, data, 6)); } -int16_t SX126x::setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t payloadLength, uint8_t packetType, uint8_t preambleDetectorLength) { +int16_t SX126x::setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t packetType, uint8_t payloadLength, uint8_t preambleDetectorLength) { uint8_t data[9] = {(uint8_t)((preambleLength >> 8) & 0xFF), (uint8_t)(preambleLength & 0xFF), preambleDetectorLength, syncWordLength, addrComp, packetType, payloadLength, crcType, whitening}; diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 99668cfb..9bfac2fd 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -724,6 +724,24 @@ class SX126x: public PhysicalLayer { */ size_t getPacketLength(bool update = true); + /*! + \brief Set modem in fixed packet length mode. Available in FSK mode only. + + \param len Packet length. + + \returns \ref status_codes + */ + int16_t fixedPacketLengthMode(uint8_t len = SX126X_MAX_PACKET_LENGTH); + + /*! + \brief Set modem in variable packet length mode. Available in FSK mode only. + + \param len Maximum packet length. + + \returns \ref status_codes + */ + int16_t variablePacketLengthMode(uint8_t maxLen = SX126X_MAX_PACKET_LENGTH); + /*! \brief Get expected time-on-air for a given size of payload @@ -755,7 +773,7 @@ class SX126x: public PhysicalLayer { int16_t setModulationParams(uint8_t sf, uint8_t bw, uint8_t cr, uint8_t ldro = 0xFF); int16_t setModulationParamsFSK(uint32_t br, uint8_t pulseShape, uint8_t rxBw, uint32_t freqDev); int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength = 0xFF, uint8_t headerType = SX126X_LORA_HEADER_EXPLICIT, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); - int16_t setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t payloadLength = 0xFF, uint8_t packetType = SX126X_GFSK_PACKET_VARIABLE, uint8_t preambleDetectorLength = SX126X_GFSK_PREAMBLE_DETECT_16); + int16_t setPacketParamsFSK(uint16_t preambleLength, uint8_t crcType, uint8_t syncWordLength, uint8_t addrComp, uint8_t whitening, uint8_t packetType = SX126X_GFSK_PACKET_VARIABLE, uint8_t payloadLength = 0xFF, uint8_t preambleDetectorLength = SX126X_GFSK_PREAMBLE_DETECT_16); int16_t setBufferBaseAddress(uint8_t txBaseAddress = 0x00, uint8_t rxBaseAddress = 0x00); uint8_t getStatus(); uint32_t getPacketStatus(); @@ -764,6 +782,7 @@ class SX126x: public PhysicalLayer { int16_t setFrequencyRaw(float freq); int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); + int16_t setPacketMode(uint8_t mode, uint8_t len); // fixes to errata int16_t fixSensitivity(); @@ -781,7 +800,7 @@ class SX126x: public PhysicalLayer { float _bwKhz; uint32_t _br, _freqDev; - uint8_t _rxBw, _pulseShape, _crcTypeFSK, _syncWordLength, _addrComp, _whitening; + uint8_t _rxBw, _pulseShape, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType; uint16_t _preambleLengthFSK; float _rxBwKhz;