docs: document repeater politeness knobs and Diagnostics screen

- settings_screen: full Radio section (Preset/Freq/SF/BW/CR/Repeater were
  undocumented), plus the five flood-only politeness sub-items.
- tools_screen: new Diagnostics section (per-type counters, heap/stack, radio,
  pool/queue, Forwarded, reset popup).
- README + FEATURES: mention diagnostics; FEATURES gets a full repeater entry.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-06-19 08:40:53 +02:00
co-authored by Claude Sonnet 4.6
parent d790f7e5cd
commit 22ad46257f
4 changed files with 94 additions and 5 deletions
+44
View File
@@ -441,6 +441,50 @@ 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
left (PPK2 current measurement, multi-hop APC gating).
### ✅ Companion repeater + politeness knobs + diagnostics
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`.
- **Repeater toggle** (`client_repeat`, Settings Radio) — the companion relays
flood/direct traffic on its **current** frequency (no dedicated band), still
working as a normal companion. `MyMesh::allowPacketForward` gates it; loop
detection (`isRepeatLooped`, ported from `simple_repeater`) and an advert
flood-depth cap are always applied. Packet pool bumped 16→32 to match the
repeater workload (a too-small pool starved channel/DM reception once relaying
queued retransmits).
- **Politeness knobs** (all opt-in, default off, flood-only — a direct route's
named next hop is never dropped). Shown under Radio only while the repeater is
on:
- **Skip advert** — don't re-flood adverts (highest-volume flood).
- **Max hops** — drop a flood past N hops.
- **Yield** — scale the retransmit delay for *forwarded* floods only
(`getRetransmitDelay`); own sends pass their own delay to `sendFlood`, so the
companion's own traffic is never slowed. Widens the overhear window.
- **Min SNR** — drop a flood copy below a dB threshold (`-128` sentinel = off,
so an upgraded prefs file can't read as "filter at 0 dB").
- **Suppress dup** — overhear cancel: a received flood whose hash matches a
queued retransmit cancels our copy (`Dispatcher::suppressQueuedDuplicate`,
`wantsOverhearSuppress` hook). MeshCore had no overhear-cancel before — the
unused `removeOutboundByIdx`/`getOutboundByIdx` finally have a caller. Packet
hash ignores the path for non-TRACE, so our copy and the peer's relayed copy
hash equal. Pairs with Yield (longer delay → wider window to hear a peer).
- **Diagnostics screen** (Tools Diagnostics) — single read-only page: per-type
RX/TX counters (generic `Dispatcher::n_recv_by_type`/`n_sent_by_type`), uptime,
heap + stack (new `DeviceDiag` helper, nRF52 linker-symbol/`sbrk` heap +
FreeRTOS stack high-water), noise floor, RSSI/SNR, pool free, outbound queue,
and **Forwarded** (`Mesh::n_forwarded` — actual retransmits; backed out on
overhear cancel so it reflects what hits the air). Enter opens a confirm popup
to reset the cumulative counters (`resetStats` made virtual; `Mesh` override
also clears `n_forwarded`).
- Prefs persisted behind schema sentinels `0xC0DE000E` (four knobs) then
`0xC0DE000F` (suppress-dup), with stray-byte clamps for upgraders.
- **Open question:** the app-side dedicated-band gate in `CMD_SET_RADIO_PARAMS`
was commented out (not deleted) to match the on-device toggle's any-frequency
behaviour — undecided whether that gate was UX-only or regulatory.
- **Not done:** live two-device mesh verification (A→repeater→C); counters make
it observable but don't replace the field test.
### SOS broadcast
Configurable in Settings System SOS: