feat(ui-lvgl): roadmap stage 6 - light motion, unified style, accent picker, splash

- Anim.h: screens emerge from the middle (background cover fades, content
  drifts 6 px), Home pages slide, popups and toasts rise and fade in
- Theme.h: accent rules (fill = primary action, dim fill = selected, text =
  names/counts/modes), theme layer over the default theme, radius tokens,
  accent colour picker (Settings > Display & power > LOOK, NVS mc_ui)
- Splash with the Solo and upstream versions
- Status icons in equal cells, L1-style relay marks, path window with a hop
  diagram, tile download popup fits the screen (WiFi only in Settings)
- Perf: uncompressed fonts, two 120-line PSRAM buffers (~48 -> ~33 ms per
  transition frame); UI_PERF_TEST harness

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-09-26 13:06:22 +02:00
co-authored by Claude Opus 5.5
parent 5124587b26
commit 3fd204489e
27 changed files with 45643 additions and 36636 deletions
+13
View File
@@ -277,3 +277,16 @@ The speaker plays through the ES8311 codec (I2S MCLK 10 / BCK 11 / WS 12 / DOUT
- [ ] After "restarting..." the device boots the new version (Settings shows it); contacts, messages, settings, PIN and WiFi kept
- [ ] Up to date → "Up to date - the latest release is vX"; WiFi off / no network / map download running → toasts instead
- [ ] Wrong network in the middle (unplug router) → "Download stalled", old firmware still boots
## Roadmap stage 6: motion and look (2026-09-26)
- [ ] Boot: splash (amber MESHCORE, SOLO, Solo version, "MeshCore x - built date", three dots rising in turn) for ~2.5 s, then fades into Home (or the PIN card); a tap skips it
- [ ] Changing screens: the new one fades in from the background with its content drifting into place (up going in, down coming back); rebuilding the same screen (settings toggles, a new message) doesn't animate
- [ ] Selected things look the same everywhere (dim accent + light text): Nearby chips, Clock / Bot / Diagnostics tabs, Repeater segments; primary actions are full accent with dark text (map Download / Resume, Firmware update, WiFi / channel Save, Clock Start, alarm Dismiss, New message)
- [ ] Settings > Display & power > LOOK > Accent colour: tap a swatch → the page, status icons, chips, names recolour at once; other screens in the new colour; kept after a reboot (splash too)
- [ ] Home page swipe / dot tap: the tile row slides in from the swipe side
- [ ] Popups (map tools, Nearby advert, scan, radio frequency, map download): backdrop fades, panel rises; toasts rise in and fade out
- [ ] Buttons shrink slightly while pressed
- [ ] Status bar icons evenly spaced, muted shows a speaker with a cross (also next to muted conversations)
- [ ] Own channel post: "1s ✓ 2" (green, number of repeaters heard relaying it) under the bubble, nothing before an echo; DM: ✓ delivered, ✗ (red) not delivered, "..." sending
- [ ] Hold a message: quote, time + hops, path diagram sender → repeaters → this device; own post: "Relayed by n repeaters" + names; own DM: Delivered / Not delivered / Sending in words
- [ ] Map download popup: no WiFi button, fits the screen (scrolls if the unfinished-job row is shown); no network saved → toast pointing to Settings > WiFi
+36 -2
View File
@@ -82,8 +82,32 @@ L1 splits its tools into many small screens because of the joystick and the
## 6. Theme
- [ ] Develop the current look into a consistent, recognisable style
(colours, corners, type, icons, states), after the layout of stage 4.
- [x] A consistent style, written down in `Theme.h`: accent fill = the
primary action (Download, Install, Save, Go), dim accent fill =
selected / on (tabs, chips, segments -- also the default theme's
CHECKED), accent text = names, counts, modes; one card radius for
buttons and rows, pills for chips, `RADIUS_SM` inside; slightly lighter
surfaces. Accent colour selectable (Settings > Display & power > LOOK:
amber, orange, coral, violet, cyan, lime; NVS `mc_ui`).
- [x] Light motion (`Anim.h`): a new screen emerges from the middle (a
background-coloured cover fades while the content drifts 6 px), Home
pages slide after a swipe, popups and toasts rise and fade in, buttons
shrink a little while pressed.
- [x] Frame time measured on the device (`-D UI_PERF_TEST`: walks screens by
itself, prints render + flush per refresh): ~48 → ~33 ms per transition
frame with uncompressed fonts and two 120-line buffers. Internal-RAM /
DMA buffers, `-O2`, hot code in IRAM, two draw threads, system malloc:
no gain. The rest is LVGL's software rendering at 320x240.
- [x] Status bar icons in equal cells; muted is a speaker with a cross.
- [x] Under an own message: the age and a small mark as in L1 (✓ n repeaters
for channel posts; ✓ / ✗ / ... for DMs) instead of the words.
- [x] The path window of a message: quote, time and hops, a path diagram
(sender → repeaters → this device), repeaters that relayed an own post,
an own DM's delivery in words.
- [x] Tile download popup fits the screen; its WiFi button went (WiFi is set
up in one place, Settings).
- [x] Splash screen (`Splash.h`): MeshCore wordmark, SOLO, the Solo and the
upstream version, build date, loading dots.
## 7. Research: LVGL for the other displays
@@ -100,3 +124,13 @@ L1 splits its tools into many small screens because of the joystick and the
chip / register (devices on the bus: 0x14, 0x18, 0x21, 0x22, 0x2c,
0x34, 0x48, 0x5d). Found 2026-09-26.
Ideas to come back to (2026-09-26):
- [ ] Speaker click: would keeping the amplifier on at minimum volume
remove it?
- [ ] Import routes from the SD card (optional extra).
- [ ] Battery life without losing features, above all CPU sleep.
- [ ] Live tiles: don't keep them, or give them a bounded cache on the card
so they never fill it.
- [ ] Vector maps and other tile sources (to think through).