From 7bd7bfb14a96672db9b1989829a946f25bfe11b9 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Mon, 24 Mar 2025 21:16:00 +1100 Subject: [PATCH 01/18] * ESP-NOW experiment with terminal-chat --- examples/simple_secure_chat/main.cpp | 20 +++++++ src/helpers/esp32/ESPNOWRadio.cpp | 83 ++++++++++++++++++++++++++++ src/helpers/esp32/ESPNOWRadio.h | 34 ++++++++++++ variants/espnow_c3/platformio.ini | 25 +++++++++ variants/espnow_c3/target.cpp | 11 ++++ variants/espnow_c3/target.h | 9 +++ 6 files changed, 182 insertions(+) create mode 100644 src/helpers/esp32/ESPNOWRadio.cpp create mode 100644 src/helpers/esp32/ESPNOWRadio.h create mode 100644 variants/espnow_c3/platformio.ini create mode 100644 variants/espnow_c3/target.cpp create mode 100644 variants/espnow_c3/target.h diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 4eae2e34..9fc06489 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -7,9 +7,12 @@ #include #endif +#ifdef WRAPPER_CLASS #define RADIOLIB_STATIC_ONLY 1 #include #include +#endif + #include #include #include @@ -263,7 +266,11 @@ protected: public: +#ifdef WRAPPER_CLASS MyMesh(RadioLibWrapper& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) +#else + MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) +#endif : BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables) { // defaults @@ -325,6 +332,8 @@ public: Serial.println("===== MeshCore Chat Terminal ====="); Serial.println(); Serial.printf("WELCOME %s\n", _prefs.node_name); + mesh::Utils::printHex(Serial, self_id.pub_key, PUB_KEY_SIZE); + Serial.println(); Serial.println(" (enter 'help' for basic commands)"); Serial.println(); } @@ -513,7 +522,12 @@ public: StdRNG fast_rng; SimpleMeshTables tables; + +#ifdef WRAPPER_CLASS MyMesh the_mesh(*new WRAPPER_CLASS(radio, board), fast_rng, *new VolatileRTCClock(), tables); +#else +MyMesh the_mesh(radio, fast_rng, *new VolatileRTCClock(), tables); +#endif void halt() { while (1) ; @@ -526,7 +540,11 @@ void setup() { if (!radio_init()) { halt(); } +#ifdef WRAPPER_CLASS fast_rng.begin(radio.random(0x7FFFFFFF)); +#else + fast_rng.begin(rand()); +#endif #if defined(NRF52_PLATFORM) InternalFS.begin(); @@ -538,12 +556,14 @@ void setup() { #error "need to define filesystem" #endif +#ifdef WRAPPER_CLASS if (LORA_FREQ != the_mesh.getFreqPref()) { radio.setFrequency(the_mesh.getFreqPref()); } if (LORA_TX_POWER != the_mesh.getTxPowerPref()) { radio.setOutputPower(the_mesh.getTxPowerPref()); } +#endif the_mesh.showWelcome(); diff --git a/src/helpers/esp32/ESPNOWRadio.cpp b/src/helpers/esp32/ESPNOWRadio.cpp new file mode 100644 index 00000000..bb1ba898 --- /dev/null +++ b/src/helpers/esp32/ESPNOWRadio.cpp @@ -0,0 +1,83 @@ +#include "ESPNOWRadio.h" +#include +#include + +static uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +static esp_now_peer_info_t peerInfo; +static bool is_send_complete = false; +static esp_err_t last_send_result; +static uint8_t rx_buf[256]; +static uint8_t last_rx_len = 0; + +// callback when data is sent +static void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { + is_send_complete = true; + ESPNOW_DEBUG_PRINTLN("Send Status: %d", (int)status); +} + +static void OnDataRecv(const uint8_t *mac, const uint8_t *data, int len) { + ESPNOW_DEBUG_PRINTLN("Recv: len = %d", len); + memcpy(rx_buf, data, len); + last_rx_len = len; +} + +void ESPNOWRadio::begin() { + // Set device as a Wi-Fi Station + WiFi.mode(WIFI_STA); + + // Init ESP-NOW + if (esp_now_init() != ESP_OK) { + ESPNOW_DEBUG_PRINTLN("Error initializing ESP-NOW"); + return; + } + + esp_now_register_send_cb(OnDataSent); + esp_now_register_recv_cb(OnDataRecv); + + // Register peer + memcpy(peerInfo.peer_addr, broadcastAddress, 6); + peerInfo.channel = 0; + peerInfo.encrypt = false; + + // Add peer + if (esp_now_add_peer(&peerInfo) == ESP_OK) { + ESPNOW_DEBUG_PRINTLN("init success"); + } else { + // ESPNOW_DEBUG_PRINTLN("Failed to add peer"); + } +} + +void ESPNOWRadio::startSendRaw(const uint8_t* bytes, int len) { + // Send message via ESP-NOW + is_send_complete = false; + esp_err_t result = esp_now_send(broadcastAddress, bytes, len); + if (result == ESP_OK) { + ESPNOW_DEBUG_PRINTLN("Send success"); + } else { + last_send_result = result; + is_send_complete = true; + ESPNOW_DEBUG_PRINTLN("Send failed: %d", result); + } +} + +bool ESPNOWRadio::isSendComplete() { + return is_send_complete; +} +void ESPNOWRadio::onSendFinished() { +} + +float ESPNOWRadio::getLastRSSI() const { return 0; } +float ESPNOWRadio::getLastSNR() const { return 0; } + +int ESPNOWRadio::recvRaw(uint8_t* bytes, int sz) { + int len = last_rx_len; + if (last_rx_len > 0) { + memcpy(bytes, rx_buf, last_rx_len); + last_rx_len = 0; + } + return len; +} + +uint32_t ESPNOWRadio::getEstAirtimeFor(int len_bytes) { + return 100; // TODO +} diff --git a/src/helpers/esp32/ESPNOWRadio.h b/src/helpers/esp32/ESPNOWRadio.h new file mode 100644 index 00000000..fd3e241e --- /dev/null +++ b/src/helpers/esp32/ESPNOWRadio.h @@ -0,0 +1,34 @@ +#pragma once + +#include + +class ESPNOWRadio : public mesh::Radio { +protected: + uint32_t n_recv, n_sent; + +public: + ESPNOWRadio() { n_recv = n_sent = 0; } + + void begin() override; + int recvRaw(uint8_t* bytes, int sz) override; + uint32_t getEstAirtimeFor(int len_bytes) override; + void startSendRaw(const uint8_t* bytes, int len) override; + bool isSendComplete() override; + void onSendFinished() override; + + uint32_t getPacketsRecv() const { return n_recv; } + uint32_t getPacketsSent() const { return n_sent; } + virtual float getLastRSSI() const override; + virtual float getLastSNR() const override; + + float packetScore(float snr, int packet_len) override { return 0; } +}; + +#if ESPNOW_DEBUG_LOGGING && ARDUINO + #include + #define ESPNOW_DEBUG_PRINT(F, ...) Serial.printf("ESP-Now: " F, ##__VA_ARGS__) + #define ESPNOW_DEBUG_PRINTLN(F, ...) Serial.printf("ESP-Now: " F "\n", ##__VA_ARGS__) +#else + #define ESPNOW_DEBUG_PRINT(...) {} + #define ESPNOW_DEBUG_PRINTLN(...) {} +#endif diff --git a/variants/espnow_c3/platformio.ini b/variants/espnow_c3/platformio.ini new file mode 100644 index 00000000..48af00ef --- /dev/null +++ b/variants/espnow_c3/platformio.ini @@ -0,0 +1,25 @@ + +; ----------- Generic ESP32-C3 ------------ + +[env:Generic_C3_ESPNOW_terminal_chat] +extends = esp32_base +;board = esp32-c3-devkitm-1 +board = esp32-s3-devkitc-1 +build_flags = + ${esp32_base.build_flags} + -I variants/espnow_c3 + -D MAX_CONTACTS=100 + -D MAX_GROUP_CHANNELS=1 + -D ESPNOW_DEBUG_LOGGING=1 +; -D P_LORA_TX_LED=8 + -D P_LORA_TX_LED=35 + -D PIN_USER_BTN=0 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +build_src_filter = ${esp32_base.build_src_filter} + +<../examples/simple_secure_chat/main.cpp> + + + +<../variants/espnow_c3> +lib_deps = + ${esp32_base.lib_deps} + densaugeo/base64 @ ~1.4.0 diff --git a/variants/espnow_c3/target.cpp b/variants/espnow_c3/target.cpp new file mode 100644 index 00000000..8daa0cfe --- /dev/null +++ b/variants/espnow_c3/target.cpp @@ -0,0 +1,11 @@ +#include +#include "target.h" + +ESP32Board board; + +ESPNOWRadio radio; + +bool radio_init() { + radio.begin(); + return true; // success +} diff --git a/variants/espnow_c3/target.h b/variants/espnow_c3/target.h new file mode 100644 index 00000000..656687dc --- /dev/null +++ b/variants/espnow_c3/target.h @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +extern ESP32Board board; +extern ESPNOWRadio radio; + +bool radio_init(); From 8355543366ab3af9ee9879884b073ec7658127b1 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Tue, 25 Mar 2025 01:26:46 +1100 Subject: [PATCH 02/18] * more experiments --- examples/simple_repeater/main.cpp | 33 ++++++++++++++++++++++++-- examples/simple_room_server/main.cpp | 31 +++++++++++++++++++++++- examples/simple_secure_chat/main.cpp | 6 ++++- src/helpers/esp32/ESPNOWRadio.cpp | 13 ++++++++++- src/helpers/esp32/ESPNOWRadio.h | 1 + variants/espnow_c3/platformio.ini | 35 ++++++++++++++++++++++++++-- 6 files changed, 112 insertions(+), 7 deletions(-) diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index c24227df..288053f6 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -7,8 +7,11 @@ #include #endif +#ifdef WRAPPER_CLASS #define RADIOLIB_STATIC_ONLY 1 #include +#endif + #include #include #include @@ -108,9 +111,13 @@ struct ClientInfo { #define CLI_REPLY_DELAY_MILLIS 1500 class MyMesh : public mesh::Mesh, public CommonCLICallbacks { - RadioLibWrapper* my_radio; FILESYSTEM* _fs; +#ifdef WRAPPER_CLASS + RadioLibWrapper* my_radio; RADIO_CLASS* _phy; +#else + ESPNOWRadio* my_radio; +#endif mesh::MainBoard* _board; unsigned long next_local_advert, next_flood_advert; bool _logging; @@ -474,9 +481,15 @@ protected: } public: - MyMesh(RADIO_CLASS& phy, mesh::MainBoard& board, RadioLibWrapper& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) +#ifdef WRAPPER_CLASS + MyMesh(RADIO_CLASS& phy, mesh::MainBoard& board, RadioLibWrapper& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), _phy(&phy), _board(&board), _cli(board, this, &_prefs, this) +#else + MyMesh(mesh::MainBoard& board, ESPNOWRadio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) + : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), + _board(&board), _cli(board, this, &_prefs, this) +#endif { my_radio = &radio; memset(known_clients, 0, sizeof(known_clients)); @@ -510,11 +523,13 @@ public: // load persisted prefs _cli.loadPrefs(_fs); + #ifdef WRAPPER_CLASS _phy->setFrequency(_prefs.freq); _phy->setSpreadingFactor(_prefs.sf); _phy->setBandwidth(_prefs.bw); _phy->setCodingRate(_prefs.cr); _phy->setOutputPower(_prefs.tx_power_dbm); + #endif updateAdvertTimer(); updateFloodAdvertTimer(); @@ -582,7 +597,9 @@ public: } void setTxPower(uint8_t power_dbm) override { + #ifdef WRAPPER_CLASS _phy->setOutputPower(power_dbm); + #endif } void loop() { @@ -616,7 +633,11 @@ VolatileRTCClock fallback_clock; #endif AutoDiscoverRTCClock rtc_clock(fallback_clock); +#ifdef WRAPPER_CLASS MyMesh the_mesh(radio, board, *new WRAPPER_CLASS(radio, board), *new ArduinoMillis(), fast_rng, rtc_clock, tables); +#else +MyMesh the_mesh(board, radio, *new ArduinoMillis(), fast_rng, rtc_clock, tables); +#endif void halt() { while (1) ; @@ -636,7 +657,11 @@ void setup() { if (!radio_init()) { halt(); } +#ifdef WRAPPER_CLASS fast_rng.begin(radio.random(0x7FFFFFFF)); +#else + fast_rng.begin(radio.intID()); +#endif FILESYSTEM* fs; #if defined(NRF52_PLATFORM) @@ -652,7 +677,11 @@ void setup() { #endif if (!store.load("_main", the_mesh.self_id)) { MESH_DEBUG_PRINTLN("Generating new keypair"); + #ifdef WRAPPER_CLASS RadioNoiseListener rng(radio); + #else + #define rng fast_rng + #endif the_mesh.self_id = mesh::LocalIdentity(&rng); // create new random identity store.save("_main", the_mesh.self_id); } diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index 12a576d2..68eec802 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -7,8 +7,11 @@ #include #endif +#ifdef WRAPPER_CLASS #define RADIOLIB_STATIC_ONLY 1 #include +#endif + #include #include #include @@ -141,9 +144,13 @@ struct ServerStats { }; class MyMesh : public mesh::Mesh, public CommonCLICallbacks { - RadioLibWrapper* my_radio; FILESYSTEM* _fs; +#ifdef WRAPPER_CLASS + RadioLibWrapper* my_radio; RADIO_CLASS* _phy; +#else + ESPNOWRadio* my_radio; +#endif mesh::MainBoard* _board; unsigned long next_local_advert, next_flood_advert; NodePrefs _prefs; @@ -593,9 +600,15 @@ protected: } public: +#ifdef WRAPPER_CLASS MyMesh(RADIO_CLASS& phy, mesh::MainBoard& board, RadioLibWrapper& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), _phy(&phy), _board(&board), _cli(board, this, &_prefs, this) +#else + MyMesh(mesh::MainBoard& board, ESPNOWRadio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) + : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), + _board(&board), _cli(board, this, &_prefs, this) +#endif { my_radio = &radio; next_local_advert = next_flood_advert = 0; @@ -638,11 +651,13 @@ public: // load persisted prefs _cli.loadPrefs(_fs); + #ifdef WRAPPER_CLASS _phy->setFrequency(_prefs.freq); _phy->setSpreadingFactor(_prefs.sf); _phy->setBandwidth(_prefs.bw); _phy->setCodingRate(_prefs.cr); _phy->setOutputPower(_prefs.tx_power_dbm); + #endif updateAdvertTimer(); } @@ -695,7 +710,9 @@ public: void dumpLogFile() override { /* no-op */ } void setTxPower(uint8_t power_dbm) override { + #ifdef WRAPPER_CLASS _phy->setOutputPower(power_dbm); + #endif } void loop() { @@ -764,7 +781,11 @@ VolatileRTCClock fallback_clock; #endif AutoDiscoverRTCClock rtc_clock(fallback_clock); +#ifdef WRAPPER_CLASS MyMesh the_mesh(radio, board, *new WRAPPER_CLASS(radio, board), *new ArduinoMillis(), fast_rng, rtc_clock, tables); +#else +MyMesh the_mesh(board, radio, *new ArduinoMillis(), fast_rng, rtc_clock, tables); +#endif void halt() { while (1) ; @@ -784,7 +805,11 @@ void setup() { if (!radio_init()) { halt(); } +#ifdef WRAPPER_CLASS fast_rng.begin(radio.random(0x7FFFFFFF)); +#else + fast_rng.begin(radio.intID()); +#endif FILESYSTEM* fs; #if defined(NRF52_PLATFORM) @@ -799,7 +824,11 @@ void setup() { #error "need to define filesystem" #endif if (!store.load("_main", the_mesh.self_id)) { + #ifdef WRAPPER_CLASS RadioNoiseListener rng(radio); + #else + #define rng fast_rng + #endif the_mesh.self_id = mesh::LocalIdentity(&rng); // create new random identity store.save("_main", the_mesh.self_id); } diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 9fc06489..8fed83d4 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -543,7 +543,11 @@ void setup() { #ifdef WRAPPER_CLASS fast_rng.begin(radio.random(0x7FFFFFFF)); #else - fast_rng.begin(rand()); + char c = 0; + while (c != '\n') { // wait for ENTER to be pressed + if (Serial.available()) c = Serial.read(); + } + fast_rng.begin(millis()); #endif #if defined(NRF52_PLATFORM) diff --git a/src/helpers/esp32/ESPNOWRadio.cpp b/src/helpers/esp32/ESPNOWRadio.cpp index bb1ba898..323392d3 100644 --- a/src/helpers/esp32/ESPNOWRadio.cpp +++ b/src/helpers/esp32/ESPNOWRadio.cpp @@ -47,6 +47,17 @@ void ESPNOWRadio::begin() { } } +uint32_t ESPNOWRadio::intID() { + uint8_t mac[8]; + memset(mac, 0, sizeof(mac)); + esp_efuse_mac_get_default(mac); + uint32_t n, m; + memcpy(&n, &mac[0], 4); + memcpy(&m, &mac[4], 4); + + return n * m; +} + void ESPNOWRadio::startSendRaw(const uint8_t* bytes, int len) { // Send message via ESP-NOW is_send_complete = false; @@ -79,5 +90,5 @@ int ESPNOWRadio::recvRaw(uint8_t* bytes, int sz) { } uint32_t ESPNOWRadio::getEstAirtimeFor(int len_bytes) { - return 100; // TODO + return 2; // Fast AF } diff --git a/src/helpers/esp32/ESPNOWRadio.h b/src/helpers/esp32/ESPNOWRadio.h index fd3e241e..b0533cd8 100644 --- a/src/helpers/esp32/ESPNOWRadio.h +++ b/src/helpers/esp32/ESPNOWRadio.h @@ -22,6 +22,7 @@ public: virtual float getLastSNR() const override; float packetScore(float snr, int packet_len) override { return 0; } + uint32_t intID(); }; #if ESPNOW_DEBUG_LOGGING && ARDUINO diff --git a/variants/espnow_c3/platformio.ini b/variants/espnow_c3/platformio.ini index 48af00ef..171878a7 100644 --- a/variants/espnow_c3/platformio.ini +++ b/variants/espnow_c3/platformio.ini @@ -3,11 +3,14 @@ [env:Generic_C3_ESPNOW_terminal_chat] extends = esp32_base -;board = esp32-c3-devkitm-1 -board = esp32-s3-devkitc-1 +board = esp32-c3-devkitm-1 +;board = esp32-s3-devkitc-1 build_flags = ${esp32_base.build_flags} -I variants/espnow_c3 + -D ARDUINO_USB_MODE=1 + -D ARDUINO_USB_CDC_ON_BOOT=1 + -D ESP32_CPU_FREQ=80 -D MAX_CONTACTS=100 -D MAX_GROUP_CHANNELS=1 -D ESPNOW_DEBUG_LOGGING=1 @@ -23,3 +26,31 @@ build_src_filter = ${esp32_base.build_src_filter} lib_deps = ${esp32_base.lib_deps} densaugeo/base64 @ ~1.4.0 + +[env:Generic_C3_ESPNOW_repeater] +extends = esp32_base +board = esp32-c3-devkitm-1 +;board = esp32-s3-devkitc-1 +build_flags = + ${esp32_base.build_flags} + -I variants/espnow_c3 + -D ARDUINO_USB_MODE=1 + -D ARDUINO_USB_CDC_ON_BOOT=1 + -D ESP32_CPU_FREQ=80 + -D ESPNOW_DEBUG_LOGGING=1 +; -D P_LORA_TX_LED=8 +; -D P_LORA_TX_LED=35 + -D PIN_USER_BTN=0 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 + -D ADVERT_NAME='"ESPNOW Repeater"' + -D ADVERT_LAT=-37.0 + -D ADVERT_LON=145.0 + -D ADMIN_PASSWORD='"password"' +build_src_filter = ${esp32_base.build_src_filter} + +<../examples/simple_repeater/main.cpp> + + + +<../variants/espnow_c3> +lib_deps = + ${esp32_base.lib_deps} + densaugeo/base64 @ ~1.4.0 From 1220c69aa98362d8a9c42a2b4b552fdaa07fbad8 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Tue, 25 Mar 2025 15:13:07 +1100 Subject: [PATCH 03/18] * wifi power max --- examples/simple_secure_chat/main.cpp | 6 +++--- src/helpers/esp32/ESPNOWRadio.cpp | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 8fed83d4..d80f7433 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -544,9 +544,9 @@ void setup() { fast_rng.begin(radio.random(0x7FFFFFFF)); #else char c = 0; - while (c != '\n') { // wait for ENTER to be pressed - if (Serial.available()) c = Serial.read(); - } +// while (c != '\n') { // wait for ENTER to be pressed +// if (Serial.available()) c = Serial.read(); +// } fast_rng.begin(millis()); #endif diff --git a/src/helpers/esp32/ESPNOWRadio.cpp b/src/helpers/esp32/ESPNOWRadio.cpp index 323392d3..b904e403 100644 --- a/src/helpers/esp32/ESPNOWRadio.cpp +++ b/src/helpers/esp32/ESPNOWRadio.cpp @@ -1,6 +1,7 @@ #include "ESPNOWRadio.h" #include #include +#include static uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; static esp_now_peer_info_t peerInfo; @@ -31,6 +32,8 @@ void ESPNOWRadio::begin() { return; } + esp_wifi_set_max_tx_power(80); // should be 20dBm + esp_now_register_send_cb(OnDataSent); esp_now_register_recv_cb(OnDataRecv); From d32e641225e97ab5291c9bd7c2fdb4d8750a046e Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Tue, 25 Mar 2025 17:40:36 +1100 Subject: [PATCH 04/18] * fix for double radio.begin(). RNG seed from pressing ENTER --- examples/simple_secure_chat/main.cpp | 16 ++++++++++------ variants/espnow_c3/target.cpp | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index d80f7433..8c5ccbde 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -267,9 +267,9 @@ protected: public: #ifdef WRAPPER_CLASS - MyMesh(RadioLibWrapper& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) + MyMesh(RadioLibWrapper& radio, StdRNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) #else - MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) + MyMesh(mesh::Radio& radio, StdRNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) #endif : BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables) { @@ -298,6 +298,14 @@ public: IdentityStore store(fs, "/identity"); #endif if (!store.load("_main", self_id, _prefs.node_name, sizeof(_prefs.node_name))) { // legacy: node_name was from identity file + // Need way to get some entropy to seed RNG + Serial.println("Press ENTER to generate key:"); + char c = 0; + while (c != '\n') { // wait for ENTER to be pressed + if (Serial.available()) c = Serial.read(); + } + ((StdRNG *)getRNG())->begin(millis()); + self_id = mesh::LocalIdentity(getRNG()); // create new random identity store.save("_main", self_id); } @@ -543,10 +551,6 @@ void setup() { #ifdef WRAPPER_CLASS fast_rng.begin(radio.random(0x7FFFFFFF)); #else - char c = 0; -// while (c != '\n') { // wait for ENTER to be pressed -// if (Serial.available()) c = Serial.read(); -// } fast_rng.begin(millis()); #endif diff --git a/variants/espnow_c3/target.cpp b/variants/espnow_c3/target.cpp index 8daa0cfe..c4fea553 100644 --- a/variants/espnow_c3/target.cpp +++ b/variants/espnow_c3/target.cpp @@ -6,6 +6,6 @@ ESP32Board board; ESPNOWRadio radio; bool radio_init() { - radio.begin(); + // NOTE: radio.begin() is called by Dispatcher::begin(), so not needed here return true; // success } From 321a9425da79181bd003cb05ddd83cdb38d58a22 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Wed, 26 Mar 2025 03:57:36 +1100 Subject: [PATCH 05/18] * experiment: enabling forwarding in terminal chat --- examples/simple_secure_chat/main.cpp | 4 ++++ src/helpers/esp32/ESPNOWRadio.cpp | 2 +- variants/espnow_c3/platformio.ini | 12 ++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 8c5ccbde..857795cd 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -196,6 +196,10 @@ protected: return 0; // disable rxdelay } + bool allowPacketForward(const mesh::Packet* packet) override { + return true; + } + void onDiscoveredContact(ContactInfo& contact, bool is_new) override { // TODO: if not in favs, prompt to add as fav(?) diff --git a/src/helpers/esp32/ESPNOWRadio.cpp b/src/helpers/esp32/ESPNOWRadio.cpp index b904e403..55ee7fb4 100644 --- a/src/helpers/esp32/ESPNOWRadio.cpp +++ b/src/helpers/esp32/ESPNOWRadio.cpp @@ -93,5 +93,5 @@ int ESPNOWRadio::recvRaw(uint8_t* bytes, int sz) { } uint32_t ESPNOWRadio::getEstAirtimeFor(int len_bytes) { - return 2; // Fast AF + return 4; // Fast AF } diff --git a/variants/espnow_c3/platformio.ini b/variants/espnow_c3/platformio.ini index 171878a7..c992a637 100644 --- a/variants/espnow_c3/platformio.ini +++ b/variants/espnow_c3/platformio.ini @@ -3,17 +3,17 @@ [env:Generic_C3_ESPNOW_terminal_chat] extends = esp32_base -board = esp32-c3-devkitm-1 -;board = esp32-s3-devkitc-1 +;board = esp32-c3-devkitm-1 +board = esp32-s3-devkitc-1 build_flags = ${esp32_base.build_flags} -I variants/espnow_c3 - -D ARDUINO_USB_MODE=1 - -D ARDUINO_USB_CDC_ON_BOOT=1 - -D ESP32_CPU_FREQ=80 +; -D ARDUINO_USB_MODE=1 +; -D ARDUINO_USB_CDC_ON_BOOT=1 +; -D ESP32_CPU_FREQ=80 -D MAX_CONTACTS=100 -D MAX_GROUP_CHANNELS=1 - -D ESPNOW_DEBUG_LOGGING=1 +; -D ESPNOW_DEBUG_LOGGING=1 ; -D P_LORA_TX_LED=8 -D P_LORA_TX_LED=35 -D PIN_USER_BTN=0 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 06/18] 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 07/18] 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 08/18] 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 09/18] * 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); From 2224bddcb5733c7b3ded0b4f63a89db6e2153c82 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Thu, 27 Mar 2025 19:34:16 +1100 Subject: [PATCH 10/18] * new ESPNOWRadio driver * refactored the examples/*/main.cpp modules, moving radio specifics to variants/*/target modules * new Generic_ESPNOW_* target envs --- examples/companion_radio/main.cpp | 43 +++++-------- examples/simple_repeater/main.cpp | 63 ++++--------------- examples/simple_room_server/main.cpp | 64 ++++---------------- examples/simple_secure_chat/main.cpp | 34 ++--------- src/helpers/ESP32Board.h | 2 + src/helpers/esp32/ESPNOWRadio.cpp | 6 +- src/helpers/esp32/ESPNOWRadio.h | 1 + variants/espnow_c3/platformio.ini | 56 ----------------- variants/espnow_c3/target.cpp | 11 ---- variants/espnow_c3/target.h | 9 --- variants/generic_espnow/platformio.ini | 83 ++++++++++++++++++++++++++ variants/generic_espnow/target.cpp | 29 +++++++++ variants/generic_espnow/target.h | 13 ++++ variants/heltec_v2/target.cpp | 22 +++++++ variants/heltec_v2/target.h | 9 ++- variants/heltec_v3/target.cpp | 22 +++++++ variants/heltec_v3/target.h | 9 ++- variants/lilygo_t3s3/target.cpp | 22 +++++++ variants/lilygo_t3s3/target.h | 9 ++- variants/lilygo_tbeam/target.cpp | 22 +++++++ variants/lilygo_tbeam/target.h | 9 ++- variants/lilygo_tlora_v2_1/target.cpp | 22 +++++++ variants/lilygo_tlora_v2_1/target.h | 9 ++- variants/promicro/target.cpp | 22 +++++++ variants/promicro/target.h | 9 ++- variants/rak4631/target.cpp | 22 +++++++ variants/rak4631/target.h | 9 ++- variants/station_g2/target.cpp | 22 +++++++ variants/station_g2/target.h | 9 ++- variants/t1000-e/target.cpp | 22 +++++++ variants/t1000-e/target.h | 9 ++- variants/t114/target.cpp | 22 +++++++ variants/t114/target.h | 9 ++- variants/techo/target.cpp | 22 +++++++ variants/techo/target.h | 9 ++- variants/xiao_c3/target.cpp | 22 +++++++ variants/xiao_c3/target.h | 9 ++- variants/xiao_s3_wio/target.cpp | 22 +++++++ variants/xiao_s3_wio/target.h | 9 ++- 39 files changed, 568 insertions(+), 249 deletions(-) delete mode 100644 variants/espnow_c3/platformio.ini delete mode 100644 variants/espnow_c3/target.cpp delete mode 100644 variants/espnow_c3/target.h create mode 100644 variants/generic_espnow/platformio.ini create mode 100644 variants/generic_espnow/target.cpp create mode 100644 variants/generic_espnow/target.h diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index bb82742e..02afdafa 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -7,9 +7,6 @@ #include #endif -#define RADIOLIB_STATIC_ONLY 1 -#include -#include #include #include #include @@ -197,7 +194,6 @@ struct NodePrefs { // persisted to file class MyMesh : public BaseChatMesh { FILESYSTEM* _fs; - RADIO_CLASS* _phy; IdentityStore* _identity_store; NodePrefs _prefs; uint32_t pending_login; @@ -229,9 +225,9 @@ class MyMesh : public BaseChatMesh { AckTableEntry expected_ack_table[EXPECTED_ACK_TABLE_SIZE]; // circular table int next_ack_idx; - void loadMainIdentity(mesh::RNG& trng) { + void loadMainIdentity() { if (!_identity_store->load("_main", self_id)) { - self_id = mesh::LocalIdentity(&trng); // create new random identity + self_id = radio_new_identity(); // create new random identity saveMainIdentity(self_id); } } @@ -709,8 +705,8 @@ protected: public: - MyMesh(RADIO_CLASS& phy, RadioLibWrapper& rw, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) - : BaseChatMesh(rw, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables), _serial(NULL), _phy(&phy) + MyMesh(mesh::Radio& radio, mesh::RNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) + : BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables), _serial(NULL) { _iter_started = false; offline_queue_len = 0; @@ -767,7 +763,7 @@ public: } } - void begin(FILESYSTEM& fs, mesh::RNG& trng, bool has_display) { + void begin(FILESYSTEM& fs, bool has_display) { _fs = &fs; BaseChatMesh::begin(); @@ -778,7 +774,7 @@ public: _identity_store = new IdentityStore(fs, "/identity"); #endif - loadMainIdentity(trng); + loadMainIdentity(); // load persisted prefs if (_fs->exists("/new_prefs")) { @@ -793,7 +789,8 @@ public: if (_prefs.ble_pin == 0) { #ifdef HAS_UI if (has_display) { - _active_ble_pin = trng.nextInt(100000, 999999); // random pin each session + StdRNG rng; + _active_ble_pin = rng.nextInt(100000, 999999); // random pin each session } else { _active_ble_pin = BLE_PIN_CODE; // otherwise static pin } @@ -814,11 +811,8 @@ public: addChannel("Public", PUBLIC_GROUP_PSK); // pre-configure Andy's public channel loadChannels(); - _phy->setFrequency(_prefs.freq); - _phy->setSpreadingFactor(_prefs.sf); - _phy->setBandwidth(_prefs.bw); - _phy->setCodingRate(_prefs.cr); - _phy->setOutputPower(_prefs.tx_power_dbm); + radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_set_tx_power(_prefs.tx_power_dbm); } const char* getNodeName() { return _prefs.node_name; } @@ -1153,10 +1147,7 @@ public: _prefs.bw = (float)bw / 1000.0; savePrefs(); - _phy->setFrequency(_prefs.freq); - _phy->setSpreadingFactor(_prefs.sf); - _phy->setBandwidth(_prefs.bw); - _phy->setCodingRate(_prefs.cr); + radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); MESH_DEBUG_PRINTLN("OK: CMD_SET_RADIO_PARAMS: f=%d, bw=%d, sf=%d, cr=%d", freq, bw, (uint32_t)sf, (uint32_t)cr); writeOKFrame(); @@ -1170,7 +1161,7 @@ public: } else { _prefs.tx_power_dbm = cmd_frame[1]; savePrefs(); - _phy->setOutputPower(_prefs.tx_power_dbm); + radio_set_tx_power(_prefs.tx_power_dbm); writeOKFrame(); } } else if (cmd_frame[0] == CMD_SET_TUNING_PARAMS) { @@ -1431,7 +1422,7 @@ public: StdRNG fast_rng; SimpleMeshTables tables; -MyMesh the_mesh(radio, *new WRAPPER_CLASS(radio, board), fast_rng, *new VolatileRTCClock(), tables); +MyMesh the_mesh(radio_driver, fast_rng, *new VolatileRTCClock(), tables); void halt() { while (1) ; @@ -1444,9 +1435,7 @@ void setup() { if (!radio_init()) { halt(); } - fast_rng.begin(radio.random(0x7FFFFFFF)); - - RadioNoiseListener trng(radio); + fast_rng.begin(radio_get_rng_seed()); #ifdef HAS_UI DisplayDriver* disp = NULL; @@ -1459,7 +1448,7 @@ void setup() { #if defined(NRF52_PLATFORM) InternalFS.begin(); - the_mesh.begin(InternalFS, trng, + the_mesh.begin(InternalFS, #ifdef HAS_UI disp != NULL #else @@ -1477,7 +1466,7 @@ void setup() { the_mesh.startInterface(serial_interface); #elif defined(ESP32) SPIFFS.begin(true); - the_mesh.begin(SPIFFS, trng, + the_mesh.begin(SPIFFS, #ifdef HAS_UI disp != NULL #else diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index a5a4bf3d..dca1f631 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -7,11 +7,6 @@ #include #endif -#ifdef WRAPPER_CLASS -#define RADIOLIB_STATIC_ONLY 1 -#include -#endif - #include #include #include @@ -112,13 +107,6 @@ struct ClientInfo { class MyMesh : public mesh::Mesh, public CommonCLICallbacks { FILESYSTEM* _fs; -#ifdef WRAPPER_CLASS - RadioLibWrapper* my_radio; - RADIO_CLASS* _phy; -#else - ESPNOWRadio* my_radio; -#endif - mesh::MainBoard* _board; unsigned long next_local_advert, next_flood_advert; bool _logging; NodePrefs _prefs; @@ -154,9 +142,9 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { stats.batt_milli_volts = board.getBattMilliVolts(); stats.curr_tx_queue_len = _mgr->getOutboundCount(); stats.curr_free_queue_len = _mgr->getFreeCount(); - stats.last_rssi = (int16_t) my_radio->getLastRSSI(); - stats.n_packets_recv = my_radio->getPacketsRecv(); - stats.n_packets_sent = my_radio->getPacketsSent(); + stats.last_rssi = (int16_t) radio_driver.getLastRSSI(); + stats.n_packets_recv = radio_driver.getPacketsRecv(); + stats.n_packets_sent = radio_driver.getPacketsSent(); stats.total_air_time_secs = getTotalAirTime() / 1000; stats.total_up_time_secs = _ms->getMillis() / 1000; stats.n_sent_flood = getNumSentFlood(); @@ -164,7 +152,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { stats.n_recv_flood = getNumRecvFlood(); stats.n_recv_direct = getNumRecvDirect(); stats.n_full_events = getNumFullEvents(); - stats.last_snr = (int16_t)(my_radio->getLastSNR() * 4); + stats.last_snr = (int16_t)(radio_driver.getLastSNR() * 4); stats.n_direct_dups = ((SimpleMeshTables *)getTables())->getNumDirectDups(); stats.n_flood_dups = ((SimpleMeshTables *)getTables())->getNumFloodDups(); @@ -481,17 +469,10 @@ protected: } public: -#ifdef WRAPPER_CLASS - MyMesh(RADIO_CLASS& phy, mesh::MainBoard& board, RadioLibWrapper& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) + MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), - _phy(&phy), _board(&board), _cli(board, this, &_prefs, this) -#else - MyMesh(mesh::MainBoard& board, ESPNOWRadio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) - : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), - _board(&board), _cli(board, this, &_prefs, this) -#endif + _cli(board, this, &_prefs, this) { - my_radio = &radio; memset(known_clients, 0, sizeof(known_clients)); next_local_advert = next_flood_advert = 0; _logging = false; @@ -523,13 +504,8 @@ public: // load persisted prefs _cli.loadPrefs(_fs); - #ifdef WRAPPER_CLASS - _phy->setFrequency(_prefs.freq); - _phy->setSpreadingFactor(_prefs.sf); - _phy->setBandwidth(_prefs.bw); - _phy->setCodingRate(_prefs.cr); - _phy->setOutputPower(_prefs.tx_power_dbm); - #endif + radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_set_tx_power(_prefs.tx_power_dbm); updateAdvertTimer(); updateFloodAdvertTimer(); @@ -597,9 +573,7 @@ public: } void setTxPower(uint8_t power_dbm) override { - #ifdef WRAPPER_CLASS - _phy->setOutputPower(power_dbm); - #endif + radio_set_tx_power(power_dbm); } void loop() { @@ -633,11 +607,7 @@ VolatileRTCClock fallback_clock; #endif AutoDiscoverRTCClock rtc_clock(fallback_clock); -#ifdef WRAPPER_CLASS -MyMesh the_mesh(radio, board, *new WRAPPER_CLASS(radio, board), *new ArduinoMillis(), fast_rng, rtc_clock, tables); -#else -MyMesh the_mesh(board, radio, *new ArduinoMillis(), fast_rng, rtc_clock, tables); -#endif +MyMesh the_mesh(board, radio_driver, *new ArduinoMillis(), fast_rng, rtc_clock, tables); void halt() { while (1) ; @@ -657,11 +627,7 @@ void setup() { if (!radio_init()) { halt(); } -#ifdef WRAPPER_CLASS - fast_rng.begin(radio.random(0x7FFFFFFF)); -#else - fast_rng.begin(radio.intID()); -#endif + fast_rng.begin(radio_get_rng_seed()); FILESYSTEM* fs; #if defined(NRF52_PLATFORM) @@ -677,12 +643,7 @@ void setup() { #endif if (!store.load("_main", the_mesh.self_id)) { MESH_DEBUG_PRINTLN("Generating new keypair"); - #ifdef WRAPPER_CLASS - RadioNoiseListener rng(radio); - #else - #define rng fast_rng - #endif - the_mesh.self_id = mesh::LocalIdentity(&rng); // create new random identity + the_mesh.self_id = radio_new_identity(); // create new random identity store.save("_main", the_mesh.self_id); } diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index c1703652..6d214a78 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -7,11 +7,6 @@ #include #endif -#ifdef WRAPPER_CLASS -#define RADIOLIB_STATIC_ONLY 1 -#include -#endif - #include #include #include @@ -147,13 +142,6 @@ struct ServerStats { class MyMesh : public mesh::Mesh, public CommonCLICallbacks { FILESYSTEM* _fs; -#ifdef WRAPPER_CLASS - RadioLibWrapper* my_radio; - RADIO_CLASS* _phy; -#else - ESPNOWRadio* my_radio; -#endif - mesh::MainBoard* _board; unsigned long next_local_advert, next_flood_advert; bool _logging; NodePrefs _prefs; @@ -591,9 +579,9 @@ protected: stats.batt_milli_volts = board.getBattMilliVolts(); stats.curr_tx_queue_len = _mgr->getOutboundCount(); stats.curr_free_queue_len = _mgr->getFreeCount(); - stats.last_rssi = (int16_t) my_radio->getLastRSSI(); - stats.n_packets_recv = my_radio->getPacketsRecv(); - stats.n_packets_sent = my_radio->getPacketsSent(); + stats.last_rssi = (int16_t) radio_driver.getLastRSSI(); + stats.n_packets_recv = radio_driver.getPacketsRecv(); + stats.n_packets_sent = radio_driver.getPacketsSent(); stats.total_air_time_secs = getTotalAirTime() / 1000; stats.total_up_time_secs = _ms->getMillis() / 1000; stats.n_sent_flood = getNumSentFlood(); @@ -601,7 +589,7 @@ protected: stats.n_recv_flood = getNumRecvFlood(); stats.n_recv_direct = getNumRecvDirect(); stats.n_full_events = getNumFullEvents(); - stats.last_snr = (int16_t)(my_radio->getLastSNR() * 4); + stats.last_snr = (int16_t)(radio_driver.getLastSNR() * 4); stats.n_direct_dups = ((SimpleMeshTables *)getTables())->getNumDirectDups(); stats.n_flood_dups = ((SimpleMeshTables *)getTables())->getNumFloodDups(); stats.n_posted = _num_posted; @@ -660,17 +648,10 @@ protected: } public: -#ifdef WRAPPER_CLASS - MyMesh(RADIO_CLASS& phy, mesh::MainBoard& board, RadioLibWrapper& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) + MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), - _phy(&phy), _board(&board), _cli(board, this, &_prefs, this) -#else - MyMesh(mesh::MainBoard& board, ESPNOWRadio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables) - : mesh::Mesh(radio, ms, rng, rtc, *new StaticPoolPacketManager(32), tables), - _board(&board), _cli(board, this, &_prefs, this) -#endif + _cli(board, this, &_prefs, this) { - my_radio = &radio; next_local_advert = next_flood_advert = 0; _logging = false; @@ -712,15 +693,11 @@ public: // load persisted prefs _cli.loadPrefs(_fs); - #ifdef WRAPPER_CLASS - _phy->setFrequency(_prefs.freq); - _phy->setSpreadingFactor(_prefs.sf); - _phy->setBandwidth(_prefs.bw); - _phy->setCodingRate(_prefs.cr); - _phy->setOutputPower(_prefs.tx_power_dbm); - #endif + radio_set_params(_prefs.freq, _prefs.bw, _prefs.sf, _prefs.cr); + radio_set_tx_power(_prefs.tx_power_dbm); updateAdvertTimer(); + updateFloodAdvertTimer(); } const char* getFirmwareVer() override { return FIRMWARE_VERSION; } @@ -785,9 +762,7 @@ public: } void setTxPower(uint8_t power_dbm) override { - #ifdef WRAPPER_CLASS - _phy->setOutputPower(power_dbm); - #endif + radio_set_tx_power(power_dbm); } void loop() { @@ -856,11 +831,7 @@ VolatileRTCClock fallback_clock; #endif AutoDiscoverRTCClock rtc_clock(fallback_clock); -#ifdef WRAPPER_CLASS -MyMesh the_mesh(radio, board, *new WRAPPER_CLASS(radio, board), *new ArduinoMillis(), fast_rng, rtc_clock, tables); -#else -MyMesh the_mesh(board, radio, *new ArduinoMillis(), fast_rng, rtc_clock, tables); -#endif +MyMesh the_mesh(board, radio_driver, *new ArduinoMillis(), fast_rng, rtc_clock, tables); void halt() { while (1) ; @@ -880,11 +851,7 @@ void setup() { if (!radio_init()) { halt(); } -#ifdef WRAPPER_CLASS - fast_rng.begin(radio.random(0x7FFFFFFF)); -#else - fast_rng.begin(radio.intID()); -#endif + fast_rng.begin(radio_get_rng_seed()); FILESYSTEM* fs; #if defined(NRF52_PLATFORM) @@ -899,12 +866,7 @@ void setup() { #error "need to define filesystem" #endif if (!store.load("_main", the_mesh.self_id)) { - #ifdef WRAPPER_CLASS - RadioNoiseListener rng(radio); - #else - #define rng fast_rng - #endif - the_mesh.self_id = mesh::LocalIdentity(&rng); // create new random identity + the_mesh.self_id = radio_new_identity(); // create new random identity store.save("_main", the_mesh.self_id); } diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 857795cd..59072dc4 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -7,12 +7,6 @@ #include #endif -#ifdef WRAPPER_CLASS -#define RADIOLIB_STATIC_ONLY 1 -#include -#include -#endif - #include #include #include @@ -269,12 +263,7 @@ protected: } public: - -#ifdef WRAPPER_CLASS - MyMesh(RadioLibWrapper& radio, StdRNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) -#else MyMesh(mesh::Radio& radio, StdRNG& rng, mesh::RTCClock& rtc, SimpleMeshTables& tables) -#endif : BaseChatMesh(radio, *new ArduinoMillis(), rng, rtc, *new StaticPoolPacketManager(16), tables) { // defaults @@ -534,12 +523,7 @@ public: StdRNG fast_rng; SimpleMeshTables tables; - -#ifdef WRAPPER_CLASS -MyMesh the_mesh(*new WRAPPER_CLASS(radio, board), fast_rng, *new VolatileRTCClock(), tables); -#else -MyMesh the_mesh(radio, fast_rng, *new VolatileRTCClock(), tables); -#endif +MyMesh the_mesh(radio_driver, fast_rng, *new VolatileRTCClock(), tables); void halt() { while (1) ; @@ -552,11 +536,7 @@ void setup() { if (!radio_init()) { halt(); } -#ifdef WRAPPER_CLASS - fast_rng.begin(radio.random(0x7FFFFFFF)); -#else - fast_rng.begin(millis()); -#endif + fast_rng.begin(radio_get_rng_seed()); #if defined(NRF52_PLATFORM) InternalFS.begin(); @@ -568,14 +548,8 @@ void setup() { #error "need to define filesystem" #endif -#ifdef WRAPPER_CLASS - if (LORA_FREQ != the_mesh.getFreqPref()) { - radio.setFrequency(the_mesh.getFreqPref()); - } - if (LORA_TX_POWER != the_mesh.getTxPowerPref()) { - radio.setOutputPower(the_mesh.getTxPowerPref()); - } -#endif + radio_set_params(the_mesh.getFreqPref(), LORA_BW, LORA_SF, LORA_CR); + radio_set_tx_power(the_mesh.getTxPowerPref()); the_mesh.showWelcome(); diff --git a/src/helpers/ESP32Board.h b/src/helpers/ESP32Board.h index 77cfc7a0..4f90296e 100644 --- a/src/helpers/ESP32Board.h +++ b/src/helpers/ESP32Board.h @@ -34,7 +34,9 @@ public: #endif #if defined(PIN_BOARD_SDA) && defined(PIN_BOARD_SCL) + #if PIN_BOARD_SDA >= 0 && PIN_BOARD_SCL >= 0 Wire.begin(PIN_BOARD_SDA, PIN_BOARD_SCL); + #endif #else Wire.begin(); #endif diff --git a/src/helpers/esp32/ESPNOWRadio.cpp b/src/helpers/esp32/ESPNOWRadio.cpp index 55ee7fb4..d5c9df1e 100644 --- a/src/helpers/esp32/ESPNOWRadio.cpp +++ b/src/helpers/esp32/ESPNOWRadio.cpp @@ -50,6 +50,10 @@ void ESPNOWRadio::begin() { } } +void ESPNOWRadio::setTxPower(uint8_t dbm) { + esp_wifi_set_max_tx_power(dbm * 4); +} + uint32_t ESPNOWRadio::intID() { uint8_t mac[8]; memset(mac, 0, sizeof(mac)); @@ -58,7 +62,7 @@ uint32_t ESPNOWRadio::intID() { memcpy(&n, &mac[0], 4); memcpy(&m, &mac[4], 4); - return n * m; + return n + m; } void ESPNOWRadio::startSendRaw(const uint8_t* bytes, int len) { diff --git a/src/helpers/esp32/ESPNOWRadio.h b/src/helpers/esp32/ESPNOWRadio.h index b0533cd8..7e628344 100644 --- a/src/helpers/esp32/ESPNOWRadio.h +++ b/src/helpers/esp32/ESPNOWRadio.h @@ -23,6 +23,7 @@ public: float packetScore(float snr, int packet_len) override { return 0; } uint32_t intID(); + void setTxPower(uint8_t dbm); }; #if ESPNOW_DEBUG_LOGGING && ARDUINO diff --git a/variants/espnow_c3/platformio.ini b/variants/espnow_c3/platformio.ini deleted file mode 100644 index c992a637..00000000 --- a/variants/espnow_c3/platformio.ini +++ /dev/null @@ -1,56 +0,0 @@ - -; ----------- Generic ESP32-C3 ------------ - -[env:Generic_C3_ESPNOW_terminal_chat] -extends = esp32_base -;board = esp32-c3-devkitm-1 -board = esp32-s3-devkitc-1 -build_flags = - ${esp32_base.build_flags} - -I variants/espnow_c3 -; -D ARDUINO_USB_MODE=1 -; -D ARDUINO_USB_CDC_ON_BOOT=1 -; -D ESP32_CPU_FREQ=80 - -D MAX_CONTACTS=100 - -D MAX_GROUP_CHANNELS=1 -; -D ESPNOW_DEBUG_LOGGING=1 -; -D P_LORA_TX_LED=8 - -D P_LORA_TX_LED=35 - -D PIN_USER_BTN=0 -; -D MESH_PACKET_LOGGING=1 -; -D MESH_DEBUG=1 -build_src_filter = ${esp32_base.build_src_filter} - +<../examples/simple_secure_chat/main.cpp> - + - +<../variants/espnow_c3> -lib_deps = - ${esp32_base.lib_deps} - densaugeo/base64 @ ~1.4.0 - -[env:Generic_C3_ESPNOW_repeater] -extends = esp32_base -board = esp32-c3-devkitm-1 -;board = esp32-s3-devkitc-1 -build_flags = - ${esp32_base.build_flags} - -I variants/espnow_c3 - -D ARDUINO_USB_MODE=1 - -D ARDUINO_USB_CDC_ON_BOOT=1 - -D ESP32_CPU_FREQ=80 - -D ESPNOW_DEBUG_LOGGING=1 -; -D P_LORA_TX_LED=8 -; -D P_LORA_TX_LED=35 - -D PIN_USER_BTN=0 -; -D MESH_PACKET_LOGGING=1 -; -D MESH_DEBUG=1 - -D ADVERT_NAME='"ESPNOW Repeater"' - -D ADVERT_LAT=-37.0 - -D ADVERT_LON=145.0 - -D ADMIN_PASSWORD='"password"' -build_src_filter = ${esp32_base.build_src_filter} - +<../examples/simple_repeater/main.cpp> - + - +<../variants/espnow_c3> -lib_deps = - ${esp32_base.lib_deps} - densaugeo/base64 @ ~1.4.0 diff --git a/variants/espnow_c3/target.cpp b/variants/espnow_c3/target.cpp deleted file mode 100644 index c4fea553..00000000 --- a/variants/espnow_c3/target.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include "target.h" - -ESP32Board board; - -ESPNOWRadio radio; - -bool radio_init() { - // NOTE: radio.begin() is called by Dispatcher::begin(), so not needed here - return true; // success -} diff --git a/variants/espnow_c3/target.h b/variants/espnow_c3/target.h deleted file mode 100644 index 656687dc..00000000 --- a/variants/espnow_c3/target.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include -#include - -extern ESP32Board board; -extern ESPNOWRadio radio; - -bool radio_init(); diff --git a/variants/generic_espnow/platformio.ini b/variants/generic_espnow/platformio.ini new file mode 100644 index 00000000..06a85f7e --- /dev/null +++ b/variants/generic_espnow/platformio.ini @@ -0,0 +1,83 @@ + +; ----------- Generic ESP32-C3 ------------ + +[Generic_ESPNOW] +extends = esp32_base +board = esp32-c3-devkitm-1 +;board = esp32-s3-devkitm-1 +build_flags = + ${esp32_base.build_flags} + -I variants/generic_espnow +; -D ESP32_CPU_FREQ=80 + -D PIN_BOARD_SDA=-1 + -D PIN_BOARD_SCL=-1 +; -D P_LORA_TX_LED=8 + -D PIN_USER_BTN=0 +; -D ARDUINO_USB_MODE=1 +; -D ARDUINO_USB_CDC_ON_BOOT=1 +; -D ESPNOW_DEBUG_LOGGING=1 +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +build_src_filter = ${esp32_base.build_src_filter} + + + +<../variants/generic_espnow> + +[env:Generic_ESPNOW_terminal_chat] +extends = Generic_ESPNOW +build_flags = + ${Generic_ESPNOW.build_flags} + -D MAX_CONTACTS=100 + -D MAX_GROUP_CHANNELS=1 +build_src_filter = ${Generic_ESPNOW.build_src_filter} + +<../examples/simple_secure_chat/main.cpp> +lib_deps = + ${Generic_ESPNOW.lib_deps} + densaugeo/base64 @ ~1.4.0 + +[env:Generic_ESPNOW_repeater] +extends = Generic_ESPNOW +build_flags = + ${Generic_ESPNOW.build_flags} + -D ADVERT_NAME='"ESPNOW Repeater"' + -D ADVERT_LAT=-37.0 + -D ADVERT_LON=145.0 + -D ADMIN_PASSWORD='"password"' +build_src_filter = ${Generic_ESPNOW.build_src_filter} + +<../examples/simple_repeater/main.cpp> +lib_deps = + ${Generic_ESPNOW.lib_deps} + ${esp32_ota.lib_deps} + densaugeo/base64 @ ~1.4.0 + +[env:Generic_ESPNOW_companion_radio_usb] +extends = Generic_ESPNOW +build_flags = + ${Generic_ESPNOW.build_flags} + -D MAX_CONTACTS=100 + -D MAX_GROUP_CHANNELS=8 +; -D ENABLE_PRIVATE_KEY_IMPORT=1 +; -D ENABLE_PRIVATE_KEY_EXPORT=1 +; NOTE: DO NOT ENABLE --> -D MESH_PACKET_LOGGING=1 +; NOTE: DO NOT ENABLE --> -D MESH_DEBUG=1 +; NOTE: DO NOT ENABLE --> -D ESPNOW_DEBUG_LOGGING=1 +build_src_filter = ${Generic_ESPNOW.build_src_filter} + +<../examples/companion_radio/main.cpp> +lib_deps = + ${Generic_ESPNOW.lib_deps} + densaugeo/base64 @ ~1.4.0 + +[env:Generic_ESPNOW_room_server] +extends = Generic_ESPNOW +build_flags = + ${Generic_ESPNOW.build_flags} + -D ADVERT_NAME='"Heltec Room"' + -D ADVERT_LAT=-37.0 + -D ADVERT_LON=145.0 + -D ADMIN_PASSWORD='"password"' + -D ROOM_PASSWORD='"hello"' +build_src_filter = ${Generic_ESPNOW.build_src_filter} + +<../examples/simple_room_server/main.cpp> +lib_deps = + ${Generic_ESPNOW.lib_deps} + ${esp32_ota.lib_deps} + diff --git a/variants/generic_espnow/target.cpp b/variants/generic_espnow/target.cpp new file mode 100644 index 00000000..b64383c7 --- /dev/null +++ b/variants/generic_espnow/target.cpp @@ -0,0 +1,29 @@ +#include +#include "target.h" +#include + +ESP32Board board; + +ESPNOWRadio radio_driver; + +bool radio_init() { + // NOTE: radio_driver.begin() is called by Dispatcher::begin(), so not needed here + return true; // success +} + +uint32_t radio_get_rng_seed() { + return millis() + radio_driver.intID(); // TODO: where to get some entropy? +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + // no-op +} + +void radio_set_tx_power(uint8_t dbm) { + radio_driver.setTxPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + StdRNG rng; // TODO: need stronger True-RNG here + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/generic_espnow/target.h b/variants/generic_espnow/target.h new file mode 100644 index 00000000..095e787d --- /dev/null +++ b/variants/generic_espnow/target.h @@ -0,0 +1,13 @@ +#pragma once + +#include +#include + +extern ESP32Board board; +extern ESPNOWRadio radio_driver; + +bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_v2/target.cpp b/variants/heltec_v2/target.cpp index 5f2251b2..87f3fa9d 100644 --- a/variants/heltec_v2/target.cpp +++ b/variants/heltec_v2/target.cpp @@ -10,6 +10,8 @@ HeltecV2Board board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); #endif +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -29,3 +31,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/heltec_v2/target.h b/variants/heltec_v2/target.h index 999e15f7..8480c5b7 100644 --- a/variants/heltec_v2/target.h +++ b/variants/heltec_v2/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern HeltecV2Board board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/heltec_v3/target.cpp b/variants/heltec_v3/target.cpp index decffa9e..5cc5300d 100644 --- a/variants/heltec_v3/target.cpp +++ b/variants/heltec_v3/target.cpp @@ -10,6 +10,8 @@ HeltecV3Board board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); #endif +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -45,3 +47,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/heltec_v3/target.h b/variants/heltec_v3/target.h index 1d1007f9..075626a1 100644 --- a/variants/heltec_v3/target.h +++ b/variants/heltec_v3/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern HeltecV3Board board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_t3s3/target.cpp b/variants/lilygo_t3s3/target.cpp index 6ae1a533..ac19506a 100644 --- a/variants/lilygo_t3s3/target.cpp +++ b/variants/lilygo_t3s3/target.cpp @@ -10,6 +10,8 @@ ESP32Board board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); #endif +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -45,3 +47,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/lilygo_t3s3/target.h b/variants/lilygo_t3s3/target.h index 90c629db..dfd76c96 100644 --- a/variants/lilygo_t3s3/target.h +++ b/variants/lilygo_t3s3/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern ESP32Board board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_tbeam/target.cpp b/variants/lilygo_tbeam/target.cpp index 22493327..5e63dcae 100644 --- a/variants/lilygo_tbeam/target.cpp +++ b/variants/lilygo_tbeam/target.cpp @@ -10,6 +10,8 @@ TBeamBoard board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); #endif +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -29,3 +31,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/lilygo_tbeam/target.h b/variants/lilygo_tbeam/target.h index 699bd964..070e5300 100644 --- a/variants/lilygo_tbeam/target.h +++ b/variants/lilygo_tbeam/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern TBeamBoard board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/lilygo_tlora_v2_1/target.cpp b/variants/lilygo_tlora_v2_1/target.cpp index cd22a6ec..4090ca52 100644 --- a/variants/lilygo_tlora_v2_1/target.cpp +++ b/variants/lilygo_tlora_v2_1/target.cpp @@ -6,6 +6,8 @@ LilyGoTLoraBoard board; static SPIClass spi; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_0, P_LORA_RESET, P_LORA_DIO_1, spi); +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -23,3 +25,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/lilygo_tlora_v2_1/target.h b/variants/lilygo_tlora_v2_1/target.h index 757460f8..610e7977 100644 --- a/variants/lilygo_tlora_v2_1/target.h +++ b/variants/lilygo_tlora_v2_1/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern LilyGoTLoraBoard board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/promicro/target.cpp b/variants/promicro/target.cpp index 45488f21..fb282b19 100644 --- a/variants/promicro/target.cpp +++ b/variants/promicro/target.cpp @@ -5,6 +5,8 @@ FaketecBoard board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -44,3 +46,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/promicro/target.h b/variants/promicro/target.h index 8dacb826..b0c69eeb 100644 --- a/variants/promicro/target.h +++ b/variants/promicro/target.h @@ -1,10 +1,17 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include #include extern FaketecBoard board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/rak4631/target.cpp b/variants/rak4631/target.cpp index c4155182..3a25be56 100644 --- a/variants/rak4631/target.cpp +++ b/variants/rak4631/target.cpp @@ -5,6 +5,8 @@ RAK4631Board board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -39,3 +41,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/rak4631/target.h b/variants/rak4631/target.h index d03485b6..c36cd939 100644 --- a/variants/rak4631/target.h +++ b/variants/rak4631/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern RAK4631Board board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/station_g2/target.cpp b/variants/station_g2/target.cpp index c6c0505f..5017ceaa 100644 --- a/variants/station_g2/target.cpp +++ b/variants/station_g2/target.cpp @@ -10,6 +10,8 @@ StationG2Board board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); #endif +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -45,3 +47,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/station_g2/target.h b/variants/station_g2/target.h index faae2378..9e52b24a 100644 --- a/variants/station_g2/target.h +++ b/variants/station_g2/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern StationG2Board board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/t1000-e/target.cpp b/variants/t1000-e/target.cpp index 7b4aa43a..e71e5d44 100644 --- a/variants/t1000-e/target.cpp +++ b/variants/t1000-e/target.cpp @@ -5,6 +5,8 @@ T1000eBoard board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -58,3 +60,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/t1000-e/target.h b/variants/t1000-e/target.h index fd118ea9..b2331cab 100644 --- a/variants/t1000-e/target.h +++ b/variants/t1000-e/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern T1000eBoard board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/t114/target.cpp b/variants/t114/target.cpp index e6da1ffb..d474e25c 100644 --- a/variants/t114/target.cpp +++ b/variants/t114/target.cpp @@ -5,6 +5,8 @@ T114Board board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -39,3 +41,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/t114/target.h b/variants/t114/target.h index 301d0849..a6f98dbb 100644 --- a/variants/t114/target.h +++ b/variants/t114/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern T114Board board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/techo/target.cpp b/variants/techo/target.cpp index a5592ba5..c5522799 100644 --- a/variants/techo/target.cpp +++ b/variants/techo/target.cpp @@ -5,6 +5,8 @@ TechoBoard board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY, SPI); +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -39,3 +41,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/techo/target.h b/variants/techo/target.h index d2ed51b1..921657ff 100644 --- a/variants/techo/target.h +++ b/variants/techo/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern TechoBoard board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/xiao_c3/target.cpp b/variants/xiao_c3/target.cpp index ffe17979..2d2098f5 100644 --- a/variants/xiao_c3/target.cpp +++ b/variants/xiao_c3/target.cpp @@ -10,6 +10,8 @@ XiaoC3Board board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); #endif +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -45,3 +47,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/xiao_c3/target.h b/variants/xiao_c3/target.h index e0ff1d0d..d4b02364 100644 --- a/variants/xiao_c3/target.h +++ b/variants/xiao_c3/target.h @@ -1,10 +1,17 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include #include extern XiaoC3Board board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); diff --git a/variants/xiao_s3_wio/target.cpp b/variants/xiao_s3_wio/target.cpp index 6ae1a533..ac19506a 100644 --- a/variants/xiao_s3_wio/target.cpp +++ b/variants/xiao_s3_wio/target.cpp @@ -10,6 +10,8 @@ ESP32Board board; RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BUSY); #endif +WRAPPER_CLASS radio_driver(radio, board); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -45,3 +47,23 @@ bool radio_init() { return true; // success } + +uint32_t radio_get_rng_seed() { + return radio.random(0x7FFFFFFF); +} + +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr) { + radio.setFrequency(freq); + radio.setSpreadingFactor(sf); + radio.setBandwidth(bw); + radio.setCodingRate(cr); +} + +void radio_set_tx_power(uint8_t dbm) { + radio.setOutputPower(dbm); +} + +mesh::LocalIdentity radio_new_identity() { + RadioNoiseListener rng(radio); + return mesh::LocalIdentity(&rng); // create new random identity +} diff --git a/variants/xiao_s3_wio/target.h b/variants/xiao_s3_wio/target.h index 90c629db..dfd76c96 100644 --- a/variants/xiao_s3_wio/target.h +++ b/variants/xiao_s3_wio/target.h @@ -1,9 +1,16 @@ #pragma once +#define RADIOLIB_STATIC_ONLY 1 +#include +#include #include #include extern ESP32Board board; -extern RADIO_CLASS radio; +extern WRAPPER_CLASS radio_driver; bool radio_init(); +uint32_t radio_get_rng_seed(); +void radio_set_params(float freq, float bw, uint8_t sf, uint8_t cr); +void radio_set_tx_power(uint8_t dbm); +mesh::LocalIdentity radio_new_identity(); From c0cb57be5c5c08774549cd7ee304eae8755b5af7 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Thu, 27 Mar 2025 21:28:06 +1100 Subject: [PATCH 11/18] * refactor: rtc_clock now defined by variants/*/target modules --- examples/companion_radio/main.cpp | 2 +- examples/simple_repeater/main.cpp | 12 ------------ examples/simple_room_server/main.cpp | 13 ------------- examples/simple_secure_chat/main.cpp | 2 +- variants/generic_espnow/target.cpp | 4 ++++ variants/generic_espnow/target.h | 1 + variants/heltec_v2/target.cpp | 6 ++++++ variants/heltec_v2/target.h | 2 ++ variants/heltec_v3/target.cpp | 6 ++++++ variants/heltec_v3/target.h | 2 ++ variants/lilygo_t3s3/target.cpp | 6 ++++++ variants/lilygo_t3s3/target.h | 2 ++ variants/lilygo_tbeam/target.cpp | 6 ++++++ variants/lilygo_tbeam/target.h | 2 ++ variants/lilygo_tlora_v2_1/target.cpp | 6 ++++++ variants/lilygo_tlora_v2_1/target.h | 2 ++ variants/promicro/target.cpp | 6 ++++++ variants/promicro/target.h | 2 ++ variants/rak4631/target.cpp | 6 ++++++ variants/rak4631/target.h | 2 ++ variants/station_g2/target.cpp | 6 ++++++ variants/station_g2/target.h | 2 ++ variants/t1000-e/target.cpp | 6 ++++++ variants/t1000-e/target.h | 2 ++ variants/t114/target.cpp | 6 ++++++ variants/t114/target.h | 2 ++ variants/techo/target.cpp | 6 ++++++ variants/techo/target.h | 2 ++ variants/xiao_c3/target.cpp | 6 ++++++ variants/xiao_c3/target.h | 2 ++ variants/xiao_s3_wio/target.cpp | 6 ++++++ variants/xiao_s3_wio/target.h | 2 ++ 32 files changed, 111 insertions(+), 27 deletions(-) diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 02afdafa..f9171c0e 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -1422,7 +1422,7 @@ public: StdRNG fast_rng; SimpleMeshTables tables; -MyMesh the_mesh(radio_driver, fast_rng, *new VolatileRTCClock(), tables); +MyMesh the_mesh(radio_driver, fast_rng, *new VolatileRTCClock(), tables); // TODO: test with 'rtc_clock' in target.cpp void halt() { while (1) ; diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index dca1f631..67c58068 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -600,13 +599,6 @@ public: StdRNG fast_rng; SimpleMeshTables tables; -#ifdef ESP32 -ESP32RTCClock fallback_clock; -#else -VolatileRTCClock fallback_clock; -#endif -AutoDiscoverRTCClock rtc_clock(fallback_clock); - MyMesh the_mesh(board, radio_driver, *new ArduinoMillis(), fast_rng, rtc_clock, tables); void halt() { @@ -620,10 +612,6 @@ void setup() { delay(1000); board.begin(); -#ifdef ESP32 - fallback_clock.begin(); -#endif - rtc_clock.begin(Wire); if (!radio_init()) { halt(); } diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index 6d214a78..8a8232be 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -823,14 +822,6 @@ public: StdRNG fast_rng; SimpleMeshTables tables; - -#ifdef ESP32 -ESP32RTCClock fallback_clock; -#else -VolatileRTCClock fallback_clock; -#endif -AutoDiscoverRTCClock rtc_clock(fallback_clock); - MyMesh the_mesh(board, radio_driver, *new ArduinoMillis(), fast_rng, rtc_clock, tables); void halt() { @@ -844,10 +835,6 @@ void setup() { delay(1000); board.begin(); -#ifdef ESP32 - fallback_clock.begin(); -#endif - rtc_clock.begin(Wire); if (!radio_init()) { halt(); } diff --git a/examples/simple_secure_chat/main.cpp b/examples/simple_secure_chat/main.cpp index 59072dc4..4b71811c 100644 --- a/examples/simple_secure_chat/main.cpp +++ b/examples/simple_secure_chat/main.cpp @@ -523,7 +523,7 @@ public: StdRNG fast_rng; SimpleMeshTables tables; -MyMesh the_mesh(radio_driver, fast_rng, *new VolatileRTCClock(), tables); +MyMesh the_mesh(radio_driver, fast_rng, *new VolatileRTCClock(), tables); // TODO: test with 'rtc_clock' in target.cpp void halt() { while (1) ; diff --git a/variants/generic_espnow/target.cpp b/variants/generic_espnow/target.cpp index b64383c7..a92b88ac 100644 --- a/variants/generic_espnow/target.cpp +++ b/variants/generic_espnow/target.cpp @@ -6,7 +6,11 @@ ESP32Board board; ESPNOWRadio radio_driver; +ESP32RTCClock rtc_clock; + bool radio_init() { + rtc_clock.begin(); + // NOTE: radio_driver.begin() is called by Dispatcher::begin(), so not needed here return true; // success } diff --git a/variants/generic_espnow/target.h b/variants/generic_espnow/target.h index 095e787d..16eeaa2e 100644 --- a/variants/generic_espnow/target.h +++ b/variants/generic_espnow/target.h @@ -5,6 +5,7 @@ extern ESP32Board board; extern ESPNOWRadio radio_driver; +extern ESP32RTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/heltec_v2/target.cpp b/variants/heltec_v2/target.cpp index 87f3fa9d..284fa600 100644 --- a/variants/heltec_v2/target.cpp +++ b/variants/heltec_v2/target.cpp @@ -12,11 +12,17 @@ HeltecV2Board board; WRAPPER_CLASS radio_driver(radio, board); +ESP32RTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + fallback_clock.begin(); + rtc_clock.begin(Wire); + #if defined(P_LORA_SCLK) spi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI); #endif diff --git a/variants/heltec_v2/target.h b/variants/heltec_v2/target.h index 8480c5b7..bfdb6132 100644 --- a/variants/heltec_v2/target.h +++ b/variants/heltec_v2/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern HeltecV2Board board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/heltec_v3/target.cpp b/variants/heltec_v3/target.cpp index 5cc5300d..768cd84c 100644 --- a/variants/heltec_v3/target.cpp +++ b/variants/heltec_v3/target.cpp @@ -12,11 +12,17 @@ HeltecV3Board board; WRAPPER_CLASS radio_driver(radio, board); +ESP32RTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + fallback_clock.begin(); + rtc_clock.begin(Wire); + #ifdef SX126X_DIO3_TCXO_VOLTAGE float tcxo = SX126X_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/heltec_v3/target.h b/variants/heltec_v3/target.h index 075626a1..04fec40c 100644 --- a/variants/heltec_v3/target.h +++ b/variants/heltec_v3/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern HeltecV3Board board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/lilygo_t3s3/target.cpp b/variants/lilygo_t3s3/target.cpp index ac19506a..8e8b8e75 100644 --- a/variants/lilygo_t3s3/target.cpp +++ b/variants/lilygo_t3s3/target.cpp @@ -12,11 +12,17 @@ ESP32Board board; WRAPPER_CLASS radio_driver(radio, board); +ESP32RTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + fallback_clock.begin(); + rtc_clock.begin(Wire); + #ifdef SX126X_DIO3_TCXO_VOLTAGE float tcxo = SX126X_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/lilygo_t3s3/target.h b/variants/lilygo_t3s3/target.h index dfd76c96..8eed467f 100644 --- a/variants/lilygo_t3s3/target.h +++ b/variants/lilygo_t3s3/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern ESP32Board board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/lilygo_tbeam/target.cpp b/variants/lilygo_tbeam/target.cpp index 5e63dcae..0852d69c 100644 --- a/variants/lilygo_tbeam/target.cpp +++ b/variants/lilygo_tbeam/target.cpp @@ -12,11 +12,17 @@ TBeamBoard board; WRAPPER_CLASS radio_driver(radio, board); +ESP32RTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + fallback_clock.begin(); + rtc_clock.begin(Wire); + #if defined(P_LORA_SCLK) spi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI); #endif diff --git a/variants/lilygo_tbeam/target.h b/variants/lilygo_tbeam/target.h index 070e5300..1fd68a84 100644 --- a/variants/lilygo_tbeam/target.h +++ b/variants/lilygo_tbeam/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern TBeamBoard board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/lilygo_tlora_v2_1/target.cpp b/variants/lilygo_tlora_v2_1/target.cpp index 4090ca52..740e0561 100644 --- a/variants/lilygo_tlora_v2_1/target.cpp +++ b/variants/lilygo_tlora_v2_1/target.cpp @@ -8,11 +8,17 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_0, P_LORA_RESET, P_LORA_DI WRAPPER_CLASS radio_driver(radio, board); +ESP32RTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + fallback_clock.begin(); + rtc_clock.begin(Wire); + spi.begin(P_LORA_SCLK, P_LORA_MISO, P_LORA_MOSI); int status = radio.begin(LORA_FREQ, LORA_BW, LORA_SF, LORA_CR, RADIOLIB_SX126X_SYNC_WORD_PRIVATE, LORA_TX_POWER, 8); if (status != RADIOLIB_ERR_NONE) { diff --git a/variants/lilygo_tlora_v2_1/target.h b/variants/lilygo_tlora_v2_1/target.h index 610e7977..5c0910cb 100644 --- a/variants/lilygo_tlora_v2_1/target.h +++ b/variants/lilygo_tlora_v2_1/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern LilyGoTLoraBoard board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/promicro/target.cpp b/variants/promicro/target.cpp index fb282b19..9958c9eb 100644 --- a/variants/promicro/target.cpp +++ b/variants/promicro/target.cpp @@ -1,5 +1,6 @@ #include #include "target.h" +#include FaketecBoard board; @@ -7,11 +8,16 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BU WRAPPER_CLASS radio_driver(radio, board); +VolatileRTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + rtc_clock.begin(Wire); + #ifdef SX126X_DIO3_TCXO_VOLTAGE float tcxo = SX126X_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/promicro/target.h b/variants/promicro/target.h index b0c69eeb..b66020d4 100644 --- a/variants/promicro/target.h +++ b/variants/promicro/target.h @@ -6,9 +6,11 @@ #include #include #include +#include extern FaketecBoard board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/rak4631/target.cpp b/variants/rak4631/target.cpp index 3a25be56..17e76532 100644 --- a/variants/rak4631/target.cpp +++ b/variants/rak4631/target.cpp @@ -1,5 +1,6 @@ #include #include "target.h" +#include RAK4631Board board; @@ -7,11 +8,16 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BU WRAPPER_CLASS radio_driver(radio, board); +VolatileRTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + rtc_clock.begin(Wire); + #ifdef SX126X_DIO3_TCXO_VOLTAGE float tcxo = SX126X_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/rak4631/target.h b/variants/rak4631/target.h index c36cd939..cd32c12d 100644 --- a/variants/rak4631/target.h +++ b/variants/rak4631/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern RAK4631Board board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/station_g2/target.cpp b/variants/station_g2/target.cpp index 5017ceaa..988ac4fc 100644 --- a/variants/station_g2/target.cpp +++ b/variants/station_g2/target.cpp @@ -12,11 +12,17 @@ StationG2Board board; WRAPPER_CLASS radio_driver(radio, board); +ESP32RTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + fallback_clock.begin(); + rtc_clock.begin(Wire); + #ifdef SX126X_DIO3_TCXO_VOLTAGE float tcxo = SX126X_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/station_g2/target.h b/variants/station_g2/target.h index 9e52b24a..96fd5095 100644 --- a/variants/station_g2/target.h +++ b/variants/station_g2/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern StationG2Board board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/t1000-e/target.cpp b/variants/t1000-e/target.cpp index e71e5d44..afc0eadb 100644 --- a/variants/t1000-e/target.cpp +++ b/variants/t1000-e/target.cpp @@ -1,5 +1,6 @@ #include #include "target.h" +#include T1000eBoard board; @@ -7,6 +8,9 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BU WRAPPER_CLASS radio_driver(radio, board); +VolatileRTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif @@ -34,6 +38,8 @@ static const Module::RfSwitchMode_t rfswitch_table[] = { #endif bool radio_init() { + rtc_clock.begin(Wire); + #ifdef LR11X0_DIO3_TCXO_VOLTAGE float tcxo = LR11X0_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/t1000-e/target.h b/variants/t1000-e/target.h index b2331cab..7ffafded 100644 --- a/variants/t1000-e/target.h +++ b/variants/t1000-e/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern T1000eBoard board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/t114/target.cpp b/variants/t114/target.cpp index d474e25c..07a60688 100644 --- a/variants/t114/target.cpp +++ b/variants/t114/target.cpp @@ -1,5 +1,6 @@ #include #include "target.h" +#include T114Board board; @@ -7,11 +8,16 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BU WRAPPER_CLASS radio_driver(radio, board); +VolatileRTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + rtc_clock.begin(Wire); + #ifdef SX126X_DIO3_TCXO_VOLTAGE float tcxo = SX126X_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/t114/target.h b/variants/t114/target.h index a6f98dbb..8d80c0ec 100644 --- a/variants/t114/target.h +++ b/variants/t114/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern T114Board board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/techo/target.cpp b/variants/techo/target.cpp index c5522799..ecffc37a 100644 --- a/variants/techo/target.cpp +++ b/variants/techo/target.cpp @@ -1,5 +1,6 @@ #include #include "target.h" +#include TechoBoard board; @@ -7,11 +8,16 @@ RADIO_CLASS radio = new Module(P_LORA_NSS, P_LORA_DIO_1, P_LORA_RESET, P_LORA_BU WRAPPER_CLASS radio_driver(radio, board); +VolatileRTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + rtc_clock.begin(Wire); + #ifdef SX126X_DIO3_TCXO_VOLTAGE float tcxo = SX126X_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/techo/target.h b/variants/techo/target.h index 921657ff..4a66f24e 100644 --- a/variants/techo/target.h +++ b/variants/techo/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern TechoBoard board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/xiao_c3/target.cpp b/variants/xiao_c3/target.cpp index 2d2098f5..bab602cc 100644 --- a/variants/xiao_c3/target.cpp +++ b/variants/xiao_c3/target.cpp @@ -12,11 +12,17 @@ XiaoC3Board board; WRAPPER_CLASS radio_driver(radio, board); +ESP32RTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + fallback_clock.begin(); + rtc_clock.begin(Wire); + #ifdef SX126X_DIO3_TCXO_VOLTAGE float tcxo = SX126X_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/xiao_c3/target.h b/variants/xiao_c3/target.h index d4b02364..c0a1eb32 100644 --- a/variants/xiao_c3/target.h +++ b/variants/xiao_c3/target.h @@ -6,9 +6,11 @@ #include #include #include +#include extern XiaoC3Board board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); diff --git a/variants/xiao_s3_wio/target.cpp b/variants/xiao_s3_wio/target.cpp index ac19506a..8e8b8e75 100644 --- a/variants/xiao_s3_wio/target.cpp +++ b/variants/xiao_s3_wio/target.cpp @@ -12,11 +12,17 @@ ESP32Board board; WRAPPER_CLASS radio_driver(radio, board); +ESP32RTCClock fallback_clock; +AutoDiscoverRTCClock rtc_clock(fallback_clock); + #ifndef LORA_CR #define LORA_CR 5 #endif bool radio_init() { + fallback_clock.begin(); + rtc_clock.begin(Wire); + #ifdef SX126X_DIO3_TCXO_VOLTAGE float tcxo = SX126X_DIO3_TCXO_VOLTAGE; #else diff --git a/variants/xiao_s3_wio/target.h b/variants/xiao_s3_wio/target.h index dfd76c96..8eed467f 100644 --- a/variants/xiao_s3_wio/target.h +++ b/variants/xiao_s3_wio/target.h @@ -5,9 +5,11 @@ #include #include #include +#include extern ESP32Board board; extern WRAPPER_CLASS radio_driver; +extern AutoDiscoverRTCClock rtc_clock; bool radio_init(); uint32_t radio_get_rng_seed(); From ba938670372340495cadf32a9fc7d429c3a079f4 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Fri, 28 Mar 2025 14:14:59 +1100 Subject: [PATCH 12/18] * companion: temp fix: logRxRaw() is blowing the MAX_FRAME_SIZE --- examples/companion_radio/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index f9171c0e..2988f297 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -484,7 +484,7 @@ protected: } void logRxRaw(float snr, float rssi, const uint8_t raw[], int len) override { - if (_serial->isConnected()) { + if (_serial->isConnected() && len+3 <= MAX_FRAME_SIZE) { int i = 0; out_frame[i++] = PUSH_CODE_LOG_RX_DATA; out_frame[i++] = (int8_t)(snr * 4); From 89bd6c3416252365cf596f9e9e0fba590a1e934c Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Fri, 28 Mar 2025 20:50:42 +1100 Subject: [PATCH 13/18] * Dispatcher: now impose a max time for CAD fail (ie. channel busy), defined by getCADFailMaxDuration(), default 4 seconds. (an sx126x bug _might_ be making radio->isReceiving() return true indefinitely) --- src/Dispatcher.cpp | 18 ++++++++++++++++-- src/Dispatcher.h | 3 +++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Dispatcher.cpp b/src/Dispatcher.cpp index 65f9687f..ae225d36 100644 --- a/src/Dispatcher.cpp +++ b/src/Dispatcher.cpp @@ -29,6 +29,9 @@ int Dispatcher::calcRxDelay(float score, uint32_t air_time) const { uint32_t Dispatcher::getCADFailRetryDelay() const { return 200; } +uint32_t Dispatcher::getCADFailMaxDuration() const { + return 4000; // 4 seconds +} void Dispatcher::loop() { if (outbound) { // waiting for outbound send to be completed @@ -185,9 +188,20 @@ void Dispatcher::checkSend() { if (_mgr->getOutboundCount() == 0) return; // nothing waiting to send if (!millisHasNowPassed(next_tx_time)) return; // still in 'radio silence' phase (from airtime budget setting) if (_radio->isReceiving()) { // LBT - check if radio is currently mid-receive, or if channel activity - next_tx_time = futureMillis(getCADFailRetryDelay()); - return; + if (cad_busy_start == 0) { + cad_busy_start = _ms->getMillis(); // record when CAD busy state started + } + + if (_ms->getMillis() - cad_busy_start > getCADFailMaxDuration()) { + MESH_DEBUG_PRINTLN("%s Dispatcher::checkSend(): CAD busy max duration reached!", getLogDateTime()); + // channel activity has gone on too long... (Radio might be in a bad state) + // force the pending transmit below... + } else { + next_tx_time = futureMillis(getCADFailRetryDelay()); + return; + } } + cad_busy_start = 0; // reset busy state outbound = _mgr->getNextOutbound(_ms->getMillis()); if (outbound) { diff --git a/src/Dispatcher.h b/src/Dispatcher.h index 0b00f1a9..393d0856 100644 --- a/src/Dispatcher.h +++ b/src/Dispatcher.h @@ -98,6 +98,7 @@ class Dispatcher { Packet* outbound; // current outbound packet unsigned long outbound_expiry, outbound_start, total_air_time; unsigned long next_tx_time; + unsigned long cad_busy_start; uint32_t n_sent_flood, n_sent_direct; uint32_t n_recv_flood, n_recv_direct; uint32_t n_full_events; @@ -113,6 +114,7 @@ protected: : _radio(&radio), _ms(&ms), _mgr(&mgr) { outbound = NULL; total_air_time = 0; next_tx_time = 0; + cad_busy_start = 0; } virtual DispatcherAction onRecvPacket(Packet* pkt) = 0; @@ -127,6 +129,7 @@ protected: virtual float getAirtimeBudgetFactor() const; virtual int calcRxDelay(float score, uint32_t air_time) const; virtual uint32_t getCADFailRetryDelay() const; + virtual uint32_t getCADFailMaxDuration() const; public: void begin(); From 022b43ef3d8b769b92b2390fec29cb5eeec8a06a Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Fri, 28 Mar 2025 22:20:42 +1100 Subject: [PATCH 14/18] * isReceiving() now includes either preamble detect or header detect --- src/helpers/CustomLLCC68.h | 5 +++-- src/helpers/CustomLR1110.h | 4 ++-- src/helpers/CustomSX1262.h | 5 +++-- src/helpers/CustomSX1268.h | 5 +++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/helpers/CustomLLCC68.h b/src/helpers/CustomLLCC68.h index 49a49ca7..db037639 100644 --- a/src/helpers/CustomLLCC68.h +++ b/src/helpers/CustomLLCC68.h @@ -3,6 +3,7 @@ #include #define SX126X_IRQ_HEADER_VALID 0b0000010000 // 4 4 valid LoRa header received +#define SX126X_IRQ_PREAMBLE_DETECTED 0x04 class CustomLLCC68 : public LLCC68 { public: @@ -10,7 +11,7 @@ class CustomLLCC68 : public LLCC68 { bool isReceiving() { uint16_t irq = getIrqFlags(); - bool hasPreamble = (irq & SX126X_IRQ_HEADER_VALID); - return hasPreamble; + bool detected = (irq & SX126X_IRQ_HEADER_VALID) || (irq & SX126X_IRQ_PREAMBLE_DETECTED); + return detected; } }; \ No newline at end of file diff --git a/src/helpers/CustomLR1110.h b/src/helpers/CustomLR1110.h index 872bb1c3..3451aac1 100644 --- a/src/helpers/CustomLR1110.h +++ b/src/helpers/CustomLR1110.h @@ -11,7 +11,7 @@ class CustomLR1110 : public LR1110 { bool isReceiving() { uint16_t irq = getIrqStatus(); - bool hasPreamble = ((irq & LR1110_IRQ_HEADER_VALID) && (irq & LR1110_IRQ_HAS_PREAMBLE)); - return hasPreamble; + bool detected = ((irq & LR1110_IRQ_HEADER_VALID) || (irq & LR1110_IRQ_HAS_PREAMBLE)); + return detected; } }; \ No newline at end of file diff --git a/src/helpers/CustomSX1262.h b/src/helpers/CustomSX1262.h index 70a1077f..c9fb5b69 100644 --- a/src/helpers/CustomSX1262.h +++ b/src/helpers/CustomSX1262.h @@ -3,6 +3,7 @@ #include #define SX126X_IRQ_HEADER_VALID 0b0000010000 // 4 4 valid LoRa header received +#define SX126X_IRQ_PREAMBLE_DETECTED 0x04 class CustomSX1262 : public SX1262 { public: @@ -10,7 +11,7 @@ class CustomSX1262 : public SX1262 { bool isReceiving() { uint16_t irq = getIrqFlags(); - bool hasPreamble = (irq & SX126X_IRQ_HEADER_VALID); - return hasPreamble; + bool detected = (irq & SX126X_IRQ_HEADER_VALID) || (irq & SX126X_IRQ_PREAMBLE_DETECTED); + return detected; } }; \ No newline at end of file diff --git a/src/helpers/CustomSX1268.h b/src/helpers/CustomSX1268.h index 50024693..a8180fc4 100644 --- a/src/helpers/CustomSX1268.h +++ b/src/helpers/CustomSX1268.h @@ -3,6 +3,7 @@ #include #define SX126X_IRQ_HEADER_VALID 0b0000010000 // 4 4 valid LoRa header received +#define SX126X_IRQ_PREAMBLE_DETECTED 0x04 class CustomSX1268 : public SX1268 { public: @@ -10,7 +11,7 @@ class CustomSX1268 : public SX1268 { bool isReceiving() { uint16_t irq = getIrqFlags(); - bool hasPreamble = (irq & SX126X_IRQ_HEADER_VALID); - return hasPreamble; + bool detected = (irq & SX126X_IRQ_HEADER_VALID) || (irq & SX126X_IRQ_PREAMBLE_DETECTED); + return detected; } }; \ No newline at end of file From 0d5c17f7ed3cef3c501e63a250b4699fc2db2aa6 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Sat, 29 Mar 2025 13:27:17 +1100 Subject: [PATCH 15/18] * ESP-Now: long range mode --- src/helpers/esp32/ESPNOWRadio.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/helpers/esp32/ESPNOWRadio.cpp b/src/helpers/esp32/ESPNOWRadio.cpp index d5c9df1e..7f8f4f71 100644 --- a/src/helpers/esp32/ESPNOWRadio.cpp +++ b/src/helpers/esp32/ESPNOWRadio.cpp @@ -25,6 +25,8 @@ static void OnDataRecv(const uint8_t *mac, const uint8_t *data, int len) { void ESPNOWRadio::begin() { // Set device as a Wi-Fi Station WiFi.mode(WIFI_STA); + // Long Range mode + esp_wifi_set_protocol(WIFI_IF_STA, WIFI_PROTOCOL_LR); // Init ESP-NOW if (esp_now_init() != ESP_OK) { From b77701ced0f1c4586ebb4e93af57904e893a1305 Mon Sep 17 00:00:00 2001 From: recrof Date: Sat, 29 Mar 2025 19:40:35 +0100 Subject: [PATCH 16/18] added new CommonCLI get commands: get role and get public.key --- examples/simple_repeater/main.cpp | 3 +++ examples/simple_room_server/main.cpp | 7 +++++-- src/helpers/CommonCLI.cpp | 6 ++++++ src/helpers/CommonCLI.h | 3 ++- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index 67c58068..f4d08534 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -66,6 +66,8 @@ static UITask ui_task(display); #endif +#define FIRMWARE_ROLE "repeater" + #define PACKET_LOG_FILE "/packet_log" /* ------------------------------ Code -------------------------------- */ @@ -512,6 +514,7 @@ public: const char* getFirmwareVer() override { return FIRMWARE_VERSION; } const char* getBuildDate() override { return FIRMWARE_BUILD_DATE; } + const char* getRole() override { return FIRMWARE_ROLE; } const char* getNodeName() { return _prefs.node_name; } void savePrefs() override { diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index 8a8232be..90b88e51 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -74,6 +74,8 @@ static UITask ui_task(display); #endif +#define FIRMWARE_ROLE "room_server" + #define PACKET_LOG_FILE "/packet_log" /* ------------------------------ Code -------------------------------- */ @@ -261,7 +263,7 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { return _fs->open(fname, "a", true); #endif } - + protected: float getAirtimeBudgetFactor() const override { return _prefs.airtime_factor; @@ -598,7 +600,7 @@ protected: memcpy(reply_data, &now, 4); // response packets always prefixed with timestamp memcpy(&reply_data[4], &stats, sizeof(stats)); uint8_t reply_len = 4 + sizeof(stats); - + if (packet->isRouteFlood()) { // let this sender know path TO here, so they can use sendDirect(), and ALSO encode the response mesh::Packet* path = createPathReturn(client->id, secret, packet->path, packet->path_len, @@ -701,6 +703,7 @@ public: const char* getFirmwareVer() override { return FIRMWARE_VERSION; } const char* getBuildDate() override { return FIRMWARE_BUILD_DATE; } + const char* getRole() override { return FIRMWARE_ROLE; } const char* getNodeName() { return _prefs.node_name; } void savePrefs() override { diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 177138c6..32527a2f 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -198,6 +198,12 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch sprintf(reply, "> %d", (uint32_t) _prefs->tx_power_dbm); } else if (memcmp(config, "freq", 4) == 0) { sprintf(reply, "> %s", StrHelper::ftoa(_prefs->freq)); + } else if (memcmp(config, "public.key", 10) == 0) { + char pub_key_hex[PUB_KEY_SIZE * 2 + 1]; + mesh::Utils::toHex(pub_key_hex, _mesh->self_id.pub_key, PUB_KEY_SIZE); + sprintf(reply, "> %s", pub_key_hex); + } else if (memcmp(config, "role", 4) == 0) { + sprintf(reply, "> %s", _callbacks->getRole()); } else { sprintf(reply, "??: %s", config); } diff --git a/src/helpers/CommonCLI.h b/src/helpers/CommonCLI.h index a31eefa5..50e5f8d6 100644 --- a/src/helpers/CommonCLI.h +++ b/src/helpers/CommonCLI.h @@ -31,6 +31,7 @@ public: virtual void savePrefs() = 0; virtual const char* getFirmwareVer() = 0; virtual const char* getBuildDate() = 0; + virtual const char* getRole() = 0; virtual bool formatFileSystem() = 0; virtual void sendSelfAdvertisement(int delay_millis) = 0; virtual void updateAdvertTimer() = 0; @@ -56,7 +57,7 @@ class CommonCLI { void loadPrefsInt(FILESYSTEM* _fs, const char* filename); public: - CommonCLI(mesh::MainBoard& board, mesh::Mesh* mesh, NodePrefs* prefs, CommonCLICallbacks* callbacks) + CommonCLI(mesh::MainBoard& board, mesh::Mesh* mesh, NodePrefs* prefs, CommonCLICallbacks* callbacks) : _board(&board), _mesh(mesh), _prefs(prefs), _callbacks(callbacks) { } void loadPrefs(FILESYSTEM* _fs); From 75eabd5c6634395540486b1507facf3894e07bc2 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Sun, 30 Mar 2025 14:47:52 +1100 Subject: [PATCH 17/18] * minor refactor --- src/helpers/CommonCLI.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/helpers/CommonCLI.cpp b/src/helpers/CommonCLI.cpp index 32527a2f..2bafd5f9 100644 --- a/src/helpers/CommonCLI.cpp +++ b/src/helpers/CommonCLI.cpp @@ -199,9 +199,8 @@ void CommonCLI::handleCommand(uint32_t sender_timestamp, const char* command, ch } else if (memcmp(config, "freq", 4) == 0) { sprintf(reply, "> %s", StrHelper::ftoa(_prefs->freq)); } else if (memcmp(config, "public.key", 10) == 0) { - char pub_key_hex[PUB_KEY_SIZE * 2 + 1]; - mesh::Utils::toHex(pub_key_hex, _mesh->self_id.pub_key, PUB_KEY_SIZE); - sprintf(reply, "> %s", pub_key_hex); + strcpy(reply, "> "); + mesh::Utils::toHex(&reply[2], _mesh->self_id.pub_key, PUB_KEY_SIZE); } else if (memcmp(config, "role", 4) == 0) { sprintf(reply, "> %s", _callbacks->getRole()); } else { From fc6aa0ed0fb5283b847cfac3f720e2b99774ec34 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Sun, 30 Mar 2025 18:56:21 +1100 Subject: [PATCH 18/18] * ver bump to v1.4.2 --- examples/companion_radio/main.cpp | 4 ++-- examples/simple_repeater/main.cpp | 4 ++-- examples/simple_room_server/main.cpp | 4 ++-- variants/generic_espnow/platformio.ini | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/companion_radio/main.cpp b/examples/companion_radio/main.cpp index 2988f297..ef50d1ca 100644 --- a/examples/companion_radio/main.cpp +++ b/examples/companion_radio/main.cpp @@ -86,11 +86,11 @@ static uint32_t _atoi(const char* sp) { #define FIRMWARE_VER_CODE 3 #ifndef FIRMWARE_BUILD_DATE - #define FIRMWARE_BUILD_DATE "25 Mar 2025" + #define FIRMWARE_BUILD_DATE "30 Mar 2025" #endif #ifndef FIRMWARE_VERSION - #define FIRMWARE_VERSION "v1.4.1" + #define FIRMWARE_VERSION "v1.4.2" #endif #define CMD_APP_START 1 diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index f4d08534..4836c533 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -20,11 +20,11 @@ /* ------------------------------ Config -------------------------------- */ #ifndef FIRMWARE_BUILD_DATE - #define FIRMWARE_BUILD_DATE "25 Mar 2025" + #define FIRMWARE_BUILD_DATE "30 Mar 2025" #endif #ifndef FIRMWARE_VERSION - #define FIRMWARE_VERSION "v1.4.1" + #define FIRMWARE_VERSION "v1.4.2" #endif #ifndef LORA_FREQ diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index 90b88e51..c91765fc 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -20,11 +20,11 @@ /* ------------------------------ Config -------------------------------- */ #ifndef FIRMWARE_BUILD_DATE - #define FIRMWARE_BUILD_DATE "25 Mar 2025" + #define FIRMWARE_BUILD_DATE "30 Mar 2025" #endif #ifndef FIRMWARE_VERSION - #define FIRMWARE_VERSION "v1.4.1" + #define FIRMWARE_VERSION "v1.4.2" #endif #ifndef LORA_FREQ diff --git a/variants/generic_espnow/platformio.ini b/variants/generic_espnow/platformio.ini index 06a85f7e..8dbc8ebb 100644 --- a/variants/generic_espnow/platformio.ini +++ b/variants/generic_espnow/platformio.ini @@ -34,7 +34,7 @@ lib_deps = ${Generic_ESPNOW.lib_deps} densaugeo/base64 @ ~1.4.0 -[env:Generic_ESPNOW_repeater] +[env:Generic_ESPNOW_repeatr] extends = Generic_ESPNOW build_flags = ${Generic_ESPNOW.build_flags} @@ -49,7 +49,7 @@ lib_deps = ${esp32_ota.lib_deps} densaugeo/base64 @ ~1.4.0 -[env:Generic_ESPNOW_companion_radio_usb] +[env:Generic_ESPNOW_comp_radio_usb] extends = Generic_ESPNOW build_flags = ${Generic_ESPNOW.build_flags} @@ -66,7 +66,7 @@ lib_deps = ${Generic_ESPNOW.lib_deps} densaugeo/base64 @ ~1.4.0 -[env:Generic_ESPNOW_room_server] +[env:Generic_ESPNOW_room_svr] extends = Generic_ESPNOW build_flags = ${Generic_ESPNOW.build_flags}