Fix Bluetooth pairing, menu crashes, and improve UX
Major fixes and improvements to Bluetooth device management and menu navigation: **Bluetooth Device Pairing** - Fixed discovered devices not being saved as paired after connection - Only save devices to NVS when successfully connected (not just discovered) - Auto-pair discovered devices on successful A2DP connection - Update device list to show paired status immediately after connection **Critical Bug Fixes** - Fixed dangling pointer crash in NVS request/response mechanism - Was sending pointer to stack variable, now sends result value directly - Prevents crash when connecting to Bluetooth devices - Fixed use-after-free crash when clicking menu items after dynamic updates - Menu context now properly synchronized after adding/removing items - Prevents InstructionFetchError crashes in menu navigation - Fixed memory exhaustion by reducing MAX_BT_DEVICES from 20 to 8 - Prevents heap allocation failures when populating device list **Menu & UX Improvements** - "Clear Paired" button now properly disconnects active connections - "Clear Paired" button always visible when paired devices exist - GUI updates immediately after clearing paired devices - Paired devices marked with asterisk prefix (* Device Name) - Removed redundant "(paired)" suffix text - Long device names scroll smoothly when selected (3-second animation) - Refresh button preserved during menu updates to prevent crashes - Menu focus state properly maintained across all dynamic updates **Technical Details** - bt_add_discovered_device() no longer saves to NVS - Added currentFocusIndex() calls after all menu modifications - Improved clear_bt_device_list() to avoid deleting active buttons - Added bt_disconnect_current_device() for clean disconnections - Fixed NVS notification mechanism to avoid stack variable pointers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -47,11 +47,14 @@ typedef struct SystemState_s
|
||||
|
||||
// BT event data
|
||||
int btDeviceIndex;
|
||||
|
||||
|
||||
// NVS cached data
|
||||
paired_device_t pairedDevices[MAX_PAIRED_DEVICES];
|
||||
size_t pairedDeviceCount;
|
||||
|
||||
// Charge status
|
||||
bool isCharging;
|
||||
|
||||
} SystemState_t;
|
||||
|
||||
|
||||
@@ -67,6 +70,7 @@ typedef struct SystemState_s
|
||||
#define EM_EVENT_BT_CONNECT (1UL<<3)
|
||||
#define EM_EVENT_VOLUME_UP (1UL<<4)
|
||||
#define EM_EVENT_VOLUME_DOWN (1UL<<5)
|
||||
#define EM_EVENT_BT_DISCOVERY_COMPLETE (1UL<<6)
|
||||
// …add more event bit-masks here…
|
||||
|
||||
typedef struct {
|
||||
@@ -83,6 +87,9 @@ ImuData_t system_getImuData(void);
|
||||
int system_getPrimaryAxis(void);
|
||||
float system_getAngle(void);
|
||||
|
||||
void system_setChargeStatus(bool charging);
|
||||
bool system_getChargeStatus(void);
|
||||
|
||||
void system_setZeroAngle(void);
|
||||
void system_clearZeroAngle(void);
|
||||
float system_getZeroAngle(void);
|
||||
@@ -133,6 +140,7 @@ bool system_isDeviceKnown(esp_bd_addr_t bda);
|
||||
esp_err_t system_getKnownDeviceCount(size_t *count);
|
||||
esp_err_t system_updateConnectionTimestamp(esp_bd_addr_t bda);
|
||||
const paired_device_t* system_getPairedDevices(size_t *count);
|
||||
esp_err_t system_clearAllPairedDevices(void);
|
||||
|
||||
|
||||
#define NVS_TIMEOUT_MS 5000
|
||||
|
||||
Reference in New Issue
Block a user