Skip to content

Feature request: page carousel — rotate multiple stat pages, with diff-based partial rendering (working implementation available) #1011

@JacquesBronk

Description

@JacquesBronk

Is your feature request related to a problem?

A single theme can only show as many stats as fit on the panel. If you want more (e.g. a host page, a Kubernetes page, a network page), today's options are running one process per screen or hacky theme-swapping via restart — which re-inits the device and repaints the whole panel.

Full-frame redraws are also visibly slow on these serial-attached panels (~300 KB/frame over CDC-ACM ≈ 1–2 s top-down "wipe").

Describe the solution you'd like

Two complementary pieces, both implemented and running (REV A / TURING_3_5, Linux, Python 3.14):

  1. Page carousel — one process rotates through multiple YAML-defined pages (dwell/refresh configurable, file live-reloaded so edits apply without restart). Widgets so far: bar, metric, radial, text. A page can use any existing theme background, and radial can trace ring art — e.g. live gauges over the stock Cyberdeck theme's rings.

  2. Diff-based partial rendering — each new frame is diffed (PIL.ImageChops) against the last pushed frame and only changed horizontal bands are sent. In-page value updates become wipe-free (a few tiny rectangles instead of a full repaint); page transitions still repaint the content that differs, but skip unchanged chrome and blank space, so they complete noticeably faster than a full-frame push. This part could benefit every user of slow serial panels, independent of the carousel.

Working implementation: https://github.com/JacquesBronk/turing-smart-screen-python/tree/display-platform — docs in DISPLAY.md. It's purely additive (no upstream files modified); the stock engine remains available untouched via a small dispatcher.

Two REV A quirks discovered along the way, documented in DISPLAY.md, that may be worth noting upstream: Clear() leaves the panel in PORTRAIT (its trailing no-arg SetOrientation() restores the default, not the previous orientation), and clean_stop()'s ScreenOff() means any external replacement process must explicitly ScreenOn().

Describe alternatives you've considered

Theme-swapping with process restarts (flicker + device re-enumeration risk), one fat theme (doesn't fit), forking permanently (would rather contribute).

Additional context

Happy to adapt naming/structure/scope to your preferences and split this into smaller PRs — e.g. diff rendering first, carousel second. The branch also contains more niche extras (Prometheus data source, network-map page) that I'd expect to stay out of scope; the PR would cover the carousel + widgets + diff rendering core, with homelab-specific config replaced by generic psutil-only example pages.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions