From 0620d8eddaa7876278d7ad4131b8b09989746327 Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Sat, 10 Aug 2024 12:54:39 +0200 Subject: [PATCH 1/4] [SX126x] Start reading from Rx buffer offset Remove setting RxBaseAddr to 0 --- src/modules/SX126x/SX126x.cpp | 23 ++++++++++++++--------- src/modules/SX126x/SX126x.h | 8 ++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index ceaccf29..6bf3fc1c 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -709,20 +709,17 @@ int16_t SX126x::readData(uint8_t* data, size_t len) { if((irq & RADIOLIB_SX126X_IRQ_CRC_ERR) || (irq & RADIOLIB_SX126X_IRQ_HEADER_ERR)) { crcState = RADIOLIB_ERR_CRC_MISMATCH; } - - // get packet length - size_t length = getPacketLength(); + + // get packet length and Rx buffer offset + uint8_t offset = 0; + size_t length = getPacketLength(true, &offset); if((len != 0) && (len < length)) { // user requested less data than we got, only return what was requested length = len; } - // read packet data - state = readBuffer(data, length); - RADIOLIB_ASSERT(state); - - // reset the base addresses - state = setBufferBaseAddress(); + // read packet data starting at offset + state = readBuffer(data, length, offset); RADIOLIB_ASSERT(state); // clear interrupt flags @@ -1395,6 +1392,11 @@ float SX126x::getFrequencyError() { size_t SX126x::getPacketLength(bool update) { (void)update; + return(this->getPacketLength(update, NULL)); +} + +size_t SX126x::getPacketLength(bool update, uint8_t* offset) { + (void)update; // in implicit mode, return the cached value if((getPacketType() == RADIOLIB_SX126X_PACKET_TYPE_LORA) && (this->headerType == RADIOLIB_SX126X_LORA_HEADER_IMPLICIT)) { @@ -1403,6 +1405,9 @@ size_t SX126x::getPacketLength(bool update) { uint8_t rxBufStatus[2] = {0, 0}; this->mod->SPIreadStream(RADIOLIB_SX126X_CMD_GET_RX_BUFFER_STATUS, rxBufStatus, 2); + + if(offset) { *offset = rxBufStatus[1]; } + return((size_t)rxBufStatus[0]); } diff --git a/src/modules/SX126x/SX126x.h b/src/modules/SX126x/SX126x.h index 0fc9b6ac..63169519 100644 --- a/src/modules/SX126x/SX126x.h +++ b/src/modules/SX126x/SX126x.h @@ -952,6 +952,14 @@ class SX126x: public PhysicalLayer { */ size_t getPacketLength(bool update = true) override; + /*! + \brief Query modem for the packet length of received payload and Rx buffer offset. + \param update Update received packet length. Will return cached value when set to false. + \param offset Pointer to variable to store the Rx buffer offset. + \returns Length of last received packet in bytes. + */ + size_t getPacketLength(bool update, uint8_t* offset); + /*! \brief Set modem in fixed packet length mode. Available in FSK mode only. \param len Packet length. From 5f6f6f9a3c894198e3c475cef1ff100748491616 Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Sat, 10 Aug 2024 12:54:58 +0200 Subject: [PATCH 2/4] [SX128x] Start reading from Rx buffer offset --- src/modules/SX128x/SX128x.cpp | 21 +++++++++++++++------ src/modules/SX128x/SX128x.h | 10 +++++++++- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/modules/SX128x/SX128x.cpp b/src/modules/SX128x/SX128x.cpp index 8f41a797..aa8ec58c 100644 --- a/src/modules/SX128x/SX128x.cpp +++ b/src/modules/SX128x/SX128x.cpp @@ -617,15 +617,16 @@ int16_t SX128x::readData(uint8_t* data, size_t len) { crcState = RADIOLIB_ERR_CRC_MISMATCH; } - // get packet length - size_t length = getPacketLength(); + // get packet length and Rx buffer offset + uint8_t offset = 0; + size_t length = getPacketLength(true, &offset); if((len != 0) && (len < length)) { // user requested less data than we got, only return what was requested length = len; } - // read packet data - state = readBuffer(data, length); + // read packet data starting at offset + state = readBuffer(data, length, offset); RADIOLIB_ASSERT(state); // clear interrupt flags @@ -1254,6 +1255,11 @@ float SX128x::getFrequencyError() { size_t SX128x::getPacketLength(bool update) { (void)update; + return(this->getPacketLength(update, NULL)); +} + +size_t SX128x::getPacketLength(bool update, uint8_t* offset) { + (void)update; // in implicit mode, return the cached value if((getPacketType() == RADIOLIB_SX128X_PACKET_TYPE_LORA) && (this->headerType == RADIOLIB_SX128X_LORA_HEADER_IMPLICIT)) { @@ -1262,6 +1268,9 @@ size_t SX128x::getPacketLength(bool update) { uint8_t rxBufStatus[2] = {0, 0}; this->mod->SPIreadStream(RADIOLIB_SX128X_CMD_GET_RX_BUFFER_STATUS, rxBufStatus, 2); + + if(offset) { *offset = rxBufStatus[1]; } + return((size_t)rxBufStatus[0]); } @@ -1412,8 +1421,8 @@ int16_t SX128x::writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset) { return(this->mod->SPIwriteStream(cmd, 2, data, numBytes)); } -int16_t SX128x::readBuffer(uint8_t* data, uint8_t numBytes) { - uint8_t cmd[] = { RADIOLIB_SX128X_CMD_READ_BUFFER, RADIOLIB_SX128X_CMD_NOP }; +int16_t SX128x::readBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset) { + uint8_t cmd[] = { RADIOLIB_SX128X_CMD_READ_BUFFER, offset }; return(this->mod->SPIreadStream(cmd, 2, data, numBytes)); } diff --git a/src/modules/SX128x/SX128x.h b/src/modules/SX128x/SX128x.h index 6ce9164f..8c0d465a 100644 --- a/src/modules/SX128x/SX128x.h +++ b/src/modules/SX128x/SX128x.h @@ -745,6 +745,14 @@ class SX128x: public PhysicalLayer { */ size_t getPacketLength(bool update = true) override; + /*! + \brief Query modem for the packet length of received payload and Rx buffer offset. + \param update Update received packet length. Will return cached value when set to false. + \param offset Pointer to variable to store the Rx buffer offset. + \returns Length of last received packet in bytes. + */ + size_t getPacketLength(bool update, uint8_t* offset); + /*! \brief Get expected time-on-air for a given size of payload. \param len Payload length in bytes. @@ -820,7 +828,7 @@ class SX128x: public PhysicalLayer { int16_t writeRegister(uint16_t addr, uint8_t* data, uint8_t numBytes); int16_t readRegister(uint16_t addr, uint8_t* data, uint8_t numBytes); int16_t writeBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset = 0x00); - int16_t readBuffer(uint8_t* data, uint8_t numBytes); + int16_t readBuffer(uint8_t* data, uint8_t numBytes, uint8_t offset = 0x00); int16_t setTx(uint16_t periodBaseCount = RADIOLIB_SX128X_TX_TIMEOUT_NONE, uint8_t periodBase = RADIOLIB_SX128X_PERIOD_BASE_15_625_US); int16_t setRx(uint16_t periodBaseCount, uint8_t periodBase = RADIOLIB_SX128X_PERIOD_BASE_15_625_US); int16_t setCad(); From 8b5d7051749ee5cad2130139e1a187ae153e5f7d Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Sat, 10 Aug 2024 18:40:09 +0200 Subject: [PATCH 3/4] [SX126x] Remove unnecessary `(void)update;` --- src/modules/SX126x/SX126x.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/SX126x/SX126x.cpp b/src/modules/SX126x/SX126x.cpp index 6bf3fc1c..b98fad59 100644 --- a/src/modules/SX126x/SX126x.cpp +++ b/src/modules/SX126x/SX126x.cpp @@ -1391,7 +1391,6 @@ float SX126x::getFrequencyError() { } size_t SX126x::getPacketLength(bool update) { - (void)update; return(this->getPacketLength(update, NULL)); } From ddaf1ffd5251c73d6c4019c5ef440ee7f1d7ab85 Mon Sep 17 00:00:00 2001 From: GUVWAF Date: Sat, 10 Aug 2024 18:40:19 +0200 Subject: [PATCH 4/4] [SX128x] Remove unnecessary `(void)update;` --- src/modules/SX128x/SX128x.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/SX128x/SX128x.cpp b/src/modules/SX128x/SX128x.cpp index aa8ec58c..3d17e029 100644 --- a/src/modules/SX128x/SX128x.cpp +++ b/src/modules/SX128x/SX128x.cpp @@ -1254,7 +1254,6 @@ float SX128x::getFrequencyError() { } size_t SX128x::getPacketLength(bool update) { - (void)update; return(this->getPacketLength(update, NULL)); }