From 1d4295feed7e6c9227d98ffdb34c9a87e4242cc3 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 21 Nov 2021 21:17:26 +0100 Subject: [PATCH] [RF69] Fixed known binary receive length (#408) --- src/modules/RF69/RF69.cpp | 21 ++++++++++++++++++--- src/modules/RF69/RF69.h | 4 +++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/modules/RF69/RF69.cpp b/src/modules/RF69/RF69.cpp index 62ce873c..8a41666c 100644 --- a/src/modules/RF69/RF69.cpp +++ b/src/modules/RF69/RF69.cpp @@ -347,9 +347,12 @@ int16_t RF69::readData(uint8_t* data, size_t len) { RADIOLIB_ASSERT(state); // get packet length - size_t length = len; - if(len == RADIOLIB_RF69_MAX_PACKET_LENGTH) { - length = getPacketLength(); + size_t length = getPacketLength(); + size_t dumpLen = 0; + if((len != 0) && (len < length)) { + // user requested less data than we got, only return what was requested + dumpLen = length - len; + length = len; } // check address filtering @@ -361,6 +364,11 @@ int16_t RF69::readData(uint8_t* data, size_t len) { // read packet data _mod->SPIreadRegisterBurst(RADIOLIB_RF69_REG_FIFO, length, data); + // dump the bytes that weren't requested + if(dumpLen != 0) { + clearFIFO(dumpLen); + } + // clear internal flag so getPacketLength can return the new packet length _packetLengthQueried = false; @@ -935,4 +943,11 @@ void RF69::clearIRQFlags() { _mod->SPIwriteRegister(RADIOLIB_RF69_REG_IRQ_FLAGS_2, 0b11111111); } +void RF69::clearFIFO(size_t count) { + while(count) { + _mod->SPIreadRegister(RADIOLIB_RF69_REG_FIFO); + count--; + } +} + #endif diff --git a/src/modules/RF69/RF69.h b/src/modules/RF69/RF69.h index d91382f2..697f99fe 100644 --- a/src/modules/RF69/RF69.h +++ b/src/modules/RF69/RF69.h @@ -616,7 +616,8 @@ class RF69: public PhysicalLayer { \param data Pointer to array to save the received binary data. - \param len Number of bytes that will be received. Must be known in advance for binary transmissions. + \param len Number of bytes that will be read. When set to 0, the packet length will be retreived automatically. + When more bytes than received are requested, only the number of bytes requested will be returned. \returns \ref status_codes */ @@ -950,6 +951,7 @@ class RF69: public PhysicalLayer { #endif int16_t setMode(uint8_t mode); void clearIRQFlags(); + void clearFIFO(size_t count); }; #endif