github MarekZegare4/MeshCore-Solo v1.24
Solo v1.24

6 hours ago

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 on4.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.
  • 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.

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 (Mostly from CardKB implementation )

  • 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.
  • CardKB's Fn+<letter> accent-popup shortcut could open the accent popup while the device was locked, unlike every other key on the keyboard (all of which are correctly discarded while locked) — it went straight to the keyboard widget instead of through the normal locked-input gate. Now respects the lock like everything else. Since a locked device now correctly ignores CardKB entirely, Fn+Esc (single press) is added as CardKB's own lock/unlock gesture — otherwise a CardKB-only setup had no way to unlock at all.
  • Triple-click could still toggle the buzzer while the screen was locked, on boards that don't have a joystick (the single-user-button and analog-button variants) — the joystick variant already correctly suppressed it. Now consistent everywhere.
  • Shift didn't capitalise ł, ń, ź, ż (or ĺ, ľ, ň, ž) — a case-pairing rule for the wider Latin Extended-A block missed a parity flip around three unpaired codepoints, so e.g. typing "Łódź" with Shift held produced "łódź" instead. Fixed for the whole block.
  • A long press on the physical button neither woke a sleeping display nor kept it awake, and — while unlocked with the display off — could deliver its action to a screen you couldn't see, so the context menu was found already open at the next wake instead of the press simply waking the device. Long-press now goes through the same wake/keep-awake handling every other key already gets.
  • Typing on CardKB right after cycling a T9 letter, then tapping that same T9 cell again quickly, could overwrite an unrelated character. None of CardKB's direct actions — typing, moving the cursor with the arrows, or opening the placeholder picker with Tab — were invalidating the pending T9 cycle the way every on-screen keypress already does, so the next tap "continued" the cycle against a moved cursor.
  • The keyboard's text preview could split a Cyrillic, Greek or accented character in half at the end of a line, drawing garbage on both sides of the break, and fitted only half as much text per line as it had room for. Line breaks in the preview were counted in bytes rather than characters — every other part of the keyboard already counted characters.
  • Caps-lock and one-shot Shift looked identical on the keyboard's ⇧ key, so there was no way to tell whether the next letter alone or every following letter would be capitalised. Caps-lock is now marked with an underline on the key.
  • E-ink: the screen faded as you used it — text drawn a few updates earlier went grey while whatever had just changed stayed crisp, and only a full refresh brought it back (until the next few updates ate it again). A partial update is differential: the panel drives only the pixels that differ from the previous frame and leaves the rest to hold their own charge, which this panel doesn't do well. Every update now drives the whole image, at the cost of a few milliseconds of SPI — the refresh itself takes exactly as long as before, so nothing got slower. Cutting power mid-image also leaves much less residue on the panel now. Full rfsh is still there for clearing ghosts and can stay off.
  • A message containing a line break drew two words on top of each other. Newlines the sender typed were treated as ordinary characters — measured as a blank 6px cell, then handed to the display, which moved back to the left edge one row down mid-line and drew the rest of it over the following line. Line breaks now end the line properly (blank lines included) in the fullscreen message view and the history list, and fold into a space in the one-line message previews.

Don't miss a new MeshCore-Solo release

NewReleases is sending notifications on new releases.