Reworked the profile/mapping editor to mirror the original unfinished Win32 RIO driver's control-panel design (docs/Win32RIO, by FASA / Michel Lowrance) instead of the flat config-sheet grid. The wallpaper region positions are a VGA chroma-split display artifact, not the cockpit's logical shape. - RioJoy.Core.Editing.CockpitPanel: the functional layout — five MFD clusters, four board columns (Throttle/Secondary/Screen/Joystick-Hat), an encoder-gauge strip, and the two later-added 4x4 keypads (Internal/External). Places every address 0x00-0x47 / 0x50-0x6F exactly once (unit-tested). - Tray PanelView/PanelCanvas render the panel; ProfileEditorForm drives it. Buttons show label + assigned function (ButtonBinding.Describe -> CTL-N, JOY1, POV-U, Mse LB, RIO command names; unit-tested). Lamp shade is driven by the IsLit flag (not by whether a function is assigned); keypads are neutral blue with no Lit checkbox. Added an Unassign button next to Apply. - Removed the superseded sheet-grid UI (SheetView/SheetCanvas); SheetLayout + config-sheet.csv stay as reference data. docs/Win32RIO: the original driver (tasgame.sys, a 32-bit kernel HID minidriver that opened the serial port, set baud/8N1/DTR, and spoke the *identical* RIO protocol -- AnalogRequest/Reply, Button Pressed/Released, Check/Lamp/Reset/ Version -- validating our protocol port), oemsetup.inf, RemoteDriver.doc, and the extracted control-panel / game-controllers mockups. ~236 xUnit tests green. PLAN.md updated. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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 |
tools/RioJoySmokeTest |
On-cabinet end-to-end check of the feeder → driver path |
tools/XcfRegionExtract |
Extracts cockpit label regions from riojoy.xcf → regions.json |
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 1–5 are implemented and tested (136 unit tests). The RioGamepad virtual
HID driver is built (KMDF + VHF), test-signed, installed, and verified: it
enumerates in joy.cpl, and the C# HID feeder (DeviceIoControl →
RioGamepad.sys) drives its axes, buttons, and hat end-to-end (see
tools/RioJoySmokeTest). The C# side covers the serial
- RIO protocol core, input mapping + output routing, axis calibration + plasma
display, the tray app + profiles (JSON config,
RIO.iniimporter, three-state auto-switch), and the HID report packer that matches the driver's wire format. Remaining work is on-cabinet (real RIO serial/axis/plasma/auto-switch verification) plus packaging (Phase 6) and the profile editor + overlay generator (Phase 7). Seedocs/PLAN.mdfor the full roadmap.