Ported from RP412: RIOBase split out of the serial RIO (L4RIO.h), rioPointer is RIOBase* (L4CTRL.h), PAD token -> new PadRIO() speaking the RIO surface from an XInput pad + keyboard (L4PADRIO/L4PADBINDINGS, vRIO bindings.txt grammar, hot-plug), KeyLight RGB mirror TU (BT412KEYLIGHT, /std:c++17 per-file). BT-side fixes PadRIO forced into the open: - Both keyboard input bridges (mech4.cpp, mechmppr.cpp BT_KEY_BRIDGE) stand down when a RIO device exists -- they overwrote the engine controls push every frame. M/X conveniences stay live. - Mapper attribute chain OFF BY ONE (latent real-pod bug): the DOS chain below MechControlsMapper carried two base attributes, WinTesla carries one, and AttributeIndexSet::Find is positional -- the .CTL stick mapping wrote throttlePosition. Pad slot + binary-locked enum; gotcha ledgered (reconstruction-gotchas #11). Verified: PAD throttle lever ramps + sticks, stick turns with the authentic speed-vs-turn clamp (61.5 -> 22.0 u/s), mech drives; keyboard fallback intact (BT_FORCE_THROTTLE harness). New diags: BT_CTRLMAP_LOG, BT_STICK_LOG. (Phase 2 of docs/BT412-ROADMAP.md) 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();
|