Keep upstream's persisted layout verbatim (rx_boosted_gain 290 ..
cad_enabled 294) and append the EastMesh-only fields after it, rather
than interleaving fan_mode/fan_timeout_secs into upstream's range.
Minimises CommonCLI.cpp conflicts on every upstream sync.
EastMesh fields now occupy 295..524: fan_mode, fan_timeout_secs, and
bridge_peer_*. Existing prefs files written by prior EastMesh firmware
will be misread from offset 292 onward and need reconfiguring.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The `recv_pkt_region` is set when processing a flood packet in `filterRecvFloodPacket`
but direct/non-flood packets would never pass through that function, so the pointer was
not cleared for them.
`sendFloodReply` would then later use it blindly, which meant that the response would
either inherit the region from the last flood packet, or refer to a non-initialised pointer
if no region floods had been received yet.
hasSeen() was simultaneously a predicate and a mutator — it inserted the
packet hash on every miss, making five call sites that only wanted to mark
a packet as sent call it with the return value discarded.
Split into:
- wasSeen() — pure predicate, no side effects
- markSeen() — explicit insert
All query sites now call markSeen() immediately after wasSeen() returns
false, preserving identical runtime behaviour. The five mark-only send
sites (sendFlood, sendDirect, sendZeroHop x2) now call markSeen directly.
Also fixes three bridge sites (BridgeBase, ESPNowBridge, RS232Bridge)
that had the same query+implicit-insert pattern.
Tests: add test/test_mesh_tables/ covering wasSeen purity, markSeen,
dup stats, and clear. Update SHA256 mock to produce deterministic output
(previously finalize() was a no-op). Add Packet.cpp to native build filter.
- Added build flag "SX126X_USE_REGULATOR_LDO" (set to 1 to enable) to use LDO for the SX1262 radio instead of DC-DC when the DCDC pin isn't wired up (e.g. t-echo lite)
- Added additional debug mode diagnostic messages during SX1262 init to better highlight faults
De-emphasize the observer-eastmesh-bridge-mqtt feature in public-facing
docs (the community prefers not to surface another MQTT-backed mesh):
- eastmesh-docs: drop the track from index/releases/boards track lists,
the custom-cli "MQTT Bridge Settings" section, and the web-panel peer
broker fields; keep only a vague mention in local-builds.md.
- release-notes.yml: remove the track from the list and drop the
2026.7.0 observer-eastmesh-bridge-mqtt entry.
- README: remove the "bidirectional MQTT mesh bridge" bullet and add the
missing repeater-bridge-espnow track to "What This Repo Adds".
The feature, build envs, and CI are unchanged; this is visibility only.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
MQTT status payload:
- Add packets_sent and packets_received (cumulative radio TX/RX totals)
to the status `stats` object, aligning with the Waev/MeshMapper schema.
Variants (variants/eastmesh_mqtt -> variants/eastmesh):
- Rename the variant folder to variants/eastmesh.
- Add the remaining *_repeater_observer_mqtt_bridge envs (2 -> 36), one
per observer board.
- Regroup envs by board (observer -> espnow -> mqtt_bridge) and add
per-vendor section banners.
Docs & release notes:
- Update folder path references in README, AGENTS, and boards docs.
- Add observer-eastmesh and observer-eastmesh-bridge-espnow 2026.6.6
release notes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Resolve leftover merge conflict markers in release-notes.yml from PR #73,
keeping both the observer-eastmesh-bridge-espnow 2026.6.5 and the new
observer-eastmesh-bridge-mqtt 2026.7.0 entries in track order
- Normalize the bridge-mqtt release entry `area:` values to the file's
conventions (bridge -> mqtt, boards -> board)
- Remove dead bridge_peer_port > 65535 check in loadPrefsInt (uint16_t can
never exceed 65535; the 0 -> 1883 default is handled at use)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add Waev (mqtt.waev.app) as a curated MQTT broker, selectable from the
web-panel Primary/Secondary dropdowns and the CLI.
- Broker spec on bit 0x20, audience mqtt.waev.app, Google Trust Services
WE1 CA (matches Waev's cert chain); widen broker mask/count to 0x3F/6
- Per-broker JWT lifetime via BrokerSpec.token_ttl_secs: Waev enforces a
1-hour max token TTL and rejects the 6h default with MQTT CONNACK 5,
so it mints a 3600s token while other brokers keep the 6h default
- CLI get/set mqtt.waev, web-panel dropdown entry + hidden toggle, docs
- Log token TTL in the "token ready" line for broker auth debugging
fix(web): make Custom MQTT settings full width when Custom is selected
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>