169#ifndef CONFIG_ESP_HOSTED_ENABLE_BT_BLUEDROID
170 if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) {
172 if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE) {
173 esp_bt_controller_config_t cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
174 err = esp_bt_controller_init(&cfg);
176 ESP_LOGE(TAG,
"esp_bt_controller_init failed: %s", esp_err_to_name(err));
179 while (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_IDLE)
182 if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) {
183 err = esp_bt_controller_enable(ESP_BT_MODE_BLE);
185 ESP_LOGE(TAG,
"esp_bt_controller_enable failed: %s", esp_err_to_name(err));
189 if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED) {
190 ESP_LOGE(TAG,
"esp bt controller enable failed");
195 esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT);
197 esp_hosted_connect_to_slave();
199 if (esp_hosted_bt_controller_init() != ESP_OK) {
200 ESP_LOGW(TAG,
"esp_hosted_bt_controller_init failed");
204 if (esp_hosted_bt_controller_enable() != ESP_OK) {
205 ESP_LOGW(TAG,
"esp_hosted_bt_controller_enable failed");
209 hosted_hci_bluedroid_open();
211 esp_bluedroid_hci_driver_operations_t operations = {
212 .send = hosted_hci_bluedroid_send,
213 .check_send_available = hosted_hci_bluedroid_check_send_available,
214 .register_host_callback = hosted_hci_bluedroid_register_host_callback,
216 esp_bluedroid_attach_hci_driver(&operations);
219 err = esp_bluedroid_init();
221 ESP_LOGE(TAG,
"esp_bluedroid_init failed: %d", err);
224 err = esp_bluedroid_enable();
226 ESP_LOGE(TAG,
"esp_bluedroid_enable failed: %d", err);
230#ifdef ESPHOME_ESP32_BLE_GAP_EVENT_HANDLER_COUNT
233 ESP_LOGE(TAG,
"esp_ble_gap_register_callback failed: %d", err);
238#if defined(USE_ESP32_BLE_SERVER) && defined(ESPHOME_ESP32_BLE_GATTS_EVENT_HANDLER_COUNT)
241 ESP_LOGE(TAG,
"esp_ble_gatts_register_callback failed: %d", err);
246#if defined(USE_ESP32_BLE_CLIENT) && defined(ESPHOME_ESP32_BLE_GATTC_EVENT_HANDLER_COUNT)
249 ESP_LOGE(TAG,
"esp_ble_gattc_register_callback failed: %d", err);
256 constexpr size_t ble_name_max_len = 21;
257 char name_buffer[ble_name_max_len];
258 const char *device_name;
260 if (this->name_ !=
nullptr) {
263 constexpr size_t mac_address_len = 13;
265 constexpr size_t mac_address_suffix_len = 6;
266 char mac_addr[mac_address_len];
268 const char *mac_suffix_ptr = mac_addr + mac_address_suffix_len;
270 mac_address_suffix_len);
271 device_name = name_buffer;
273 device_name = this->name_;
277 size_t name_len = app_name.length();
281 memcpy(name_buffer, app_name.c_str(), 13);
282 memcpy(name_buffer + 13, app_name.c_str() + name_len - 7, 7);
284 memcpy(name_buffer, app_name.c_str(), 20);
286 name_buffer[20] =
'\0';
288 memcpy(name_buffer, app_name.c_str(), name_len + 1);
290 device_name = name_buffer;
293 err = esp_ble_gap_set_device_name(device_name);
295 ESP_LOGE(TAG,
"esp_ble_gap_set_device_name failed: %d", err);
299 err = esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &(this->io_cap_),
sizeof(esp_ble_io_cap_t));
301 ESP_LOGE(TAG,
"esp_ble_gap_set_security_param iocap_mode failed: %d", err);
305#ifdef ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS
306 if (this->max_key_size_) {
307 err = esp_ble_gap_set_security_param(ESP_BLE_SM_MAX_KEY_SIZE, &(this->max_key_size_),
sizeof(uint8_t));
309 ESP_LOGE(TAG,
"esp_ble_gap_set_security_param max_key_size failed: %d", err);
314 if (this->min_key_size_) {
315 err = esp_ble_gap_set_security_param(ESP_BLE_SM_MIN_KEY_SIZE, &(this->min_key_size_),
sizeof(uint8_t));
317 ESP_LOGE(TAG,
"esp_ble_gap_set_security_param min_key_size failed: %d", err);
322 if (this->auth_req_mode_) {
323 err = esp_ble_gap_set_security_param(ESP_BLE_SM_AUTHEN_REQ_MODE, &(this->auth_req_mode_.
value()),
324 sizeof(esp_ble_auth_req_t));
326 ESP_LOGE(TAG,
"esp_ble_gap_set_security_param authen_req_mode failed: %d", err);
339 esp_err_t err = esp_bluedroid_disable();
342 if (err != ESP_ERR_INVALID_STATE) {
343 ESP_LOGE(TAG,
"esp_bluedroid_disable failed: %d", err);
346 ESP_LOGD(TAG,
"Already disabled");
348 err = esp_bluedroid_deinit();
351 if (err != ESP_ERR_INVALID_STATE) {
352 ESP_LOGE(TAG,
"esp_bluedroid_deinit failed: %d", err);
355 ESP_LOGD(TAG,
"Already deinitialized");
358#ifndef CONFIG_ESP_HOSTED_ENABLE_BT_BLUEDROID
359 if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_IDLE) {
361 if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED) {
362 err = esp_bt_controller_disable();
364 ESP_LOGE(TAG,
"esp_bt_controller_disable failed: %s", esp_err_to_name(err));
367 while (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_ENABLED)
370 if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) {
371 err = esp_bt_controller_deinit();
373 ESP_LOGE(TAG,
"esp_bt_controller_deinit failed: %s", esp_err_to_name(err));
377 if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_IDLE) {
378 ESP_LOGE(TAG,
"esp bt controller disable failed");
383 if (esp_hosted_bt_controller_disable() != ESP_OK) {
384 ESP_LOGW(TAG,
"esp_hosted_bt_controller_disable failed");
388 if (esp_hosted_bt_controller_deinit(
false) != ESP_OK) {
389 ESP_LOGW(TAG,
"esp_hosted_bt_controller_deinit failed");
393 hosted_hci_bluedroid_close();
400 this->loop_handle_state_transition_not_active_();
404 BLEEvent *ble_event = this->ble_events_.pop();
405 while (ble_event !=
nullptr) {
406 switch (ble_event->
type_) {
407#if defined(USE_ESP32_BLE_SERVER) && defined(ESPHOME_ESP32_BLE_GATTS_EVENT_HANDLER_COUNT)
409 esp_gatts_cb_event_t
event = ble_event->
event_.
gatts.gatts_event;
410 esp_gatt_if_t gatts_if = ble_event->
event_.
gatts.gatts_if;
411 esp_ble_gatts_cb_param_t *param = &ble_event->
event_.
gatts.gatts_param;
412 ESP_LOGV(TAG,
"gatts_event [esp_gatt_if: %d] - %d", gatts_if, event);
413 for (
auto *gatts_handler : this->gatts_event_handlers_) {
414 gatts_handler->gatts_event_handler(event, gatts_if, param);
419#if defined(USE_ESP32_BLE_CLIENT) && defined(ESPHOME_ESP32_BLE_GATTC_EVENT_HANDLER_COUNT)
421 esp_gattc_cb_event_t
event = ble_event->
event_.
gattc.gattc_event;
422 esp_gatt_if_t gattc_if = ble_event->
event_.
gattc.gattc_if;
423 esp_ble_gattc_cb_param_t *param = &ble_event->
event_.
gattc.gattc_param;
424 ESP_LOGV(TAG,
"gattc_event [esp_gatt_if: %d] - %d", gattc_if, event);
425 for (
auto *gattc_handler : this->gattc_event_handlers_) {
426 gattc_handler->gattc_event_handler(event, gattc_if, param);
432 esp_gap_ble_cb_event_t gap_event = ble_event->
event_.
gap.gap_event;
434 case ESP_GAP_BLE_SCAN_RESULT_EVT:
435#ifdef ESPHOME_ESP32_BLE_GAP_SCAN_EVENT_HANDLER_COUNT
437 for (
auto *scan_handler : this->gap_scan_event_handlers_) {
438 scan_handler->gap_scan_event_handler(ble_event->
scan_result());
444 GAP_SCAN_COMPLETE_EVENTS:
446 GAP_ADV_COMPLETE_EVENTS:
448 case ESP_GAP_BLE_READ_RSSI_COMPLETE_EVT:
451 ESP_LOGV(TAG,
"gap_event_handler - %d", gap_event);
452#ifdef ESPHOME_ESP32_BLE_GAP_EVENT_HANDLER_COUNT
454 esp_ble_gap_cb_param_t *param;
461 GAP_SCAN_COMPLETE_EVENTS:
462 param =
reinterpret_cast<esp_ble_gap_cb_param_t *
>(&ble_event->
event_.
gap.scan_complete);
466 GAP_ADV_COMPLETE_EVENTS:
467 param =
reinterpret_cast<esp_ble_gap_cb_param_t *
>(&ble_event->
event_.
gap.adv_complete);
470 case ESP_GAP_BLE_READ_RSSI_COMPLETE_EVT:
471 param =
reinterpret_cast<esp_ble_gap_cb_param_t *
>(&ble_event->
event_.
gap.read_rssi_complete);
475 param =
reinterpret_cast<esp_ble_gap_cb_param_t *
>(&ble_event->
event_.
gap.security);
483 for (
auto *gap_handler : this->gap_event_handlers_) {
484 gap_handler->gap_event_handler(gap_event, param);
492 ESP_LOGW(TAG,
"Unhandled GAP event type in loop: %d", gap_event);
501 this->ble_event_pool_.release(ble_event);
502 ble_event = this->ble_events_.pop();
504#ifdef USE_ESP32_BLE_ADVERTISING
505 if (this->advertising_ !=
nullptr) {
506 this->advertising_->
loop();
511 uint16_t dropped = this->ble_events_.get_and_reset_dropped_count();
513 ESP_LOGW(TAG,
"Dropped %u BLE events due to buffer overflow", dropped);
595 case ESP_GAP_BLE_SCAN_RESULT_EVT:
596 GAP_SCAN_COMPLETE_EVENTS:
598 GAP_ADV_COMPLETE_EVENTS:
600 case ESP_GAP_BLE_READ_RSSI_COMPLETE_EVT:
609#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE)
615 case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
616 case ESP_GAP_BLE_SET_PKT_LENGTH_COMPLETE_EVT:
617 case ESP_GAP_BLE_PHY_UPDATE_COMPLETE_EVT:
618 case ESP_GAP_BLE_CHANNEL_SELECT_ALGORITHM_EVT:
624 ESP_LOGW(TAG,
"Ignoring unexpected GAP event type: %d", event);