Phase 5: tray app + profiles + runtime wiring
Wire the Core pieces into a runnable tray app with per-game profiles and the three-state serial-yield auto-switch: - Profiles/: RioProfile + AppConfig model; ConfigStore (System.Text.Json, round-tripped); RioIniImporter ports the legacy RIO.ini (button table, invert flags, plasma greeting); AutoSwitchResolver + AutoSwitchWatcher resolve the foreground executable into Yield (native game) / Activate (profile) / Idle, with native always winning and change-only notifications. IForegroundProcessProvider abstracts the OS. - RioRuntime assembles a profile's live pipeline: serial ButtonPressed/Released + KeyPressed/Released → InputRouter (via RioAddress); AnalogReply → AxisCalibrator → the six joystick axes; RIO commands → calibration resets + version/check requests + lamp re-init. SerialLampSink sends lamp feedback over the link; NullJoystickSink is a placeholder until the Phase 1 HID feeder exists. - RioJoy.Tray: NotifyIcon menu mirroring the legacy console menu (axis resets, version/status, raw-axes & poll-rate toggles, quit) + profile selection (auto vs. manual) + "start with Windows"; RioCoordinator owns the serial acquire/release tied to the watcher (native-game COM-port yield). OS adapters: ForegroundProcessProvider (Win32 foreground PID→exe) and AutoStartManager (HKCU Run key). - tests: 18 new xUnit tests (123 total) for config round-trip, ini import, the three-state resolver + watcher, and RioRuntime end-to-end over the fake transport (button→joystick, keypad-offset→keyboard, analog→six axes). The joystick output stays a no-op until the Phase 1 driver; on-cabinet verification of the acquire/release lifecycle remains. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+20
-6
@@ -164,12 +164,26 @@ Implemented in `src/RioJoy.Core/Calibration` + `Plasma` (105 xUnit tests total):
|
||||
- ⏳ **Remaining:** hardware verification of axis feel + plasma output; the
|
||||
game-specific `PlasmaScoreDraw` layout is profile content (Phase 5/7).
|
||||
|
||||
### Phase 5 — Tray app + profiles
|
||||
- NotifyIcon + menu mirroring the legacy console menu (reset/recalibrate axes,
|
||||
version/status, toggle raw-axis & poll-rate readouts, quit) + status/log window.
|
||||
- **Profile library**, manual selection, and the **three-state auto-switch
|
||||
watcher** (incl. native-game yield).
|
||||
- Config persistence; auto-start.
|
||||
### Phase 5 — Tray app + profiles — code-complete ✅
|
||||
Core logic in `src/RioJoy.Core/Profiles` + `RioRuntime`; UI/OS in `src/RioJoy.Tray`
|
||||
(123 xUnit tests total):
|
||||
- `RioProfile` + `AppConfig` model; `ConfigStore` JSON persistence (round-trip
|
||||
tested); `RioIniImporter` ports the legacy `RIO.ini` (buttons/inverts/greeting).
|
||||
- `AutoSwitchResolver` + `AutoSwitchWatcher`: the three-state decision
|
||||
(Yield native / Activate profile / Idle) from the foreground executable, native
|
||||
always winning; raises only on change. Pure + tested.
|
||||
- `RioRuntime` assembles a profile's live pipeline: serial button/keypad packets →
|
||||
`InputRouter`; analog replies → `AxisCalibrator` → the six joystick axes; RIO
|
||||
commands → calibration resets + serial requests + lamp re-init. End-to-end tested
|
||||
over the fake transport.
|
||||
- Tray: `NotifyIcon` menu mirroring the legacy console menu (axis resets,
|
||||
version/status, diagnostic toggles, quit) + profile selection (auto vs. manual)
|
||||
+ "start with Windows"; `RioCoordinator` owns the serial acquire/release tied to
|
||||
the watcher (native-game COM-port yield); OS adapters
|
||||
(`ForegroundProcessProvider`, `AutoStartManager`).
|
||||
- ⏳ **Remaining:** the joystick output is a `NullJoystickSink` placeholder until
|
||||
the Phase 1 HID feeder exists; full on-cabinet verification of the auto-switch +
|
||||
acquire/release lifecycle.
|
||||
|
||||
### Phase 6 — Packaging / signing / deploy
|
||||
- Driver install via `pnputil`; app installer; test-signing script.
|
||||
|
||||
Reference in New Issue
Block a user