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>
51 lines
2.6 KiB
Markdown
51 lines
2.6 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 |
|
||
| [`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/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 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.
|