# 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 |
| [`tools/RioJoySmokeTest`](tools/RioJoySmokeTest/) | On-cabinet end-to-end check of the feeder → driver path |
| [`tools/XcfRegionExtract`](tools/XcfRegionExtract/) | Extracts cockpit label regions from `riojoy.xcf` → `regions.json` |
| [`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/hardware/`](docs/hardware/) | Board photos, scanned schematics, GAL fuse dump — the physical RIO board set |
| [`docs/reference/`](docs/reference/) | Cockpit overlay art & the legacy labeling pipeline |
| [`legacy/`](legacy/) | Original C++/vJoy implementation, kept as reference |

## Building

Requires the **.NET SDK** (8.0 or newer) plus the **.NET Framework 4.8
targeting/developer pack**, on Windows. The apps target **.NET Framework 4.8**,
which is in-box on every Windows 10/11 machine — so deployed builds are
framework-dependent and need **no runtime install** on the target. 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 (241 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`](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.ini` importer, 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). See [`docs/PLAN.md`](docs/PLAN.md) for the full roadmap.
