Author the custom virtual HID gamepad that replaces vJoy, and pin its wire format on both sides. Builds clean to RioGamepad.sys against the EWDK (KMDF 1.15 + VHF, x64, warnings-as-errors). driver/RioGamepad/: - ReportDescriptor.h: 6x16-bit axes (X,Y,Z,Rx,Ry,Rz), one 4-direction hat with null state, and 96 buttons — the legacy vJoy layout. 25-byte input report. - Device.c/Driver.c: KMDF root-enumerated device that creates the VHF virtual HID device (VhfCreate in DeviceAdd, VhfStart in D0Entry, VhfDelete on cleanup) and exposes a device interface + IOCTL_RIO_SUBMIT_REPORT that forwards the caller's report bytes to VhfReadReportSubmit. Thin relay: no report logic in the kernel. - Public.h: device-interface GUID, IOCTL, and the report byte layout shared with the C# client. RioGamepad.inf + build.cmd (EWDK build, catalog/sign disabled). src/RioJoy.Core/Hid/RioHidReport.cs: packs AxisOutputs + hat + 96 buttons into the exact 25-byte report (LE axes, hat nibble with 0x0F=centered, button bitmap). 13 new xUnit tests (136 total). Remaining (deploy-side): test-sign + pnputil install + verify in joy.cpl, and wire the real DeviceIoControl feeder sink (replacing NullJoystickSink). The EWDK's in-build catalog task (DrvCat) can't load Microsoft.Kits.Logger on this image, so the .cat is produced with inf2cat/signtool at install time instead. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
46 lines
2.2 KiB
Markdown
46 lines
2.2 KiB
Markdown
# 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`](src/RioJoy.Core/) | Protocol, profile model, input mapper, HID feeder (class library) |
|
||
| [`src/RioJoy.Tray`](src/RioJoy.Tray/) | Background tray application |
|
||
| [`tests/RioJoy.Core.Tests`](tests/RioJoy.Core.Tests/) | xUnit tests for the protocol core |
|
||
| [`driver/`](driver/) | `RioGamepad` virtual HID driver (KMDF + VHF) — replaces vJoy |
|
||
| [`docs/PLAN.md`](docs/PLAN.md) | Full modernization plan (7 phases) |
|
||
| [`docs/PROTOCOL.md`](docs/PROTOCOL.md) | RIO wire format + `iRIO` input-map reference |
|
||
| [`docs/reference/`](docs/reference/) | Cockpit overlay art & the legacy labeling pipeline |
|
||
| [`legacy/`](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`](driver/README.md)).
|
||
|
||
```sh
|
||
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 compiles to `.sys` against the EWDK (KMDF + VHF), and the C# side
|
||
covers the serial + RIO protocol core, input mapping + output routing, axis
|
||
calibration + plasma display, the tray app + profiles (JSON config, `RIO.ini`
|
||
importer, three-state auto-switch), and the HID report packer that matches the
|
||
driver's wire format. Remaining work is **deploy-side**: test-sign + install the
|
||
driver, wire the real `DeviceIoControl` feeder, and verify on a cabinet. See
|
||
[`docs/PLAN.md`](docs/PLAN.md) for the full roadmap.
|