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:
+31
-13
@@ -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 |
|
||||||
|
|||||||
@@ -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
@@ -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*
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user