Jakub 453dc5e570 feat(admin): typed Radio/Routing field editors; pre-release audit fixes
Tools > Admin: split the Radio tab's single "f,bw,sf,cr" comma-string
field (free-text keyboard) into 4 independent, type-appropriate rows --
Frequency (same digit-cursor DigitEditor Settings/Repeater use locally),
Bandwidth/Spreading factor/Coding rate (discrete-set LEFT/RIGHT stepping),
plus TX power and the 3 Routing numeric fields as number steppers and
Repeat as an ON/OFF toggle. Edits happen locally (zero mesh traffic per
keystroke); only Enter sends one combined `set`, Cancel sends nothing.

Full pre-release audit of all 16 commits since v1.22 (5 parallel focus
areas: display/font, keyboard/messages, Nodes/Admin, Bot/channels,
UITask+NodePrefs schema) turned up and fixed:

- Admin: fetched FK_NUMBER values weren't clamped to the field's range,
  so a value already out-of-range could get stuck unreachable; fixed
  commit-time float format noise (%.6f -> %.3f); Cancel/failed-login
  always returned to the Nodes picker even when Admin was opened
  directly from a node's Hold-Enter action -- now returns to wherever
  it was actually opened from (AdminScreen::_from_picker).
- Keyboard: one-shot Shift was consumed after the *first* T9 multi-tap,
  so cycling to the 2nd/3rd candidate always came out lowercase --
  fixed by caching the cycle's caps state (t9_caps).
- Messages: history is numbered newest-first, so a message arriving
  while scrolled up to an older one silently relabeled the view onto a
  different message -- selection now shifts with the insert.
- Channels: onChannelRemoved() didn't clear ch_notif_override/
  ch_notif_muted/ch_fav_bitmask despite its own contract comment
  requiring it (now far more reachable via the on-device Delete);
  an all-zero hex secret silently self-deleted the channel it was
  just saved into (collides with the empty-slot sentinel) -- rejected.
- Room login: isRoomLoggedIn() indexed the login-tracking ring
  directly instead of via its head offset, silently wrong once the
  ring wraps (8+ rooms/session) -- the new on-device Logout depends
  on this being right.
- Font/display: removed the now fully-inert Settings > Display > Font
  toggle and the dead LemonFont.h (retired by the earlier misc-fixed
  font unification, zero remaining includes); fixed a copy-pasted
  "5x7" comment (font is 6x9), two meaningless dead ternaries, and an
  OLED/e-ink inconsistency in the undefined-glyph fallback box offset.
- AdminField's `kind`/bounds fields no longer rely on default member
  initializers inside aggregate-init: this toolchain's actual nRF52
  build (unlike env:native) has no explicit -std= override, so it
  predates C++14's aggregate-with-default-member-initializer rule.
  Given an explicit constructor instead -- portable regardless of
  standard, all existing field-table literals unchanged.

Docs updated to match: tools_screen.md (Diagnostics as a 3-tab
carousel, was documented as one flat screen), message_screen.md
(chat bubbles, newest-at-bottom, cursor mode, secret validation),
settings_screen.md (dropped the dead Font row), solo_ui_framework.md
(header menu_hint signatures, icon priority-drop, KeyboardWidget's
T9/alphabets/cursor-mode). release-notes.md gains the v1.23 section
covering all of the above plus the other 15 commits since v1.22.

Build-verified on WioTrackerL1_companion_solo_dual.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-17 19:38:51 +02:00
2026-04-28 21:39:34 +10:00
2026-05-23 23:52:04 +02:00
2025-01-13 14:07:48 +11:00
2025-06-05 20:35:40 +12:00
2026-04-24 19:37:21 +00:00
2026-03-23 14:26:56 +01:00
2025-01-20 10:20:42 +11:00
2025-01-25 23:09:09 +11:00
2026-03-31 00:51:15 +13:00
2025-03-03 18:08:00 +13:00
2026-06-05 21:25:25 +12:00

MeshCore Solo Companion Firmware

A fork of the official MeshCore companion radio firmware with extended features and UI enhancements, targeting a growing set of supported devices.

Join the discussion on the official MeshCore Discord: https://discord.gg/sdhYArU2jr

Solo firmware thread: https://discord.com/channels/1495203904898728149/1505294337884553447


Supported Devices

Device Display Firmware file
Seeed Wio Tracker L1 (OLED) SSD1306 / SH1106 128 × 64 solo-<version>-WioTrackerL1.uf2
Seeed Wio Tracker L1 (E-ink) GxEPD2 250 × 122 solo-<version>-WioTrackerL1Eink.uf2
GAT562 30S Mesh Kit SSD1306 128 × 64 solo-<version>-GAT562-30S-Mesh-Kit.uf2

All firmware files are published on the releases page. Each binary supports both BLE and USB serial — there are no separate BLE/USB builds.


Feature highlights

  • Extended language support with native Unicode rendering and input (Lemon font) alongside the original ASCII mode (Default font with transliteration) — on-screen keyboard alphabets for Cyrillic, Greek, Polish, Czech, Slovak, German, French, Spanish, Portuguese and Nordic (Danish/Norwegian/Swedish), selectable in Settings Keyboard Alphabet

  • Enabled sensor screens with support for onboard sensors (temperature, humidity, pressure, luminosity, CO₂) and GPS data

  • GPS navigation — a full navigation suite that needs no extra hardware (details in the Tools Screen docs):

    • Waypoints — mark a spot (car, camp, water…) with a short label, see it on the trail map, and get live bearing + distance back to it; the list always offers a one-tap backtrack to where your trail started
    • GPS compass — heading derived from course-over-ground (no magnetometer needed), shown as a clear scrolling heading tape with a large degrees + cardinal readout
    • Navigate to anything — a saved waypoint, a node straight from Nearby Nodes, or a location someone shares with you in a message
    • Share & save locations — send a waypoint to a contact or channel; on the other end, navigate to or save any shared location with one menu
    • Live location sharing — broadcast your position over the mesh as you move (movement-gated, to a channel or contact) and see others who share theirs as pins on the map and live distance/bearing in Nearby
    • Locator — arm a geofence around a target — a saved waypoint or a person (their live/last-known position) — and get an alert when you arrive/leave or they get near/far, with an optional homing beeper that ticks faster the closer you get. Set it from the Locator screen or straight from Nearby Nodes / Waypoints, and see the target as a flag on the map
    • GPS trail — background route recording with an auto-fit map (waypoints + live position), summary stats, auto-pause on stops, and GPX export
    • Metric or imperial — one global Units setting drives every distance and speed across the UI
  • Messages Screen — view and send messages, open message details, reply with quick messages or custom text, navigate to / save locations shared in a message, per-channel notification and melody overrides, add/edit/delete channels on-device

  • Favourites Dial — pin up to six contacts for quick access from the home screen

  • Settings Screen — configure display, sound, home page order, radio and system settings

  • Clock Screen — view time and date plus up to three configurable data fields, with built-in clock tools (one-shot alarm, countdown timer, stopwatch)

  • Screen Lock — lock the device to prevent accidental keypresses, with a lock screen showing time and sensor data

  • Tools Screen — GPS trail & waypoints, compass, nearby nodes (with ping & navigate), ringtone editor, auto-reply bot, auto-advert, live location sharing, locator, diagnostics, repeater, remote admin

  • Battery saving (radio) — two optional, independent toggles under Settings Radio:

    • Pwr save — hardware duty-cycle receive (SX126x SetRxDutyCycle): the radio cycles RX↔sleep on its own and wakes on a preamble, cutting average RX current with only a little added receive latency
    • Auto pwr — Adaptive Power Control: trims actual TX power on strong links (from ACK SNR) and ramps back up to the configured ceiling on weak/lost links; the home screen shows the live power

E-ink Display (Wio Tracker L1)

The e-ink variant targets the Wio Tracker L1 fitted with a 2.13″ GxEPD2 panel (250 × 122 px). All screens have been adapted for the e-ink panel:

  • Adaptive layout — every screen reflows correctly in both landscape (250 × 122) and portrait (122 × 250) orientations
  • Display rotation — configurable in Settings Display; applied immediately and persisted across reboots
  • Joystick rotation — independent of display rotation; useful for custom enclosures
  • Full refresh interval — configurable in Settings Display; reduces ghosting on long sessions
  • Clock seconds suppressed by default — seconds are hidden to reduce per-second panel refreshes and extend display lifetime; re-enable in Settings Display

Flashing

  1. Download the .uf2 file for your device from the releases page
  2. Press reset twice quickly to enter bootloader mode — the device should appear as a mass storage drive on your computer
  3. Copy the .uf2 file to the drive to flash the firmware

Important

BLE connection has priority over USB serial. When a BLE connection is active, the USB protocol is suspended. When connecting to the companion app via USB, ensure to disconnect from BLE first or disable BLE directly from the device to avoid confusion.

Updating to a newer version usually does not require erasing flash unless the release notes explicitly state otherwise.

Warning

When migrating from official or other custom firmware, backup your data and perform a factory reset to prevent conflicts with existing settings:

  1. Open device settings in the companion app and download a data backup
  2. Go to MeshCore Flasher, select your device, and perform Erase flash before flashing

Documentation

This fork

Document Description
Messages Screen Sending messages, context menus, reply, navigate to / save shared locations, Notif/Melody overrides
Favourites Dial Pinned contacts grid, unread badges, pin/unpin
Clock Screen Clock page, date, configurable data fields, alarm / timer / stopwatch
Settings Screen All settings sections with values and interactions
Screen Lock Lock/unlock sequence, lock screen, auto-lock
Tools Screen GPS trail & waypoints, compass, navigation, nearby nodes, ringtone editor, auto-reply bot, auto-advert, live location sharing, locator, diagnostics, repeater, remote admin
Solo UI framework Developer guide — the reusable building blocks (screens, lists, popups, mini-icons, geo/persistence helpers) and how to add a new feature

Upstream MeshCore

Document Description
FAQ Frequently asked questions
CLI Commands Commands for repeaters, room servers and sensors
Terminal Chat CLI Commands for the terminal chat client
Companion Protocol Serial/BLE frame protocol between device and app
Packet Format LoRa packet structure
QR Codes Channel and contact QR code formats

Solo Tools

All solo builds include screenshot and GPX trail export support out of the box — no special build flags required.

Solo Tools Web App — no install required

Open the link in a browser with Web Serial support (Chromium-based) and click Connect device. The web app supports:

  • Screenshot — capture the current display contents as a PNG
  • GPX export — stream the GPS trail and download a timestamped .gpx file

Trigger the relevant action on the device (Tools Trail Hold Enter for GPX export, S key for screenshot) after connecting.

Disconnect from the companion app before connecting via USB — USB serial is suspended while a BLE connection is active.

If the companion app is connected over BLE the GPX export is safe (USB receive is ignored). If the app is on USB, disconnect it first — the raw stream will otherwise disrupt the app's frame protocol.


Development

This fork tracks the upstream MeshCore repository. To prevent upstream changes from overwriting this README during merges, README.md is protected via .gitattributes. After cloning, run once:

git config merge.ours.driver true

Contributing

Contributions are welcome. Fork the repository, make your changes, and open a pull request. Please follow the existing code style and keep changes focused.


Contributors

Big thanks to the people who contributed to this fork:

Built on upstream MeshCore and its community.

Description
Companion firmware fork — offline GPS navigation (waypoints, compass, GPX export) on top of LoRa mesh messaging.
Readme 14 MiB
Languages
C 60.1%
C++ 37.9%
Python 1.4%
Shell 0.3%
HTML 0.3%