From b428ecf31ff1d80d29129684b8e0e9f48248d864 Mon Sep 17 00:00:00 2001 From: Scott Powell Date: Wed, 5 Feb 2025 12:36:32 +1100 Subject: [PATCH] * new CLI command: "set txdelay ..." --- examples/simple_repeater/main.cpp | 16 ++++++++++++++++ examples/simple_room_server/main.cpp | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/examples/simple_repeater/main.cpp b/examples/simple_repeater/main.cpp index 816417ac..6a7f555c 100644 --- a/examples/simple_repeater/main.cpp +++ b/examples/simple_repeater/main.cpp @@ -123,6 +123,7 @@ struct NodePrefs { // persisted to file uint8_t disable_fwd; uint8_t unused[2]; float rx_delay_base; + float tx_delay_factor; }; class MyMesh : public mesh::Mesh { @@ -199,6 +200,11 @@ protected: return (int) ((pow(_prefs.rx_delay_base, 0.85f - score) - 1.0) * air_time); } + uint32_t getRetransmitDelay(const mesh::Packet* packet) override { + uint32_t t = (_radio->getEstAirtimeFor(packet->path_len + packet->payload_len + 2) * _prefs.tx_delay_factor); + return getRNG()->nextInt(0, 6)*t; + } + void onAnonDataRecv(mesh::Packet* packet, uint8_t type, const mesh::Identity& sender, uint8_t* data, size_t len) override { if (type == PAYLOAD_TYPE_ANON_REQ) { // received an initial request by a possible admin client (unknown at this stage) uint32_t timestamp; @@ -379,6 +385,7 @@ public: memset(&_prefs, 0, sizeof(_prefs)); _prefs.airtime_factor = 1.0; // one half _prefs.rx_delay_base = 10.0; + _prefs.tx_delay_factor = 0.25f; strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name)-1); _prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if necessary _prefs.node_lat = ADVERT_LAT; @@ -507,6 +514,15 @@ public: } else { strcpy(reply, "Error, cannot be negative"); } + } else if (memcmp(config, "txdelay ", 8) == 0) { + float f = atof(&config[8]); + if (f >= 0) { + _prefs.tx_delay_factor = f; + savePrefs(); + strcpy(reply, "OK"); + } else { + strcpy(reply, "Error, cannot be negative"); + } } else if (memcmp(config, "tx ", 3) == 0) { _prefs.tx_power_dbm = atoi(&config[3]); savePrefs(); diff --git a/examples/simple_room_server/main.cpp b/examples/simple_room_server/main.cpp index c3a775d5..2a88bddd 100644 --- a/examples/simple_room_server/main.cpp +++ b/examples/simple_room_server/main.cpp @@ -140,6 +140,7 @@ struct NodePrefs { // persisted to file uint8_t disable_fwd; uint8_t unused[2]; float rx_delay_base; + float tx_delay_factor; }; class MyMesh : public mesh::Mesh { @@ -253,6 +254,11 @@ protected: return (int) ((pow(_prefs.rx_delay_base, 0.85f - score) - 1.0) * air_time); } + uint32_t getRetransmitDelay(const mesh::Packet* packet) override { + uint32_t t = (_radio->getEstAirtimeFor(packet->path_len + packet->payload_len + 2) * _prefs.tx_delay_factor); + return getRNG()->nextInt(0, 6)*t; + } + bool allowPacketForward(const mesh::Packet* packet) override { return !_prefs.disable_fwd; } @@ -491,6 +497,7 @@ public: memset(&_prefs, 0, sizeof(_prefs)); _prefs.airtime_factor = 1.0; // one half _prefs.rx_delay_base = 10.0; + _prefs.tx_delay_factor = 0.25f; strncpy(_prefs.node_name, ADVERT_NAME, sizeof(_prefs.node_name)-1); _prefs.node_name[sizeof(_prefs.node_name)-1] = 0; // truncate if necessary _prefs.node_lat = ADVERT_LAT; @@ -626,6 +633,15 @@ public: } else { strcpy(reply, "Error, cannot be negative"); } + } else if (memcmp(config, "txdelay ", 8) == 0) { + float f = atof(&config[8]); + if (f >= 0) { + _prefs.tx_delay_factor = f; + savePrefs(); + strcpy(reply, "OK"); + } else { + strcpy(reply, "Error, cannot be negative"); + } } else if (memcmp(config, "tx ", 3) == 0) { _prefs.tx_power_dbm = atoi(&config[3]); savePrefs();