NamedPipeTransport connects as a client to vRIO's \\.\pipe\vrio (the DOSBox-X fork's role) and speaks the shared typed-frame contract (PipeFraming: 0x00 data / 0x01 modem lines, null-modem crossed). The COM path's DTR reset pulse is replayed in-band on connect. Peer disconnects and framing violations surface as the 0-byte transport-closed read the link already understands. RioTransportFactory routes endpoint strings — pipe:name (vRIO's own picker syntax) to the pipe transport, everything else to SerialPortTransport — and is wired into RioCoordinator and all three RioSerialMonitor modes, so profiles (RioComPort/DefaultRioComPort) and the bench tools take pipe endpoints anywhere a COM name went. Gotcha baked into the design: named pipes here have 0-byte buffers, so a write blocks until the peer reads it, and vRIO also writes its lines frame before reading — the on-connect pulse frames are therefore queued as overlapped writes (pipe writes drain in issue order, preserving the edge positions) instead of blocking the constructor into a mutual write-first deadlock. Verified end-to-end against the real VRioDevice + VRioPipeService over \\.\pipe\vrio: version 4.2 + check replies, 137 analog polls, lamp commands ACKed, zero framing errors. 322 tests green, both flavors. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
68 lines
3.9 KiB
Markdown
68 lines
3.9 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 |
|
||
| _RIO board hardware & firmware_ | Moved to the [TeslaRel410 `restoration/`](https://gitea.mysticmachines.com/VWE/TeslaRel410/src/branch/main/restoration) archive — board photos, schematics, GAL decode (`restoration/rio-hardware`) and the RIO 4.3 board firmware (`restoration/rio-firmware`) |
|
||
| [`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.
|
||
|
||
## Testing without hardware: vRIO over a named pipe
|
||
|
||
The [vRIO](https://gitea.mysticmachines.com/VWE/VRIO) device emulator can stand
|
||
in for the real board with no com0com pair: anywhere a COM port name is
|
||
configured — a profile's `RioComPort`, the app-wide `DefaultRioComPort`, or the
|
||
`RioSerialMonitor` `[port]` argument — the endpoint `pipe:vrio` connects to
|
||
vRIO's `\\.\pipe\vrio` instead (vRIO must have its pipe endpoint open). Serial
|
||
bytes and modem lines (including the DTR reset pulse on open) travel as typed
|
||
frames over the pipe; the contract lives in
|
||
[`src/RioJoy.Core/Serial/PipeFraming.cs`](src/RioJoy.Core/Serial/PipeFraming.cs)
|
||
on this side and vRIO's `PipeFraming.cs` / the DOSBox-X fork's
|
||
`serialnamedpipe.h` on the others.
|