docs(release-notes): catch up v1.27 with missing entries; tune(ui): faster marquee hold

release-notes.md was missing three shipped changes: the Msg-wake toggle +
all-home-pages default, the repeater advert-interval default (2min->6min),
and three Fixes (settings-persist-on-reboot, RTC bootstrap floor-not-
rollback, ESP32 diagnostics heap/stack).

marqueeHoldMs() reverted 1500/2500 -> 700/1200 (OLED/e-ink) -- the longer
hold made the swing-marquee's full reveal cycle too slow for long message
previews.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-09-08 10:12:58 +02:00
co-authored by Claude Sonnet 5
parent 531eec2cd3
commit 1f41b3a1b8
2 changed files with 8 additions and 1 deletions
+7
View File
@@ -8,9 +8,16 @@
- **Favourites now behave the same on every list.** A favourite is marked with a ★ on its row and sorted above everything else — in Messages (contacts, rooms, channels) and in Tools Nodes alike, and the Locator target picker marks them too. New **Settings Contacts Favs top** turns the sorting off if you'd rather keep the natural order; it's on by default. On Nodes, the old `Favourite` menu row actually pinned to the dial despite its name — it's now split into a real `Fav: ON/OFF` and a separate `Pin to dial`.
- **Contacts and rooms can be marked as favourites from the device.** `Fav: ON/OFF` joins the contact and room context menus, alongside the one channels already had. It's the same starred flag the phone app shows, so it syncs both ways — and it's what the Settings Contacts `DMs`/`Rooms` = `Fav` list filters read, which previously could only be satisfied by starring someone in the app.
- **"Path" / "Relayed by" — see which repeaters actually carried a message.** Hold Enter on a message (list or fullscreen) and, when the data is available, the Options menu gains a new row: **Path (N hops)** on a received message lists the repeaters it actually travelled through, in order; **Relayed by (N)** on your own channel post lists every distinct repeater heard echoing it back into the mesh. Each hop resolves to a contact's name where known, or a short hex tag otherwise.
- **Settings Sound gains "Msg wake".** Turn it off if you don't want an incoming message to turn the screen back on when it was off and no phone/app is connected. On by default — today's behaviour is unchanged either way.
- **A brand-new (or factory-reset) device now shows every Home page by default**, instead of a curated 5-page carousel (Clock, Tools, Shutdown, Favourites, Map) that made the rest opt-in only. Existing devices' own saved Home Pages selection is untouched.
- **Repeater builds now default to a 6-minute local advert interval** (was 2 minutes) — quieter out of the box for a unit sitting on a desk or freshly deployed. Change it anytime under Settings Radio.
### Fixes
- **Changing a setting and then rebooting or powering off without first backing out of that screen could silently lose the change** — most commonly hit via the low-battery auto-shutdown, which can fire mid-edit regardless of which screen is open. Every settings screen already saved correctly on its own Back/Cancel path, but the actual reboot/power-off code itself never flushed anything on its own. It now does, unconditionally, on every real shutdown/reboot path (including the phone app's and the serial CLI's reboot commands) — a deliberate factory reset is the one reboot that still wipes settings, as intended.
- **A device with its own working clock (a board with a real RTC, or the browser demo) could have its time dragged backwards on boot** by a contact's older saved timestamp, instead of that timestamp only ever being used as a floor when the clock had no better source. Fixed so an already-correct clock is never rolled back.
- **Diagnostics Live always showed "N/A" for Heap free / Stack free on ESP32 boards** (Heltec V3/V4 and others) — those stats only had an implementation for nRF52. Now reported correctly on ESP32 too.
- **Remote Bot's channel auto-replies showed up in the device's own history as if someone else had sent them, labelled with the device's own name.** The reply was stored with the device's node name as the sender prefix instead of the `"Me: "` convention the history view uses to tell an outgoing post apart from an incoming one, so the bubble rendered left-anchored like an incoming message. Now framed the same way an on-device or app-originated channel post is.
- **A room server could end up pinned to the Favourites Dial and then never be removed.** The pin picker's "recent conversations" tier didn't filter by contact type, and room posts share the DM history, so a room could appear there; opening it from the dial then skipped the login handshake, and Unpin only existed in the chat contact list, which rooms never appear in. Rooms are now pinned deliberately (and open correctly), and any tile can be unpinned from the dial itself.
- **Bluetooth connect/disconnect/reconnect cycles (e.g. a phone drifting in and out of range) could make the device nearly unresponsive for a few seconds at a time**, including briefly after turning BLE off. A failed BLE notify was retried on a fixed short interval, repeatedly hitting a blocking wait deep in the BLE stack while the link stayed marginal. Failed sends now back off exponentially (capped at 2s) instead of hammering the same blocking call.
+1 -1
View File
@@ -345,7 +345,7 @@ public:
// ghosting there). Unchanged frames are skipped by the display's own CRC
// diff before any real panel push happens, so the hold phases are free.
virtual unsigned long marqueeStepMs() { return isEink() ? 900 : 220; }
virtual unsigned long marqueeHoldMs() { return isEink() ? 2500 : 1500; }
virtual unsigned long marqueeHoldMs() { return isEink() ? 1200 : 700; }
virtual uint8_t marqueeStepChars() { return isEink() ? 3 : 1; }
// draw text with ellipsis if it exceeds max_width. Pass selected=true for