The polish-backlog item, implemented from vRIO KeyboardLampMirror: game-commanded RIO lamp states paint per-key RGB keyboards through Windows Dynamic Lighting (WinRT LampArray). Keys bound to lamp addresses in the active bindings profile glow with the panel palette (red banks, yellow Secondary/Screen columns), flash modes use the exact L4MFDVIEW formula so keyboard and on-screen buttons blink in step, unbound keys are blacked out so the board reads as the button field, and zone-lit keyboards fall back to a board-wide mirror of the strongest lamp. Advantage over vRIO: Dynamic Lighting grants LEDs to the FOREGROUND app - which is the game - so no Windows settings dance. Isolation: L4KEYLIGHT.cpp compiles /std:c++17 + DEFAULT packing + conformance (per-file vcxproj settings; the engine /Zp1 would break the WinRT ABI) with a scalars-only interface, and all WinRT work runs on a private worker thread (watcher, claiming, 100ms paint loop). On by default with a bindings map present; RP412KEYLIGHT=0 opts out; missing Dynamic Lighting logs once and stays dormant. Verified live on the dev laptop: claimed its 24-zone keyboard (board-wide mirror) during a race; race cycling with per-race start/stop of the mirror thread stays green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
54 lines
2.4 KiB
C
54 lines
2.4 KiB
C
//===========================================================================//
|
|
// File: l4keylight.h //
|
|
// Project: MUNGA Brick: RGB keyboard lamp mirror //
|
|
// Contents: Windows Dynamic Lighting bridge (vRIO's KeyboardLampMirror) //
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1994-1995, Virtual World Entertainment, Inc. //
|
|
// PROPRIETARY AND CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#pragma once
|
|
|
|
//########################################################################
|
|
// Mirrors the game-commanded RIO lamp states onto per-key RGB keyboards
|
|
// through Windows Dynamic Lighting (the WinRT LampArray API), following
|
|
// vRIO's KeyboardLampMirror: keys bound to lamp addresses glow with the
|
|
// panel palette (red for the banks, yellow for the Secondary/Screen
|
|
// columns), flash modes blink at the panel's rates, other keys are
|
|
// blacked out so the keyboard reads as the button field. Zone-lit
|
|
// keyboards mirror the strongest lamp board-wide. Dynamic Lighting
|
|
// grants LED control to the FOREGROUND app - which is the game itself,
|
|
// so no Windows settings dance is needed.
|
|
//
|
|
// The implementation is C++/WinRT on a private worker thread, compiled
|
|
// with default struct packing (the engine builds /Zp1, which would
|
|
// break the WinRT ABI) - hence this interface is scalars only. All
|
|
// functions are safe to call when Dynamic Lighting is unavailable;
|
|
// failures log once and the mirror stays dormant.
|
|
//########################################################################
|
|
|
|
// Where the mirror's status lines go (the caller owns the sink).
|
|
void
|
|
KeyLight_SetLogger(void (*logger)(const char *line));
|
|
|
|
// The key map: parallel arrays of virtual keys, their RIO lamp
|
|
// addresses (0x00-0x47), and whether each paints yellow (Secondary /
|
|
// Screen columns) instead of red.
|
|
void
|
|
KeyLight_SetMap(
|
|
const int *virtual_keys,
|
|
const int *addresses,
|
|
const unsigned char *yellow,
|
|
int count
|
|
);
|
|
|
|
// Latest game-commanded lamp bytes (indexed by RIO lamp number).
|
|
void
|
|
KeyLight_UpdateLamps(const unsigned char *lamp_state, int count);
|
|
|
|
// Claim keyboards and start painting / release the LEDs to Windows.
|
|
void
|
|
KeyLight_Start();
|
|
void
|
|
KeyLight_Stop();
|