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