Skip to content

feat(ui): present the session record as a carousel - #166

Merged
PurpleSentinel merged 1 commit into
mainfrom
feature/review-carousel
Aug 20, 2026
Merged

PurpleSentinel merged 1 commit into
mainfrom
feature/review-carousel

Conversation

@PurpleSentinel

Copy link
Copy Markdown
Contributor

Closes #165.

What changed

Review was the last screen still built the simulator way — six rows, four lap panels and six
buttons on a 49 mm panel. It is now a carousel: one value filling the screen, cycled with a
swipe.

SESSION TIME   OVER RUN   PEAK G   ACCEL / BRAKE   LEFT / RIGHT   UP / DOWN   ENDED BY
  • Swipe left/right cycles values
  • Press moves to the next session — what the OLDER button did, and the only gesture left
    once swipe belongs to the values
  • Long press leaves, as it does everywhere else in the menu
  • SESSION n OF m stays in the title on every card, so cycling never loses which session
    is being read

Reused, not imitated

It drives the same CarouselScreen as MODE, TRACK and TRIGGER, so Review is not a second
visual language for the same interaction — and it inherits the readable typography rather than
repeating the mistake that made the previous version look empty when it was not.

One extension: CarouselEntry carried a single label, and a record value needs two things said.
It now has a caption under the label, so a card reads as a large value with its name
beneath — the arrangement the time roller already uses.

That extension has a second beneficiary. device_mode_summary() and
session_trigger_summary() already exist, describe exactly what each choice does, and are
displayed nowhere
— there had been no place to put them. Noted on the issue rather than
widened into this change.

Testable without a display

The card list is built from the summary alone and carries no LVGL, so what a session is worth
reading is a question about the record rather than about how it is drawn. Icons are mapped in
the router, the only part that needs to know about symbols.

Five new tests: every recorded value gets a card, every card is named and coloured, a long
session still reads in minutes (95:07), an empty session reads as coherent zeroes rather than
blanks, and the recording card appears only when it has something to report.

That last one is a judgement worth challenging: the RECORDING card is hidden when the log is
complete and nothing is degraded.
A card that always reads "fine" teaches a driver to swipe
past the one place a problem would ever be shown. Today it will read NO GPS, which is true.

Left alone deliberately

SessionReviewScreen, the old dense layout, stays in the tree because the frozen simulator
still builds against it. Removing it would break a build kept precisely as a regression guard.

Verification

39 host suites (one new) and 70 simulator tests. Firmware builds and is flashed.

The on-device interaction is not yet confirmed — swiping through the cards and changing
session with a press has not been exercised on the panel, only the build and the card model.
Worth a look before it is relied on.

Review was the last screen still built the simulator way: six rows, four lap panels and
six buttons on a 49 mm panel. It is also the one screen a driver reads while stopped and
unhurried, where there is least excuse for cramming.

It reuses CarouselScreen rather than imitating it, so Review is not a second visual
language for the same interaction, and it inherits readable typography rather than
repeating the mistake that made the previous version look empty. Swipe cycles the values,
press moves to the next session - what the OLDER button did, and the only gesture left
once swipe belongs to the values - and a long press leaves, as it does everywhere else in
the menu. Which session is being read stays in the title on every card, so cycling
through values never loses it.

CarouselEntry gains a caption, because a record value needs two things said and the entry
carried one label. The value is large with its name beneath, the arrangement the time
roller already uses. The field is appended: the struct is aggregate-initialised at every
call site, and a field in the middle silently reassigns positional initialisers.

The card list is free of LVGL and built from the summary alone, so what a session is
worth reading can be tested without a display; icons are mapped in the router, which is
the only part that needs to know about symbols.

The recording card appears only when there is something to report - a partial log or a
degraded subsystem. A card that always reads "fine" teaches a driver to swipe past the one
place a problem would ever be shown.

The old dense screen is left in place because the frozen simulator still builds against
it, and removing it would break a build kept as a regression guard.

Closes #165

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@PurpleSentinel
PurpleSentinel merged commit db7afde into main Aug 20, 2026
3 checks passed
@PurpleSentinel
PurpleSentinel deleted the feature/review-carousel branch August 20, 2026 23:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Present the session record as a carousel, one value per screen

2 participants