Documentation now describes the .NET Framework 4.8 stack (was .NET 8): - README build prerequisites + framework-dependent/no-runtime-install note, test count 136 -> 241. - PLAN.md architecture diagram, stack decision (with PolySharp/shims note), suite total 136 -> 241. - deploy/README-DEPLOY.txt: app is net48 framework-dependent (4.8 is in-box on Win10/11), and build prerequisites. Also migrate the three tools (RioJoySmokeTest, RioSerialMonitor, XcfRegionExtract) to net48 so they keep building against the now-net48 RioJoy.Core (a net8 project cannot reference a net48 one). Added PolySharp + System.Memory/System.Text.Json shims and replaced net-core-only APIs (string.Contains/IndexOf with comparison, Array.Fill, generic Enum.IsDefined, int.TryParse(span)). All three build clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
RioJoySmokeTest
On-cabinet verification that the virtual gamepad path works end to end: it
drives the real HidFeederJoystickSink
(open the RioGamepad device → submit reports via IOCTL_RIO_SUBMIT_REPORT) and
reads the gamepad back through winmm joyGetPosEx, the same data joy.cpl and a
game would see. It checks the six axes (min/mid/max), buttons, and the POV hat.
This is not part of RioJoy.sln and not a unit test — it needs the signed
driver actually installed (see driver/README.md), so
it only passes on a machine where the RioGamepad device is present.
Run
dotnet run --project tools/RioJoySmokeTest -c Release
Exit codes: 0 all checks passed · 1 a check failed · 2 driver or joystick
not found (driver not installed, or device not started — check Device Manager).