Drop video out; every display is data-only

No dedicated display is in scope, so Class A has nothing to drive and app-hud
is cancelled. Records why it will not come back: no connector-powered display
exists (DP_PWR is 3.3V/500mA and deliberately unconnected at the sink, HDMI
gives 55mA, a panel needs 5-15W), the dev kit exposes no DSI, and a data-only
client on one USB cable is simpler anyway.

Video out generated the enclosure, power and cabling complexity this project
set out to solve. Removing it removed the problem.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
This commit is contained in:
2026-09-04 14:52:50 +09:00
parent d234a2da37
commit 102cf38082
3 changed files with 37 additions and 18 deletions
+31 -13
View File
@@ -179,26 +179,43 @@ rewrite: the seam stays visible even while the process is one.
## Display contract ## Display contract
Three display paths, in two classes: **Every display is data-only.** The Orin sends no video to anything. Each device
subscribes to the bus and renders itself.
**Class A — video out.** A screen driven directly by the Orin over SPI/DP/HDMI.
The renderer is a local process subscribing to the bus over loopback.
**Class B — data only.** The Orin sends no video, only data; the device renders
itself.
| Path | Transport | Notes | | Path | Transport | Notes |
|---|---|---| |---|---|---|
| Android app | WiFi, or USB (RNDIS) | Full-featured client, richest UI | | `app-flutter` | USB (RNDIS), or WiFi | The display. Full client, richest UI, also the audio sink |
| ESP32 + RLCD/e-ink | WiFi, or USB/BT serial | Low-rate, glanceable subset of signals | | `app-esp32` + RLCD/e-ink | WiFi, or USB/BT serial | Low-rate glanceable subset. Not in current scope |
Class B devices reaching the bus over IP connect to the broker directly. For Displays reaching the bus over IP connect to the broker through `svc-gw`, which
transports without IP (BT SPP, plain USB serial), `telemetry-gw` bridges owns the boundary. For transports without IP — BT SPP, plain USB serial —
serial ↔ bus rather than each device inventing its own protocol. `svc-gw` bridges serial ↔ bus rather than each device inventing its own protocol.
Because both classes are bus subscribers, adding, removing or swapping a display Because every display is a bus subscriber, adding, removing or swapping one
touches no acquisition code. touches no acquisition code.
### Video out was dropped
An earlier revision had a second class: a screen driven directly by the Orin over
SPI/DP/HDMI, rendered by a local process. It is gone, and with it `app-hud`.
The reasoning, in order:
- **No connector-powered display exists.** DisplayPort's `DP_PWR` supplies 3.3 V
at 500 mA — and VESA-compliant cables deliberately leave it unconnected at the
sink. HDMI's +5 V pin gives 55 mA. A panel needs 5–15 W. So a directly-driven
screen always needs its own power feed, which is the cable the removable display
unit was meant to avoid.
- **DSI is not available.** The Orin Nano module carries DSI on SODIMM pins, but
the developer kit's carrier board does not break them out; DisplayPort is its
only display output. DSI would require a custom carrier board.
- **It bought nothing the browser-shaped path does not.** A data-only client on
one USB cable is simpler, and the display unit stays swappable.
Video out is what generated the enclosure, power and cabling complexity this
project started out trying to solve. Removing it removed the problem rather than
solving it.
## Navigation ## Navigation
Self-hosted and offline-first, rather than a cloud maps SDK. Japan has good LTE Self-hosted and offline-first, rather than a cloud maps SDK. Japan has good LTE
@@ -309,3 +326,4 @@ rewriting the document.
| 17 | `svc-gw` combines local hub and app gateway; no client may block the hub | Accepted | 2026-09-03 | | 17 | `svc-gw` combines local hub and app gateway; no client may block the hub | Accepted | 2026-09-03 |
| 18 | Stubs publish the real topic and schema, never a fixture-specific one | Accepted | 2026-09-03 | | 18 | Stubs publish the real topic and schema, never a fixture-specific one | Accepted | 2026-09-03 |
| 19 | Services mock themselves behind their own input interface; no separate stub implementations exist | Accepted | 2026-09-04 | | 19 | Services mock themselves behind their own input interface; no separate stub implementations exist | Accepted | 2026-09-04 |
| 20 | Video out (Class A) dropped; every display is data-only. `app-hud` cancelled | Accepted | 2026-09-04 |
-1
View File
@@ -35,7 +35,6 @@ contracts repo, not copied into each consumer.
| `contracts` | Topic namespace, payload schemas, Z27AG DBC | Consumed by every other repo, including non-Jetson clients; must not be duplicated | | `contracts` | Topic namespace, payload schemas, Z27AG DBC | Consumed by every other repo, including non-Jetson clients; must not be duplicated |
| `svc-core` | Acquisition + processing cluster: `can-bridge`, `obd-poller`, `gnss`, `decoder`, `recorder` | Developed and deployed as one unit on the Orin | | `svc-core` | Acquisition + processing cluster: `can-bridge`, `obd-poller`, `gnss`, `decoder`, `recorder` | Developed and deployed as one unit on the Orin |
| `app-esp32` | ESP32 RLCD/e-ink display firmware (Class B) | Embedded toolchain, flashed not deployed | | `app-esp32` | ESP32 RLCD/e-ink display firmware (Class B) | Embedded toolchain, flashed not deployed |
| `app-hud` | Local renderer for a directly-driven screen (Class A) | Its own toolchain and graphics stack — **in question**, see the display contract |
| `tool-analysis` | Offline session analysis, reverse-engineering notebooks | Runs off-car, no runtime coupling | | `tool-analysis` | Offline session analysis, reverse-engineering notebooks | Runs off-car, no runtime coupling |
Create these lazily — when there is something to put in them, not before. Create these lazily — when there is something to put in them, not before.
+6 -4
View File
@@ -55,10 +55,12 @@ provides a cross-check for reverse-engineered ones.
Order chosen by feedback speed, not ambition. Order chosen by feedback speed, not ambition.
- [ ] One display end-to-end first, proving the contract — Android client is the - [ ] One display end-to-end first, proving the contract — `app-flutter` is the
quickest to iterate on quickest to iterate on, and is the only display in current scope
- [ ] `app-hud` — directly-driven screen (Class A) - [ ] `app-esp32` — RLCD/e-ink glanceable subset. Deferred, no hardware in scope
- [ ] `app-esp32` — RLCD/e-ink glanceable subset (Class B)
Video out was dropped along with `app-hud`; see the display contract in
[ARCHITECTURE.md](ARCHITECTURE.md#display-contract).
## Phase 5 — Camera and inference · *separate task* ## Phase 5 — Camera and inference · *separate task*