From d0b817adb990496f850b25fbe8a9e82211cc2280 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:22:38 +0000 Subject: [PATCH 01/22] Implement explicit mode support --- src/modules/SX126x/SX126x.cpp | 1 + src/modules/SX126x/SX126x.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 57007104..671b4dee 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -21,6 +21,7 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float _crcType = SX126X_LORA_CRC_ON; _preambleLength = preambleLength; _tcxoDelay = 0; + _headerType = SX126X_LORA_HEADER_EXPLICIT; // reset the module and verify startup int16_t state = reset(); diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index d8cc8b70..24b47e63 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -834,7 +834,7 @@ class SX126x: public PhysicalLayer { #endif Module* _mod; - uint8_t _bw, _sf, _cr, _ldro, _crcType; + uint8_t _bw, _sf, _cr, _ldro, _crcType, _headerType; uint16_t _preambleLength; float _bwKhz; From 1cce443ef1bdd8b6f490f66524953a36b35e60c8 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:37:58 +0000 Subject: [PATCH 02/22] define interface for implicit/explicit mode support --- src/modules/SX126x/SX126x.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 24b47e63..9d771e42 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -789,6 +789,20 @@ class SX126x: public PhysicalLayer { \returns Expected time-on-air in microseconds. */ uint32_t getTimeOnAir(size_t len); + + /*! + \brief Set implicit header mode for future reception/transmission. + + \returns \ref status_codes + */ + int16_t implicitHeader(); + + /*! + \brief Set explicit header mode for future reception/transmission. + + \returns \ref status_codes + */ + int16_t explicitHeader(); #ifndef RADIOLIB_GODMODE protected: #endif @@ -822,6 +836,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); + int16_t setHeaderType(uint8_t headerType) // fixes to errata int16_t fixSensitivity(); From 7ab5bf732812863ac87adeceb82cd1f801bd064f Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:45:40 +0000 Subject: [PATCH 03/22] setHeaderType --- src/modules/SX126x/SX126x.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 671b4dee..5b1e7ed1 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1346,6 +1346,19 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { return(state); } +int16_t SX126x::setHeaderType(uint8_t headerType) { + // set requested packet mode + int16_t state = setPacketParams(_preambleLength, _crcType, len); + + if(state != ERR_NONE) { + return(state); + } + + // update cached value + _headerType = headerType; + 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) { From 28671fb01a161df1a473b4b236238ed541fd24a7 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:53:18 +0000 Subject: [PATCH 04/22] implement explicitHeader/implicitHeader --- src/modules/SX126x/SX126x.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 5b1e7ed1..2dfe1b14 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1170,6 +1170,14 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } +int16_t implicitHeader() { + return setHeaderType(SX126X_LORA_HEADER_IMPLICIT); +} + +int16_t explicitHeader() { + return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); +} + int16_t SX126x::setTCXO(float voltage, uint32_t delay) { // set mode to standby standby(); From 562ed02eab4eb8c28fe4cf815f9fdfa0c5542473 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 14:54:15 +0000 Subject: [PATCH 05/22] add missing parameter to setHeaderType --- src/modules/SX126x/SX126x.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 2dfe1b14..2a7f9677 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1356,7 +1356,7 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { int16_t SX126x::setHeaderType(uint8_t headerType) { // set requested packet mode - int16_t state = setPacketParams(_preambleLength, _crcType, len); + int16_t state = setPacketParams(_preambleLength, _crcType, 0xFF, headerType); if(state != ERR_NONE) { return(state); From b85e7474b33fc899e451b357544ae6e39567d77c Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 15:16:52 +0000 Subject: [PATCH 06/22] specify _headerType with every call to setPacketParams --- src/modules/SX126x/SX126x.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 2a7f9677..32c928c3 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -450,7 +450,7 @@ int16_t SX126x::startTransmit(uint8_t* data, size_t len, uint8_t addr) { int16_t state = ERR_NONE; uint8_t modem = getPacketType(); if(modem == SX126X_PACKET_TYPE_LORA) { - state = setPacketParams(_preambleLength, _crcType, len); + state = setPacketParams(_preambleLength, _crcType, len, _headerType); } else if(modem == SX126X_PACKET_TYPE_GFSK) { state = setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType, len); } else { @@ -742,7 +742,7 @@ int16_t SX126x::setPreambleLength(uint16_t preambleLength) { uint8_t modem = getPacketType(); if(modem == SX126X_PACKET_TYPE_LORA) { _preambleLength = preambleLength; - return(setPacketParams(_preambleLength, _crcType)); + return(setPacketParams(_preambleLength, _crcType, 0xFF, _headerType)); } else if(modem == SX126X_PACKET_TYPE_GFSK) { _preambleLengthFSK = preambleLength; return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType)); @@ -1047,7 +1047,7 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool _crcType = SX126X_LORA_CRC_OFF; } - return(setPacketParams(_preambleLength, _crcType)); + return(setPacketParams(_preambleLength, _crcType, 0xFF, _headerType)); } return(ERR_UNKNOWN); From aee59b5bdd7a7d99173130e04be8cb5f38ea7c99 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 15:40:59 +0000 Subject: [PATCH 07/22] breaking change to interrupt RX method declaration : len required --- src/modules/SX126x/SX126x.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 9d771e42..bcdc165e 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -514,7 +514,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceive(uint32_t timeout = SX126X_RX_TIMEOUT_INF); + int16_t startReceive(size_t len, uint32_t timeout = SX126X_RX_TIMEOUT_INF); /*! \brief Interrupt-driven receive method where the device mostly sleeps and periodically wakes to listen. @@ -526,7 +526,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod); + int16_t startReceiveDutyCycle(size_t len, uint32_t rxPeriod, uint32_t sleepPeriod); /*! \brief Calls \ref startReceiveDutyCycle with rxPeriod and sleepPeriod set so the unit shouldn't miss any messages. @@ -539,7 +539,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceiveDutyCycleAuto(uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8); + int16_t startReceiveDutyCycleAuto(size_t len, uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8); /*! \brief Reads data received after calling startReceive method. From 54f058de0229abc1b9253ff222f4af83028142bb Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 16:04:46 +0000 Subject: [PATCH 08/22] Revert "breaking change to interrupt RX method declaration : len required" This reverts commit aee59b5bdd7a7d99173130e04be8cb5f38ea7c99. --- src/modules/SX126x/SX126x.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index bcdc165e..9d771e42 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -514,7 +514,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceive(size_t len, uint32_t timeout = SX126X_RX_TIMEOUT_INF); + int16_t startReceive(uint32_t timeout = SX126X_RX_TIMEOUT_INF); /*! \brief Interrupt-driven receive method where the device mostly sleeps and periodically wakes to listen. @@ -526,7 +526,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceiveDutyCycle(size_t len, uint32_t rxPeriod, uint32_t sleepPeriod); + int16_t startReceiveDutyCycle(uint32_t rxPeriod, uint32_t sleepPeriod); /*! \brief Calls \ref startReceiveDutyCycle with rxPeriod and sleepPeriod set so the unit shouldn't miss any messages. @@ -539,7 +539,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t startReceiveDutyCycleAuto(size_t len, uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8); + int16_t startReceiveDutyCycleAuto(uint16_t senderPreambleLength = 0, uint16_t minSymbols = 8); /*! \brief Reads data received after calling startReceive method. From 51ce45220b77e74665e2251898d57ec77e59d21b Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 16:08:00 +0000 Subject: [PATCH 09/22] pass len as param to implicitHeader --- src/modules/SX126x/SX126x.cpp | 8 ++++---- src/modules/SX126x/SX126x.h | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 32c928c3..4b285fae 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1170,8 +1170,8 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } -int16_t implicitHeader() { - return setHeaderType(SX126X_LORA_HEADER_IMPLICIT); +int16_t implicitHeader(size_t len) { + return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); } int16_t explicitHeader() { @@ -1354,9 +1354,9 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { return(state); } -int16_t SX126x::setHeaderType(uint8_t headerType) { +int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { // set requested packet mode - int16_t state = setPacketParams(_preambleLength, _crcType, 0xFF, headerType); + int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); if(state != ERR_NONE) { return(state); diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 9d771e42..a02a2104 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -795,11 +795,13 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t implicitHeader(); + int16_t implicitHeader(size_t len); /*! \brief Set explicit header mode for future reception/transmission. + \param len Payload length in bytes. **WILL BE GLOBALLY OVERRIDDEN BY transmit()** + \returns \ref status_codes */ int16_t explicitHeader(); @@ -836,7 +838,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); - int16_t setHeaderType(uint8_t headerType) + int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF) // fixes to errata int16_t fixSensitivity(); From b7d97341b47b32ac1a150032f8db29087e6883be Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Thu, 9 Jan 2020 16:10:43 +0000 Subject: [PATCH 10/22] make header type a required param to setPacketParams --- src/modules/SX126x/SX126x.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index a02a2104..56563382 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -826,7 +826,7 @@ class SX126x: public PhysicalLayer { int16_t setTxParams(uint8_t power, uint8_t rampTime = SX126X_PA_RAMP_200U); 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 setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength = 0xFF, uint8_t headerType, 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 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(); From 3bea627df499272f68b52d186e48693ff2891ec7 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 09:38:49 +0000 Subject: [PATCH 11/22] switch to recoding implicit length for use JIT --- src/modules/SX126x/SX126x.cpp | 24 +++++++----------------- src/modules/SX126x/SX126x.h | 7 ++++--- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 4b285fae..3088c9e8 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -22,6 +22,7 @@ int16_t SX126x::begin(float bw, uint8_t sf, uint8_t cr, uint8_t syncWord, float _preambleLength = preambleLength; _tcxoDelay = 0; _headerType = SX126X_LORA_HEADER_EXPLICIT; + _implicitLen = 0xFF; // reset the module and verify startup int16_t state = reset(); @@ -1170,12 +1171,14 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } -int16_t implicitHeader(size_t len) { - return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); +void implicitHeader(size_t len) { + _headerType = SX126X_LORA_HEADER_IMPLICIT; + _implicitLen = len; } -int16_t explicitHeader() { - return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); +void explicitHeader() { + _headerType = SX126X_LORA_HEADER_EXPLICIT; + _implicitLen = 0xFF; } int16_t SX126x::setTCXO(float voltage, uint32_t delay) { @@ -1354,19 +1357,6 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { return(state); } -int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { - // set requested packet mode - int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); - - if(state != ERR_NONE) { - return(state); - } - - // update cached value - _headerType = headerType; - 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/SX126x.h b/src/modules/SX126x/SX126x.h index 56563382..8aee4741 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -795,7 +795,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t implicitHeader(size_t len); + void implicitHeader(size_t len); /*! \brief Set explicit header mode for future reception/transmission. @@ -804,7 +804,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - int16_t explicitHeader(); + void explicitHeader(); #ifndef RADIOLIB_GODMODE protected: #endif @@ -838,7 +838,6 @@ class SX126x: public PhysicalLayer { int16_t setFrequencyRaw(float freq); int16_t setOptimalHiPowerPaConfig(int8_t* inOutPower); int16_t setPacketMode(uint8_t mode, uint8_t len); - int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF) // fixes to errata int16_t fixSensitivity(); @@ -864,6 +863,8 @@ class SX126x: public PhysicalLayer { uint32_t _tcxoDelay; + size_t _implicitLen; + int16_t config(uint8_t modem); // common low-level SPI interface From 870a135b152537ffc8cd15c7250b1b293ad8fe98 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 11:54:28 +0000 Subject: [PATCH 12/22] make sure _implicitLen is passed where appropriate --- src/modules/SX126x/SX126x.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 3088c9e8..c21dd404 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -743,7 +743,7 @@ int16_t SX126x::setPreambleLength(uint16_t preambleLength) { uint8_t modem = getPacketType(); if(modem == SX126X_PACKET_TYPE_LORA) { _preambleLength = preambleLength; - return(setPacketParams(_preambleLength, _crcType, 0xFF, _headerType)); + return(setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType)); } else if(modem == SX126X_PACKET_TYPE_GFSK) { _preambleLengthFSK = preambleLength; return(setPacketParamsFSK(_preambleLengthFSK, _crcTypeFSK, _syncWordLength, _addrComp, _whitening, _packetType)); @@ -1048,7 +1048,7 @@ int16_t SX126x::setCRC(uint8_t len, uint16_t initial, uint16_t polynomial, bool _crcType = SX126X_LORA_CRC_OFF; } - return(setPacketParams(_preambleLength, _crcType, 0xFF, _headerType)); + return(setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType)); } return(ERR_UNKNOWN); From 07429986c2f48ec19e118327a2a1eb53c3d4fbfe Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 14:11:28 +0000 Subject: [PATCH 13/22] set implicit params with extra SPI call where required --- src/modules/SX126x/SX126x.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index c21dd404..5d69eeb0 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -290,6 +290,14 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { float symbolLength = (float)(uint32_t(1) << _sf) / (float)_bwKhz; timeout = (uint32_t)(symbolLength * 100.0 * 1000.0); + // set implicit mode and expected len if applicable + if (_headerType == SX126X_LORA_HEADER_IMPLICIT) { + state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); + if(state != ERR_NONE) { + return(state); + } + } + } else if(modem == SX126X_PACKET_TYPE_GFSK) { // calculate timeout (500 % of expected time-one-air) size_t maxLen = len; @@ -600,6 +608,14 @@ int16_t SX126x::startReceiveCommon() { // clear interrupt flags state = clearIrqStatus(); + // set implicit mode and expected len if applicable + if (_headerType == SX126X_LORA_HEADER_IMPLICIT && getPacketType() == SX126X_PACKET_TYPE_LORA) { + state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); + if(state != ERR_NONE) { + return(state); + } + } + return(state); } From 8d2c98339f862e87acf8c8d6b8c040877f409511 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 14:20:42 +0000 Subject: [PATCH 14/22] fix default args, scoping --- src/modules/SX126x/SX126x.cpp | 4 ++-- src/modules/SX126x/SX126x.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 5d69eeb0..785c83d9 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1187,12 +1187,12 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } -void implicitHeader(size_t len) { +void SX126x::implicitHeader(size_t len) { _headerType = SX126X_LORA_HEADER_IMPLICIT; _implicitLen = len; } -void explicitHeader() { +void SX126x::explicitHeader() { _headerType = SX126X_LORA_HEADER_EXPLICIT; _implicitLen = 0xFF; } diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 8aee4741..6d6bd9d4 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -826,7 +826,7 @@ class SX126x: public PhysicalLayer { int16_t setTxParams(uint8_t power, uint8_t rampTime = SX126X_PA_RAMP_200U); 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, uint8_t invertIQ = SX126X_LORA_IQ_STANDARD); + int16_t setPacketParams(uint16_t preambleLength, uint8_t crcType, uint8_t payloadLength, uint8_t headerType, 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 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(); From a4e087daf585a8bf45e48af83c6a1f651b5ce0c5 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 14:31:21 +0000 Subject: [PATCH 15/22] edit getTimeOnAir to support implicit mode --- src/modules/SX126x/SX126x.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 785c83d9..57427ca1 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1168,7 +1168,7 @@ uint32_t SX126x::getTimeOnAir(size_t len) { sfDivisor = 4*(_sf - 2); } const int8_t bitsPerCrc = 16; - const int8_t N_symbol_header = 20; + const int8_t N_symbol_header = _headerType == SX126X_LORA_HEADER_EXPLICIT ? 20 : 0; // numerator of equation in section 6.1.4 of SX1268 datasheet v1.1 (might not actually be bitcount, but it has len * 8) int16_t bitCount = (int16_t) 8 * len + _crcType * bitsPerCrc - 4 * _sf + sfCoeff2 + N_symbol_header; From c331abb7a9d4ba68ca52bf6824e2b2ef78b8b861 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Fri, 10 Jan 2020 15:34:33 +0000 Subject: [PATCH 16/22] remove outdated comment --- src/modules/SX126x/SX126x.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 6d6bd9d4..6ad7b760 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -800,7 +800,7 @@ class SX126x: public PhysicalLayer { /*! \brief Set explicit header mode for future reception/transmission. - \param len Payload length in bytes. **WILL BE GLOBALLY OVERRIDDEN BY transmit()** + \param len Payload length in bytes. \returns \ref status_codes */ From 38eb3a4a3c5a6734ebb9628bb55c2d8ee2c8d974 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 09:51:06 +0000 Subject: [PATCH 17/22] add implicitHeader/explicitHeader to keywords --- keywords.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keywords.txt b/keywords.txt index 9aabb1c0..0970a21a 100644 --- a/keywords.txt +++ b/keywords.txt @@ -117,6 +117,8 @@ clearGdo2Action KEYWORD2 setTCXO KEYWORD2 setDio2AsRfSwitch KEYWORD2 getTimeOnAir KEYWORD2 +implicitHeader +explicitHeader setSyncBits KEYWORD2 setWhitening KEYWORD2 startReceiveDutyCycle KEYWORD2 From 3ac63e8c951959a9aeed1884ae1e34dbbc15e80a Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 09:55:35 +0000 Subject: [PATCH 18/22] remove redundant call to setPacketParams --- src/modules/SX126x/SX126x.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 57427ca1..ec267344 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -289,15 +289,6 @@ int16_t SX126x::receive(uint8_t* data, size_t len) { // calculate timeout (100 LoRa symbols, the default for SX127x series) float symbolLength = (float)(uint32_t(1) << _sf) / (float)_bwKhz; timeout = (uint32_t)(symbolLength * 100.0 * 1000.0); - - // set implicit mode and expected len if applicable - if (_headerType == SX126X_LORA_HEADER_IMPLICIT) { - state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); - if(state != ERR_NONE) { - return(state); - } - } - } else if(modem == SX126X_PACKET_TYPE_GFSK) { // calculate timeout (500 % of expected time-one-air) size_t maxLen = len; From e441e101ff83ba1c9b5dbca28f7172d16492c89b Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 11:46:50 +0000 Subject: [PATCH 19/22] check modem type when header type set --- src/modules/SX126x/SX126x.cpp | 24 ++++++++++++++++++++---- src/modules/SX126x/SX126x.h | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index ec267344..4a274efd 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1179,13 +1179,11 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } void SX126x::implicitHeader(size_t len) { - _headerType = SX126X_LORA_HEADER_IMPLICIT; - _implicitLen = len; + return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); } void SX126x::explicitHeader() { - _headerType = SX126X_LORA_HEADER_EXPLICIT; - _implicitLen = 0xFF; + return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); } int16_t SX126x::setTCXO(float voltage, uint32_t delay) { @@ -1364,6 +1362,24 @@ int16_t SX126x::setPacketMode(uint8_t mode, uint8_t len) { return(state); } +int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { + // check active modem + if(getPacketType() != SX126X_PACKET_TYPE_LORA) { + return(ERR_WRONG_MODEM); + } + // set requested packet mode + int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); + + if(state != ERR_NONE) { + return(state); + } + + // update cached value + _headerType = headerType; + _implicitLen = len; + 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/SX126x.h b/src/modules/SX126x/SX126x.h index 6ad7b760..a17ac662 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -838,6 +838,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); + int16_t setHeaderType(uint8_t headerType, size_t len = 0xFF); // fixes to errata int16_t fixSensitivity(); From 17e3f47c2fe11b834d29f81d2b01ea8d10361b75 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 12:14:56 +0000 Subject: [PATCH 20/22] correct return types --- src/modules/SX126x/SX126x.cpp | 6 ++++-- src/modules/SX126x/SX126x.h | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 4a274efd..6776dfb1 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1178,11 +1178,11 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } } -void SX126x::implicitHeader(size_t len) { +int16_t SX126x::implicitHeader(size_t len) { return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); } -void SX126x::explicitHeader() { +int16_t SX126x::explicitHeader() { return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); } @@ -1367,6 +1367,7 @@ int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { if(getPacketType() != SX126X_PACKET_TYPE_LORA) { return(ERR_WRONG_MODEM); } + // set requested packet mode int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); @@ -1377,6 +1378,7 @@ int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { // update cached value _headerType = headerType; _implicitLen = len; + return(state); } diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index a17ac662..8267f4cc 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -795,7 +795,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - void implicitHeader(size_t len); + int16_t implicitHeader(size_t len); /*! \brief Set explicit header mode for future reception/transmission. @@ -804,7 +804,7 @@ class SX126x: public PhysicalLayer { \returns \ref status_codes */ - void explicitHeader(); + int16_t explicitHeader(); #ifndef RADIOLIB_GODMODE protected: #endif From 3adff36a1bf7bb8e73fb1142c9332dc4910b9886 Mon Sep 17 00:00:00 2001 From: Callan Bryant Date: Mon, 13 Jan 2020 12:17:47 +0000 Subject: [PATCH 21/22] add missing type specifiers --- keywords.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keywords.txt b/keywords.txt index 0970a21a..5feb6969 100644 --- a/keywords.txt +++ b/keywords.txt @@ -117,8 +117,8 @@ clearGdo2Action KEYWORD2 setTCXO KEYWORD2 setDio2AsRfSwitch KEYWORD2 getTimeOnAir KEYWORD2 -implicitHeader -explicitHeader +implicitHeader KEYWORD2 +explicitHeader KEYWORD2 setSyncBits KEYWORD2 setWhitening KEYWORD2 startReceiveDutyCycle KEYWORD2 From bc31827505096365b544064b17502fa8d4fa5652 Mon Sep 17 00:00:00 2001 From: jgromes Date: Mon, 13 Jan 2020 15:22:57 +0100 Subject: [PATCH 22/22] Minor formatting fixes --- src/modules/SX126x/SX126x.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 6776dfb1..bc78ee7e 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -600,11 +600,11 @@ int16_t SX126x::startReceiveCommon() { state = clearIrqStatus(); // set implicit mode and expected len if applicable - if (_headerType == SX126X_LORA_HEADER_IMPLICIT && getPacketType() == SX126X_PACKET_TYPE_LORA) { - state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); - if(state != ERR_NONE) { - return(state); - } + if(_headerType == SX126X_LORA_HEADER_IMPLICIT && getPacketType() == SX126X_PACKET_TYPE_LORA) { + state = setPacketParams(_preambleLength, _crcType, _implicitLen, _headerType); + if(state != ERR_NONE) { + return(state); + } } return(state); @@ -1179,11 +1179,11 @@ uint32_t SX126x::getTimeOnAir(size_t len) { } int16_t SX126x::implicitHeader(size_t len) { - return setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len); + return(setHeaderType(SX126X_LORA_HEADER_IMPLICIT, len)); } int16_t SX126x::explicitHeader() { - return setHeaderType(SX126X_LORA_HEADER_EXPLICIT); + return(setHeaderType(SX126X_LORA_HEADER_EXPLICIT)); } int16_t SX126x::setTCXO(float voltage, uint32_t delay) { @@ -1370,7 +1370,6 @@ int16_t SX126x::setHeaderType(uint8_t headerType, size_t len) { // set requested packet mode int16_t state = setPacketParams(_preambleLength, _crcType, len, headerType); - if(state != ERR_NONE) { return(state); }