loadPrefsInt guarded each EastMesh field with its own available() check
and no bail-out. On a short prefs file that skipped a large field but
still satisfied a later, smaller one: with 8 bytes left, bridge_peer_host
(64) was correctly skipped, then bridge_peer_port (2) passed its guard
and read two misaligned bytes. It has no constrain(), so it loaded 0
instead of its 1883 default.
Read sequentially and stop at the first field that isn't fully present,
leaving the rest at their constructor defaults.
This does not make a differently-laid-out prefs file safe to read, only a
shorter one -- fan_mode and fan_timeout_secs still take whatever bytes sit
at 512..514. A format marker on the EastMesh block would close that.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Upstream's persisted fields end at 295. EastMesh's own fields sat
immediately after, so any future upstream append would shift them and
conflict. Base the EastMesh block at 512 instead, with the 295..511 gap
reserved for upstream growth.
Upstream can now append fields with no change to EastMesh offsets; a
static_assert fails the build if upstream ever overruns the gap.
EastMesh fields now occupy 512..741 (was 295..524).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
- 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>
Before this commit, there was no way to set a different max hop count
for unscoped messages.
Now with this change, by defaul it tracks the flood.max setting, until
a user provides a flood.max.unscoped value, which tax precidence for
packets if ROUTE_TYPE_FLOOD is true.
Extract the inline cursor-walk in handleRegionCmd into file-local
helpers (skipSpaces, rtrimSpaces, takeToken, splitNameJump,
processRegionDefSegment), grouped immediately above the consumer.
Behavior is identical; addresses PR #2540 review feedback on
readability.
Tighten the region def docs: collapse five Note callouts into three
grouped paragraphs (Behavior / Existing regions / Limits), add a
case-sensitivity caveat plus an error example, note the cursor reset
between split commands, and use generic placeholder names.
Add a new command `region bulk` for defining region hierarchies in a single line. This command allows users to create multiple regions in a single message. Updated the documentation to include usage examples and detailed parameter descriptions.
USE_LR1110 was missing from the preprocessor guard in CommonCLI.cpp,
causing both get and set to fail silently on T1000-E:
- get radio.rxgain returned the full radio config string (fell through
to the memcmp("radio", 5) branch)
- set radio.rxgain returned "unknown config" (no branch matched)
Fix: add -D USE_LR1110 to variants/t1000-e/platformio.ini and include
USE_LR1110 in the #if guard on both get and set branches.
CustomLR1110Wrapper already implements setRxBoostedGainMode() and
getRxBoostedGainMode() via the RadioLibWrapper virtual interface,
so no radio-layer changes are required.
Tested on T1000-E: get/set/persist all confirmed working.
* room server: added RegionMap, and new CommonCLI wiring, default_scope handling
* sensor: only minimal RegionMap wiring. Still needs work to handle default-scope