mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-09-14 15:16:40 +00:00
docs: update release notes for v1.24 recap and the power-saving/UI fixes
Restructures already-shipped v1.24 content out of Unreleased into its own version section, adds the missing v1.22 heading and a v1.21 separator, documents the M5Stack Cardputer ADV / LilyGO T-Echo Lite KeyShield board support, and folds in the locked-screen Messages fix, the GPS duty-cycle races, and the OFF-casing cleanup. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
721f892307
commit
71c39bab4f
+27
-8
@@ -2,23 +2,38 @@
|
||||
|
||||
### What's new
|
||||
|
||||
- **Two new boards with a keyboard built in: M5Stack Cardputer ADV and LilyGO T-Echo Lite + KeyShield.** Both drive the solo UI from a real keypad, so neither needs a CardKB or a wired joystick to be a complete standalone device. The **Cardputer ADV** (ESP32-S3, ST7789 TFT, built-in QWERTY) is supported across the full env range — companion over BLE or USB, solo (`M5Stack_Cardputer_ADV_companion_solo_dual`), repeater, ESP-NOW repeater bridge, room server, terminal chat and KISS modem — and detects at boot whether its LoRa module is fitted, via the PI4IOE5V6408 IO-expander. The **KeyShield** is an add-on for the LilyGO T-Echo Lite (whose base variant arrived from upstream), giving it a T9 keypad and a controllable backlight, with its own solo build (`LilyGo_T-Echo-Lite_keyshield_companion_solo_dual`). Bringing the KeyShield variant in also caught four issues in that base variant — swapped GPS RX/TX pins, the wrong TCXO voltage, an unused TX LED, and a missing e-ink panel include — and the KeyShield solo build itself picked up the `-Os` size optimisation every other nRF52 solo build already had (it had been missed), taking flash use from 90.7% down to 61.4%. Both keypads are TCA8418-based and share one polling path, independent of the CardKB support — a board can have either, or neither. The Cardputer's ST7789 driver also gained the misc-fixed 6×9 font (full Latin, Greek and Cyrillic), so its on-screen keyboard types every alphabet the other solo boards can rather than falling back to transliteration.
|
||||
- **Solo builds for Heltec V3 and V4** (`Heltec_v3_companion_solo_dual`, `heltec_v4_companion_solo_dual`) — the full standalone on-device UI instead of a screen that only mirrors the phone app, with dual transport so the companion app can attach over BLE or USB serial (BLE wins while both are live), same as the Wio Tracker L1 solo builds. Dual transport had only ever been built for nRF52, so ESP32 got its own `DualSerialInterface` to match. Both boards ship with a single button, which the solo UI can't be driven from, so each env enables both supported input devices with default pins picked from what that board leaves free: a **CardKB** on a second I2C bus (pair it with Ext. KB = Compact and no joystick is needed at all) and a **wired joystick** (four direction pins plus a Back button, wired straight to GND — the firmware enables the internal pull-ups). Either is enough on its own, and pins with nothing attached read as not-pressed, so the unused half costs nothing. The env comments list which GPIOs each board has already claimed, for anyone wiring theirs differently. The release job initially only attached `*.uf2`/`*.zip` (which covered every solo board back when they were all nRF52), so these two boards' `.bin` images would have shipped nowhere; releases now also carry a `-merged.bin` (bootloader + partition table + app, flashed at `0x0`) per ESP32 board.
|
||||
- **Screenshot support on the Heltec V3/V4 solo builds.** `ENABLE_SCREENSHOT` was set on every other solo env but these two, so [Solo Tools](https://marekzegare4.github.io/Solo-tools/) couldn't capture their display. Now consistent across all seven solo builds.
|
||||
- **GPS duty-cycling — Settings › System › "GPS pwr"** (boards with GPS). Off by default (today's always-on behaviour); pick 1/5/15/30 min or 1 h and GPS sleeps for that long between fixes instead of running continuously — each wake waits for a fix, capped at 60s, before going back to sleep. Automatically stays continuously on regardless of this setting whenever something actually needs a live position: an active Trail recording, Map › Live share, an armed Locator, the Compass / Nearby navigate view, or an in-flight `!gps fix` request (so its own up-to-300s acquire window isn't cut short by the 60s cap) — so none of those features degrade, only the idle time between them gets cheaper. Manually turning GPS on or off while duty-cycling is running no longer confuses the scheduler's own sleep/wake timer into immediately reversing the change. The GPS status icon blinks while napping.
|
||||
- **RX duty-cycle power-save (Settings › Radio › Pwr save) now recovers on its own if it gets stuck.** The SX126x's hardware duty-cycle sequencer cycles RX↔sleep with no MCU involvement, so a desync (a known failure mode) previously had nothing watching for it — the radio could silently stop receiving. A background watchdog now notices (no BUSY-pin activity for too long), tries a cheap re-arm first, and escalates to a full radio reset if that doesn't clear it. Recovery counts are visible on Tools › Diagnostics › Live as "RXPS wd s/h" and stay `0/0` on a healthy radio.
|
||||
|
||||
### Fixes
|
||||
|
||||
- **Interference detection (`int.thresh`) silently stopped working as soon as RX power-save was turned on.** Noise-floor sampling was skipped entirely while the SX126x duty-cycles RX on its own, so the floor stayed frozen at whatever it was the moment power-save switched on — comparisons against it grew meaningless the longer the session ran. The radio now borrows a brief continuous-RX window once a minute to take a fresh reading, then goes back to duty-cycling.
|
||||
- **The clock's "Messages" field showed nothing at all on a locked screen** — every other choice under Settings › CLOCK FIELDS (battery, contacts, GPS, every sensor) displayed normally, so there was no combination that could get the unread count in front of you without unlocking first. The lock screen formats its two values through its own routine, written for sensor readings, which never learned about the message-count field; it fell through to an empty string, and an empty string draws nothing. It now shows the same unread total (DMs + channels + rooms) the unlocked clock page does, as e.g. `3 msgs`. Note that the lock screen still only shows the first two of the three configured fields, by design — a field set as **Field 3** appears on the clock page but not on the lock screen.
|
||||
- **"Off" was spelled three different ways across the UI: `OFF`, `Off`, `off`.** Every genuine on/off toggle already agreed on `OFF`/`ON`, but the disabled point of several value pickers didn't: Settings' LowBat/GPS pwr/e-ink full-refresh options and the auto-advert interval all showed lowercase `off` next to their other values, GPIO's mode row showed `Off` right above its own State row's `OFF`, and the GPS-averaging/trail-autopause pickers showed `Off` where the alarm-repeat picker (same screen family) already said `OFF`. All now read `OFF`, matching every toggle elsewhere.
|
||||
|
||||
---
|
||||
|
||||
## MeshCore Solo Companion Firmware v1.24
|
||||
|
||||
### What's new
|
||||
|
||||
- **Auto-Reply Bot is renamed to Remote Bot.** It's grown beyond auto-replies into remote device control (Actions, below), so the Tools screen entry and docs now say "Remote Bot" — same screen, same settings, nothing to reconfigure.
|
||||
- **Remote Bot gains Actions: `!buzz`, `!gps`, `!advert`.** A new **Actions** toggle (per target — Direct/Channel/Room, nested under each target's existing **Commands** toggle) enables three commands that change the device's own behaviour instead of just reporting on it: `!buzz [seconds]` sounds the buzzer as a find-me signal (default 5s, capped at 30s, sounds even if the buzzer is muted), `!gps on`/`!gps off` toggles GPS, and `!advert` sends an immediate advert (0 hop). Off by default; combines with the existing query commands in one message the same way (`!batt !gps on` → `4.10V | GPS: on`).
|
||||
- **`!gps fix [seconds]` — single-shot GPS location, no need to leave GPS running.** Turns GPS on (if it wasn't already), waits for a stabilised fix (HDOP ≤ 2.0 — falls back to ≥8 satellites on GPS hardware that doesn't report HDOP — then averages for 10s), sends the position, and restores GPS to whatever state it was in before — up to a 90s timeout by default (override with an optional argument, clamped to 15-300s, for a poor sky view where 90s isn't always enough), after which it reports a partial fix (if it got at least some samples) or failure. Replies in two parts: an immediate "acquiring fix..." ack, then the actual position as a follow-up message once ready. Only one fix request can be in flight at a time (a second one gets "fix already pending"); same Actions toggle as `!buzz`/`!gps`/`!advert`.
|
||||
- **Bot Trigger fields accept multiple phrases.** Pack several trigger words into one Trigger field, comma-separated (`hi,hello there,yo`) — matching any one of them fires the reply, same as before for a single phrase.
|
||||
- **Remote Bot Actions gain `!gpio1`..`!gpio4`** (Wio Tracker L1 only — 4 otherwise-unused pins). Each pin is independently set to Off/Input/Output (GPIO1/GPIO2 also offer Analog) from a new **Tools › GPIO** screen; `!gpio1 on`/`!gpio1 off` drives an Output pin remotely, a bare `!gpio1` reports the current mode and reading (including a millivolt value in Analog mode). Gated by the same per-target Actions toggle as `!buzz`/`!gps`/`!advert`.
|
||||
- **Optional CardKB support (Wio Tracker L1, Grove I2C) — full keyboard-only navigation.** Plug an M5Stack CardKB into the Grove connector and it's auto-detected at boot — no setting to flip. Typing goes straight into the message/name field instead of navigating the on-screen keyboard grid, always as plain Latin text regardless of the Settings › Keyboard language/type — arrows and Esc work as expected everywhere else too (including inside the placeholder and accent popups). Enter acts like the physical centre button (advances the on-screen grid selection) rather than submitting, so **Fn+Enter** sends the message/confirms the field from anywhere, and **Fn+`<letter>`** opens that letter's accent popup directly (no arrow-hunting needed — handy for Polish/Czech/etc. diacritics — and works no matter what language/keyboard type is configured, since CardKB always types Latin either way). **Tab** is the Hold-Enter equivalent everywhere, including message reply/navigate and the Bot/Admin/Repeater menus — same single shortcut whether or not the on-screen keyboard is showing.
|
||||
- **Solo builds for Heltec V3 and V4** (`Heltec_v3_companion_solo_dual`, `heltec_v4_companion_solo_dual`) — the full standalone on-device UI instead of a screen that only mirrors the phone app, with dual transport so the companion app can attach over BLE or USB serial (BLE wins while both are live), same as the Wio Tracker L1 solo builds. Dual transport had only ever been built for nRF52, so ESP32 got its own `DualSerialInterface` to match. Both boards ship with a single button, which the solo UI can't be driven from, so each env enables both supported input devices with default pins picked from what that board leaves free: a **CardKB** on a second I2C bus (pair it with Ext. KB = Compact and no joystick is needed at all) and a **wired joystick** (four direction pins plus a Back button, wired straight to GND — the firmware enables the internal pull-ups). Either is enough on its own, and pins with nothing attached read as not-pressed, so the unused half costs nothing. The env comments list which GPIOs each board has already claimed, for anyone wiring theirs differently.
|
||||
- **GAT562 30S solo builds now use the same OLED font as the Wio Tracker L1.** The misc-fixed 6x9 font (full Latin, Greek and Cyrillic) had only ever reached the SH1106 and e-ink drivers, so on this board every keyboard alphabet beyond ASCII, and every accented contact name, was still being transliterated (`Łódź` → `Lodz`) or drawn as a filled block. Solo builds only — the font costs ~14 KB of flash and the repeater/companion builds have no keyboard to type those alphabets on; they keep the built-in font and are byte-for-byte unchanged.
|
||||
- **Screenshot support on the Heltec V3/V4 solo builds.** `ENABLE_SCREENSHOT` was set on every other solo env but these two, so [Solo Tools](https://marekzegare4.github.io/Solo-tools/) couldn't capture their display. Now consistent across all five solo builds.
|
||||
- **GPS duty-cycling — Settings › System › "GPS pwr"** (boards with GPS). Off by default (today's always-on behaviour); pick 1/5/15/30 min or 1 h and GPS sleeps for that long between fixes instead of running continuously — each wake waits for a fix, capped at 60s, before going back to sleep. Automatically stays continuously on regardless of this setting whenever something actually needs a live position: an active Trail recording, Map › Live share, an armed Locator, or the Compass / Nearby navigate view — so none of those features degrade, only the idle time between them gets cheaper. The GPS status icon blinks while napping.
|
||||
- **RX duty-cycle power-save (Settings › Radio › Pwr save) now recovers on its own if it gets stuck.** The SX126x's hardware duty-cycle sequencer cycles RX↔sleep with no MCU involvement, so a desync (a known failure mode) previously had nothing watching for it — the radio could silently stop receiving. A background watchdog now notices (no BUSY-pin activity for too long), tries a cheap re-arm first, and escalates to a full radio reset if that doesn't clear it. Recovery counts are visible on Tools › Diagnostics › Live as "RXPS wd s/h" and stay `0/0` on a healthy radio.
|
||||
|
||||
_Work in progress territory_
|
||||
|
||||
- **Optional CardKB support (Wio Tracker L1, Grove I2C) — full keyboard-only navigation.** Plug an M5Stack CardKB into the Grove connector and it's auto-detected at boot — no setting to flip. Typing goes straight into the message/name field instead of navigating the on-screen keyboard grid, always as plain Latin text regardless of the Settings › Keyboard language/type — arrows and Esc work as expected everywhere else too (including inside the placeholder and accent popups). Enter acts like the physical centre button (advances the on-screen grid selection) rather than submitting, so **Fn+Enter** sends the message/confirms the field from anywhere, and **Fn+`<letter>`** opens that letter's accent popup directly (no arrow-hunting needed — handy for Polish/Czech/etc. diacritics — and works no matter what language/keyboard type is configured, since CardKB always types Latin either way). **Tab** is the Hold-Enter equivalent everywhere, including message reply/navigate and the Bot/Admin/Repeater menus — same single shortcut whether or not the on-screen keyboard is showing.
|
||||
- **Settings › Keyboard gets an "Ext. KB" row** (boards that support CardKB, above). Switching it to **Compact** hides the on-screen letter grid, special-row icons, and status line entirely — a CardKB typist never looks at any of it, and none of it (script/page, T9-vs-ABC, caps) is actually actionable from CardKB anyway — replacing them with just a reminder of the Tab/Fn+letter shortcuts; the accent and placeholder popups still show normally. With the grid hidden, arrows and Tab take on more useful direct meanings instead of driving an invisible grid selection: **arrows** move the text cursor immediately (no more entering cursor mode first), **plain Enter** submits the message/field (same as Fn+Enter — there's no grid cell to commit), and **plain Tab** opens the placeholder picker directly. Compact is designed to need no joystick/physical button at all, and reclaims the freed space for extra message-preview lines. Off (**Full**) by default.
|
||||
|
||||
### Fixes
|
||||
### Fixes (mostly from the CardKB implementation)
|
||||
|
||||
- **Interference detection (`int.thresh`) silently stopped working as soon as RX power-save was turned on.** Noise-floor sampling was skipped entirely while the SX126x duty-cycles RX on its own, so the floor stayed frozen at whatever it was the moment power-save switched on — comparisons against it grew meaningless the longer the session ran. The radio now borrows a brief continuous-RX window once a minute to take a fresh reading, then goes back to duty-cycling.
|
||||
- **ESP32 solo firmware was built by CI but never published.** The release job only attached `*.uf2` and `*.zip`, which covered every solo board back when they were all nRF52 — the Heltec V3/V4 `.bin` images were produced and then silently dropped, so there was nothing to download for those boards. Releases now carry a single `-merged.bin` per ESP32 board (bootloader + partition table + app, flashed at `0x0`); the app-only `.bin` is deliberately left out, since flashing that one at `0x0` looks exactly like a bricked device.
|
||||
- **DM/room replies sometimes didn't show who they were addressed to, and room messages could wrap incorrectly.** The reply-prefix (`@[nick] `) was being stripped at the wrong point for room posts and DMs feeding the fullscreen message view, so a DM reply's "To:" header could go missing while a room reply showed the raw `@[nick] ` marker as literal message text; a related mismatch meant the history list's scrollbar/box-height sizing pass wrapped room messages with their sender name still attached, disagreeing with the actual rendered text.
|
||||
- **Remote Bot Actions (`!buzz`/`!gps`/`!advert`/`!gpio1`..`!gpio4`) ran immediately on every matching message, before quiet hours/cooldown/per-contact throttle were checked** — those gates only suppressed the reply text, not the actual buzz/GPS toggle/advert/pin write, so e.g. `!buzz` still audibly buzzed during configured quiet hours, and repeating a command wasn't rate-limited at all. Actions now only run once those checks have passed.
|
||||
- **A channel's or DM/room's unread badge could claim messages the history no longer held** — e.g. showing "7 unread" on a conversation that opens to an empty list, and opening it only knocked the count down by one instead of clearing it. Every unread badge is now capped at what its message ring actually still holds; a channel's counter only decrements on eviction when the dropped message was itself unread (previously it decremented regardless, undercounting newer unread messages), and a DM sender's badge now self-heals (and frees up for a new sender) once their messages have left the shared 32-slot DM ring.
|
||||
@@ -86,7 +101,9 @@
|
||||
- **`KeyboardWidget` reworked to UTF-8 codepoints** throughout (insert, backspace, T9 in-place cycling), so a multi-byte alt-alphabet character can never be split.
|
||||
- **`NodePrefs` schema grew twice this cycle** — `alarm_repeat_mask`/`keyboard_alt_alphabet`, then the bot room-target/per-target-independence fields — each verified via a standalone host compile and `sizeof`/`offsetof` check, with the schema sentinel bumped both times; existing users' prefs upgrade in place with safe defaults.
|
||||
|
||||
---
|
||||
|
||||
## MeshCore Solo Companion Firmware v1.22
|
||||
|
||||
### What's new
|
||||
|
||||
@@ -115,6 +132,8 @@
|
||||
|
||||
- **OLED draws less** — the SH1106 driver now skips pushing a frame over I²C when it's byte-identical to the last one, cutting redundant traffic and a little power on the static screens (clock, home) that don't change between updates.
|
||||
|
||||
---
|
||||
|
||||
## MeshCore Solo Companion Firmware v1.21
|
||||
|
||||
### What's new
|
||||
|
||||
Reference in New Issue
Block a user