From 753e6a69dce1f6634cc93680c7f8beeb7bcbd89e Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Tue, 25 Mar 2025 20:20:03 +1100 Subject: [PATCH 1/6] * flood_advert_interval" now defaults to 3 hours for upgrading nodes (not just fresh install) * companion: "node_prefs" -> "new_prefs" migration --- examples/companion_radio/main.cpp | 78 +++++++++++++++++-------------- src/helpers/CommonCLI.cpp | 6 ++- 2 files changed, 47 insertions(+), 37 deletions(-) diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 58709d0e..cf96b859 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -732,6 +732,41 @@ public: //_prefs.rx_delay_base = 10.0f; enable once new algo fixed } + void loadPrefsInt(const char* filename) { + File file = _fs->open(filename); + if (file) { + uint8_t pad[8]; + + file.read((uint8_t *) &_prefs.airtime_factor, sizeof(float)); // 0 + file.read((uint8_t *) _prefs.node_name, sizeof(_prefs.node_name)); // 4 + file.read(pad, 4); // 36 + file.read((uint8_t *) &_prefs.node_lat, sizeof(_prefs.node_lat)); // 40 + file.read((uint8_t *) &_prefs.node_lon, sizeof(_prefs.node_lon)); // 48 + file.read((uint8_t *) &_prefs.freq, sizeof(_prefs.freq)); // 56 + file.read((uint8_t *) &_prefs.sf, sizeof(_prefs.sf)); // 60 + file.read((uint8_t *) &_prefs.cr, sizeof(_prefs.cr)); // 61 + file.read((uint8_t *) &_prefs.reserved1, sizeof(_prefs.reserved1)); // 62 + file.read((uint8_t *) &_prefs.reserved2, sizeof(_prefs.reserved2)); // 63 + file.read((uint8_t *) &_prefs.bw, sizeof(_prefs.bw)); // 64 + file.read((uint8_t *) &_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68 + file.read((uint8_t *) _prefs.unused, sizeof(_prefs.unused)); // 69 + file.read((uint8_t *) &_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base)); // 72 + file.read(pad, 4); // 76 + file.read((uint8_t *) &_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80 + + // sanitise bad pref values + _prefs.rx_delay_base = constrain(_prefs.rx_delay_base, 0, 20.0f); + _prefs.airtime_factor = constrain(_prefs.airtime_factor, 0, 9.0f); + _prefs.freq = constrain(_prefs.freq, 400.0f, 2500.0f); + _prefs.bw = constrain(_prefs.bw, 62.5f, 500.0f); + _prefs.sf = constrain(_prefs.sf, 7, 12); + _prefs.cr = constrain(_prefs.cr, 5, 8); + _prefs.tx_power_dbm = constrain(_prefs.tx_power_dbm, 1, MAX_LORA_TX_POWER); + + file.close(); + } + } + void begin(FILESYSTEM& fs, mesh::RNG& trng, bool has_display) { _fs = &fs; @@ -746,39 +781,12 @@ public: loadMainIdentity(trng); // load persisted prefs - if (_fs->exists("/node_prefs")) { - File file = _fs->open("/node_prefs"); - if (file) { - uint8_t pad[8]; - - file.read((uint8_t *) &_prefs.airtime_factor, sizeof(float)); // 0 - file.read((uint8_t *) _prefs.node_name, sizeof(_prefs.node_name)); // 4 - file.read(pad, 4); // 36 - file.read((uint8_t *) &_prefs.node_lat, sizeof(_prefs.node_lat)); // 40 - file.read((uint8_t *) &_prefs.node_lon, sizeof(_prefs.node_lon)); // 48 - file.read((uint8_t *) &_prefs.freq, sizeof(_prefs.freq)); // 56 - file.read((uint8_t *) &_prefs.sf, sizeof(_prefs.sf)); // 60 - file.read((uint8_t *) &_prefs.cr, sizeof(_prefs.cr)); // 61 - file.read((uint8_t *) &_prefs.reserved1, sizeof(_prefs.reserved1)); // 62 - file.read((uint8_t *) &_prefs.reserved2, sizeof(_prefs.reserved2)); // 63 - file.read((uint8_t *) &_prefs.bw, sizeof(_prefs.bw)); // 64 - file.read((uint8_t *) &_prefs.tx_power_dbm, sizeof(_prefs.tx_power_dbm)); // 68 - file.read((uint8_t *) _prefs.unused, sizeof(_prefs.unused)); // 69 - file.read((uint8_t *) &_prefs.rx_delay_base, sizeof(_prefs.rx_delay_base)); // 72 - file.read(pad, 4); // 76 - file.read((uint8_t *) &_prefs.ble_pin, sizeof(_prefs.ble_pin)); // 80 - - // sanitise bad pref values - _prefs.rx_delay_base = constrain(_prefs.rx_delay_base, 0, 20.0f); - _prefs.airtime_factor = constrain(_prefs.airtime_factor, 0, 9.0f); - _prefs.freq = constrain(_prefs.freq, 400.0f, 2500.0f); - _prefs.bw = constrain(_prefs.bw, 62.5f, 500.0f); - _prefs.sf = constrain(_prefs.sf, 7, 12); - _prefs.cr = constrain(_prefs.cr, 5, 8); - _prefs.tx_power_dbm = constrain(_prefs.tx_power_dbm, 1, MAX_LORA_TX_POWER); - - file.close(); - } + if (_fs->exists("/new_prefs")) { + loadPrefsInt("/new_prefs"); // new filename + } else if (_fs->exists("/node_prefs")) { + loadPrefsInt("/node_prefs"); + savePrefs(); // save to new filename + _fs->remove("/node_prefs"); // remove old } #ifdef BLE_PIN_CODE @@ -823,10 +831,10 @@ public: void savePrefs() { #if defined(NRF52_PLATFORM) - File file = _fs->open("/node_prefs", FILE_O_WRITE); + File file = _fs->open("/new_prefs", FILE_O_WRITE); if (file) { file.seek(0); file.truncate(); } #else - File file = _fs->open("/node_prefs", "w", true); + File file = _fs->open("/new_prefs", "w", true); #endif if (file) { uint8_t pad[8]; diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index a9345ece..177138c6 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -38,7 +38,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) { file.read((uint8_t *) &_prefs->tx_power_dbm, sizeof(_prefs->tx_power_dbm)); // 76 file.read((uint8_t *) &_prefs->disable_fwd, sizeof(_prefs->disable_fwd)); // 77 file.read((uint8_t *) &_prefs->advert_interval, sizeof(_prefs->advert_interval)); // 78 - file.read((uint8_t *) &_prefs->flood_advert_interval, sizeof(_prefs->flood_advert_interval)); // 79 + file.read((uint8_t *) pad, 1); // 79 was 'unused' file.read((uint8_t *) &_prefs->rx_delay_base, sizeof(_prefs->rx_delay_base)); // 80 file.read((uint8_t *) &_prefs->tx_delay_factor, sizeof(_prefs->tx_delay_factor)); // 84 file.read((uint8_t *) &_prefs->guest_password[0], sizeof(_prefs->guest_password)); // 88 @@ -51,6 +51,7 @@ void CommonCLI::loadPrefsInt(FILESYSTEM* fs, const char* filename) { file.read((uint8_t *) &_prefs->bw, sizeof(_prefs->bw)); // 116 file.read(pad, 4); // 120 file.read((uint8_t *) &_prefs->flood_max, sizeof(_prefs->flood_max)); // 124 + file.read((uint8_t *) &_prefs->flood_advert_interval, sizeof(_prefs->flood_advert_interval)); // 125 // sanitise bad pref values _prefs->rx_delay_base = constrain(_prefs->rx_delay_base, 0, 20.0f); @@ -88,7 +89,7 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) { file.write((uint8_t *) &_prefs->tx_power_dbm, sizeof(_prefs->tx_power_dbm)); // 76 file.write((uint8_t *) &_prefs->disable_fwd, sizeof(_prefs->disable_fwd)); // 77 file.write((uint8_t *) &_prefs->advert_interval, sizeof(_prefs->advert_interval)); // 78 - file.write((uint8_t *) &_prefs->flood_advert_interval, sizeof(_prefs->flood_advert_interval)); // 79 + file.write((uint8_t *) pad, 1); // 79 was 'unused' file.write((uint8_t *) &_prefs->rx_delay_base, sizeof(_prefs->rx_delay_base)); // 80 file.write((uint8_t *) &_prefs->tx_delay_factor, sizeof(_prefs->tx_delay_factor)); // 84 file.write((uint8_t *) &_prefs->guest_password[0], sizeof(_prefs->guest_password)); // 88 @@ -101,6 +102,7 @@ void CommonCLI::savePrefs(FILESYSTEM* fs) { file.write((uint8_t *) &_prefs->bw, sizeof(_prefs->bw)); // 116 file.write(pad, 4); // 120 file.write((uint8_t *) &_prefs->flood_max, sizeof(_prefs->flood_max)); // 124 + file.write((uint8_t *) &_prefs->flood_advert_interval, sizeof(_prefs->flood_advert_interval)); // 125 file.close(); } From 88b88cbc901f2a1dd5329f84901dde4546d82c44 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Tue, 25 Mar 2025 22:02:37 +1100 Subject: [PATCH 2/6] * ver bump to 1.4.1 --- examples/companion_radio/main.cpp | 4 ++-- examples/simple_repeater/main.cpp | 4 ++-- examples/simple_room_server/main.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index cf96b859..bb82742e 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -89,11 +89,11 @@ static uint32_t _atoi(const char* sp) { #define FIRMWARE_VER_CODE 3 #ifndef FIRMWARE_BUILD_DATE - #define FIRMWARE_BUILD_DATE "19 Mar 2025" + #define FIRMWARE_BUILD_DATE "25 Mar 2025" #endif #ifndef FIRMWARE_VERSION - #define FIRMWARE_VERSION "v1.4.0" + #define FIRMWARE_VERSION "v1.4.1" #endif #define CMD_APP_START 1 diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index c24227df..957892bc 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -23,11 +23,11 @@ /* ------------------------------ Config -------------------------------- */ #ifndef FIRMWARE_BUILD_DATE - #define FIRMWARE_BUILD_DATE "19 Mar 2025" + #define FIRMWARE_BUILD_DATE "25 Mar 2025" #endif #ifndef FIRMWARE_VERSION - #define FIRMWARE_VERSION "v1.4.0" + #define FIRMWARE_VERSION "v1.4.1" #endif #ifndef LORA_FREQ diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index 12a576d2..25ec3a11 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -23,11 +23,11 @@ /* ------------------------------ Config -------------------------------- */ #ifndef FIRMWARE_BUILD_DATE - #define FIRMWARE_BUILD_DATE "19 Mar 2025" + #define FIRMWARE_BUILD_DATE "25 Mar 2025" #endif #ifndef FIRMWARE_VERSION - #define FIRMWARE_VERSION "v1.4.0" + #define FIRMWARE_VERSION "v1.4.1" #endif #ifndef LORA_FREQ From ee230ab2ca67770d6043386fa8f4477564b427c9 Mon Sep 17 00:00:00 2001 From: Adrian <76220205+adrian-immel@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:14:48 +0100 Subject: [PATCH 3/6] Rename faketecBoard.cpp to FaketecBoard.cpp --- src/helpers/nrf52/{faketecBoard.cpp => FaketecBoard.cpp} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/helpers/nrf52/{faketecBoard.cpp => FaketecBoard.cpp} (100%) diff --git a/src/helpers/nrf52/faketecBoard.cpp b/src/helpers/nrf52/FaketecBoard.cpp similarity index 100% rename from src/helpers/nrf52/faketecBoard.cpp rename to src/helpers/nrf52/FaketecBoard.cpp From 4d262e9e5d9e60e756b6353585d71b274476f2c3 Mon Sep 17 00:00:00 2001 From: Adrian <76220205+adrian-immel@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:16:08 +0100 Subject: [PATCH 4/6] Rename faketecBoard.h to FaketecBoard.h --- src/helpers/nrf52/{faketecBoard.h => FaketecBoard.h} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/helpers/nrf52/{faketecBoard.h => FaketecBoard.h} (100%) diff --git a/src/helpers/nrf52/faketecBoard.h b/src/helpers/nrf52/FaketecBoard.h similarity index 100% rename from src/helpers/nrf52/faketecBoard.h rename to src/helpers/nrf52/FaketecBoard.h From 7cab681697c654e7e4590ad1215f26d5b6aa9aff Mon Sep 17 00:00:00 2001 From: Adrian <76220205+adrian-immel@users.noreply.github.com> Date: Tue, 25 Mar 2025 23:21:05 +0100 Subject: [PATCH 5/6] Update FaketecBoard.cpp --- src/helpers/nrf52/FaketecBoard.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/nrf52/FaketecBoard.cpp b/src/helpers/nrf52/FaketecBoard.cpp index b586ee32..4b9ff023 100644 --- a/src/helpers/nrf52/FaketecBoard.cpp +++ b/src/helpers/nrf52/FaketecBoard.cpp @@ -1,5 +1,5 @@ #include -#include "faketecBoard.h" +#include "FaketecBoard.h" #include #include From d5cc28b0c53d2fe7eb17e99d73685296f1d88ee5 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Thu, 27 Mar 2025 13:00:40 +1100 Subject: [PATCH 6/6] * room server: now support "log start/stop..." --- examples/simple_room_server/main.cpp | 81 ++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index 25ec3a11..dd87aabd 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -77,6 +77,8 @@ static UITask ui_task(display); #endif +#define PACKET_LOG_FILE "/packet_log" + /* ------------------------------ Code -------------------------------- */ enum RoomPermission { @@ -146,6 +148,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { RADIO_CLASS* _phy; mesh::MainBoard* _board; unsigned long next_local_advert, next_flood_advert; + bool _logging; NodePrefs _prefs; CommonCLI _cli; uint8_t reply_data[MAX_PACKET_PAYLOAD]; @@ -257,6 +260,14 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { return createAdvert(self_id, app_data, app_data_len); } + File openAppend(const char* fname) { + #if defined(NRF52_PLATFORM) + return _fs->open(fname, FILE_O_WRITE); + #else + return _fs->open(fname, "a", true); + #endif + } + protected: float getAirtimeBudgetFactor() const override { return _prefs.airtime_factor; @@ -271,6 +282,55 @@ protected: #endif } + void logRx(mesh::Packet* pkt, int len, float score) override { + if (_logging) { + File f = openAppend(PACKET_LOG_FILE); + if (f) { + f.print(getLogDateTime()); + f.printf(": RX, len=%d (type=%d, route=%s, payload_len=%d) SNR=%d RSSI=%d score=%d", + len, pkt->getPayloadType(), pkt->isRouteDirect() ? "D" : "F", pkt->payload_len, + (int)_radio->getLastSNR(), (int)_radio->getLastRSSI(), (int)(score*1000)); + + if (pkt->getPayloadType() == PAYLOAD_TYPE_PATH || pkt->getPayloadType() == PAYLOAD_TYPE_REQ + || pkt->getPayloadType() == PAYLOAD_TYPE_RESPONSE || pkt->getPayloadType() == PAYLOAD_TYPE_TXT_MSG) { + f.printf(" [%02X -> %02X]\n", (uint32_t)pkt->payload[1], (uint32_t)pkt->payload[0]); + } else { + f.printf("\n"); + } + f.close(); + } + } + } + void logTx(mesh::Packet* pkt, int len) override { + if (_logging) { + File f = openAppend(PACKET_LOG_FILE); + if (f) { + f.print(getLogDateTime()); + f.printf(": TX, len=%d (type=%d, route=%s, payload_len=%d)", + len, pkt->getPayloadType(), pkt->isRouteDirect() ? "D" : "F", pkt->payload_len); + + if (pkt->getPayloadType() == PAYLOAD_TYPE_PATH || pkt->getPayloadType() == PAYLOAD_TYPE_REQ + || pkt->getPayloadType() == PAYLOAD_TYPE_RESPONSE || pkt->getPayloadType() == PAYLOAD_TYPE_TXT_MSG) { + f.printf(" [%02X -> %02X]\n", (uint32_t)pkt->payload[1], (uint32_t)pkt->payload[0]); + } else { + f.printf("\n"); + } + f.close(); + } + } + } + void logTxFail(mesh::Packet* pkt, int len) override { + if (_logging) { + File f = openAppend(PACKET_LOG_FILE); + if (f) { + f.print(getLogDateTime()); + f.printf(": TX FAIL!, len=%d (type=%d, route=%s, payload_len=%d)\n", + len, pkt->getPayloadType(), pkt->isRouteDirect() ? "D" : "F", pkt->payload_len); + f.close(); + } + } + } + int calcRxDelay(float score, uint32_t air_time) const override { if (_prefs.rx_delay_base <= 0.0f) return 0; return (int) ((pow(_prefs.rx_delay_base, 0.85f - score) - 1.0) * air_time); @@ -599,6 +659,7 @@ public: { my_radio = &radio; next_local_advert = next_flood_advert = 0; + _logging = false; // defaults memset(&_prefs, 0, sizeof(_prefs)); @@ -690,9 +751,23 @@ public: } } - void setLoggingOn(bool enable) override { /* no-op */ } - void eraseLogFile() override { /* no-op */ } - void dumpLogFile() override { /* no-op */ } + void setLoggingOn(bool enable) override { _logging = enable; } + + void eraseLogFile() override { + _fs->remove(PACKET_LOG_FILE); + } + + void dumpLogFile() override { + File f = _fs->open(PACKET_LOG_FILE); + if (f) { + while (f.available()) { + int c = f.read(); + if (c < 0) break; + Serial.print((char)c); + } + f.close(); + } + } void setTxPower(uint8_t power_dbm) override { _phy->setOutputPower(power_dbm);