- Feature 1: Remote Battery Monitoring & Low-Battery LED Alert (Closes#5)
* Parse BLE Battery Service (0x180F) & Characteristic (0x2A19) with notifications and polling
* Double-pulse white LED blink on onboard NeoPixel when battery <= 15%
* Display real-time battery percentage in Web UI status bar and BLE tab
- Feature 2: Wake-on-LAN (WOL) & Advanced Actions Architecture (Closes#1)
* Implement UDP broadcast WOL Magic Packet builder and sender (ACTION_WOL = 11)
* Support MAC parsing in colon, dash, or 12-char hex formats, with port configuration
* Add 'Advanced Extension' mode in Keymap UI with WOL tester and placeholders for Macro, Webhook, and MQTT
* Persist wol_mac in NVS and handle immediate trigger on keypress
- Docs: Update README.md and ROADMAP.md reflecting new features and future plans
- Build: Update prebuilt firmware binaries in RemoteMapper-Flasher/bin
- Relax UAC isochronous watchdog timeout from 50ms to 3000ms to allow Windows audio engine scheduling headroom
- Remove unsafe DWC2 hardware register EPDIS/SNAK manipulation and invalid clear_stall on ISO endpoints
- Implement clean TinyUSB soft reset helper (uac_soft_reopen_endpoint) for recovery and SET_INTERFACE
- Update all prebuilt binaries in RemoteMapper-Flasher
- CLI listens on both UART0 and USB CDC; add 'wifi on|off|status' and 'log on|off'
- Wi-Fi on/off is persisted to NVS and applied on reboot; never de-init the Wi-Fi stack at runtime
- Skip Wi-Fi init and the web server when Wi-Fi is disabled (fixes the lwIP assert reboot loop)
- app_log mirrors logs to CDC only when enabled (default off)
- /api/status exposes wifi_enabled
- Refresh N16R8/N8R2/N4R2 prebuilt flasher binaries on top of the ATVV BLE fix from master
- Remove blocking GATT calls from on_hogp_report_notify to prevent NimBLE task deadlock
- Safely drop length > 8 non-keyboard packets from HOGP to eliminate ADPCM white noise
- Restructure GATT service discovery to prioritize ATVV service before HID with paced CCCD subscriptions
- Add safe non-blocking background ATVV recovery on Core 0 task loop
- Update all prebuilt binaries for N16R8, N8R2, and N4R2
- Eliminate 450ms BLE_SILENCE_WATCHDOG_MS to prevent prematurely cutting off voice while held
- Restore clean ADPCM audio pipeline state machine to eliminate decode desync / white noise
- Update GitHub Actions release workflow: trigger on git push instead of daily cron
- Update prebuilt firmware binaries and RemoteMapper-Flasher packages
- Remove boot-time forced MIC_OPEN in setup_services_and_handshake()
- Remove automatic cmd_open response in on_ctl_notify() when audio stops/mic closes
- Guard voice release event distribution so it only triggers during active speech (BLE_STATE_TALKING)
- Only open microphone on demand when MI_KEY_VOICE is physically pressed
- Update all prebuilt firmware binaries and RemoteMapper-Flasher packaging
- Fix cross-core deadlock in WebServer (Core 1) vs ble_remote_task (Core 0) via asynchronous request flags
- Fix BLE SMP connection drops by purging stale NimBLE bonds with deleteAllBonds() and correcting AuthReq to Just Works
- Remove periodic 5-second MIC_OPEN ping to allow BLE deep sleep and restore remote battery life
- Add strict exclusivity filter in is_target_remote() to prevent hijacking by neighbor devices
- Add Bluetooth pairing & unpair management card in WebUI
- Add GitHub Actions daily release workflow to package and update Flasher assets
- Update pre-built firmware binaries and RemoteMapper-Flasher archives
- Added F13-F24 custom key mappings in WebUI dropdown and DOM_TO_HID map
- Created pc_companion package with zero-CPU Win32 RegisterHotKey daemon (remotemapper_host.py)
- Added JSON hot-reload config, autostart manager, silent background launcher, and PyInstaller builder
- Ensured full portability with dynamic relative path resolution and Python environment resolution for distribution
- Added proactive direct connection to bound remote on boot alongside continuous background scanning
- Restored full GATT characteristic discovery with 10-channel subscriptions ensuring stable ATVV audio delivery
- Filtered vendor non-keyboard reports in on_hogp_report_notify to prevent premature voice key releases
- Confirmed all features working: BLE auto-reconnect, 16kHz USB microphone audio, HID mapping, and RGB indicators
- Unified key_engine_tick and key events on Core 0 with recursive mutex to eliminate stuck key race conditions
- Added HID hardware report mutex lock in usb_composite to ensure 100% reliable report delivery
- Fixed RGB LED logic: solid red on disconnect, solid green on standby, solid blue on voice record, yellow flash on HID press
- Removed UAC endpoint enumeration false blue-light trigger
- Fixed duplicate ACTION_VOICE_HOLD emission on Voice key release due to missing else-if block in key_state_machine.c
- Removed redundant manual usb_hid_dispatch_action calls in ble_remote_client.cpp since key_engine handles them
- Fixed hardcoded VOICE modifier/key in usb_composite.cpp to correctly respect user's configured bindings
- Implemented LED indicator feature (24 brightness)
- Migrated UAC microphone to hardware xfer_cb (fixed endpoint collision)
- Rolled back ATVV strict 0x03 check to prevent infinite ping-pong loop
- Rolled back HOGP keyboard release to fix modifier sticky keys
- Rolled back Volume keys to TAP with repeat to preserve stability