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>
1.8 KiB
RIOJoy
Modern Windows 10/11 interface between the cockpit RIO (Remote Input/Output) board and Windows, as a virtual joystick / keyboard / mouse — the successor to the legacy vJoy-based app, with no vJoy dependency.
The RIO has 72 digital inputs and outputs (lighted buttons) and 5 analog axes (joystick X/Y, throttle, left pedal, right pedal), connected over RS-232 at 9600 8N1. RIOJoy exposes these to games that don't natively know about the cockpit hardware, with per-game profiles. (The native games — Firestorm, Red Planet — talk to the RIO directly and do not use this app.)
Repository layout
| Path | Contents |
|---|---|
src/RioJoy.Core |
Protocol, profile model, input mapper, HID feeder (class library) |
src/RioJoy.Tray |
Background tray application |
tests/RioJoy.Core.Tests |
xUnit tests for the protocol core |
driver/ |
RioGamepad virtual HID driver (KMDF + VHF) — replaces vJoy |
docs/PLAN.md |
Full modernization plan (7 phases) |
docs/PROTOCOL.md |
RIO wire format + iRIO input-map reference |
docs/reference/ |
Cockpit overlay art & the legacy labeling pipeline |
legacy/ |
Original C++/vJoy implementation, kept as reference |
Building
Requires the .NET 8 SDK and Windows. The driver builds separately with the
WDK (see driver/README.md).
dotnet build RioJoy.sln -c Release
dotnet test RioJoy.sln
Status
Phases 2–3 (serial + RIO protocol core, input mapping + output routing) are
code-complete and unit-tested; the virtual-HID feeder and hardware verification
are pending on the Phase 1 driver. See docs/PLAN.md for the full
roadmap.