From 19ec9da281bb68437544899dbd6b0bd42684fc43 Mon Sep 17 00:00:00 2001 From: StevenCellist Date: Fri, 16 Aug 2024 00:03:55 +0200 Subject: [PATCH 1/8] [PHY] Generalize IRQ checks --- src/protocols/PhysicalLayer/PhysicalLayer.cpp | 3 +- src/protocols/PhysicalLayer/PhysicalLayer.h | 35 +++++++++++++------ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/protocols/PhysicalLayer/PhysicalLayer.cpp b/src/protocols/PhysicalLayer/PhysicalLayer.cpp index dc97908b..02fc12c5 100644 --- a/src/protocols/PhysicalLayer/PhysicalLayer.cpp +++ b/src/protocols/PhysicalLayer/PhysicalLayer.cpp @@ -316,7 +316,8 @@ int16_t PhysicalLayer::irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) return(RADIOLIB_ERR_UNSUPPORTED); } -bool PhysicalLayer::isRxTimeout() { +bool PhysicalLayer::isIrqSet(uint8_t irq) { + (void)irq; return(false); } diff --git a/src/protocols/PhysicalLayer/PhysicalLayer.h b/src/protocols/PhysicalLayer/PhysicalLayer.h index ad53f622..b6165647 100644 --- a/src/protocols/PhysicalLayer/PhysicalLayer.h +++ b/src/protocols/PhysicalLayer/PhysicalLayer.h @@ -4,6 +4,20 @@ #include "../../TypeDef.h" #include "../../Module.h" +// common IRQ flags +#define RADIOLIB_IRQ_TX_DONE 0x00 +#define RADIOLIB_IRQ_RX_DONE 0x01 +#define RADIOLIB_IRQ_PREAMBLE_DETECTED 0x02 +#define RADIOLIB_IRQ_SYNC_WORD_VALID 0x03 +#define RADIOLIB_IRQ_SYNC_WORD_ERROR 0x04 +#define RADIOLIB_IRQ_HEADER_VALID 0x05 +#define RADIOLIB_IRQ_HEADER_ERR 0x06 +#define RADIOLIB_IRQ_CRC_ERR 0x07 +#define RADIOLIB_IRQ_CAD_DONE 0x08 +#define RADIOLIB_IRQ_CAD_DETECTED 0x09 +#define RADIOLIB_IRQ_TIMEOUT 0x0A +#define RADIOLIB_IRQ_LR_FHSS_HOP 0x0B + /*! \struct LoRaRate_t \brief Data rate structure interpretation in case LoRa is used @@ -346,28 +360,29 @@ class PhysicalLayer { virtual RadioLibTime_t getTimeOnAir(size_t len); /*! - \brief Calculate the timeout value for this specific module / series (in number of symbols or units of time) - \param timeoutUs Timeout in microseconds to listen for - \returns Timeout value in a unit that is specific for the used module + \brief Calculate the timeout value for this specific module / series + (in number of symbols or units of time). + \param timeoutUs Timeout in microseconds to listen for. + \returns Timeout value in a unit that is specific for the used module. */ virtual RadioLibTime_t calculateRxTimeout(RadioLibTime_t timeoutUs); /*! - \brief Create the flags that make up RxDone and RxTimeout used for receiving downlinks - \param irqFlags The flags for which IRQs must be triggered - \param irqMask Mask indicating which IRQ triggers a DIO + \brief Create the flags that make up RxDone and RxTimeout used for receiving downlinks. + \param irqFlags The flags for which IRQs must be triggered. + \param irqMask Mask indicating which IRQ triggers a DIO. \returns \ref status_codes */ virtual int16_t irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask); /*! - \brief Check whether the IRQ bit for RxTimeout is set - \returns Whether RxTimeout IRQ is set + \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). + \returns Whether requested IRQ is set. */ - virtual bool isRxTimeout(); + virtual bool isIrqSet(uint8_t irq); /*! - \brief Interrupt-driven channel activity detection method. interrupt will be activated + \brief Interrupt-driven channel activity detection method. Interrupt will be activated when packet is detected. Must be implemented in module class. \returns \ref status_codes */ From 0eb987a83cbf6d12f0f7307a60bff0afad9a2fe2 Mon Sep 17 00:00:00 2001 From: StevenCellist Date: Fri, 16 Aug 2024 00:04:34 +0200 Subject: [PATCH 2/8] [LR11x0] Generalize IRQ checks --- src/modules/LR11x0/LR11x0.cpp | 35 ++++++++++++++++++++++++++++++----- src/modules/LR11x0/LR11x0.h | 6 +++--- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/modules/LR11x0/LR11x0.cpp b/src/modules/LR11x0/LR11x0.cpp index d1e1c0aa..52c270cc 100644 --- a/src/modules/LR11x0/LR11x0.cpp +++ b/src/modules/LR11x0/LR11x0.cpp @@ -1328,12 +1328,37 @@ int16_t LR11x0::irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) { return(RADIOLIB_ERR_NONE); } -bool LR11x0::isRxTimeout() { - uint32_t irq = getIrqStatus(); - bool rxTimedOut = irq & RADIOLIB_LR11X0_IRQ_TIMEOUT; - return(rxTimedOut); +bool LR11x0::isIrqSet(uint8_t irq) { + uint16_t flags = getIrqStatus(); + switch(irq) { + case RADIOLIB_IRQ_TX_DONE: + return(flags & RADIOLIB_LR11X0_IRQ_TX_DONE); + case RADIOLIB_IRQ_RX_DONE: + return(flags & RADIOLIB_LR11X0_IRQ_RX_DONE); + case RADIOLIB_IRQ_PREAMBLE_DETECTED: + return(flags & RADIOLIB_LR11X0_IRQ_PREAMBLE_DETECTED); + case RADIOLIB_IRQ_SYNC_WORD_VALID: + return(flags & RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID); + case RADIOLIB_IRQ_HEADER_VALID: + return(flags & RADIOLIB_LR11X0_IRQ_SYNC_WORD_HEADER_VALID); + case RADIOLIB_IRQ_HEADER_ERR: + return(flags & RADIOLIB_LR11X0_IRQ_HEADER_ERR); + case RADIOLIB_IRQ_CRC_ERR: + return(flags & RADIOLIB_LR11X0_IRQ_CRC_ERR); + case RADIOLIB_IRQ_CAD_DONE: + return(flags & RADIOLIB_LR11X0_IRQ_CAD_DONE); + case RADIOLIB_IRQ_CAD_DETECTED: + return(flags & RADIOLIB_LR11X0_IRQ_CAD_DETECTED); + case RADIOLIB_IRQ_TIMEOUT: + return(flags & RADIOLIB_LR11X0_IRQ_TIMEOUT); + case RADIOLIB_IRQ_LR_FHSS_HOP: + return(flags & RADIOLIB_LR11X0_IRQ_LR_FHSS_HOP); + default: + return(false); + } + return(false); } - + uint8_t LR11x0::randomByte() { uint32_t num = 0; (void)getRandomNumber(&num); diff --git a/src/modules/LR11x0/LR11x0.h b/src/modules/LR11x0/LR11x0.h index 741e8623..1f9fedbc 100644 --- a/src/modules/LR11x0/LR11x0.h +++ b/src/modules/LR11x0/LR11x0.h @@ -1229,10 +1229,10 @@ class LR11x0: public PhysicalLayer { int16_t irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) override; /*! - \brief Check whether the IRQ bit for RxTimeout is set - \returns Whether RxTimeout IRQ is set + \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). + \returns Whether requested IRQ is set. */ - bool isRxTimeout() override; + bool isIrqSet(uint8_t irq) override; /*! \brief Get one truly random byte from RSSI noise. From 3a73ed8c1ff4372f1a4bfdd42f595cc044df12a6 Mon Sep 17 00:00:00 2001 From: StevenCellist Date: Fri, 16 Aug 2024 00:04:42 +0200 Subject: [PATCH 3/8] [SX126x] Generalize IRQ checks --- src/modules/SX126x/SX126x.cpp | 33 +++++++++++++++++++++++++++++---- src/modules/SX126x/SX126x.h | 6 +++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index b98fad59..12b6f5f0 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1466,10 +1466,35 @@ int16_t SX126x::irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) { return(RADIOLIB_ERR_NONE); } -bool SX126x::isRxTimeout() { - uint16_t irq = getIrqStatus(); - bool rxTimedOut = irq & RADIOLIB_SX126X_IRQ_TIMEOUT; - return(rxTimedOut); +bool SX126x::isIrqSet(uint8_t irq) { + uint16_t flags = getIrqStatus(); + switch(irq) { + case RADIOLIB_IRQ_TX_DONE: + return(flags & RADIOLIB_SX126X_IRQ_TX_DONE); + case RADIOLIB_IRQ_RX_DONE: + return(flags & RADIOLIB_SX126X_IRQ_RX_DONE); + case RADIOLIB_IRQ_PREAMBLE_DETECTED: + return(flags & RADIOLIB_SX126X_IRQ_PREAMBLE_DETECTED); + case RADIOLIB_IRQ_SYNC_WORD_VALID: + return(flags & RADIOLIB_SX126X_IRQ_SYNC_WORD_VALID); + case RADIOLIB_IRQ_HEADER_VALID: + return(flags & RADIOLIB_SX126X_IRQ_HEADER_VALID); + case RADIOLIB_IRQ_HEADER_ERR: + return(flags & RADIOLIB_SX126X_IRQ_HEADER_ERR); + case RADIOLIB_IRQ_CRC_ERR: + return(flags & RADIOLIB_SX126X_IRQ_CRC_ERR); + case RADIOLIB_IRQ_CAD_DONE: + return(flags & RADIOLIB_SX126X_IRQ_CAD_DONE); + case RADIOLIB_IRQ_CAD_DETECTED: + return(flags & RADIOLIB_SX126X_IRQ_CAD_DETECTED); + case RADIOLIB_IRQ_TIMEOUT: + return(flags & RADIOLIB_SX126X_IRQ_TIMEOUT); + case RADIOLIB_IRQ_LR_FHSS_HOP: + return(flags & RADIOLIB_SX126X_IRQ_LR_FHSS_HOP); + default: + return(false); + } + return(false); } int16_t SX126x::implicitHeader(size_t len) { diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 63169519..1a4fd2ca 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -997,10 +997,10 @@ class SX126x: public PhysicalLayer { int16_t irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) override; /*! - \brief Check whether the IRQ bit for RxTimeout is set - \returns Whether RxTimeout IRQ is set + \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). + \returns Whether requested IRQ is set. */ - bool isRxTimeout() override; + bool isIrqSet(uint8_t irq) override; /*! \brief Set implicit header mode for future reception/transmission. From 08f92cdd291d3aa2e394ca7843eadc22a927055c Mon Sep 17 00:00:00 2001 From: StevenCellist Date: Fri, 16 Aug 2024 00:04:52 +0200 Subject: [PATCH 4/8] [SX127x] Generalize IRQ checks --- src/modules/SX127x/SX127x.cpp | 25 +++++++++++++++++++++---- src/modules/SX127x/SX127x.h | 6 +++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index eaa8c46f..621d2ee8 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -1302,10 +1302,27 @@ int16_t SX127x::irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) { return(RADIOLIB_ERR_NONE); } -bool SX127x::isRxTimeout() { - uint16_t irq = getIRQFlags(); - bool rxTimedOut = irq & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_RX_TIMEOUT; - return(rxTimedOut); +bool SX127x::isIrqSet(uint8_t irq) { + uint16_t flags = getIRQFlags(); + switch(irq) { + case RADIOLIB_IRQ_TX_DONE: + return(flags & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_TX_DONE); + case RADIOLIB_IRQ_RX_DONE: + return(flags & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_RX_DONE); + case RADIOLIB_IRQ_HEADER_VALID: + return(flags & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_VALID_HEADER); + case RADIOLIB_IRQ_CRC_ERR: + return(flags & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_PAYLOAD_CRC_ERROR); + case RADIOLIB_IRQ_CAD_DONE: + return(flags & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_CAD_DONE); + case RADIOLIB_IRQ_CAD_DETECTED: + return(flags & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_CAD_DETECTED); + case RADIOLIB_IRQ_TIMEOUT: + return(flags & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_RX_TIMEOUT); + default: + return(false); + } + return(false); } int16_t SX127x::setCrcFiltering(bool enable) { diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 7e8d5e5a..34dba0b8 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -1073,10 +1073,10 @@ class SX127x: public PhysicalLayer { int16_t irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) override; /*! - \brief Check whether the IRQ bit for RxTimeout is set - \returns Whether RxTimeout IRQ is set + \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). + \returns Whether requested IRQ is set. */ - bool isRxTimeout() override; + bool isIrqSet(uint8_t irq) override; /*! \brief Enable CRC filtering and generation. From b401d111273ff0d0c677d49125f9b2b84d3d5812 Mon Sep 17 00:00:00 2001 From: StevenCellist Date: Fri, 16 Aug 2024 00:05:06 +0200 Subject: [PATCH 5/8] [SX128x] Implement generalized IRQ checks --- src/modules/SX128x/SX128x.cpp | 31 +++++++++++++++++++++++++++++++ src/modules/SX128x/SX128x.h | 6 ++++++ 2 files changed, 37 insertions(+) diff --git a/src/modules/SX128x/SX128x.cpp b/src/modules/SX128x/SX128x.cpp index 3d17e029..35a1d46b 100644 --- a/src/modules/SX128x/SX128x.cpp +++ b/src/modules/SX128x/SX128x.cpp @@ -638,6 +638,37 @@ int16_t SX128x::readData(uint8_t* data, size_t len) { return(state); } +bool SX128x::isIrqSet(uint8_t irq) { + uint16_t flags = getIrqStatus(); + switch(irq) { + case RADIOLIB_IRQ_TX_DONE: + return(flags & RADIOLIB_SX128X_IRQ_TX_DONE); + case RADIOLIB_IRQ_RX_DONE: + return(flags & RADIOLIB_SX128X_IRQ_RX_DONE); + case RADIOLIB_IRQ_PREAMBLE_DETECTED: + return(flags & RADIOLIB_SX128X_IRQ_PREAMBLE_DETECTED); + case RADIOLIB_IRQ_SYNC_WORD_VALID: + return(flags & RADIOLIB_SX128X_IRQ_SYNC_WORD_VALID); + case RADIOLIB_IRQ_SYNC_WORD_ERROR: + return(flags & RADIOLIB_SX128X_IRQ_SYNC_WORD_ERROR); + case RADIOLIB_IRQ_HEADER_VALID: + return(flags & RADIOLIB_SX128X_IRQ_HEADER_VALID); + case RADIOLIB_IRQ_HEADER_ERR: + return(flags & RADIOLIB_SX128X_IRQ_HEADER_ERROR); + case RADIOLIB_IRQ_CRC_ERR: + return(flags & RADIOLIB_SX128X_IRQ_CRC_ERROR); + case RADIOLIB_IRQ_CAD_DONE: + return(flags & RADIOLIB_SX128X_IRQ_CAD_DONE); + case RADIOLIB_IRQ_CAD_DETECTED: + return(flags & RADIOLIB_SX128X_IRQ_CAD_DETECTED); + case RADIOLIB_IRQ_TIMEOUT: + return(flags & RADIOLIB_SX128X_IRQ_RX_TX_TIMEOUT); + default: + return(false); + } + return(false); +} + int16_t SX128x::startChannelScan() { // check active modem if(getPacketType() != RADIOLIB_SX128X_PACKET_TYPE_LORA) { diff --git a/src/modules/SX128x/SX128x.h b/src/modules/SX128x/SX128x.h index 8c0d465a..805c0579 100644 --- a/src/modules/SX128x/SX128x.h +++ b/src/modules/SX128x/SX128x.h @@ -576,6 +576,12 @@ class SX128x: public PhysicalLayer { */ int16_t readData(uint8_t* data, size_t len) override; + /*! + \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). + \returns Whether requested IRQ is set. + */ + bool isIrqSet(uint8_t irq) override; + /*! \brief Interrupt-driven channel activity detection method. DIO1 will be activated when LoRa preamble is detected, or upon timeout. Defaults to CAD parameter values recommended by AN1200.48. From 32dc5babd4446abf86bb7ee43c381db19b2bbf9f Mon Sep 17 00:00:00 2001 From: StevenCellist Date: Fri, 16 Aug 2024 00:05:55 +0200 Subject: [PATCH 6/8] [LoRaWAN] Move to generalized IRQ check (PHY) --- src/protocols/LoRaWAN/LoRaWAN.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/protocols/LoRaWAN/LoRaWAN.cpp b/src/protocols/LoRaWAN/LoRaWAN.cpp index 90325ecf..92b0b2ee 100644 --- a/src/protocols/LoRaWAN/LoRaWAN.cpp +++ b/src/protocols/LoRaWAN/LoRaWAN.cpp @@ -1226,7 +1226,7 @@ int16_t LoRaWANNode::downlinkCommon() { RADIOLIB_DEBUG_PROTOCOL_PRINTLN("Closing Rx%d window", i+1); // check if the IRQ bit for Rx Timeout is set - if(!this->phyLayer->isRxTimeout()) { + if(!this->phyLayer->isIrqSet(RADIOLIB_IRQ_TIMEOUT)) { break; } else if(i == 0) { @@ -1248,7 +1248,7 @@ int16_t LoRaWANNode::downlinkCommon() { this->rxDelayEnd = mod->hal->millis(); // if we got here due to a timeout, stop ongoing activities - if(this->phyLayer->isRxTimeout()) { + if(this->phyLayer->isIrqSet(RADIOLIB_IRQ_TIMEOUT)) { this->phyLayer->standby(); // TODO check: this should be done automagically due to RxSingle? if(this->modulation == RADIOLIB_LORAWAN_MODULATION_LORA) { this->phyLayer->invertIQ(false); From 0bc0e3d9c86418a8a2306cee39601777cf035340 Mon Sep 17 00:00:00 2001 From: StevenCellist Date: Sat, 17 Aug 2024 22:03:48 +0200 Subject: [PATCH 7/8] [PHY, modules, LoRaWAN] Integrate feedback --- src/modules/LR11x0/LR11x0.cpp | 8 +++----- src/modules/LR11x0/LR11x0.h | 2 +- src/modules/SX126x/SX126x.cpp | 8 +++----- src/modules/SX126x/SX126x.h | 2 +- src/modules/SX127x/SX127x.cpp | 6 +++--- src/modules/SX127x/SX127x.h | 2 +- src/modules/SX128x/SX128x.cpp | 8 +++----- src/modules/SX128x/SX128x.h | 2 +- src/protocols/LoRaWAN/LoRaWAN.cpp | 12 ++++++++++-- src/protocols/PhysicalLayer/PhysicalLayer.cpp | 4 ++-- src/protocols/PhysicalLayer/PhysicalLayer.h | 16 +++++++--------- 11 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/modules/LR11x0/LR11x0.cpp b/src/modules/LR11x0/LR11x0.cpp index 52c270cc..bcef4d0b 100644 --- a/src/modules/LR11x0/LR11x0.cpp +++ b/src/modules/LR11x0/LR11x0.cpp @@ -1328,7 +1328,7 @@ int16_t LR11x0::irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) { return(RADIOLIB_ERR_NONE); } -bool LR11x0::isIrqSet(uint8_t irq) { +int16_t LR11x0::checkIrq(uint8_t irq) { uint16_t flags = getIrqStatus(); switch(irq) { case RADIOLIB_IRQ_TX_DONE: @@ -1351,12 +1351,10 @@ bool LR11x0::isIrqSet(uint8_t irq) { return(flags & RADIOLIB_LR11X0_IRQ_CAD_DETECTED); case RADIOLIB_IRQ_TIMEOUT: return(flags & RADIOLIB_LR11X0_IRQ_TIMEOUT); - case RADIOLIB_IRQ_LR_FHSS_HOP: - return(flags & RADIOLIB_LR11X0_IRQ_LR_FHSS_HOP); default: - return(false); + return(RADIOLIB_ERR_UNSUPPORTED); } - return(false); + return(RADIOLIB_ERR_UNSUPPORTED); } uint8_t LR11x0::randomByte() { diff --git a/src/modules/LR11x0/LR11x0.h b/src/modules/LR11x0/LR11x0.h index 1f9fedbc..dffac085 100644 --- a/src/modules/LR11x0/LR11x0.h +++ b/src/modules/LR11x0/LR11x0.h @@ -1232,7 +1232,7 @@ class LR11x0: public PhysicalLayer { \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). \returns Whether requested IRQ is set. */ - bool isIrqSet(uint8_t irq) override; + int16_t checkIrq(uint8_t irq) override; /*! \brief Get one truly random byte from RSSI noise. diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 12b6f5f0..1c2a9e48 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1466,7 +1466,7 @@ int16_t SX126x::irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) { return(RADIOLIB_ERR_NONE); } -bool SX126x::isIrqSet(uint8_t irq) { +int16_t SX126x::checkIrq(uint8_t irq) { uint16_t flags = getIrqStatus(); switch(irq) { case RADIOLIB_IRQ_TX_DONE: @@ -1489,12 +1489,10 @@ bool SX126x::isIrqSet(uint8_t irq) { return(flags & RADIOLIB_SX126X_IRQ_CAD_DETECTED); case RADIOLIB_IRQ_TIMEOUT: return(flags & RADIOLIB_SX126X_IRQ_TIMEOUT); - case RADIOLIB_IRQ_LR_FHSS_HOP: - return(flags & RADIOLIB_SX126X_IRQ_LR_FHSS_HOP); default: - return(false); + return(RADIOLIB_ERR_UNSUPPORTED); } - return(false); + return(RADIOLIB_ERR_UNSUPPORTED); } int16_t SX126x::implicitHeader(size_t len) { diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 1a4fd2ca..68598650 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -1000,7 +1000,7 @@ class SX126x: public PhysicalLayer { \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). \returns Whether requested IRQ is set. */ - bool isIrqSet(uint8_t irq) override; + int16_t checkIrq(uint8_t irq) override; /*! \brief Set implicit header mode for future reception/transmission. diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 621d2ee8..7cc33c9f 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -1302,7 +1302,7 @@ int16_t SX127x::irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) { return(RADIOLIB_ERR_NONE); } -bool SX127x::isIrqSet(uint8_t irq) { +int16_t SX127x::checkIrq(uint8_t irq) { uint16_t flags = getIRQFlags(); switch(irq) { case RADIOLIB_IRQ_TX_DONE: @@ -1320,9 +1320,9 @@ bool SX127x::isIrqSet(uint8_t irq) { case RADIOLIB_IRQ_TIMEOUT: return(flags & RADIOLIB_SX127X_CLEAR_IRQ_FLAG_RX_TIMEOUT); default: - return(false); + return(RADIOLIB_ERR_UNSUPPORTED); } - return(false); + return(RADIOLIB_ERR_UNSUPPORTED); } int16_t SX127x::setCrcFiltering(bool enable) { diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 34dba0b8..c00cd42f 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -1076,7 +1076,7 @@ class SX127x: public PhysicalLayer { \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). \returns Whether requested IRQ is set. */ - bool isIrqSet(uint8_t irq) override; + int16_t checkIrq(uint8_t irq) override; /*! \brief Enable CRC filtering and generation. diff --git a/src/modules/SX128x/SX128x.cpp b/src/modules/SX128x/SX128x.cpp index 35a1d46b..fb9ed328 100644 --- a/src/modules/SX128x/SX128x.cpp +++ b/src/modules/SX128x/SX128x.cpp @@ -638,7 +638,7 @@ int16_t SX128x::readData(uint8_t* data, size_t len) { return(state); } -bool SX128x::isIrqSet(uint8_t irq) { +int16_t SX128x::checkIrq(uint8_t irq) { uint16_t flags = getIrqStatus(); switch(irq) { case RADIOLIB_IRQ_TX_DONE: @@ -649,8 +649,6 @@ bool SX128x::isIrqSet(uint8_t irq) { return(flags & RADIOLIB_SX128X_IRQ_PREAMBLE_DETECTED); case RADIOLIB_IRQ_SYNC_WORD_VALID: return(flags & RADIOLIB_SX128X_IRQ_SYNC_WORD_VALID); - case RADIOLIB_IRQ_SYNC_WORD_ERROR: - return(flags & RADIOLIB_SX128X_IRQ_SYNC_WORD_ERROR); case RADIOLIB_IRQ_HEADER_VALID: return(flags & RADIOLIB_SX128X_IRQ_HEADER_VALID); case RADIOLIB_IRQ_HEADER_ERR: @@ -664,9 +662,9 @@ bool SX128x::isIrqSet(uint8_t irq) { case RADIOLIB_IRQ_TIMEOUT: return(flags & RADIOLIB_SX128X_IRQ_RX_TX_TIMEOUT); default: - return(false); + return(RADIOLIB_ERR_UNSUPPORTED); } - return(false); + return(RADIOLIB_ERR_UNSUPPORTED); } int16_t SX128x::startChannelScan() { diff --git a/src/modules/SX128x/SX128x.h b/src/modules/SX128x/SX128x.h index 805c0579..43c1f412 100644 --- a/src/modules/SX128x/SX128x.h +++ b/src/modules/SX128x/SX128x.h @@ -580,7 +580,7 @@ class SX128x: public PhysicalLayer { \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). \returns Whether requested IRQ is set. */ - bool isIrqSet(uint8_t irq) override; + int16_t checkIrq(uint8_t irq) override; /*! \brief Interrupt-driven channel activity detection method. DIO1 will be activated diff --git a/src/protocols/LoRaWAN/LoRaWAN.cpp b/src/protocols/LoRaWAN/LoRaWAN.cpp index 92b0b2ee..c5739cc8 100644 --- a/src/protocols/LoRaWAN/LoRaWAN.cpp +++ b/src/protocols/LoRaWAN/LoRaWAN.cpp @@ -1226,7 +1226,11 @@ int16_t LoRaWANNode::downlinkCommon() { RADIOLIB_DEBUG_PROTOCOL_PRINTLN("Closing Rx%d window", i+1); // check if the IRQ bit for Rx Timeout is set - if(!this->phyLayer->isIrqSet(RADIOLIB_IRQ_TIMEOUT)) { + state = this->phyLayer->checkIrq(RADIOLIB_IRQ_TIMEOUT); + if(state == RADIOLIB_ERR_UNSUPPORTED) { + return(state); + } + if(state == 0) { break; } else if(i == 0) { @@ -1248,7 +1252,11 @@ int16_t LoRaWANNode::downlinkCommon() { this->rxDelayEnd = mod->hal->millis(); // if we got here due to a timeout, stop ongoing activities - if(this->phyLayer->isIrqSet(RADIOLIB_IRQ_TIMEOUT)) { + state = this->phyLayer->checkIrq(RADIOLIB_IRQ_TIMEOUT); + if(state == RADIOLIB_ERR_UNSUPPORTED) { + return(state); + } + if(state == 1) { this->phyLayer->standby(); // TODO check: this should be done automagically due to RxSingle? if(this->modulation == RADIOLIB_LORAWAN_MODULATION_LORA) { this->phyLayer->invertIQ(false); diff --git a/src/protocols/PhysicalLayer/PhysicalLayer.cpp b/src/protocols/PhysicalLayer/PhysicalLayer.cpp index 02fc12c5..6953447c 100644 --- a/src/protocols/PhysicalLayer/PhysicalLayer.cpp +++ b/src/protocols/PhysicalLayer/PhysicalLayer.cpp @@ -316,9 +316,9 @@ int16_t PhysicalLayer::irqRxDoneRxTimeout(uint32_t &irqFlags, uint32_t &irqMask) return(RADIOLIB_ERR_UNSUPPORTED); } -bool PhysicalLayer::isIrqSet(uint8_t irq) { +int16_t PhysicalLayer::checkIrq(uint8_t irq) { (void)irq; - return(false); + return(RADIOLIB_ERR_UNSUPPORTED); } int16_t PhysicalLayer::startChannelScan() { diff --git a/src/protocols/PhysicalLayer/PhysicalLayer.h b/src/protocols/PhysicalLayer/PhysicalLayer.h index b6165647..408408ae 100644 --- a/src/protocols/PhysicalLayer/PhysicalLayer.h +++ b/src/protocols/PhysicalLayer/PhysicalLayer.h @@ -9,14 +9,12 @@ #define RADIOLIB_IRQ_RX_DONE 0x01 #define RADIOLIB_IRQ_PREAMBLE_DETECTED 0x02 #define RADIOLIB_IRQ_SYNC_WORD_VALID 0x03 -#define RADIOLIB_IRQ_SYNC_WORD_ERROR 0x04 -#define RADIOLIB_IRQ_HEADER_VALID 0x05 -#define RADIOLIB_IRQ_HEADER_ERR 0x06 -#define RADIOLIB_IRQ_CRC_ERR 0x07 -#define RADIOLIB_IRQ_CAD_DONE 0x08 -#define RADIOLIB_IRQ_CAD_DETECTED 0x09 -#define RADIOLIB_IRQ_TIMEOUT 0x0A -#define RADIOLIB_IRQ_LR_FHSS_HOP 0x0B +#define RADIOLIB_IRQ_HEADER_VALID 0x04 +#define RADIOLIB_IRQ_HEADER_ERR 0x05 +#define RADIOLIB_IRQ_CRC_ERR 0x06 +#define RADIOLIB_IRQ_CAD_DONE 0x07 +#define RADIOLIB_IRQ_CAD_DETECTED 0x08 +#define RADIOLIB_IRQ_TIMEOUT 0x09 /*! \struct LoRaRate_t @@ -379,7 +377,7 @@ class PhysicalLayer { \brief Check whether a specific IRQ bit is set (e.g. RxTimeout, CadDone). \returns Whether requested IRQ is set. */ - virtual bool isIrqSet(uint8_t irq); + virtual int16_t checkIrq(uint8_t irq); /*! \brief Interrupt-driven channel activity detection method. Interrupt will be activated From 647fa23ce9e95a8fdd421db2f77fff2dd6e53d6e Mon Sep 17 00:00:00 2001 From: StevenCellist Date: Sat, 17 Aug 2024 22:04:28 +0200 Subject: [PATCH 8/8] [LoRaWAN] Remove redundant PHY check --- src/protocols/LoRaWAN/LoRaWAN.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/protocols/LoRaWAN/LoRaWAN.cpp b/src/protocols/LoRaWAN/LoRaWAN.cpp index c5739cc8..c27feaa4 100644 --- a/src/protocols/LoRaWAN/LoRaWAN.cpp +++ b/src/protocols/LoRaWAN/LoRaWAN.cpp @@ -1196,6 +1196,8 @@ int16_t LoRaWANNode::downlinkCommon() { this->phyLayer->setPacketReceivedAction(LoRaWANNodeOnDownlinkAction); + int16_t timedOut = 0; + // perform listening in the two Rx windows for(uint8_t i = 0; i < 2; i++) { downlinkAction = false; @@ -1226,11 +1228,11 @@ int16_t LoRaWANNode::downlinkCommon() { RADIOLIB_DEBUG_PROTOCOL_PRINTLN("Closing Rx%d window", i+1); // check if the IRQ bit for Rx Timeout is set - state = this->phyLayer->checkIrq(RADIOLIB_IRQ_TIMEOUT); - if(state == RADIOLIB_ERR_UNSUPPORTED) { - return(state); + timedOut = this->phyLayer->checkIrq(RADIOLIB_IRQ_TIMEOUT); + if(timedOut == RADIOLIB_ERR_UNSUPPORTED) { + return(timedOut); } - if(state == 0) { + if(!timedOut) { break; } else if(i == 0) { @@ -1252,11 +1254,7 @@ int16_t LoRaWANNode::downlinkCommon() { this->rxDelayEnd = mod->hal->millis(); // if we got here due to a timeout, stop ongoing activities - state = this->phyLayer->checkIrq(RADIOLIB_IRQ_TIMEOUT); - if(state == RADIOLIB_ERR_UNSUPPORTED) { - return(state); - } - if(state == 1) { + if(timedOut) { this->phyLayer->standby(); // TODO check: this should be done automagically due to RxSingle? if(this->modulation == RADIOLIB_LORAWAN_MODULATION_LORA) { this->phyLayer->invertIQ(false);