From e822242660c2aaea8ebd15d685280db97d8c0c8e Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Tue, 29 Sep 2026 08:41:10 +0200 Subject: [PATCH] docs: stage I3 -- documentation rewritten under docs/solo Short pages by feature (getting started, messages, contacts, navigation, tools, settings, lock, hardware) instead of one page per OLED screen, with Wio Tracker L2 differences as notes; facts checked against the code (keyboard scripts vs. hold-for-accents, {batt}/{dist}, L2 limits and settings layout). Developer guides and build flags under docs/solo/developer. Old docs/solo_features and its ~50 screenshots removed; a hero banner and three simulator screenshots added; links updated. Co-Authored-By: Claude Opus 5.5 --- README.md | 8 +- docs/solo/README.md | 70 +++ docs/solo/contacts.md | 69 ++ .../developer/build-flags.md} | 12 +- docs/{ => solo}/developer/ui-core.md | 0 docs/{ => solo}/developer/ui-framework.md | 4 +- docs/solo/getting-started.md | 66 ++ docs/solo/hardware.md | 99 +++ docs/solo/img/hero.png | Bin 0 -> 3387 bytes docs/solo/img/l2-home.png | Bin 0 -> 34734 bytes docs/solo/img/oled-clock.png | Bin 0 -> 1196 bytes docs/solo/img/oled-messages.png | Bin 0 -> 1547 bytes docs/solo/lock.md | 45 ++ docs/solo/messages.md | 117 ++++ docs/solo/navigation.md | 125 ++++ docs/solo/settings.md | 40 ++ docs/solo/tools.md | 114 ++++ docs/solo_features/README.md | 70 --- .../clock_screen/clock_screen.md | 93 --- .../clock_screen/fields_eink.png | Bin 4350 -> 0 bytes .../clock_screen/fields_oled.png | Bin 1488 -> 0 bytes .../clock_screen/overview_eink.png | Bin 4238 -> 0 bytes .../clock_screen/overview_oled.png | Bin 1621 -> 0 bytes docs/solo_features/external_keyboard.md | 144 ----- .../favourites_dial/favourites_dial.md | 74 --- .../favourites_dial/overview_eink.png | Bin 4234 -> 0 bytes .../favourites_dial/overview_oled.png | Bin 1312 -> 0 bytes .../message_screen/compose_eink.png | Bin 5011 -> 0 bytes .../message_screen/compose_oled.png | Bin 1898 -> 0 bytes .../message_screen/ctx_channel_eink.png | Bin 4842 -> 0 bytes .../message_screen/ctx_channel_oled.png | Bin 2248 -> 0 bytes .../message_screen/ctx_contact_eink.png | Bin 7632 -> 0 bytes .../message_screen/ctx_contact_oled.png | Bin 2276 -> 0 bytes .../message_screen/fullscreen_eink.png | Bin 4032 -> 0 bytes .../message_screen/fullscreen_menu_eink.png | Bin 4145 -> 0 bytes .../message_screen/fullscreen_menu_oled.png | Bin 1371 -> 0 bytes .../message_screen/fullscreen_oled.png | Bin 1238 -> 0 bytes .../message_screen/history_eink.png | Bin 6183 -> 0 bytes .../message_screen/history_oled.png | Bin 2025 -> 0 bytes .../message_screen/message_screen.md | 184 ------ .../message_screen/overview_eink.png | Bin 4278 -> 0 bytes .../message_screen/overview_oled.png | Bin 1391 -> 0 bytes .../screen_lock/overview_eink.png | Bin 4297 -> 0 bytes .../screen_lock/overview_oled.png | Bin 1642 -> 0 bytes .../solo_features/screen_lock/screen_eink.png | Bin 4207 -> 0 bytes docs/solo_features/screen_lock/screen_lock.md | 85 --- .../solo_features/screen_lock/screen_oled.png | Bin 1551 -> 0 bytes .../settings_screen/homepages_eink.png | Bin 6849 -> 0 bytes .../settings_screen/homepages_oled.png | Bin 1815 -> 0 bytes .../settings_screen/overview_eink.png | Bin 6059 -> 0 bytes .../settings_screen/overview_oled.png | Bin 1707 -> 0 bytes .../settings_screen/settings_screen.md | 142 ----- .../tools_screen/autoreply_eink.png | Bin 4665 -> 0 bytes .../tools_screen/autoreply_oled.png | Bin 1941 -> 0 bytes .../tools_screen/nearby_eink.png | Bin 8747 -> 0 bytes .../tools_screen/nearby_oled.png | Bin 2134 -> 0 bytes .../tools_screen/nearby_ping_eink.png | Bin 4762 -> 0 bytes .../tools_screen/nearby_ping_oled.png | Bin 2216 -> 0 bytes .../tools_screen/nearby_scan_eink.png | Bin 8745 -> 0 bytes .../tools_screen/nearby_scan_oled.png | Bin 2106 -> 0 bytes .../tools_screen/overview_eink.png | Bin 4558 -> 0 bytes .../tools_screen/overview_oled.png | Bin 1834 -> 0 bytes .../tools_screen/ringtone_eink.png | Bin 4506 -> 0 bytes .../tools_screen/ringtone_oled.png | Bin 1726 -> 0 bytes .../tools_screen/tools_screen.md | 593 ------------------ .../tools_screen/trail_map_eink.png | Bin 4866 -> 0 bytes .../tools_screen/trail_map_oled.png | Bin 1778 -> 0 bytes .../tools_screen/trail_summary_eink.png | Bin 4677 -> 0 bytes .../tools_screen/trail_summary_oled.png | Bin 1850 -> 0 bytes .../companion_radio/ui-core/DmUnreadTable.h | 2 +- .../companion_radio/ui-core/SettingsSchema.h | 2 +- examples/companion_radio/ui-core/UiCore.h | 2 +- examples/companion_radio/ui-core/UiCoreHost.h | 2 +- examples/companion_radio/ui-core/UiEvents.h | 2 +- examples/companion_radio/ui-lvgl/UITask.cpp | 2 +- examples/companion_radio/ui-lvgl/UITask.h | 2 +- release-notes.md | 4 +- solo/wio-tracker-l2/platformio.ini | 2 +- 78 files changed, 768 insertions(+), 1406 deletions(-) create mode 100644 docs/solo/README.md create mode 100644 docs/solo/contacts.md rename docs/{solo_features/build_flags.md => solo/developer/build-flags.md} (95%) rename docs/{ => solo}/developer/ui-core.md (100%) rename docs/{ => solo}/developer/ui-framework.md (99%) create mode 100644 docs/solo/getting-started.md create mode 100644 docs/solo/hardware.md create mode 100644 docs/solo/img/hero.png create mode 100644 docs/solo/img/l2-home.png create mode 100644 docs/solo/img/oled-clock.png create mode 100644 docs/solo/img/oled-messages.png create mode 100644 docs/solo/lock.md create mode 100644 docs/solo/messages.md create mode 100644 docs/solo/navigation.md create mode 100644 docs/solo/settings.md create mode 100644 docs/solo/tools.md delete mode 100644 docs/solo_features/README.md delete mode 100644 docs/solo_features/clock_screen/clock_screen.md delete mode 100644 docs/solo_features/clock_screen/fields_eink.png delete mode 100644 docs/solo_features/clock_screen/fields_oled.png delete mode 100644 docs/solo_features/clock_screen/overview_eink.png delete mode 100644 docs/solo_features/clock_screen/overview_oled.png delete mode 100644 docs/solo_features/external_keyboard.md delete mode 100644 docs/solo_features/favourites_dial/favourites_dial.md delete mode 100644 docs/solo_features/favourites_dial/overview_eink.png delete mode 100644 docs/solo_features/favourites_dial/overview_oled.png delete mode 100644 docs/solo_features/message_screen/compose_eink.png delete mode 100644 docs/solo_features/message_screen/compose_oled.png delete mode 100644 docs/solo_features/message_screen/ctx_channel_eink.png delete mode 100644 docs/solo_features/message_screen/ctx_channel_oled.png delete mode 100644 docs/solo_features/message_screen/ctx_contact_eink.png delete mode 100644 docs/solo_features/message_screen/ctx_contact_oled.png delete mode 100644 docs/solo_features/message_screen/fullscreen_eink.png delete mode 100644 docs/solo_features/message_screen/fullscreen_menu_eink.png delete mode 100644 docs/solo_features/message_screen/fullscreen_menu_oled.png delete mode 100644 docs/solo_features/message_screen/fullscreen_oled.png delete mode 100644 docs/solo_features/message_screen/history_eink.png delete mode 100644 docs/solo_features/message_screen/history_oled.png delete mode 100644 docs/solo_features/message_screen/message_screen.md delete mode 100644 docs/solo_features/message_screen/overview_eink.png delete mode 100644 docs/solo_features/message_screen/overview_oled.png delete mode 100644 docs/solo_features/screen_lock/overview_eink.png delete mode 100644 docs/solo_features/screen_lock/overview_oled.png delete mode 100644 docs/solo_features/screen_lock/screen_eink.png delete mode 100644 docs/solo_features/screen_lock/screen_lock.md delete mode 100644 docs/solo_features/screen_lock/screen_oled.png delete mode 100644 docs/solo_features/settings_screen/homepages_eink.png delete mode 100644 docs/solo_features/settings_screen/homepages_oled.png delete mode 100644 docs/solo_features/settings_screen/overview_eink.png delete mode 100644 docs/solo_features/settings_screen/overview_oled.png delete mode 100644 docs/solo_features/settings_screen/settings_screen.md delete mode 100644 docs/solo_features/tools_screen/autoreply_eink.png delete mode 100644 docs/solo_features/tools_screen/autoreply_oled.png delete mode 100644 docs/solo_features/tools_screen/nearby_eink.png delete mode 100644 docs/solo_features/tools_screen/nearby_oled.png delete mode 100644 docs/solo_features/tools_screen/nearby_ping_eink.png delete mode 100644 docs/solo_features/tools_screen/nearby_ping_oled.png delete mode 100644 docs/solo_features/tools_screen/nearby_scan_eink.png delete mode 100644 docs/solo_features/tools_screen/nearby_scan_oled.png delete mode 100644 docs/solo_features/tools_screen/overview_eink.png delete mode 100644 docs/solo_features/tools_screen/overview_oled.png delete mode 100644 docs/solo_features/tools_screen/ringtone_eink.png delete mode 100644 docs/solo_features/tools_screen/ringtone_oled.png delete mode 100644 docs/solo_features/tools_screen/tools_screen.md delete mode 100644 docs/solo_features/tools_screen/trail_map_eink.png delete mode 100644 docs/solo_features/tools_screen/trail_map_oled.png delete mode 100644 docs/solo_features/tools_screen/trail_summary_eink.png delete mode 100644 docs/solo_features/tools_screen/trail_summary_oled.png diff --git a/README.md b/README.md index 068af957..10c818d1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +

MeshCore Solo

+ # MeshCore Solo Companion Firmware A fork of the official [MeshCore](https://github.com/meshcore-dev/MeshCore) companion radio firmware with a full standalone on-device UI — messages, contacts, GPS navigation and tools without a phone. @@ -27,7 +29,7 @@ Discussion: [MeshCore Discord](https://discord.gg/sdhYArU2jr) — [Solo firmware Firmware files are on the [releases page](https://github.com/MarekZegare4/MeshCore-Solo/releases). Every binary serves the companion app over both BLE and USB serial. -Heltec V3/V4 need [a keyboard or joystick wired up](./docs/solo_features/external_keyboard.md#wiring-heltec-v3--v4); ProMicro needs a CardKB; the T-Echo Lite needs the KeyShield. The rest work out of the box. +Heltec V3/V4 need [a keyboard or joystick wired up](./docs/solo/hardware.md#wiring-on-the-heltec-v3--v4); ProMicro needs a CardKB; the T-Echo Lite needs the KeyShield. The rest work out of the box. --- @@ -47,7 +49,7 @@ Heltec V3/V4 need [a keyboard or joystick wired up](./docs/solo_features/externa ## Documentation -[docs/solo_features](./docs/solo_features/README.md) — features, screens, external keyboards, build flags and developer guides. +[Documentation](./docs/solo/README.md) — getting started, messages, navigation, tools, settings, hardware and developer guides. **Solo Tools** — [a web app](https://marekzegare4.github.io/Solo-tools/) (Chromium, Web Serial) that takes screenshots and exports the GPS trail as GPX over USB; the same as local scripts in [tools/](./tools/README.md). @@ -60,7 +62,7 @@ pio run -e -t upload # build and flash ov FIRMWARE_VERSION=v1.0.0 bash build.sh build-firmware # release artifacts into out/ ``` -Environments are the `*_solo_dual` (OLED / e-ink) and `*_solo_lvgl` (touch) entries in `solo//platformio.ini`. Optional hardware (CardKB, joystick, GPIO, buzzer…) is enabled with [build flags](./docs/solo_features/build_flags.md). Releasing: [RELEASE.md](./RELEASE.md). +Environments are the `*_solo_dual` (OLED / e-ink) and `*_solo_lvgl` (touch) entries in `solo//platformio.ini`. Optional hardware (CardKB, joystick, GPIO, buzzer…) is enabled with [build flags](./docs/solo/developer/build-flags.md). Releasing: [RELEASE.md](./RELEASE.md). This README is protected from upstream merges via `.gitattributes`; after cloning run once `git config merge.ours.driver true`. diff --git a/docs/solo/README.md b/docs/solo/README.md new file mode 100644 index 00000000..4e5d02ae --- /dev/null +++ b/docs/solo/README.md @@ -0,0 +1,70 @@ +

MeshCore Solo

+ +# MeshCore Solo + +Solo is a MeshCore companion firmware that works on its own: messages, contacts, +GPS navigation and tools right on the device, no phone needed. The phone app +still connects as with the stock firmware, over Bluetooth or USB. + +**Try it in your browser: [solo.marekzegarek.com](https://solo.marekzegarek.com)** + +## What it does + +- **Messages without a phone**: channels, direct messages and rooms, with + quick replies, live placeholders (`{loc}`, `{time}`, sensor readings) and + keyboards for Latin, Cyrillic, Greek and European diacritics. +- **GPS navigation**: trail recording with GPX export, waypoints, a compass, + navigate to any node, waypoint or shared location, live location sharing + and a geofence alert (Locator). +- **Nearby nodes**: who's around, signal and distance, ping, and remote + admin of your repeaters and rooms. +- **Tools**: clock with alarm, timer and stopwatch, a remote bot that answers + commands over the mesh, repeater mode, a ringtone editor, diagnostics. +- **Screen lock** with an optional PIN. +- **On the Wio Tracker L2**: an offline map, message history on the SD card, + the SD card as a USB drive, updates over WiFi. + +## Devices + +The firmware is the same everywhere; how you drive it depends on the device. +These docs mark the differences with notes like this: + +> [!NOTE] +> **Wio Tracker L2:** what's different on the touch screen. + +| Group | Devices | Controls | +| ----- | ------- | -------- | +| **Joystick** | Wio Tracker L1 (OLED / e-ink), GAT562 30S, GAT562 Watch13, Heltec V3/V4 with a joystick | Four directions, Enter, Back | +| **Keyboard** | M5Stack Cardputer ADV, T-Echo Lite + KeyShield, any board with a CardKB | Keys; arrows or their Fn combinations for the directions | +| **Touch** | Wio Tracker L2 | Taps, swipes and holds; two side buttons | + +| OLED / e-ink | | Wio Tracker L2 | +| :---: | :---: | :---: | +| ![Clock page](./img/oled-clock.png) | ![Messages](./img/oled-messages.png) | ![Home screen](./img/l2-home.png) | + +The joystick and keyboard devices share one interface, sized for small OLED +and e-ink screens. The Wio Tracker L2 has its own, built for a 320 × 240 +colour touch screen, with extras its hardware allows: an offline map, message +history on the SD card and updates over WiFi. + +## Pages + +- [Getting started](./getting-started.md): controls, the home screen, the phone app, updates +- [Messages](./messages.md): channels, direct messages, rooms, typing +- [Contacts](./contacts.md): nearby nodes, favourites, remote admin +- [Navigation](./navigation.md): GPS, trail, waypoints, compass, sharing your location, the map +- [Tools](./tools.md): clock tools, bot, repeater, ringtones, diagnostics +- [Settings](./settings.md): what is where +- [Screen lock](./lock.md): locking, auto-lock, PIN +- [Hardware](./hardware.md): external keyboards and joysticks, e-ink, SD card, WiFi + +For developers: [UI Core](./developer/ui-core.md), [UI framework](./developer/ui-framework.md), [build flags](./developer/build-flags.md). + +## Contributors + +Big thanks to the people who contributed to Solo: +[vanous](https://github.com/vanous), [marczykm](https://github.com/marczykm), +[tchellow](https://github.com/tchellow) and [3urobeat](https://github.com/3urobeat). + +Built on [MeshCore](https://github.com/meshcore-dev/MeshCore) and the work of +its [community](https://github.com/meshcore-dev/MeshCore/graphs/contributors). diff --git a/docs/solo/contacts.md b/docs/solo/contacts.md new file mode 100644 index 00000000..8a8dbd74 --- /dev/null +++ b/docs/solo/contacts.md @@ -0,0 +1,69 @@ +# Contacts + +## Nearby nodes + +**Tools › Nodes** lists the nodes the device has heard: their type, how long +ago, and, when they have a position, distance and bearing. **Left / Right** +filters by type (All, Fav, Companions, Repeaters, Rooms, Sensors); the sort, +by distance or by last heard, is in the options. A ★ marks a favourite, a ♦ +someone sharing their position live. + +**Enter** shows a node's details. **Hold Enter**, in the list or the details, +for what you can do with it: + +| Option | Does | +| ------ | ---- | +| Navigate | Distance and bearing to the node; follows it if it shares its position live | +| Ping | Sends a ping and shows the round trip time and SNR | +| Save waypoint, Set as target | Its position as a waypoint, or as the [Locator](./navigation.md#locator) target | +| Fav, Pin to dial | Favourite, or a place on the Favourites page | +| Admin | Remote admin, for a repeater or room (below) | +| Discover scan | Asks the repeaters, rooms and sensors in direct range to answer, with their signal | + +> [!NOTE] +> **Wio Tracker L2:** the **Nodes** app. Filter chips at the top, the sort in +> the header, and a map button that shows every node with a position. A +> node's card has buttons for the same actions, plus **Add** for a node that +> isn't a contact yet and **Delete**. + +## Favourites + +The **Favourites** home page holds six slots for the conversations you open +most: a contact, a room or a channel, each with its unread count. **Enter** on +an empty slot picks one from Messages; **hold Enter** on a filled slot to +replace or remove it. **Pin to dial** in any contact, channel or node menu +does the same. + +A pinned slot is not the same as a favourite. **Fav** is the star shared with +the phone app: it sorts contacts to the top and drives the "favourites only" +filters in Settings › Contacts. + +> [!NOTE] +> **Wio Tracker L2:** the first home page. Tap a slot to open it, hold it to +> change it. + +## Cleaning up + +Settings › Contacts › **Expire** (7, 30 or 90 days) sets when a contact you +haven't heard from counts as inactive, and **Prune now** removes those after +showing how many it will delete. Favourites are always kept, and nothing is +removed without **Prune now**. + +## Remote admin + +**Tools › Admin** manages a repeater or room server you are an admin on, the +same way the phone app does. Pick the node, type its admin password (saved for +next time), then choose a field: + +- **System**: name, owner info, admin password. +- **Radio**: frequency, bandwidth, spreading factor, coding rate, TX power. +- **Routing**: repeat on/off, advert intervals, max hops. +- **Actions**: send an advert, sync its clock, reboot, start OTA, or any + [CLI command](../cli_commands.md). + +Name and owner info are read from the node first, so you edit the current +value. Reboot and OTA ask before sending. + +> [!WARNING] +> Admin commands change the remote node. Check the node and the value before +> sending. diff --git a/docs/solo_features/build_flags.md b/docs/solo/developer/build-flags.md similarity index 95% rename from docs/solo_features/build_flags.md rename to docs/solo/developer/build-flags.md index 474127b4..cf56d231 100644 --- a/docs/solo_features/build_flags.md +++ b/docs/solo/developer/build-flags.md @@ -1,6 +1,6 @@ ## Build Flags -[Go back](../../README.md) +[Go back](../README.md) Reference for the `-D` build flags a Solo build understands beyond the per-board defaults already set in `solo//platformio.ini`. Add any of @@ -11,7 +11,7 @@ isn't there costs nothing and can't brick a build; the exceptions (pin conflicts, wrong polarity) are called out per flag. None of this needs touching to get a board running — see the -[environment table](../../README.md#building-from-source) for the flag-free +[environment list](../../../README.md#building) for the flag-free default build for each supported board. --- @@ -48,11 +48,11 @@ existing `solo//platformio.ini` for what's already claimed). | Flag | Adds | | --- | --- | -| `ENV_PIN_SDA` / `ENV_PIN_SCL` | CardKB (M5Stack I2C keyboard, addr `0x5F`) on a second I2C bus (resolves to `Wire1`). Probed at boot — harmless with nothing plugged in. See [External Keyboard & Joystick](./external_keyboard.md). | +| `ENV_PIN_SDA` / `ENV_PIN_SCL` | CardKB (M5Stack I2C keyboard, addr `0x5F`) on a second I2C bus (resolves to `Wire1`). Probed at boot — harmless with nothing plugged in. See [External Keyboard & Joystick](../hardware.md#external-keyboard-and-joystick). | | `CARDKB_I2C=` | Same CardKB support, naming the bus directly — for a board with no free pins for a second bus, set `CARDKB_I2C=Wire` to share the primary bus (already used by the display/RTC) instead of defining `ENV_PIN_SDA`/`ENV_PIN_SCL`. Takes precedence if both are somehow set. | -| `UI_HAS_JOYSTICK=1` + `UI_HAS_JOYSTICK_UPDOWN=1` (optional) + `JOYSTICK_UP` / `JOYSTICK_DOWN` / `JOYSTICK_LEFT` / `JOYSTICK_RIGHT` + `PIN_USER_BTN` + `PIN_BACK_BTN` | A wired joystick (four direction contacts + a press contact for Enter). Replaces single-button navigation entirely once enabled. See [External Keyboard & Joystick](./external_keyboard.md). | -| `PIN_GPIO1` .. `PIN_GPIO4` | Up to four general-purpose pins, each independently switchable between Off / Input / Output (GPIO1/GPIO2 also get an Analog step, if wired to an ADC-capable pin) from Tools › GPIO, and via the `!gpio1`..`!gpio4` bot commands. Not restricted to any particular board — works anywhere the pins are actually free. See [Tools Screen › GPIO](./tools_screen/tools_screen.md#gpio). | -| `PIN_HALL_SENSOR` + `HALL_ACTIVE_HIGH=1` (optional) | A Hall-effect or reed sensor for a magnetic flip cover: closing locks and blanks the screen instantly, opening unlocks and wakes it, no combo either way. `HALL_ACTIVE_HIGH` is only for a module wired to pull the pin high (rather than low) when the magnet is near. See [Screen Lock › Magnetic cover](./screen_lock/screen_lock.md#magnetic-cover-hall-sensor). | +| `UI_HAS_JOYSTICK=1` + `UI_HAS_JOYSTICK_UPDOWN=1` (optional) + `JOYSTICK_UP` / `JOYSTICK_DOWN` / `JOYSTICK_LEFT` / `JOYSTICK_RIGHT` + `PIN_USER_BTN` + `PIN_BACK_BTN` | A wired joystick (four direction contacts + a press contact for Enter). Replaces single-button navigation entirely once enabled. See [External Keyboard & Joystick](../hardware.md#external-keyboard-and-joystick). | +| `PIN_GPIO1` .. `PIN_GPIO4` | Up to four general-purpose pins, each independently switchable between Off / Input / Output (GPIO1/GPIO2 also get an Analog step, if wired to an ADC-capable pin) from Tools › GPIO, and via the `!gpio1`..`!gpio4` bot commands. Not restricted to any particular board — works anywhere the pins are actually free. See [Tools › GPIO](../tools.md#gpio). | +| `PIN_HALL_SENSOR` + `HALL_ACTIVE_HIGH=1` (optional) | A Hall-effect or reed sensor for a magnetic flip cover: closing locks and blanks the screen instantly, opening unlocks and wakes it, no combo either way. `HALL_ACTIVE_HIGH` is only for a module wired to pull the pin high (rather than low) when the magnet is near. See [Screen lock › Magnetic cover](../lock.md#magnetic-cover). | | `PIN_GPS_SWITCH` | A physical on/off switch for GPS power, read alongside the software GPS toggle — the Tools screen shows `gps off(hw)` / `gps off(sw)` when the two disagree, instead of silently trusting one over the other. | --- diff --git a/docs/developer/ui-core.md b/docs/solo/developer/ui-core.md similarity index 100% rename from docs/developer/ui-core.md rename to docs/solo/developer/ui-core.md diff --git a/docs/developer/ui-framework.md b/docs/solo/developer/ui-framework.md similarity index 99% rename from docs/developer/ui-framework.md rename to docs/solo/developer/ui-framework.md index 1ede0aa7..93f6c33a 100644 --- a/docs/developer/ui-framework.md +++ b/docs/solo/developer/ui-framework.md @@ -1,10 +1,10 @@ # Solo UI framework — a guide for adding features -[Go back](../../README.md) +[Go back](../README.md) This is a developer guide to the reusable building blocks behind the `companion_radio` **solo** firmware UI (the `ui-new` screens). It is not a -user manual — for what each screen *does*, see [solo_features](../solo_features/). +user manual — for what each screen *does*, see the [documentation](../README.md). The goal here is so that adding a new screen or feature means *wiring together existing helpers*, not reinventing list scrolling, text wrapping, or persistence. diff --git a/docs/solo/getting-started.md b/docs/solo/getting-started.md new file mode 100644 index 00000000..0bfb1ce1 --- /dev/null +++ b/docs/solo/getting-started.md @@ -0,0 +1,66 @@ +# Getting started + +## Controls + +On joystick devices: + +| Input | Does | +| ----- | ---- | +| **Up / Down** | Move through a list | +| **Left / Right** | Switch home pages; change the value of a setting | +| **Enter** | Open, select, confirm | +| **Hold Enter** | Options for the selected item (a message, contact, channel…) | +| **Back** | One step back; from a screen, back to the home screen | + +Lists wrap around at both ends. Any key wakes a dark screen without acting on it. + +Keyboard devices use the same controls, from the arrow keys (or their Fn +combinations), Enter and Esc. [Hardware](./hardware.md) has the key maps. + +> [!NOTE] +> **Wio Tracker L2:** tap to open, hold for options, swipe sideways between +> pages. The top button turns the screen off and on. The side button goes +> back to the home screen; hold it and let go to mute or unmute the sound. +> Holding the side button while pressing the top one takes a screenshot. + +## Home screen + +The home screen is a row of pages. On joystick devices, **Left / Right** steps +through them and **Enter** opens the one shown: + +Clock, Recent, Radio, Bluetooth, Advert, GPS, Sensors, Tools, Shutdown, +Settings, Messages, Favourites, Map. + +Settings › Home Pages sets their order and hides the ones you don't use; +Settings and Messages are always shown. + +> [!NOTE] +> **Wio Tracker L2:** pages you swipe between: favourite chats, the clock +> (where it starts), a minimap, then the apps, six to a page. Hold an app to +> arrange or hide them. + +## Connecting the phone app + +Every build serves the MeshCore app over **Bluetooth and USB**, one at a time: +while Bluetooth is connected, USB is ignored. To use USB, disconnect Bluetooth +first or turn it off on the device. + +The Bluetooth pairing PIN is shown on the Bluetooth home page until the phone +is paired. + +> [!NOTE] +> **Wio Tracker L2:** the PIN is under Settings › Bluetooth. + +Everything you do on the device and in the app stays in sync: contacts, +channels and messages are the same data. + +## Updating + +Download the new file from the [releases page](https://github.com/MarekZegare4/MeshCore-Solo/releases) +and flash it the way you did the first time (see the [main README](../../README.md#flashing)). +Settings, contacts and messages are kept. + +> [!NOTE] +> **Wio Tracker L2:** Settings › Firmware update checks GitHub for a newer +> release and installs it over WiFi. Set up a network under Settings › WiFi +> first. diff --git a/docs/solo/hardware.md b/docs/solo/hardware.md new file mode 100644 index 00000000..9e75e2c7 --- /dev/null +++ b/docs/solo/hardware.md @@ -0,0 +1,99 @@ +# Hardware + +## External keyboard and joystick + +Two optional add-ons, detected at boot; a build with them enabled works the +same with nothing plugged in. + +| Device | CardKB | Wired joystick | +| ------ | :----: | :------------: | +| Wio Tracker L1 (OLED / e-ink) | Grove connector | built in | +| GAT562 30S Mesh Kit | — | built in | +| Heltec V3 / V4 | soldered (below) | soldered (below) | +| ProMicro | on the main I2C bus (required: it has no buttons) | — | +| Cardputer ADV, T-Echo Lite + KeyShield | built-in keyboard instead | — | + +### CardKB + +An M5Stack CardKB types straight into any text field. It sends plain +characters, so the keyboard alphabet settings don't apply to it. + +| Key | Does | +| --- | ---- | +| Arrows, Enter, Esc | Same as the joystick, Enter and Back | +| Backspace | Deletes before the cursor | +| **Fn+Enter** | Submits the field | +| **Fn+letter** | Accents for that letter (Fn+A → á à ä…) | +| **Tab** | Hold Enter (options menus) | +| **Fn+Esc** | Locks / unlocks the screen | + +Settings › Keyboard › **Ext. KB**: **Full** keeps the on-screen grid, so the +CardKB and the joystick can be mixed; **Compact** hides it, the arrows move the +text cursor and Enter submits. Compact needs no joystick at all. + +### Wired joystick + +Four direction contacts and a press contact (Enter), each shorted to ground +when pressed; the firmware enables the pull-ups, so no resistors are needed. +The board's own button becomes Back. Settings › Display › **Joystick +rotation** turns the directions for a stick mounted sideways. + +### Wiring on the Heltec V3 / V4 + +Neither board has a joystick or a keyboard connector, so both are soldered to +free pins. V3 and V4 use the same pins (confirmed on a V4). + +| Function | GPIO | +| -------- | :--: | +| CardKB SDA / SCL | 3 / 4 (second I2C bus, not the display's) | +| Joystick up / down / left / right | 23 / 6 / 47 / 48 | +| Joystick press (Enter) | 33 | +| Back | 0 (the PRG button, nothing to wire) | + +The pins are set in [`solo/heltec_v3/platformio.ini`](../../solo/heltec_v3/platformio.ini) +and [`solo/heltec_v4/platformio.ini`](../../solo/heltec_v4/platformio.ini). +For a CardKB-only build, comment out the joystick block there and use +Ext. KB = Compact. + +### Built-in keyboards + +The Cardputer ADV has a QWERTY keyboard, the T-Echo Lite a T9 keypad on its +KeyShield add-on (without it the board has no usable input). Their keymaps +are in each board's driver under `variants/`; they don't follow the CardKB's +Fn shortcuts. + +## E-ink + +The e-ink Wio Tracker L1 (250 × 122) has a few settings of its own in +Settings › Display: + +- **Rotation**: landscape or portrait, applied at once; every screen reflows. +- **Joystick rotation**, independent of the display's. +- **Full refresh**: how many partial updates between full ones, against + ghosting. + +Clock seconds are hidden by default, and live timers refresh coarsely, to +spare the panel. + +## Wio Tracker L2 + +- **Buttons**: the top one turns the screen off and on; the side one goes + home, and held and let go mutes the sound. Side + top takes a screenshot. + Holding the side button in the first seconds after power-on starts the CLI + rescue on USB serial. +- **SD card**: holds the message history, maps, GPX trails and live map tiles. + Settings › Storage shows what takes the space, how many messages each + conversation keeps, and deletes the history. +- **USB drive**: plugged into a computer, the device asks whether to only + charge or to lend the computer the SD card. While lent, the device can't use + the card; eject it on the computer and the device restarts. With a screen + PIN set, it doesn't ask until the screen is unlocked. +- **WiFi**: used only for map downloads, live tiles and updates, and off the + rest of the time. Settings › WiFi saves several networks and joins the + strongest; the WiFi switch in Settings forbids it entirely. + +## Build flags + +Extra hardware (a buzzer, a vibration motor, a Hall sensor for a magnetic +cover, GPIO, an external PA) is enabled with build flags in your own +`solo//platformio.ini`; see [Build flags](./developer/build-flags.md). diff --git a/docs/solo/img/hero.png b/docs/solo/img/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..ddbed4325ee7170ccf782a25bb506e3c7c130a83 GIT binary patch literal 3387 zcmeAS@N?(olHy`uVBq!ia0y~yU~^z#U|hn%1QdBDQ}+re&gALh7*cWT?XA6euQC{1 zFP=Tos;Q}2sVO&U`l2OETKaDHD)~+dEb>j7z4ercpv-@jTffX6Td)BQU?~3D&k3SE z4uH&SV9^0_gf@Uk1x9WJXV}Uo6!jlJ%)uD}^6G>JRuBc@s3b4~*$zx%2%*6%&jEJ- z&~WmBU>>!GpF8Hh^Z)zz_T!B0@psPwzsPZ~{aXv?`{?(f3hJb!>3`V< zjC=ZSzx?;^{PyD)Ey^P9oRhzMe#iW~;XC#<>|Z`Xn3Uv_&#T7p>{;2a-+$)ckaIWh zwEbvT^1piinrH9dtiJo)`@jA1YPJ)c;EadGdng$X!b#|46K2@|v}~6&<9E*0TWtH> z3Tg{u|IB5DnnGOmO;BSKK5%~b+;`nSY;He(k+ie^-}OuHC+~b~xqa^Zz2}3z#aq2E z{t)xq`n4^mWh1VP0ZDQw8Dr0;gDeL&-}Nh3{*Vhac;ByM-~VQqf7rvoK${;r?Oer@mhOY`q9jak3* z?Vf9|-|gGl{QJ&-U8vij*&Sy_g36ycn85TvdHdzN9N!oj>JEIfkYa=;FqG)R9TDo1 zJ`Arn+xETx_or-^{-a`}^RG>}zux_&Hsbs5Yrj)utEZ8@O8EI-QMQ!JPc1*Fp5XqLHJ=hu-1tJm8uczjz8XbGv^Iy8EFWX z%UH4pMCbrNFgOovj@3_Bu1VT%zoT#6~1M}T~4|1$~+`lvK zT=%`oRp;OD{2a69z#s_+1<8l?cmE|I`39wYfpAcK1C`%w3iQoRkRyJ~ z0lMfY69Y6PaaR~9`86%ifRQ17>uvdae}8^0s#__$?^mt;t=zo%!Z!O!4A^X=84L^+ ztk+N96=IEe*C({_`O+{0e3BdQVBw9iMzm< zVK{UDYtg(X-`{*=Pi7*q{GD=;g~8`(m8JB-uSZM&OajJ;KP*B~LJfB*w;Ud!pfoN4 z%=uURY6)Ezi; uCbooyrQ{h*`VHh~pFK8m+pr(F|1n5ONahOkt-T9stb4lpxvX-3+%Z@4~6RdH~{zzuZnKMkB-B?kQC3<*_UCrLJGF3#SMuf1Vx z`r#kGPbVYpf52ise$h!B{_hU{PdW)(NYQQ+v+`lQ7AqCiz_}prTy5uv25F)SI*VOjR($}5{U3D-bhlLDUV|t1Yojkt zI7UgjPuy;yQxEBIO$^Ib_68WGO2HiRwYq86@6#XFpFfmte|E4i)R)Kda?-7+%gbu9 zTu^^iu)HU5GvPuzOIFldEu+jx-CEyE5gT8#?mPK=_zkIG#DKZd&<^xgO#MW{!a%fd zOJv9A5AK}69o8eX9Jjm&JSoV`Ctm{IcO&o^@ED;CJPf>PKF-1M;iUU^oh5lu+to3i z=l5SfnJ5&)yRqy+u=RHC4YIC2(sEw%8B4HYuzjuE25+_VH4Ic4wm4GQfGW&oT230D z<9L=)(RglL`>e=(MB2MD_txRDp3sE@;>N3$PkgVTIaF8<=gn{6CZOYL#} zaI5@`*i}0*=OX1OM$2elR^Xz1AzF;|Dlwdv&_2Q^ua|h8$_K(u4!Hcm@#$=>he!4^ zTIBRdR*crNm$={guut7+Gg3H#S?O?ZQc12)M*M^_Rt{T|t{uw~3T-C0#*nC|dsA3g zmf_8v{FNl%I<+!HqFKPLfH8R8cCH&0y}y`YonZ#IB`8lV+k_jR;-1{!Iag)0-bgJ) z6ex!Uk65L>E0WP?YxH>E5?yK@dUWfyhax|kI{n7=T0>9FJ;@WIOF`E!Lf{_A3Tkk- zg=$j0@fW>7`LXv{KB@jo_Ie!uI3>OG?T)+1i#oFeSLc6NLsfZ4hHF41*SzlTZC-{+ z(uT%fiR$tlPohS@qdyeq3jMCjcal6ObQMwz`TJzUlbHK|aSor2Y&AuuOz25A#Piq~ zs+jB#Oxxaqu0p$$iYN8X%=$OgMxJkV8FTGo6_RE=0vg??9KYFYQ>77yvz2ztiSB1_ zW^!IsCxVjvk`O-*i(xEyO|VlNaoT6@e)LvGSErAhVA%QtVcLc0EW7=LRy#jsh3ba% z&1Uj-Za9Ixbs=2#_3kfmEh3ev#q6?|jCYhToUl?$VodgGp$W_F>n%9W$o09%^Ja$m z0Y@sM26Xz-&-@;l%i3>`32{98=uUWZQ}@w_HX;)ypB|%iG=$pRBW&bt@0mnZA-t~; z{$s~%Ctb3-=zV|7-@#7_aG_rBVv}+L?F;cP?`P)WiP0B0Ut2uYPc`3!kYZ+dA34R2 z@i6&=!yn~g1Y<9xw%Ov(2-c8+Rj(Ji`DNjB)39^Qu~{V<0wR#_qyzWy`!`D6bDb5r zULq%)hcrmDH7YJ&vgc5-Huwy)sQaH{BW`eOD<;bO$NB|D+*sF8<~nwB&#-qn>+Gym zl*5hJLekCx8VqOTJ>yYW!x2?$cJyo{-PX%A)5%_)A%oqsZ{O0zP}`Sk>@@|QYr<#( zo9Y3_nh3OmUId96IHWeqDhTTeAKKHJLv_rx;9yMz&!8TG%_8t3yWnYNY5E8sG`xZw zG7Ts8YWy@M!kG7DS(S3@QRz+){_5>jQqIIQ^Uy_uY(O)iBprn&3=SU|byK$HU z2vN~W68gyQD$2Kn$iczrjWmY77G2wzLp0xEzIPE`+%@rg_61B%y)5dS4O0ZkPb&sJ z+36Dq_k)hta9R6t=lXWy#xy(WT1=J4j8H8Y3*{?WYPJ$@Z)0h`JyC64+1lw(HMXii zV^$sHur|Gm+JfG@SMlEGwGO;+@TAaBhb27X>c99r29B+|Q7w}qURtLqVxM@z)z_kRAQ(P&K<4DM8qj4=YmD3Y+jpX>3eWk!M~X#TN( zTVBP!Ik(VBKlQ36(cIA2VM~ONsDLe!Sn->-5*UBq{cMtcA-KbisEG8wHOs-l=}h>1 z5y_YK2>h8E2qSE(7F-6K{F6gpBXZ5t|K9r#R`7(K0wl@n-v*M&hk00?PFMqLYtpFPw;m z#XhpdN5|52PB+E8Y&*2Yk0+ju_{7&&>rQr_^*@+nUO)IpB7Xh_+I38g#O$=29>t!% zd9+Q^x};0Qv2o$9)e-)GEjz0hc2$hC4}aAv(jb(33EA82R<~=F*^Hn%L{h3n?tM~fqkgPJ`(W1}p9v;cETLlfh7S$t@>ZHH( zyP(Z1!nXTr?O&D}$fz0+_(Wd^PCiKH?76Xa9F>sg*;e;0K{jl$sz_o~aeVqkwOH9J z5BqneXep7_l@&MsV*7(lWmFxblXZ;5EI3NnT0h4AbV$Dn?(VrBY?Ha@5_%|DI+mp1 z`aow)0zN+Bme9UCZAlq}T!yz*-nDtms^FRb5+lfa^2p$VO1F2uR%kb)Ry~|_N;93Z zH?4=dH`H#6_qOdV&?}%=77$G6KfPY0`Bb-XYoB&-o9IK&BM}8uL;)GB?S=Oi)W520 z`j}@Kh%g6<(l=(YIUmpO2h^>=tx0 z7o9A};R?Al<1e-@Lyx2h2{jo?I);*^5;)FkcqS$Hk*&ovUv-0!jQz#Zr^Qcg@jD#m zE#Hvu%1oa>f^pGtmDkhl#d z`Fy(X(G@`4wvG{Fedg_&h6QNu76d4v_twQV^}g8ceCE9frSE=1usXsl%~8I3k0e8v zabc3+uEl_Wb20qTDw+Q9U}l#bc2k}1H|>i_@_266clmMPGah)bt4L|cx47PG55jjM zw0ug^c1C3SXEzF%WgXp4S%*cim+6>4K8ZbUrnP%CEoyF_OZKzIC@+GPt`WqHqwi!I zU#85w@TDo&+(F#VDLt9Y4~5$nZg1BK>CXg`J>!0*8ifxl_GLaNc@&1);)8(y)Qkz( z{TX8on8fe1H+Y}<|ooR8^YAMKWx^7Lx$9_jdPJPtF*zqE8^ ze&PN@)JJe{j=Y9b(IT6cgOlpwqdu>c?E&ww!jIo+nvv%g8I;0-@_#HYd>BU28&Jlb z*c@dF(z`6NF>ZSooLA=hR3Ysgr{vdPS;NAY$TWW=0U_Os7f%3*W_cU9d*QWeMR>aJ z5Ve(Gyf3Ig0b4&}#3KgAkeidL-Tee(V)-a2UmQHc%$o-^6yOZf;`pcIOcttbhSm)0 z&nOUdA~eQK$>gRgK}ORPr83ZC@7+QT0JMb6iH$G%%djn}C+hSA5}bJBv^uVCoAQc| zj0}M4j4C$9t8pEZ)UA zCUQLwUNVGCxIR37&Y}Tj#&l~29)8$mzi%k0j|-c4(waX+uw(0$j@?r}5HlF{EIiB) z3xCErif%_I?2m^tf<@5iX};oyM$d2j)*?O%*qOJq6GRhbpAz-exgOvwQYd7XPyZTy z9Q3@B7>v{EDwgWMY!d1>OzY9_So8E}ea!bNzUn&lQ?f4SQ~$X-h4zFZuac@fJ!ubLHxh%2u3$K~XVbj0 z6Z3|5?_*_(#h)z=#{g9rk8TYKZ^hgXeK2@dlP_3AIrnc$WY;{>|H^CtqBv$fFr+{*1 zD3mm6mAJWC_HM8q5@$m=)nwNt|MZT~Cw{2*dgu;O{B)0k7Te(F7a&nbht;r)6Yl!H zKFG7^C>n)@G7{K%l)Z}NAfFn1od%!((xhQwbP)zm3)YS;k|Avrgd3z5B<>dO5Ac$k z8T%GpW~Yzdo)XM2TfVKew|A+s+?DV1r2}I z@>nTDWlJr!VEh*1#MLFZ+S7!O{<{0+VvKN#(_TO)E8JQ9(wa)#?Lx_Mt7V)|cU*S* z=C9%;Zf!xIA2$ogUf6Rv+k82;ZjGKT%PwG#|sIH#bP3@{!Jj9P&WjGGt6o; zEi*4KtIK|Qe->@ov+IPEj5m|)XpOjsP)`#5io9}%*~pUj^k^i0xU-^n%0uO$YjvWz z6=yX+C4j(&dCy$2c>%q9I3)|z?&M+dCaa&a;fD$6s_+AH|Nh}Cp3iUg$^+O&f&qnx zRpq(`%pWnDVB=AvuuTPPqFfgt!Qq3irt8(|aY3PpNGom)yz(M9^zh zVv$Xk!Q^hw2hpIiYjEOMd`8Cz7nkhr%BIm!5CkI3`clqMHXXZNw7mQ!dst7@A8{d9 z($_6_>6BJ`HfSf!DEz*T>$HL%uniSln-2eJh28A{PM7h6eGBC(*xudZ!TiwxgYIOl zpOc@M#XmAe_^%ol;EQv$>Ru_(ThX*NcO9PN_aWoYxybF~XM5z_{h&zKl`_|BLoK!_ zfAb1u(Q%}2KwBwQ;!=!*oaKkc0dfTz_yGtBkOSYOu($|`8G@_x99MMPTRq9~Kg7{D zW))gQPmjNNpvbpv+pOVNzbVgRpvjwaB8^=WOjOQ^jz+q`cfS5w)6)H1ziiH%CEQ8m zHx9)k?GO#-L&*|u3^lmGt+L)DnI1jV?ormZ-C9jFp)@Ja^6k#L9qre|Snfp07Jdh_ zE3-OE#y4xaHl`g4vMf!njC(ZA*!j0HwKo62X2)nOG~c2fZt+_94B-N|z7t^!d$1?> zvJO|XTxAyvVv8oUjt=uwDC~`Hc3uHQoJey@0*@ zUTHt)@m{1!`MBb^*WX9G`dPO-X7{gb9phMSNhpC8o*i^9uZ*Z4u?XAgtF>6sqc1p) zDsfzh>G4)1y1Xou~l1(bu_vXE!7_nTB#>QKjP6vF-*!wVNJC%mFO}IwanD!H1_YN(TgaxqSLF1($Hw&nRB7hYd|W4kOve(1O1;)0Cpad5K1UA|8-~%Q#xLka*ZCCAlVUwx9l1FP1~%{wjT${vYqPd9RZ!}W8PzXEamoD zX2%Wp6j0ObQJaJL0nM5;Oy6dGf9ra!*F}5%l-7EfSv+DUw6LCH)0Q!4e-dK&-NS;l zs_WN}4&Jcus2yECU=ZxXAC~*B;X5Dc;BAU11(wS`w9K^Ma0X$aI`+29@=Qx2#;G^+L2J{q;N#UrpHcd*%E;h$n_)w8svs=0Dx z`lEXsy0m^VV=gyDi5Nd&y%s6`Z~+d7SU6?ea_u51Pa`u=$T?>_nZ=ixG6ImG=>5a{ zkQQCjbVivQVSI|qG;`7HA>n*q?Epi>7;$*S?I6JMOa;K1#jCM_8dX#Wk95$qT=&Fs z%6;lEc2+?;vu1;)it{an03SSie`rXy$@SawAWZsDZIz50VYK}^w08BID7|S?%e5NT zxp%U9+>pwBocGH&M*GJ33M)7Hr%!JWu3mx0NDJ!AJC39v^_>31@;xZSz~LP8#)S>t%0j z=;bj;eqs0Cr@E!8s3EH%7a=^oujuUW4E7I(jfhnL3c2vW#*W7|waNkOq5f^4JCEr+T=?E*~Gm zY)~1Viet0B59B#FJ}K-HsI;YG?9VL;?wnK-nGix2*(|;H)yUC)oBVQ?zYJ~ zxR%8!HY)s9TKJkI-cs_OW^o+jCYDch9!0Me%{lPhRK;va#G_g$>M{Jywj zv1m?noWKJ^N$9{Mu%f_$nUN$Pw19e1Ab+@|%#|yrNFrd+69p0ji(|nq#o{qhNiR2> z>@zb!*l3*XlqRiEJNEW8c47D>G!{9G{n1+g=G+s_1yDkg~vhs+$ay2CzG zuBCc9vUm-VPHwhtbpOZ{g+A)SKQScw5saNI?fkx9ney8GS`*eG(bop+GIHx+^P+!4Cy%>rtWmwdst}x9cZ5?srvCD>0quZw%kN?YH{t z=;6$WGEB=kT>*Jcyp@q;GUCUvR#S>F>7dNNa{Oge@A3_36&g(sVIJHvAZ<+qT&R0= z`r}elpnzY-L{j<%t-YVGgi&4tA79b0!`VHyy;DG)tsQI9q?S`MO$sZ{wT5*$$qBa8 zXlzwJu9~i&`(>^ZYV7M;MIh{s#xwg~Zxi*6$sf$C?gBf{upV$iHDRT-a}S%>U!+d? zoFHx$`vE73=x#d6-R_V!k5T|QiC@j~NyX;Uv1BmU0XWIFH$T33!{eb>S^72eNVH7( z{5LqN0zAYh;=5`HAS!>catGvzS2(^4ZLcUnPrLz8CfNIm^3{74Y*J2KLIt$hid;gu zR!8vwN|UbX8t|5dU=u+&72TNQW~(f4r_KQxR6tdQ3F@1U<-`}6w~ZHEZtq76MejIb zdjF6E7?sN)eZyYwdGOi8XHrQaq`Y`hma=y2TKn7`u-nroV>xd=dkac_#k4qTpBC}4 zjq$yxpF(W~X0m$};Qe`yTbiF$9t8d#Wk?n!J@O6lvZn z(Jvde=VmaCz_VtvoT8}TATu$!WgDUF((oN|Q^DW7>$wn;*w7BvBl&r4u}?^yK)|e$ zA-~6n;`iDEXyMVLX=><>uf1gdXMb1NapTdz0_LiV#=WE>i_QZl2X1hZf(y@t^DG60 z*zrs4+@a5QM&~qvfbz}eCu^3ofQgb=Ir`2h5ZLXcNj4Fe9BVm)?aW`c1x0ZmcF&c{ zhU?~v@!E#y0yK73kaX$mH!;_J9#)PAFB{oS(&|mZCLh@JI-q2Sm6nnhajrLeWLTfV z!{iKDq}}N~xa|~k>T=h;4*^IE*p!b1#SxKlT;6liI|lj2W?dq_2qvCX{GPB@Pl)h# z+KTx4vF>cRpq@^IZ_U;`*!hcUej|60RAt6VfxPbH4t%|)g1X*&bW{a zl8*+FTYx1;e)N~-iST%RK$so0uKvM1hKR`bCom7oT(5>KuI90G6Kj2ktWBl2BEd=I z_X<~l$dW7_SmkV=Ty#Y8Lrc=l3R&w&E|;oAU(SIQIuG z{5XFTHy%C@7Q+%~A7pePpu~TV^ic zK=G5uVc8V0c5JKbB<7k^fS?OY0?~Hw%46>#73kt4%E6}S#$AazN2Fw_mBVhPa;H?% z{HO_{p3-Wjy2D3pwR0w9U)C45{w83zor|tAQ9TMIXafk&Y;C<=>D#|M`w4SgZU|Vk z_*T=V(Ph7@0?+fqm2*Z1jdTjAhBxQIB1PuXe;K+~XZrFwB0tN02!inF-=AwsdTJ=^ zO}17n=f?{uoQ?S3Y0wp2pz3<1)ap70%egE2`Z=;ewK_?oSK@5sC%7P?=7SrsOs&PH zz&)9!nR6dUe%x!A?~k)xU?#HiTGd zmvL(up}GD_UG_M|`TJ@gGoq<|W87Qt@JLknXV6_2caw$dkI%_tw^$n0@EVeM5v=@o zvTh~cPz+KxlpNZtC_f6b7+(1FyOrW*1ggjULRbzyF zvUwsD8v8|>l&0Y`G5K2`-V1clh1u_jXQR?lz8+k8_y)DySL!Ye7nR&F*#*l=_N;=# zJ&mgKu zHDo$c;iirtyu9ceJb&Zwr3KKW<_H?yFx;UyZdHDG{i16rAdAZlDu`i-lN^m zMG}p(UY9Ql`G3olTQA&6FK@D{PP^{Y&h02aBUN3>^EkARjOaLW>0JMM%fNHSpX|u^ zhaVb12q0BRsM6|3i(y$y+w(vBoqW?8_kX`#PSv!?0x-Q|13{#%Huum!!R2nGq z=UbUdUtHUbentYOxxK0{57ulTIgZ=c89Sq<9eXFn{fs*MjElOedxJ^vw+*vC6`|`$ zP_-iO{0UsxnqMkvuhf%Q_v73*CU$QEK$Y$*n!ZCpJn-W8Zj66a0;HjjGAX*2Vg{;w z=hJQh8nCKC+zY9f5GT3(5;!s4sUk7c5jMJMgJ*V_S3>ZEBl`2LNmLc!f-q`m?cBfc za0uQtx2$8C0eMQ>%N1gO8&D3`f}ulYBjAQw96Fx)}2} ztL{E`V1bJ?r7hotFWPr#=m8`TxuS#v3=zq`*d-F>Q0NqVE5dd7Er><&y`1TAvjt zF9mtd4zE>!TX)+iQ+rQ+#Yzk%>tqnDu6AjIQH8D$e@LdGTP}ZL-Lfd9>PqA6#za?Q z@vn6K0@ZSzOpv+xxC*J`hQSEFedk<{Od4a;77CCe$>H<#Uhjis&k$c}E^%M5b;MCP z@8K;2L`}#xb-(A`MBlFyD0Hi+qiaYl^uaf(5%=I(;Nv3MM2E26u}dTX#2z{cP6s?L2h9_8~$Rm?98N9IAB zh!csqHvfbE93a52vM4gRIvIiImYGgNBK+vYFP7#YY#%@&1;<$q4JDZ$_Z5r*EvXLe za617W5BF&FHF>qzSsDPo&$=&$NONi6Jj7aGdIWyoY{yW$y}nH_n^yNbNi?LM3*~iX zkpu&XLB-`#gH&frjFgkJ)UnL7@1w7cR=s#RHDm(;fS?#{JKb#5)$mJMnx7n>n5$>~ z={0T0jBm6_uAZ^Dq_t1A;@#J@G<=EjZqv!r#HIh`dBU2=;POI$AHiNEsC4^alkSFL zZTsaGz?Y^DkN$DK`mrd8Ag5^9v1m)rizoMLEO}SUp=2WEu@7&Wg#9{WkbBaj>xJPH z>IoOErbAdSec%kA|DM#iBJaU3mO<(pkk7`65AG+Q_w?xU+FsWme#Hd;*!Y4%h(g`F z4n=xF)-})sh!bG+_>gveV!7UaBbB$|^W3LnP29tS$|S{sO=jqB@!`=NkcB^BR!&gk zR;yb8G<;AjoE=}xB2tbvs^9FK6{#m1~KUO7wAN41vS$gL66K1jGWEFp@B-+Cj)ZN}P z*C7?==jB_rCQ@Zm5UzONAq^L)q{kYIroPzq^a)ggJ`g>rw@3&30hEEa4Hrub%SWK( z?^;wmu-IpJsH zyJelZc_MsEP>nZ8ke5bh=2FA+Z!LF)uNNPN*}K)5q#%qjD-i@32F5qJ^MHxa=(gm3 z?W-Btt}XA$xnUOiBUePHV6g_fw~qT|J?f zaW+%VH~ZUzKv+S2)r6R$GSlsOMrtUDGvcjKboErm&qnN|w_q`xd)H}MHk2>&=U-qG z$heQQY7I~vx59gd{6(jP5bmkBwDvb1^A5zUR&8Af+Xa+j>Nn9OB8)$9|5Z zs_@wTPCDzzu|I2v)e{yDp1vCeYU=`Dyd05S%y>T7I5EvvtLu?aeYf+Mu}dOmWe9nA z88j4BJ_;CgIL*BUpwT@)y}&d72an1z#Pq6&%Yff&&&^t1&x%@Y-E=qm-Q7m;Ub1Yf zqf}Dvo=VKkyI(?+RbQ$aG|w@V4aTfIJ78{2qn#_t7ACsG7h`4-D9&q8LCMF#zs>}i z9xU3oOBkeHIHZVgwtpa}kblU#*}(;c!hZeiq+EiMm%m3aimHaxsn$x;wF$m=vM<~= zNTzMA*J-Sx(ML-Sp6iiwS7gH_FLto)wVv_-Wjq#nNfwbrOv2Olktvqcl%-MOP&2{a z9Y>QRv*tO&O3to;Zok~=S?jgUPfYt=eVl6pLHv3+fIet%dsLEDZADhj?Hk+L!?z*2 z1%_jwo>Ixd|Uc^OxD)|+P$UXHSj{^Ed(k%VLnp$XxA_G zDWv0BZkzXi0G@}8+|X4{Xe{;yyd+l#|KjZ{puS9*8dp?+87Dk``7(WFo29+Jhk#7M z%gGWVMJDBUN7^Qp zT#8V@MmCbx>dAmhZh64UGU^*&8W5NiK%u%ch*1&39RQfWM`_=Z((RXus^^)aNRdL4<2`Amn;i zi=(M)@zq~k^d9Y<=@nMHqMt_fopPsJ;E!Ia8Vihr%`_RykK4;wS^;Zs++gsuqp!N1pCLvit^ZG|;q`}SjqCj?dh=jq2@WFa&(YFRAPMBTo zyZ?eHrEX!jXz==rMWYCrl-J%vQ9>`CC(M338TpF49ZyfTn9a5kA7^SvmR4V>1yvAe z+@?U%s(cplYj zYT>2y@RXHg!}Ft#B?~w!mu8wZDB$zKy8N^xE$FNF%-J4rdKlXr^oV&`*fo8hmZ;1< ztZ_k8=j_ks;+E&+o~znp@WY-2S>v=VcE=Jt^5+N4OP38txY}c8QG)D+p7k!Rz3<>8 z_CgD88*l~Q?hdlc6lM>&q~6-=z99R(?vX4)b02eofPFJJ{~jT%aYaAaQ8G}kq~U09 z5x?NHQ7#+ONmY>z{mJ| zcqHEk+j4mZvw0pSJaMGh}akRyCOw(fMb1fPaMQC|9&t{T0l9s4!wnyu~m`_5unmhH)&%aGy>^C|~})N4icc!lT^p0vxp9>($) z_X=w2-fLF&$_AX7!-x-IAg z_WwizKf}KVBj9&cn!~Q@mP<^XH&@Qr2~2I%3aq?x?9WQQWSAM!t-6U=Pg}BvX_6&z z$kzM|U38*pc?bKC0A2-F!W;og6 zXE(8V9-T)i$ziFnzfX+;eggYC>+&$*E+|W^paQZByyKmyatd!N>{lwk2VjjA<(+?h z`MS>YMt7BmJ~v~_x0zz!{WqCi;xIJaVP;c`CFUT=QUn@jlb3f;i*4tq*w zg+U-zdA1>tsn;20?S_(Vngh*Gx>rB`$E=wM_)6HR@v#x+`>unRe@Np0_i_NyQrS^n;cNpJ>st+M0-nT3tx;!%#jb z(PWI~7Y9=4iq2u&IR*PjDXRAuESHFX9Jb>N@bEK?yE5_ft<~1!1A^@jE@)H{&jOq< zFW{WjM+F`{2hHsg*TOy#+w#{K1&3S9CCok90!!dF^M)|(AZpCRlnddppe5uJVN3Jz zDVK1BoFE|NGopJA=8f)prdz>d`e5we+2)hUBDdSP^c)!IW*KTB?go|GrXWEiW`mNI zqzBTL*L~b5WYxQ?yHtU`p~VjcWO}=WQCHPpz~$ZfP5QV*C?}_tQ~;eRPbDFlrAk(3 zRoKLmbRtauPK~*nN6pIlQ%DNeG$Hp4jv?3^SAh?q1 zW&M~KhxH|kE|GXu7t|5ZiDQGyQ#cGL6ZSR_YBB!D1|Ky2q~HZIY(yBP$#)dB6>o@5Et#gy`)DR$or(UOoAVRZ*p1I-Ps!hT-`7y9saN4~)_*yj}} zJ+2{8Oqh4Iu#uNC_T;**PIBk~8Q>f#Gj+f!w}l5%W}T3n}HK6a<*B`a|sQXk&li=D6cMkvvum|TZ|q!*iado{DT!>W1*ne z<^y^;6jc9sjOMS!-e9l#w>{ZN@4zL+w9*Rw2iFyF2hNt6t`iI!iY|^VietF)dGT1bsSkW7lvqwQIQ`42*uK<}_)W#HMHwKA+;W~Z9LsQuwS-e3MO zf_RC1SSL_A3oM!O*9|Bx&|R9VGVV^3$JeP$gy7^^>#%+t)sc7Lp%V6?WVEIKXM?V; zNs&7?v3FR)zk+7t#03SSyO+!JS5F; z^gP{Pt&p`Fjy0{vX$I8Qr4D@AUjUMm@J^*Ya{_4Bpx$Y6E#G}82*gp-|7#I$Q zGHPx$D5!jKlvX))pF7%NjHZ`AbkLCr9KuvpgVB0?o=GausN|FrDvbTR^tb;mZS2LU zFxNF4+$PI7vmUh6dKWsdL@J=)Lt8rPZQ9w7zHKl!oYEMx#aj*|%ptb2otzV`Yu`Jz zTB|vS7GRGa=)j5G{H1=j%A*D^-Nas}GdMR()05Kk{jKlRcTMTB{smuURs~=AM*H_a z+j{jn_V5t^)%;FP9o8sCPF@FMo?*E-Fhk-`8BslbU~w>IL(IfgkWcozn#-|o|z zp#ccOjp}?o1}2ASuNq7VtWS)|-$kr_`P4|{FgDz)*9tuF16YH8(%pE+ zc7gr>!|5*#AS&S57FiD_iAe$K!uWv>4eudfqv#SYgO|v)?fvN&qzg*}ck804K&E$V2w;ch=?&5&ZPP$wrPk*ugz_AZPcGL)(0x__ z#;v{GD)?DWhIhqw@_+wPS19OgS6hdqwABlc1Yp%8K&IckTV&p$do_{6e%r>*WgHeIqb%kpAw_L(p5q1q(+f^?Btkml9_j%+5BOuOM$F#|<-qNxr zGSpCHlnOy*VP!hA-%tIxWA6n+w#@0163Dw_`s(Q|YpAFV6$-NhZwl}#&DrkP1b+RC zP%0=vZpGG!PaI^k_IARs1I+AQ;!bs|_WKm#Nh>i)Zbuw!TpFv9AtU2qXW?P`;>33Q1Gi zFU#}ntNnSz628G-xSFjH4W`5hhXtmVbaiYrsZ|L!K8Z4awr$A!c-#}jeJ>)YCyez=8{G9B74%?E4PW9;XJ*= zJ>uAV0sY7YVo@KuuR8Y5kK6rxRR2~h0c9_z7_ zVBlgU1~T(o?OZxnuc9`{4>hbvkZl!7Dn3U4_;sW40(~kKB>5!{C|>hRtZN8Xk7ddm zCT~>o%-8Fq-}|c6i|2^FOMSlpe$l237oXIs@h;$RJGk`-FVwT zUPY<}RYyi%%prsaAZ(xN<*5|c`Ri@o572r~YpUsTzz;s0E$xm2@+fCmAW&iYzC_18 z6c8;{r!gO!q%K&KcGu)9*AgdyL9Tl}71WQA{mZYqVK(^icQrRfcMGUG44VrBC^FF@ zkAOd|C%#mlWBltnTCG(N&l6y7}= z(NGp({TsVyE_;e#{~mqM86E-{Z*aj&PxvU#B7fYQe%Ko{omK$Oza`9GaH*d#x}d^o zvFpJeF3;Dz((Am_F)5~MNENmZ33Bv}onkhGg(J2%t5|IyR6_B2Emeb&n$5aIP{{1s zSOSs9V=18P)OF1(`r2M~f0ZnsLo9!A8ThP=Zxk^Q=!vC;Cm+WBYP5#cJy@zopZgpD z_c16*Z=H9sc=R=;x}so}CN~YnxK*xoZAE!18Q1xN-d39gu6r|qIyau|-=6no2!A1pb(Rmhjt*FoyasO?ls z6TagROU|2_!m_jwSg*GYzJZ`Od{*CuA9{c8GU#{9)e~v@X-z)qk_jGE{w9)9Qr$;>e8dr|kyb`V{IHr^`b)_HpG zUQQg@W~atMjNszH*VrS+mD$(M066Cm(eU5w_lr?XT^T?n&-Vigyb%Hg!ZE~|ahFge z@)|R?c((-?wh!d{weYSH#c|YG*|tRszT=+3gVJU5lWQ9H+-8!p<@W=cW>B}jH{k8k zcJ|Yn!Vp{*c0uD$1zi=I3d{w_;LYX7p^kvp=ogu-kzevXKMthE_h{V8cPN?NaSH40 z$7X519d#AZV4mz#f$B7of>~RBQl;6#W1*z*jf4VW-QhxYy2>j$LD&Td(T$DAp<>3P z7s3}V>zcYR1S<~(+2ZZhscx(<8*cV{XC-x1HYz`Mk=lg4m=zTj;rlUoWAX2#!=AQi z%Qdi%iN$MBbgXyQDGzo7n|{Sxunki=UPb!TrRwEa3&s9}hCYh-qj>-X=xQdT{Q3;; zbE5(WKB7(8+skap`1v8in&5>>9KX1ooLiIlxFTGdi?p+ZfAn?3Ax3DeU8R7D-`^lm1ha5^!lh8Ub;(r~x&X#do4p0Un%*i+ zx0wirnLIIvm_n?Uziz7IeaX!LgnlY`s-V1HOr*Po&U*6XA{4tl^YwhT(xiJtkqq!v z3^rMVoE$*k>vJAmXJ=uz>OquKeH1sU?(JoNHK5WU!lDuet5=w(06Fk#jj8=M1TNSM z&j-iXn?LbJQG#rr0-kzBpy^&ITFkmEvDg1V<3~{aj~p;CWqi?8U?H zb%jJ>XRWT4Tt(X9`e$L-!uW6^sC6vTZ+AAF{o|?N;kXf7Cc7g!Q|P4TgSBwDH4Salj=gfESg)`!UqqKVV{_XJD^F5(VA`Y`AkMOCxm{jbyvw;h9RyC+Z zFNK(=beq^gtTXO32W|?hD{)1-sM8D#D?OAwD*Jx-1lpx9)?nJuGL_Qd9~&^#FwGx8 zzn0`hxEjzUvHsxvmO4Efnsg>&ZtIE3&f(m8&-u$XGR?IGcX*Zmujbw}D5@rE7exgF z5=2qSNRXU!MkS+wgaOH6$Wa)AWJN*30FosuS)$|&Dhf)NA*Ugy0frzs3)_EBrXZqWKbZ7t zCGb6LOpkge5Ct5(4vikfswlDDxD3uO`doS%z&Q)3J;t4;573!WljKrrzINk=Ye9!C zcku&euq~TNUg~|nR!tBYOItAa0|K7PKsbPCnQ8ZO4hLC5D&5hQJBg$wbIXpXg zX8p+z&HPD#AG#e9!7X8}6uQpw0^<&(LrO8AobR16>>~#6s({beaYcyLoY4+>a7%xz zUJ4@999%g^p6yHVM$Pvg%!}>&BQwfGd}gJ)DnV5)oHkNubN_sGb;)TvW;4&OWvhBe za&jM*c~tdDOk(bxFH%J{UMp=!Tf>{2OnM345!GekG+9O-TdwIN6i9^;9ytRgDx}2D zT0r1uGviugRlxD^YB|8U(ww1ur)UpP)7%sJm#%z7UnvV5nx=qG?R&WZpqMWJij8lM zp@h&)sC5BEZaiH1s-`G$>OuTd9fjDuP3-S0aaDSWLnkybuzTPwuqVJ}Z}SdJo$DNfz5`y6P^W;df%^N;8S+WkTZZ^*Hg9l{2KgVN$ubpJ{3=i7< z>WVW1bgjN1taL@wg%Ao4b(N90&e*t440Q}x05U64g5BFAO)K1>Vix!H=Ht!vzx{ZF z3}n6USf%WXK@E8MZaVJJF>Xt{`06L~&l~m!VLU+24mNR4y)m%R=YbYXZ^C#&^xFyU z8g;WvR~$_6U3DC(WndB;FhCI(J6?0I9mq}I&JsV6$0n&3orioq6^>yB7GFVvCXAW| z`s6AP{xod3uZSjJxt|VN?7T`~^95Br?qMY2i;5&DLmy^#7IK6OsPqe|4aH_xf`=T# z7uS}PsdaQh?6V1$z{%oOamK5I<&x|JFDdLGVM;@r4C%)H(VKviRyy`n-BiyfZSj+2G{%*N7#gR_%p zSDMx>NZ_ryjgu+mTw%&=#anKV811XaQIgc_wi`{C=F%KWA{aFWcH#Ll0Q&Q=Khrcw zrjK?U4IhZbB}i7fcW)fyPRC4J8UR>vS9S`lwwOp8qi;;8lcLPukOO zwrO?p^gN7wnQTA%^(8DLkDW~I$D^yx`E^{-1~%bk4q?9 zz6Q32*h;9u`MpiV5Z&$ix02k%^@dJ0bQ2Ub@2kY-G-t7OR>VG5PeUaajXxPZz3ix? zA+yt}SEC%`54TNGbcjPMBofDgw09Lp5dmgUt91WVKDunJyPC!FnC5D)N5 z?*Ix%43J)DfdOnPzBU0zC@cM852iPKlFu~Fgh8LILG+A=R@_UQmXb7UeKXrOCFv?N zGv|3&kE{iY>W4gVfk{Tgn7yf^sRPn0ZK*B|`s^iD2B%HMe_te?VREr=bBq0;dkPiQ z2iJlT)4FQ$q}#;EYP-}DUQRn6sRc1+Rf*m8u`3hpuDCt<8qN=a*pM=mPgG+C zmZK6F0(4^#pK}gJ5G5b5h#$URt!lAUjMsu&}I znP}O6kSR@c9pFF>-0j98z~_RxO~=$3+lZ?~I^xh-OeVIWw5(;dvx$qhWe#9GkTRP= z6TRT!b^#i0gxA|#l8995_XEa;qovd<`unG(XI^C^vRD*a z$EteA>zU-t@j`wEzwqr=+@1@e;p~DfC$yNOs1kX!Z>+Mt+Uk$t>q@NubVPCs03s>o z%|(AppRH*4JmPeu-T4BQnwH%^JxFh=F~B&9PU?*84Np%Q-T4tL+hQh0ld(4hE2;qg zl_F&*y4hK8s77V_0RJv_8X7p_p&_;P{>y=e)Y3B~j8y7Hg!{t7D>Te+mJud9mg=aw z)k4!mi2t5TX;;L_#HPtJ^2L(ciNfl_Li?ufF1q8ASItZNjaFSB(;|L&&OTfsmi&nf zX?yZKhS?4>1b`KSmpVM0G-LZiLf0%yraqYJL1LNPxE{v}bya*d`%q=D*Z;BoeS>o- zkcwcJkIiW@Wl_-Jvch|g=d~Q7Nhogj6Tt0f9^l_5T(u?ACI6O&^FQDe0ORSy-d#33`j zl!)rMHu^@K;iaEVG2U(a#x#y!U^&d~Ycv_j-}psL-na=}e{3hvzCrM*+9WPraO}If zwpRGo)>Qi4_t1P_YlS277M$^b<#+pwdVdIfyYeG=+BEr=Bs2DeOJk z+c9RHoj6%|GnYQPUX?v;Z8NE-wWenLfrFf7yp{;cWN*0O+#yJ|uk(dZHo{#Mzl%Yy zCzkfuQ`=+VzZHe&iPeWW1}6U|N>ZiHShD(h2Jhe@c}TLx;$GQIJ{u_v>FOT56di5u zXEqOgUuRdk6*H<)RTT9;Y^-fZDR_i=M)FipuAkPy4lNCPFA4$T=2nvXe)S|B z(U=%=%2>}spqEG2QdIV^$Ax-d*6H&!wng{>+p|j))4GW;8~yxZa}UwFbXf|l{?1)| zQ!;{0C0^_v4@At3v=B>FY{i(C#=+?A6_fDe&CPFFSDMIm`E4 zl2~IOxp5BjOG_x`>d~#@LzhY|<)X8Z#Rg7^N5}W?&gUFC@Hura%ILZ#*zQXe<(jtk zADB+&pX;J=eL3(?snoriIuYQF4IB?JQW7YX?ZpLTkEqOJ$7Y+e2gp=4uYi?FCI3OpMddA^Z9im9o& zK7A2z=%&(O0Mw2K_TkMpi^Uk9x0v9bKzfE3wTpH@4ZzKJa!}9I-$VZnVE=dSH)dI%ASP!s<1b3muaqcBpCtE0G8d)^iXB}s?&jf#BHC!&DdFG2M;FONL!QQ z1?=l1`|siw^1WlgqM85#VLH1EVv@xv3<3I4sH@a|4zoo~+^DqzoF7UAo!GD|Z`}BN zUU>AM_5xBww2fmS@v;1ba+$76-aM3@EN)`c2U194K*pA0CxB+Ja|Ycz7o!+|){=I5 z4J*@ve$4*nhSt@dNQ`RxPuCnRx7YAbWpfm4)cCLBE1Xxa^PIHwj8H_JaBs+5Y)6nx*kv*4ER{(Och*34JKV;5m#4(9l5qhvnN$< zvb0O40<> z@QNrVS&az+5WONsk+LM7KSb~j{^_B#qt~MwFJ5gfDnLd&G~?9xwY6c!WvTE)k>u%Do=45L+&h$_b9720DfAtrVpPSNEoNWlm6 z8MRDr0H>IGAxKT^Dp=w%5Ogf8R1(Z?Wr^XOdnH_3) zxi4+S{i`RqgRrn=?aWiRM0D+BKq>$%GUYP2Uz`q{SjlJ4ZQUx_sp5yV+jb-sOgg_c z@4Y6?u$%^K1*$8#NycMBJx@gZ7R5Sr?R_`uPIju3aX=F;SgRB0cibxRAP0hW-lJO` z*BJWE^+$R%cw4!UUDpGj_w_UFayF=%itnV#FEo?_*p~EfTZTpN=~g~u#A9Bpm9Z!s zaCKg75$FTitg2m%RQESf$S=t=DtTw}Qi zrdrX*c)Fwnhmusqaq6NWp+ca( zZVI*YDYk5qCExokjs}R#x8k{zG2{COQD?FId4SyqL)72M?l!zC`ObwX!OBisnz|{h zfK9c%4pmH$ufLbowD&+`ur2dH`G_0`y=Xh=TIa>!TYOh3 zpjw2`T}!WH1Ec#q_(@uX>|GUA>9+*gWx8xiWBDyR3iOUov%9Abj7Qe*OQWFXU0jZl z$Km#;7r=yJxt=|08Ja?0Wqmq+Bc?xv)5$tdYM`mykosQ7nLXUq7=1v$7kck1-QgD? zp9%<@>e`}Kx~l9N5_>tG69H4O4E^}UE3&(NS!_wAI3N>py37lm0Cv!0^N9}xGWK9D zB;)Q2IKPv-ev%bLJ!7WE$?MI-5AoJ;5(%?2F3!?vPwnizCLVV{VuB3tDLxAKokmXq z#^x`pRvlFo;x|FZ9xxkLc1po2?28TCyV~>s$$XeE%h|OZ*m?qK9|amXK-;K|-YrNA z*t*FStD~|2|2DDB>ExoE$XPh8`dqXxnn0$QC03893@nwQg$_zDJOnf3hf8&28$^TTBQwYugH&1t&JsYon`*Gv@Eu~ zIJ-y$3?ST}m6^3REsicpU3l|w=E?=8{`Pn)eLWBTc&*MnXNoOPPRq16YQOdBAOJ51 z@lXE&{A1j1*X7cx&1M3LhNMfP1#{VtLOv)G~Yr3dDmC;sT+*7j?m#ZoT`6 zkl_tq`_-=9H_1+nrxu8EpC+~#3 z8g7r-W?+?JLq=@+pLImqJ60cM)8RgUImjhf%Wmq`&bjNy%x^8!fdkgy5yfTXXU zaM9)BwCut=Ux_H+X)G;-e33WMy9CE&Fx$Q9t@p`1t??D+@`mNvcgrLd{e(wuav_2n zmz^trLJSsgw?WElCB)neKAR>xXHLpnw0g3cW|{yo*3tSIr!GC_0h}9pML`oJ(aucB ze~_RjE`iXhw=`J^A?`)Pj&B2k*V6gXv$<|Wt%ab2ixYA^F}W8tzI5-m(+BSGZ;64Z z@{>GGVE%!su3*TwUYC^i9jOl2_FvNiR^ICJRuD2Kb^`u+tPGTk=ygNs`qL`^rDwB8 z+hcoIIz3gRuMboW2Swy*rg4I#+t`t6qjX}Osu2HEfj~CPZI`9U0xk@W)mO~=n6I<2 zc+0U)LCrcC{5n}zW+ER)p<4zH_&*drivbgZeXydTdiJA z@!M6}>OeU}JM;LF$-;c|(x6@0F~>EArLuvRxeGD(r!sfcmxDiciI-uHQ8s~+T|1^G-cAF9a0+yj z*YKG6%-K=I*-sbWgA@wwjyEn~Mt(4sVQG1gzQ3mTd8^3L$~Oa;9lPwvzOEh?@dJO^ zs}}+AIGl@jJL_{o|GW<;6khVBu+S$>V!UMZ{llYuAfU<=N!uTboGX-fv7b{aBZFkZHs)9ThC91|5OU0vo_C zR@+9*x$br0+(uM>agxkMpEfffo*9dx)6SZkic4F39I{h1AEbubdrf*It@};Q7P5<= ze77P_M?DrJMNdU|!z)`n)gcLL+3oyo2qRE(Y_*05xQ+3OL(`q#@+Y#e-(3rBBPDtL zrBtM1eb}(FsrPXn)=}rnkdPW|>%QKNa)3&{iS)`mg|i;FoE^%(@Pj}`S`MZk8x~Z@ z?f~BBPTA6NcC@Ul8oS^{a`ssCd28Rn^W3fMT>nGSEC?ZcS-Bx!!vhs+1>R_8Zt$_ow-;6bX56 z0KaFm*b)~gc+|PrdS+?*?W8g_t^V`qf*ioSy-W`q6Ui0AHMvpEOGFtncoauOHbQQgaFwLr=2BI?GV(q9^89eVvn%)MTbz)22`NkDJ(#$Kzwbp$+x4 zv(E<=1(CkJgw@yTd@Hl?F$0a;h-&Pt;OHvkxSMX;(tCLdPT`86EJp=+IZ)t}N^So% z;Pb`fls1JDm22u_6S)n;vn=6N05B}9=-&JAN`0xXjhl^T{P>#L7vCd273#|M8q~Kh zqU~4NNhMFdaB;3lxXUx+%dUOqHebHZt~21+xF>>={YrVgEpgLV(k~GDWE`|#&GOAV z!;Sj;T{{lWb$t|02RA1x&H~JrVFk}#m6 zL&?a-=68)oJSMZ)x+;t$W-AG1_mRnwifghI?CU~y=6a8(k9Mke`hZ@+Xl~o+pzc-k zqTZzP%|o}cn*bLz0CZki6?E?aikP%I5=mhe)kEH(Z zHnFAi@7J@dx=U+%D2#XGx`OVB%|7g)5Kzzu5?%wuqITKMy|*4s>||Ww%teYHU_Fnz ze|Qe=`=4o;9!fRV+dxD`og2#w3xPQE^m;Ns)ZmjtX|uk=(B?sy?X>^Ft+d)pZv{6( zO5?W!NX5qYCYVU13rbT-Pe<}AxiTTf!i{l8S6vUKYwMz5ySQlUH0NfVXNd=|T3Err zx=$%~SzG;%*2&T_rjk)l@m8NI(ko37hS-l}${nQ4&(ul;W?RHxc(QfB5phAaiEqAI0~oOqt_rcwvwbpS&JQT8=Nfa{)11s894 z)+da5{=D~8_>?Rw;8gMKyq+N=mF}}O2ACH}a}{gu2~H_}RZQLGJzBv7OIvFtScy81 z42Pd-#(Sb&8m)zGibaeF8O{d=4Wc_D$TOp=q=dP^)~cX~R$# z|LwpZ05NSUW{gx<8vKTdRg<@<=7V21PM(q}^ghJICC zSK;WQ{1UUL+CUm?3asUK3?5RvKzbtvzw5sS=C@gSII;zHjI1le~+hHrgnb)M_vP5ll>%OH$VLuNw0=~_& z_>_l*ib1U)35)vriTQS&^)GtMm4aUZ!Za;w@Um6z@Npu_g}rP0HGlvV0%gF-%_`$) zrx^KR3K+_L)w}doLkoHmV{&lkk^9A@(97OK1xu`YCrv+hTr#oEg~c6@qsn&uoJ6a& zj+JEVyPf^!8a663j+q(0-z&r99U+2ce{RpATMyNYM+|srW_3LhDon~uM|wtDy+NRE z$wq`@O>>n%Hzh$-g%=Exg1e-4$np`33`1#I-4Z`IlF zFBj7m_f&kN&>j(H$`)d^@T9G3aP|~SaVUz3$m$im^m7MFVbkrbDO}!;wp|zOacr&v zt4*#VE@V-K0U|)xbFik61K~X&)J~DB$TaLRumFHs-um5<(nXS{jhp%dLgN&T_CCfV z5MvwtjL0R8qFknl)lx0UQ2Qvi%qM3mhBal+I4cE{1uOk1JwL-qEV6~llNVM|R5B*8 z=ca_C$7{SRx&0H%y{}sh67U6gxGpzIyO#*hL#dur-6*YQVu*3n^# zXe+sSw>z5jnVa3mw%Paf6gTtsEK&`4cKp@@rpjI%J*MdZ3-SPM@*m!4<7cAPH{7g| zn$TJ&V|D3~)zbd%8n$mdUs`ZLqDR)t&r@>i6js{4A8hJ4OScsEb%T3(tYYyg;;u35 zMzZJ{W%7ZTBX`|mE_YXo;9L7sPV`AnccG;Y#QLiqkMxvyT$o4~QLUi#=w4cS{$0tk zT(l=rcAA#%s1P|~jgsFBFGV7Z?)#=dAjoT3JF;G^Q-NQL$}6S`@IInw%)-{3#A}zf zoV0wPr+LVUC)IsDN~W1xi1HlWbH3Ym1%B#cn_+@@f<@51LNH<+-T^z@Nz$kFc9y-S1OQu z1!3|3vTwxy=kbj@b{9q`MvKpcqZtewSH2MhdM=iU7KwecIvHGkduQyXyA3j>WFB(? zWM|E;#Isb+c*em;Uko_3Ja{iCuZo=hl^Pnl6WlhpyeHyJ$;gNZrQj~ttY+xvJY#1B z#Rp|hM#itT^e9AHwKSd;3&Lk^ZzsvYaOLj>_3ga6Slbn6olZCUM1BqtQwkEkO(f3z z_!#a)IwaCdC1)ikgxwQ)9wJj7_S8OJf5Lc7Fu+4W0@r|`ifk8F_d8_6@?;{d^ z#ZqQQj>0~h^#%RM>hcTX->n~QE@0NT-lxBiKJSXPdyb+h;}@FGkl|uEZ>QhVsHBl) zYpRYT3mlh&I6q|$U|SyQtEeDH1jAeg*};ih$>hPiKLG;(AjRaSTf_U|Q^(#^3-S9( zWj63Swnv#$yY8zY;EZ2!gV#RUFAv=9-F-K;XC+(qYqruSmNL7}@C^^HmGvoWPFysj zhE~3Uhg@d!^IdIyg`l4GK;4v!Z!-ej$f}nUG+3OLhcZ7{KA1jAHf0w`G2oPSkYg67 zt#awxTcJOD-*92_;K9u_AHlLstKCFiE!}szE&4})d(bM`i}gdDf{_*^>a_p8<`PwP zs9?C^!c|pYRA3>s7V8JL9OnmG@5r;6E2wXfDKNMyHlOa35=z@2k=K5reusX?`4bij z3pbRP=gtHm`tHv9_0}3G`=i0_UkMA!ZupdPX}s@*qQzrrR3_hL-BGJn!So?F*7Pg; zj%xe}oBOs zQ1XV|cAH+E)QqjCS|L;W1RR{<7q@ATyI4n0cNi)AThmr-hS(gH(iursd|f{F=AL1R z7jNU*(4PwJ-fL&CB-#~{L+l3+WX4w3l_fSlGdlM@rh7~a9(U{=f2B{pp3g8YO{#49 z^6r?PR#!f~k(!m-*^YF7iUA1$UGqs;_JzZh3(ZG@@d*p13wv!r_)0jc^T$+;bxC!% zSF=;pSNX1dm5|n+oLw$N@kl6JKiNw($6Uoj4t%8`uTwwB)*sX`yFVgGWmT@J-2SeA zu&bcpCmW$ue+YhdU3D|O3-mV$+w)&up9G1Cl08W+$gQ@Zm#NmZh?)_Pkb!a%vwMv4Us%&x|5C^5V@mS4lF$90<65x5X2C z{);%gPJvhQ^|-b5_-!&9_uiHTiQTfy>=g#wblFJ-1LO96|0Q3A!7M%5;D%XSt})k$ zFZryeblxO5%m_PeKbm(pB84JmQ>&L_?oRWv4hP5aTV%|ze43w%OTe9Ax^#bW;_E&= z9k}9q()`l!o;QjjHo6qN-(F6gTOmbtxR@q1 zl)sR=@b)zs4qnsAzf&z?ep+N%K;0`M+*vt)GILzU7{<95p}C<9r&614O=)0gp3&)4 zJ)Yu?c=%9$aDPQS|LII$z1~ya{00X0<%b73b;9A#?wY8rnCZAG$}0|dCuvROogIi- zq^V0)D8F?dBVNF|Z~Oo9TFz`$Rvj2~;gU)s8BePESmc~#qF#1}zehOk`F7gYLLRO; z^t9unMr+W;=oa^DR=52Rk`^Qe*L z%FW3ml0h{5DG?B19TC)Y2g0LfAe}OXQ<0wau)xB|Z4RD8bANICDT-B&yf)Oe!H#8# zKkG~Gmu&S18FI~OAq0?~sMm9dql5cYULfjSA34qM>GBr zb!r;oF*FZdu#ETR3RC-31tgFD_G99&UjsEyBYL>d;vC3~qY(qm62)spoGOHKaD1k( zVS@JLL-trKTyREQyJqPm(mywi;#$qnI1cp7UdV!^5LYPW>e^#?q?=Fb&vtJ6EAe_d z@j5y>!{mpk5sm82ZVK*acWO>5^Tvu=Rrm`XYx`=GA}`n5ahs5yFJh|>FVo}@P5QCk z7RC)Jv2iL9SiGfs;FM`{`a;4syk)C4-g)Wv-%eBX(6ms-^6`u2=@)@QPUYM`tku z)`=MT5d8c)1=onx5UMP9Wh*(SBtJ!7JlOUA# z>7tJ%-#ymQOzErT*((YWV?ut+G&20o(2T3s;XM8|Z1GGhG0xJGh(D|5v6_OH8eH0o z#=bFoPwTQA6}h`%w81G`IH>@YwY*^ZRLF8(dbc8G`88oN0}G;dN_oz6;MXz{RR=ytf2m$esfJ?<=6=9;3N;;(nx;e{cg z1)A~J%oM?N>|i<-QbtChZY-*9FBB(?J5E*;XYD6=M%AT1yMH(_sc`gN{R0q&c61;o zz8)LHgkdOE7NY@-;B?)9wSHc_`zYzwN0O}h`vV~ETgj*2 z@i0Wi>3m(TYh!Z{BZCn8pLO=7@l#s}_Z^hwe7XZ6c2)171?{?PBwR@6bwAzRRQ0lZ z&!!@OKiO_5R%?PqNo%NABk-}EVmth}nO3EPPG#WIajR*Z!1pj3^^U2yxjWa?4F>jV zwNm;tT<*0mw_JH=mczO|sS75?6pocy4A)UVh+MfY`=Kc-i;5QMhVa=H5afI-gQ+HO zaPJe&rtz_b*{aWT587Hw{w`<^`V-UOmAGddh;>!b{)GQb7~EF;h}dv3E=u-RvnDq+ zR#A)&qCwyCE=;ZtNKWsbyr%51oxX19jGFva7}Dv3Rkcyo*1SblEme4%fFy>J0PFl9 z{bdzH$tU{)d)ueCm{RBvA~73k@eH2GDgN6TI38gQ#%ZRKPe}s=dXae| zKN#5MK5A_GGwfYI-aQH?4$qK7V*OX~$q(c2?&6BrD4%K`PV|lhXg#T3F3WgOotMM5 z9nP3}G0EhBC^ij&rBowj=RIiv#c2NH-Ghh%1>OLFk@@lYr)t9%&o*=O(l7Elp~?IJ z#gU2C1A*8yqQ3N%i2^PwvT8-#?8xMkU+*@QPx=}P9SLl3I1t@v)@r+7l-O}8pnk{1 z&bbonz{b1siWoDV@6>l>%@7jk=X zA}EfN&Hh%>ZeNlM{bjl(9fyY1JFDp3VWhTfw)+fjI>W7;gTnl{q zbP^uk*O@Z4cUyM1K<|#GGBS|d8&Ocawra@Mvphskyn{BQlKe(N^cO0NTaH+vRMd$U_ zpJBF`JJ}XQqyFn1jrjQYfspdTkE)Sw6PC)a{dCQfCewYM-hd7kXyQXsLhch2rqDfY zrHG`gOxCo?(mXXD&Jn&XoIreE4p{l_q80?FKuGKbO2P3UIFYbVJaIlHaThJRNaS@= zP^a~v&FB6~x;xpp8ohb5QpS-o`uk8QncRQBvCh5xBVF)umLI zUIVh(k9S3&OY4oF==qgro&_)5p6U`>$VV|Nem~qVHOp2)MUFm`VWr-uv5er%J+HkHkqb%&09GvE4nNFNJN^3`>y`(7$l2vyPixs8IbL@*( z&ri}eBU+whLA~~(x4(C)cgoDg)~=ELg`f!b;)hFSE>_l)U*HcPU#b#)@E9fdx)yU2 zoq=&f(2mT*efy!dM7~fAPpTHRv0mnHBLQFz2?vDREzI2E6^^9m51|d$%hnj4YlvaS;|G}d^Pao zsn6)3#DtLXXNAJ~agAC~p-=x_T<)?95M1X+h|vpM$yow{RD;yMr>_(ZM^n2bs#p-e z-Y5G~Let_{pts1Oz5RIW#J&9@TEDHki6!8$)_xjB%?e9<5Ybl|gi)J#8PYVUU zAJyuwj^FEO&9zXjbCTeT+6nV9~bR*TEeZMD4^-Meb%f(F1U$z0?U6l*86P@7i?GZSFxS`yZ~KY zW>0Xn;N0+*KYxd#ScCD6Yg6!YgbW!Oacs+&jMYW6nEb&;t#)t8jT@S0`))_Xm;ZZa z(VZHH9$P4151Hp^r*QHXBjitWQk!$vqh{8PA8zc(!<^|e2iI$;~L5Vs8Ln zjm9>(2w$*W!u3f=IBkh;@Sg@8R98)=ct_vC5gKMHLlk$L)jw%RDS zXGqT!B@_;W>;Lwc<{q}Z+<`0u)Ckj%veIqL-L{df&taN7cSrTf$Y>bz88qf zOgj7whQcC_-w4F^$u?)ekPxwA*q?cV_tm#;HVp>$tlINO+O~z}#P5^c{`VUunM|Jy zKrj|jbZ{b~WbD{WQ=I=wem>uc`H;TZHEtF#pLc7|$V!R+x#fRZPxJ27{U!bA>!-QZ zGp0O;Ov_#u&rQlD{7qvI_FPMOc%?W&auieg*zNZJ;YGk|S4Y|27d5Wvl7K}iMwOk#bVZEBhKuN;)sm1ayVZR$J=^JjPFBN+ zO~+LIv$^F%3R|nCDh+HPA;X&34YXs|1?%<_~$L94*R}3ttgh+osH&Kd_~{8riAb;qJ4Av*km{D%K`jjVJQ+j6|9hP zwi{kFv^L(A#r5;4J_OJp@gMkJ0;cG<$zui08+~adj^fZqKgG3~0oZ31?Aqhwd5bsV zTY&j<{tM>@6%3TS(z!P^wMTZmdQu1MDWUSkU|*<=q3^*nmRFIv|8{1hEBn{`$Dwx& z7+GCKpy{4-un99BTo%J(eue~b{YV-DGUHRgNkZ+8VUHT%vz z+PNL`1$L~kC^po))B&h*5w;3GV?la=Js0)KDE}I;BXH54rfO?A8M@o--BsO}z#CI$ z_iP)G{O2yTe~aW5bF_PluEl<=;3B4y;L7(GTnZ-RUtRRi-iyk7`rqBC1ziL}s#rq$ z7@oNbvMN@c>_`4ptr%EyXj#d(+h zJ5zKAte*L;k>)4g3HkE<4M9ac`%g1_`#lYRvp^_&!p*;mZ9Z9dfv;#xhv<^PGN0t{ z+rSgNt*S(N3ftfO=Lt|jqLF!uR4F_0;R-?KgEZ}=`HBwxROfdBG0Y`=7iedb?7$aq zn^xRgNR;6Nm zH6I@%g4a-{q@GcN6K41NjL~A;2=Er!2*hdHz>8OJ`MX= zCzw_3HNQ}z-8M>sZGbRH5u{@t_6r(NL;4LSSN>m*aPUIxr)|F=brwIPh2>pBI_c`? zRRrS^2jz=t6x1a`LLB2m?Ztbsa{qcc!?ms1|8;98DyN4M0~ylMVqUawVH;vRHWP7l zy0jCVhF)Xw{wAQ8sE4buN2KxgXfao zamkEH*i)_@ZqMuWgO`?@cpdyZAFHUK19%}L5R7KdvamS8+aE^U7i`QY`=_T#iKcGl zOTgNxoL=ouRYXmm*uww0kN#tn(^ubl(WaUCR1fe`^=`ad84Z#(|m zwEt<}{~gDFdTI0)*s$p3-WO{eFC(MCyzC!(NaBy~>-iXE0CV?Y)P*U253Ow8@e|!b z1FprTVt>N!_s#j0TeMT~vu9;#shZ0-nPM%l)1u)-n)15%MGjY}Es4ZKXT#Qq&P9f3bUPbH_Cz!{=f>37IBjAc;56QrYFGI5TOX zb1!VV@x)Jbjg;mj^JJ;+^%1s znMMJ!=b}(%u^%PXaF#}lpD5~YkKSsdhz{bJ4=ShiYVmyi(-yMt)4n`3;>p(^Li12V z`c;Ed>|@>^7RrP^{nrMmd#Pnq#^0F%?rqnG*mTcfJ>E0A+b=!8z7sV>>G8Zpznka6 zBt*$&RCZ);T4Rm=n~5L7em&}<)-pNeOv*0)RGPHc*^pN;HIMYF^yk4d@1{2M=Yu{; zIRMDE4~_0gpZN2V4yuOR-=|aE5dKa%6yD;;uU5UHLdw#i??;iUInb-eo4ayhC|nHn zt69~vL>UW0v{f4d7;KEX916AvAcsagDTsphQt#c9PUgyW?nzf zR$)f$O!ly8<^7~$XdbVn={e$L)e!?s;mAPy+Cmk#+;{N=;pRnHz(f`+jp28v?aBIx zs?oE`Vm8WNS-)WoAc5)HG7yorxxF))^XH16H(pQ8pTLvX4K>ubGVNdjm3dzK#mq{e znnr8eTH?XeK(Grzaa^}fD2&K1CR?giZSMK z^B*wrag?B{nUJ-@K$*4jb)WlT{*~;H&W-n%r(9c7f5R?-#K>9-{zPelxQW?BF~<5f zJe0zlgg>RR=sg361EZWZuf(+4aXsEofUc6hknc)Yv!Rg{5=vxsKPGud6hTSGgxIh7 z^U&u6wbA>?ipK3Wd?pL#(Fx-p-6lRQsfVz0Xx4tpn@rog9rk$lxS|PxLH?g8=>H&U z`dk!rV9V-jV3Fy&7JD7+bEioGtsAy44_pMBR2Ee$o&ftldjI|KxT_IDyzkps^|0#q zEuf=#-3FX+)|xK497&D;jjtPTe|()?E1_WZ?92;tlZKv%=n1K=UQr%`9d-O$M(MiP z;kF%x8O4Z)D?)z3_BI~gZ}wkK){NVShyE1ptntTgV0_t7T< z1>1L*@Mbn@>1BxK+uFdw!*^4uO~;{I9J!N}P1bzieR{mbfrmGv{bEz$dz#SQ7o{YI`Zz%Fl~wuG=ws^7RERhmz_yT~;EMb}4ptm++o%H=L|HX_lDC zyG^N%$%|=`;C->fxc&0(@{Yq1r6hBA^&2p?UceKxajP9pyuYs0i`&#l>37&v3;;i_ zS=gA=@@Y;SJI%XdqUGaU;*Ct;!^4|UIi4t~j?Zx59=RxKv>CR3-y0#0Pe1?Q8o2ry zcin-Em#Rwj)RJ3W^8zbz*6k#;uunK>+Ri(d5aAM z94;>c2^bY+m^)a|tyZhNc3yS=W^7h`lN2!BAHVQc@#mS< z^SjRXV^_nIcJ29(^Hz2@>)yvcU;X{NZOCo^WbC%LJimC}#IC%z`Ex6FvyM#sdZm2r z>2qZ^hClwXy?!xwz4GzL)gotj7zCIZjxaD7GB`k)4IgURCKk(Xd@Pw=yZv*j3>GCw zs!3rs1j&`&d$nub|9{(0Z<_MABd7QFJwwaarJMHZKi~W8^$ba9G(4Pl@WQrrocrRP zOYVO7Y`F7NI!HzBzWE2wKpol<^qnVZLiPp8YmVouV!!^a&7C`4`}*4YP2ZP(s(fE) z^Gy=TFvp(C_YeQRH(oRKUNukjdsVib^#xCVp4#JPciZZ(^6_N-CRmUOypucqu zT&%25?#G@Hc}0$qdRSpk-d<_E*ZqVkvN+V#E z19q1f^6nTEWYfq{6&1_73IDL8-*H>uhQ~An-<3idNYNPW+TcIqZKO8sejDbaXEIA` z=tq*V5OQ;&2zwU4VK2&nq!YUpQ3D$aA*VcQZNidl%s0D+4bw;1L<5^Ttrho4EN6WQ zuPvu5N&A?qU20a(dK#=P>!WtAaF<0={d>KlAQ=}uI=+nF&P3{BD zdqjgE1D<#F4{s8Ltx_!6iQY-ZQ4HUD)%E|nOwtP|a}mt(mVEdQiYFr-Z(OYXhU+rx zbbhA~7aobvjVn~Ca8{2rdWrciO`&0M{lnjQ-eQKx9`-2oy37F4oAMGtkcZ^JNzO~Y zl|M3{yO$(?3k}SD`_op(o{a(jgoC3f@9XuQlJ|dptV~jWjx12jgpKTR=Hu9vq1YK`iiS0=ZOLy7`U$db*)$)GGA=W@l1?a&K;Bdv^Nmf0 zqn--sd;x8l>%errvd6Kf3qJBF;a%NiV8s&RV7dHt8X<+`Y8Dw)%>t=1GlLEbObXIf zE#D#?orBaBJ|tO*S<}@mab8{{^LAjjvi|qt{d2c+gln^`T`SX!P#)f5Ee7oBN1YsN zXBzv4FD3*|Wm!q_mTq;dirqfplyf!OE;9F_Fn@&AB&2$4OZuf>Cm!k;G-Ueh3Q4CD znkJg-b=Rwms%x`06iD?V9K+#6LkW_K!JST{!=n<{IrklnH{#8L0ieqEAne4c;MU{k3jYS%MM [!NOTE] +> **Wio Tracker L2:** with **Lock screen** on (Settings › Display), waking +> the screen shows a clock card with **slide to unlock**. Settings › Display +> › **Tap to wake** decides whether a tap wakes it or only the top button. + +## PIN + +**Settings › Display › Lock PIN** adds a PIN to unlocking, asked also right +after power-up. + +- Enter on the row opens a number pad. Type the PIN (at least 4 characters), + confirm, then type it again. The pad's keyboard key switches to letters. +- A wrong PIN shows how many tries are left; after 5 in a row, entry pauses + for 30 seconds. +- Enter on the row again removes the PIN. + +The PIN is stored as a salted hash, never as the PIN itself. + +> [!NOTE] +> **Wio Tracker L2:** **Settings › Display › Screen PIN**, digits only. With a PIN, the lock card comes up every time the screen wakes, and +> the SD card isn't offered as a USB drive until it's unlocked. + +## Magnetic cover + +A Hall or reed sensor wired to a free pin (`PIN_HALL_SENSOR`, see +[Build flags](./developer/build-flags.md)) locks and blanks the screen when a +magnetic cover closes and unlocks it when it opens (asking for the PIN, if +one is set). diff --git a/docs/solo/messages.md b/docs/solo/messages.md new file mode 100644 index 00000000..363b47a3 --- /dev/null +++ b/docs/solo/messages.md @@ -0,0 +1,117 @@ +# Messages + +Messages holds three lists: **Channels**, **Direct** messages and **Rooms**. +Unread counts show on each conversation, on the list and on the home screen. + +> [!NOTE] +> **Wio Tracker L2:** one screen with all three as sections; tap a section +> title to fold it. **New** in the header starts a conversation with any +> contact. + +## Reading + +Open a conversation to see its history as chat bubbles: yours on the right, +received ones on the left, newest at the bottom. Each bubble shows the sender, +its age and a small hop count: on a received message, how many repeaters it +came through; on your own, how many repeaters were heard passing it on. + +**Enter** on a message opens it full screen; **Left / Right** there pages to the +older and newer one. + +**Hold Enter** on a message for its options: + +- **Reply**: starts a message addressed to the sender (`@[name]`). +- **Navigate**, **Save waypoint**, **Set as target**: when the message + contains a location (see [Navigation](./navigation.md)). +- **Path** on a received message: the repeaters it came through. + **Relayed by** on your own channel post: the repeaters heard repeating it. + +> [!NOTE] +> **Wio Tracker L2:** hold a bubble. The card shows when it was sent, the hop +> count, the path as a diagram, and **Reply** / **Set target**. + +### How much is kept + +The device keeps the newest 48 channel messages and 32 direct messages, all +conversations together. When a busy conversation pushes out messages you +haven't read, its unread count gets a **+** (for example `48+`). + +> [!NOTE] +> **Wio Tracker L2:** 256 channel and 128 direct messages in memory, and with +> an SD card every conversation is also saved to the card (100 to 2000 +> messages each, Settings › Storage). The history survives a reboot and +> scrolls back through everything on the card. + +## Writing + +Open a conversation and choose **[+ send]** (or Enter at the bottom of the +history). Pick a quick message or **Custom message** for the keyboard. + +- **Quick messages**: ten of your own, edited in Settings › Messages. +- **Placeholders** fill in live data when the message is sent: + `{loc}` (your GPS position), `{time}`, `{batt}`, and the readings of any + sensor the device has: `{temp}`, `{hum}`, `{pres}`, `{alt}`, `{lux}`, + `{dist}`, `{co2}`. + +> [!NOTE] +> **Wio Tracker L2:** the compose bar sits under the conversation; its **+** +> opens quick messages and placeholders. Quick messages are edited in +> Settings › Messages & contacts. + +### The keyboard + +The on-screen keyboard is a letter grid (or a phone-style T9 keypad, Settings › +Keyboard › Layout). Up from the top row moves the cursor through the text. + +Accented letters don't need a language setting: **hold Enter** on the base +letter and pick from its variants, for example `a` → `á à â ä å ą…`, `z` → +`ź ż ž`. This covers Polish, Czech, German, French, Spanish, Nordic and the +other European languages written in Latin. + +Settings › Keyboard picks two scripts, **Main** and **Additional**, from Latin, +Cyrillic and Greek; the keyboard's **#@/abc** key cycles between them and +symbols. Cyrillic includes the Ukrainian, Belarusian and Serbian letters +(under the key they sit on). Received messages in any of these scripts display +correctly whatever the keyboard is set to. + +> [!NOTE] +> **Wio Tracker L2:** a phone-style keyboard. Hold a key for its accents; the +> globe key switches between the two alphabets. + +## Channels + +**Hold Enter** on a channel for its options: + +| Option | Does | +| ------ | ---- | +| Mark all read | Clears its unread count | +| Notif, Melody | Its own notification and sound, instead of the global ones | +| Fav | Marks it as a favourite (shared with the app) | +| Scope | The region its messages are tagged with (`*` = none); the list is in Settings › Radio › Scope | +| Pin to dial | Puts it on the Favourites page | +| Edit, Delete | Renames it or changes its secret; removes it | + +**+ Add channel** at the end of the list adds: + +- **Public**: the default public channel, if you deleted it. +- **Hashtag**: a topic such as `#hiking`. Anyone who types the same topic + joins the same channel. +- **Private**: a name and a secret, typed as a passphrase or as the 32-digit + hex key (the format of channel QR codes). + +> [!NOTE] +> **Wio Tracker L2:** hold a channel, or tap ⚙ in an open channel, for its +> options. + +## Direct messages + +**Hold Enter** on a contact: Mark as read, Notif, Melody, Fav, Pin to dial. +**Fav** is the star shared with the app and sorts favourites to the top; +**Pin to dial** only puts the contact on the Favourites page. + +## Rooms + +Opening a room logs in first. You type the password once (empty if the room +has none); it's saved on the device, including passwords set from the app, +so the next time it logs in without asking. A wrong password is forgotten and +you're asked again. **Hold Enter** on a room offers **Login…** and **Logout**. diff --git a/docs/solo/navigation.md b/docs/solo/navigation.md new file mode 100644 index 00000000..e9e97447 --- /dev/null +++ b/docs/solo/navigation.md @@ -0,0 +1,125 @@ +# Navigation + +Everything here works from the device's own GPS; no magnetometer or extra +hardware is needed. Distances and speeds follow Settings › System › Units +(metric or imperial). + +## Trail + +**Tools › Trail** records your route in the background while you use the rest +of the device (a blinking **G** in the status bar). Straight stretches are +stored as their two ends, so the 512 points cover a long route. **Left / Right** +switches between the **Summary** (distance, time, speed or pace), the **Map** +(your route, waypoints, people sharing their position, the target) and the +point **List**. + +**Hold Enter** for the trail menu: start / stop, mark a waypoint, the waypoint +list, **Track back** (retrace the route to where it started), share your +position, the trail file, and the trail settings: + +- **Min dist**: how far apart points are recorded. +- **Auto-pause**: pauses the trail after you stop for 1–5 minutes and resumes + when you move, so breaks don't count. +- **Mark avg**: averages the GPS for 5–30 seconds when marking a waypoint. +- **Auto-save**: saves the trail when the device powers off, including a + low-battery shutdown. + +The trail lives in memory: save it (Trail file › Save) or turn on Auto-save +to keep it through a reboot. + +### GPX export + +Connect USB, open [Solo Tools](https://marekzegare4.github.io/Solo-tools/) in +Chrome or Edge and click **Connect device**, then on the device choose +**Trail file › Export**. The GPX includes your waypoints. Without a browser, +`uv run tools/trail_export.py` does the same. Disconnect the phone app first if +it's connected over USB. + +> [!NOTE] +> **Wio Tracker L2:** the trail holds 4096 points and is drawn on the map. +> Its controls (start / stop, save, load, track back, reset) are in the map's +> **Map tools**, the settings in Settings › Map. **GPX** writes the trail to +> the SD card; take it off with the card as a USB drive +> ([Hardware](./hardware.md)). + +## Waypoints + +A waypoint is a saved spot (the car, a camp, water) with a short label, up to +16 of them, kept through reboots. Add one with **Mark here** at your position, +or **+ Add by coords** to type coordinates. The list starts with **Trail +start**, so you can always go back to where the trail began. + +**Hold Enter** on a waypoint: Rename, Delete, **Send** (as a message to a +contact or channel) and **Set as target**. + +> [!NOTE] +> **Wio Tracker L2:** up to 64 waypoints. The pin button on the map opens the +> list; hold a spot on the map to make it a waypoint or the target. + +## Navigating to something + +**Navigate** on a waypoint, a node in Nearby or a location in a message opens +the navigation view: the distance, the bearing **To** the target and your own +heading (**Hdg**), with the time to arrival once you're getting closer. Turn +until the two bearings match. The heading comes from your movement, so it +shows `--` while you stand still. + +**Tools › Compass** shows the same heading as a scrolling tape with the +degrees and direction. + +> [!NOTE] +> **Wio Tracker L2:** the target is drawn on the map with a line to it, and a +> bar with distance, bearing, heading and time to arrival. The Compass app is +> a turning dial. + +## Sharing locations + +- **Once**: **Share my pos** in the trail menu sends your position to a + contact or channel you pick. +- **A waypoint**: **Send** in the waypoint menu. +- **Live**: **Tools › Live Share** sends your position while you move, to one + contact or channel, for 1 to 12 hours. It only sends after you've moved + (50–500 m) and never more often than you set; an optional heartbeat repeats + it while you stand still. + +With **Track loc** on in Live Share, other people's shares show on the map +and in Nearby, with live distance and bearing. + +Locations travel as ordinary text (`[LOC]lat,lon`, or `[WAY]lat,lon label` +for a waypoint), readable in the phone app and on other firmware. On the +receiving side, **hold Enter** on the message to navigate to it, save it or +set it as the target. + +## Locator + +**Tools › Locator** alerts you when you cross a circle around a target: +arriving at a waypoint, leaving it, or a person coming near or moving away. + +- **Target**: a waypoint (a fixed place) or a contact (follows their live + share, else their last known position). +- **Radius**: 50 m to 1 km. +- **Mode**: alert on arriving, leaving, or both. +- **Beeper**: ticks faster as you get closer, even when the sound is muted. + +**Set as target** in Nearby, the waypoint list or a message sets the target +in one step. The target shows as a flag on the map. + +## Map + +The **Map** home page shows your position, the trail, waypoints, people +sharing their position and the target. **Enter** opens the trail map; +**hold Enter** shares your position. + +> [!NOTE] +> **Wio Tracker L2:** a real map with offline tiles on the SD card. Drag to +> pan, +/− to zoom, the crosshair follows your GPS again. +> +> - **Download**: frame an area on the map and download its tiles over WiFi. +> Downloaded areas can be renamed, refreshed or deleted. +> - **Live tiles**: with WiFi on, tiles for where you look are fetched and +> cached, up to the size set in Settings › Storage. +> - **Vector regions**: whole regions as packs made with +> `tools/maps/osm_vector.py`, copied to the card. +> +> The minimap on the home screen shows your surroundings at a glance; tap it +> for the full map. The **Nodes** map shows every node with a position. diff --git a/docs/solo/settings.md b/docs/solo/settings.md new file mode 100644 index 00000000..7a310838 --- /dev/null +++ b/docs/solo/settings.md @@ -0,0 +1,40 @@ +# Settings + +Settings are saved as you change them and kept through reboots and updates. +On joystick devices they're folding sections: **Enter** on a section opens +it, **Left / Right** changes a value, **Back** leaves. Only the rows your +board supports are shown. + +| Section | What's there | +| ------- | ------------ | +| **Display** | Brightness, auto-off, lock screen and [PIN](./lock.md), battery as icon / % / volts, clock format and seconds, wake on message; on e-ink also rotation and full refresh | +| **Sound** | Buzzer on / off / auto (quiet while the app is connected), volume, quiet hours, the melody for messages, channels and adverts | +| **Home Pages** | Order of the home pages, and which are shown | +| **Radio** | TX power, preset, frequency, SF / BW / CR, saved presets, Auto pwr, the scope list | +| **System** | Device name, time zone, low-battery shutdown, GPS power saving, units, reboot | +| **Keyboard** | ABC or T9 layout, the two scripts, CardKB mode | +| **Contacts** | Show all or favourites only (DMs, channels, rooms), favourites on top, contact expiry and prune | +| **Messages** | Automatic resend of direct messages, the ten quick messages | + +A few notes: + +- **Auto pwr** lowers the TX power on strong links and raises it back on weak + ones; the power set above is the ceiling. +- **Scope** is a list of named regions (plus `*`, no region). Messages are + tagged with a scope so repeaters can tell communities on the same frequency + apart. The default one is used for direct messages and repeating, and each + channel picks its own (see [Messages](./messages.md#channels)). Anyone who + types the same name gets the same scope; it isn't encryption. +- **Low battery** shuts the device down at the voltage you choose, which is + also 0 % on the battery indicator. + +> [!NOTE] +> **Wio Tracker L2:** one list of pages: +> +> - **Device**: Display (including the lock and **Tap to wake**), Home apps, +> Power (battery, GPS), Sound (with the melody editor), Keyboard, Messages +> & contacts. +> - **Connections**: Radio, Bluetooth, WiFi, GPS. +> - **Map & data**: Map (trail, live sharing and arrival alert options), +> Storage. +> - **System**: Name, Time, Firmware update, About; Reboot and Power off. diff --git a/docs/solo/tools.md b/docs/solo/tools.md new file mode 100644 index 00000000..75122853 --- /dev/null +++ b/docs/solo/tools.md @@ -0,0 +1,114 @@ +# Tools + +On joystick devices, the tools are in **Tools**, grouped into Location, Comms +and System. The navigation tools are on the [Navigation](./navigation.md) +page, Nodes and Admin on [Contacts](./contacts.md). + +> [!NOTE] +> **Wio Tracker L2:** the tools are apps on the home screen: Messages, Nodes, +> Settings, Compass, Clock, GPS, Bot, Repeater, Admin, Diagnostics. The trail, +> live sharing and the locator are on the map (its tools button) and in +> Settings › Map. + +## Clock + +The **Clock** home page shows the time, the date and up to three fields you +choose (hold Enter): battery, temperature, humidity, pressure, altitude +(barometric or GPS), light, CO₂, GPS position, satellites, contacts, unread +messages. The time comes from GPS or the phone app; the time zone is in +Settings. + +**Enter** on the clock opens the clock tools: + +- **Alarm**: a time, repeating daily, on weekdays, at weekends or once. It + rings with the screen off or locked, but not after a shutdown. +- **Timer**: a countdown that rings when it reaches zero, whatever screen + you're on. +- **Stopwatch**. + +Any key silences the ringing; it stops by itself after a minute. + +## Remote bot + +**Tools › Bot** answers messages for you. It watches your direct messages, one +channel and one room, each switched on separately: + +- **Trigger and reply**: when a message contains the trigger (several can be + separated by commas, `*` matches any message), the bot sends the reply. The + reply can use placeholders, plus `{name}` (the sender) and `{hops}`. +- **Commands**: messages starting with `!` get live data back: + + | Command | Reply | + | ------- | ----- | + | `!ping` | `pong` | + | `!batt`, `!temp`, `!time`, `!loc` | battery, temperature, time, position | + | `!hops` | how many hops the command took | + | `!status` | battery, position and time | + | `!help` | the list of commands | + + Several in one message get one reply: `!batt !time` → `4.10V | 14:30`. +- **Actions** (off by default) let the command change the device: `!buzz` + (sounds the buzzer to find it), `!gps on` / `!gps off`, `!gps fix` (turns + the GPS on, waits for a good fix and sends it), `!advert`. + +**DM allow = Fav** limits the DM bot to your favourites, and **quiet hours** +stop trigger replies at night (commands still answer). Replies are rate +limited so two bots can't answer each other forever. The room bot uses the +room's saved login. + +## Auto-advert + +**Tools › Auto-advert** sends an advert with your position every 30 seconds +to 1 hour, so others see you in their Nearby list. With it on at both ends +and Settings › Sound › **AD sound** set, each device beeps when it hears the +other: a hands-free "still in range". + +## Repeater + +**Tools › Repeater** makes the device relay other people's packets while it +keeps working as a companion. By default it relays on a separate repeater +profile (the community's repeater frequency) and switches back when you turn +it off; **Network = Current** relays on your own frequency instead. + +Optional filters keep a mobile repeater from adding noise: skip adverts, a +maximum hop count, **Yield** (let fixed repeaters go first), a minimum SNR, +drop duplicates already relayed by someone else, and relay only your +**scopes**. Diagnostics shows how much it forwards. + +## Ringtones + +**Tools › Ringtone** composes two melodies of up to 32 notes (pitch, octave, +length, tempo). Use them for notifications in Settings › Sound, or for a +single contact or channel from its options. + +> [!NOTE] +> **Wio Tracker L2:** the melody editor is under Settings › Sound. + +## Diagnostics + +**Tools › Diagnostics** shows live counters (packets received and sent by +type, forwarded, errors), memory, the radio's noise floor and the last +packet's signal; a **System** tab with the firmware and radio settings; and a +**Font** tab with a sample of every script the font covers. Hold Enter on the +live tab to reset the counters. + +> [!NOTE] +> **Wio Tracker L2:** the Diagnostics app, with a **Noise** tab that +> measures the noise floor over time. + +## GPIO + +*Wio Tracker L1 only.* **Tools › GPIO** sets four spare pins as input, +output or (GPIO1–2) analog input, shows their level and switches outputs. The +bot's `!gpio1`…`!gpio4` commands read and set the same pins. + +## GPS and sensors + +The **GPS** home page shows the fix and satellites; **Sensors** shows the +readings of the sensors the board has. **GPS pwr** in Settings › System turns +the GPS off between fixes to save battery; anything that needs your position +(the trail, live share, the locator) keeps it on. + +> [!NOTE] +> **Wio Tracker L2:** the **GPS** app draws a sky plot of the satellites and +> each one's signal strength. diff --git a/docs/solo_features/README.md b/docs/solo_features/README.md deleted file mode 100644 index cc9785a7..00000000 --- a/docs/solo_features/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# MeshCore Solo — documentation - -## Documents - -| Document | Description | -| -------------------------------------------------------------------------- | --------------------------------------------------------------------- | -| [Messages Screen](./message_screen/message_screen.md) | Sending messages, context menus, reply, navigate to / save shared locations, Notif/Melody overrides | -| [Favourites Dial](./favourites_dial/favourites_dial.md) | Pinned contacts grid, unread badges, pin/unpin | -| [Clock Screen](./clock_screen/clock_screen.md) | Clock page, date, configurable data fields, alarm / timer / stopwatch | -| [Settings Screen](./settings_screen/settings_screen.md) | All settings sections with values and interactions | -| [Screen Lock](./screen_lock/screen_lock.md) | Lock/unlock sequence, lock screen, auto-lock | -| [Tools Screen](./tools_screen/tools_screen.md) | GPS trail & waypoints, compass, navigation, nearby nodes, ringtone editor, remote bot, auto-advert, live location sharing, locator, diagnostics, repeater, remote admin | -| [External Keyboard & Joystick](./external_keyboard.md) | CardKB shortcuts, Full vs Compact mode, wired joystick, Heltec V3/V4 wiring | -| [Build Flags](./build_flags.md) | Every optional `-D` build flag a solo build understands — GPIO, Hall sensor, buzzer/vibration, GPS switch, display/battery tuning | -| [Solo UI framework](../developer/ui-framework.md) | **Developer guide** — the reusable building blocks (screens, lists, popups, mini-icons, geo/persistence helpers) and how to add a new feature | -| [UI Core](../developer/ui-core.md) | **Developer guide** — the frontend-independent layer (models, settings schema, events) shared by the OLED/e-ink UI and the LVGL touch UI | - -## Upstream MeshCore - -| Document | Description | -| -------------------------------------------------- | ------------------------------------------------ | -| [FAQ](../faq.md) | Frequently asked questions | -| [CLI Commands](../cli_commands.md) | Commands for repeaters, room servers and sensors | -| [Terminal Chat CLI](../terminal_chat_cli.md) | Commands for the terminal chat client | -| [Companion Protocol](../companion_protocol.md) | Serial/BLE frame protocol between device and app | -| [Packet Format](../packet_format.md) | LoRa packet structure | -| [QR Codes](../qr_codes.md) | Channel and contact QR code formats | - -## Features - -- Extended language support — one unified 6×9 font (Latin, Greek, Cyrillic) plus on-screen keyboard alphabets for Cyrillic, Greek, Polish, Czech, Slovak, German, French, Spanish, Portuguese and Nordic. Pick two in Settings › Keyboard (**Main**/**Additional**) and switch between them while typing - -- Enabled sensor screens with support for onboard sensors (temperature, humidity, pressure, luminosity, CO₂) and GPS data - -- **GPS navigation** — a full navigation suite that needs no extra hardware (details in the [Tools Screen](./tools_screen/tools_screen.md) docs): - - - **Waypoints** — mark a spot (car, camp, water…) with a short label, see it on the trail map, and get live bearing + distance back to it; the list always offers a one-tap backtrack to where your trail started - - **GPS compass** — heading derived from course-over-ground (no magnetometer needed), shown as a clear scrolling heading tape with a large degrees + cardinal readout - - **Navigate to anything** — a saved waypoint, a node straight from Nearby Nodes, or a location someone shares with you in a message - - **Share & save locations** — send a waypoint to a contact or channel; on the other end, navigate to or save any shared location with one menu - - **Live location sharing** — broadcast your position over the mesh as you move (movement-gated, to a channel or contact) and see others who share theirs as pins on the map and live distance/bearing in Nearby - - **Locator** — arm a geofence around a waypoint or a person, get alerted on arrive/leave or near/far, with an optional homing beeper that speeds up as you close in. Set from the Locator screen, Nearby Nodes, or Waypoints; target shown as a flag on the map - - **GPS trail** — background route recording with an auto-fit map (waypoints + live position), summary stats, auto-pause on stops, and [GPX export](../../README.md#documentation) - - **Metric or imperial** — one global Units setting drives every distance and speed across the UI - -- [Messages Screen](./message_screen/message_screen.md) — view and send messages, open message details, reply with quick messages or custom text, navigate to / save locations shared in a message, per-channel notification and melody overrides, add/edit/delete channels on-device - -- [Favourites Dial](./favourites_dial/favourites_dial.md) — pin up to six contacts for quick access from the home screen - -- [Settings Screen](./settings_screen/settings_screen.md) — configure display, sound, home page order, radio and system settings - -- [Clock Screen](./clock_screen/clock_screen.md) — view time and date plus up to three configurable data fields, with built-in clock tools (one-shot alarm, countdown timer, stopwatch) - -- [Screen Lock](./screen_lock/screen_lock.md) — lock the device to prevent accidental keypresses, with a lock screen showing time and sensor data - -- [Tools Screen](./tools_screen/tools_screen.md) — GPS trail & waypoints, compass, nearby nodes (with ping & navigate), ringtone editor, remote bot, auto-advert, live location sharing, locator, diagnostics, repeater, remote admin - -- [External Keyboard & Joystick](./external_keyboard.md) — optional, auto-detected: **CardKB** for typing without the on-screen grid (Fn+Enter submits, Fn+letter picks an accent, Tab is Hold-Enter, Fn+Esc locks), plus a **wired joystick** for boards without one. Compact mode makes CardKB-only operation practical - -- **Auto pwr** (Settings › Radio) — Adaptive Power Control: trims actual TX power on strong links (from ACK SNR) and ramps back up to the configured ceiling on weak/lost links; the home screen shows the live power - -## E-ink Display (Wio Tracker L1) - -The e-ink variant targets the Wio Tracker L1 fitted with a 2.13″ GxEPD2 panel (250 × 122 px). Every screen is adapted for it: - -- **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 diff --git a/docs/solo_features/clock_screen/clock_screen.md b/docs/solo_features/clock_screen/clock_screen.md deleted file mode 100644 index f4a46ad1..00000000 --- a/docs/solo_features/clock_screen/clock_screen.md +++ /dev/null @@ -1,93 +0,0 @@ -## Clock Screen - -[Go back](../../../README.md) - -### Overview - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./overview_oled.png) | ![](./overview_eink.png) | - -A full-screen clock page on the home screen. Shows the current time and date, with up to three configurable data fields below. - -Time is synchronized from GPS or via the companion app. Timezone offset is applied from **Settings › System**. - -If no time source is available, the screen shows _"! No time sync"_ with a hint to enable GPS or connect the app. - ---- - -### Time display - -- **Format** — 24 h or 12 h with AM/PM; configurable in **Settings › Display** -- **Seconds** — shown by default on OLED; hidden on e-ink (always) and optionally on OLED via **Settings › Display › Clock seconds**; hiding reduces the refresh rate from 1 s to 60 s - ---- - -### Data fields - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./fields_oled.png) | ![](./fields_eink.png) | - -Up to three data fields are shown below the date separator. Each field displays a label and a value on the same line. - -| Field | Label | Value | -| ----------- | ----- | ------------------------------------------------------------------------- | -| None | — | — | -| Batt V | Batt | Battery voltage (e.g. `3.92V`) | -| Batt % | Batt | Battery percentage using LiPo curve anchored at the low-battery threshold | -| Temperature | Temp | °C from onboard sensor | -| Humidity | Hum | % from onboard sensor | -| Pressure | Pres | hPa from onboard sensor | -| GPS | GPS | `lat lon` decimal degrees, or `no fix` | -| Altitude (Baro) | Alt | metres/feet (per Settings › System › Units) from onboard barometric sensor (`--` without one) | -| Luminosity | Lux | lux from onboard sensor | -| CO₂ | CO2 | ppm from onboard sensor | -| Contacts | Nodes | Total contacts in the mesh | -| Messages | Msgs | Total unread message count. A trailing **+** (e.g. `48+`) means at least one channel or DM has filled its on-device history ring while unread — the real total is higher than shown, but that's everything still recoverable; the rest was evicted before ever being seen. | -| Satellites | Sats | GPS satellite count (or `--` without GPS) | -| Altitude (GPS) | AltG | metres/feet (per Settings › System › Units) from the GPS fix (or `no fix`) | - -Sensor fields show `--` when the sensor is not connected or has no data. - ---- - -### Configuring fields - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./config_oled.png) | ![](./config_eink.png) | - - - -**Hold Enter** (or press the **Context menu** key) on the Clock page to open the Dashboard Config screen, where each of the three field slots can be cycled with **LEFT/RIGHT**. - ---- - -### Clock tools — Alarm, Timer, Stopwatch - -**Press Enter** (short press) on the Clock page to open **Clock Tools**, a small menu with three time utilities. **Cancel** backs out one level (tool → menu → home). The same menu also has an entry under **Tools › System**, so it's reachable without the Clock page. - -#### Alarm - -A wake alarm with an optional repeat. Rows: **Hour**, **Minute**, **Repeat** and **Armed**. **Enter** on Hour or Minute opens the digit editor (LEFT/RIGHT moves between the tens/units, UP/DOWN changes the digit); **Enter** on Repeat cycles **OFF → Daily → Weekdays → Weekends → OFF**; **Enter** on Armed toggles ON/OFF. The configured time is shown next to the **Alarm** menu row when armed, and the setting persists across reboots. - -While armed, a bell icon shows in the Clock page's top-left corner and in the status bar on other home pages (hidden on the Clock page itself, hence its own indicator). Icon-only — the exact time is on the **Alarm** row in Clock Tools. - -The alarm fires at an absolute instant, so it survives clock re-syncs (mesh packets, companion app, GPS and the CLI can all jump the device clock). A jump past the alarm time still fires it, just late. With **Repeat** OFF (default) it disarms after firing once; with a pattern set, it re-arms for the next matching day. - -The alarm only fires while the device is **awake** (it keeps running with the display off or locked). It cannot wake the device from a full **Shutdown** (the CPU and RAM are powered down), and needs a valid time source — it stays pending until the clock is synced. - -#### Timer (countdown) - -A large **HH:MM:SS** readout with one digit underlined. **LEFT/RIGHT** moves the cursor one digit at a time, **Up/Down** changes the digit under it (minute/second tens cap at 5, hours at 23), and **Enter** starts the countdown. While running it shows **H:MM:SS** — **Enter** stops it, **Cancel** returns to the menu and leaves it counting. When it reaches zero the device rings, even if you have navigated to another screen. - -#### Stopwatch - -**Enter** starts/stops; **Up/Down** resets when stopped; **Cancel** returns to the menu and leaves it running. - -#### Ringing - -When the alarm or timer fires the device plays a melody (overriding mute) and shows an alert. **Any key** silences it; otherwise it stops on its own after a minute. - -> **E-ink note:** the live timer/stopwatch readouts would thrash a slow e-paper panel if redrawn every second, so on e-ink they refresh only coarsely (and immediately on any key press). The underlying timing is exact regardless, and the countdown's buzzer always fires on time. diff --git a/docs/solo_features/clock_screen/fields_eink.png b/docs/solo_features/clock_screen/fields_eink.png deleted file mode 100644 index 3a7a3d46c9a99c93c50ba86999c7bfc07a4e7124..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4350 zcmeHKYfM{p6z?G7f`LLb&JGJC)nHZ`;1wvN6i^(pY%n(`f)r4(*U2nUghF39W5TOr zF~WGP-1-`ep>(i2XrU|RF&HQm%|=;QF37WEeNk8`P#zYT6h7!Tzx95&=RQt;|8sul zoL~O`;?uFwF3yLYQ7Dv4%)3!%P^bfsP$qHWB3(MM4MT`q1otD%fO7nZ|`uTF=3)E$IW&|C5v$b51Oec%b(xp6^YVe=a5J_wnRw1& zn*l4*Tx?;-@v;m{qffrW=*dGRW6fwjN0@Im z1kgM^L*mLV6ex0+AsahBaxpkq9!|2Ne53=+`4T~fhoJ^A3MB_%Y9Pbq>6}`gyH~>E^lzJv0W_A4 zt2-B(Jk82{_WGA!}Ql%zcT|hKtqAnLP;<X;76iYK8-U2q4p#>B+59wq6z`&y-{oYhxsq(Ou!D6sx; zzO_WnSZf0pg4gH|p5^3{1%#m?NQ487SmC|vG~3{1s}f(8eN2^fC%%TuJ}DF}hAiIK z-0ItHiHLz~=@kQKs{4~erT~}&VP_H9#4+DJ2yhQ$G f|C@(!-%W?ab8d}(g49D>N646WVxxp_rGE1_tSZyV diff --git a/docs/solo_features/clock_screen/fields_oled.png b/docs/solo_features/clock_screen/fields_oled.png deleted file mode 100644 index 7d1b4e73368cf8a67a25d6cf6a91f15100ad3a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1488 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 diff --git a/docs/solo_features/external_keyboard.md b/docs/solo_features/external_keyboard.md deleted file mode 100644 index 12ffb90e..00000000 --- a/docs/solo_features/external_keyboard.md +++ /dev/null @@ -1,144 +0,0 @@ -## External Keyboard & Joystick - -[Go back](../../README.md) - -Two optional, auto-detected hardware add-ons — a build with them enabled runs -the same with nothing plugged in. Two of the newer boards also ship with -their own **built-in** keypad instead — -see [Built-in keyboards](#built-in-keyboards-cardputer-adv-t-echo-lite--keyshield). - -- **CardKB** — an M5Stack I2C QWERTY keyboard (address `0x5F`), for typing - messages, names and labels without walking the on-screen letter grid. -- **Wired joystick** — four direction contacts plus a Back button, replacing the - single-button navigation on boards that have no joystick of their own. - -### Support by device - -| Device | CardKB | Wired joystick | -| ------ | :----: | :------------: | -| Seeed Wio Tracker L1 (OLED) | ✅ Grove connector | onboard | -| Seeed Wio Tracker L1 (E-ink) | ✅ Grove connector | onboard | -| GAT562 30S Mesh Kit | — | onboard | -| Heltec V3 *(experimental)* | ✅ solder to free GPIOs | ✅ solder to free GPIOs | -| Heltec V4 *(experimental)* | ✅ solder to free GPIOs | ✅ solder to free GPIOs | -| M5Stack Cardputer ADV *(experimental)* | — | built-in keyboard instead, see below | -| LilyGO T-Echo Lite + KeyShield *(experimental)* | — | built-in keypad instead, see below | -| ProMicro (nRF52840) *(experimental)* | ✅ shares the primary I2C bus (D8/D7) — no free pins for a second bus | — | - ---- - -## CardKB - -Plug it into the second I2C bus (the Grove connector on the Wio Tracker L1; -see [Wiring](#wiring-heltec-v3--v4) for the Heltec boards). The firmware probes -for it once at boot — nothing to enable in Settings. - -The same bus is scanned for environment sensors, so a CardKB and a sensor can -share it. - -On a board with no free pins for a second bus (ProMicro), CardKB instead -shares the primary bus already used by the display/RTC — set `CARDKB_I2C=Wire` -as a build flag rather than `ENV_PIN_SDA`/`ENV_PIN_SCL`. See -[Build Flags](./build_flags.md) for both forms. - -### Typing - -Printable characters insert straight at the cursor, bypassing the on-screen grid -completely. The alphabet and T9/ABC settings do not apply — a real keyboard sends -the right character already, so typing is always plain Latin ASCII regardless of -what Settings › Keyboard is set to. - -| Key | Action | -| --- | ------ | -| letters / digits / symbols / space | insert at the cursor | -| Backspace | delete the character before the cursor | -| Esc | cancel / back | -| Arrows | same as the joystick | -| Enter | same as the centre button | -| **Fn+Enter** | **submit the field** — no need to find the DONE cell | -| **Fn+letter** | open the accent popup for that letter (e.g. Fn+A → á à ä ã…) | -| **Tab** | the Hold-Enter equivalent, everywhere — context menus, shift-lock, clear-all | -| **Fn+Esc** | lock / unlock the device (single press, works in both directions) | - -Fn+Esc rather than the adjacent Fn+Backspace on purpose: Fn and Backspace sit -next to each other on CardKB's layout and would be far too easy to hit by -accident. See [Screen Lock](./screen_lock/screen_lock.md) for the physical -button equivalent. - -### Ext. KB — Full vs Compact - -**Settings › Keyboard › Ext. KB** picks how the on-screen keyboard behaves while -a CardKB is doing the typing. - -| Mode | Behaviour | -| ---- | --------- | -| **Full** (default) | The letter grid stays on screen. Arrows and Enter drive the grid exactly as physical buttons do, so CardKB and the joystick can be used interchangeably. | -| **Compact** | The grid, the special-row icons and the status line are all hidden — only the text being typed and two shortcut hints remain. Arrows move the **text cursor** directly, and plain Enter submits the field (same as Fn+Enter). | - -**Compact is designed to need no joystick at all** — the right choice when -CardKB is the only input device, e.g. a Heltec V3/V4 with no joystick -soldered on. - -Cursor mode and the accent / placeholder popups draw their own visible feedback, -so they behave identically in both modes. - ---- - -## Wired joystick - -Four direction contacts plus a fifth "press" contact. Each contact simply -shorts its pin to ground — the firmware enables the internal pull-ups, so no -external resistors are needed. - -- The stick's own press contact drives the centre / Enter press — your thumb - is already on the stick, so pressing it in is the natural "confirm" action. -- The board's existing user button (PRG on the Heltec boards) becomes Back - instead. Back is **not** optional: the UI uses it unconditionally once the - joystick is enabled. Triple-clicking Back toggles the buzzer. -- **Settings › Display › Joystick rotation** rotates the direction mapping at - runtime (0–3), for a stick mounted sideways in a custom enclosure. It is - independent of display rotation. - ---- - -## Wiring (Heltec V3 / V4) - -Neither board ships with a joystick or a keyboard header, so both are soldered to -free GPIOs. V3 and V4 are pin-compatible per Heltec's documentation and the solo -builds use the same assignment for both — **confirmed working on real V4 -hardware**; still worth checking against your own V3 module before soldering. - -| Function | GPIO | Notes | -| -------- | ---- | ----- | -| CardKB SDA | 3 | second I2C bus (`Wire1`) — *not* the OLED's 17/18 | -| CardKB SCL | 4 | | -| Joystick UP | 23 | | -| Joystick DOWN | 6 | | -| Joystick LEFT | 47 | | -| Joystick RIGHT | 48 | | -| Joystick press — Enter | 33 | the stick's own fifth contact; required when the joystick is enabled | -| Back | 0 | the onboard PRG button — nothing to wire | - -Everything above lives in the `[env:Heltec_v3_companion_solo_dual]` / -`[env:heltec_v4_companion_solo_dual]` blocks in -[`solo/heltec_v3/platformio.ini`](../../solo/heltec_v3/platformio.ini) -and [`solo/heltec_v4/platformio.ini`](../../solo/heltec_v4/platformio.ini), -with comments explaining which pins are safe to reuse. To build a CardKB-only -device, comment out the joystick block and set Ext. KB to Compact. - ---- - -## Built-in keyboards (Cardputer ADV, T-Echo Lite + KeyShield) - -*Experimental* — newly-added board support, not the CardKB/joystick add-ons -above. Both keypads are TCA8418-based and share one polling path, entirely -independent of the CardKB code — a board can have either, or neither. - -- **M5Stack Cardputer ADV** — built-in QWERTY, no CardKB or joystick needed. -- **LilyGO T-Echo Lite + KeyShield** — the KeyShield add-on gives the T-Echo - Lite a T9 keypad; without it the board has no usable input for the solo UI. - -Neither keypad follows CardKB's exact Fn-shortcut table (Fn+Enter, -Fn+letter accent popups, Tab, Fn+Esc lock) — see each board's own -keyboard driver under `variants/` and its solo `platformio.ini` under `solo/` -for its current keymap. diff --git a/docs/solo_features/favourites_dial/favourites_dial.md b/docs/solo_features/favourites_dial/favourites_dial.md deleted file mode 100644 index 6774a5ba..00000000 --- a/docs/solo_features/favourites_dial/favourites_dial.md +++ /dev/null @@ -1,74 +0,0 @@ -## Favourites Dial - -[Go back](../../../README.md) - -### Overview - -| OLED | E-Ink | -| :------------------------: | :------------------------: | -| ![](./overview_oled.png) | ![](./overview_eink.png) | - -A dedicated home page showing a grid of up to 6 pinned conversations — chat contacts, room servers or channels — 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 conversation directly: a contact's DM, a channel's history, or a room server (running the room's login handshake first if it isn't logged in yet). - -**Enter on an empty tile (`+`)** — starts the picker to fill the slot. - -**Hold Enter on a filled tile** — opens **Unpin** / **Replace** for that slot. - -Channel tiles show their name with a leading `#`, so they read apart from contacts and rooms sharing the same grid. - ---- - -### Unread badge - -Filled tiles show an unread message count in the top-right corner — unread DMs for a contact or room, unread posts for a channel. The name is ellipsized to make room for the badge. - -If a pinned target disappears — a contact removed explicitly or auto-evicted to make room when the table is full, or a deleted channel — its slot is freed automatically and goes back to an empty `+` tile. - ---- - -### Pinning - -**From the Favourites Dial** — press **Enter** on an empty tile (`+`), or **Hold Enter** on a filled one and choose **Replace**. This opens the **Messages** screen in its normal Direct / Channels / Rooms browse; pick an entry and you land back on the dial with that slot filled. It's the same list you already use to open a conversation, rather than a second browser of its own. - -| OLED | E-Ink | -| :------------------------: | :------------------------: | -| ![](./picker_oled.png) | ![](./picker_eink.png) | - - - -**From the Messages lists** — **Hold Enter** on a contact, room or channel entry › **Pin to dial**, then choose a slot from the slot picker (Slot 1–6, showing the current occupant or "empty"). - -**From Tools › Nodes** — **Hold Enter** on a node › **Pin to dial**. This one doesn't ask which slot; it takes the first free one (and says which), since that menu is already long. - -If the target is already pinned in another slot, it is moved to the new slot automatically. - ---- - -### Unpinning - -**From the Favourites Dial** — **Hold Enter** on the tile › **Unpin**. - -**From the Messages lists or Tools › Nodes** — **Hold Enter** › context menu › **Unpin (slot N)**. - ---- - -### Pinning is not the same as favouriting - -A pinned tile and a **Fav: ON** entry are two independent things. Pinning puts something on this page. Favouriting marks it with a ★ and sorts it to the top of every list it appears in, and is what the **Settings › Contacts** list filters read. Either can be used without the other. - ---- - -### 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. diff --git a/docs/solo_features/favourites_dial/overview_eink.png b/docs/solo_features/favourites_dial/overview_eink.png deleted file mode 100644 index f0335d060fd083e16f9ab12f5c8604e6b202679f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4234 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 diff --git a/docs/solo_features/message_screen/ctx_channel_eink.png b/docs/solo_features/message_screen/ctx_channel_eink.png deleted file mode 100644 index 19bbf07b3a954d69a235835cf4450210c3423c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4842 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 diff --git a/docs/solo_features/message_screen/ctx_contact_eink.png b/docs/solo_features/message_screen/ctx_contact_eink.png deleted file mode 100644 index 37adf864f2f69529fe5fd7169578bfca68a57ad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7632 zcmc&(eOQy{)yGkFwsUr~s~;2G`}Tu(IBRW&F@z*mTbZpRvj`EzFsn_p6eC86`9#}J zw-&>-B9{j8QJd8$0is5Q2uakorfNP+X%Z9iA)pBmk^oQ0LlQ#X$F`O`Ue|W@zwsyc zo%=cWIlps$zjN+?{G}j&?vsn3OiN3fyWvl-y_J?WV<0Upec(&!HfeYNntU z2?RpYSKb!6Z`7*k27&^mOv5WNvaAw-e>-VL9 z`SZPpPI{7ESDW2^H*uGW)MFWOrIf_h@x^1o%+WJN@jQCS6H8zOAN}@skM@(o9r+@w z7H??QB=^K8@3Sbedvdb2*_Jo7O-mrYRr%eq3$M+68u};`9Q@ulD6i{Y%u|dfx+v)0T~g zA((mq=W%#QKVEBOIWC9}cQPciB}{`pM=`v`*N_z|ztMw-%}FY;XKBsR(X#9xt=62^ zC0e-wR{<6syH8~})O5ZebYu6k3Fvdrx@j{!-}FyeHIa64x(EYb>4&%w>enPg--I<$ z@<6h{1bqK5!O8`3hum0IY&^=3DDp#o<1db7#G$jyXNYcFtstSgqR8+_=2K252b*G! z8X(k4^*?b?-WRk0ag@uUsV?-xYo{$(sf~U8vMHIL7sYLwzU(oRaPs)Au4fKq0Wq_? z`>nEBTi%=wnqKPbpo;4lzDB9(OROqMF3Iv-gIiw*c9@lK6ps(;-u z5U?>j5+sUM+fR3@O;egvpk*XOcF8+Mp-_QB`HhWyi6Es8NxD245?iecw;SSI0r1SJ zsAKDt%LrA$DsR_FHZ~%=>(TCnCk1cJ6LEok?}aK!vE3+CC!xwZaWkjIfp~jg=-dz| z*38WmEhk5l$CH5DA^KLD{G0A47GBDx75y7zuhG-qS-)zH*>ptv=V|vp4Q&$?cJ;@I zkvk-Hh(E5~@e(u#K6rgGW%%GM3YUln9gKuP(B7$N^>tX$0Z1lR-tqu8bBd6=l?*N; z*|ZQX-}FUrHG%z3xG^jIE-7Hr`|$62X^X2T)z^cjN?mdR?R4LdS?HCsoG9Nel6tB@ z!n#OpADSGtXt!UwoaHKkc9&II;9VAcXyPUAEwtVr_4dwuH8{9}=o)L564{y!9}viWHI2;JIg!V;pYIx^kDqOkgC z6a3cC07&>Ql0U)Qq6O?#{n;K?8K>+tU|uD^X@|$*OIYK5@iWtvKDDTyoWulOrd5+x z`|pthi!ksrYRB55o9o7mtYT3HZ%jBgM_b_>jGGoFjvZzI zHLZTIasjtFUp1sI7IE=Aa99erWk}Yv?)v`$@Mk%H%WYO{$B?F4*R!p(o~2#@B~iPp ztZ7g#&QtaotE%;@N~+38w!DfPUpI$L^|nQcnxPMw4=w_5*bwQM;RYcd$wa4tY4I4q z@+BDN^-}LL6#WdTl?u1`vO>3O7vIeXTocKJ`P7ANjf(x_WNEp$#3U1s9{dXWbuR~q zLMBef)zzD>c6F~SvlO~r3hfo|MlHJ`!`Izw03f!+*54N1$k6`+)2j*It+evOdDt#c zlkGw(aLXsev*GGx{twZA`H^IwhT>lGkRG+ra|aTsbm-xEoR5GK7Qh9~_B#!{0e*Zj zj)c#Jb{!z!(o;uUC0OAa;4*dY|6TL(^zWus69}S5`Vesr21R38T81*R%X>yO;^lKp zfOJ!;bvQ@5YjpC)d{(EFJ5r?IcJ%QCpapM|UAB#iNn=i^rPs&~bQneDWLK#9(yRZR zHsfSJ%c*Y?jK0#nZmHU+kGI7PX`qH&Vn&1yN`-=}_A9DSAJq(TQ=B@fQBkk-Aj%Hy zdg>VvJRrGO4{oH`1k{rHGY9p5YJVS zum}LhH6s*Yndfn$T!C#Ne^YQK=+((*<6Uwuwk`%W%7gx)T*g$qK|bzO83*)!fvr@X zIl%x=2|qhyE8wma&HXrf-jnFmJB!Dg{k6u+t86n@9|mHLKs6)Wco+>JseZW9)ImSp zW3RZk3;5(GxFDAPW>7e8wao$z?_w4IgYH}d0tiW)8zRi}Mn-xTaPAN7$)oy6kb8N0 zy-{<4U6JCy%W%gGP^doI|3e3p7t`M~t6m_PcuNxPa`Ee`9ud21YY$)Wa#oA)qW>zW zXOO7ZMflWMvoypWZ_J9jP;uqX3Rx@F+y3N4F>tr<3dS7V1LAn+GHy?|HJt`hM@J?a zHl5TmaW%QUjGrI;1aRMTEGLQkO_u3^o6iU%wXBP{)I69 zDHNo>Dc4p=BjT@^DX@Po<=@ZnCYgS#Y2VjU4F^60{j%FcF6pmTS+pL%4i;nQ#JQVsg z)y-l7^Fp(UEhDOTuDabr(Wcb^Sp)5^W9KWFmc_v?Ub|qCm1INGCWXs(D&HvZGYHW? z=;Z#EEAaftvne9sS0-Uscm4LNDHdfGJmAldJFvzEKO?o^_rJG7?)|(r;t!S129s_f z4w(c1q5Glk{7_*bM72W>U6=^c{thxEE$~9jr7ksVZtBRb708)JN4`n#X>hhPyraXZX4nfSgp9 zAS@OYj_yj1UK|%*HZj^Ts5-VqIGO>yl`X+0foYfC6cpR^lTRd8r=$bY+syjw@_&mP zB{vgpE_p#Np1=BvIEH~~Tut8@!6G}BoIGM;P^_4gPe@I|yw>)r{h|F0eT|IH*hT}t ztlZ)r1B*9OQkclhqZv|mDo}L8BE}T{p0SbWmIy9kYPgRTAELiXd`@iU`9v6%r2?ovvrHx z$b}?KT~{1Ca@nL#aZ)|5dlQzjx0X!J*V0bcsGApHP$!t-MwI`&35I<)LncXe&Acec zb^+YpG%Jt~j|qm1!rfq(kFdXI@F|IN9=FMy=!y*& zZ>KigqGjy^5r_=4NZf##2iJ2gE}RERTyui6%@e7BZ!-XRJgi6!0@OXM5o%)@vO8_c zA#%Y<6#aFgupTIhNWUXFAhR*I5)SAZwPzJvhi|47$T?1nZu=lgeCM|=oIJKI?igtW z7N0j&mW^{l;kWXA!r|aezR`#e*lUSo>bD}ya+K{b5mc+vn%O@+d3Pdn5yH`t3KM3D z+9S6SR5Vn%8}~sR5w~4|P8|dok>@}-T@jnbh(rt5+s-vJ2;DOGDC;D^;YhO`FR0sp z(ZjV6OD#GfrjWBXG-X^Y9=<6)cZ4YV+tCc*K+b!`H_r&%a0Aw+>h>=Q{9fDJ5^IiU z1TqLra(u4jxfB*XkIV>bBkM%%+#3Vbl~B)BeQ3VaCQz*a4e*+gRPsG(ob1W)T_Z-$ zYKHi{@E+eShITc7 z4q{3uxnU{ffp<}80h9!&zz;_hS>auwu!3L-X&?=QbwO_Yy&|UWHRe!x$%)NNYbIxhwq(3fP{ST$jugee0LLzv&vc2iO1a#-xyvpx?Y8(PS|umM zIUq78d4A4)GmL9hY#n3=@nw0e8;jgvt4cdxquyB%MynhWLCJj*K1a&QCvq&%Cc|%b zfK`b=3(hp19JKY&Ir9VnYSz~w4-nI}`Y|Uz6!n6rQL22E;yqkzJdi1J<Ggm2%-QI8Vq9rX?6h*1W^P6<)o_gwbYRn}~ zMlN!Z*B&Y_c+gX%{dmIZ0UmKS?k~QHUL@jjEa{g_P<&EG3_!cJJ-(>|Kuqx5*1}n5 zfI9UbD<(962*-sY(SC>WS>iU646i^YZl2esgQ7=&pP;c7t8Uk$)*p%kfPS9Z@Qh&o+!i1;9yTJ4+?A};2X((VhE-l(R?xI^zk_wJ z5ct{Tz?`4nAutbQ!uq@i*klBGm9eYE<`TEmZ&#CKt+P`eI}kA^AO}Rg^=&NABIMO- zywS`yKX)Yb*qEEq)ryQMyK62m<_V)sVDclgluoL6_^-GWo%}r8Njq6|fsI=ODo125 zP5jmQxc!r>RF?pIAS)esdqCK%YUTa(X*Z2P)k_o|8 diff --git a/docs/solo_features/message_screen/ctx_contact_oled.png b/docs/solo_features/message_screen/ctx_contact_oled.png deleted file mode 100644 index 478662d66d2231fe0c55867959c43c96a8ea9f62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/docs/solo_features/message_screen/fullscreen_eink.png b/docs/solo_features/message_screen/fullscreen_eink.png deleted file mode 100644 index 9f62b3d146782982260408773ea7aaa0ba2b48ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4032 zcmeAS@N?(olHy`uVBq!ia0y~yV0^*A!2E)P2`Dma?XMyR2L5(W7srr_IdAV?%v)k6 z(Qq-~>EHOus_@jUO00>-HS>zst;%we-1aNw@5fo|^?}+L7&301`*+~=*I)m;^KP#^ zFTeBL)M|^@&%eIkbFSyT>0`NdclZnL+B2_XJkZ-Bt>CtUF=^lXIY0Mh$Jr!rvwme| zyzlyo_ePH`nXg9{G9TeEcjzf#USsrl-FdzBXVTrzu5>>;>wMKATZYdO2uy!hKax4-KS{ma|Y4)>J9 znJ<#x-<-EUyL;aGH_yZV7dK8t3XY1flatq)RLgE{uR2y&`M?t4&!kVr?@q1xc0#A_ zO8L&>{eQgnCpT~*JUio0731eWQLgGTw7c`lTQm_m+8WN)+0WW<= z6T@g?7)=boX2@tp7!88aR4|$mKwXm2vVgilFysAZ`wh9b>;M0$+Us_o|A6}qy)9SZ z&3=V6Yolnx>ufWg=OnL1bQotA&dz4O^WLKxA$H0*uQ<2i`Hk#Nh<;j6?HvaGBzf}# zO+8)=pw8y8$~z4C&usD?SFjf zwfj2bV*c>Ib$`p_(vLomD&#l*&V1(g>$Yr$4{nEe1(feF7}~#|^Rq51Zcoy->g%Op zHS2cUo$h)sIV1fjMEVf#hbfZfwPlvZ^Y>=^)m~robCv8n#)#ux(h6=n7?WD0AH4j% z<9y94oxW3+Dn~27@Y(A>xW5K015z;0;_<%MXS(h_Tc~V&XZJa_ov(jaK9{)@sk%X3 zJFh|FAzO!FUW59%9o^^BPQ9OV{r$FdnF=<9%=Zcy;^b{~3;V?h2-LCjkaN0cAou8ju1@B3J5Eljv9*EYblHYIs*={E; zXZY!6efc-ro;Nr5yq@*`&hxtK-;2N2t&0=h*9bSr;mr9Hf2vaM?M-6)rKx=XVa*dqB>zdAeqj zN z#v4eUg9H{d%pA^KaeKM>?_J~bW-)(#4n4Z}VfQ}m2b<@FGJROu9tzLWQ|hdY zrbqt$B^aLmdaC3{zURjnes6dLj(K1Ls5n)5$5?CgW8?7jFX``PXZo)Hw{G3JFWvi@ z8}gIkG5q0+{*)3;Yb0MdaSn8{?nPBAA0HEcmC>mKiBd( z%RGc9A9ViSvHo05`3%AHXLi50TAbXz*=yauSnEG;8tga2-O>?RB=__Gww1!e)noEl4SUs$92o+rXR7sFKuuRof@XBE{F^ndL(Zm33C5>i;(I6O21)~`O)MFYg z3&;+F8S_`?Tl77iZ@)io{qFbd542^3b+;mV0G4iP+Rtt=ypG9T18>+L2u`~L6nk%e zDGt$U|I~9kMmj-0-FF*8^TvMZ1m$mq%r+AOIl(<7i+JGL)H^Z@-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 diff --git a/docs/solo_features/message_screen/fullscreen_oled.png b/docs/solo_features/message_screen/fullscreen_oled.png deleted file mode 100644 index 25b5630f8061b99d1f8f33026787aa830a743e1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1238 zcmeAS@N?(olHy`uVBq!ia0y~yU;;8388|?c*QZDW1_qY7o-U3d6?5L+y_k1LL4fsw z#i#%OKYd$UBof&wWl(Uwa@DG}+18=!)6yCrfBsp+IN|y4x6%v`WSJNgrZ6yYlwSMS z_}Jp#&zY}d7C!l`dcCrUf9tyI@|APt&R=~jH}4L=0lz4Ng9ammfENQpiUk_;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 diff --git a/docs/solo_features/message_screen/history_eink.png b/docs/solo_features/message_screen/history_eink.png deleted file mode 100644 index 748a3bd54f79a26c281a401e195c6555dbde456e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6183 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 rM{e~ The on-screen keyboard's default (Latin) page is ASCII only. Typing accented or non-Latin characters — Polish, Czech, Slovak, German, French, Spanish, Portuguese or Nordic diacritics, Cyrillic, or Greek — needs Settings › Keyboard › Alphabet set to the matching language first; the keyboard's **#@/abc** key then cycles Latin → that alphabet → Symbols → Latin. A password containing characters outside whatever's currently enabled can still be set from the phone app — the device stores and replays it byte-for-byte. - ---- - -### Message history - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./history_oled.png) | ![](./history_eink.png) | - -Messages appear as chat bubbles sized to their content — **right**-anchored for outgoing, **left** for incoming — with sender name and a compact age indicator (`3m`, `2h`, `>1d`) in the top-right corner. List runs **newest at the bottom**; opening a history starts at the latest message, scrolling up goes further back. The list wraps at both ends like every other list: **UP** at the oldest message jumps to the newest, and **DOWN** past the newest lands on the compose row and then wraps to the oldest. - -A tiny digit icon on a bubble is its hop count: on your own messages, how many repeaters echoed them back; on a **received** DM or channel post, how many hops it took to reach you. A received message always shows a time — if its timestamp is unknown or reads slightly ahead of this device's clock (sender/receiver clock skew, or the clock isn't synced yet), the receipt time is shown instead. In a channel history the title carries the channel's scope in brackets (`name [scope]`) whenever it is set to anything but `*`. - -**Short Enter** on a message opens it in fullscreen. **Hold Enter** — on a history row or in fullscreen — opens the same options menu: Reply, plus **Navigate** / **Save waypoint** / **Set as target** when the message contains a location, and **Path** / **Relayed by** when hop data is available (see Fullscreen message view). You don't need to open the message first. - ---- - -### Fullscreen message view - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./fullscreen_oled.png) | ![](./fullscreen_eink.png) | - -Navigate between messages like pages in a book — **LEFT** goes back to the older message, **RIGHT** forward to the newer one. The `<` / `>` markers along the bottom edge show which directions still have a message. 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 | -| :-----------------------: | :-----------------------: | -| ![](./fullscreen_menu_oled.png) | ![](./fullscreen_menu_eink.png) | - -**Hold Enter** in fullscreen opens the options menu. It always offers **Reply** for an incoming message, and when the message contains a **location** it adds three more: - -- **Navigate** — opens the bearing/distance view to those coordinates (the same two-bearing screen as Waypoints and Nearby; **Back** returns to the message). -- **Save waypoint** — stores the location as a waypoint (visible on the trail map and in the Waypoints list). -- **Set as target** — pins those coordinates as the active **Locator/Nav target** in one step, the same row Nodes and Waypoints offer (see Tools › Locator). - -A location is any `lat,lon` pair in the text — exactly what the `{loc}` placeholder inserts — so you can navigate to anything a contact shares. A `[WAY]lat,lon label` share also carries a name, used as the waypoint label. This works on DMs and channel messages, incoming or outgoing. - -When the entry has hop data recorded, the menu also adds one more row: - -- **Path (N hops)** — on a received message (DM or channel), lists every repeater the message actually travelled through to reach you, oldest hop first. -- **Relayed by (N)** — on your own channel post instead, lists every distinct repeater heard rebroadcasting it back into the mesh (order isn't meaningful here — each one heard it independently, not as a chain). - -Selecting the row opens a read-only list of the resolved hops — each shown as the matching contact's name where one is known, or a short `?AABB`-style hex tag for an unrecognised repeater. Only repeaters within range of the message's actual travel — or, for **Relayed by**, within your own device's radio range — can ever be identified this way; a message with no recorded path (e.g. a zero-hop send, or one sent before any repeater relayed or echoed it) doesn't show this row at all. - ---- - -### Context menu — contact list - -**Hold Enter** on a contact entry opens a context menu: - -> Rows that show a value (`Notif:`, `Melody:`, `Fav:`) are changed in place — **LEFT/RIGHT** steps the value and **Enter** advances it, with the menu staying open. Only **Back** closes the menu. The same rule holds in every context menu on the device. - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./ctx_contact_oled.png) | ![](./ctx_contact_eink.png) | - -| Item | Action | -| ---------------------------- | ------------------------------------------------------------------------------ | -| Mark as read | Clears unread counter for this contact | -| Notif: Default / OFF / ON | Per-contact notification override — **LEFT/RIGHT** or **Enter** to cycle | -| Melody: Global / M1 / M2 | Per-contact melody override — **LEFT/RIGHT** or **Enter** to cycle | -| Fav: ON / OFF | Mark this contact as a favourite — **LEFT/RIGHT** or **Enter** to toggle | -| Pin to dial / Unpin (slot N) | Pin this contact to a Favourites Dial slot; if already pinned shows which slot | - -**Fav** and **Pin to dial** are separate. **Fav** is the starred flag shared with the companion app: it marks the row with a ★, sorts it above the rest of the list (unless **Settings › Contacts › Favs top** is off), and drives the `DMs = Fav` list filter. **Pin to dial** puts the contact on the [Favourites Dial](../favourites_dial/favourites_dial.md) page and changes nothing about the list. - -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. - -In the **Rooms** list the context menu instead offers: - -| Item | Action | -| ------------- | ---------------------------------------------------------------------------- | -| Login… | Opens the password prompt to (re-)log in to this room (see Rooms — logging in) | -| Logout | Only shown once logged in. Forgets the saved password so the next open prompts for one again | -| Fav: ON / OFF | Mark this room as a favourite — **LEFT/RIGHT** or **Enter** to toggle; drives the **Rooms = Fav** list filter | -| Pin to dial / Unpin (slot N) | Pin this room to a [Favourites Dial](../favourites_dial/favourites_dial.md) slot | - ---- - -### Context menu — channel list - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./ctx_channel_oled.png) | ![](./ctx_channel_eink.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** or **Enter** to cycle | -| Melody: Global / M1 / M2 | Per-channel melody override — **LEFT/RIGHT** or **Enter** to cycle | -| Fav: ON / OFF | Add or remove this channel from favourites — **LEFT/RIGHT** or **Enter** to toggle | -| Scope: | **Enter** opens a picker over the shared scope list (Settings › Radio › Scope) — `*` sends this channel unscoped, any named scope tags its flood traffic with that region. Each channel keeps its own pick, matching the phone app's per-channel region picker. | -| Pin to dial / Unpin (slot N) | Pin this channel to a [Favourites Dial](../favourites_dial/favourites_dial.md) slot | -| Edit | Opens the Add/Edit form below, pre-filled with the channel's name | -| Delete | Removes the channel — confirms first (defaults to Cancel) | - ---- - -### Adding / editing a channel - -Joining or creating a community channel no longer needs the phone app. The **Channels** list ends with **"+ Add channel"** — **Enter** picks a channel type; **Edit** from the context menu changes an existing channel's name/secret directly, skipping the type picker. - -**+ Add channel** first asks which type to create — the same three the phone app offers: - -- **Public** — instantly re-adds the well-known default public channel, no fields needed. Useful if it was deleted and you don't remember its key. -- **Hashtag** — type a topic (e.g. `test`); name (`#test`) and secret (first 16 bytes of `sha256("#test")`) are both derived from it. A topic-based public chat — anyone typing the same topic elsewhere lands on the same channel, separate from the default Public one. -- **Private** — the manual Name + Secret form: - - | Field | Notes | - | ------ | ---------------------------------------------------------------------------------------------- | - | Name | Up to 31 characters | - | Secret | **LEFT/RIGHT** toggles between two entry modes; **Enter** opens the keyboard for whichever is selected | - - - **Passphrase** (default) — type any text; the device hashes it to the channel's 16-byte secret. Easiest to agree on verbally — same idea as a room password. - - **Hex key** — the exact 32-hex-character secret (channel QR code format, see [QR Codes](../../qr_codes.md)), for joining with a secret you were given rather than a new passphrase. An all-zero secret (`00…0`) is rejected — reserved internally for an empty slot. - - Select **[Save]** to commit. The secret can't be redisplayed once saved (only the derived key is kept) — editing later means typing a new one, same as re-logging into a room. - ---- - -### Mark all read - -**Hold Enter** on the DM / Channels / Rooms mode-select screen to clear all unread counters for the highlighted category at once. diff --git a/docs/solo_features/message_screen/overview_eink.png b/docs/solo_features/message_screen/overview_eink.png deleted file mode 100644 index dcd029aa601cf48207d67fdcb40221ae9537afc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4278 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 Q=NU-W)78&qol`;+0JRNs2><{9 diff --git a/docs/solo_features/screen_lock/screen_eink.png b/docs/solo_features/screen_lock/screen_eink.png deleted file mode 100644 index 227decc72969ac22b95727e1b83d66c1ce62e27d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4207 zcmeAS@N?(olHy`uVBq!ia0y~yV0^*A!2E)P2`Dma?XMyR1_3iq7srr_IdAVC%)4zR z;&AZA!vFtISKZdr3R$Hw@%X$*u}~BmzcIV#y_v8KMa}U;Un-|$P?{MhidAGA(KeQ~vrURt^T%mr-70WyRvFCOC=ST1V z^=tLo_U|_fnU8RoJM$`buVyz{ngp&)6(ZowVRb4KexR9*PXfA`5Pa@J!<%P-h)>%pU?dH zc&1j?J-+yPb$9vBnoE%{r`lU1hjH>T+nXysZ=P?my|&8kw`cLg!1BKOOYhH{Z$L3C z;fhY_wKuzsxYw=ue9rPq;QZe!taB^c5kYch+ow10rF(XDKkl6Q?BZ+tzt+aDaz0(X zUh}#3tkwSdXL28`Uq6&ZN?U1n4hYpVKR}KjV_+QNiY|%&&s7euDTx0(*YwWL^@s0X z+k+BrvortOKjF$Yn7!--a&XR0EPfdI`JL!BhWt&){!uIDKPi0XxF(9=vrWe7OS_Ff z8ow^_n{`0N(ZGL8L|9zFQ@qP33gZ?`{ z%Z2~GGk5xXq~`v~GdtYR8fvGv%&&-FeYUB8NA;8Y^FGgAFZs3lgf&uE)yVkWBIC`s zuBN?P++$^Z#(Lfl9k;tPH{W`_<^ZCjp=SJeU)8yir^ct#-v!wH`Ze`#<@@q?+V)j{ zudeyFbNx2CbDI&pkDF9 a|4}PBO%}D?Q3ehqFnGH9xvX@wZRoBYnQ|7x4Wjc2EfkJZ#N0yV+FZi{(x48?Pv|GZvr-mB#4=Ebhrm*;Qm z|KMlC-WiMxEkX{z&U((!5%9K_VRK(`>E8cqKCk_DhuJ=v4b^@m z=h(12v|N3CdF}dicRbcVyE}X4*8P88mA($Y>HhEj^~-;gSdB5m0TL{*@I?F+p!CmjJHJ|-}$*JY{$Phr=<_V!}rSbmy93kr)KXKef3Xy z>!(wu-{%<~=0LJ^Df@?_@Yg4lUq5~ShCSq6_nAwVSHF14erDJ8t5qsJ#>|N5sbY|h z*m&Ld^=I4pE4QiDKKT`5Jzdo8o$32Dq;UDdU}mt|?soB<*sO!vudZ*tC;8!8x%Zoj zcYkI}B4Y3obHo1?8{+=GdcXJAnd55=UkJZB%7aJ@FBuCWSD*VGvbJW)G~4X?OS9bW zNg8}Qm+~zM$tIDn4SM-+r>h{Gh#XQ4k9L{8Te0W-@2>Kt_kLCy_3p9${wnUj?eU-I z=Gi|k`)U2aGXb6euhyu4@W?GZ(lzUM@N*{Zs_@NyH?8)?h4UeW)7O_PnZs5ujFH?QB^Z6psgfKmTU^a(0FT z##r(zQhtHTzWOY>=lrp`)x5Rx%WeCv#oiXXF7q!1DU!FnXRKL%Zua9We^-7s6q&fI z%n}z@32whOWBaRfw%M1$Wi~%gcR#l}>g~R${mY+M_06en{r#@8`@11hw5)%{cxF}L zw<}reuPqB-A1yEW`NaFZtCp+PrLV1Nomjl4?7nS2N&)gJ)V3kA^j_?>8S5?9XKno? zR{i_W8>{}Bv}@ldSRuvYmDN=Y)~{BkhQIbaW0d{Y@_R&~e%f2l(6<)54N&cmiCrF3 zdA9nz+`F~s!_A7`DZls5kljBk>-*kY6*EpFV#I0cy*tjff;a94R`9DLr9)U@iB@)E fbP0l+XkKDT_cK diff --git a/docs/solo_features/settings_screen/homepages_eink.png b/docs/solo_features/settings_screen/homepages_eink.png deleted file mode 100644 index e07cfd88688da62af592cbdd559edfafd23b1fcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6849 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 diff --git a/docs/solo_features/settings_screen/homepages_oled.png b/docs/solo_features/settings_screen/homepages_oled.png deleted file mode 100644 index f580b5fbed231d9ea181674d70d22bff0d4fe715..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1815 zcmZXUc~DbV6vl5rK^d8#BkfQ$(4h`e1%(V1Swd<-fw2-rpobPwPcPxhnKg=uK6aW))vG<35_wfYb5eimaAT`~1aq81fyvP`9l6a0 zMF#+iF9F!I7SITA+YTB#e6S`(bcLC^2(k4Q!-w_l$ya}OxY4-|I2Hr2W{WX(95wxP zV(}C_&swy(DW7)=S0(hsTL7C70M2g!;EoDlPA0l8*^>E7Fa2c1l(-p=(l^-{SOxG~ zQN}#9V-OpnZRq#z9BOFD*o)giMkRTeuM}UNBOjn^o1?k~tU`+7kDVU|awM^MC?TA1 zr?P_;ny${zyp3Avy2^;?qNe0p6=Fm#_a8A#tG<}%gUf__Pe*K>okcMq}b%w zQO|`4br5sneyXhhuEfl<^nGbO{gfY#sWShMk;kn+7pI%-(K&D``yv&h9xo_Cv8gs^ z|BpxnkA&tw9K0?i%F9W9thtSmIvA2*`GQB;eDXNuX-t*RWFi8X8`pAL6a+oYq-2rM z!)_u*o)}A*qBOm6X18OK-4Ot8`2l&cP+grr)3d0PmT6;13s$n1jzxCw$Qo~8QEW~~ z@y*$s!l$P=cYKLMIA&Yp_P(W-FI_&l1@5nNY0I#Eihd z-Q6f@^Vd$KwLZ*(=dHdz?e;2d1U@$MYPB%Rr-8O&9%GHc7VMeOgYnEcThEXbk1TJt zmWAx;LOL)G`2rZn2|`0SvX?=-f_cN}-WipujsNFpV!&sO8qwJzPu!oOXabesMNi& zLI+dZk6i;m`Z=dv0!BIp&-aXe5SO=^HCNc;po29dmz6+~w2Sbbm|E`@FpAwHQVB;{ z`~{y;XJqUBXvaIaT=vQQKv(vt+E$#=vP9;qqje0TzmJE$5oW8XyGDz-E|jyR{&#=i zGDLSjS}GaU)LKbYt7;j;im9k*sOH`+!U?!cis>z?hGZ2VrT4M9L^KmvEXSRlgv-ywLW&YPl>>xhZt!=$p+10xh0|M zH6HbL!z}C54%=)KuqvLE-kVm!0$CvC!y)m1zL+i~4T!opi`yAp$L(r0-l3;0a-}j- z5;Acf!xO0WK53(_TzP$SYG4CF$TG|D$8tR8DiBWx1UNBoSUin*F_L-B; zR{pqjbYgeooPl=zAn3k7+1;8*|tgf>^huAx3}XWV#$4q f=aUoOzA^)zAb_#w=-K}PO9$?~ diff --git a/docs/solo_features/settings_screen/overview_eink.png b/docs/solo_features/settings_screen/overview_eink.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/docs/solo_features/settings_screen/overview_oled.png b/docs/solo_features/settings_screen/overview_oled.png deleted file mode 100644 index 63b0de666b89e34dc3e786d5f2336ae819e8baf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1707 zcmZXUdsLEl7{`C$E$yPKnNbbfTG@0LH;$dqz)Lo#>*C5ww_)vUaEeS9miXcY%}!_K z$+g;rm6~HanF_SwjR?g~t41m#MA8VbO?icsR00!T8DuBk+WXJ@zQ5mdp5OERJm25* zP3o4U`2kA<008roKS|sM0M_-10dw51l!={@0QeqGPK-}uUKoAQdFXz0kk8*&Z#$ib zuim~H-}%El;#)Cj|D5v0Wjyu?<`DjJ-k_93~7a?xssU(0b|14Y>Xbp5Yqst^#*ZkFd#@a zkDXI*@8GJlqE4(6RmO6^z;9R(JiC_yK>0^r%r*{daQCD4CWU5)jLiDe+%s7RK!QJD zr@D{A#eJ)^VpFad=N-%EnYtVlD^~U^7R*`oJcbGaFSW8xN60_6ij^CDK#)7@LRSG@ z0DnkLiQ}r*clsli2!l6IeHOLvV)V+h>>Aa&+)v;B$T#3c5^{LYN>V@Ee~DnwX_1(N zMVa}|J<<@AfCFT|)CYI8s)$fTywx}&e@v31>+fwf0IkF(eo`V3Wfc$Oj`!u{U6(ir z^hjZ8bog_PE}W_hn8u&|ESBc2@OC*oB5F%96Y8@XZ-6Y6x z=8rn`rzH~#(e3)D0grQDPSuuVhZ?LmiTggdsGz+DH9}+FQ@@~~>3Y1kz;?4SCezm0 zV0(S(=W_VSE_EIr^nQjqDTe^Y?l^`|Ijd`H0%p7Jrp|GNYC35~?-h?=J83sFMS$zJeC zWmZ3ZY^2iGIQXx@ADZcd->rQ@(YK>4R$u6QrTzqEut|%At4zzQxPay7NVBOnVA+$bJ*X=&{}_?r{C?J;qvoQarv%A5;BiVVQz~ zEo{vtiA%B1?B;GwHVtdy86xSWgv%ZW_qO2T21sTenQ4-k1vLdn_vMkoOi%e#J^|{E z5D=iva4o7eL)|wNGt?sjh6>6UeJ2eub4@#kWbH@gG+a?PU-t$dZT=xSrpxkWL%N1r zRHp2^X0(w;8R=bTAxdC_N63nE5;h)AMjmqPwj|b=czPmieQW&cSDL{JoouqVZQU*B z%T>yVnx~H%+G#Y9i$#T9OOAga&L<@3JWYFqnzYhjUIIQc%Hm)HQ5MP=UcOhjk4eO;jgSsl& z=P{a%4d$#5KZOh4uWfFrwzW_Q!fJ)BrSD)n7Rf-INvLvUG!QHq!EuWwjao}RdFp%N zNrl>GLAt&4(973ihw3~(Quz - -The **repeater** mode and its flood filters live on their own screen — see **Tools › Repeater**, including how it uses **Scope** above. - ---- - -### System - -| Setting | Options | Notes | -| ----------- | --------------------------------------------------- | -------------------------------------------------------------------------------------- | -| Name | keyboard entry (up to 31 chars) | This device's node name, shown to others and in every advert. **Enter** opens the keyboard pre-filled with the current name; applied and saved on submit | -| 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 | -| GPS pwr _(if GPS detected)_ | OFF / 1 min / 5 min / 15 min / 30 min / 1 h | **Battery saver.** Cycles GPS off between fixes; each wake waits up to 60 s for a fix before sleeping again. Stays continuously on whenever something needs a live position — Trail recording, Live share, an armed Locator, Compass/Nearby, or an in-flight `!gps fix`. `OFF` (default) = always-on, as before. Status icon blinks while napping. | -| Units | Metric / Imperial | Global unit system for every distance/speed shown in Tools (Nearby Nodes, Trail, navigate-to-point). Metric: m / km, km/h, min/km. Imperial: ft / mi, mph, min/mi | -| Reboot | action (**Enter**) | Restarts this device. Pending setting changes are saved first. Last row, so it isn't the default-selected one | - ---- - -### Keyboard - -| Setting | Options | Notes | -| -------- | ---------- | -------------------------------------------------------------------------------------------------- | -| Layout | ABC / T9 | On-screen keyboard style. **ABC**: a-b-c…z grid, one key per letter. **T9**: phone-keypad multi-tap — each key labelled digit+letters (e.g. `2abc`); repeated **Enter** cycles the letters then the digit. Applies to whichever script page is active, not just Latin. | -| Main | Latin / Cyrillic / Greek | Which script the keyboard opens on by default. **Latin** is the default; picking **Cyrillic** or **Greek** makes that the one you land on, with Latin moving to the Additional cycle instead. | -| Additional | Latin / Cyrillic / Greek | The second script in the **#@/abc** key's cycle (Main → Additional → Symbols → Main). Setting it to the same script as Main drops the cycle to just that script plus Symbols. **Greek** covers the 24-letter alphabet plus final sigma (`ς`), not the tonos stress accents. Every script renders natively via one shared Unicode font — no separate toggle needed. | -| Ext. KB | Full / Compact | Only shown on a build with CardKB support (`CARDKB_I2C` or `ENV_PIN_SDA`/`ENV_PIN_SCL` set). Picks how the on-screen keyboard behaves while a CardKB is doing the typing — see [External Keyboard & Joystick](../external_keyboard.md#ext-kb--full-vs-compact). | - -Applies to every on-screen text field (messages, waypoint labels, room passwords, preset names). - -European Latin-diacritic letters (Polish, Czech, Slovak, German, French, Spanish, Portuguese, Nordic, etc.) aren't separate alphabet pages — instead, **Hold Enter** on a plain Latin letter that has accented variants (`a c d e i l n o r s t u y z`) opens a one-row popup of its accents (e.g. holding `a` offers `á à â ã ä å ą`); **LEFT/RIGHT** picks, **Enter** inserts it, **Cancel** dismisses with no change. Holding a letter with no accented variants (e.g. `b`) does nothing. Works on whichever page is currently showing Latin, whether that's Main or Additional. - ---- - -### Contacts - -| Setting | Options | Notes | -| -------- | --------- | ------------------------------------------- | -| DMs | All / Fav | Show all chat contacts or only favourited ones | -| Channels | All / Fav | Show all channels or only favourited ones | -| Rooms | All / Fav | Show all room servers or only favourited ones | -| Favs top | ON / OFF | Sort favourites to the top of every list (default ON) | -| Expire | Off / 7d / 30d / 90d | Age after which a contact with no advert/update counts as inactive (default Off). Only used by **Prune now** — nothing is ever deleted automatically. | -| Prune now | action (**Enter**) | Counts the contacts older than **Expire**, then asks `Remove N contacts?` (defaults to Cancel) before deleting anything. Shows `Expire is Off` / `No inactive contacts` instead when there is nothing to do. | - -Favourites are set per item in its context menu (**Hold Enter** › **Fav: ON / OFF**) — see [Message Screen](../message_screen/message_screen.md), and the same row exists in Tools › Nodes. A contact's or room's favourite flag is the same one the companion app shows as a starred contact, so it syncs both ways; a channel's is device-only. - -A favourite is marked with a ★ on its row wherever it is listed, and — unless **Favs top** is off — sorted above everything else. The three filters above are independent of that: they control what's *listed at all*, the sort only controls the order. - -**Pruning.** A contact is inactive when its last advert/update is older than **Expire**. **Favourites are never pruned**, and neither is a contact with no timestamp or one that reads ahead of the device's own clock (e.g. the clock isn't set yet) — the rule only ever errs on the side of keeping data. - ---- - -### Messages - -| Setting | Options | Notes | -| ------- | -------------- | ---------------------------------------------------------------------------------------------- | -| Resend | OFF / 1×–5× | Auto-resend an on-device direct message this many times when no delivery ACK is received (default 2×) | - -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). diff --git a/docs/solo_features/tools_screen/autoreply_eink.png b/docs/solo_features/tools_screen/autoreply_eink.png deleted file mode 100644 index 9499981ef08133cb23d55d824542c9ed10721e3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4665 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 diff --git a/docs/solo_features/tools_screen/nearby_ping_eink.png b/docs/solo_features/tools_screen/nearby_ping_eink.png deleted file mode 100644 index 78fb3f6b10c4664fe9359479ae3dc40e9d9a4438..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4762 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 t4&6&X!YFK3cJcq@<xy(R zt(7Q`lE}K9g+LMoX-v{2%+Q4zAwfupfrMLRCFDgU5KPoN|K5Ef_m0mO;osj%RHWQnoIjO;$xSH?cAw)h7!0@D@d=faYo8q;ZMs};XO1Hp*^aAgw!v|}nl02E1nPBynKZUu*XEb7^T zDZ)CP?DL&HdF*TC1^_td3s921fcF|BDXrxlFQpUD(D0>eH}XW5%xODjDKpL!W(^Sg z5e(QMf%lIv3q_$ed`>!+eSpq1b+86X-g1ZyMG9SJy;dZco91mE^>dz^?_cK$?kW01 zPp)R~&zXfLkmjVPH!~_v2`{cCFX`TPsH_*zw>6>AA)~CJW8AzhyV^V%VB7Dt8o<}n z#NR)ZZE$;q_vtbJKm9L{Kg%~tz}Be<9D$N$x)*0?zF{rlr~}Sjmo9Zf0PD*Fa(^I+ zkAI!rjA&xj#|W>we#(2N>P@bHNfkE82wEQ!s4pwq%4X`2MH(GAZ0R`p^4go=_&QjSP zMZt`DZ(H#Tx`n8aWQC#Nu!X$nYlw&?LXzmm+gJFG=L<>h4$&8}gZjVu7+PurJDx;L&8`5H%|GV{pp;L4kfL1#B)4CG@~z$2T? zE2<6R8$<}q{Ym9ywV5yZ94&xAy-N3P%Hpm_2yUYYKNlW#8vskUTTeqg2sW=4)bYCv z))A(|yCffC!JrEbNfBep&-2kl=?^gu_@HF50e(o4`ItJ}X*U*_KA~$E4vF@mBZz0I zZW@M+5zXpVb(1EF!=Z+l1R}RZx4^r?oLu~hHmh26sZpGzMj5ghg1-v4_YOiDlB$Sc zoItQzGV~MUorO6#a}w8f;konvVC8OT({%9ucMWnR`$zLd8+km`#>^->307men48A~ zaG>Hra6WnqY<0gpi_ww9t^TGSIU|eS-LK*4+9UZT2nmf=fP&TI!P@sBxU8yUMdKXrJ2B9Iyq*$= zkrX#U7Z#y$oRF7Ow6jvar6x_?2Xgf!a`}`rV=Dw}Pj;-pkRMtuL`*p1s59)Bl$}Te zLdFh@5|9_j96mV?+dHcofuM~3GMd6{`E|U=kT$u9k-5$)7Wc6SUP&ZjalN20)F^416l$4#+9kY;KF=GU+rTQ;c!t~*LJ2sDkZ)*F!C;&jeKUG71 zMXbJTUT77MJr*$$u9S&)-b+#Nw+ zczmcl$~{xj{lGz-`D}rIQQ$0wk5Gvb5GHWpYxn*A{9Y2jmG-t2Ht(}WhQoz0+R{2EIUoas5TB}oQykz7nWWwE(agx!Lrmj2#aw8O43^pRRq z+VNV0lRX>hC8~p}l1EGNIH6HeJtkX0WgLQEAmc{J&z-tVF!O?F#)#5L@AnF(yNVf4 zo){~osUv5hThtQ?h{DiGqo(w)G+NaDh!>4~)4SzOIh}Ub+m&6hf1uoomP_0Z?xw}p z*&hb)GACQJT7=V_n!$O*nc_!~;iZkhy5&;R@^G`poMqUOrhp3+d(580b#WPIK&t!N zcA{6RpIfI*{Eq!owML`*`kQ+w*GjVYAgv;r*p%rojIQs{haJecTZs+4MJvzQ%C)HD s>$GP!Rl&BeS6=>qeg7j9?ti=tM4rF=&HaYczrMD{A4xpSKA3y?KQ5n){r~^~ diff --git a/docs/solo_features/tools_screen/overview_eink.png b/docs/solo_features/tools_screen/overview_eink.png deleted file mode 100644 index badff3b107bbc39c6f18addef2a2e780d2708174..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4558 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 [!TIP] -> Combined with **Auto-Advert** on the other device, Nearby Nodes becomes a passive location tracker — as long as the tracked device periodically broadcasts its GPS position, you can see its current distance and bearing without any manual interaction on either end. - ---- - -### Active Discovery (live scan) - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./nearby_scan_oled.png) | ![](./nearby_scan_eink.png) | - -**Options → Discover scan** sends a `NODE_DISCOVER_REQ`. Repeaters, sensors and room servers within zero-hop range respond immediately with name, type and signal data. This is not a separate screen — it is the **same list switched to a live-scan source**: the right-hand column shows **RSSI** instead of distance, and node detail shows the public key, signal data and contact status. - -Because it is the same list, all the same keys apply — **UP/DOWN** to navigate, **Enter** for detail, **Hold Enter** for the Options menu (where **Rescan** repeats the scan and **Ping** works exactly as on stored nodes). - -- **Cancel / Back** — return to the stored-nodes list - ---- - -## GPS Trail - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./trail_summary_oled.png) | ![](./trail_summary_eink.png) | - -Records your route in a RAM ring buffer (up to 512 points, sampled every 1 s). The track is **simplified as it's recorded** — a long straight stretch is kept as just its two endpoints while curves keep their detail (bounded to within the **Min dist** tolerance of the real path), so the buffer covers a far longer route than a flat point budget would suggest. Tracking runs in the background — a blinking **G** appears in the status bar. The trail survives display auto-off but is lost on reboot unless saved to flash first. - -> [!TIP] -> The **Map** view is also reachable directly from the home carousel — the **Map** page shows a live mini-preview (your position, trail, and tracked contacts) with a **north marker** and a bottom-left **scale tick**. The status line below reads `Track:N` (tracked-node count) and, when you have a fix and at least one tracked contact, an **arrow + distance** to the **nearest** one (e.g. `Track:3 →120m`). If a **Locator/Nav target** is set it's drawn as a **flag marker** (see **Locator**). Press **Enter** to open the full Trail Map; **Hold Enter** shares your position (see **Live Share**); **Back** returns home. - -A GPS fix indicator also sits in the top status bar, alongside the trail/auto-advert/repeater icons — boxed (lit) once the receiver has a valid fix, a plain glyph while still searching. It only appears on boards with GPS hardware and while **GPS** is turned on in Settings; it's hidden the rest of the time rather than sitting there empty. - -Cycle views with **LEFT / RIGHT**: - -| View | Content | -| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Summary** | 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; north arrow; square scale grid fitted to the map frame (toggle under **Hold Enter → Settings → Grid**, Map view only). Your **current GPS position**, all **waypoints**, and any **live-tracked contacts** (positions shared via Live Share) are always drawn — even with no trail recording — so the map is useful standalone. The active **Locator/Nav target**, if set, is drawn as a **flag** on top (folded into the frame so it's never off-screen). Point labels are auto-placed to avoid overlapping (a crowded cluster drops some labels rather than smearing them) | -| **List** | Per-point rows showing local time (HH:MM) and delta distance from the previous point; segment-start rows show `start`; scroll with **UP/DOWN** | - -| OLED | E-Ink | -| :-----------------------: | :-----------------------: | -| ![](./trail_map_oled.png) | ![](./trail_map_eink.png) | - -**Hold Enter** opens the **action menu**. It is two-level — a short main menu, plus **Trail file…** and **Settings…** submenus. **Cancel/Back** in a submenu returns to the main menu. - -**Main menu:** - -| Item | Action | -| --------------------- | --------------------------------------------------- | -| Start / Stop tracking | Begin or end a recording session. If **GPS is off**, choosing Start asks **"GPS is off — Enable GPS & start"** so a session can't silently run with nothing to record | -| Mark here | Drop a waypoint at the current GPS fix (see below) | -| Waypoints… | Open the waypoint list / navigation / add-by-coords | -| Track back | Retrace the recorded route back to its start (needs ≥2 points; see below) | -| Share my pos | Send your current position as a one-shot `[LOC]` message — pick a contact or channel (see **Live Share**) | -| Trail file… | Open the file submenu (below) | -| Settings… | Open the settings submenu (below) | - -**Trail file…** (only the operations that apply right now appear): - -| Item | Action | -| -------------- | ----------------------------------------------- | -| Save trail | Write RAM ring to flash (`/trail`) | -| Load trail | Restore flash trail into RAM | -| Export (live) | Stream live RAM trail as GPX 1.1 over USB Serial | -| Export (saved) | Stream saved flash trail as GPX 1.1 over USB Serial | -| Reset trail | Clear RAM ring and elapsed time — confirms first (defaults to Cancel) since there's no way back short of a prior **Save trail** | - -**Settings…** (values cycle with **LEFT/RIGHT** or **Enter**; shown only where they apply): - -| Item | Available | Action | -| ---------- | --------- | ------------------------------------------------------- | -| Min dist | always | Sample gate, 4 levels — metric: 5/10/25/100 m, imperial: 15/30/75/300 ft | -| Auto-pause | always | OFF / 1 / 2 / 5 min — auto-freeze the trail after a stop, resume on movement (see below) | -| Mark avg | always | OFF / 5 / 10 / 30 s — GPS averaging for **Mark here** (see Waypoints below) | -| Auto-save | always | OFF / ON — auto-write the live trail to flash on shutdown, so a **low-battery auto-shutdown** doesn't lose the route (see below) | -| Readout | Summary view | Summary shows Speed or Pace (in the global unit system) | -| Grid | Map view | Toggle scale grid on the map | - -(Trail file… appears only when a live or saved trail exists. Mark here needs a GPS fix; Waypoints is always available.) - -**Auto-pause** — when set, a recording trail automatically **pauses** after the device has stayed within ~15 m of one spot for the chosen delay: the elapsed timer and point sampling both freeze, and the map line breaks across the idle gap. It **resumes on its own** as soon as you move again. This keeps a stop (a break, a meal, parking) out of your distance and average-speed stats without you having to remember to stop and restart tracking. A paused trail is still "on" (the **G** marker keeps blinking) — the Summary **Status** row shows `paused`. The stop is detected with its own coarse movement gate, independent of **Min dist**, so GPS jitter while you're parked doesn't keep it awake. - -**Auto-save** — with this on (default off), the live trail is written to flash automatically when the device powers off, so a **low-battery auto-shutdown** no longer discards the whole route. It saves to the same `/trail` file as the manual **Trail file… → Save**, and only writes when the trail actually has points — an empty trail can't overwrite a previously saved one. - -### Track back - -**Hold Enter → Track back** retraces your recorded trail back to the start — useful in poor visibility or unfamiliar ground. It reuses the navigation view (distance + two absolute bearings; see *Waypoints › Navigating*), but walks the recorded breadcrumbs in reverse: snaps to the **nearest recorded point**, guides you to it, then advances to the next earlier point as you reach each one (within ~20 m). The header shows points remaining (`Back: 12 pt`), reading `Trail start` on the final leg; arriving shows `Back at start` and exits. **Cancel** leaves track-back at any time. Needs a trail with at least two points and a GPS fix; tracking doesn't need to still be running. - -### Waypoints - -A waypoint is a saved spot — your car, camp, a water source — that you can navigate back to later. Waypoints are **independent of the trail**: they live in their own flash file (`/waypoints`), survive a reboot, and are **not** cleared by *Reset trail*. Up to 16 can be stored — the Waypoints list header shows how many are in use (e.g. `WAYPOINTS 3/16`). - -**Dropping a waypoint** — **Hold Enter → Mark here**. This captures the current GPS fix and opens the on-screen keyboard for a short label (up to 11 characters — e.g. `CAR`, `CAMP`, `H2O`). Leaving it blank auto-names it `WP1`, `WP2`, … Marking works whether or not the trail is being recorded; it needs a GPS fix (otherwise it reports *No GPS fix*). - -**GPS averaging** — with **Settings → Mark avg** set (5 / 10 / 30 s), *Mark here* doesn't snapshot a single fix; it samples the GPS once a second for that window and stores the **mean** position, for a steadier mark than one instantaneous reading (handy for a precise spot — a cache, a car, a trailhead). A short screen shows the time left and the sample count while it runs; **Cancel** aborts. When the window closes it opens the label keyboard as usual. With **Mark avg = OFF** (the default) marking is instant. - -**Adding by coordinates** — open **Hold Enter → Waypoints** and select the **+ Add by coords** row (always the last entry in the list). This creates a waypoint without being there — no GPS fix required (handy for a meeting point or a spot read off a map). It opens a small form with three editable rows plus **Save**: - -| OLED | E-Ink | -| :------------------------: | :------------------------: | -| ![](./waypoint_add_oled.png) | ![](./waypoint_add_eink.png) | - - - - -- **Lat** / **Lon** — **Enter** opens the digit-by-digit scroll editor (the same widget as the radio frequency field): **LEFT/RIGHT** move the cursor between decimal places, **UP/DOWN** change the digit under it, **Enter** confirms. With the editor closed, **LEFT/RIGHT** on the row toggles the hemisphere — N/S for latitude, E/W for longitude. -- **Label** — **Enter** to type a name (blank → auto `WP`). -- **Save** — validates the range and stores the waypoint. Missing or out-of-range values report a brief error. - -**On the map** — saved waypoints show as a hollow diamond with the label's first two characters beside it. Waypoints and your GPS position are drawn continuously, even with no trail recording, so the Map view doubles as a live "you + your marks" view. With **no trail**, it auto-fits to waypoints and position; **with a trail**, it frames the route instead, clamping any out-of-frame waypoint to the nearest edge so a distant mark can't blow up the scale. - -**Navigating** — **Hold Enter → Waypoints** opens the list (each row shows the label and live distance). The list always begins with a synthetic **Trail start** row whenever a trail exists, so you can backtrack to where you began without having marked it. Select a row and press **Enter** to open the navigation view: - -``` - CAMP ← target label - 1.4 km ← distance to target - To: 145° SE ← absolute bearing to the target - Hdg: 090° E ← your current course over ground (-- when stationary) -``` - -| OLED | E-Ink | -| :------------------------: | :------------------------: | -| ![](./waypoint_nav_oled.png) | ![](./waypoint_nav_eink.png) | - - - -There is no magnetometer, so the screen shows two *absolute* bearings and you compare them: target at 145°, travelling at 90° → bear right. The **Hdg** line is derived from GPS movement (see Compass) and reads `--` until you move. A fourth line shows closing speed and **ETA** once you're actually approaching. **Back** leaves the view — it's the only key that does, on every navigate view. - -**Managing** — **Hold Enter** on a waypoint row offers **Rename** / **Delete** / **Send** / **Set as target** (the *Trail start* row is navigate-only). **Set as target** pins the waypoint as the active **Locator/Nav target** in one step (see **Locator**). Delete removes one at a time; there is no bulk clear. - -**Sharing** — **Send** hands the waypoint to the Messages screen: pick a contact or channel, and the message is pre-filled as `[WAY],