1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-03 18:42:23 +01:00
This commit is contained in:
J. Nick Koston
2025-09-29 19:46:34 -05:00
parent 47a10e4be1
commit 0cdfcad54d
2 changed files with 21 additions and 8 deletions

View File

@@ -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;
}

View File

@@ -57,13 +57,23 @@ class BLEServer : public Component, public GATTsEventHandler, public BLEStatusEv
// Direct callback registration - supports multiple callbacks
void on_connect(std::function<void(uint16_t)> &&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<void(uint16_t)> &&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<void(uint16_t)> 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<std::function<void(uint16_t)>> on_connect_callbacks_;
std::vector<std::function<void(uint16_t)>> on_disconnect_callbacks_;
std::vector<CallbackEntry> callbacks_;
std::vector<uint8_t> manufacturer_data_{};
esp_gatt_if_t gatts_if_{0};