mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-11-02 19:02:00 +00:00
docs(solo): bring the docs up to date with the L1 refresh
- Home pages as they are now (Status, quick panels, Map page), the Status screen's tabs instead of Diagnostics / GPS / Sensors, lock clock Big / Compact and the hint on a key press, battery curve on L1 and L2, "+ Send" and a failed send, trail pin, vector map behind -D MAP_VECTOR. - Developer guide: drawScreenHeader, soft frames, InfoKit, TabBar, a status bar without blinking, toast and millis() rules; ui-core status; build flags (GPS_SKYVIEW, MAP_VECTOR, HIST_ARCHIVE added, ui-tiny-only ones out). - New simulator screenshots: the clock page and the Status page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+5
-4
@@ -19,7 +19,8 @@ still connects as with the stock firmware, over Bluetooth or USB.
|
|||||||
- **Nearby nodes**: who's around, signal and distance, ping, and remote
|
- **Nearby nodes**: who's around, signal and distance, ping, and remote
|
||||||
admin of your repeaters and rooms.
|
admin of your repeaters and rooms.
|
||||||
- **Tools**: clock with alarm, timer and stopwatch, a remote bot that answers
|
- **Tools**: clock with alarm, timer and stopwatch, a remote bot that answers
|
||||||
commands over the mesh, repeater mode, a ringtone editor, diagnostics.
|
commands over the mesh, repeater mode, a ringtone editor, and a status
|
||||||
|
screen with the radio, GPS, battery and mesh counters.
|
||||||
- **Screen lock** with an optional PIN.
|
- **Screen lock** with an optional PIN.
|
||||||
- **On the Wio Tracker L2**: an offline map, message history on the SD card,
|
- **On the Wio Tracker L2**: an offline map, message history on the SD card,
|
||||||
the SD card as a USB drive, updates over WiFi.
|
the SD card as a USB drive, updates over WiFi.
|
||||||
@@ -40,7 +41,7 @@ These docs mark the differences with notes like this:
|
|||||||
|
|
||||||
| OLED / e-ink | | Wio Tracker L2 |
|
| OLED / e-ink | | Wio Tracker L2 |
|
||||||
| :---: | :---: | :---: |
|
| :---: | :---: | :---: |
|
||||||
|  |  |  |
|
|  |  |  |
|
||||||
|
|
||||||
The joystick and keyboard devices share one interface, sized for small OLED
|
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
|
and e-ink screens. The Wio Tracker L2 has its own, built for a 320 × 240
|
||||||
@@ -49,11 +50,11 @@ history on the SD card and updates over WiFi.
|
|||||||
|
|
||||||
## Pages
|
## Pages
|
||||||
|
|
||||||
- [Getting started](./getting-started.md): controls, the home screen, the phone app, updates
|
- [Getting started](./getting-started.md): controls, the home screen and its quick panels, the phone app, updates
|
||||||
- [Messages](./messages.md): channels, direct messages, rooms, typing
|
- [Messages](./messages.md): channels, direct messages, rooms, typing
|
||||||
- [Contacts](./contacts.md): nearby nodes, favourites, remote admin
|
- [Contacts](./contacts.md): nearby nodes, favourites, remote admin
|
||||||
- [Navigation](./navigation.md): GPS, trail, waypoints, compass, sharing your location, the map
|
- [Navigation](./navigation.md): GPS, trail, waypoints, compass, sharing your location, the map
|
||||||
- [Tools](./tools.md): clock tools, bot, repeater, ringtones, diagnostics
|
- [Tools](./tools.md): clock tools, bot, repeater, ringtones, the Status screen
|
||||||
- [Settings](./settings.md): what is where
|
- [Settings](./settings.md): what is where
|
||||||
- [Screen lock](./lock.md): locking, auto-lock, PIN
|
- [Screen lock](./lock.md): locking, auto-lock, PIN
|
||||||
- [Hardware](./hardware.md): external keyboards and joysticks, e-ink, SD card, WiFi
|
- [Hardware](./hardware.md): external keyboards and joysticks, e-ink, SD card, WiFi
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ per-user. Listed here so the rest of this page can assume them.
|
|||||||
| `TRAIL_CAPACITY=<n>` | Points the GPS trail holds (16 B each). Default 512 for the nRF52's RAM; the L2 sets 32768 in PSRAM. At most 65535 (the save format's count). |
|
| `TRAIL_CAPACITY=<n>` | Points the GPS trail holds (16 B each). Default 512 for the nRF52's RAM; the L2 sets 32768 in PSRAM. At most 65535 (the save format's count). |
|
||||||
| `TRAIL_SIMPLIFY=0` | Keeps every trail sample instead of storing straight stretches as their two ends. For boards with the memory for it (the L2). |
|
| `TRAIL_SIMPLIFY=0` | Keeps every trail sample instead of storing straight stretches as their two ends. For boards with the memory for it (the L2). |
|
||||||
| `TRAIL_FIXED_MIN_DELTA_M=<m>` | A fixed distance between trail points instead of the Point spacing setting, which is then hidden (the L2: 5 m, against GPS jitter). |
|
| `TRAIL_FIXED_MIN_DELTA_M=<m>` | A fixed distance between trail points instead of the Point spacing setting, which is then hidden (the L2: 5 m, against GPS jitter). |
|
||||||
| `UI_SENSORS_PAGE=1` | Enables the on-device sensors dashboard page. |
|
| `UI_SENSORS_PAGE=1` | Only the default Home page order in the solo UI: sensor readings are on the Status screen's Power tab whenever the board has sensors. |
|
||||||
| `BLE_PIN_CODE=<n>` | See below — not a plain fixed value in practice. |
|
| `BLE_PIN_CODE=<n>` | See below — not a plain fixed value in practice. |
|
||||||
| `DISPLAY_CLASS=<Class>` | Selects the display driver (e.g. `SSD1306Display`, `GxEPDDisplay`, `ST7789Display` — see `src/helpers/ui/` for the full set). Fixed by whatever panel the board actually has; only relevant if you're wiring on a *different* display than stock, in which case the matching driver's `.cpp` also needs adding to `build_src_filter`. |
|
| `DISPLAY_CLASS=<Class>` | Selects the display driver (e.g. `SSD1306Display`, `GxEPDDisplay`, `ST7789Display` — see `src/helpers/ui/` for the full set). Fixed by whatever panel the board actually has; only relevant if you're wiring on a *different* display than stock, in which case the matching driver's `.cpp` also needs adding to `build_src_filter`. |
|
||||||
|
|
||||||
@@ -56,7 +56,6 @@ existing `solo/<board>/platformio.ini` for what's already claimed).
|
|||||||
| `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). |
|
| `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_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_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. |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -75,9 +74,7 @@ existing `solo/<board>/platformio.ini` for what's already claimed).
|
|||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `ENV_INCLUDE_GPS=1` | Compiles in GPS support (NMEA parsing, location provider) at all. |
|
| `ENV_INCLUDE_GPS=1` | Compiles in GPS support (NMEA parsing, location provider) at all. |
|
||||||
| `GPS_BAUD_RATE=<n>` | Baud rate for the GPS module's serial link (`Serial1`). Match your module's default. |
|
| `GPS_BAUD_RATE=<n>` | Baud rate for the GPS module's serial link (`Serial1`). Match your module's default. |
|
||||||
|
| `GPS_SKYVIEW` | Keeps every satellite in view (constellation, elevation, azimuth, signal) for the Status screen's Sky tab and the L2's GPS app (~1.5 KB RAM). Set on the Wio Tracker L1 and L2. |
|
||||||
`PIN_GPS_SWITCH` (above) is independent of both — it's a hardware kill switch
|
|
||||||
layered on top of GPS support, not a requirement for it.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -90,7 +87,6 @@ layered on top of GPS support, not a requirement for it.
|
|||||||
| `ENABLE_SCREENSHOT` | Lets the site's [USB tools](https://solo.marekzegarek.com/#pc-tools) (or `tools/screenshot.py`) capture the screen over USB. A colour screen (the L2) renders a fresh frame and sends it as RGB565. |
|
| `ENABLE_SCREENSHOT` | Lets the site's [USB tools](https://solo.marekzegarek.com/#pc-tools) (or `tools/screenshot.py`) capture the screen over USB. A colour screen (the L2) renders a fresh frame and sends it as RGB565. |
|
||||||
| `KEEP_DISPLAY_ON_USB` | Refreshes the auto-off deadline continuously while externally (USB) powered, so the auto-off timer only starts counting once power is actually removed. Off by default because OLED panels burn in quickly with a permanently-lit screen — only worth enabling for an LCD/e-ink target, or a display you don't mind replacing. |
|
| `KEEP_DISPLAY_ON_USB` | Refreshes the auto-off deadline continuously while externally (USB) powered, so the auto-off timer only starts counting once power is actually removed. Off by default because OLED panels burn in quickly with a permanently-lit screen — only worth enabling for an LCD/e-ink target, or a display you don't mind replacing. |
|
||||||
| `AUTO_OFF_MILLIS=<ms>` | How long the display stays on before auto-off. Default 15000 (15s); `0` disables auto-off entirely. |
|
| `AUTO_OFF_MILLIS=<ms>` | How long the display stays on before auto-off. Default 15000 (15s); `0` disables auto-off entirely. |
|
||||||
| `UI_RECENT_LIST_SIZE=<n>` | How many entries the recent-activity lists show before scrolling. Default 4. |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -116,4 +112,6 @@ values above that are set from the phone app or the CLI.
|
|||||||
| Flag | Meaning |
|
| Flag | Meaning |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `ADVERT_NAME='"name"'` | Sets the default node name baked into a fresh device, instead of the hex of the first 4 bytes of its public key. Note the doubled quoting — it's a C string literal passed through a build flag. |
|
| `ADVERT_NAME='"name"'` | Sets the default node name baked into a fresh device, instead of the hex of the first 4 bytes of its public key. Note the doubled quoting — it's a C string literal passed through a build flag. |
|
||||||
|
| `MAP_VECTOR` | Wio Tracker L2: turns on the unfinished vector map (regions from `tools/maps/osm_vector.py`). Without it the vector map stays off whatever was saved. |
|
||||||
|
| `HIST_ARCHIVE` | Wio Tracker L2: message history also kept on the SD card (`ui-lvgl/HistoryStore.h`). Set in its solo build. |
|
||||||
| `MESHCORE_VERSION='"x.y"'` | Overrides the upstream MeshCore base-version string shown in diagnostics, for boards whose port hasn't been rebased onto the latest yet. Cosmetic only — doesn't change protocol behaviour. |
|
| `MESHCORE_VERSION='"x.y"'` | Overrides the upstream MeshCore base-version string shown in diagnostics, for boards whose port hasn't been rebased onto the latest yet. Cosmetic only — doesn't change protocol behaviour. |
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -63,7 +63,9 @@ public:
|
|||||||
Only screens needing a *parameter* at entry add a typed call after it (e.g.
|
Only screens needing a *parameter* at entry add a typed call after it (e.g.
|
||||||
`gotoRingtoneEditor` → `selectSlot(slot)`, `gotoMapScreen` → `showMapView()`).
|
`gotoRingtoneEditor` → `selectSlot(slot)`, `gotoMapScreen` → `showMapView()`).
|
||||||
4. Reach it from somewhere — usually a row in `ToolsScreen.h` (add an `Action`
|
4. Reach it from somewhere — usually a row in `ToolsScreen.h` (add an `Action`
|
||||||
enum value, a row in the right section table, and a `dispatch()` case).
|
enum value, a row in the right section table, and a `run()` case). The
|
||||||
|
Tools home page lists the last two tools used; give the new one a state
|
||||||
|
in `HomeScreen::toolState()` (`UITask.cpp`) if it has one worth showing.
|
||||||
|
|
||||||
That's the whole contract. Steps 1, 3 and 4 are compiler-checked (a mismatch
|
That's the whole contract. Steps 1, 3 and 4 are compiler-checked (a mismatch
|
||||||
won't link); only a forgotten step 2 can slip through — every screen pointer is
|
won't link); only a forgotten step 2 can slip through — every screen pointer is
|
||||||
@@ -95,14 +97,19 @@ pixel sizes** — derive everything from these:
|
|||||||
|
|
||||||
Drawing helpers (all clip/measure for you):
|
Drawing helpers (all clip/measure for you):
|
||||||
|
|
||||||
- `drawCenteredHeader(title, menu_hint=false, menu_open=false)` — plain centered
|
- `drawScreenHeader(d, title, page=-1, pages=0, menu_hint=false, menu_open=false)`
|
||||||
title + separator.
|
(`ui-new/icons.h`) — every screen's title bar: the title (title case, no
|
||||||
- `drawInvertedHeader(label, menu_hint=false, menu_open=false)` — filled title
|
icon) centred over the separator, page dots at the right for a screen with
|
||||||
bar (used by detail views).
|
views (`page` of `pages`, e.g. Trail's Summary / Map / List), and the `≡`
|
||||||
- Both take an optional `menu_hint`: pass `true` on a screen with a Hold-Enter
|
hint when the screen has a Hold-Enter menu, so the menu is discoverable
|
||||||
context menu to reserve a `≡` glyph (`menuHintWidth()`/`drawContextMenuHint()`)
|
without knowing the shortcut; `menu_open` highlights it while the menu is
|
||||||
in the header, so the menu is discoverable without already knowing the
|
up. A title too long to centre goes left and ends in an ellipsis.
|
||||||
shortcut; `menu_open` highlights it while the menu is actually up.
|
- `drawInvertedHeader(label, menu_hint=false, menu_open=false)` — a filled
|
||||||
|
title bar, kept for the node detail and Navigate views.
|
||||||
|
- `drawSoftRect` / `fillSoftRect` — a box with its corner pixels left out;
|
||||||
|
every frame and fill in the UI uses them (selections, pills, buttons).
|
||||||
|
`drawPanel(x, y, w, h)` is a box floating over the view (alert, popup,
|
||||||
|
hint): it clears a 1 px moat, fills dark and draws the soft border.
|
||||||
- `drawSelectionRow(x, y, w, h, sel)` — the highlight bar behind a list row.
|
- `drawSelectionRow(x, y, w, h, sel)` — the highlight bar behind a list row.
|
||||||
- `drawTextEllipsized(x, y, max_w, str, selected=false)` — truncates with `…`;
|
- `drawTextEllipsized(x, y, max_w, str, selected=false)` — truncates with `…`;
|
||||||
**use this for any user string** (names, labels) so long/UTF-8 text can't
|
**use this for any user string** (names, labels) so long/UTF-8 text can't
|
||||||
@@ -160,6 +167,8 @@ calculator (`scrollIndicatorReserve`) are exposed for hand-laid lists.
|
|||||||
| `DigitEditor` | `DigitEditor.h` | scroll-edit one number, digit by digit |
|
| `DigitEditor` | `DigitEditor.h` | scroll-edit one number, digit by digit |
|
||||||
| `FullscreenMsgView` | `FullscreenMsgView.h` | scrollable full-message reader + word wrap |
|
| `FullscreenMsgView` | `FullscreenMsgView.h` | scrollable full-message reader + word wrap |
|
||||||
| `NavView` | `NavView.h` | bearing/distance/ETA "navigate to a point" view |
|
| `NavView` | `NavView.h` | bearing/distance/ETA "navigate to a point" view |
|
||||||
|
| `TabBar` | `TabBar.h` | a row of tabs: the current one a soft pill, whole tabs only, ◂ ▸ where more are off screen |
|
||||||
|
| `info::` rows and blocks | `InfoKit.h` | settings rows, data screens (below) |
|
||||||
|
|
||||||
All follow the same shape: a `begin(...)` to open, an `active` flag, a
|
All follow the same shape: a `begin(...)` to open, an `active` flag, a
|
||||||
`handleInput(c)` returning a small `Result` enum, and a `render()`/`draw()`.
|
`handleInput(c)` returning a small `Result` enum, and a `render()`/`draw()`.
|
||||||
@@ -211,6 +220,24 @@ to pick, Enter to insert via the shared `insertGlyph()` helper, Cancel to
|
|||||||
dismiss. Holding a letter with no variants, or any T9/alt-alphabet/symbols
|
dismiss. Holding a letter with no variants, or any T9/alt-alphabet/symbols
|
||||||
cell, is a no-op.
|
cell, is a no-op.
|
||||||
|
|
||||||
|
**InfoKit** (`ui-new/InfoKit.h`, namespace `info`) is the shared look of
|
||||||
|
settings and data screens. Rows (drawn after `drawRowSelection()`, in its
|
||||||
|
ink): `valueRow(d, y, label, value, sel, reserve, x0)` — label left, value
|
||||||
|
flush right with its unit after a space ("50 m"), cut and marquee-scrolled
|
||||||
|
when selected; `switchRow` — a yes/no setting as an on/off switch
|
||||||
|
(`toggle()`); `listRow` — picks between the two for a formatter that returns
|
||||||
|
exactly "ON" / "OFF". `rowWrapped` gives a long value its own line instead of
|
||||||
|
an ellipsis nobody can scroll. Blocks for data screens: `section` (a centred
|
||||||
|
"··· Font ···" divider), `meter`, `battery`, `chip`, `big` (a 2× number with
|
||||||
|
its unit), `History<N>` + `spark` (a sparkline), `rule` / `vrule`. `Flow`
|
||||||
|
places blocks top-down, skips the ones scrolled off and tells whether more
|
||||||
|
are below, which gives the scroll indicator for free (see `StatusScreen.h`).
|
||||||
|
|
||||||
|
Other drawing helpers in `icons.h`: `drawButton` (a push button, soft pill,
|
||||||
|
filled while selected), `drawDisclosure` (▸ / ▾ on an accordion section),
|
||||||
|
`drawPageDots`, `drawLoadingDots` (the waiting animation), `drawSignalBars`
|
||||||
|
(SNR as four bars).
|
||||||
|
|
||||||
`FullscreenMsgView::wrapLines()` is a standalone pixel-accurate word-wrapper
|
`FullscreenMsgView::wrapLines()` is a standalone pixel-accurate word-wrapper
|
||||||
(O(n), variable-width-font aware) reusable by any multi-line layout; it writes
|
(O(n), variable-width-font aware) reusable by any multi-line layout; it writes
|
||||||
into the shared `s_wrap_trans` / `s_wrap_lines` scratch (single-threaded render,
|
into the shared `s_wrap_trans` / `s_wrap_lines` scratch (single-threaded render,
|
||||||
@@ -260,21 +287,19 @@ MINI_ICON(ICON_FOO, 5,
|
|||||||
```
|
```
|
||||||
|
|
||||||
Draw with `miniIconDraw(display, x, topY, ICON_FOO)` (auto-scaled & centered),
|
Draw with `miniIconDraw(display, x, topY, ICON_FOO)` (auto-scaled & centered),
|
||||||
`miniIconDrawTop` (exact placement), or the boxed/slot variants
|
`miniIconDrawTop` (exact placement), `miniIconDrawCentered`, or `drawSlotIcon`
|
||||||
(`drawBoxedIcon` = lit when active, `drawSlotIcon` = plain). Bigger page glyphs
|
(centred in a status-bar slot). Use icons sparingly: headers and the Tools
|
||||||
use `BIG_ICON` / `bigIconDraw`. The home status bar composes these right-to-left
|
list have none, the Home page row is the main place for them.
|
||||||
with a `blinkOn()` cadence for "leave it on and forget" broadcasts (auto-advert,
|
|
||||||
Live Share, trail, repeater) — follow that pattern when adding an indicator:
|
|
||||||
always shown on e-ink, blinking on OLED.
|
|
||||||
|
|
||||||
Icons are drawn from a fixed priority-ordered table (`HomeScreen::renderBatteryIndicator()`,
|
The home status bar (`HomeScreen::renderBatteryIndicator()`, `UITask.cpp`)
|
||||||
`UITask.cpp`); once the row runs out of horizontal space the loop just stops,
|
draws plain glyphs right to left from a fixed, priority-ordered table, with
|
||||||
so the lowest-priority icons silently drop first rather than the whole bar
|
no boxes and no blinking: each icon tells a state by its shape (Bluetooth only
|
||||||
crushing the node name. A blinking icon still reserves its width on the
|
while a phone is connected, the GPS reticle broken until a fix, a pin while
|
||||||
off-phase of its blink, so the row's layout can't visibly shift width as icons
|
the trail records). Once the row runs out of room the loop stops, so the
|
||||||
blink in and out.
|
lowest-priority icons drop first instead of the bar crushing the time. Add an
|
||||||
|
indicator as one more row in that table, at its priority.
|
||||||
|
|
||||||
Screens with a Hold-Enter context menu (Nodes, Bot, Admin, Diagnostics, …) pass
|
Screens with a Hold-Enter context menu (Nodes, Messages, Bot, Admin, …) pass
|
||||||
`menu_hint=true` to their header call (see §2) so a `≡` glyph advertises the
|
`menu_hint=true` to their header call (see §2) so a `≡` glyph advertises the
|
||||||
menu; `KEY_CONTEXT_MENU` (Hold-Enter) opens it.
|
menu; `KEY_CONTEXT_MENU` (Hold-Enter) opens it.
|
||||||
|
|
||||||
@@ -363,7 +388,13 @@ with `resolvePersonPos()` (live `[LOC]` share, else last-advertised fix).
|
|||||||
`chanctl::onRemoved()` (ui-core/ChannelControl.h). New per-contact or
|
`chanctl::onRemoved()` (ui-core/ChannelControl.h). New per-contact or
|
||||||
per-channel state should clear there too.
|
per-channel state should clear there too.
|
||||||
- **Toasts:** `_task->showAlert("msg", duration_ms)` overlays a transient banner
|
- **Toasts:** `_task->showAlert("msg", duration_ms)` overlays a transient banner
|
||||||
over any screen; no redraw plumbing needed.
|
over any screen (not over the keyboard); no redraw plumbing needed. Use one
|
||||||
|
only for what the screen doesn't already show: a failure ("Send failed",
|
||||||
|
"Contacts full") or an outcome somewhere else. No echo of an action whose
|
||||||
|
result is in view ("Sent", "Deleted", "Counters reset").
|
||||||
|
- **Time:** `millis()` wraps after ~49.7 days. Compare deadlines as
|
||||||
|
`(int32_t)(millis() - deadline) >= 0`, never `millis() >= deadline`, and use
|
||||||
|
0 as "now / none" (`UITask::refreshDue()`, `alertShowing()`).
|
||||||
- **Strings:** always `strncpy`+NUL or `snprintf`; treat every name/label as
|
- **Strings:** always `strncpy`+NUL or `snprintf`; treat every name/label as
|
||||||
untrusted-length and render through `drawTextEllipsized`.
|
untrusted-length and render through `drawTextEllipsized`.
|
||||||
|
|
||||||
@@ -374,7 +405,8 @@ with `resolvePersonPos()` (live `[LOC]` share, else last-advertised fix).
|
|||||||
```cpp
|
```cpp
|
||||||
// ui-new/MyToolScreen.h — included by UITask.cpp near the other screens
|
// ui-new/MyToolScreen.h — included by UITask.cpp near the other screens
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "icons.h" // drawList + mini-icons
|
#include "icons.h" // drawList, drawScreenHeader, mini-icons
|
||||||
|
#include "InfoKit.h" // valueRow / switchRow
|
||||||
#include "../NodePrefs.h"
|
#include "../NodePrefs.h"
|
||||||
|
|
||||||
class MyToolScreen : public UIScreen {
|
class MyToolScreen : public UIScreen {
|
||||||
@@ -389,13 +421,15 @@ public:
|
|||||||
|
|
||||||
int render(DisplayDriver& d) override {
|
int render(DisplayDriver& d) override {
|
||||||
d.setTextSize(1);
|
d.setTextSize(1);
|
||||||
d.drawCenteredHeader("MY TOOL");
|
drawScreenHeader(d, "My tool");
|
||||||
|
int next = 500;
|
||||||
drawList(d, ROWS, _sel, _scroll, [&](int i, int y, bool sel, int reserve) {
|
drawList(d, ROWS, _sel, _scroll, [&](int i, int y, bool sel, int reserve) {
|
||||||
drawRowSelection(d, y, sel, reserve);
|
drawRowSelection(d, y, sel, reserve);
|
||||||
d.setCursor(4, y);
|
static const char* const L[ROWS] = { "Alpha", "Bravo", "Charlie" };
|
||||||
d.print(i == 0 ? "Alpha" : i == 1 ? "Bravo" : "Charlie");
|
const int m = info::valueRow(d, y, L[i], "50 m", sel, reserve); // value flush right
|
||||||
|
if (m > 0 && m < next) next = m; // a marquee moving
|
||||||
});
|
});
|
||||||
return 500;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool handleInput(char c) override {
|
bool handleInput(char c) override {
|
||||||
|
|||||||
@@ -26,10 +26,26 @@ combinations), Enter and Esc. [Hardware](./hardware.md) has the key maps.
|
|||||||
## Home screen
|
## Home screen
|
||||||
|
|
||||||
The home screen is a row of pages. On joystick devices, **Left / Right** steps
|
The home screen is a row of pages. On joystick devices, **Left / Right** steps
|
||||||
through them and **Enter** opens the one shown:
|
through them (on Favourites it moves between the slots first). The default
|
||||||
|
order:
|
||||||
|
|
||||||
Clock, Recent, Radio, Bluetooth, Advert, GPS, Sensors, Tools, Shutdown,
|
| Page | Shows |
|
||||||
Settings, Messages, Favourites, Map.
|
| ---- | ----- |
|
||||||
|
| **Clock** | The time, the date and up to three fields of your choice; Enter opens the clock tools |
|
||||||
|
| **Favourites** | Six slots for the conversations you open most ([Contacts](./contacts.md#favourites)) |
|
||||||
|
| **Status** | Radio, GPS, battery and mesh at a glance; Enter opens the [Status screen](./tools.md#status) |
|
||||||
|
| **Bluetooth** | Bluetooth on / off and the phone: connected, or the pairing PIN |
|
||||||
|
| **Advert** | Send an advert now, and the auto-advert interval |
|
||||||
|
| **Settings** | Brightness, GPS on / off, then all settings |
|
||||||
|
| **Map** | Your position, the trail, people sharing theirs and the target ([Navigation](./navigation.md#map)) |
|
||||||
|
| **Tools** | The two tools you used last with their state, then all tools |
|
||||||
|
| **Messages** | The two latest conversations with their unread counts, then all messages |
|
||||||
|
| **Shutdown** | Lock the screen, or hibernate (with the battery level) |
|
||||||
|
|
||||||
|
Most pages are **quick panels**: a few rows and a last one that opens the
|
||||||
|
full screen. **Up / Down** picks a row and **Enter** acts on it. A value row
|
||||||
|
(brightness, auto-advert) goes into editing: **Left / Right** change it while
|
||||||
|
you watch, **Enter** or **Back** keeps it.
|
||||||
|
|
||||||
Settings › Home Pages sets their order and hides the ones you don't use;
|
Settings › Home Pages sets their order and hides the ones you don't use;
|
||||||
Settings and Messages are always shown.
|
Settings and Messages are always shown.
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
+12
-4
@@ -6,14 +6,22 @@ messages still arrive, alarms still ring and the phone app still connects.
|
|||||||
## Locking and unlocking
|
## Locking and unlocking
|
||||||
|
|
||||||
**Hold Back and press Enter three times** within 3 seconds; the same locks
|
**Hold Back and press Enter three times** within 3 seconds; the same locks
|
||||||
and unlocks. A hint on the lock screen counts the presses. With a CardKB,
|
and unlocks. With a CardKB, **Fn+Esc** does it in one press.
|
||||||
**Fn+Esc** does it in one press.
|
|
||||||
|
|
||||||
**Settings › Display › Lock screen** locks the device whenever the screen
|
**Settings › Display › Lock screen** locks the device whenever the screen
|
||||||
turns off by itself.
|
turns off by itself.
|
||||||
|
|
||||||
The lock screen shows the time, the date and the first two of the Clock
|
The lock screen has the status bar on top and one of two looks, set in
|
||||||
page's fields, but not the device's name.
|
Settings › Display › **Lock clock**:
|
||||||
|
|
||||||
|
- **Big**: the time in large digits, the date, and how many messages are
|
||||||
|
unread.
|
||||||
|
- **Compact**: a smaller time with the date beside it, and the Clock page's
|
||||||
|
fields as rows below (unread messages too, if no field shows them).
|
||||||
|
|
||||||
|
The key that wakes the screen does nothing else, so a glance shows the data.
|
||||||
|
A key pressed on the lit lock screen brings up the unlock hint at the bottom
|
||||||
|
for a few seconds; it counts the presses. On e-ink the hint stays up.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> **Wio Tracker L2:** with **Lock screen** on (Settings › Display), waking
|
> **Wio Tracker L2:** with **Lock screen** on (Settings › Display), waking
|
||||||
|
|||||||
@@ -11,9 +11,10 @@ Unread counts show on each conversation, on the list and on the home screen.
|
|||||||
## Reading
|
## Reading
|
||||||
|
|
||||||
Open a conversation to see its history as chat bubbles: yours on the right,
|
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,
|
received ones on the left, newest at the bottom. Each bubble shows its age
|
||||||
its age and a small hop count: on a received message, how many repeaters it
|
and a small hop count: on a received message, how many repeaters it came
|
||||||
came through; on your own, how many repeaters were heard passing it on.
|
through; on your own, how many repeaters were heard passing it on. In
|
||||||
|
channels and rooms it also names the sender.
|
||||||
|
|
||||||
**Enter** on a message opens it full screen; **Left / Right** there pages to the
|
**Enter** on a message opens it full screen; **Left / Right** there pages to the
|
||||||
older and newer one.
|
older and newer one.
|
||||||
@@ -44,10 +45,12 @@ haven't read, its unread count gets a **+** (for example `48+`).
|
|||||||
|
|
||||||
## Writing
|
## Writing
|
||||||
|
|
||||||
Open a conversation and choose **[+ send]** (or Enter at the bottom of the
|
Open a conversation and choose **+ Send** (or Enter at the bottom of the
|
||||||
history). Pick a quick message or **Custom message** for the keyboard.
|
history). Pick a quick message or **Custom message** for the keyboard.
|
||||||
|
|
||||||
- **Quick messages**: ten of your own, edited in Settings › Messages.
|
- **Quick messages**: ten of your own, edited in Settings › Messages.
|
||||||
|
- If a message can't be sent, you stay where you were: the keyboard keeps
|
||||||
|
the text (its label reads **Not sent**), so you can send it again.
|
||||||
- **Placeholders** fill in live data when the message is sent:
|
- **Placeholders** fill in live data when the message is sent:
|
||||||
`{loc}` (your GPS position), `{time}`, `{batt}`, and the readings of any
|
`{loc}` (your GPS position), `{time}`, `{batt}`, and the readings of any
|
||||||
sensor the device has: `{temp}`, `{hum}`, `{pres}`, `{alt}`, `{lux}`,
|
sensor the device has: `{temp}`, `{hum}`, `{pres}`, `{alt}`, `{lux}`,
|
||||||
|
|||||||
+11
-7
@@ -7,7 +7,7 @@ hardware is needed. Distances and speeds follow Settings › System › Units
|
|||||||
## Trail
|
## Trail
|
||||||
|
|
||||||
**Tools › Trail** records your route in the background while you use the rest
|
**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
|
of the device (a pin in the status bar). Straight stretches are
|
||||||
stored as their two ends, so the 512 points cover a long route. **Left / Right**
|
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**
|
switches between the **Summary** (distance, time, speed or pace), the **Map**
|
||||||
(your route, waypoints, people sharing their position, the target) and the
|
(your route, waypoints, people sharing their position, the target) and the
|
||||||
@@ -110,9 +110,11 @@ in one step. The target shows as a flag on the map.
|
|||||||
|
|
||||||
## Map
|
## Map
|
||||||
|
|
||||||
The **Map** home page shows your position, the trail, waypoints, people
|
The **Map** home page shows a small map on the left (your position, the
|
||||||
sharing their position and the target. **Enter** opens the trail map;
|
trail, people sharing their position and the target) and four lines beside
|
||||||
**hold Enter** shares your position.
|
it: GPS, the trail's distance, live shares, and the distance to the target
|
||||||
|
(or the waypoint count when there is none).
|
||||||
|
**Enter** opens the trail map; **hold Enter** shares your position.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> **Wio Tracker L2:** a real map with offline tiles on the SD card. Drag to
|
> **Wio Tracker L2:** a real map with offline tiles on the SD card. Drag to
|
||||||
@@ -122,8 +124,10 @@ sharing their position and the target. **Enter** opens the trail map;
|
|||||||
> Downloaded areas can be renamed, refreshed or deleted.
|
> Downloaded areas can be renamed, refreshed or deleted.
|
||||||
> - **Live tiles**: with WiFi on, tiles for where you look are fetched and
|
> - **Live tiles**: with WiFi on, tiles for where you look are fetched and
|
||||||
> cached, up to the size set in Settings › Storage.
|
> cached, up to the size set in Settings › Storage.
|
||||||
> - **Vector regions**: whole regions as packs made with
|
> - **Vector regions** (only in a build with `-D MAP_VECTOR`, unfinished):
|
||||||
> `tools/maps/osm_vector.py`, copied to the card.
|
> 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
|
> 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.
|
> for the full map. The **Nodes** map is the same map with every node that
|
||||||
|
> has a position on it; Back returns to Nodes.
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ board supports are shown.
|
|||||||
|
|
||||||
| Section | What's there |
|
| 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 |
|
| **Display** | Brightness, auto-off, wake on message, lock screen, the lock clock's look and the [PIN](./lock.md), battery as icon / % / volts, time zone, clock format and seconds; 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 |
|
| **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 |
|
| **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 |
|
| **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 |
|
| **System** | Device name, low-battery shutdown, GPS power saving, units, the battery curve, reboot |
|
||||||
| **Keyboard** | ABC or T9 layout, the two scripts, CardKB mode |
|
| **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 |
|
| **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 |
|
| **Messages** | Automatic resend of direct messages, the ten quick messages |
|
||||||
@@ -27,12 +27,17 @@ A few notes:
|
|||||||
types the same name gets the same scope; it isn't encryption.
|
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
|
- **Low battery** shuts the device down at the voltage you choose, which is
|
||||||
also 0 % on the battery indicator.
|
also 0 % on the battery indicator.
|
||||||
|
- **Batt curve** sets the cell voltage at 0, 10 … 100 % for a battery that
|
||||||
|
doesn't follow the usual LiPo curve: **Left / Right** move a point by
|
||||||
|
10 mV, **Reset** goes back to LiPo. The current voltage is shown, so a point
|
||||||
|
can be set against what the battery reads.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> **Wio Tracker L2:** one list of pages:
|
> **Wio Tracker L2:** one list of pages:
|
||||||
>
|
>
|
||||||
> - **Device**: Display (including the lock and **Tap to wake**), Home apps,
|
> - **Device**: Display (including the lock and **Tap to wake**), Home apps,
|
||||||
> Power (battery, GPS), Sound (with the melody editor), Keyboard, Messages
|
> Power (battery, GPS, and the **Battery curve** as a chart whose points you
|
||||||
|
> drag), Sound (with the melody editor), Keyboard, Messages
|
||||||
> & contacts.
|
> & contacts.
|
||||||
> - **Connections**: Radio, Bluetooth, WiFi, GPS.
|
> - **Connections**: Radio, Bluetooth, WiFi, GPS.
|
||||||
> - **Map & data**: Map (trail, live sharing and arrival alert options),
|
> - **Map & data**: Map (trail, live sharing and arrival alert options),
|
||||||
|
|||||||
+27
-23
@@ -1,8 +1,10 @@
|
|||||||
# Tools
|
# Tools
|
||||||
|
|
||||||
On joystick devices, the tools are in **Tools**, grouped into Location, Comms
|
On joystick devices, the tools are in **Tools**, grouped into Location, Comms
|
||||||
and System. The navigation tools are on the [Navigation](./navigation.md)
|
and System; the Tools home page keeps the two you used last. The navigation
|
||||||
page, Nodes and Admin on [Contacts](./contacts.md).
|
tools are on the [Navigation](./navigation.md) page, Nodes and Admin on
|
||||||
|
[Contacts](./contacts.md); the [Status](#status) screen opens from its own
|
||||||
|
home page.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> **Wio Tracker L2:** the tools are apps on the home screen: Messages, Nodes,
|
> **Wio Tracker L2:** the tools are apps on the home screen: Messages, Nodes,
|
||||||
@@ -12,8 +14,9 @@ page, Nodes and Admin on [Contacts](./contacts.md).
|
|||||||
|
|
||||||
## Clock
|
## Clock
|
||||||
|
|
||||||
The **Clock** home page shows the time, the date and up to three fields you
|
The **Clock** home page shows the time with a bar under it that fills with
|
||||||
choose (hold Enter): battery, temperature, humidity, pressure, altitude
|
the seconds (Settings › Display › Clock seconds), 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
|
(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
|
messages. The time comes from GPS or the phone app; the time zone is in
|
||||||
Settings.
|
Settings.
|
||||||
@@ -73,7 +76,7 @@ it off; **Network = Current** relays on your own frequency instead.
|
|||||||
Optional filters keep a mobile repeater from adding noise: skip adverts, a
|
Optional filters keep a mobile repeater from adding noise: skip adverts, a
|
||||||
maximum hop count, **Yield** (let fixed repeaters go first), a minimum SNR,
|
maximum hop count, **Yield** (let fixed repeaters go first), a minimum SNR,
|
||||||
drop duplicates already relayed by someone else, and relay only your
|
drop duplicates already relayed by someone else, and relay only your
|
||||||
**scopes**. Diagnostics shows how much it forwards.
|
**scopes**. The Status screen's **Mesh** tab shows how much it forwards.
|
||||||
|
|
||||||
## Ringtones
|
## Ringtones
|
||||||
|
|
||||||
@@ -84,31 +87,32 @@ single contact or channel from its options.
|
|||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> **Wio Tracker L2:** the melody editor is under Settings › Sound.
|
> **Wio Tracker L2:** the melody editor is under Settings › Sound.
|
||||||
|
|
||||||
## Diagnostics
|
## Status
|
||||||
|
|
||||||
**Tools › Diagnostics** shows live counters (packets received and sent by
|
The **Status** home page sums up the radio, GPS, battery and mesh in four
|
||||||
type, forwarded, errors), memory, the radio's noise floor and the last
|
tiles; **Enter** opens the Status screen, one tab per subject (**Left /
|
||||||
packet's signal; a **System** tab with the firmware and radio settings; and a
|
Right** between them, **Up / Down** scrolls):
|
||||||
**Font** tab with a sample of every script the font covers. Hold Enter on the
|
|
||||||
live tab to reset the counters.
|
| Tab | Shows |
|
||||||
|
| --- | ----- |
|
||||||
|
| **Radio** | Frequency, SF / BW / CR, TX power, the noise floor over the last half hour, the last packet's signal |
|
||||||
|
| **GPS** | On / off (**Enter** switches it), fix, satellites, position, altitude, speed, precision, time to first fix |
|
||||||
|
| **Sky** | The satellites on a sky plot, or each one's signal as bars (**Enter** swaps them); Wio Tracker L1 |
|
||||||
|
| **Power** | Battery level, voltage, source and trend, then the readings of any sensors |
|
||||||
|
| **Mesh** | Packets received and sent with a traffic line, forwarded, nodes heard, contacts; **hold Enter** resets the counters |
|
||||||
|
| **System** | Uptime, firmware, device, memory, the send queue, errors, and a sample of every script the font covers |
|
||||||
|
|
||||||
|
**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]
|
> [!NOTE]
|
||||||
> **Wio Tracker L2:** the Diagnostics app, with a **Noise** tab that
|
> **Wio Tracker L2:** the Diagnostics app, with a **Noise** tab that
|
||||||
> measures the noise floor over time.
|
> measures the noise floor over time, and the **GPS** app, which draws a sky
|
||||||
|
> plot of the satellites and each one's signal strength.
|
||||||
|
|
||||||
## GPIO
|
## GPIO
|
||||||
|
|
||||||
*Wio Tracker L1 only.* **Tools › GPIO** sets four spare pins as input,
|
*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
|
output or (GPIO1–2) analog input, shows their level and switches outputs. The
|
||||||
bot's `!gpio1`…`!gpio4` commands read and set the same pins.
|
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.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user