Phase 3: input mapping + output routing (RioJoy.Core.Mapping)
Port the iRIO decode and Press_V2/Release_V2 routing into testable C#: - Mapping/: RioMapEntry decodes the 16-bit map word (lamp/mouse/hat/joy/extended/ alt/ctrl/shift flags + value) and resolves the routing Kind by the legacy precedence (joy+hat+mouse => RIO command; none => keyboard; else joy>hat>mouse). RioAddress translates button/keypad events to table addresses (+0x50/+0x60 keypad offsets); RioInputMap is the 112-entry per-profile table replacing the hard-coded iRIO[]. - InputRouter ports Press_V2/Release_V2: modifier press/release ordering, scancode keys, joystick buttons, POV hat, mouse move/click (deltas corrected per PROTOCOL.md), RIO-command dispatch, and lamp feedback (bright on press, dim on release; RIO commands carry none). InitializeLamps() dims all lamp entries. - Output is split behind sink interfaces (IInputSink/IJoystickSink/ILampSink/ IRioCommandSink) so routing is pure + unit-tested; Output/SendInputSink is the real SendInput keyboard/mouse adapter (scancode injection). - tests: 30 new xUnit tests (84 total) for entry decode, address translation, and router routing/precedence/lamp/modifier ordering via a recording sink. The joystick sink's real adapter (HID feeder -> RioGamepad via DeviceIoControl) is blocked on the Phase 1 driver; routing already targets IJoystickSink. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+19
-4
@@ -129,10 +129,25 @@ Implemented in `src/RioJoy.Core/Protocol` + `Serial`, covered by
|
||||
- ⏳ **Remaining:** verify against real hardware (version reply, check reply,
|
||||
analog stream) — needs a cabinet; can't be done off-device.
|
||||
|
||||
### Phase 3 — Input mapping + output routing
|
||||
- Port `iRIO` decode and routing precedence (keyboard/mouse/joy/hat/RIO-command).
|
||||
- Keyboard/mouse via `SendInput` P/Invoke; lamp feedback over serial.
|
||||
- HID-report feeder → the Phase 1 driver via `DeviceIoControl`.
|
||||
### Phase 3 — Input mapping + output routing — code-complete ✅
|
||||
Implemented in `src/RioJoy.Core/Mapping` + `Output`, covered by the
|
||||
`Mapping` tests (xUnit, 84 tests total):
|
||||
- `RioMapEntry` decodes the 16-bit `iRIO` word (flags + value) and resolves the
|
||||
routing `Kind` by the legacy precedence (joy+hat+mouse ⇒ RIO command; none ⇒
|
||||
keyboard; else joy → hat → mouse).
|
||||
- `RioAddress` (button + keypad→address offsets) and `RioInputMap` (112-entry
|
||||
per-profile table) replace the hard-coded `iRIO[]`.
|
||||
- `InputRouter` ports `Press_V2`/`Release_V2`: modifier ordering, scancode keys,
|
||||
joystick buttons, POV hat, mouse move/click, RIO-command dispatch, and lamp
|
||||
feedback (bright on press / dim on release; RIO commands carry none).
|
||||
- Output is split behind sink interfaces (`IInputSink`, `IJoystickSink`,
|
||||
`ILampSink`, `IRioCommandSink`) so routing is pure and unit-tested; `SendInputSink`
|
||||
is the real `SendInput` keyboard/mouse adapter.
|
||||
- ⏳ **Remaining:** the joystick sink's real adapter is the **HID feeder →
|
||||
RioGamepad driver via `DeviceIoControl`**, which is blocked on the Phase 1
|
||||
driver. Routing already targets `IJoystickSink`; wire the IOCTL adapter once the
|
||||
driver exists. The legacy default map / `RIO.ini` becomes an importable profile
|
||||
(Phase 5/7).
|
||||
|
||||
### Phase 4 — Axis calibration + plasma display
|
||||
- Port `UpdateJoystick/Throttle/Padal` math (deadzones, ratchet, rudder).
|
||||
|
||||
Reference in New Issue
Block a user