ManxChartPlotter

Raspberry Pi 5 test rig

The Pi 5 on Denis’s desk is where Manx gets tested on real target hardware. Set up 2026-09-23.

Reaching it

ssh rpi5            # alias in ~/.ssh/config → den@rpi5.local, key ~/.ssh/id_ed25519_rpi5

The machine

Deploy / build / run

deploy/deploy-to-pi.sh           # rsync → ~/manx on the Pi, cargo build --release there, restart Manx on its screen
NORUN=1 deploy/deploy-to-pi.sh   # build only

This is the everyday loop: edit on the Mac, run it, look at the Dell.

Tracing

Every start through pi-run.sh is a trace session in ~/manx-traces/<UTC time>/ on the SD card (latest → newest; 30 kept). It’s written by deploy/pi-trace.sh and deliberately not in /tmp, which is RAM here, so it survives a desktop crash:

file what
manx.log app log, panics, backtraces
system.csv 1 s samples (deploy/pi_sampler.py, fsync’d each row): CPU %, load, mem available, zram, Manx CPU/RSS/threads, V3D render/bin busy % and jobs/s (from /sys/class/drm/card0/device/gpu_stats), temp, ARM/V3D MHz, core V, EXT5V V, get_throttled
kernel.log kernel messages during the run (v3d_reset … hang lands here)
session.txt build (~/manx/BUILD, written by deploy: git describe + branch), binary time, kernel, Mesa, start/end, exit code/signal, throttle flags

On the Mac: deploy/pi-trace-pull.sh [session] rsyncs everything to traces/pi/ (gitignored) and runs tools/pi_trace_report.py. That prints min/avg/max per metric, throttle flags decoded over time, each suspicious kernel line with the Manx log and samples of the 5 s before it, and WARN/ERROR grouped by message.

Known from the first traces (2026-09-23): no fan on this Pi, so throttle flags 0xe0000 (soft temp limit and ARM cap occurred) show up; no under-voltage despite the “can’t supply 5 A” popup (that’s only PD negotiation with the Dell dock).

Reproducing a GPU hang

Manx draws only when something changes, so a still view never hangs the GPU. Two env hooks make a hang reproducible without hands on the mouse:

ssh rpi5 'MANX_STRESS=coast MANX_VIEW=32.68,-117.235,1 bash ~/manx/deploy/pi-run.sh'

The first V3D hang (2026-09-23) was the LC() fragment shader (fs_lc). An inner loop bounded by a uniform (i < u.lc_count) hung V3D within seconds under MANX_STRESS. The same loop with a constant bound and a break doesn’t. Keep shader loops constant-bounded on this GPU. The Corrupt prim … huge=true warnings seen at the time were a false alarm from a too-tight check in senc/geometry.rs.

The second crash (2026-09-23, panning DK with the wind wash on) was not the GPU: Buffer slices can not be empty in egui-wgpu. Where the view had no forecast data, the wash was a mesh of corners with no triangles. egui passes that on, and wgpu panics on its empty index range. ui_batch.rs now never hands egui a mesh without triangles.

Charts / licence

The Pi is its own o-charts machine. license/ and charts/ are deliberately not deployed (see deploy/README.md). Register it as its own system from Manx’s Charts window before downloading. The decryption helper comes from oeserverd/linuxarm64/, which the deploy rsync does copy.