Commit graph

74 commits

Author SHA1 Message Date
Mitchell R
3a8fd70528 fix: stop old pipelines before re-render to prevent buffer overload 2026-05-10 22:21:02 +02:00
Mitchell R
16ab165b06 feat: live updates via WebSocket — server pushes, kiosk reloads
Server side:
- service-coordinator-ws: full WS implementation using ws package
- Auth via ?token=<kiosk_key> query param
- Coordinator registry for cross-plugin notification
- Admin mutations call notifyKiosks() → server pushes reload-bundle
- 30s ping/pong heartbeat

Kiosk side:
- Rust ws_client with tokio runtime + tokio-tungstenite
- Auto-reconnect with exponential backoff (1s → 60s cap)
- On reload-bundle: re-fetches bundle, re-renders layout
- Pong replies to server pings

Also fix: auto-suffix kiosk name on UNIQUE collision (re-pair with
same hostname no longer fails).
2026-05-10 22:15:58 +02:00
Mitchell R
533412a826 refactor: Nx-Witness layout builder + drop regions/is_default
- Cells own position directly (row/col/row_span/col_span)
- Drop regions JSON from layouts (cells ARE the regions)
- Drop is_default from layouts (display.default_layout_id owns)
- Drop grid_cols/grid_rows from layouts (computed from cells)
- Layout new form: name, description, priority, resets_idle_timer only
- Layout edit: visual grid builder, + buttons on cell edges,
  click cell to assign content
- Bundle cells now carry position directly
- Rust kiosk attaches widgets using cell position
- Migration v0.4: backfills cell positions from old region map
2026-05-10 21:55:19 +02:00
Mitchell R
7fbda3c2b3 refactor: merge templates into layouts, displays from kiosks
- Eliminated layout_templates as separate entity — regions/grid now
  live directly on layouts
- Displays created from kiosk pairing (not standalone), each display
  has kiosk_id FK
- Removed Templates from sidebar nav and all template routes/pages
- Layout creation uses preset buttons (fullscreen, 2x2, 1+3, 3x3)
  that set regions directly on the layout
- Setup no longer creates default display/layout (deferred to pairing)
- Pairing creates HDMI-0 display for new kiosk
- Bundle reads regions from layout directly, no template lookup
- Rust kiosk updated to match new bundle format
- DB migration adds regions/grid_cols/grid_rows to layouts, kiosk_id
  to displays, copies existing template data
2026-05-10 21:39:09 +02:00
Mitchell R
72d8ad717f fix: import PluginFeatureExtManual for set_rank 2026-05-10 20:59:23 +02:00
Mitchell R
61ab099f87 fix: demote Pi5 hw H265 decoder — sw fallback for non-standard resolutions 2026-05-10 20:52:25 +02:00
Mitchell R
246febcc80 fix: filter rtspsrc pads — only link video to decodebin, skip audio 2026-05-10 20:51:29 +02:00
Mitchell R
877596fc15 fix: add comprehensive pipeline logging for debugging 2026-05-10 20:49:00 +02:00
Mitchell R
30eb85e6b1 fix: use property_from_str for queue leaky enum 2026-05-10 20:14:58 +02:00
Mitchell R
527a62d2e5 fix: drop HANDLES_COMMAND_LINE flag 2026-05-10 20:13:01 +02:00
Mitchell R
f6dec4bf39 fix: import ApplicationExt for set_flags 2026-05-10 20:12:14 +02:00
Mitchell R
e7237d077f fix: suppress GTK file-open warning, read server URL from env 2026-05-10 20:11:31 +02:00
Mitchell R
76af07de61 fix: use std::sync::mpsc + timeout_add_local for thread→UI messaging 2026-05-10 20:10:23 +02:00
Mitchell R
df231344a8 fix: use glib channel for thread→UI communication (Send safety) 2026-05-10 20:09:06 +02:00
Mitchell R
c4315917d8 fix: resolve all Rust compile errors in kiosk app 2026-05-10 20:04:43 +02:00
Mitchell R
371c023c81
feat: Rust kiosk app — GTK4 + GStreamer multi-camera display
- Server discovery (localhost → betterframe.local → cloud)
- Pairing flow with fullscreen code display
- Bundle fetch and layout rendering
- GTK4 Grid layout matching template regions
- GStreamer pipelines per camera cell via gtk4paintablesink
- Heartbeat loop in background thread
- Placeholder widgets for web/html cells
2026-05-10 04:18:40 +02:00
Mitchell R
f5a2645ffc
fix: force sw decode for H265 — Pi5 hw decoder rejects 960x1080 2026-05-10 04:11:43 +02:00
Mitchell R
8422fdce90
feat: auto-detect codec — try H264, H265, then uridecodebin fallback 2026-05-10 04:11:18 +02:00
Mitchell R
888dc4a4e5
fix: use uridecodebin with video caps filter for codec-agnostic RTSP 2026-05-10 04:10:33 +02:00
Mitchell R
2588611501
fix: depay h264 before decodebin to avoid audio pad linking failure 2026-05-10 04:09:01 +02:00
Mitchell R
a88e3f5c72
fix: use waylandsink with fullscreen for RTSP display 2026-05-10 03:58:40 +02:00
Mitchell R
6dfed8548c
fix: strip null byte from /proc/device-tree/model 2026-05-10 03:17:48 +02:00
Mitchell R
d9a2947001
fix: single curl call for pairing claim to prevent credential wipe 2026-05-10 03:17:35 +02:00
Mitchell R
44e4b7f3af
feat: add shell kiosk prototype for end-to-end testing 2026-05-10 03:13:52 +02:00