The low-battery blink would stay frozen mid-cycle (or briefly resume during reconnect retries) after a controller died and lost connection, because the stale-report check stopped toggling but never turned the LED off, and the cached interrupt_in_data[52] still read low. New `battery_led_on_disconnect()` clears blink state, forces the LED off, and zeros last_report_us so the stale-check early-return blocks any new blink until a fresh 0x31 report arrives on the next connection. Called from bt.cpp's HCI_EVENT_DISCONNECTION_COMPLETE handler. Stale-check in the tick also now forces LED off when it fires while a blink was in progress (defense in depth for unclean disconnects). Same bug exists in upstream awalol/DS5Dongle (their battery_led.cpp is byte-identical to ours pre-fix) — Sura Academy reported it in their Discord. Plan to send this back as a PR after we validate it locally. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
27 lines
1.0 KiB
C
27 lines
1.0 KiB
C
//
|
|
// Low-battery LED indicator for the Pico onboard LED.
|
|
// Reads PowerPercent / PowerState from interrupt_in_data[52]
|
|
// (DualSense BT 0x31 report, see USBGetStateData in utils.h).
|
|
//
|
|
|
|
#pragma once
|
|
|
|
void battery_led_init(void);
|
|
|
|
// Call once per main-loop iteration. Drives the LED blink while the
|
|
// battery is low and the controller is connected; otherwise no-op.
|
|
void battery_led_tick(void);
|
|
|
|
// Call from the BT input-report callback whenever a fresh 0x31 report
|
|
// has been copied into interrupt_in_data. Used to detect disconnection
|
|
// via stale-report timeout.
|
|
void battery_led_note_report(void);
|
|
|
|
// Call from the BT disconnect handler. Cancels any in-progress blink,
|
|
// forces the LED off, and arms the module so it ignores the cached
|
|
// (now-stale) battery byte until a fresh report arrives on the next
|
|
// connection. Without this, the LED can stay frozen in whichever state
|
|
// it was at the moment of disconnect, or briefly resume blinking during
|
|
// reconnect retries while interrupt_in_data[52] still reads low.
|
|
void battery_led_on_disconnect(void);
|