feat: per-contact actions, device settings, a companion CLI and your contact's QR code

- Nodes: telemetry permissions per contact, reset path, share nearby
  (L1 options menu; L2 node card with "Can ask for" switches)
- Settings > Privacy: fixed position (typed in, from a waypoint, cleared)
  and the Bluetooth PIN; Settings > System: factory reset, asked twice
- Companion CLI (CMD_RUN_CLI_COMMAND 66 / RESP_CODE_CLI_REPLY 29, as
  upstream; FIRMWARE_VER_CODE 14): upstream's command names plus a key for
  every schema setting (get / set / keys)
- Screenshots move to 0x7E; tools/screenshot.py falls back to 66 / 29
- Your contact as a QR code (meshcore://contact/add): Status > System on
  ui-new, Settings > About on the L2; Nayuki's qrcodegen made header-only

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-10-10 09:59:35 +02:00
co-authored by Claude Opus 5.5
parent 6fba3dfca7
commit c5bb4752d0
22 changed files with 2521 additions and 86 deletions
+11 -1
View File
@@ -18,6 +18,9 @@ for what you can do with it:
| 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 |
| Telem | What this contact may ask for: None, Status, Stat+loc, Stat+sens, All. Shown when a [Privacy](./settings.md#privacy) setting is **Allowed** |
| Reset path | Forgets the learned route; the next message floods and finds a new one. Shown when there is a route |
| Share nearby | Sends the contact's last advert to the nodes in direct range, so they can add it |
| 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 |
@@ -32,7 +35,14 @@ back out, **Enter** opens its details and **Hold Enter** its options.
> **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**.
> isn't a contact yet and **Delete**. The telemetry permissions are three
> switches under **Can ask for**.
## Your own contact
**Status › System**, **Enter** shows your contact as a QR code: the phone
app's scanner adds you from it, with your name and key. On the Wio Tracker L2
it is in **Settings › About**.
## Favourites
+5
View File
@@ -63,6 +63,10 @@ build flag it needs.
| Remote admin | yes | yes | yes | yes | yes |
| Adding contacts (auto-add by type, hops, replace oldest) | Settings › Contacts | same | same | same | Messages & contacts |
| Privacy (position in adverts, telemetry requests) | Settings › Privacy | same | same | same | Settings › Privacy |
| Per-contact actions (telemetry permissions, reset path, share nearby) | Nodes › options | same | same | same | Node card |
| Fixed position, Bluetooth PIN | Settings › Privacy | same | same | same | Settings › Privacy |
| Factory reset | Settings › System | same | same | same | Settings, at the bottom |
| Console (companion CLI, upstream commands plus settings keys) | app / USB tools | same | same | same | same |
### Navigation (`ENV_INCLUDE_GPS`)
@@ -89,6 +93,7 @@ build flag it needs.
| Advanced radio (hash size, double ACK, CAD, interference, RX boost, RX delay, airtime) | end of Settings › Radio | same | same | same | Radio › Advanced |
| Battery curve | Settings | same | same | same | Settings › Power, draggable chart |
| QR code of the manual | Status › System, Enter | same | same | same | Settings › About |
| QR code of your contact | Status › System, Enter | same | same | same | Settings › About |
### Device
+55 -5
View File
@@ -11,10 +11,10 @@ board supports are shown.
| **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, then the advanced options (below) |
| **System** | Device name, low-battery shutdown, GPS power saving, units, the battery curve, reboot |
| **System** | Device name, low-battery shutdown, GPS power saving, units, the battery curve, reboot, factory reset |
| **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, which heard nodes are added |
| **Privacy** | Whether your adverts carry your position, and who may ask for your status, location and sensor readings |
| **Privacy** | Whether your adverts carry your position and which position, who may ask for your status, location and sensor readings, the Bluetooth PIN |
| **Messages** | Automatic resend of direct messages, the ten quick messages |
A few notes:
@@ -32,6 +32,9 @@ A few notes:
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.
- **Factory reset** erases contacts, channels, messages, settings and the
node's keys, then restarts as a new node. It asks twice. On the Wio Tracker
L2 the SD card is left as it is.
### Adding contacts
@@ -53,10 +56,18 @@ nodes aren't added until you make room.
including the automatic ones. Off, nodes see your name but not where you
are. Live sharing and `{loc}` in a message still send it, because you send
those on purpose.
- **Position**: where your adverts say you are while the GPS is off. **Enter**
to type it in (`50.06143, 19.93658`), take it from a waypoint, or clear it.
With the GPS on, the row shows **GPS** and each fix replaces it; turning the
GPS off keeps the last fix. The phone app sets the same position.
- **Ask status / loc / sens**: who may request your telemetry: **Nobody**,
**Allowed** (the contacts you gave that permission, for now in the phone
app) or **Everyone**. Status is the battery; a request for location or
**Allowed** (the contacts you gave that permission: **Telem** in a node's
options in [Nodes](./contacts.md#nearby-nodes), or the phone app) or
**Everyone**. Status is the battery; a request for location or
sensors is answered only where status is allowed too.
- **BT PIN**: the six-digit Bluetooth pairing PIN. Leave it empty for a new
random one at each start, shown on screen. A new PIN is used from the next
start; the phone pairs again after that.
### Advanced radio
@@ -84,4 +95,43 @@ if your mesh agrees on it.
> Bluetooth, WiFi, GPS. Adding contacts is in Messages & contacts.
> - **Map & data**: Map (trail, live sharing and arrival alert options),
> Storage.
> - **System**: Name, Time, Units, Firmware update, About; Reboot and Power off.
> - **System**: Name, Time, Units, Firmware update, About; Reboot, Power off
> and Factory reset. Privacy holds **Fixed position** and, under
> Bluetooth, the **Pairing PIN**.
## Console
The phone app's console and the console in the site's
[USB tools](https://solo.marekzegarek.com/#pc-tools) change settings by
text. The commands are the ones upstream MeshCore's companion firmware has,
so its documentation applies:
| Command | Does |
| --- | --- |
| `get radio`, `set radio 869.525,250,11,5` | Frequency, bandwidth, SF and CR, applied at once |
| `get tx`, `set tx 14` | TX power in dBm |
| `get af` / `set af`, `get dutycycle` / `set dutycycle` | Airtime factor, or the same as a duty cycle in % |
| `rxdelay`, `int.thresh`, `cad`, `radio.rxgain`, `path.hash.mode`, `multi.acks` | The advanced radio options, with `get` / `set` |
| `get name`, `set name …` | The device name |
| `get pin`, `set pin 123456` | The Bluetooth PIN, `0` for a random one; used from the next start |
| `get tz.offset`, `set tz.offset 2` | Time zone, in hours from UTC |
| `get lat`, `set lat …`, `get lon`, `set lon …` | The fixed position |
| `ver`, `board` | Firmware version, hardware |
| `reboot`, `poweroff` | Restart or turn off |
Every other setting has a key: `keys` lists them a page at a time (`keys 2`,
`keys 3` …). `get` shows a value as the Settings screen does, and `set`
takes it the same way, case ignored:
```
get telemetry.base > Nobody
set telemetry.base Allowed
set display.off 30 s
set advert.loc on
set autoadd.room off
```
A number works too: the position in the list (`set telemetry.base 2`), or a
stored value such as seconds or millivolts (`set display.off 60`,
`set batt.shutdown 3300`). A wrong value answers with the ones that fit.
Factory reset and the node's keys are not in the console.
+2 -2
View File
@@ -103,7 +103,7 @@ Right** between them, **Up / Down** scrolls):
| **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; **Enter** shows a QR code that opens this manual on a phone |
| **System** | Uptime, firmware, device, memory, the send queue, errors, and a sample of every script the font covers; **Enter** shows your contact as a QR code, which the phone app scans to add you, and **Enter** again a QR code that opens this manual; any other key closes it |
**GPS pwr** in Settings › System turns the GPS off between fixes to save
battery; anything that needs your position (the trail, live share, the
@@ -116,7 +116,7 @@ locator) keeps it on.
> of the satellites and the fix), **Signal** (a bar per satellite with its
> strength, and the constellations) and **Details** (position, precision,
> time to first fix and what the receiver reports).
> The manual's QR code is in Settings › About.
> Your contact's QR code and the manual's are in Settings › About.
## GPIO