Port the analog calibration math and the plasma/VFD command set: - Calibration/: AxisCalibrator ports UpdateThrottle/UpdatePadal/UpdateJoystick (riovjoy2.cpp#L1504+) — throttle deadzone + ratchet field, pedal deadzones, joystick X/Y auto-ranging from observed min/max, rudder mixing (enableZR), and the per-axis invert flags. Stateful (start positions, last outputs, observed extremes) like the legacy globals, with the RIOcmd axis resets. Final outputs clamp to the documented 0..32766 range (also guards a legacy compounding quirk). AxisOutputs carries the six values; IJoystickSink gains SetAxis(JoyAxis,value) so calibrated axes reach the HID feeder. - Plasma/: PlasmaCommands builds the CPlasma ESC sequences (clear/cursor/font/ attr/box draw+fill/text) + GetFontSize + the PlasmaPosText auto-fit/centering; PlasmaDisplay writes them over the secondary COM transport. - tests: 21 new xUnit tests (105 total) for throttle proportional/saturation/ invert, pedal ZR mix vs. direct, joystick centering/direction/invert/reset, the output clamp, and plasma byte sequences/font sizes/auto-fit positioning. Hardware verification of axis feel + plasma output remains; the game-specific PlasmaScoreDraw layout is deferred to profile content (Phase 5/7). 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 |
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–4 (serial + RIO protocol core, input mapping + output routing, axis
calibration + plasma display) are code-complete and unit-tested (105 tests); the
virtual-HID feeder and hardware verification are pending on the Phase 1 driver.
See docs/PLAN.md for the full roadmap.