diff --git a/README.md b/README.md index 7d90502..16b176e 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,17 @@ controls: - Cells shade to the **lamp state the host commands** (`LampRequest`: off / dim / bright, with slow/med/fast flash), so RIOJoy's press-feedback lights the on-screen panel just like the real buttons. +- **Lamps can mirror onto an RGB keyboard** (*Mirror lamps on RGB keyboard*, + via Windows 11 Dynamic Lighting): keys bound to lamp-capable buttons glow + with the panel's palette and blink in step with the on-screen flash modes; + per-key keyboards get the full button field, zone-lit keyboards show the + strongest current lamp board-wide, and a picker narrows the mirror to one + keyboard when several are attached. For the LEDs to stay lit while the + *game* has focus, vRIO needs package identity: run `pkg\Register-vRIO.ps1` + once (Developer Mode required; pass the exe folder for a deployed copy), + launch vRIO from its **Start menu entry** (a direct exe launch runs without + identity), then drag vRIO to the top of *Settings → Personalization → + Dynamic Lighting → Background light control*. - **Keyboard and Xbox (XInput) controller input** drive the same controls through a bindings file (`%APPDATA%\vRIO\bindings.txt`, created with commented defaults on first run — *Edit bindings…* opens it, *Reload @@ -60,11 +71,10 @@ device behavior grounded in the **real v4.2 firmware dump** - `ResetRequest` re-zeroes the targeted axis (or all). - A NAK re-sends the last event up to **4 times**, then gives up with a RESTART byte — the real board's retry budget. -- Optional **v4.2 reply-wedge emulation**: after retry exhaustion (or the - "Wedge analog now" button), analog requests are silently dropped — still - ACK'd, RX path alive — until a host `ResetRequest`, reproducing the - latch-leak fault the firmware analysis documents. Use it to exercise - RIOJoy's 5-second no-analog recovery watchdog. +- Optional **v4.2 reply-wedge emulation** (in `VRio.Core`; the UI toggles + were removed): after retry exhaustion, analog requests are silently + dropped — still ACK'd, RX path alive — until a host `ResetRequest`, + reproducing the latch-leak fault the firmware analysis documents. ## Using it with RIOJoy on one PC @@ -86,6 +96,7 @@ a null-modem cable work the same way. |------|----------| | `src/VRio.Core` | Protocol framing/builder/parser, the `VRioDevice` state machine, serial pump, panel layout data (class library) | | `src/VRio.App` | WinForms panel UI | +| `pkg` | Sparse-package manifest + registration script: grants VRio.App.exe the package identity Dynamic Lighting's background-control list requires | | `tests/VRio.Core.Tests` | xUnit tests for the protocol + device engine | ## Building diff --git a/pkg/AppxManifest.xml b/pkg/AppxManifest.xml new file mode 100644 index 0000000..8ac2b93 --- /dev/null +++ b/pkg/AppxManifest.xml @@ -0,0 +1,67 @@ + + + + + + + + vRIO + VWE + Assets\logo150.png + true + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pkg/Assets/logo150.png b/pkg/Assets/logo150.png new file mode 100644 index 0000000..11904c3 Binary files /dev/null and b/pkg/Assets/logo150.png differ diff --git a/pkg/Assets/logo44.png b/pkg/Assets/logo44.png new file mode 100644 index 0000000..aded517 Binary files /dev/null and b/pkg/Assets/logo44.png differ diff --git a/pkg/Public/README.txt b/pkg/Public/README.txt new file mode 100644 index 0000000..f0a21e6 --- /dev/null +++ b/pkg/Public/README.txt @@ -0,0 +1 @@ +Public folder for the com.microsoft.windows.lighting app extension (required by the manifest schema). diff --git a/pkg/Register-vRIO.ps1 b/pkg/Register-vRIO.ps1 new file mode 100644 index 0000000..cc62adb --- /dev/null +++ b/pkg/Register-vRIO.ps1 @@ -0,0 +1,53 @@ +<# +.SYNOPSIS +Grants VRio.App.exe package identity by registering the sparse package +(pkg\AppxManifest.xml) with the exe's folder as the external location. + +Identity is what lets Windows Dynamic Lighting offer vRIO under +Settings > Personalization > Dynamic Lighting > "Background light control", +so the keyboard lamp mirror keeps working while the game has focus. + +Unsigned registration requires Developer Mode +(Settings > System > For developers). + +.PARAMETER ExePath +Folder containing VRio.App.exe. Defaults to the repo's Release output; +for a deployed zip, pass the extracted VRio folder. + +.PARAMETER Unregister +Remove the registration instead. +#> +param( + [string]$ExePath = (Join-Path $PSScriptRoot '..\src\VRio.App\bin\Release\net48'), + [switch]$Unregister +) + +$ErrorActionPreference = 'Stop' +$packageName = 'VWE.vRIO' + +$existing = Get-AppxPackage -Name $packageName -ErrorAction SilentlyContinue +if ($existing) { + Write-Host "Removing existing registration $($existing.PackageFullName)..." + Remove-AppxPackage -Package $existing.PackageFullName +} +if ($Unregister) { + Write-Host 'Unregistered.' + return +} + +$exe = Join-Path $ExePath 'VRio.App.exe' +if (-not (Test-Path $exe)) { throw "VRio.App.exe not found in '$ExePath'" } +$manifest = Join-Path $PSScriptRoot 'AppxManifest.xml' + +Add-AppxPackage -Register $manifest -ExternalLocation (Resolve-Path $ExePath).Path +$family = (Get-AppxPackage -Name $packageName).PackageFamilyName +Write-Host "Registered $packageName with external location '$ExePath'." +Write-Host '' +Write-Host 'IMPORTANT: identity is granted through shell activation only. Launch vRIO' +Write-Host 'from the Start menu entry ("vRIO") or via:' +Write-Host " explorer shell:AppsFolder\$family!vRIO" +Write-Host 'Double-clicking VRio.App.exe runs it WITHOUT identity (lamp mirror then' +Write-Host 'works only while vRIO has focus).' +Write-Host '' +Write-Host 'Then enable the lamp mirror and pick vRIO under Settings > Personalization >' +Write-Host 'Dynamic Lighting > Background light control.'