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
+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.