mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-10-08 02:36:42 +00:00
fix(radio): disable Pwr save (RX duty-cycle) — unsafe across mixed firmware
Field report: a user on the stock SF8 "EU/UK (Narrow)" preset saw reception drop from ~1-5 msg/min to ~1/3h with Pwr save on, unaffected by a better antenna. Root cause, confirmed against the SX1262 datasheet and RadioLib's own maintainers (jgromes/RadioLib#1597, closed as inherent chip behaviour): the SX126x's duty-cycle preamble detection needs the sender's actual preamble to closely match what we've configured our receiver to expect. A mismatch — e.g. a repeater still on pre-v1.16 firmware sending 16 symbols against our 32 — doesn't cost a little sensitivity, it silently drops every packet from that sender regardless of signal strength. There's no local parameter fix: shortening minSymbols to tolerate shorter preambles directly shortens the wake-window's correlator dwell time, trading the preamble mismatch failure mode for a marginal-signal one instead. Checked whether IoTThinks' MeshCore fork solved this differently — it doesn't hit the problem at all, because its "power saving" only light-sleeps the MCU on the radio's own GPIO interrupt and never touches RX duty-cycle. examples/companion_radio/MyMesh.h now defines FEAT_RX_POWERSAVE 0, gating out the Settings row, the Diagnostics RXPS watchdog row, and every call site that would apply rx_powersave to the radio or CAD auto-enable — including forcing setPowerSaving(false) unconditionally so a stale rx_powersave=1 byte from before this change can't do anything either. The real duty-cycle implementation in RadioLibWrapper/CustomSX1262Wrapper is left in place, unneutered, for if a network-wide compatibility mechanism (e.g. the still-unused ADV_FEAT1/FEAT2 advert bits) is ever built to make it safe. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -46,6 +46,13 @@ protected:
|
||||
// stays in RX to receive the packet (RX_DONE on DIO1) — no MCU state machine,
|
||||
// average RX current cut several-fold. Driven from armRecv()/loop(); falls back
|
||||
// to continuous RX if the modem doesn't support it.
|
||||
// Companion-side gating: FEAT_RX_POWERSAVE (examples/companion_radio/MyMesh.h)
|
||||
// is 0, so nothing on that target ever calls setPowerSaving(true) and this
|
||||
// path never actually runs there -- the SX126x duty-cycle's preamble
|
||||
// detection needs the sender's actual preamble to exactly match what we
|
||||
// configure (confirmed hardware behaviour, not a bug here), which can't be
|
||||
// guaranteed across a mesh with mixed firmware. See that file before
|
||||
// re-enabling it anywhere.
|
||||
bool _power_save = false;
|
||||
bool _ps_active = false; // is the radio currently armed in duty-cycle mode
|
||||
int8_t _tx_dbm = 0; // last TX power applied (tracks APC's live value)
|
||||
|
||||
Reference in New Issue
Block a user