mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-07-30 16:58:12 +00:00
feat(repeater): politeness controls, dedicated radio profile, and diagnostics
Settings > Radio gains a repeater toggle, 16 community-suggested radio presets plus manual Freq/SF/BW/CR tuning (digit-by-digit Freq editor), 4 persisted user preset slots, and the packet pool bumped 16->32 so queued retransmits stop starving incoming-packet allocation while relaying. Four opt-in politeness knobs (skip-advert, max-hops, yield, min-SNR), all flood-only and off by default, plus overhear suppression that cancels a queued retransmit if a peer relays the same packet first. Adaptive Power Control is suppressed while relaying (pins TX power to the ceiling) and duty-cycle RX is forced off, since a repeater needs to hear and relay at consistent power. A dedicated Tools > Repeater screen consolidates the toggle, the politeness knobs, and live forwarding stats, plus an optional "Custom" radio profile — a dedicated frequency/SF/BW/CR for relaying, separate from the companion's own network, band-matched to the companion frequency by default and used everywhere a radio change can happen (boot, on-device toggle, app-driven CMD_SET_RADIO_PARAMS, Settings radio edits) so the device never silently falls back to the wrong params mid-relay. Diagnostics gains the actually-forwarded packet count, real heap-free via mallinfo(), a reset-counters popup, and hardened loop-detect bounds. Also: a frequency-floor fix and a float-equality preset-match fix in the repeater profile logic, deduped BW-table/valCol/profile- seeding helpers shared between Settings and the Repeater screen, and a build.sh fix tolerating control characters in `pio project config`'s JSON dump. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
12
src/Mesh.h
12
src/Mesh.h
@@ -27,6 +27,7 @@ class Mesh : public Dispatcher {
|
||||
RTCClock* _rtc;
|
||||
RNG* _rng;
|
||||
MeshTables* _tables;
|
||||
uint32_t n_forwarded; // packets actually re-transmitted (repeater/transport role)
|
||||
|
||||
void removeSelfFromPath(Packet* packet);
|
||||
void routeDirectRecvAcks(Packet* packet, uint32_t delay_millis);
|
||||
@@ -55,6 +56,10 @@ protected:
|
||||
*/
|
||||
virtual bool allowPacketForward(const Packet* packet);
|
||||
|
||||
// Keep the forward counter honest when an overhear cancels a queued retransmit:
|
||||
// the packet was counted at the ACTION_RETRANSMIT decision, so back it out here.
|
||||
void onRetransmitCancelled(Packet* packet) override { if (n_forwarded) n_forwarded--; }
|
||||
|
||||
/**
|
||||
* \returns number of milliseconds delay to apply to retransmitting the given packet.
|
||||
*/
|
||||
@@ -178,6 +183,13 @@ public:
|
||||
|
||||
LocalIdentity self_id;
|
||||
|
||||
// packets actually re-transmitted (vs. just permitted by allowPacketForward()) —
|
||||
// confirms a repeater/transport role is really forwarding, not just configured to.
|
||||
uint32_t getNumForwarded() const { return n_forwarded; }
|
||||
|
||||
// also clear the forward counter alongside the Dispatcher packet counters.
|
||||
void resetStats() override { Dispatcher::resetStats(); n_forwarded = 0; }
|
||||
|
||||
RNG* getRNG() const { return _rng; }
|
||||
RTCClock* getRTCClock() const { return _rtc; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user