[SX128x] Start reading from Rx buffer offset

This commit is contained in:
GUVWAF 2024-08-10 12:54:58 +02:00
parent 0620d8edda
commit 5f6f6f9a3c
2 changed files with 24 additions and 7 deletions

View file

@ -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));
}

View file

@ -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();