From 298dbe8e5c2230903789d9a2f44f614babad6efe Mon Sep 17 00:00:00 2001 From: Jaimi5 Date: Fri, 24 Jun 2022 17:38:31 +0200 Subject: [PATCH 1/6] RadioLib - getTimeOnAir for SX127x modules --- src/modules/SX127x/SX127x.cpp | 24 ++++++++++++++---------- src/modules/SX127x/SX127x.h | 9 +++++++++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 261e9814..cdcaf906 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -148,16 +148,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { uint32_t start = 0; if(modem == RADIOLIB_SX127X_LORA) { // calculate timeout (150 % of expected time-one-air) - float symbolLength = (float)(uint32_t(1) <<_sf) / (float)_bw; - float de = 0; - if(symbolLength >= 16.0) { - de = 1; - } - float ih = (float)_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, 0, 0); - float crc = (float)(_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, 2, 2) >> 2); - float n_pre = (float)((_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB) << 8) | _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB)); - float n_pay = 8.0 + max(ceil((8.0 * (float)len - 4.0 * (float)_sf + 28.0 + 16.0 * crc - 20.0 * ih)/(4.0 * (float)_sf - 8.0 * de)) * (float)_cr, 0.0); - uint32_t timeout = ceil(symbolLength * (n_pre + n_pay + 4.25) * 1500.0); + uint32_t timeout = getTimeOnAir(len) * 1500.0; // start transmission state = startTransmit(data, len, addr); @@ -1047,6 +1038,19 @@ int16_t SX127x::variablePacketLengthMode(uint8_t maxLen) { return(SX127x::setPacketMode(RADIOLIB_SX127X_PACKET_VARIABLE, maxLen)); } +uint32_t SX127x::getTimeOnAir(size_t len) { + float symbolLength = (float) (uint32_t(1) << _sf) / (float) _bw; + float de = 0; + if (symbolLength >= 16.0) { + de = 1; + } + float ih = (float) _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, 0, 0); + float crc = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, 2, 2) >> 2); + float n_pre = (float) ((_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB) << 8) | _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB)); + float n_pay = 8.0 + max(ceil((8.0 * (float) len - 4.0 * (float) _sf + 28.0 + 16.0 * crc - 20.0 * ih) / (4.0 * (float) _sf - 8.0 * de)) * (float) _cr, 0.0); + return ceil(symbolLength * (n_pre + n_pay + 4.25)); +} + int16_t SX127x::setCrcFiltering(bool crcOn) { _crcOn = crcOn; diff --git a/src/modules/SX127x/SX127x.h b/src/modules/SX127x/SX127x.h index 2597695e..15ba7154 100644 --- a/src/modules/SX127x/SX127x.h +++ b/src/modules/SX127x/SX127x.h @@ -980,6 +980,15 @@ class SX127x: public PhysicalLayer { */ int16_t variablePacketLengthMode(uint8_t maxLen = RADIOLIB_SX127X_MAX_PACKET_LENGTH_FSK); + /*! + \brief Get expected time-on-air for a given size of payload + + \param len Payload length in bytes. + + \returns Expected time-on-air in microseconds. + */ + uint32_t getTimeOnAir(size_t len); + /*! \brief Enable CRC filtering and generation. From 19715ef204fa8e0768fee9412475e1753b223165 Mon Sep 17 00:00:00 2001 From: Jaimi5 Date: Sat, 25 Jun 2022 14:04:44 +0200 Subject: [PATCH 2/6] RadioLib - Now getTimeOnAir returns microseconds --- src/modules/SX127x/SX127x.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index cdcaf906..5b719873 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -148,7 +148,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { uint32_t start = 0; if(modem == RADIOLIB_SX127X_LORA) { // calculate timeout (150 % of expected time-one-air) - uint32_t timeout = getTimeOnAir(len) * 1500.0; + uint32_t timeout = getTimeOnAir(len) * 1.5; // start transmission state = startTransmit(data, len, addr); @@ -1039,15 +1039,23 @@ int16_t SX127x::variablePacketLengthMode(uint8_t maxLen) { } uint32_t SX127x::getTimeOnAir(size_t len) { - float symbolLength = (float) (uint32_t(1) << _sf) / (float) _bw; + // Get symbol length in us + float symbolLength = (float) (uint32_t(1) << _sf) / (float) _bw * 1000; + // Get Low Data Rate optimization flag float de = 0; if (symbolLength >= 16.0) { de = 1; } + // Get explicit/implicit header enabled flag float ih = (float) _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, 0, 0); + // Get CRC enabled flag float crc = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, 2, 2) >> 2); + // Get number of bits preamble float n_pre = (float) ((_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB) << 8) | _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB)); + // Get number of bits payload float n_pay = 8.0 + max(ceil((8.0 * (float) len - 4.0 * (float) _sf + 28.0 + 16.0 * crc - 20.0 * ih) / (4.0 * (float) _sf - 8.0 * de)) * (float) _cr, 0.0); + + // Get time-on-air in us return ceil(symbolLength * (n_pre + n_pay + 4.25)); } From 314fcb2d6e9cc84696ba8d0571795eb21139b77c Mon Sep 17 00:00:00 2001 From: Jaimi5 Date: Sun, 26 Jun 2022 23:33:05 +0200 Subject: [PATCH 3/6] RadioLib - getTimeOnAir for FSK mode in module SX127x --- src/modules/SX127x/SX127x.cpp | 63 +++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 5b719873..a1b18e70 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -147,7 +147,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { int16_t modem = getActiveModem(); uint32_t start = 0; if(modem == RADIOLIB_SX127X_LORA) { - // calculate timeout (150 % of expected time-one-air) + // calculate timeout (150 % of expected time-on-air) uint32_t timeout = getTimeOnAir(len) * 1.5; // start transmission @@ -166,7 +166,7 @@ int16_t SX127x::transmit(uint8_t* data, size_t len, uint8_t addr) { } else if(modem == RADIOLIB_SX127X_FSK_OOK) { // calculate timeout (5ms + 500 % of expected time-on-air) - uint32_t timeout = 5000000 + (uint32_t)((((float)(len * 8)) / (_br * 1000.0)) * 5000000.0); + uint32_t timeout = 5000 + getTimeOnAir(len) * 5; // start transmission state = startTransmit(data, len, addr); @@ -218,8 +218,8 @@ int16_t SX127x::receive(uint8_t* data, size_t len) { } } else if(modem == RADIOLIB_SX127X_FSK_OOK) { - // calculate timeout (500 % of expected time-one-air) - uint32_t timeout = (uint32_t)((((float)(len * 8)) / (_br * 1000.0)) * 5000000.0); + // calculate timeout (500 % of expected time-on-air) + uint32_t timeout = getTimeOnAir(len) * 5; // set mode to receive state = startReceive(len, RADIOLIB_SX127X_RX); @@ -1039,24 +1039,45 @@ int16_t SX127x::variablePacketLengthMode(uint8_t maxLen) { } uint32_t SX127x::getTimeOnAir(size_t len) { - // Get symbol length in us - float symbolLength = (float) (uint32_t(1) << _sf) / (float) _bw * 1000; - // Get Low Data Rate optimization flag - float de = 0; - if (symbolLength >= 16.0) { - de = 1; + // check active modem + uint8_t modem = getActiveModem(); + if (modem == RADIOLIB_SX127X_LORA) { + // Get symbol length in us + float symbolLength = (float) (uint32_t(1) << _sf) / (float) _bw; + // Get Low Data Rate optimization flag + float de = 0; + if (symbolLength >= 16.0) { + de = 1; + } + // Get explicit/implicit header enabled flag + float ih = (float) _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, 0, 0); + // Get CRC enabled flag + float crc = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, 2, 2) >> 2); + // Get number of bits preamble + float n_pre = (float) ((_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB) << 8) | _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB)); + // Get number of bits payload + float n_pay = 8.0 + max(ceil((8.0 * (float) len - 4.0 * (float) _sf + 28.0 + 16.0 * crc - 20.0 * ih) / (4.0 * (float) _sf - 8.0 * de)) * (float) _cr, 0.0); + + // Get time-on-air in us + return ceil(symbolLength * (n_pre + n_pay + 4.25)) * 1000; + } else if(modem == RADIOLIB_SX127X_FSK_OOK) { + // Get number of bits preamble + float n_pre = (float) ((_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB_FSK) << 8) | _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB_FSK)) * 8; + //Get the number of bits of the sync word + float n_syncWord = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_SYNC_CONFIG, 2, 0) + 1); + //Get CRC enabled flag + float crc = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 4, 4) >> 2); + //Get payload length + uint16_t mode = _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 7, 7); + if (mode == RADIOLIB_SX127X_PACKET_FIXED) + len = _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH_FSK); + + // Calculate time-on-air in us ((length in bytes) * (8 bits / 1 byte)) / ((Bit Rate in kbps) * (1000 bps / 1 kbps)) * (1000000 us in 1 sec) + return (uint32_t) (((crc + n_syncWord + n_pre + (float) (len * 8)) / (_br * 1000.0)) * 1000000.0); + } else { + return(RADIOLIB_ERR_UNKNOWN); } - // Get explicit/implicit header enabled flag - float ih = (float) _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_1, 0, 0); - // Get CRC enabled flag - float crc = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_MODEM_CONFIG_2, 2, 2) >> 2); - // Get number of bits preamble - float n_pre = (float) ((_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB) << 8) | _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB)); - // Get number of bits payload - float n_pay = 8.0 + max(ceil((8.0 * (float) len - 4.0 * (float) _sf + 28.0 + 16.0 * crc - 20.0 * ih) / (4.0 * (float) _sf - 8.0 * de)) * (float) _cr, 0.0); - - // Get time-on-air in us - return ceil(symbolLength * (n_pre + n_pay + 4.25)); + } int16_t SX127x::setCrcFiltering(bool crcOn) { From de84410e69793cd4832501216261ec46b18e8ae8 Mon Sep 17 00:00:00 2001 From: Jaimi5 Date: Sun, 26 Jun 2022 23:39:44 +0200 Subject: [PATCH 4/6] RadioLib - type of packet length FSK mode getter changed. --- src/modules/SX127x/SX127x.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index a1b18e70..d4a093ac 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -1068,8 +1068,7 @@ uint32_t SX127x::getTimeOnAir(size_t len) { //Get CRC enabled flag float crc = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 4, 4) >> 2); //Get payload length - uint16_t mode = _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 7, 7); - if (mode == RADIOLIB_SX127X_PACKET_FIXED) + if (_packetLengthConfig == RADIOLIB_SX127X_PACKET_FIXED) len = _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH_FSK); // Calculate time-on-air in us ((length in bytes) * (8 bits / 1 byte)) / ((Bit Rate in kbps) * (1000 bps / 1 kbps)) * (1000000 us in 1 sec) From 3b305591d269359c8527b976d77c2aff7dc02fc9 Mon Sep 17 00:00:00 2001 From: Jaimi5 Date: Sun, 26 Jun 2022 23:49:15 +0200 Subject: [PATCH 5/6] RadioLib - syncWord to bits --- src/modules/SX127x/SX127x.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index d4a093ac..18282b57 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -1064,7 +1064,7 @@ uint32_t SX127x::getTimeOnAir(size_t len) { // Get number of bits preamble float n_pre = (float) ((_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB_FSK) << 8) | _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB_FSK)) * 8; //Get the number of bits of the sync word - float n_syncWord = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_SYNC_CONFIG, 2, 0) + 1); + float n_syncWord = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_SYNC_CONFIG, 2, 0) + 1) * 8; //Get CRC enabled flag float crc = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 4, 4) >> 2); //Get payload length From 46919cb2499d0b4a6e8c541b92f5457dcb9797a1 Mon Sep 17 00:00:00 2001 From: Jaimi5 Date: Fri, 1 Jul 2022 17:03:02 +0200 Subject: [PATCH 6/6] RadioLib - FSK getTimeOnAir, crc bits and packet length configuration fixed --- src/modules/SX127x/SX127x.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/modules/SX127x/SX127x.cpp b/src/modules/SX127x/SX127x.cpp index 18282b57..731b77d9 100644 --- a/src/modules/SX127x/SX127x.cpp +++ b/src/modules/SX127x/SX127x.cpp @@ -1065,13 +1065,18 @@ uint32_t SX127x::getTimeOnAir(size_t len) { float n_pre = (float) ((_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_MSB_FSK) << 8) | _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PREAMBLE_LSB_FSK)) * 8; //Get the number of bits of the sync word float n_syncWord = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_SYNC_CONFIG, 2, 0) + 1) * 8; - //Get CRC enabled flag - float crc = (float) (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 4, 4) >> 2); - //Get payload length - if (_packetLengthConfig == RADIOLIB_SX127X_PACKET_FIXED) - len = _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH_FSK); + //Get CRC bits + float crc = (_mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PACKET_CONFIG_1, 4, 4) == RADIOLIB_SX127X_CRC_ON) * 16; - // Calculate time-on-air in us ((length in bytes) * (8 bits / 1 byte)) / ((Bit Rate in kbps) * (1000 bps / 1 kbps)) * (1000000 us in 1 sec) + if (_packetLengthConfig == RADIOLIB_SX127X_PACKET_FIXED) { + //If Packet size fixed -> len = fixed packet length + len = _mod->SPIgetRegValue(RADIOLIB_SX127X_REG_PAYLOAD_LENGTH_FSK); + } else { + //if packet variable -> Add 1 extra byte for payload length + len += 1; + } + + // Calculate time-on-air in us {[(length in bytes) * (8 bits / 1 byte)] / [(Bit Rate in kbps) * (1000 bps / 1 kbps)]} * (1000000 us in 1 sec) return (uint32_t) (((crc + n_syncWord + n_pre + (float) (len * 8)) / (_br * 1000.0)) * 1000000.0); } else { return(RADIOLIB_ERR_UNKNOWN);