Archived from the old WioL1Pro-CVHBuild repository (first published 2026-08-10). These are the Wio Tracker L1 Pro builds from before Cairn; current builds are in the latest Cairn release.
CVHBuild 67 — now on MeshCore v1.17.0, plus a room server build
A Seeed Wio Tracker L1 Pro fork of MeshCore
(nRF52840, SH1106 128×64 OLED, 5-way joystick, buzzer, L76K GNSS).
Rebased from upstream v1.16.0 onto v1.17.0 (320 upstream commits), and adds a room server
build that uses the same paged UI as the companion instead of a single static screen.
This fork versions by build number — CVHBuild N, shown on the splash screen — so a device can be
matched to a tag from its own display.
Downloads
| File | Target |
|---|---|
MeshCore-WioL1Pro-CVHBuild67.uf2
| Companion, SH1106 OLED — the main build |
MeshCore-WioL1Eink-CVHBuild67.uf2
| Companion, Waveshare 2.13" B/W e-ink |
MeshCore-WioL1RoomServer-CVHBuild67.uf2
| Room server, SH1106 OLED |
Flashing: double-tap reset to expose the TRACKER L1 volume and copy the .uf2 onto it. The
"could not copy extended attributes" error is normal, and the volume ejecting itself means the
flash succeeded.
The tri-colour e-ink variant is no longer produced. Every refresh on a three-colour panel is a
blocking ~15 s full flash, which makes live pages snapshots rather than displays. The environment
and its EINK_3C paths remain in the tree and still build.
New: room server build
WioTrackerL1_room_server previously drew one static screen — node name, frequency, bandwidth —
with no pages and no joystick handling, even though the hardware inputs were already wired up for
any build with a display. It now has five pages, chosen for what a server that sits in one place
actually has rather than by copying the companion:
| Page | Contents |
|---|---|
| Clock | clock face, date, client count; sub-view for battery, uptime and post counters |
| Posts | the 32 stored posts, scrollable, Enter opens the full text word-wrapped |
| Clients | the ACL — key, admin flag, hops, unsynced posts, last seen; Enter opens a detail view |
| Radio | freq/BW/SF/CR grid, live RSSI spectrum, traffic monitor, fullscreen spectrum |
| Settings | advert, GPS, set clock, TX power, brightness, screen timeout, clock style |
Left/Right changes page, Up/Down scrolls or switches sub-view, Enter acts, hold Back locks.
Setting the clock. A room server has no companion app to push the time down, so previously the
only route was time <epoch> over the serial or admin CLI. There is now a GPS on/off setting —
the NMEA provider is constructed with the RTC, so a fix sets the clock — and a manual editor with
year/month/day/hour/minute cells for when there is no fix. Time is entered as local and stored as
UTC.
Identities are public-key prefixes (e.g. A3F2). The room server stores no names: neither
ClientInfo nor PostInfo has one, so that is the whole of what the device knows. The client
detail view shows eight bytes when you need to identify a specific node.
Upstream v1.17.0
Everything in upstream's release, plus these fork-specific consequences:
- Preferences moved to named-key JSON. Upstream replaced the byte-offset preferences struct
with a serialiser. This fork's eight UI settings moved into their ownuigroup, and the legacy
reader still parses them at their former offsets — so a device upgrading from CVHBuild 56
keeps its settings, and the first save migrates the file. - Colours come from a semantic palette rather than an abstract enum the driver reinterpreted.
No visible change on the OLED; on e-ink it removes the light/dark inversion hack, because the
palette carries the inversion instead. - Fixed: the contact list dropped its last eight entries. Upstream reserved eight slots at the
head of the contact array and madegetNumContacts()exclude them, whilegetContactByIdx()
still indexes the raw array. Three loops here paired the two, so they walked eight reserved slots
at the start and stopped eight short of the end — silently hiding the most recent contacts from
the compose picker, the recipient count and room re-login.
Security
- The destination bound on
Utils::decrypt()now also covers upstream's new CC310 hardware AES
path. Both write whole 16-byte blocks, so both can overrun a short destination; the check sits
above the branch rather than inside one arm of it. Upstream still carries no bound of its own. - Upstream independently fixed the BLE receive-queue race, which arrives with this merge.
Upstream defects found
Both break the build only on macOS/libc++, which is why upstream's Linux CI is green:
ConfigSerializer.cppcallsatoi/atol/atofwithout including<stdlib.h>.test/mocks/Utils.hdeclaresMACThenDecrypt()with the old unbounded signature.
E-ink companion
- The clock face is drawn, not typed. 24pt was the largest font available and pixel-doubling a
1-bit face stair-steps every edge, so the digits are now seven-segment shapes built from
rectangles: crisp at any size, and no flash cost. 46 panel rows tall, against 25 before. - The clock page became a resting screen. A reflective panel is on permanently and refreshes
about once a minute, so it now carries what you would otherwise change pages to read: date and
uptime with battery percentage and voltage, then unread and node counts with GPS state and die
temperature. Each row measures itself and drops its least important token rather than letting
two strings overlap. - Fixed: auto lock never engaged. It was implemented inside the screen-blanking path, and
e-paper never blanks — it holds its image with no power — so the whole block was compiled out
while the setting still readOn. Locking is about a device in a pocket, not about the panel. - The screen timeout and keep-awake-on-USB settings now read
n/awhere nothing blanks, instead
of accepting values that nothing acted on.
Memory
| Build | Flash | RAM |
|---|---|---|
| Companion (OLED) | 467 KB / 692 KB (67.5%) | 150 KB / 230 KB (65.3%) |
| Companion (e-ink) | 483 KB / 692 KB (69.9%) | 154 KB / 230 KB (67.1%) |
| Room server | 416 KB / 792 KB (52.5%) | 37 KB / 230 KB (16.1%) |
Testing
The OLED companion and the B/W e-ink companion are running on hardware. The room server has been
run on hardware and its Clock, Radio and Settings pages exercised; its Posts and Clients pages
cannot be fully validated until real clients log in and post, so those layouts are verified
arithmetically rather than visually. The tri-colour e-ink variant has never been run.
Upgrading from CVHBuild 56 migrates the preferences file on first save. The old file is left in
place, so reflashing 56 gets you back to a device that reads the original.
Full changelog: see CHANGELOG.md, builds 57–67.