Record the measured USB link: NCM, bind to Ethernet, keep awake

Tested against the car Orin: the tablet is USB host to the Orin's NCM
gadget (192.168.55.1). Android routes app traffic over it only when it
is the default network, so the app must bind to TRANSPORT_ETHERNET. PD
changes cost ~3 s, and an idle tablet off charger sleeps and goes
silent, so the app keeps the device awake. Two guidelines follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mikkeli
2026-10-09 16:08:28 +09:00
parent a79b4ef9d3
commit c1ffba08fb
2 changed files with 36 additions and 6 deletions
+9 -1
View File
@@ -17,4 +17,12 @@ type: guidelines
## 3. Design for a split screen ## 3. Design for a split screen
- The screen may be shared with another app. Do not assume full width. - The screen may be shared with another app. Do not assume full width.
## 4. To be added ## 4. Bind to the Orin's network explicitly
- Android's default network is never the Orin link (it has no internet). Request
`TRANSPORT_ETHERNET` and bind to it; never rely on the default route.
## 5. Keep the device awake while displaying
- A sleeping tablet is indistinguishable from a dead link. Hold the screen on
while the app is the display, and treat every reconnect as routine, not an error.
## 6. To be added
+27 -5
View File
@@ -1,7 +1,7 @@
--- ---
type: plan type: plan
status: active status: active
updated: 2026-09-04 updated: 2026-10-09
--- ---
# Initial plan # Initial plan
@@ -19,9 +19,9 @@ needs no routing engine at all. Routing is the expensive last fraction.
## Open ## Open
- **Transport.** Over USB the tablet has an IP link via RNDIS, so it can reach the - **Transport.** Whether the app reaches the broker directly or goes through
broker directly. Whether it should, or should go through `svc-gw`, is decided in `svc-gw` is decided in that repo — see its initial plan. The physical link is
that repo — see its initial plan. settled (below).
- **CJK labels.** MapLibre cannot ship Japanese glyph sets as SDF ranges. Local - **CJK labels.** MapLibre cannot ship Japanese glyph sets as SDF ranges. Local
font rendering must be configured, or labels will be slow or absent. font rendering must be configured, or labels will be slow or absent.
- **Sunlight.** A typical tablet is unreadable through a windscreen in daylight. - **Sunlight.** A typical tablet is unreadable through a windscreen in daylight.
@@ -38,7 +38,29 @@ Two channels with different guarantees, not one socket:
| On reconnect | expect current state immediately | resend anything pending | | On reconnect | expect current state immediately | resend anything pending |
This client always initiates and owns reconnection — the Orin never dials out. This client always initiates and owns reconnection — the Orin never dials out.
Assume the link drops constantly: cable knocked, screen off, WiFi lost. Assume the link drops constantly: cable knocked, screen off, power changes.
## The USB link, as measured (2026-10-09)
Tested with the actual tablet (Redmi Pad SE 8.7 4G, Android 16) against the car
Orin. Details: [USB tablet link report](gitea:yukart/orin-nano-env-setup).
- **Physical:** tablet USB-C → PD hub (charging from the car) → Orin's USB-C port.
The tablet is the USB host; the Orin is a USB network gadget. The tablet picks
**NCM** and gets `192.168.55.100`; the Orin is **`192.168.55.1`**.
- **Android won't route over it by default.** The link has no internet, so it never
becomes the default network while WiFi or cellular is up, and ordinary sockets go
elsewhere. Verified: the Orin was unreachable until WiFi and cellular were off.
The app must request the Ethernet network (`ConnectivityManager.requestNetwork`
with `TRANSPORT_ETHERNET`) and bind its sockets to it.
- **About 3 s blank per power change.** Cutting the hub's PD costs ~3.5 s (full
USB detach); restoring it ~2.2 s. Ignition and cranking produce these.
- **An asleep tablet is a dead link.** Off charger and idle, Android suspends about
a minute after screen-off and answers nothing, while the Orin still sees the USB
link up. The app keeps the device awake while it is the display (screen-on flag
in the full UI; the same for any overlay widget).
- Reconnect without user action, and expect the Orin to drop a silent client by
heartbeat (project-yukart decision 24).
## Session marking is worth building early ## Session marking is worth building early