docs(repeater): rename "politeness" -> "forwarding filters", fix stale refs

Rename the repeater filter knobs from "politeness" to "forwarding
filters" across code comments, FEATURES.md and the docs, and correct
references that hadn't followed the controls when they moved from
Settings › Radio to the dedicated Tools › Repeater screen.

Comment/doc accuracy fixes:
- NodePrefs: user_radio_presets are now written by both Settings and
  Repeater (shared picker), not Settings only.
- DiagnosticsScreen: class header listed only some rows; spell out the
  full set (forwarded, signal, pool/queue, error flags, reset gesture).
- RepeaterScreen header no longer claims to show live forwarding stats
  (they live on Diagnostics).
- tools_screen.md: drop the stale paragraph claiming the Repeater screen
  shows live stats at the bottom — it is config-only.

Comments/docs only; no behaviour change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
MarekZegare4
2026-06-21 22:32:59 +02:00
co-authored by Claude Opus 4.8
parent 0e333aeb5e
commit 52e65b960f
7 changed files with 21 additions and 21 deletions
+2 -2
View File
@@ -441,7 +441,7 @@ Sequencing: hardware duty-cycle RX and APC are both done and in field test on
`feat/power-saving`; see the status block at the top of this entry for what's `feat/power-saving`; see the status block at the top of this entry for what's
left (PPK2 current measurement, multi-hop APC gating). left (PPK2 current measurement, multi-hop APC gating).
### ✅ Companion repeater + politeness knobs + diagnostics ### ✅ Companion repeater + forwarding filters + diagnostics
On-device repeater for the Solo companion, scoped to the SX1262 boards (Wio On-device repeater for the Solo companion, scoped to the SX1262 boards (Wio
Tracker L1 OLED/e-ink, GAT562 30S). All on `feature/companion-repeater-presets`. Tracker L1 OLED/e-ink, GAT562 30S). All on `feature/companion-repeater-presets`.
@@ -478,7 +478,7 @@ Tracker L1 OLED/e-ink, GAT562 30S). All on `feature/companion-repeater-presets`.
outside what's legal for wherever the companion's own network already is. outside what's legal for wherever the companion's own network already is.
`LORA_FREQ/BW/SF/CR` fallback `#define`s moved from `MyMesh.h` to `LORA_FREQ/BW/SF/CR` fallback `#define`s moved from `MyMesh.h` to
`NodePrefs.h` so `DataStore.cpp`'s migration code can see them too. `NodePrefs.h` so `DataStore.cpp`'s migration code can see them too.
- **Politeness knobs** (all opt-in, default off, flood-only — a direct route's - **Forwarding filters** (all opt-in, default off, flood-only — a direct route's
named next hop is never dropped). Shown only while the repeater is on: named next hop is never dropped). Shown only while the repeater is on:
- **Skip advert** — don't re-flood adverts (highest-volume flood). - **Skip advert** — don't re-flood adverts (highest-volume flood).
- **Max hops** — drop a flood past N hops. - **Max hops** — drop a flood past N hops.
@@ -342,6 +342,4 @@ The five flood filters are **opt-in** (default OFF, so a plain repeater is unaff
While the repeater is on, a **»** indicator appears in the status bar (same blink convention as the auto-advert and trail markers) so you can tell it's relaying at a glance. Two radio settings are also overridden while relaying and restored afterwards: **Settings Radio Pwr save** is forced off (a repeater must listen continuously) and **Auto pwr** is forced off (a repeater holds full TX power for consistent relay reach). Both show `--` in Settings while the repeater is on. While the repeater is on, a **»** indicator appears in the status bar (same blink convention as the auto-advert and trail markers) so you can tell it's relaying at a glance. Two radio settings are also overridden while relaying and restored afterwards: **Settings Radio Pwr save** is forced off (a repeater must listen continuously) and **Auto pwr** is forced off (a repeater holds full TX power for consistent relay reach). Both show `--` in Settings while the repeater is on.
Live forwarding stats — **Forwarded**, **Pool free**, **Queue** — are shown on **Tools Diagnostics**. Live forwarding stats — **Forwarded**, **Pool free**, **Queue** — are shown on **Tools Diagnostics** (this screen is config-only).
While the repeater is ON, the bottom of the screen shows live stats: **Forwarded** (packets actually re-transmitted — reflects Suppress dup), **Pool free**, and **Queue**. The same numbers appear, alongside the full device picture, in **Tools Diagnostics**.
+1 -1
View File
@@ -336,7 +336,7 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no
rd(&_prefs.bot_quiet_end, sizeof(_prefs.bot_quiet_end)); rd(&_prefs.bot_quiet_end, sizeof(_prefs.bot_quiet_end));
rd(_prefs.bot_trigger_ch, sizeof(_prefs.bot_trigger_ch)); rd(_prefs.bot_trigger_ch, sizeof(_prefs.bot_trigger_ch));
rd(_prefs.user_radio_presets, sizeof(_prefs.user_radio_presets)); rd(_prefs.user_radio_presets, sizeof(_prefs.user_radio_presets));
// → 0xC0DE000E: repeater politeness knobs. On a pre-E file the bytes here are // → 0xC0DE000E: repeater forwarding-filter knobs. On a pre-E file the bytes here are
// that file's own sentinel tail, so clamp every out-of-range value back to its // that file's own sentinel tail, so clamp every out-of-range value back to its
// "off" default (same stray-byte handling as the fields below). // "off" default (same stray-byte handling as the fields below).
rd(&_prefs.repeat_skip_adverts, sizeof(_prefs.repeat_skip_adverts)); rd(&_prefs.repeat_skip_adverts, sizeof(_prefs.repeat_skip_adverts));
+3 -3
View File
@@ -283,7 +283,7 @@ int MyMesh::calcRxDelay(float score, uint32_t air_time) const {
uint32_t MyMesh::getRetransmitDelay(const mesh::Packet *packet) { uint32_t MyMesh::getRetransmitDelay(const mesh::Packet *packet) {
uint32_t t = (_radio->getEstAirtimeFor(packet->getPathByteLen() + packet->payload_len + 2) * 0.5f); uint32_t t = (_radio->getEstAirtimeFor(packet->getPathByteLen() + packet->payload_len + 2) * 0.5f);
uint32_t d = getRNG()->nextInt(0, 5*t + 1); uint32_t d = getRNG()->nextInt(0, 5*t + 1);
// Politeness yield (Settings > Radio): scale the flood retransmit delay so a // Yield filter (Tools > Repeater): scale the flood retransmit delay so a
// mobile companion waits longer and lets better-sited fixed repeaters win the // mobile companion waits longer and lets better-sited fixed repeaters win the
// flood first. Only forwarded floods reach here — own sends pass their own // flood first. Only forwarded floods reach here — own sends pass their own
// delay to sendFlood() — so this never slows the companion's own traffic. // delay to sendFlood() — so this never slows the companion's own traffic.
@@ -556,7 +556,7 @@ bool MyMesh::isRepeatLooped(const mesh::Packet* packet) const {
bool MyMesh::allowPacketForward(const mesh::Packet* packet) { bool MyMesh::allowPacketForward(const mesh::Packet* packet) {
if (_prefs.client_repeat == 0) return false; if (_prefs.client_repeat == 0) return false;
// "Politeness" filters (Settings > Radio) — all default off, so a plain repeater // Forwarding filters (Tools > Repeater) — all default off, so a plain repeater
// is unaffected. Flood-only by design: on a direct route this node is the named // is unaffected. Flood-only by design: on a direct route this node is the named
// next hop, so dropping there would kill delivery with no alternate path, while // next hop, so dropping there would kill delivery with no alternate path, while
// dropping a flood copy just trims redundancy other nodes still carry. // dropping a flood copy just trims redundancy other nodes still carry.
@@ -1848,7 +1848,7 @@ void MyMesh::handleCmdFrame(size_t len) {
} }
// Dedicated-band requirement for app-driven repeat disabled, to match the // Dedicated-band requirement for app-driven repeat disabled, to match the
// on-device Repeater toggle (Settings > Radio), which repeats on whatever // on-device Repeater toggle (Tools > Repeater), which repeats on whatever
// frequency is already set with no band restriction. Uncomment to restore // frequency is already set with no band restriction. Uncomment to restore
// the old behaviour (repeat=1 only accepted on repeat_freq_ranges, i.e. // the old behaviour (repeat=1 only accepted on repeat_freq_ranges, i.e.
// 433.000/869.495/918.000 MHz exactly, by default). // 433.000/869.495/918.000 MHz exactly, by default).
+1 -1
View File
@@ -143,7 +143,7 @@ protected:
bool allowPacketForward(const mesh::Packet* packet) override; bool allowPacketForward(const mesh::Packet* packet) override;
bool isRepeatLooped(const mesh::Packet* packet) const; bool isRepeatLooped(const mesh::Packet* packet) const;
// Overhear suppression only makes sense while repeating; gated behind its own // Overhear suppression only makes sense while repeating; gated behind its own
// opt-in pref (Settings > Radio > Suppress dup). // opt-in pref (Tools > Repeater > Suppress dup).
bool wantsOverhearSuppress() const override { return _prefs.client_repeat && _prefs.repeat_suppress_dup; } bool wantsOverhearSuppress() const override { return _prefs.client_repeat && _prefs.repeat_suppress_dup; }
void sendFloodScoped(const TransportKey& scope, mesh::Packet* pkt, uint32_t delay_millis); void sendFloodScoped(const TransportKey& scope, mesh::Packet* pkt, uint32_t delay_millis);
+5 -4
View File
@@ -171,8 +171,9 @@ struct NodePrefs { // persisted to file
// shows ✗. 0 = no auto-resend (single attempt). Default 2. // shows ✗. 0 = no auto-resend (single attempt). Default 2.
uint8_t dm_resend_count; uint8_t dm_resend_count;
// User-saved radio presets (Settings > Radio > Preset > "Save current..."). // User-saved radio presets, written by the "Save current..." entry in the
// name[0] == '\0' marks an empty slot. // shared preset picker (Settings > Radio and Tools > Repeater both populate
// these same slots). name[0] == '\0' marks an empty slot.
struct UserRadioPreset { struct UserRadioPreset {
char name[16]; char name[16];
float freq; float freq;
@@ -183,9 +184,9 @@ struct NodePrefs { // persisted to file
static const uint8_t USER_RADIO_PRESET_MAX = 4; static const uint8_t USER_RADIO_PRESET_MAX = 4;
UserRadioPreset user_radio_presets[USER_RADIO_PRESET_MAX]; UserRadioPreset user_radio_presets[USER_RADIO_PRESET_MAX];
// Repeater "politeness" — only consulted when client_repeat is on, via // Repeater forwarding filters — only consulted when client_repeat is on, via
// MyMesh::allowPacketForward(). Both default to off (0) so behaviour is // MyMesh::allowPacketForward(). Both default to off (0) so behaviour is
// unchanged until the user opts in (Settings > Radio). // unchanged until the user opts in (Tools > Repeater).
// repeat_skip_adverts: 1 = don't re-flood ADVERT packets (the highest-volume // repeat_skip_adverts: 1 = don't re-flood ADVERT packets (the highest-volume
// flood traffic); messages/acks still relay. // flood traffic); messages/acks still relay.
// repeat_max_hops: drop a flood packet once it has already travelled this // repeat_max_hops: drop a flood packet once it has already travelled this
@@ -9,13 +9,14 @@
extern MyMesh the_mesh; extern MyMesh the_mesh;
// Single-screen device diagnostics: packet counts by category (RX/TX), radio // Single-screen device diagnostics: uptime, packet counts by category (RX/TX),
// totals, uptime, heap and stack headroom. Built from Dispatcher's per-type // forwarded-packet count, heap and stack headroom, radio signal (noise floor,
// counters (Mesh.h/Dispatcher.cpp) — grouped into a handful of categories // RSSI/SNR), packet-pool/outbound-queue depth, and radio error flags. The packet
// rather than all 16 raw PAYLOAD_TYPE_* values, so it stays readable on a // counts are built from Dispatcher's per-type counters (Mesh.h/Dispatcher.cpp) —
// 128x64 OLED without needing the full type list. Falls back to scrolling // grouped into a handful of categories rather than all 16 raw PAYLOAD_TYPE_*
// (same drawList-style indicator as every other screen) on screens too small // values, so they stay readable on a 128x64 OLED without the full type list.
// to show every row at once. // Falls back to scrolling (same drawList-style indicator as every other screen)
// on screens too small to show every row at once. Hold Enter resets the counters.
class DiagnosticsScreen : public UIScreen { class DiagnosticsScreen : public UIScreen {
UITask* _task; UITask* _task;
int _scroll = 0; int _scroll = 0;