diff --git a/esphome/components/esp32_ble_server/ble_server.cpp b/esphome/components/esp32_ble_server/ble_server.cpp index 6b7d1af5ea..a9f8fd13a5 100644 --- a/esphome/components/esp32_ble_server/ble_server.cpp +++ b/esphome/components/esp32_ble_server/ble_server.cpp @@ -153,8 +153,10 @@ void BLEServer::gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t ga case ESP_GATTS_CONNECT_EVT: { ESP_LOGD(TAG, "BLE Client connected"); this->add_client_(param->connect.conn_id); - for (auto &callback : this->on_connect_callbacks_) { - callback(param->connect.conn_id); + for (auto &entry : this->callbacks_) { + if (entry.type == CallbackType::ON_CONNECT) { + entry.callback(param->connect.conn_id); + } } break; } @@ -162,8 +164,10 @@ void BLEServer::gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t ga ESP_LOGD(TAG, "BLE Client disconnected"); this->remove_client_(param->disconnect.conn_id); this->parent_->advertising_start(); - for (auto &callback : this->on_disconnect_callbacks_) { - callback(param->disconnect.conn_id); + for (auto &entry : this->callbacks_) { + if (entry.type == CallbackType::ON_DISCONNECT) { + entry.callback(param->disconnect.conn_id); + } } break; } diff --git a/esphome/components/esp32_ble_server/ble_server.h b/esphome/components/esp32_ble_server/ble_server.h index 53579614d2..40a6465d9b 100644 --- a/esphome/components/esp32_ble_server/ble_server.h +++ b/esphome/components/esp32_ble_server/ble_server.h @@ -57,13 +57,23 @@ class BLEServer : public Component, public GATTsEventHandler, public BLEStatusEv // Direct callback registration - supports multiple callbacks void on_connect(std::function &&callback) { - this->on_connect_callbacks_.push_back(std::move(callback)); + this->callbacks_.push_back({CallbackType::ON_CONNECT, std::move(callback)}); } void on_disconnect(std::function &&callback) { - this->on_disconnect_callbacks_.push_back(std::move(callback)); + this->callbacks_.push_back({CallbackType::ON_DISCONNECT, std::move(callback)}); } protected: + enum class CallbackType : uint8_t { + ON_CONNECT, + ON_DISCONNECT, + }; + + struct CallbackEntry { + CallbackType type; + std::function callback; + }; + struct ServiceEntry { ESPBTUUID uuid; uint8_t inst_id; @@ -75,8 +85,7 @@ class BLEServer : public Component, public GATTsEventHandler, public BLEStatusEv void add_client_(uint16_t conn_id) { this->clients_.insert(conn_id); } void remove_client_(uint16_t conn_id) { this->clients_.erase(conn_id); } - std::vector> on_connect_callbacks_; - std::vector> on_disconnect_callbacks_; + std::vector callbacks_; std::vector manufacturer_data_{}; esp_gatt_if_t gatts_if_{0};