Files
riojoy/README.md
T
CydandClaude Opus 4.8 8d2d0b71aa Phase 7: cockpit overlay generator, region extraction, and profile editor
Overlay generator (pure, tested) — RioJoy.Core/Overlay:
- FontFitter ports the legacy calc-fontsize auto-fit search (validated against a
  brute-force oracle); OverlayLayoutEngine ports create-data-layer's fit + h/v
  justification and adds per-region 90 deg CCW rotation; OverlayTemplate/Region +
  OverlayTemplateStore hold cell geometry/colour/rotation (regions.json).
- GoobieDataImporter parses the legacy .data label sheet into label rows.
- src/RioJoy.Overlay: SkiaSharp rasterizer (SkiaTextMeasurer shared with the engine
  so measured layout == drawn output; SkiaOverlayRenderer -> PNG;
  ProfileWallpaperGenerator). Verified end-to-end on the real cockpit art
  (regions.json + riojoy.png + TEST.data) by OverlayRenderIntegrationTests.
- RioJoy.Tray/WallpaperApplier applies via SystemParametersInfo; RioCoordinator
  generates+applies on profile activation (opt-in via AppConfig.OverlayTemplatePath).

Region geometry — tools/XcfRegionExtract parses riojoy.xcf (a GIMP-format binary
reader, no GIMP needed) into the 119-cell regions.json: per-layer offsets/size/
font/colour, with 90 deg CCW rotation on a-00 + b-10..b-1F. Base image riojoy.png.
NOTE: the wallpaper positions are a VGA chroma-split display artifact (6 displays),
not the cockpit's logical layout.

Mapping editor (first cut) — RioJoy.Tray/Editor/ProfileEditorForm renders the
config sheet's logical grid (SheetLayout parses the sheet CSV export). The iRIO
word is edited via ButtonBinding <-> RioMapEntry.Create (no hex bit-twiddling), with
a context-sensitive picker: keyboard keys by name (KeyCatalog VK names), joystick
Button N, hat direction, mouse/RIO-command enum names; modifiers only for keyboard.
Opened from the tray ("Edit profile..."). The sheet-grid layout is a starting point
that needs rework from a better-formatted source.

~220 xUnit tests green. Docs (PLAN.md, README) updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 17:13:48 -05:00

2.6 KiB
Raw Blame History

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.xcfregions.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 15 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 (DeviceIoControlRioGamepad.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.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 for the full roadmap.