Commit Graph

28 Commits

Author SHA1 Message Date
mikkeli 31a844bb94 Auto dark/bright follows the sun at the tablet's own location
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 22s
CI / Debug APK (push) Successful in 39s
Without a light sensor an app may read (the Redmi Pad SE has none), auto is dark while
the sun is more than 4° below the horizon (lib/theme/sun.dart), at Android's coarse
location, polled and kept across restarts. The tablet's own, not the Orin's GNSS: the
tablet has its own GNSS and cellular. Android's dark theme is the last fallback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:33:43 +09:00
mikkeli 317de3425a Checklist v4 from contracts: step 31, each wheel by hand
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Failing after 5s
CI / Debug APK (push) Has been skipped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-15 22:30:40 +09:00
mikkeli 3398da3823 Auto dark/bright takes a light sensor where the device allows one
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 21s
CI / Debug APK (push) Successful in 41s
lib/theme/light.dart: dark at 15 lux or less, bright from 60, held 5 s; Settings shows the
reading. The Redmi Pad SE refuses apps its only light sensor (Xiaomi's, from the front
camera), so there Auto keeps following Android's dark theme. DASH-NEXT.md records the
other lux sources.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:24:36 +09:00
mikkeli dcafc04cbc Status bar: the Orin at a glance over every view, like a phone's
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 20s
CI / Debug APK (push) Successful in 39s
Link on the left (with the menu on the Dash), then hot temperature, CAN, OBD while
connected, GNSS fix and satellites, LTE, WiFi, UPS, and the dark/bright button. The
Dash's own top line is gone into it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:17:38 +09:00
mikkeli 78a6564f0a Dark/bright: Auto (Android's dark theme), Dark or Bright, kept across restarts
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 19s
CI / Debug APK (push) Successful in 1m5s
Settings has a segmented Auto / Dark / Bright. Auto follows platformBrightness, so
Android's schedule too. The Dash's quick button holds the other variant; a long press
is auto again. The mode is kept with shared_preferences.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:14:29 +09:00
mikkeli a471bbe7c4 Captures: tap an action to go straight to it; the menu button inside a checklist
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 19s
CI / Debug APK (push) Successful in 40s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-15 20:27:08 +09:00
mikkeli 85f553b034 Compass: a fix while standing still (no heading) is subdued, not the no-receiver alarm
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 20s
CI / Debug APK (push) Successful in 41s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-15 20:20:09 +09:00
mikkeli f03a0ad464 Dash: speed and coolant from CAN (vehicle_speed_kph, coolant_temp_c); GNSS speed beside
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 20s
CI / Debug APK (push) Successful in 1m1s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-15 20:17:46 +09:00
mikkeli 4cf7a786d6 App structure: a swipe-in menu shell; pages/, link/, actions/; Settings
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 13s
CI / Debug APK (push) Successful in 27s
The shell (shell.dart): a drawer from the left edge or each page's menu button.
Dash, Signals, Captures; Tools (Camera, Link test, Orin power options), the
rarely used ones, after pirate-station-aide; Settings (gateway address, dark/bright,
build-time theme and landing). Landing view at build time: YUKART_HOME=dash|signals,
signals for now. Dash, Signals and Captures stay alive while hidden; Captures has its
own navigator, so a run survives switching views. Back goes inside Captures, then to
the landing view, then out. The mock banner sits over every page.

main.dart is startup only; the old home screen is pages/signals.dart; dialogs and
sheets moved to actions/; the protocol client, USB binding and Reading to link/.
lib/README.md catalogues it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-14 14:08:56 +09:00
mikkeli 3aeb09d61f Palette: seven roles (accent, good, caution added; highlight renamed alarm); no hard-coded colours left
/ crosscheck (push) Successful in 0s
CI / Analyze & Test (push) Successful in 13s
CI / Debug APK (push) Successful in 22s
background, foreground, subdued, accent (emphasis without danger), and the state
gradient good → caution → alarm; surface and onFill derived. smart-serow's
four-key themes still load (highlight = alarm; the new roles fall back).
Material's scheme follows: buttons in accent instead of the alarm colour.
Link state, mock banner, signal tiles, raw log, checklist button and marks,
camera page all take palette roles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-14 13:55:52 +09:00
mikkeli 8d95514897 Dash: DIN 1451 opt-in per widget (hudFont), GNSS compass, rei by default; widget catalogue
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 14s
CI / Debug APK (push) Successful in 36s
From smart-serow: the DIN 1451 face (Alte DIN 1451 Mittelschrift, via gps-speedo)
and GpsCompass. A cosmetic font is opt-in: widgets name hudFont in their own
TextStyle, the rest keeps the basic font (CJK). Boxes and telltales shrink long
labels instead of wrapping. Telltale and Reading get their own files;
lib/README.md catalogues folders and widgets like smart-serow's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-14 13:20:34 +09:00
mikkeli 728804e971 Dash: indicator telltales as Material triangle icons (◀▶ stay emoji on Android even with U+FE0E)
/ crosscheck (push) Successful in 0s
CI / Analyze & Test (push) Successful in 9s
CI / Debug APK (push) Successful in 16s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-14 00:26:39 +09:00
mikkeli 0513c9afab Dash: indicator arrows as text, not Android's emoji
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 10s
CI / Debug APK (push) Successful in 16s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-14 00:25:31 +09:00
mikkeli b083cf31dd Dash page and smart-serow's palette, boxed widgets, attitude and G-meter
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 9s
CI / Debug APK (push) Successful in 17s
Ported from smart-serow's HUD: the four-colour palette with dark/bright variants
(same theme JSON format, loaded at runtime; YUKART_THEME picks one), StatBox and
StatBoxMain, WhiskeyMark and AccelGraph. The whole app takes its colours from the
palette. Dash: attitude, G-meter, RPM, GNSS speed, pedal, coolant and telltales,
each from its contracts signal; missing and stale draw in subdued.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-13 23:25:28 +09:00
mikkeli eae93b0697 Orin power options: one confirmation that chooses power off or reboot
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 9s
CI / Debug APK (push) Successful in 24s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-13 22:52:18 +09:00
mikkeli 88c572f447 Shut down Orin: confirmed poweroff, sent once with the hello's boot_id
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 10s
CI / Debug APK (push) Successful in 16s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-13 18:35:49 +09:00
mikkeli bf8a99fb23 Captures page: the recording checklist with one start/end button
/ crosscheck (push) Successful in 1s
CI / Analyze & Test (push) Successful in 10s
CI / Debug APK (push) Successful in 24s
Steps come from a bundled copy of contracts checklists/ (assets/contracts/,
refreshed by tool/sync-contracts.sh), not from Dart.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-13 11:12:44 +09:00
mikkeli 7817f3dac5 Camera live view server moved to svc-vision
CI / Analyze & Test (push) Successful in 9s
CI / Debug APK (push) Successful in 15s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-12 16:14:39 +09:00
mikkeli 00d161e068 camview: tell the client when the camera is unavailable
CI / Analyze & Test (push) Successful in 9s
CI / Debug APK (push) Successful in 25s
The server sends "camera unavailable" after 3 s without a frame and
"camera ok" when frames come; the app shows the notice instead of a
stale frame.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-12 16:11:03 +09:00
mikkeli 85e3e1ad0e Link bar: four digits of message age are enough (the link is dead after 5 s)
CI / Analyze & Test (push) Successful in 9s
CI / Debug APK (push) Successful in 16s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-11 17:43:52 +09:00
mikkeli d343e77903 Link bar: fixed-width age and clock offset, so the bar no longer reflows
CI / Analyze & Test (push) Successful in 10s
CI / Debug APK (push) Successful in 16s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-11 17:43:27 +09:00
mikkeli 5ebca82e9b Camera live view (test): MJPEG over TCP from tool/camview_server.py, exposure and gain controls
CI / Analyze & Test (push) Successful in 9s
CI / Debug APK (push) Successful in 17s
Its own paced connection beside the boundary (project-yukart decision 27,
proposed); latest-wins per client, SO_MAX_PACING_RATE 4 MB/s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-11 17:41:14 +09:00
mikkeli 8f4e34d956 Link test: download series (bulk sampled, warm bursts, paced) and burst-vs-idle; car results
CI / Analyze & Test (push) Successful in 10s
CI / Debug APK (push) Successful in 15s
Orin -> tablet over NCM: paced streams up to 4 MB/s are clean; unpaced
bursts and bulk hit multi-second holds that inflate the RTO to 10-16 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-11 16:33:55 +09:00
mikkeli 6a91909945 Link test: optional @host on the launch hook; summary script for the Orin's results
CI / Analyze & Test (push) Successful in 9s
CI / Debug APK (push) Successful in 16s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-11 15:58:43 +09:00
mikkeli 6b5fef41c4 Link test: UDP echo sweep, soak and TCP each way, driven by the app
CI / Analyze & Test (push) Successful in 10s
CI / Debug APK (push) Successful in 25s
The tablet's app sockets are the only ones bound to the USB link, so the
measurement has to run in the app. tool/linktest_server.py serves the
Orin end and logs every result with its own TCP_INFO. Startable without
touching the screen: am start ... --es linktest <label>.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-11 15:55:52 +09:00
mikkeli d965031a56 Keep dropped-out signals as MISSING rows; clear the nav bar in the mark sheet
CI / Analyze & Test (push) Successful in 10s
CI / Debug APK (push) Successful in 26s
A signal absent from the latest state now stays listed (from the last
envelope seen on this gateway) and renders as missing, distinct from
null and stale as BOUNDARY.md requires; rows no longer jump.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-11 04:01:05 +09:00
mikkeli 50081d5417 Starter display: boundary v0 client, readout, mark button, CI
CI / Analyze & Test (push) Successful in 12s
CI / Debug APK (push) Successful in 57s
Connects to svc-gw over one WebSocket, heartbeats, treats timeout_ms of
silence as a dead link, and retries commands under the same id until acked.
Shows link state, signals with stale/null/missing told apart, the raw stream,
a mock banner on the surface, and a Mark button that stamps the recording.
Android: keeps the screen on and binds the process to the USB NCM network
when the gateway is on it. CI mirrors android-stuff's host-mode runner setup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
2026-10-09 20:23:00 +09:00
mikkeli a79b4ef9d3 Scaffold Flutter application: android and linux targets
flutter create --org dev.yukart --project-name display

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013kj58Jugkic783b8ZrtTVZ
2026-09-05 13:50:51 +09:00