From 149693c92898183f67937e1c0a01c2a4a068ff07 Mon Sep 17 00:00:00 2001 From: MarekZegare4 Date: Thu, 28 May 2026 10:54:09 +0200 Subject: [PATCH 01/14] docs refactor --- README.md | 290 ++++---------------------- docs/plus_features/clock_screen.md | 5 + docs/plus_features/favourites_dial.md | 21 ++ docs/plus_features/message_screen.md | 50 +++++ docs/plus_features/screen_lock.md | 8 + docs/plus_features/settings_screen.md | 31 +++ docs/plus_features/tools_screen.md | 100 +++++++++ 7 files changed, 253 insertions(+), 252 deletions(-) create mode 100644 docs/plus_features/clock_screen.md create mode 100644 docs/plus_features/favourites_dial.md create mode 100644 docs/plus_features/message_screen.md create mode 100644 docs/plus_features/screen_lock.md create mode 100644 docs/plus_features/settings_screen.md create mode 100644 docs/plus_features/tools_screen.md diff --git a/README.md b/README.md index 1ef6db9d..3ddffbc2 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,41 @@ -# Wio Tracker L1 — Extended Companion Radio Firmware +# Plus firmware for Seeed Wio Tracker L1 This branch extends the official MeshCore companion radio firmware for the **Seeed Wio Tracker L1**. -Join the discussion on offical MeshCore discord: https://discord.gg/sdhYArU2jr +Join the discussion on the offical MeshCore discord: https://discord.gg/sdhYArU2jr [E-ink case](https://www.printables.com/model/1420534-seeed-wio-tracker-l1-e-ink-enclosure) [Oled case](https://www.printables.com/model/1380791-meshpack-seeed-l1-oled) + + +--- + +## Feature highlights + +- Extended language support with native Unicode rendering and input (Lemon font) alongside the original ASCII mode (Default font with transliteration) + +- [Messages Screen](./docs/plus_features/message_screen.md) — view and send messages, open message details, reply with quick messages or custom text, per-channel notification and melody overrides + +- [Favourites Dial](./docs/plus_features/favourites_dial.md) — pin up to six contacts for quick access from the home screen + +- [Settings Screen](./docs/plus_features/settings_screen.md) — configure display, sound, home page order, radio and system settings + +- [Clock Screen](./docs/plus_features/clock_screen.md) — view time and date plus up to three configurable sensor values + +- [Screen Lock](./docs/plus_features/screen_lock.md) — lock the device to prevent accidental keypresses, with a lock screen showing time and sensor data + +- [Tools Screen](./docs/plus_features/tools_screen.md) — GPS trail recording and export, ringtone editor, auto-reply bot, and more + ## Firmware Variants Two firmware builds are published with each release: @@ -20,258 +47,17 @@ Two firmware builds are published with each release: Both variants are built from a single codebase and share the same feature set. The `dual` in the filename means a single binary supports both BLE and USB serial — there are no separate BLE/USB builds. -### E-ink Display +>[!WARNING] +>When migrating from official/custom firmware, backup your data and **perform factory reset** to prevent conflicts with existing settings and data: +>1. Open device settings in the companion app and download data backup +>2. Go to [MeshCore Flasher](https://meshcore.io/flasher) website +>3. Select "Wio Tracker L1 Pro" +>4. Choose any of the firmware variant +>5. Perform "Erase flash" -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 -- **Scaled navigation dots** — dot indicators on the home screen scale with line height so they remain visible at all orientations -- **Clock seconds suppressed by default** — seconds are hidden to reduce per-second panel refreshes and extend display lifetime; re-enable in Settings › Display --- - -## New Features - -### Messages Screen - -View and send messages using the on-screen keyboard or predefined quick replies. The keyboard supports placeholders that insert live sensor data — `{time}` and `{loc}` are always available; additional placeholders (`{temp}`, `{hum}`, `{pres}`, `{batt}`, `{alt}`, `{lux}`, `{co2}`) appear automatically for sensors that are connected and returning data. - -Each message in the history list shows the sender name and a compact age indicator (`3m`, `2h`, `>1d`) in the top-right corner of the entry. - -``` -╔══════════════════════════════╗ -║ #general ║ -╠══════════════════════════════╣ -║▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ║ ← selected -║ Alice 3m ║ -║ Hey, let's meet tomorrow ║ -║┌───────────────────────────┐ ║ -║│▓▓▓▓▓▓▓▓▓ Bob 1h ▓▓▓▓ │ ║ -║│ Sure, what time works? │ ║ -║└───────────────────────────┘ ║ -║[+ send] ║ -╚══════════════════════════════╝ -``` - -Press Enter on a message to open it in fullscreen. Navigate between messages with left (newer) and right (older). If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar is shown below the sender name and the body is displayed without the address prefix. - -``` -╔══════════════════════════════╗ -║▓▓ Alice ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ║ ← sender -║▓▓ To: Bob ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ║ ← recipient -╠══════════════════════════════╣ -║ Hey Bob, let's meet up ║ -║ tomorrow at 6pm downtown. ║ -║ Will you make it? ║ -║ ║ -║< newer older >║ -╚══════════════════════════════╝ -``` - -Hold Enter on a message to open a context menu. From the list or fullscreen view, select **Reply** to pre-fill the keyboard or a quick message with `@[nick]` so the recipient is clearly addressed. The reply picker title shows the recipient's name. - -``` -╔══════════════════════════════╗ -║ RE:Alice ║ -╠══════════════════════════════╣ -║> Custom message... ║ -║ OK, I understand ║ -║ On my way ║ -║ Be right there ║ -╚══════════════════════════════╝ -``` - -On channel or contact list entries, the context menu also lets you change per-channel notification settings (mute, follow global, or force-on), per-channel melody override (follow global, Melody 1, or Melody 2), or mark messages as read. - -**Mark all read** — Hold Enter on the DM / Channels / Rooms mode-select screen to clear all unread counters for the highlighted category at once. - -### Favourites Dial - -A dedicated home page showing a 2×3 grid of pinned contacts. Navigate tiles with the joystick; press Enter on a filled tile to open that contact's DM directly. - -``` -╔══════════════════════════════╗ -║ Favourites ║ -╠══════════════════════════════╣ -║ ┌──────┐ ┌──────┐ ┌──────┐ ║ -║ │Alice │ │Bob 3│ │ + │ ║ -║ └──────┘ └──────┘ └──────┘ ║ -║ ┌──────┐ ┌──────┐ ┌──────┐ ║ -║ │Carol │ │ + │ │ + │ ║ -║ └──────┘ └──────┘ └──────┘ ║ -╚══════════════════════════════╝ -``` - -- Unread badge shown on filled tiles -- Enter on an empty tile (`+`) opens a contact picker (upstream-favourited contacts first, then recent DMs) -- **Pin / unpin** — open a DM, then Hold Enter › options menu › "Pin to dial" to choose a slot; selecting a contact already pinned elsewhere moves it to the new slot -- LEFT/RIGHT in the Home Pages settings reorders the Favourites page in the navigation sequence - -### Settings Screen - -All settings are saved to flash and restored on next boot. Settings are organised into collapsible sections — press Enter on a section header to expand or collapse it. All sections start collapsed for faster navigation. - -- **Display** - - Brightness - - Auto-off timeout - - Battery display mode (icon, %, V) - - Clock seconds (show/hide — hiding reduces display refresh from 1 s to 60 s) - - Clock format (12 h / 24 h) - - Font — **Default** (5×7 Adafruit, ASCII + transliteration) or **Lemon** (native Unicode, pixel-accurate wrap) - - Display rotation *(e-ink only)* — 0 ° / 90 ° / 180 ° / 270 °; applied immediately - - Joystick rotation *(e-ink only)* — rotates the joystick input mapping independently of the display rotation; useful when mounting the device in a custom enclosure - - Full refresh interval *(e-ink only)* — how many partial refreshes before a cleansing full refresh (off / 5 / 10 / 20 / 30); reduces ghosting on long sessions -- **Sound** - - Buzzer: On / Off / **Auto** — Auto mode silences the device while connected via Bluetooth, and re-enables sound when the connection drops - - Volume (1–5; preview tone plays on each change) - - DM Melody — notification sound for incoming private messages: built-in, Melody 1, or Melody 2 - - Channel Melody — notification sound for incoming channel messages: built-in, Melody 1, or Melody 2 -- **Home Pages** — toggle visibility and reorder individual home screen pages; press LEFT / RIGHT on any entry to move it earlier or later in the navigation sequence; press ENTER to toggle ON / OFF (Settings and Messages are always visible and cannot be disabled) -- **Radio** - - TX power -- **System** - - Timezone (UTC offset in hours) - - Low battery shutdown threshold - - Auto-lock — automatically locks the device when the display turns off -- **Contacts** - - Show all DMs or favourites only - - Show all room servers or favourites only -- **Messages** - - Edit up to 10 quick reply templates (Q1–Q10) - -### Clock Screen - -A dedicated clock page on the home screen shows the current time and date, synchronized from GPS or via Bluetooth. Timezone offset is applied from Settings. - -Up to three configurable data fields are displayed below the clock. Available fields: battery voltage, temperature, humidity, pressure, GPS coordinates, altitude, luminosity, CO₂, contact count, and total unread message count. - -### Screen Lock - -Hold **Back** and press **Enter** three times to lock or unlock the device. While locked: - -- The display turns off and ignores incoming keypresses -- A brief button press shows the lock screen: current time, date, and up to two sensor values (reuses the Dashboard Config fields) -- A hint popup guides through the unlock sequence -- **Auto-lock** (configurable in Settings → System) locks automatically when the display turns off - -### Nearby Nodes - -Browse nodes that have recently advertised on the mesh. Filter by category (Favourites, All, Companion, Repeater, Room, Sensor). Select a node to see its coordinates, distance, bearing with cardinal direction, type, and last-heard time. - -``` -╔══════════════════════════════╗ -║▓▓▓▓▓ WioTracker-Alice ▓▓▓▓▓▓ ║ ← node name -╠══════════════════════════════╣ -║ Lat: 50.06190 ║ -║ Lon: 19.94090 ║ -║ Dist: 2.3km ║ -║ Az: 145d (SE) ║ -║ Type: Companion ║ -║ Seen: 5m ago ║ -╚══════════════════════════════╝ -``` - -Use **Send my advert** (hold Enter → context menu) to broadcast your position and prompt nearby nodes to respond with theirs. - -#### Active Discovery - -Press **Enter** from the Nearby screen to send a live `NODE_DISCOVER_REQ` ping. All reachable repeaters, sensors and room servers within zero-hop range respond immediately with their name, type and signal data. Results appear as 2-line boxed cards with RSSI, SNR and the remote SNR (signal quality at the responder's end). - -``` -╔═══════════════════════════════╗ -║▓▓▓▓▓▓▓ DISCOVER (2 found) ▓▓ ║ -╠═══════════════════════════════╣ -║▓▓▓▓▓▓▓▓▓▓▓▓▓ Rptr-A Rpt ▓▓▓▓║ ← selected -║▓▓▓▓▓▓▓▓ RSSI:-79 SNR:9 ▓▓▓▓▓▓▓║ -║┌────────────────────────────┐ ║ -║│▓▓▓▓▓▓▓▓▓▓▓▓ Sensor-B Snsr │ ║ -║│ RSSI:-94 SNR:3 │ ║ -║└────────────────────────────┘ ║ -╚═══════════════════════════════╝ -``` - -Navigate with **UP/DOWN**. Press **Enter** on a node to open a full-screen detail view showing the public key, RSSI, SNR, remote SNR and whether the node is already in your contacts. - -Hold **Enter** from the discovery list to rescan. Press **Cancel** or **Back** to return. - -### Tools Screen - -#### GPS Trail - -Records your route in a RAM ring buffer (up to 512 points). Sampling runs in the background whenever tracking is active — a blinking **G** indicator appears in the status bar. The trail survives display auto-off but is lost on reboot unless saved to flash first. - -Three views cycle with **LEFT / RIGHT**: - -| View | Content | -|------|---------| -| **Summary** | Total distance, elapsed time, avg speed or pace, point count, tracking status | -| **Map** | Auto-fit dot-and-line plot with cos(lat) aspect correction; segment breaks marked with open/filled dots; north arrow; scale grid (toggle with Enter) | -| **List** | Per-point rows showing local time (HH:MM) and delta distance from the previous point; segment-start rows show `start` | - -**Hold Enter** opens the action menu: - -| Item | Action | -|------|--------| -| Min dist | Cycle min-distance gate: 5 m / 10 m / 25 m / 100 m (LEFT/RIGHT while focused) | -| Units | Cycle speed/pace units: km/h / mph / min/km / min/mi (LEFT/RIGHT while focused) | -| Start / Stop tracking | Begin or end a recording session | -| Save trail | Write the current RAM ring to flash (`/trail`) | -| Load trail | Restore the saved flash trail into RAM | -| Export GPX | Stream the live RAM trail as GPX 1.1 over USB Serial | -| Export saved | Stream the saved flash trail as GPX 1.1 over USB Serial without loading it into RAM | -| Reset trail | Clear the RAM ring and elapsed time | - -#### Downloading GPX to your computer - -1. Connect the device to your computer with a USB cable. -2. Open a serial terminal at **115200 baud** on the device's serial port: - - **macOS / Linux** — `screen /dev/tty.usbmodem* 115200` or `cat /dev/tty.usbmodem*` (replace with your port, e.g. `/dev/ttyACM0` on Linux); to save directly to a file use `cat /dev/tty.usbmodem* > track.gpx` and stop with Ctrl-C after the dump completes - - **Windows** — open PuTTY (Connection type: Serial, Speed: 115200), or use Arduino IDE › Tools › Serial Monitor (set line ending to "No line ending") -3. On the device, navigate to **Tools › Trail**, then **Hold Enter** and select **Export GPX** (live ring) or **Export saved** (flash slot). -4. The device streams a GPX 1.1 XML document to the serial port. Copy the output starting from `` and save it as a `.gpx` file. -5. Import the file into any GPX-compatible application — OsmAnd, Garmin BaseCamp, GPX Studio, Google Earth, etc. - -> **Note:** If the companion app is connected over **BLE**, the export is safe — the app ignores USB input while BLE is active and the device alert will read *"GPX N B (USB)"*. If you are using the app over **USB**, disconnect from the app first before exporting; the raw XML stream will otherwise disrupt the app's serial framing. The alert *"GPX N B - disc. app"* indicates no BLE link was detected and serves as a reminder to reconnect the app afterwards. - -#### Auto-Advert - -Periodically broadcasts a 0-hop advert with your GPS position so nearby nodes can track your location automatically. Configurable interval: off / 30 s / 1 min / 2 min / 5 min / 10 min / 30 min / 1 h. - -A blinking **A** indicator appears in the status bar while Auto-Advert is active. - -#### Ringtone Editor - -A step sequencer for composing custom notification melodies stored on the device. Two independent melody slots are available — **Melody 1** and **Melody 2** — switchable from within the editor. Each melody supports up to 32 notes with adjustable pitch (C–B + pause), octave (4–7), duration (1/4 / 1/8 / 1/16 / 1/32), and BPM (60 / 90 / 120 / 150 / 180). Playback preview is available directly from the editor. - -Melodies can be assigned as notification sounds per message type (DM / channel) in Settings, and individually overridden per channel or per contact from the message screen context menu. - -#### Auto-Reply Bot - -Automatically replies to incoming messages that contain a configured trigger word (case-insensitive). - -- **DM mode** — when enabled, the bot listens to all incoming private messages and replies with the DM reply text. -- **Channel mode** — optionally, select a channel for the bot to monitor. When a trigger is matched, it replies with a separate channel reply text. -- Both modes can be active simultaneously and share the same trigger word but use independent reply texts. -- Replies support placeholders (`{time}`, `{loc}`). -- A 10-second cooldown prevents repeated replies in quick succession. - ---- - -## Font Switcher - -Both the default font and the [Lemon bitmap font](https://github.com/cmvnd/fonts) are built into every firmware variant. Switch between them at runtime in **Settings → Display → Font** — no reflashing required. The selected font is saved to flash and takes effect immediately. - -The Lemon font offers: - -- **Native Unicode rendering** — Latin Extended, Greek, and Cyrillic characters (U+0020–U+04FF) are displayed directly without transliteration, covering Polish, Czech, Slovak, German, French, Scandinavian, Hungarian, Romanian, Croatian, Turkish, Baltic, Russian, and Greek scripts. -- **Pixel-accurate word wrap** — text wraps based on actual glyph widths rather than a fixed character count. -- **Slightly taller glyphs** — the font uses a 9 px line height on OLED and 10 px on e-ink, compared to 8 px for the default font on both displays. - ---- - -Feel free to explore, share feedback and feature requests! - ## Development This fork tracks the upstream [MeshCore](https://github.com/ripplebiz/MeshCore) repository. To prevent upstream changes from overwriting this README during merges, `README.md` is protected via `.gitattributes`. After cloning, run once: @@ -279,11 +65,11 @@ This fork tracks the upstream [MeshCore](https://github.com/ripplebiz/MeshCore) ```sh git config merge.ours.driver true ``` ---- #### Display Screenshot Tool -> **⚠️ Note:** The screenshot feature requires the `ENABLE_SCREENSHOT` build flag to be enabled. Add `-D ENABLE_SCREENSHOT` to your PlatformIO build flags, then recompile and flash the firmware. +> [!NOTE] +> The screenshot feature requires the `ENABLE_SCREENSHOT` build flag to be enabled. Add `-D ENABLE_SCREENSHOT` to your PlatformIO build flags, then recompile and flash the firmware. The firmware supports capturing the current display contents and transmitting it over USB serial. This is useful for debugging, remote monitoring, or diff --git a/docs/plus_features/clock_screen.md b/docs/plus_features/clock_screen.md new file mode 100644 index 00000000..1af458e8 --- /dev/null +++ b/docs/plus_features/clock_screen.md @@ -0,0 +1,5 @@ +### Clock Screen + +A dedicated clock page on the home screen shows the current time and date, synchronized from GPS or via Bluetooth. Timezone offset is applied from Settings. + +Up to three configurable data fields are displayed below the clock. Available fields: battery voltage, temperature, humidity, pressure, GPS coordinates, altitude, luminosity, CO₂, contact count, and total unread message count. \ No newline at end of file diff --git a/docs/plus_features/favourites_dial.md b/docs/plus_features/favourites_dial.md new file mode 100644 index 00000000..1bba25bb --- /dev/null +++ b/docs/plus_features/favourites_dial.md @@ -0,0 +1,21 @@ +### Favourites Dial + +A dedicated home page showing a 2×3 grid of pinned contacts. Navigate tiles with the joystick; press Enter on a filled tile to open that contact's DM directly. + +``` +╔══════════════════════════════╗ +║ Favourites ║ +╠══════════════════════════════╣ +║ ┌──────┐ ┌──────┐ ┌──────┐ ║ +║ │Alice │ │Bob 3│ │ + │ ║ +║ └──────┘ └──────┘ └──────┘ ║ +║ ┌──────┐ ┌──────┐ ┌──────┐ ║ +║ │Carol │ │ + │ │ + │ ║ +║ └──────┘ └──────┘ └──────┘ ║ +╚══════════════════════════════╝ +``` + +- Unread badge shown on filled tiles +- Enter on an empty tile (`+`) opens a contact picker (upstream-favourited contacts first, then recent DMs) +- **Pin / unpin** — open a DM, then Hold Enter › options menu › "Pin to dial" to choose a slot; selecting a contact already pinned elsewhere moves it to the new slot +- LEFT/RIGHT in the Home Pages settings reorders the Favourites page in the navigation sequence \ No newline at end of file diff --git a/docs/plus_features/message_screen.md b/docs/plus_features/message_screen.md new file mode 100644 index 00000000..842214d6 --- /dev/null +++ b/docs/plus_features/message_screen.md @@ -0,0 +1,50 @@ +View and send messages using the on-screen keyboard or predefined quick replies. The keyboard supports placeholders that insert live sensor data — `{time}` and `{loc}` are always available; additional placeholders (`{temp}`, `{hum}`, `{pres}`, `{batt}`, `{alt}`, `{lux}`, `{co2}`) appear automatically for sensors that are connected and returning data. + +Each message in the history list shows the sender name and a compact age indicator (`3m`, `2h`, `>1d`) in the top-right corner of the entry. + +``` +╔══════════════════════════════╗ +║ #general ║ +╠══════════════════════════════╣ +║▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ║ ← selected +║ Alice 3m ║ +║ Hey, let's meet tomorrow ║ +║┌───────────────────────────┐ ║ +║│▓▓▓▓▓▓▓▓▓ Bob 1h ▓▓▓▓ │ ║ +║│ Sure, what time works? │ ║ +║└───────────────────────────┘ ║ +║[+ send] ║ +╚══════════════════════════════╝ +``` + +Press Enter on a message to open it in fullscreen. Navigate between messages with left (newer) and right (older). If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar is shown below the sender name and the body is displayed without the address prefix. + +``` +╔══════════════════════════════╗ +║▓▓ Alice ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ║ ← sender +║▓▓ To: Bob ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ║ ← recipient +╠══════════════════════════════╣ +║ Hey Bob, let's meet up ║ +║ tomorrow at 6pm downtown. ║ +║ Will you make it? ║ +║ ║ +║< newer older >║ +╚══════════════════════════════╝ +``` + +Hold Enter on a message to open a context menu. From the list or fullscreen view, select **Reply** to pre-fill the keyboard or a quick message with `@[nick]` so the recipient is clearly addressed. The reply picker title shows the recipient's name. + +``` +╔══════════════════════════════╗ +║ RE:Alice ║ +╠══════════════════════════════╣ +║> Custom message... ║ +║ OK, I understand ║ +║ On my way ║ +║ Be right there ║ +╚══════════════════════════════╝ +``` + +On channel or contact list entries, the context menu also lets you change per-channel notification settings (mute, follow global, or force-on), per-channel melody override (follow global, Melody 1, or Melody 2), or mark messages as read. + +**Mark all read** — Hold Enter on the DM / Channels / Rooms mode-select screen to clear all unread counters for the highlighted category at once. \ No newline at end of file diff --git a/docs/plus_features/screen_lock.md b/docs/plus_features/screen_lock.md new file mode 100644 index 00000000..3f47f480 --- /dev/null +++ b/docs/plus_features/screen_lock.md @@ -0,0 +1,8 @@ +### Screen Lock + +Hold **Back** and press **Enter** three times to lock or unlock the device. While locked: + +- The display turns off and ignores incoming keypresses +- A brief button press shows the lock screen: current time, date, and up to two sensor values (reuses the Dashboard Config fields) +- A hint popup guides through the unlock sequence +- **Auto-lock** (configurable in Settings → System) locks automatically when the display turns off \ No newline at end of file diff --git a/docs/plus_features/settings_screen.md b/docs/plus_features/settings_screen.md new file mode 100644 index 00000000..a8d11d99 --- /dev/null +++ b/docs/plus_features/settings_screen.md @@ -0,0 +1,31 @@ +### Settings Screen + +All settings are saved to flash and restored on next boot. Settings are organised into collapsible sections — press Enter on a section header to expand or collapse it. All sections start collapsed for faster navigation. + +- **Display** + - Brightness + - Auto-off timeout + - Battery display mode (icon, %, V) + - Clock seconds (show/hide — hiding reduces display refresh from 1 s to 60 s) + - Clock format (12 h / 24 h) + - Font — **Default** (5×7 Adafruit, ASCII + transliteration) or **Lemon** (native Unicode, pixel-accurate wrap) + - Display rotation *(e-ink only)* — 0 ° / 90 ° / 180 ° / 270 °; applied immediately + - Joystick rotation *(e-ink only)* — rotates the joystick input mapping independently of the display rotation; useful when mounting the device in a custom enclosure + - Full refresh interval *(e-ink only)* — how many partial refreshes before a cleansing full refresh (off / 5 / 10 / 20 / 30); reduces ghosting on long sessions +- **Sound** + - Buzzer: On / Off / **Auto** — Auto mode silences the device while connected via Bluetooth, and re-enables sound when the connection drops + - Volume (1–5; preview tone plays on each change) + - DM Melody — notification sound for incoming private messages: built-in, Melody 1, or Melody 2 + - Channel Melody — notification sound for incoming channel messages: built-in, Melody 1, or Melody 2 +- **Home Pages** — toggle visibility and reorder individual home screen pages; press LEFT / RIGHT on any entry to move it earlier or later in the navigation sequence; press ENTER to toggle ON / OFF (Settings and Messages are always visible and cannot be disabled) +- **Radio** + - TX power +- **System** + - Timezone (UTC offset in hours) + - Low battery shutdown threshold + - Auto-lock — automatically locks the device when the display turns off +- **Contacts** + - Show all DMs or favourites only + - Show all room servers or favourites only +- **Messages** + - Edit up to 10 quick reply templates (Q1–Q10) \ No newline at end of file diff --git a/docs/plus_features/tools_screen.md b/docs/plus_features/tools_screen.md new file mode 100644 index 00000000..6c4b7a91 --- /dev/null +++ b/docs/plus_features/tools_screen.md @@ -0,0 +1,100 @@ +### Nearby Nodes + +Browse nodes that have recently advertised on the mesh. Filter by category (Favourites, All, Companion, Repeater, Room, Sensor). Select a node to see its coordinates, distance, bearing with cardinal direction, type, and last-heard time. + +``` +╔══════════════════════════════╗ +║▓▓▓▓▓ WioTracker-Alice ▓▓▓▓▓▓ ║ ← node name +╠══════════════════════════════╣ +║ Lat: 50.06190 ║ +║ Lon: 19.94090 ║ +║ Dist: 2.3km ║ +║ Az: 145d (SE) ║ +║ Type: Companion ║ +║ Seen: 5m ago ║ +╚══════════════════════════════╝ +``` + +Use **Send my advert** (hold Enter → context menu) to broadcast your position and prompt nearby nodes to respond with theirs. + +#### Active Discovery + +Press **Enter** from the Nearby screen to send a live `NODE_DISCOVER_REQ` ping. All reachable repeaters, sensors and room servers within zero-hop range respond immediately with their name, type and signal data. Results appear as 2-line boxed cards with RSSI, SNR and the remote SNR (signal quality at the responder's end). + +``` +╔═══════════════════════════════╗ +║▓▓▓▓▓▓▓ DISCOVER (2 found) ▓▓ ║ +╠═══════════════════════════════╣ +║▓▓▓▓▓▓▓▓▓▓▓▓▓ Rptr-A Rpt ▓▓▓▓║ ← selected +║▓▓▓▓▓▓▓▓ RSSI:-79 SNR:9 ▓▓▓▓▓▓▓║ +║┌────────────────────────────┐ ║ +║│▓▓▓▓▓▓▓▓▓▓▓▓ Sensor-B Snsr │ ║ +║│ RSSI:-94 SNR:3 │ ║ +║└────────────────────────────┘ ║ +╚═══════════════════════════════╝ +``` + +Navigate with **UP/DOWN**. Press **Enter** on a node to open a full-screen detail view showing the public key, RSSI, SNR, remote SNR and whether the node is already in your contacts. + +Hold **Enter** from the discovery list to rescan. Press **Cancel** or **Back** to return. + +### Tools Screen + +#### GPS Trail + +Records your route in a RAM ring buffer (up to 512 points). Sampling runs in the background whenever tracking is active — a blinking **G** indicator appears in the status bar. The trail survives display auto-off but is lost on reboot unless saved to flash first. + +Three views cycle with **LEFT / RIGHT**: + +| View | Content | +|------|---------| +| **Summary** | Total distance, elapsed time, avg speed or pace, point count, tracking status | +| **Map** | Auto-fit dot-and-line plot with cos(lat) aspect correction; segment breaks marked with open/filled dots; north arrow; scale grid (toggle with Enter) | +| **List** | Per-point rows showing local time (HH:MM) and delta distance from the previous point; segment-start rows show `start` | + +**Hold Enter** opens the action menu: + +| Item | Action | +|------|--------| +| Min dist | Cycle min-distance gate: 5 m / 10 m / 25 m / 100 m (LEFT/RIGHT while focused) | +| Units | Cycle speed/pace units: km/h / mph / min/km / min/mi (LEFT/RIGHT while focused) | +| Start / Stop tracking | Begin or end a recording session | +| Save trail | Write the current RAM ring to flash (`/trail`) | +| Load trail | Restore the saved flash trail into RAM | +| Export GPX | Stream the live RAM trail as GPX 1.1 over USB Serial | +| Export saved | Stream the saved flash trail as GPX 1.1 over USB Serial without loading it into RAM | +| Reset trail | Clear the RAM ring and elapsed time | + +#### Downloading GPX to your computer + +1. Connect the device to your computer with a USB cable. +2. Open a serial terminal at **115200 baud** on the device's serial port: + - **macOS / Linux** — `screen /dev/tty.usbmodem* 115200` or `cat /dev/tty.usbmodem*` (replace with your port, e.g. `/dev/ttyACM0` on Linux); to save directly to a file use `cat /dev/tty.usbmodem* > track.gpx` and stop with Ctrl-C after the dump completes + - **Windows** — open PuTTY (Connection type: Serial, Speed: 115200), or use Arduino IDE › Tools › Serial Monitor (set line ending to "No line ending") +3. On the device, navigate to **Tools › Trail**, then **Hold Enter** and select **Export GPX** (live ring) or **Export saved** (flash slot). +4. The device streams a GPX 1.1 XML document to the serial port. Copy the output starting from `` and save it as a `.gpx` file. +5. Import the file into any GPX-compatible application — OsmAnd, Garmin BaseCamp, GPX Studio, Google Earth, etc. + +> **Note:** If the companion app is connected over **BLE**, the export is safe — the app ignores USB input while BLE is active and the device alert will read *"GPX N B (USB)"*. If you are using the app over **USB**, disconnect from the app first before exporting; the raw XML stream will otherwise disrupt the app's serial framing. The alert *"GPX N B - disc. app"* indicates no BLE link was detected and serves as a reminder to reconnect the app afterwards. + +#### Auto-Advert + +Periodically broadcasts a 0-hop advert with your GPS position so nearby nodes can track your location automatically. Configurable interval: off / 30 s / 1 min / 2 min / 5 min / 10 min / 30 min / 1 h. + +A blinking **A** indicator appears in the status bar while Auto-Advert is active. + +#### Ringtone Editor + +A step sequencer for composing custom notification melodies stored on the device. Two independent melody slots are available — **Melody 1** and **Melody 2** — switchable from within the editor. Each melody supports up to 32 notes with adjustable pitch (C–B + pause), octave (4–7), duration (1/4 / 1/8 / 1/16 / 1/32), and BPM (60 / 90 / 120 / 150 / 180). Playback preview is available directly from the editor. + +Melodies can be assigned as notification sounds per message type (DM / channel) in Settings, and individually overridden per channel or per contact from the message screen context menu. + +#### Auto-Reply Bot + +Automatically replies to incoming messages that contain a configured trigger word (case-insensitive). + +- **DM mode** — when enabled, the bot listens to all incoming private messages and replies with the DM reply text. +- **Channel mode** — optionally, select a channel for the bot to monitor. When a trigger is matched, it replies with a separate channel reply text. +- Both modes can be active simultaneously and share the same trigger word but use independent reply texts. +- Replies support placeholders (`{time}`, `{loc}`). +- A 10-second cooldown prevents repeated replies in quick succession. \ No newline at end of file From c1e713c7b45fcef13035bdc79b0d9fbfe67698f7 Mon Sep 17 00:00:00 2001 From: MarekZegare4 Date: Thu, 28 May 2026 12:44:23 +0200 Subject: [PATCH 02/14] polishing v1 --- README.md | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3ddffbc2..fe7c2630 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ -# Plus firmware for Seeed Wio Tracker L1 +# Plus for Seeed Wio Tracker L1 - community firmware -This branch extends the official MeshCore companion radio firmware for the **Seeed Wio Tracker L1**. +This branch extends the official MeshCore companion radio firmware for the **Seeed Wio Tracker L1**. Provides support for both the original OLED and the e-ink variant, with additional features and UI enhancements. Join the discussion on the offical MeshCore discord: https://discord.gg/sdhYArU2jr -[E-ink case](https://www.printables.com/model/1420534-seeed-wio-tracker-l1-e-ink-enclosure) -[Oled case](https://www.printables.com/model/1380791-meshpack-seeed-l1-oled) +**Enclosures** + +- [E-ink case](https://www.printables.com/model/1420534-seeed-wio-tracker-l1-e-ink-enclosure) +- [Oled case](https://www.printables.com/model/1380791-meshpack-seeed-l1-oled) From 6ce67b80cf8f9576cc9079f2429da2692b2df7d7 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 09:41:35 +0200 Subject: [PATCH 04/14] =?UTF-8?q?docs:=20expand=20message=5Fscreen.md=20?= =?UTF-8?q?=E2=80=94=20all=20options,=20context=20menus,=20placeholders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Describe DM/Channels/Rooms mode-select - Describe MSG_PICK flow (keyboard vs quick replies Q1-Q10) - Complete placeholder table — remove {batt} (shows in picker only when a voltage sensor is connected, not from board battery) - Separate contact and channel context menus with full item tables - Document LEFT/RIGHT cycling for Notif/Melody/Fav - Describe Pin to dial with slot picker detail - Clarify short Enter (fullscreen) vs Hold Enter (context menu) - Add fullscreen navigation and scroll description --- .../message_screen/message_screen.md | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 docs/plus_features/message_screen/message_screen.md diff --git a/docs/plus_features/message_screen/message_screen.md b/docs/plus_features/message_screen/message_screen.md new file mode 100644 index 00000000..c88726a6 --- /dev/null +++ b/docs/plus_features/message_screen/message_screen.md @@ -0,0 +1,106 @@ +## Messages Screen +[Go back](../README.md) + +### Overview + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./mes_scr_1_oled.png) | | + +The Messages screen is split into three modes — **DMs**, **Channels**, and **Rooms** — selectable with UP/DOWN on the mode-select screen. Each mode shows the corresponding list of conversations with unread counters. + +--- + +### Sending messages + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./mes_scr_2_oled.png) | | + +Press **Enter** on a contact or channel to open its history, then press **Enter** again (or select an empty send row) to compose a message. Choose between: + +- **Custom message** — opens the on-screen keyboard +- **Q1–Q10** — quick reply templates editable in Settings › Messages + +The keyboard supports placeholders that insert live data at send time: + +| Placeholder | Value | Availability | +|-------------|-------|--------------| +| `{time}` | current time (HH:MM) | always | +| `{loc}` | GPS coordinates | always (empty if no fix) | +| `{temp}` | temperature | sensor connected | +| `{hum}` | humidity | sensor connected | +| `{pres}` | barometric pressure | sensor connected | +| `{alt}` | altitude | sensor connected | +| `{lux}` | luminosity | sensor connected | +| `{co2}` | CO₂ concentration | sensor connected | + +Sensor placeholders appear automatically in the placeholder picker when the corresponding sensor is active. `{time}` and `{loc}` are always shown. + +--- + +### Message history + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./mes_scr_3_oled.png) | | + +Each entry in the history list shows the sender name and a compact age indicator (`3m`, `2h`, `>1d`) in the top-right corner. + +**Short Enter** on a message opens it in fullscreen. **Hold Enter** opens the context menu (Reply option). + +--- + +### Fullscreen message view + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./mes_scr_4_oled.png) | | + +Navigate between messages with **LEFT** (newer) and **RIGHT** (older). Long messages scroll with **UP/DOWN**. + +If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar is shown below the sender name and the body is displayed without the address prefix. + +**Hold Enter** in fullscreen opens the Reply option. + +--- + +### Context menu — contact list + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./mes_scr_5_oled.png) | | + +**Hold Enter** on a contact entry opens a context menu: + +| Item | Action | +|------|--------| +| Mark as read | Clears unread counter for this contact | +| Notif: default / OFF / ON | Per-contact notification override — **LEFT/RIGHT** to cycle | +| Melody: global / M1 / M2 | Per-contact melody override — **LEFT/RIGHT** to cycle | +| Pin to dial / Unpin (slot N) | Pin this contact to a Favourites Dial slot; if already pinned shows which slot | + +When **Pin to dial** is selected, a slot picker opens (Slot 1–6 showing current occupant name or "empty"). Choosing a slot that already holds another contact moves the new contact there. + +--- + +### Context menu — channel list + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./mes_scr_6_oled.png) | | + +**Hold Enter** on a channel entry opens a context menu: + +| Item | Action | +|------|--------| +| Mark all read | Clears all unread for this channel | +| Notif: default / OFF / ON | Per-channel notification override — **LEFT/RIGHT** to cycle | +| Melody: global / M1 / M2 | Per-channel melody override — **LEFT/RIGHT** to cycle | +| Fav: yes / no | Add or remove this channel from favourites — **LEFT/RIGHT** to toggle | + +--- + +### Mark all read + +**Hold Enter** on the DM / Channels / Rooms mode-select screen to clear all unread counters for the highlighted category at once. From 7243793f9befd3f8a4a99dd69c0364f821f913cc Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 09:51:47 +0200 Subject: [PATCH 05/14] Message screen --- docs/plus_features/message_screen.md | 50 ------------------ .../message_screen/mes_scr_1_oled.png | Bin 0 -> 1391 bytes .../message_screen/mes_scr_2_oled.png | Bin 0 -> 1898 bytes .../message_screen/mes_scr_3_oled.png | Bin 0 -> 2025 bytes .../message_screen/mes_scr_4_oled.png | Bin 0 -> 1238 bytes .../message_screen/mes_scr_5_oled.png | Bin 0 -> 1371 bytes .../message_screen/mes_scr_6_oled.png | Bin 0 -> 2276 bytes .../message_screen/mes_scr_7_oled.png | Bin 0 -> 2248 bytes .../message_screen/message_screen.md | 15 +++--- 9 files changed, 9 insertions(+), 56 deletions(-) delete mode 100644 docs/plus_features/message_screen.md create mode 100644 docs/plus_features/message_screen/mes_scr_1_oled.png create mode 100644 docs/plus_features/message_screen/mes_scr_2_oled.png create mode 100644 docs/plus_features/message_screen/mes_scr_3_oled.png create mode 100644 docs/plus_features/message_screen/mes_scr_4_oled.png create mode 100644 docs/plus_features/message_screen/mes_scr_5_oled.png create mode 100644 docs/plus_features/message_screen/mes_scr_6_oled.png create mode 100644 docs/plus_features/message_screen/mes_scr_7_oled.png diff --git a/docs/plus_features/message_screen.md b/docs/plus_features/message_screen.md deleted file mode 100644 index 842214d6..00000000 --- a/docs/plus_features/message_screen.md +++ /dev/null @@ -1,50 +0,0 @@ -View and send messages using the on-screen keyboard or predefined quick replies. The keyboard supports placeholders that insert live sensor data — `{time}` and `{loc}` are always available; additional placeholders (`{temp}`, `{hum}`, `{pres}`, `{batt}`, `{alt}`, `{lux}`, `{co2}`) appear automatically for sensors that are connected and returning data. - -Each message in the history list shows the sender name and a compact age indicator (`3m`, `2h`, `>1d`) in the top-right corner of the entry. - -``` -╔══════════════════════════════╗ -║ #general ║ -╠══════════════════════════════╣ -║▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ║ ← selected -║ Alice 3m ║ -║ Hey, let's meet tomorrow ║ -║┌───────────────────────────┐ ║ -║│▓▓▓▓▓▓▓▓▓ Bob 1h ▓▓▓▓ │ ║ -║│ Sure, what time works? │ ║ -║└───────────────────────────┘ ║ -║[+ send] ║ -╚══════════════════════════════╝ -``` - -Press Enter on a message to open it in fullscreen. Navigate between messages with left (newer) and right (older). If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar is shown below the sender name and the body is displayed without the address prefix. - -``` -╔══════════════════════════════╗ -║▓▓ Alice ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ║ ← sender -║▓▓ To: Bob ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ║ ← recipient -╠══════════════════════════════╣ -║ Hey Bob, let's meet up ║ -║ tomorrow at 6pm downtown. ║ -║ Will you make it? ║ -║ ║ -║< newer older >║ -╚══════════════════════════════╝ -``` - -Hold Enter on a message to open a context menu. From the list or fullscreen view, select **Reply** to pre-fill the keyboard or a quick message with `@[nick]` so the recipient is clearly addressed. The reply picker title shows the recipient's name. - -``` -╔══════════════════════════════╗ -║ RE:Alice ║ -╠══════════════════════════════╣ -║> Custom message... ║ -║ OK, I understand ║ -║ On my way ║ -║ Be right there ║ -╚══════════════════════════════╝ -``` - -On channel or contact list entries, the context menu also lets you change per-channel notification settings (mute, follow global, or force-on), per-channel melody override (follow global, Melody 1, or Melody 2), or mark messages as read. - -**Mark all read** — Hold Enter on the DM / Channels / Rooms mode-select screen to clear all unread counters for the highlighted category at once. \ No newline at end of file diff --git a/docs/plus_features/message_screen/mes_scr_1_oled.png b/docs/plus_features/message_screen/mes_scr_1_oled.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd2353f345b2c7c9cae2686a9040ce35d517097 GIT binary patch literal 1391 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 literal 0 HcmV?d00001 diff --git a/docs/plus_features/message_screen/mes_scr_3_oled.png b/docs/plus_features/message_screen/mes_scr_3_oled.png new file mode 100644 index 0000000000000000000000000000000000000000..2093cf3fb84a16e546845fd086f68c7b66319b23 GIT binary patch literal 2025 zcmah~dsLEV7=O_ewUb)Sm6n$?yP2o5nwc45_q1hZ8AAhY8O#h)8Iq!a-Bwz5?6&C= zjxLX7XayN5qIsHWF2$8ViU^fLiHIdgg5W4S`Ss8C{qw!&yzg`S{eI8$oQ;ayHp9uo z2>>u7eEa5T0Bo#B7;yObi+GO?004d`eDj9A$F6B)(u=PbePh?LyLDpX@Agg0`)MgQ zw(y+M*j<+{$DN3xrl*Fbm|rc?8ccFzyhN||V`j$l{}E;xUpLcXuA2ZjISYUiEF}p1 z*gWpUItRc;N5F`(0X~=QByhHb8KWZ9;C7sUz$36EJ(~JVNfR&25=Y%yg;W;_kkYi` zg5lGctIx(II^$F{+_jk?YzYjwMp)yng1aV) zJ;qP!6~5Jj1+?B87rbnaDZmCeEc~2=5_pwT5FgH5Q8(^Fqe3~`I{eay=(GzEC()fD zFIqyE$)8rl-)5Uo*GK^zmuKveSrx*?AH=7xHYE408+_zoEykLe)h+Z}Ln*G`77QAi z|9A*WrhUq5@_N{(*A_S&a&!HXYUcUzVKQdIR45djjt!MtYhI%>)>&HBdwWn@=56h^ z4dFZ0oA}uj2z;IDs@fMAy)L)gz_z}Vu&FoS;9s=G49nzW{Df(f7<|HhR|P(%^EO`e z4lnwas_C#_+r(G!k)=k=d~kN|d2$&*R0c-+~<@DTF(cu2yX^goOd7El{{ai%%9CpUc|s zc&_Al8!j0S1SOg4q~;;9*JIY75Ic``vp+~JYX(jL(`pFsJ4s-f-h6e8adl!sQ?!g= zQcB6OwELw5e{J$Uq>v-cun*CZ^x6Zrb4T}TOOR=8iCe8Ap5)NA!h~R;W0h_=0clt> zBA{#i3^DHtXSzw~(MY*|e|@2diDnt{cY8v?xHqTcOnH^C@W)aGJN;|(3Mz&3xp)0uf4U1hC*cb zyWioqf9EweJ}Jq@z_(P&tF9&}gh|c{UH8y-%+YOPB$CQC{3(I(M|UP=xeXIS$(WwFlD_Xy{cN+U@f1bwMONqu4Pkx4_Kz zAJB)?kw7OpgV@?4KQx6!Ns$sP6_@1?k_2hRgAs0q_nIO%)dJQtVbnYAvzP#(M0y$v zjUUakYe|II)9T<+g2!~#>ZAUH=?(m9)lEZn92J)_kX<&Gl@GD3$Xel3y^(=%hcv~- z)j4<#K3hU{6lju?9Wb#t%Td$Xf+tvug}AOWb)*sThqp zDA++Z;Ssm7#*8-Zi%QlQV${Ya%+bN;O0bn&nHKi6!c)6%(~%@0k$_F=8+_9ns5EBu zv%;>>Xc5n9^ z<-+tv(LRj>_|wwu;}X{ rM{e~Uk_;vt853Ho_F?k-=ILiR-R_+iw!P*F^vc%n*RrN1*D|beMRM`3^9)t>b!Pc{ z=ihsu`*l9|huKK(5`D{RvUzUR<+b~o?EH_MKLgxkb(7l_JC@> zw><04?|$_6{Fg(F&Z3g9ktQ)r?$7SSi*|(F<1H&LH_W8S6 zs`X`0zF*5u*V=o(xc|50PP@ZZd=-93ZmL_uJY!+|?N!^OZ~vBC`9v;i?|k+8@VDs= z$cBb&mOK!;+L$eBt@;e#leXU@)D4Y)a~!Nd3j3?6Y!_DP+XEAl=>F&T9^0NTSeJk6 z5A(f6NbzCPiTUS0$=7Wc zB$y%WKn|Zl#-4HH<2PQ05C84vpT8e3?|!%b<$eBtaSUQ=&~%;#Oe3EekP?y+GXuw5 zcBFWlBFW(J!o~q9X3j7$n5D=vFl^t_0LjQeLuMDqF)+9y2{_jN*G3o%36+|+kNNlI Vt*|(DB-^$Pk4gXl literal 0 HcmV?d00001 diff --git a/docs/plus_features/message_screen/mes_scr_5_oled.png b/docs/plus_features/message_screen/mes_scr_5_oled.png new file mode 100644 index 0000000000000000000000000000000000000000..3b396d187d387b70f36f55841b9aa4ed0c66c922 GIT binary patch literal 1371 zcmeAS@N?(olHy`uVBq!ia0y~yU;;8388|?c*QZDW1_o9oPZ!6KiaBrZUhJD~Ai#Pd z=;QzWbL`AQQ?IVemDuszMp*2GR=Dx8Zy$fw)G-y?nKUP>Ys%gwp;1lxxBj_N#WFc!WC)%8$zGQq?Xt>-+j)wF0e8t z7|8+C-g4GVpSib5`+oRo;q{U$Jdxzi&HMM`^6zK1Rqy^rzqb6c=kxAYbHdL}j`&*R zwm$vK90z+*NQ8ib+N%23Z`;R=)>TK!UskHEO?K;lfAO=;`Z?-`#Xg5Bglt-o9F=>M zKOt0p=B%`R>o0!f`7gbpA4$^mI@7F=U-rG7`dMPqaVMc~`3fN(tVhAOh>Y0YW9h! z->emr{U3f^gQV-#nmgN9ZF?thVD<`NsG=VE7U z(i_B3!{W4U?YFzfze~tgS9tO7J+#Z`z;7fYLyGMiB>i8m-QLrexW(@F<=yxHu5mkV zGta_}>5n{;K~i$eFJ5Nf|GMs1-@V%N_h(rypJ!blj-()~kFjUpdArNb@k>kRE`Gmx zf977<*Bp$xNU5*%-HXof7Yon#u&;??UVbRbVR8NHL*?u-$a!Sj8}k(97Se?mvv4FO#rWR B*4_XB literal 0 HcmV?d00001 diff --git a/docs/plus_features/message_screen/mes_scr_6_oled.png b/docs/plus_features/message_screen/mes_scr_6_oled.png new file mode 100644 index 0000000000000000000000000000000000000000..478662d66d2231fe0c55867959c43c96a8ea9f62 GIT binary patch literal 2276 zcmZWqZB&wJ8h+6xGE1lCxcRZ@o}DQhJ+qrrSoi^L-?poH(hVCx)K+OAZI1+|h&WSo znsswHQ#oY`tgRy|i5BaSAY$WDOAW^SAW)%gRFV$?5l|R(_0;Sc4g7}3|HelH_2`&dVr_YtO4u3H(8l9zeiW*(w_Mrp)* zg#qRZz=YM6G@ze?A zSE)njpf=N%Af(F>>b^%Xcg&m4dzWic0$*?54nYS(d>4}^4W3C;=(gE0MUht7zwePy zX=&^MAi*fpYPbllvC&pepb%3&)~_pppxSk>0s4cxx*4!a zyr`QNrQu&9C>>)?^S%x^#m@`^woEvh3vhl{}0k}8YQNVnNSjuzJ5nd zkK`GeBXhJ%+Sv3?o!GWd00iv5Is(U%Ge*DPC_*M9Q?G>({~HOU>k!A38*JqPd3}C) zExX4H-c?o0lxm8$U3>RsJKd)Bh?OSqVCL>h0P;3EFe^9VUpd_6G)7(eh@1CO->$-^ z22UxOc|^lt84~BnymwT#(lGWN0}Q&nn$;Qs4Ffa?WBv&KUHflN)#57W6;6xOv~YiZ z@|IWr*k#qtf?H$C(-gk9XfG39Zi%+n$JY#}GCA>Pjd7;gEc&zFv7P@NKs;;Qzd@2o zB#6e5e|(suvm5j>>dJy)NriB})l_DQj?#MGXKjn*!mRnboW+L$StRq|f9D4{;)An0 zQP{YZ2*FQ{0VM<|gpo z`!VGTM<2lzd(t2M^_*P5%v1esVyPp@BCzW|_dWoLZ6Uy09}tg=i-&_qk%LWVdGGXL zj-*>G7y5&JyeC=Ni2goc2OO~z&N1BR@T!;6F8i36#y*GsZ{@SbR_Dq=~kUK$Cqx3mmqiVl9j zzGHk`x&IiL?^&hr>4kYm7}So?*}|Ln~Iq>VpR>0%$8=I#JUyY-!#!X*LNkXB8WE zb?}kpo1)`a7!T8~6xDsPY83+7Z2A2sKUYN;hk6-XhSlI_)S9{e&X{Obsd4dWTa~RU zZR|@c1I$LCSeF@t(-RsmDd(gQ3Ncdhgr9vupdZjJX-O^Z#F5 zoqm?5mU*(j0+NX<+w_88p%Io)>H{oHXF_IS>E6nZL9zDrLUDs4;Vl-^fnOy%yb+<) z;>03qQCq&)xE~2xtBD3l$-~kaBKs;eo&A}~Et_;ctIi+aBGr1*ETMTIEVdGMK_H+@ zd3#QnzdoZ2=ei5nKX^`n{u*vR)g#jG!Fn4dD?*yzuAFb?R={CO#!i`A^@IJ~1Bf}+ zSbrj~FuY3`>J>Ue+VjNp8P|oyFgd8(lAyZVssTv5z`6}E@MgaJIHAeR9j)GBnBgbF f!I9b(A@jncu7A)h$^9*TZ6WD!$|2!_tWW<3?fu_f literal 0 HcmV?d00001 diff --git a/docs/plus_features/message_screen/mes_scr_7_oled.png b/docs/plus_features/message_screen/mes_scr_7_oled.png new file mode 100644 index 0000000000000000000000000000000000000000..bb70bff6a29a7c8f1982ac22489882387169c0bc GIT binary patch literal 2248 zcmZ8ieN<9;8osElWh0em$aGBij62oQu_imTk&U>HV`EK@32EeKdJ4sLZFTVr5Z%#j zw{h)QBbp;HAMNA?Dxw#$@(B_TX2@~NH2-QVTisINF?oAlJ;-4q>pXc>fqa4E4VpSG7 zpY|`Fgo=(}nLBDBD0&N2ncxQf_FGJ4P~ylM!THjfBCe?DG}6h)uo1yoT%tj?bSU<9 z#(fBA`@Mj{ZJJME8j*UFN$6xMJCX!x|3l|_-{ln_yG-7NfU14o1Q$Whq4cQQCNx%* zwg0>&&>_W+3V(g1X0a%Iy2DYXB`caw=Hw1UN2rvWU0_@cedNM+!@ach!1s*9p(0@` zJ>-Z*62e_NW*&YU;Ue^%D{#r={Z-|c#qOJ4W!R{06nhO5J~D3iR@N6tDx3rjQaUo} zc;IwCNe*_*Vz9I7wCDMnw@IU=@Y;niONScswR*MLKWDcFZnW&P*)Wz{>rMp__vEN& z!d;$tQ?S`DSlq8ZOcWPQF2so!Q2H-ojmdDCwVQCBsnBU}_b5n7Y~cnYyY zYybyCi4aZ96BV8!ktQ)OuuRZzv(=^Aad0XHmO0Ypli$5&{V zi&djJQ{ooVoJ>#}xS`^~MZj;-yT!;%1_7;L=x5rDPG&Rgut`mhF5ibTfd2`r#zPj~ zrHm8Xn4xke-pIz?Qtu@-VtzAq5THR&Jwta=|BR6nvG#~huY!(lac@Egjhl>1Jc;v4i9wJm#&W-ktqZ#U_+rgDD{tMe z7nYV!^J>@rSYtUDy1suG5ztJ%SL%!~u`ImV6y36m5rTtm5eml)@nKq3N(sx-BG+kA z$_Kc33FA62VqArgoj4`E21U7#=RX}gCk)ry_-7lTU{DQvhh&AR3F03MO6dKYy48dc zEEf;&*MCq>Pe%7S(-wz-mX?N2c!W-TNYQS&XwV+&IzTOCisma6M;COfg9lLn)RpOfE1H=58}wm_NgHJ5l^F5re~)ChjB`x4dR|Xj|=5E_%9iL zgzTTP95M42zcB5k2eg9RB8&O6Q=mOKn93cKq$%N8dmGa$@BNSoN6IR((Jp(|RL^eP z1L%JN`F+l*wfHdo?~>qxAM5(ZT-#$t^SK)kVu>UdysVcHXZqw)+lApCCR=CrG6!-0 zDHkku)m5`W*Z1(<&z_E8we^fe6oyId{Mr^J&%b1dvdYyo4wz-OZj7E9yYQY5>n9RG z6TUb4yQ7)3Nf|R@v}1Z$7+Iq|41E3;MvUJ&x4Vde6Kv%Jq`a$uVH#0O#ST(5QQ-i5 zu_IuxgtQ77fQ%ETiy-dwPLcfJ%L-?a<%KZSp(fDC!~IBJHelSkX7{EuIN8yKj#Y}d zx%4DfB=^I!%#|MRP)$HTt1ozum-NFP{?2X0PkpWzR7CLvqqaHZ?u+WcjuzuBS<>a848PZ^>Z=s0j| d4v_30Y>&KqXID)7pEuseeI6gfkIww-{{bTlzaszu literal 0 HcmV?d00001 diff --git a/docs/plus_features/message_screen/message_screen.md b/docs/plus_features/message_screen/message_screen.md index c88726a6..c6c201d5 100644 --- a/docs/plus_features/message_screen/message_screen.md +++ b/docs/plus_features/message_screen/message_screen.md @@ -27,7 +27,7 @@ The keyboard supports placeholders that insert live data at send time: | Placeholder | Value | Availability | |-------------|-------|--------------| | `{time}` | current time (HH:MM) | always | -| `{loc}` | GPS coordinates | always (empty if no fix) | +| `{loc}` | GPS coordinates | always ("no GPS" if no fix) | | `{temp}` | temperature | sensor connected | | `{hum}` | humidity | sensor connected | | `{pres}` | barometric pressure | sensor connected | @@ -60,18 +60,21 @@ Each entry in the history list shows the sender name and a compact age indicator Navigate between messages with **LEFT** (newer) and **RIGHT** (older). Long messages scroll with **UP/DOWN**. If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar is shown below the sender name and the body is displayed without the address prefix. - +| OLED | E-Ink | +|:----:|:-----:| +| ![](./mes_scr_5_oled.png) | | **Hold Enter** in fullscreen opens the Reply option. --- ### Context menu — contact list -| OLED | E-Ink | -|:----:|:-----:| -| ![](./mes_scr_5_oled.png) | | + **Hold Enter** on a contact entry opens a context menu: +| OLED | E-Ink | +|:----:|:-----:| +| ![](./mes_scr_6_oled.png) | | | Item | Action | |------|--------| @@ -88,7 +91,7 @@ When **Pin to dial** is selected, a slot picker opens (Slot 1–6 showing curren | OLED | E-Ink | |:----:|:-----:| -| ![](./mes_scr_6_oled.png) | | +| ![](./mes_scr_7_oled.png) | | **Hold Enter** on a channel entry opens a context menu: From ab396eb7a159594ece3c4a29b9501c269f6f9622 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 10:04:05 +0200 Subject: [PATCH 06/14] Added eink screenshot variants --- .../message_screen/mes_scr_1_eink.png | Bin 0 -> 4278 bytes .../message_screen/mes_scr_2_eink.png | Bin 0 -> 5011 bytes .../message_screen/mes_scr_3_eink.png | Bin 0 -> 6183 bytes .../message_screen/mes_scr_4_eink.png | Bin 0 -> 4032 bytes .../message_screen/mes_scr_5_eink.png | Bin 0 -> 4145 bytes .../message_screen/mes_scr_6_eink.png | Bin 0 -> 7632 bytes .../message_screen/mes_scr_7_eink.png | Bin 0 -> 4842 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/plus_features/message_screen/mes_scr_1_eink.png create mode 100644 docs/plus_features/message_screen/mes_scr_2_eink.png create mode 100644 docs/plus_features/message_screen/mes_scr_3_eink.png create mode 100644 docs/plus_features/message_screen/mes_scr_4_eink.png create mode 100644 docs/plus_features/message_screen/mes_scr_5_eink.png create mode 100644 docs/plus_features/message_screen/mes_scr_6_eink.png create mode 100644 docs/plus_features/message_screen/mes_scr_7_eink.png diff --git a/docs/plus_features/message_screen/mes_scr_1_eink.png b/docs/plus_features/message_screen/mes_scr_1_eink.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd029aa601cf48207d67fdcb40221ae9537afc4 GIT binary patch literal 4278 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 literal 0 HcmV?d00001 diff --git a/docs/plus_features/message_screen/mes_scr_7_eink.png b/docs/plus_features/message_screen/mes_scr_7_eink.png new file mode 100644 index 0000000000000000000000000000000000000000..19bbf07b3a954d69a235835cf4450210c3423c07 GIT binary patch literal 4842 zcmeI0`%_bA8pp%hp=w2}GeNW5+GV=V7>YpZA|yn+>%!7evRy4P>LyjTC%et4z!733 z7g~3vMMj2YTL~EQ17m4TAZofzAU9nrH$zT46|#|#7-$lf$O)3d$vvA?OO7);`xoS= zcjnD`-plv-e4po>eEj>$@|2A~--y9rQYwD8{|^{U(mV#UZhrmGqBC9n{yGe1>&=S& zZyr8(b#dm~y55qsec!Ggjzo4LYT)`MV$EwOP91TXUfoVq9o|tG4*EP!V>g#9js!Y; zS#=I3l;LsKmJLLt9@C;ilOm2Y6i1ecd5t=DJYmG)?d?KDN`n$mLc~5qa{dB;x@o&D`J-V!N|P6yXnDF~bYTaU081L1Ww0-^*pRCdL5KP+jr>Vz=_C2&Io`R{=NA>! z$+p7WNGr*4eG(bf`sLEkxHJSPj=)#TuC}Qh0RYv@H}&u6i0DTSlyyxQJPhMsNG<(*I|O>W{%R zG0km(1@=hj?25TeOI>n8L*>5G%k*8wh*&l`y7Gjqv$n8KQ#Y&~!%Y;Jgg(Qh&^zgC z$63jIEj=gllFj-@a0s>UX;H2F-6_jbJ0~=n8(t`2W;*9PDP7kFycxGgUG*y@Sr*s~ zRY>{SQ`V01=L4y$3q2+m&ru+UFBQ7DWm%pFp=FgO4G&)<++y$*u0tF~KM)tLLq{Fk zCo8B?$7GoQi%Hiz7I-MvpthI1cVKM61 zWYt8|P6ER_7WkBCO-E(K$1~qp7iqIqqUMf4N*B_feB=&_BV@DKRCGUi4-}sRTs$+g zmAk`Ykgtq$29&xHsT<3U5@|}eD2O-W2d0td$X#H6ryz5}XvT9Wa(a$z_Zbvga_%q> zfJrP1&*5bPU*rTnl!Yzr&TxOJeD$DM@H(Kma=A5Qgzw8k@mjt(*JGbISDCk6J16^u z2HC$Tqa#>%bGy;CP_1l6k=eUi3l*{ewuAGI3 z)M;$Gm@q;D8SWV}c%z%9`Da{)Xx@@`>Xk|K@y}m~IsPf&$AZvj{~@{wkHUuA>D;t0 z9}H~$$>+=L$~3p6@vK3fwfDZ%s+tYz>JP$S-UZFJj54Vg9{2C|rNtFlZf(4$4(QF- z3n|t+3xi(?=Z;f`4B<-T#2SlB|G*(q4kFZu<&KB=)wi;XOTtoC;j;H-YTMvlX~WbC zjx!@0@(VAti)U<}6nr?(qF>ASqmK#jczB|ncT1in04jO)K#|Lz9eOMURo@9gZ3$Jh zLKfDGsOl?Pdj<5~i*ckV!dj~1A*D2etuo`QojAJ`%Fz2Y_|;E5DDdn!Ln65maRZtgjlkxru7OR-fY}xwt)V{6>8qLWm56h}5>3 zA&r;)_RU$rhWH^0#4|tzMFb|ff1rKyMqIaNRrP-ku@v+xvyogTd_kR#v*`YjqY%90#rF7z z#Kn#UBo#z4MtXm^^rS-gSn4STuV$`xy7P@>khfD7Xc=h@=AxhMtUXiW(R?T5!4kLb zMCFh{I_Q}W=QW^;kLTYwWc0ZERO8z+LtZ(|DyY-<84zl^FY=}x#Gp+Wd-5Hsvoi;@ zNRYp6FBa1X=Ay@Py2k1=7(>w#DS}211XJ8MX(-o3>&oBtgR6>ZHo>s`z*v{Zho{> zOPxO9U`=hZzPDzPEuQF)qQ;K4t0p z)O70NpVKyx#+Y{^3RKwhUG6I_b Date: Fri, 29 May 2026 10:07:03 +0200 Subject: [PATCH 07/14] corrected readme path --- .../message_screen/message_screen.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/plus_features/message_screen/message_screen.md b/docs/plus_features/message_screen/message_screen.md index c6c201d5..69e1f335 100644 --- a/docs/plus_features/message_screen/message_screen.md +++ b/docs/plus_features/message_screen/message_screen.md @@ -1,11 +1,11 @@ ## Messages Screen -[Go back](../README.md) +[Go back](../../../README.md) ### Overview | OLED | E-Ink | |:----:|:-----:| -| ![](./mes_scr_1_oled.png) | | +| ![](./mes_scr_1_oled.png) |![](./mes_scr_1_eink.png) | The Messages screen is split into three modes — **DMs**, **Channels**, and **Rooms** — selectable with UP/DOWN on the mode-select screen. Each mode shows the corresponding list of conversations with unread counters. @@ -15,7 +15,7 @@ The Messages screen is split into three modes — **DMs**, **Channels**, and **R | OLED | E-Ink | |:----:|:-----:| -| ![](./mes_scr_2_oled.png) | | +| ![](./mes_scr_2_oled.png) |![](./mes_scr_2_eink.png) | Press **Enter** on a contact or channel to open its history, then press **Enter** again (or select an empty send row) to compose a message. Choose between: @@ -43,7 +43,7 @@ Sensor placeholders appear automatically in the placeholder picker when the corr | OLED | E-Ink | |:----:|:-----:| -| ![](./mes_scr_3_oled.png) | | +| ![](./mes_scr_3_oled.png) |![](./mes_scr_3_eink.png)| Each entry in the history list shows the sender name and a compact age indicator (`3m`, `2h`, `>1d`) in the top-right corner. @@ -55,14 +55,14 @@ Each entry in the history list shows the sender name and a compact age indicator | OLED | E-Ink | |:----:|:-----:| -| ![](./mes_scr_4_oled.png) | | +| ![](./mes_scr_4_oled.png) |![](./mes_scr_4_eink.png) | Navigate between messages with **LEFT** (newer) and **RIGHT** (older). Long messages scroll with **UP/DOWN**. If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar is shown below the sender name and the body is displayed without the address prefix. | OLED | E-Ink | |:----:|:-----:| -| ![](./mes_scr_5_oled.png) | | +| ![](./mes_scr_5_oled.png) |![](./mes_scr_5_eink.png) | **Hold Enter** in fullscreen opens the Reply option. --- @@ -74,7 +74,7 @@ If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar i **Hold Enter** on a contact entry opens a context menu: | OLED | E-Ink | |:----:|:-----:| -| ![](./mes_scr_6_oled.png) | | +| ![](./mes_scr_6_oled.png) | ![](./mes_scr_6_eink.png) | | Item | Action | |------|--------| @@ -91,7 +91,7 @@ When **Pin to dial** is selected, a slot picker opens (Slot 1–6 showing curren | OLED | E-Ink | |:----:|:-----:| -| ![](./mes_scr_7_oled.png) | | +| ![](./mes_scr_7_oled.png) | ![](./mes_scr_7_eink.png) | **Hold Enter** on a channel entry opens a context menu: From 096b6720b6967be3b6a3f066ad19145f6697a626 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 10:45:09 +0200 Subject: [PATCH 08/14] =?UTF-8?q?docs:=20rewrite=20favourites=5Fdial.md=20?= =?UTF-8?q?=E2=80=94=20layout,=20navigation,=20badges,=20pin/unpin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Describe 2×3 portrait vs 3×2 landscape grid layout - Navigation: edge keys fall through to page nav - Unread badge detail (ellipsis + badge coexistence) - (gone) label for removed contacts - Two pinning paths: empty tile picker and DM context menu - Pin picker order: favourited contacts first, then recent DMs - Auto-move when contact already pinned elsewhere - Unpin via DM context menu - Reordering via Settings › Home Pages --- .../favourites_dial/favourites_dial.md | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docs/plus_features/favourites_dial/favourites_dial.md diff --git a/docs/plus_features/favourites_dial/favourites_dial.md b/docs/plus_features/favourites_dial/favourites_dial.md new file mode 100644 index 00000000..c0a8dc70 --- /dev/null +++ b/docs/plus_features/favourites_dial/favourites_dial.md @@ -0,0 +1,61 @@ +## Favourites Dial +[Go back](../../../README.md) + +### Overview + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./fav_dial_1_oled.png) | ![](./fav_dial_1_eink.png) | + +A dedicated home page showing a grid of up to 6 pinned contacts for quick access. The layout adapts to the display orientation: + +- **Portrait** (OLED, e-ink portrait) — 2 columns × 3 rows +- **Landscape** (e-ink landscape) — 3 columns × 2 rows + +--- + +### Navigation + +Navigate tiles with **UP / DOWN / LEFT / RIGHT**. Pressing a directional key at the edge of the grid switches to the adjacent home page instead of wrapping. + +**Enter on a filled tile** — opens that contact's DM directly. + +**Enter on an empty tile (`+`)** — opens a contact picker to fill the slot. + +--- + +### Unread badge + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./fav_dial_2_oled.png) | ![](./fav_dial_2_eink.png) | + +Filled tiles show an unread message count in the top-right corner when there are unread DMs from that contact. The contact name is ellipsized to make room for the badge. + +If a pinned contact has been removed from the contacts list, the tile shows `(gone)` until the slot is reassigned. + +--- + +### Pinning a contact + +**From the Favourites Dial** — press **Enter** on an empty tile (`+`). A picker opens showing: +1. Contacts marked as favourites in the upstream app (starred contacts) — listed first +2. Recent DM contacts — listed after + +Select a contact to pin it to that slot. + +**From a DM conversation** — **Hold Enter** › context menu › **Pin to dial**, then choose a slot from the slot picker (Slot 1–6, showing the current occupant name or "empty"). + +If the selected contact is already pinned in another slot, it is moved to the new slot automatically. + +--- + +### Unpinning a contact + +Open the contact's DM, **Hold Enter** › context menu › **Unpin (slot N)**. + +--- + +### Reordering the Favourites page + +The position of the Favourites Dial in the home page navigation sequence can be changed in **Settings › Home Pages** — press **LEFT / RIGHT** on the Favourites entry to move it earlier or later. From 0e0e5b938a7ecedcc11205a9c7551f4a32b26d46 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 10:59:34 +0200 Subject: [PATCH 09/14] fix(ui/favourites): pin picker fallback to all contacts When the user presses + on an empty Favourites Dial tile, the picker previously showed 'No fav contacts' if there were no starred contacts (flags & 0x01) AND no recent DMs in _dm_hist (empty after reboot). Add a third fallback tier: when the first two tiers yield nothing, list all ADV_TYPE_CHAT contacts so the user can always pin anyone. Alert text updated to 'No contacts' for the remaining edge case (no contacts at all in the mesh). Known limitation: per-contact unread badges on the dial reset on reboot (in-RAM only). Persisted unread is a separate future improvement. Co-Authored-By: Claude Sonnet 4.6 --- examples/companion_radio/ui-new/UITask.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index b5c5a2ff..3af5ea3b 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -216,8 +216,23 @@ class HomeScreen : public UIScreen { } } } + // 3) Fallback: all remaining chat contacts not already in the list. if (_pin_count == 0) { - _task->showAlert("No fav contacts", 1000); + for (int idx = 0; _pin_count < PIN_PICKER_MAX; idx++) { + ContactInfo c; + if (!the_mesh.getContactByIdx(idx, c)) break; + if (c.type != ADV_TYPE_CHAT) continue; + bool dup = false; + for (int j = 0; j < _pin_count; j++) + if (memcmp(_pin_keys[j], c.id.pub_key, NodePrefs::FAVOURITE_PREFIX_LEN) == 0) { dup = true; break; } + if (dup) continue; + memcpy(_pin_keys[_pin_count], c.id.pub_key, NodePrefs::FAVOURITE_PREFIX_LEN); + DisplayDriver::translateUTF8Static(_pin_labels[_pin_count], c.name, sizeof(_pin_labels[_pin_count])); + _pin_count++; + } + } + if (_pin_count == 0) { + _task->showAlert("No contacts", 1000); _pin_target_slot = -1; return; } From f6d10bb8b20fc7a05f6bf59643dc775271a3f2bc Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 11:11:57 +0200 Subject: [PATCH 10/14] fix(ui/favourites): DM unread badge cleared by companion app sync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit msgRead(0) was called when the companion app read the last message from the offline queue, and it erased the entire _dm_unread_table. This wiped Favourites Dial badges the moment the app synced — leaving a 3-second window (the alert duration) where the badge was faintly visible behind the incoming-message popup, then gone. _dm_unread_table tracks per-contact UI state (Favourites Dial badges, contact list counters). It should only be cleared by user action: clearDMUnread (opens a DM) or clearAllDMUnread (mark-all-read). It has no relationship to the offline queue drain state. Co-Authored-By: Claude Sonnet 4.6 --- examples/companion_radio/ui-new/UITask.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 3af5ea3b..f7be4cd5 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -1344,7 +1344,9 @@ void UITask::msgRead(int msgcount) { _msgcount = msgcount; if (msgcount == 0) { _room_unread = 0; - memset(_dm_unread_table, 0, sizeof(_dm_unread_table)); + // Do NOT clear _dm_unread_table here — it tracks per-contact UI badges + // independently of the offline queue. Badges are cleared only when the + // user opens the DM (clearDMUnread) or explicitly marks all read. ((QuickMsgScreen*)quick_msg)->clearAllChannelUnread(); } } From ce4d5ea1da2b7a00d2426d2da10b6a46f2580ab7 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 11:12:30 +0200 Subject: [PATCH 11/14] Revert "fix(ui/favourites): DM unread badge cleared by companion app sync" This reverts commit f6d10bb8b20fc7a05f6bf59643dc775271a3f2bc. --- examples/companion_radio/ui-new/UITask.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index f7be4cd5..3af5ea3b 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -1344,9 +1344,7 @@ void UITask::msgRead(int msgcount) { _msgcount = msgcount; if (msgcount == 0) { _room_unread = 0; - // Do NOT clear _dm_unread_table here — it tracks per-contact UI badges - // independently of the offline queue. Badges are cleared only when the - // user opens the DM (clearDMUnread) or explicitly marks all read. + memset(_dm_unread_table, 0, sizeof(_dm_unread_table)); ((QuickMsgScreen*)quick_msg)->clearAllChannelUnread(); } } From df32f479429cb4cd9bddd2a31008a2c0e5e21d2c Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 11:26:37 +0200 Subject: [PATCH 12/14] =?UTF-8?q?docs:=20add=20settings=5Fscreen.md=20?= =?UTF-8?q?=E2=80=94=20full=20options=20with=20tables=20and=20e-ink=20note?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tables for all seven sections (Display, Sound, Home Pages, Radio, System, Contacts, Messages) with values, LEFT/RIGHT vs Enter interaction, and e-ink-only flags. Notes: buzzer Auto mode, battery % anchor from low_batt, Melody 1/2 link to Ringtone Editor, placeholder support in quick replies. --- .../settings_screen/settings_screen.md | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 docs/plus_features/settings_screen/settings_screen.md diff --git a/docs/plus_features/settings_screen/settings_screen.md b/docs/plus_features/settings_screen/settings_screen.md new file mode 100644 index 00000000..581bfb1c --- /dev/null +++ b/docs/plus_features/settings_screen/settings_screen.md @@ -0,0 +1,90 @@ +## Settings Screen +[Go back](../../../README.md) + +### Overview + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./settings_1_oled.png) | ![](./settings_1_eink.png) | + +All settings are saved to flash and restored on next boot. Settings are organised into collapsible sections. Press **Enter** on a section header to expand or collapse it — all sections start collapsed for faster navigation. Press **LEFT/RIGHT** to change a value, or **Enter** for toggle items. + +Press **Cancel/Back** to save and return to the home screen. + +--- + +### Display + +| Setting | Options | Notes | +|---------|---------|-------| +| Brightness | 1–5 | LEFT/RIGHT; preview applies immediately | +| Auto-off | 5 s / 15 s / 30 s / 60 s / never | LEFT/RIGHT | +| Auto-lock | on / off | Locks device when display turns off | +| Battery | icon / % / V | Display mode for the top-bar battery indicator | +| Clock seconds | show / hide | Hiding reduces OLED refresh from 1 s to 60 s | +| Clock format | 24 h / 12 h | 12 h appends AM/PM | +| Font | Default / Lemon | Default: 5×7 Adafruit with ASCII transliteration; Lemon: native Unicode with pixel-accurate line wrap | +| Display rotation *(e-ink only)* | 0° / 90° / 180° / 270° | Applied immediately | +| Joystick rotation *(e-ink only)* | 0° / 90° / 180° / 270° | Rotates input mapping independently of display rotation; useful for custom enclosures | +| Full refresh interval *(e-ink only)* | off / 5 / 10 / 20 / 30 | Partial refreshes between full clears; reduces ghosting on long sessions | + +--- + +### Sound + +| Setting | Options | Notes | +|---------|---------|-------| +| Buzzer | On / Off / Auto | Auto: silences while BLE connected, re-enables on disconnect | +| Volume | 1–5 | LEFT/RIGHT; preview tone plays on each change | +| DM Melody | built-in / Melody 1 / Melody 2 | Notification sound for incoming private messages | +| Channel Melody | built-in / Melody 1 / Melody 2 | Notification sound for incoming channel messages | + +Melody 1 and Melody 2 are custom sequences editable in **Tools › Ringtone Editor**. + +--- + +### Home Pages + +| OLED | E-Ink | +|:----:|:-----:| +| ![](./settings_2_oled.png) | ![](./settings_2_eink.png) | + +Lists all available home screen pages. For each entry: + +- **LEFT / RIGHT** — move the page earlier or later in the navigation sequence +- **Enter** — toggle the page ON / OFF + +**Settings** and **Messages** are always visible and cannot be disabled. + +--- + +### Radio + +| Setting | Options | Notes | +|---------|---------|-------| +| TX power | 2–22 dBm | LEFT/RIGHT | + +--- + +### System + +| Setting | Options | Notes | +|---------|---------|-------| +| Timezone | −12 h … +14 h | UTC offset in whole hours | +| Low battery | off / 3.0 V / 3.1 V / 3.2 V / 3.3 V / 3.4 V / 3.5 V | Auto-shutdown threshold; also sets the 0 % anchor for the battery percentage indicator | + +--- + +### Contacts + +| Setting | Options | Notes | +|---------|---------|-------| +| DMs | all / favourites | Show all chat contacts or only upstream-starred ones | +| Channels | all / favourites | Show all channels or only favourited ones | +| Rooms | all / favourites | Show all room servers or only favourited ones | + +--- + +### Messages + +Up to 10 quick reply templates (Q1–Q10). Press **Enter** on a slot to open the keyboard editor. Supports the same placeholders as the main keyboard (`{time}`, `{loc}`, and sensor placeholders when connected). From c7009140ce9ddf1ab4cf6cce3218f321dc83609d Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 12:25:34 +0200 Subject: [PATCH 13/14] refactor: rename firmware from Plus to Solo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FIRMWARE_VERSION: v1.15-plus.1 → v1.15-solo.1 - FIRMWARE_PLUS_BUILD → FIRMWARE_SOLO_BUILD in all platformio.ini and UITask.cpp - docs/plus_features/ → docs/solo_features/ (all sub-docs moved) - README: update all doc links plus new Documentation section - GitHub Actions: extract GIT_TAG_VERSION in each build job (was missing, causing empty FIRMWARE_VERSION in builds); rename output files to solo-VERSION-oled.uf2 / solo-VERSION-eink.uf2; release title → "Solo VERSION" Co-Authored-By: Claude Sonnet 4.6 --- .../build-wio-tracker-l1-firmwares.yml | 14 +- README.md | 72 +++++--- docs/plus_features/clock_screen.md | 5 - docs/plus_features/favourites_dial.md | 21 --- .../message_screen/message_screen.md | 109 ----------- docs/plus_features/screen_lock.md | 8 - docs/plus_features/settings_screen.md | 31 ---- .../settings_screen/settings_screen.md | 90 --------- docs/plus_features/tools_screen.md | 100 ---------- .../clock_screen/clk_scr_1_eink.png | Bin 0 -> 4238 bytes .../clock_screen/clk_scr_1_oled.png | Bin 0 -> 1621 bytes .../clock_screen/clk_scr_2_eink.png | Bin 0 -> 4350 bytes .../clock_screen/clk_scr_2_oled.png | Bin 0 -> 1488 bytes .../clock_screen/clock_screen.md | 55 ++++++ .../favourites_dial/fav_dial_1_eink.png | Bin 0 -> 4234 bytes .../favourites_dial/fav_dial_1_oled.png | Bin 0 -> 1312 bytes .../favourites_dial/favourites_dial.md | 10 +- .../message_screen/mes_scr_1_eink.png | Bin .../message_screen/mes_scr_1_oled.png | Bin .../message_screen/mes_scr_2_eink.png | Bin .../message_screen/mes_scr_2_oled.png | Bin .../message_screen/mes_scr_3_eink.png | Bin .../message_screen/mes_scr_3_oled.png | Bin .../message_screen/mes_scr_4_eink.png | Bin .../message_screen/mes_scr_4_oled.png | Bin .../message_screen/mes_scr_5_eink.png | Bin .../message_screen/mes_scr_5_oled.png | Bin .../message_screen/mes_scr_6_eink.png | Bin .../message_screen/mes_scr_6_oled.png | Bin .../message_screen/mes_scr_7_eink.png | Bin .../message_screen/mes_scr_7_oled.png | Bin .../message_screen/message_screen.md | 108 +++++++++++ .../screen_lock/lck_scr_1_eink.png | Bin 0 -> 4297 bytes .../screen_lock/lck_scr_1_oled.png | Bin 0 -> 1642 bytes .../screen_lock/lck_scr_2_eink.png | Bin 0 -> 4207 bytes .../screen_lock/lck_scr_2_oled.png | Bin 0 -> 1551 bytes docs/solo_features/screen_lock/screen_lock.md | 51 ++++++ .../settings_screen/set_scr_1_eink copy.png | Bin 0 -> 6059 bytes .../settings_screen/set_scr_1_eink.png | Bin 0 -> 6059 bytes .../settings_screen/set_scr_1_oled.png | Bin 0 -> 1707 bytes .../settings_screen/set_scr_2_eink.png | Bin 0 -> 6849 bytes .../settings_screen/set_scr_2_oled.png | Bin 0 -> 1815 bytes .../settings_screen/settings_screen.md | 91 +++++++++ .../tools_screen/tls_scr_1_eink.png | Bin 0 -> 4558 bytes .../tools_screen/tls_scr_1_oled.png | Bin 0 -> 1834 bytes .../tools_screen/tls_scr_2_eink.png | Bin 0 -> 8747 bytes .../tools_screen/tls_scr_2_oled.png | Bin 0 -> 2134 bytes .../tools_screen/tls_scr_3_eink.png | Bin 0 -> 8745 bytes .../tools_screen/tls_scr_3_oled.png | Bin 0 -> 2106 bytes .../tools_screen/tls_scr_4_eink.png | Bin 0 -> 4677 bytes .../tools_screen/tls_scr_4_oled.png | Bin 0 -> 1850 bytes .../tools_screen/tls_scr_5_eink.png | Bin 0 -> 4866 bytes .../tools_screen/tls_scr_5_oled.png | Bin 0 -> 1778 bytes .../tools_screen/tls_scr_6_eink.png | Bin 0 -> 4506 bytes .../tools_screen/tls_scr_6_oled.png | Bin 0 -> 1726 bytes .../tools_screen/tls_scr_7_eink.png | Bin 0 -> 4665 bytes .../tools_screen/tls_scr_7_oled.png | Bin 0 -> 1941 bytes .../tools_screen/tools_screen.md | 173 ++++++++++++++++++ examples/companion_radio/MyMesh.h | 4 +- examples/companion_radio/ui-new/UITask.cpp | 2 +- variants/wio-tracker-l1-eink/platformio.ini | 2 +- variants/wio-tracker-l1/platformio.ini | 4 +- 62 files changed, 551 insertions(+), 399 deletions(-) delete mode 100644 docs/plus_features/clock_screen.md delete mode 100644 docs/plus_features/favourites_dial.md delete mode 100644 docs/plus_features/message_screen/message_screen.md delete mode 100644 docs/plus_features/screen_lock.md delete mode 100644 docs/plus_features/settings_screen.md delete mode 100644 docs/plus_features/settings_screen/settings_screen.md delete mode 100644 docs/plus_features/tools_screen.md create mode 100644 docs/solo_features/clock_screen/clk_scr_1_eink.png create mode 100644 docs/solo_features/clock_screen/clk_scr_1_oled.png create mode 100644 docs/solo_features/clock_screen/clk_scr_2_eink.png create mode 100644 docs/solo_features/clock_screen/clk_scr_2_oled.png create mode 100644 docs/solo_features/clock_screen/clock_screen.md create mode 100644 docs/solo_features/favourites_dial/fav_dial_1_eink.png create mode 100644 docs/solo_features/favourites_dial/fav_dial_1_oled.png rename docs/{plus_features => solo_features}/favourites_dial/favourites_dial.md (93%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_1_eink.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_1_oled.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_2_eink.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_2_oled.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_3_eink.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_3_oled.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_4_eink.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_4_oled.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_5_eink.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_5_oled.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_6_eink.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_6_oled.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_7_eink.png (100%) rename docs/{plus_features => solo_features}/message_screen/mes_scr_7_oled.png (100%) create mode 100644 docs/solo_features/message_screen/message_screen.md create mode 100644 docs/solo_features/screen_lock/lck_scr_1_eink.png create mode 100644 docs/solo_features/screen_lock/lck_scr_1_oled.png create mode 100644 docs/solo_features/screen_lock/lck_scr_2_eink.png create mode 100644 docs/solo_features/screen_lock/lck_scr_2_oled.png create mode 100644 docs/solo_features/screen_lock/screen_lock.md create mode 100644 docs/solo_features/settings_screen/set_scr_1_eink copy.png create mode 100644 docs/solo_features/settings_screen/set_scr_1_eink.png create mode 100644 docs/solo_features/settings_screen/set_scr_1_oled.png create mode 100644 docs/solo_features/settings_screen/set_scr_2_eink.png create mode 100644 docs/solo_features/settings_screen/set_scr_2_oled.png create mode 100644 docs/solo_features/settings_screen/settings_screen.md create mode 100644 docs/solo_features/tools_screen/tls_scr_1_eink.png create mode 100644 docs/solo_features/tools_screen/tls_scr_1_oled.png create mode 100644 docs/solo_features/tools_screen/tls_scr_2_eink.png create mode 100644 docs/solo_features/tools_screen/tls_scr_2_oled.png create mode 100644 docs/solo_features/tools_screen/tls_scr_3_eink.png create mode 100644 docs/solo_features/tools_screen/tls_scr_3_oled.png create mode 100644 docs/solo_features/tools_screen/tls_scr_4_eink.png create mode 100644 docs/solo_features/tools_screen/tls_scr_4_oled.png create mode 100644 docs/solo_features/tools_screen/tls_scr_5_eink.png create mode 100644 docs/solo_features/tools_screen/tls_scr_5_oled.png create mode 100644 docs/solo_features/tools_screen/tls_scr_6_eink.png create mode 100644 docs/solo_features/tools_screen/tls_scr_6_oled.png create mode 100644 docs/solo_features/tools_screen/tls_scr_7_eink.png create mode 100644 docs/solo_features/tools_screen/tls_scr_7_oled.png create mode 100644 docs/solo_features/tools_screen/tools_screen.md diff --git a/.github/workflows/build-wio-tracker-l1-firmwares.yml b/.github/workflows/build-wio-tracker-l1-firmwares.yml index 169a2211..b6ba1cea 100644 --- a/.github/workflows/build-wio-tracker-l1-firmwares.yml +++ b/.github/workflows/build-wio-tracker-l1-firmwares.yml @@ -24,11 +24,17 @@ jobs: - name: Setup Build Environment uses: ./.github/actions/setup-build-environment + - name: Extract Version from Git Tag + run: echo "GIT_TAG_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV + - name: Build Dual OLED Firmware env: FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }} run: /usr/bin/env bash build.sh build-firmware WioTrackerL1_companion_dual + - name: Rename OLED firmware + run: mv out/*.uf2 "out/solo-${{ env.GIT_TAG_VERSION }}-oled.uf2" 2>/dev/null || true + - name: Upload OLED Firmware uses: actions/upload-artifact@v4 with: @@ -45,11 +51,17 @@ jobs: - name: Setup Build Environment uses: ./.github/actions/setup-build-environment + - name: Extract Version from Git Tag + run: echo "GIT_TAG_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV + - name: Build Dual E-ink Firmware env: FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }} run: /usr/bin/env bash build.sh build-firmware WioTrackerL1Eink_companion_dual + - name: Rename E-ink firmware + run: mv out/*.uf2 "out/solo-${{ env.GIT_TAG_VERSION }}-eink.uf2" 2>/dev/null || true + - name: Upload E-ink Firmware uses: actions/upload-artifact@v4 with: @@ -80,7 +92,7 @@ jobs: - name: Create Release uses: softprops/action-gh-release@v2 with: - name: Wio Tracker L1 Firmware ${{ env.GIT_TAG_VERSION }} + name: Solo ${{ env.GIT_TAG_VERSION }} body: "" draft: true files: out/*.uf2 diff --git a/README.md b/README.md index b81889b2..0b11d1f0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Seeed Wio Tracker L1 - MeshCore community firmware +# Seeed Wio Tracker L1 - MeshCore "Solo" firmware This branch extends the official MeshCore companion radio firmware for the **Seeed Wio Tracker L1**. Provides support for both the original OLED and the e-ink variant, with additional features and UI enhancements. @@ -28,50 +28,77 @@ The e-ink variant targets the Wio Tracker L1 fitted with a 2.13″ GxEPD2 panel - Enabled sensor screens with support for all onboard sensors (temperature, humidity, pressure, luminosity, CO₂) and GPS data -- [Messages Screen](./docs/plus_features/message_screen.md) — view and send messages, open message details, reply with quick messages or custom text, per-channel notification and melody overrides +- [Messages Screen](./docs/solo_features/message_screen/message_screen.md) — view and send messages, open message details, reply with quick messages or custom text, per-channel notification and melody overrides -- [Favourites Dial](./docs/plus_features/favourites_dial.md) — pin up to six contacts for quick access from the home screen +- [Favourites Dial](./docs/solo_features/favourites_dial/favourites_dial.md) — pin up to six contacts for quick access from the home screen -- [Settings Screen](./docs/plus_features/settings_screen.md) — configure display, sound, home page order, radio and system settings +- [Settings Screen](./docs/solo_features/settings_screen/settings_screen.md) — configure display, sound, home page order, radio and system settings -- [Clock Screen](./docs/plus_features/clock_screen.md) — view time and date plus up to three configurable sensor values +- [Clock Screen](./docs/solo_features/clock_screen/clock_screen.md) — view time and date plus up to three configurable sensor values -- [Screen Lock](./docs/plus_features/screen_lock.md) — lock the device to prevent accidental keypresses, with a lock screen showing time and sensor data +- [Screen Lock](./docs/solo_features/screen_lock/screen_lock.md) — lock the device to prevent accidental keypresses, with a lock screen showing time and sensor data -- [Tools Screen](./docs/plus_features/tools_screen.md) — GPS trail recording and export, ringtone editor, auto-reply bot, and more +- [Tools Screen](./docs/solo_features/tools_screen/tools_screen.md) — GPS trail recording and export, ringtone editor, auto-reply bot, and more ## Firmware Variants Two firmware builds are published with each release: -| Variant | Display | File | -|---------|---------|------| -| **OLED** | SSD1306 / SH1106 128 × 64 | `WioTrackerL1_companion_dual_*.uf2` | -| **E-ink** | GxEPD2 250 × 122 | `WioTrackerL1Eink_companion_dual_*.uf2` | +| Variant | Display | File | +| --------- | ------------------------- | --------------------------------------- | +| **OLED** | SSD1306 / SH1106 128 × 64 | `WioTrackerL1_companion_dual_*.uf2` | +| **E-ink** | GxEPD2 250 × 122 | `WioTrackerL1Eink_companion_dual_*.uf2` | Both variants are built from a single codebase and share the same feature set. The `dual` in the filename means a single binary supports both BLE and USB serial — there are no separate BLE/USB builds. ->[!IMPORTANT] +> [!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. ### Flashing + 1. Download the appropriate `.uf2` file for your display variant from the [releases page](https://github.com/MarekZegare4/MeshCore/releases) 2. Press reset twice quickly to enter bootloader mode (solid amber LED) - the device should appear as a mass storage drive on your computer 3. Copy the `.uf2` file to the drive to flash the firmware Updating to newer firmware versions usually does not require erasing flash unless the release notes explicitly state otherwise. To retain your settings and data, avoid performing a factory reset after flashing unless you need to start fresh or encounter problems. ->[!WARNING] ->When migrating from official/custom firmware, backup your data and **perform factory reset** to prevent conflicts with existing settings and data: ->1. Open device settings in the companion app and download data backup ->2. Go to [MeshCore Flasher](https://meshcore.io/flasher) website ->3. Select "Wio Tracker L1 Pro" ->4. Choose any of the firmware variant ->5. Perform "Erase flash" - - +> [!WARNING] +> When migrating from official/custom firmware, backup your data and **perform factory reset** to prevent conflicts with existing settings and data: +> +> 1. Open device settings in the companion app and download data backup +> 2. Go to [MeshCore Flasher](https://meshcore.io/flasher) website +> 3. Select "Wio Tracker L1 Pro" +> 4. Choose any of the firmware variant +> 5. Perform "Erase flash" --- + +## Documentation + +### This fork + +| Document | Description | +|----------|-------------| +| [Messages Screen](./docs/solo_features/message_screen/message_screen.md) | Sending messages, context menus, reply, Notif/Melody overrides | +| [Favourites Dial](./docs/solo_features/favourites_dial/favourites_dial.md) | Pinned contacts grid, unread badges, pin/unpin | +| [Clock Screen](./docs/solo_features/clock_screen/clock_screen.md) | Clock page, date, configurable data fields | +| [Settings Screen](./docs/solo_features/settings_screen/settings_screen.md) | All settings sections with values and interactions | +| [Screen Lock](./docs/solo_features/screen_lock/screen_lock.md) | Lock/unlock sequence, lock screen, auto-lock | +| [Tools Screen](./docs/solo_features/tools_screen/tools_screen.md) | GPS trail, nearby nodes, ringtone editor, auto-reply bot, auto-advert | + +### Upstream MeshCore + +| Document | Description | +|----------|-------------| +| [FAQ](./docs/faq.md) | Frequently asked questions | +| [CLI Commands](./docs/cli_commands.md) | Commands for repeaters, room servers and sensors | +| [Terminal Chat CLI](./docs/terminal_chat_cli.md) | Commands for the terminal chat client | +| [Companion Protocol](./docs/companion_protocol.md) | Serial/BLE frame protocol between device and app | +| [Packet Format](./docs/packet_format.md) | LoRa packet structure | +| [QR Codes](./docs/qr_codes.md) | Channel and contact QR code formats | + +--- + ## Development This fork tracks the upstream [MeshCore](https://github.com/ripplebiz/MeshCore) repository. To prevent upstream changes from overwriting this README during merges, `README.md` is protected via `.gitattributes`. After cloning, run once: @@ -81,6 +108,7 @@ git config merge.ours.driver true ``` ### Contributing + Contributions are welcome! Fork the repository, make your changes, and submit a pull request. Please ensure your code adheres to the existing style and includes comments where necessary. #### Display Screenshot Tool @@ -121,7 +149,7 @@ PLATFORMIO_BUILD_FLAGS="-D ENABLE_SCREENSHOT" pio run -e WioTrackerL1_companion_ 4. In the tool's interactive menu, press **S** to capture a screenshot 5. The tool will save the screenshot as a PNG file in `tools/pngs/` with a timestamp-based filename - -D MESH_PACKET_LOGGING=1 @@ -111,7 +111,7 @@ build_flags = ${WioTrackerL1.build_flags} -D PIN_BUZZER=12 -D QSPIFLASH=1 -D ADVERT_NAME='"@@MAC"' - -D FIRMWARE_PLUS_BUILD=1 + -D FIRMWARE_SOLO_BUILD=1 -D MESHCORE_VERSION='"1.15"' -D UI_SENSORS_PAGE=1 -D ENV_PIN_SDA=PIN_WIRE1_SDA From fb700bbaad270f6ff2f2630bdbc44273147820f5 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Fri, 29 May 2026 12:46:29 +0200 Subject: [PATCH 14/14] =?UTF-8?q?docs+ci:=20pre-merge=20polish=20=E2=80=94?= =?UTF-8?q?=20README,=20doc=20accuracy,=20workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit README: - Fix typo "offical" → "official" - File names in Firmware Variants table now match workflow output (solo--oled.uf2 / solo--eink.uf2) - Un-comment the E-ink Display section (now fully supported) - Clock Screen: "sensor values" → "data fields" (covers Batt%, Nodes, Msgs) - Tools Screen: mention nearby nodes and auto-advert in the highlight - Promote Screenshot Tool to its own top-level section (was buried under Contributing); fix `uv run tools/screenshot.py` invocation path Docs: - favourites_dial: document the 3rd pin-picker tier (all chat contacts fallback) added in 0e0e5b93 - clock_screen: Altitude source clarified — onboard sensor (GPS or barometric), not always GPS - message_screen: blank lines around image tables that were inlined Code: - UITask.cpp: rename leftover plus_y/plus_label locals to solo_y/solo_label in the splash-screen Solo banner Workflow: - workflow_dispatch builds previously labelled firmware with the branch name (GITHUB_REF_NAME). Resolve BUILD_VERSION to the tag when run on a tag push, else dev- so manual runs produce solo-dev-abc1234-oled.uf2 etc. Cleanup: - remove stray docs/solo_features/settings_screen/set_scr_1_eink copy.png Co-Authored-By: Claude Opus 4.7 --- .../build-wio-tracker-l1-firmwares.yml | 26 ++- README.md | 148 ++++++++---------- .../clock_screen/clock_screen.md | 2 +- .../favourites_dial/favourites_dial.md | 1 + .../message_screen/message_screen.md | 13 +- .../settings_screen/set_scr_1_eink copy.png | Bin 6059 -> 0 bytes examples/companion_radio/ui-new/UITask.cpp | 24 +-- 7 files changed, 109 insertions(+), 105 deletions(-) delete mode 100644 docs/solo_features/settings_screen/set_scr_1_eink copy.png diff --git a/.github/workflows/build-wio-tracker-l1-firmwares.yml b/.github/workflows/build-wio-tracker-l1-firmwares.yml index b6ba1cea..225dff62 100644 --- a/.github/workflows/build-wio-tracker-l1-firmwares.yml +++ b/.github/workflows/build-wio-tracker-l1-firmwares.yml @@ -24,16 +24,21 @@ jobs: - name: Setup Build Environment uses: ./.github/actions/setup-build-environment - - name: Extract Version from Git Tag - run: echo "GIT_TAG_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV + - name: Resolve build version + run: | + if [ "$GITHUB_REF_TYPE" = "tag" ]; then + echo "BUILD_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV + else + echo "BUILD_VERSION=dev-$(git rev-parse --short HEAD)" >> $GITHUB_ENV + fi - name: Build Dual OLED Firmware env: - FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }} + FIRMWARE_VERSION: ${{ env.BUILD_VERSION }} run: /usr/bin/env bash build.sh build-firmware WioTrackerL1_companion_dual - name: Rename OLED firmware - run: mv out/*.uf2 "out/solo-${{ env.GIT_TAG_VERSION }}-oled.uf2" 2>/dev/null || true + run: mv out/*.uf2 "out/solo-${{ env.BUILD_VERSION }}-oled.uf2" 2>/dev/null || true - name: Upload OLED Firmware uses: actions/upload-artifact@v4 @@ -51,16 +56,21 @@ jobs: - name: Setup Build Environment uses: ./.github/actions/setup-build-environment - - name: Extract Version from Git Tag - run: echo "GIT_TAG_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV + - name: Resolve build version + run: | + if [ "$GITHUB_REF_TYPE" = "tag" ]; then + echo "BUILD_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV + else + echo "BUILD_VERSION=dev-$(git rev-parse --short HEAD)" >> $GITHUB_ENV + fi - name: Build Dual E-ink Firmware env: - FIRMWARE_VERSION: ${{ env.GIT_TAG_VERSION }} + FIRMWARE_VERSION: ${{ env.BUILD_VERSION }} run: /usr/bin/env bash build.sh build-firmware WioTrackerL1Eink_companion_dual - name: Rename E-ink firmware - run: mv out/*.uf2 "out/solo-${{ env.GIT_TAG_VERSION }}-eink.uf2" 2>/dev/null || true + run: mv out/*.uf2 "out/solo-${{ env.BUILD_VERSION }}-eink.uf2" 2>/dev/null || true - name: Upload E-ink Firmware uses: actions/upload-artifact@v4 diff --git a/README.md b/README.md index 0b11d1f0..392c705d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# Seeed Wio Tracker L1 - MeshCore "Solo" firmware +# Seeed Wio Tracker L1 - MeshCore "Solo" companion firmware This branch extends the official MeshCore companion radio firmware for the **Seeed Wio Tracker L1**. Provides support for both the original OLED and the e-ink variant, with additional features and UI enhancements. -Join the discussion on the offical MeshCore discord: https://discord.gg/sdhYArU2jr +Join the discussion on the official MeshCore Discord: https://discord.gg/sdhYArU2jr @@ -11,15 +11,6 @@ Join the discussion on the offical MeshCore discord: https://discord.gg/sdhYArU2 - [E-ink case](https://www.printables.com/model/1420534-seeed-wio-tracker-l1-e-ink-enclosure) - [Oled case](https://www.printables.com/model/1380791-meshpack-seeed-l1-oled) - - --- ## Feature highlights @@ -34,22 +25,32 @@ The e-ink variant targets the Wio Tracker L1 fitted with a 2.13″ GxEPD2 panel - [Settings Screen](./docs/solo_features/settings_screen/settings_screen.md) — configure display, sound, home page order, radio and system settings -- [Clock Screen](./docs/solo_features/clock_screen/clock_screen.md) — view time and date plus up to three configurable sensor values +- [Clock Screen](./docs/solo_features/clock_screen/clock_screen.md) — view time and date plus up to three configurable data fields - [Screen Lock](./docs/solo_features/screen_lock/screen_lock.md) — lock the device to prevent accidental keypresses, with a lock screen showing time and sensor data -- [Tools Screen](./docs/solo_features/tools_screen/tools_screen.md) — GPS trail recording and export, ringtone editor, auto-reply bot, and more +- [Tools Screen](./docs/solo_features/tools_screen/tools_screen.md) — GPS trail recording and export, nearby nodes, ringtone editor, auto-reply bot, auto-advert + +### E-ink Display + +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 ## Firmware Variants Two firmware builds are published with each release: -| Variant | Display | File | -| --------- | ------------------------- | --------------------------------------- | -| **OLED** | SSD1306 / SH1106 128 × 64 | `WioTrackerL1_companion_dual_*.uf2` | -| **E-ink** | GxEPD2 250 × 122 | `WioTrackerL1Eink_companion_dual_*.uf2` | +| Variant | Display | File | +| --------- | ------------------------- | ------------------------- | +| **OLED** | SSD1306 / SH1106 128 × 64 | `solo--oled.uf2` | +| **E-ink** | GxEPD2 250 × 122 | `solo--eink.uf2` | -Both variants are built from a single codebase and share the same feature set. The `dual` in the filename means a single binary supports both BLE and USB serial — there are no separate BLE/USB builds. +Both variants are built from a single codebase and share the same feature set. The firmware supports both BLE and USB serial in a single binary — there are no separate BLE/USB builds. > [!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. @@ -77,25 +78,59 @@ Updating to newer firmware versions usually does not require erasing flash unles ### This fork -| Document | Description | -|----------|-------------| -| [Messages Screen](./docs/solo_features/message_screen/message_screen.md) | Sending messages, context menus, reply, Notif/Melody overrides | -| [Favourites Dial](./docs/solo_features/favourites_dial/favourites_dial.md) | Pinned contacts grid, unread badges, pin/unpin | -| [Clock Screen](./docs/solo_features/clock_screen/clock_screen.md) | Clock page, date, configurable data fields | -| [Settings Screen](./docs/solo_features/settings_screen/settings_screen.md) | All settings sections with values and interactions | -| [Screen Lock](./docs/solo_features/screen_lock/screen_lock.md) | Lock/unlock sequence, lock screen, auto-lock | -| [Tools Screen](./docs/solo_features/tools_screen/tools_screen.md) | GPS trail, nearby nodes, ringtone editor, auto-reply bot, auto-advert | +| Document | Description | +| -------------------------------------------------------------------------- | --------------------------------------------------------------------- | +| [Messages Screen](./docs/solo_features/message_screen/message_screen.md) | Sending messages, context menus, reply, Notif/Melody overrides | +| [Favourites Dial](./docs/solo_features/favourites_dial/favourites_dial.md) | Pinned contacts grid, unread badges, pin/unpin | +| [Clock Screen](./docs/solo_features/clock_screen/clock_screen.md) | Clock page, date, configurable data fields | +| [Settings Screen](./docs/solo_features/settings_screen/settings_screen.md) | All settings sections with values and interactions | +| [Screen Lock](./docs/solo_features/screen_lock/screen_lock.md) | Lock/unlock sequence, lock screen, auto-lock | +| [Tools Screen](./docs/solo_features/tools_screen/tools_screen.md) | GPS trail, nearby nodes, ringtone editor, auto-reply bot, auto-advert | ### Upstream MeshCore -| Document | Description | -|----------|-------------| -| [FAQ](./docs/faq.md) | Frequently asked questions | -| [CLI Commands](./docs/cli_commands.md) | Commands for repeaters, room servers and sensors | -| [Terminal Chat CLI](./docs/terminal_chat_cli.md) | Commands for the terminal chat client | +| Document | Description | +| -------------------------------------------------- | ------------------------------------------------ | +| [FAQ](./docs/faq.md) | Frequently asked questions | +| [CLI Commands](./docs/cli_commands.md) | Commands for repeaters, room servers and sensors | +| [Terminal Chat CLI](./docs/terminal_chat_cli.md) | Commands for the terminal chat client | | [Companion Protocol](./docs/companion_protocol.md) | Serial/BLE frame protocol between device and app | -| [Packet Format](./docs/packet_format.md) | LoRa packet structure | -| [QR Codes](./docs/qr_codes.md) | Channel and contact QR code formats | +| [Packet Format](./docs/packet_format.md) | LoRa packet structure | +| [QR Codes](./docs/qr_codes.md) | Channel and contact QR code formats | + +--- + +## Screenshot Tool + +The firmware can capture the current display contents and send them over USB serial as a PNG — useful for debugging and documentation. Works with both OLED and e-ink variants. + +> [!NOTE] +> Requires firmware built with `-D ENABLE_SCREENSHOT`. Use the `_dev` environment or add the flag manually. + +**1. Build and flash with screenshot support** + +```sh +# OLED +PLATFORMIO_BUILD_FLAGS="-D ENABLE_SCREENSHOT" pio run -e WioTrackerL1_companion_dual -t upload + +# E-ink +pio run -e WioTrackerL1Eink_companion_dual_dev -t upload +``` + +**2. Disconnect from the companion app** — USB serial is not available while BLE/app is connected + +**3. Run the tool** — [uv](https://docs.astral.sh/uv/) is recommended for managing Python dependencies: + +```sh +uv run tools/screenshot.py +``` + +Options: + +- `--port PORT` — serial port (default: auto-detect) +- `--scale SCALE` — upscale factor for output image (default: 1) + +**4.** Press **S** in the interactive menu to capture. Screenshots are saved to `tools/pngs/` with a timestamp filename. --- @@ -109,49 +144,4 @@ git config merge.ours.driver true ### Contributing -Contributions are welcome! Fork the repository, make your changes, and submit a pull request. Please ensure your code adheres to the existing style and includes comments where necessary. - -#### Display Screenshot Tool - -> [!NOTE] -> The screenshot feature requires the `ENABLE_SCREENSHOT` build flag to be enabled. Add `-D ENABLE_SCREENSHOT` to your PlatformIO build flags, then recompile and flash the firmware. - -The firmware supports capturing the current display contents and transmitting -it over USB serial. This is useful for debugging, remote monitoring, or -creating documentation. - -**Important:** When the device is connected to the companion app, the USB -serial port is not available for communication. To use the screenshot tool, -ensure the device is not connected to the companion app. - -**Usage:** - -1. Build and flash firmware with `-D ENABLE_SCREENSHOT` build flag enabled - -Example for the OLED dual firmware: - -``` -PLATFORMIO_BUILD_FLAGS="-D ENABLE_SCREENSHOT" pio run -e WioTrackerL1_companion_dual -t upload -``` - -2. Connect the device to your computer via USB (ensure no companion app connection) -3. Install dependencies and run the screenshot tool. To manage python and python dependencies, use uv: https://docs.astral.sh/uv/ - - ```sh - cd tools - uv run tools/screenshot.py - ``` - - Options: - - `--port PORT` — Serial port to use (default: auto-detect) - - `--scale SCALE` — Upscale factor for the output image (1=no upscale, 2=2x, 3=3x, 4=4x, etc.; default: 1) - -4. In the tool's interactive menu, press **S** to capture a screenshot -5. The tool will save the screenshot as a PNG file in `tools/pngs/` with a timestamp-based filename - - +Contributions are welcome. Fork the repository, make your changes, and open a pull request. Please follow the existing code style and keep changes focused. diff --git a/docs/solo_features/clock_screen/clock_screen.md b/docs/solo_features/clock_screen/clock_screen.md index 185a23f3..790191d3 100644 --- a/docs/solo_features/clock_screen/clock_screen.md +++ b/docs/solo_features/clock_screen/clock_screen.md @@ -40,7 +40,7 @@ Up to three data fields are shown below the date separator. Each field displays | Humidity | Hum | % from onboard sensor | | Pressure | Pres | hPa from onboard sensor | | GPS | GPS | `lat lon` decimal degrees, or `no fix` | -| Altitude | Alt | metres from GPS | +| Altitude | Alt | metres from onboard sensor (GPS or barometric) | | Luminosity | Lux | lux from onboard sensor | | CO₂ | CO2 | ppm from onboard sensor | | Contacts | Nodes | Total contacts in the mesh | diff --git a/docs/solo_features/favourites_dial/favourites_dial.md b/docs/solo_features/favourites_dial/favourites_dial.md index 1dfd9b22..ee55a4a6 100644 --- a/docs/solo_features/favourites_dial/favourites_dial.md +++ b/docs/solo_features/favourites_dial/favourites_dial.md @@ -39,6 +39,7 @@ If a pinned contact has been removed from the contacts list, the tile shows `(go 1. Contacts marked as favourites in the upstream app (starred contacts) — listed first 2. Recent DM contacts — listed after +3. All remaining chat contacts — fallback when the first two tiers are empty (e.g. fresh install before any DMs) Select a contact to pin it to that slot. diff --git a/docs/solo_features/message_screen/message_screen.md b/docs/solo_features/message_screen/message_screen.md index 0551a772..c6c72f8a 100644 --- a/docs/solo_features/message_screen/message_screen.md +++ b/docs/solo_features/message_screen/message_screen.md @@ -61,9 +61,11 @@ Each entry in the history list shows the sender name and a compact age indicator Navigate between messages with **LEFT** (newer) and **RIGHT** (older). Long messages scroll with **UP/DOWN**. If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar is shown below the sender name and the body is displayed without the address prefix. -| OLED | E-Ink | -|:----:|:-----:| -| ![](./mes_scr_5_oled.png) |![](./mes_scr_5_eink.png) | + +| OLED | E-Ink | +| :-----------------------: | :-----------------------: | +| ![](./mes_scr_5_oled.png) | ![](./mes_scr_5_eink.png) | + **Hold Enter** in fullscreen opens the Reply option. --- @@ -71,8 +73,9 @@ If the message is a reply addressed to someone (`@[nick]`), a **To: nick** bar i ### Context menu — contact list **Hold Enter** on a contact entry opens a context menu: -| OLED | E-Ink | -|:----:|:-----:| + +| OLED | E-Ink | +| :-----------------------: | :-----------------------: | | ![](./mes_scr_6_oled.png) | ![](./mes_scr_6_eink.png) | | Item | Action | diff --git a/docs/solo_features/settings_screen/set_scr_1_eink copy.png b/docs/solo_features/settings_screen/set_scr_1_eink copy.png deleted file mode 100644 index 15c6fe58c551144044618b0b6969bcc4dd1f5d9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6059 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 eb6ee)A28d{`5CF``-ot diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index c251afdf..8b7eb135 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -37,7 +37,7 @@ class SplashScreen : public UIScreen { UITask* _task; unsigned long dismiss_after; char _version_info[12]; - char _plus_ver[12]; + char _solo_ver[12]; public: SplashScreen(UITask* task) : _task(task) { @@ -45,13 +45,13 @@ public: strncpy(_version_info, MESHCORE_VERSION, sizeof(_version_info) - 1); _version_info[sizeof(_version_info) - 1] = '\0'; - // Plus firmware version: strip commit hash suffix (v1.11-abcdef -> v1.11) + // Solo firmware version: strip commit hash suffix (v1.15-solo.1-abcdef -> v1.15) const char *ver = FIRMWARE_VERSION; const char *dash = strchr(ver, '-'); int plen = dash ? (int)(dash - ver) : (int)strlen(ver); - if (plen >= (int)sizeof(_plus_ver)) plen = sizeof(_plus_ver) - 1; - memcpy(_plus_ver, ver, plen); - _plus_ver[plen] = '\0'; + if (plen >= (int)sizeof(_solo_ver)) plen = sizeof(_solo_ver) - 1; + memcpy(_solo_ver, ver, plen); + _solo_ver[plen] = '\0'; dismiss_after = millis() + BOOT_SCREEN_MILLIS; } @@ -79,15 +79,15 @@ public: display.drawTextCentered(display.width()/2, date_y, FIRMWARE_BUILD_DATE); #ifdef FIRMWARE_SOLO_BUILD - int plus_y = date_y + step; - display.fillRect(0, plus_y - 1, display.width(), lh + 2); + int solo_y = date_y + step; + display.fillRect(0, solo_y - 1, display.width(), lh + 2); display.setColor(DisplayDriver::DARK); - char plus_label[24]; - if (_plus_ver[0]) - snprintf(plus_label, sizeof(plus_label), "Plus %s for Wio", _plus_ver); + char solo_label[24]; + if (_solo_ver[0]) + snprintf(solo_label, sizeof(solo_label), "Solo %s for Wio", _solo_ver); else - snprintf(plus_label, sizeof(plus_label), "Plus for Wio"); - display.drawTextCentered(display.width()/2, plus_y, plus_label); + snprintf(solo_label, sizeof(solo_label), "Solo for Wio"); + display.drawTextCentered(display.width()/2, solo_y, solo_label); display.setColor(DisplayDriver::LIGHT); #endif