|
| 1 | +# wear-os-watch-ultra |
| 2 | + |
| 3 | +## What this branch adds |
| 4 | + |
| 5 | +Companion app for Wear OS 5+ watches (built and tuned on the Galaxy Watch |
| 6 | +Ultra). The phone holds the BLE link to the wheel and pushes a compact |
| 7 | +telemetry snapshot to the watch over the Wearable Data Layer; the watch is a |
| 8 | +thin client and never talks to the wheel directly. |
| 9 | + |
| 10 | +Concretely shipped here: |
| 11 | + |
| 12 | +- **Full-bleed speed dial** that wraps the entire watch face. Same arc |
| 13 | + geometry as the phone dashboard (260° sweep, accent-tinted safe band, |
| 14 | + orange/red danger wedges, ticks). Speed number, units, batteries and |
| 15 | + buttons live inside the dial. |
| 16 | +- **Three batteries at a glance** above the speed number: wheel, phone, and |
| 17 | + watch, each colour-graded by the same red/amber/green thresholds used on |
| 18 | + the phone dashboard. |
| 19 | +- **Accent colour follows the phone.** The accent the user picked in app |
| 20 | + settings travels through the wire format and tints the dial safe band, |
| 21 | + the wheel-name header on page 2, and the horn / light buttons. |
| 22 | +- **Imperial units follow the phone.** When `imperialUnits` is on, the |
| 23 | + watch shows mph, miles, and °F; flipping the setting takes effect within |
| 24 | + one publish cycle (≤200 ms). |
| 25 | +- **Page 2 — at-a-glance details.** Wheel name in accent, live speed, then |
| 26 | + a tabular column of voltage / current / power (V × A) / PWM / temp / |
| 27 | + torque / trip. Values align vertically across rows so you can scan down a |
| 28 | + column. |
| 29 | +- **Buttons follow the phone iconography.** Horn = `Icons.Filled.Campaign`, |
| 30 | + Light = `Icons.Filled.FlashOn` — same glyphs as the phone dashboard. |
| 31 | +- **Disconnected state** shows a phone glyph and a two-line "Open EUC |
| 32 | + Planet on your phone" message. No more red dot that read as an error. |
| 33 | +- **Resolution-clean.** All sizes derive from `BoxWithConstraints.maxWidth` |
| 34 | + so the layout looks right on small round watches (~390 dp) and on Watch |
| 35 | + Ultra (~454 dp) without separate code paths. |
| 36 | + |
| 37 | +## Architecture |
| 38 | + |
| 39 | +- `WearBridge` (phone, `app/`) subscribes to `WheelRepository` flows and |
| 40 | + `SettingsRepository.settings`, samples to 5 Hz, packs a `DataMap` and |
| 41 | + publishes at `/euc/state`. Reads phone battery via `BatteryManager`. |
| 42 | +- `WatchBridgeService` (watch, `wear/`) decodes the DataMap into a |
| 43 | + `WatchState` and updates a singleton `WatchStateRepository`. |
| 44 | +- `WatchApp` (Compose) collects from the repo and renders. |
| 45 | +- Control flow (horn / light) is the existing reverse channel: watch sends |
| 46 | + short Messages on `/euc/control`, phone routes them through |
| 47 | + `WheelRepository`. |
| 48 | + |
| 49 | +## Who should test this |
| 50 | + |
| 51 | +- **Watch Ultra owners** with a paired phone running the matching debug or |
| 52 | + pre-release APK from the same branch: confirm the dial reads correctly, |
| 53 | + battery percentages match Settings/Battery on each device, accent and |
| 54 | + imperial follow the phone, and horn/light controls work. |
| 55 | +- **Other Wear OS 5+ watches** (round and rectangular): the layout should |
| 56 | + scale; please report clipping or overlap. Square watches use the same |
| 57 | + dial with the corners falling outside the arc — intentional. |
| 58 | +- **Anyone curious about the UI without hardware**: debug builds expose an |
| 59 | + ADB demo broadcast. With the watch app open: |
| 60 | + ``` |
| 61 | + adb shell am broadcast -p com.eried.eucplanet \ |
| 62 | + -a com.eried.eucplanet.wear.DEMO \ |
| 63 | + --ef speed 32 --ei battery 78 --ei phone 64 \ |
| 64 | + --es accent teal --ef maxSpeed 70 \ |
| 65 | + --ez imperial false --es name "InMotion V14" |
| 66 | + ``` |
| 67 | + Speed/battery/accent/imperial extras are all optional. |
| 68 | + |
| 69 | +## Known limits |
| 70 | + |
| 71 | +- **Pairing must be done via the Wear OS by Google companion app** the |
| 72 | + first time. Without pairing, the watch shows the disconnected |
| 73 | + placeholder forever; this branch does not change that. |
| 74 | +- **Tile and complication** (carousel and watch-face quick-glance) are not |
| 75 | + here yet. The companion launches as an app you open from the launcher. |
| 76 | +- **No standalone (watch-only) BLE.** The watch never connects to the |
| 77 | + wheel directly; if the phone's app process is killed, telemetry stops. |
| 78 | +- **No on-watch settings.** Imperial / accent / max-speed cap are read |
| 79 | + from the phone — change them there. |
| 80 | + |
| 81 | +## Feedback |
| 82 | + |
| 83 | +File issues at https://github.com/eried/eucplanet/issues. Tag with the |
| 84 | +watch model and Wear OS version if you can. |
0 commit comments