Fix BT Classic scan for ESP-IDF

This commit is contained in:
RoboMagus 2023-04-25 22:16:54 +00:00
parent e7f36c9b3c
commit f1ea245928
15 changed files with 61 additions and 27 deletions

View file

@ -97,6 +97,7 @@ esphome/components/esp32_ble/* @Rapsssito @jesserockz
esphome/components/esp32_ble_client/* @jesserockz
esphome/components/esp32_ble_server/* @Rapsssito @clydebarrow @jesserockz
esphome/components/esp32_bt_classic/* @RoboMagus
esphome/components/esp32_bt_common/* @RoboMagus
esphome/components/esp32_camera_web_server/* @ayufan
esphome/components/esp32_can/* @Sympatron
esphome/components/esp32_improv/* @jesserockz

View file

@ -1,12 +1,10 @@
import esphome.codegen as cg
import esphome.config_validation as cv
from esphome.components import binary_sensor
from esphome.const import CONF_MAC_ADDRESS
from esphome.const import CONF_MAC_ADDRESS, CONF_NUM_SCANS
from esphome.components.esp32_bt_classic import ESP32BtClassic
from esphome.components.esp32_bt_classic.const import (
CONF_ESP32_BTCLASSIC_ID,
CONF_NUM_SCANS,
)
from esphome.components.esp32_bt_classic.const import CONF_ESP32_BTCLASSIC_ID
DEPENDENCIES = ["esp32_bt_classic"]

View file

@ -5,6 +5,7 @@ from esphome.const import CONF_ID
from esphome.core import CORE
from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant, const
AUTO_LOAD = ["esp32_bt_common"]
DEPENDENCIES = ["esp32"]
CODEOWNERS = ["@jesserockz", "@Rapsssito"]
CONFLICTS_WITH = ["esp32_ble_beacon"]

View file

@ -13,9 +13,7 @@
#include <freertos/task.h>
#include <nvs_flash.h>
#ifdef USE_ARDUINO
#include <esp32-hal-bt.h>
#endif
#include "esphome/components/esp32_bt_common/bt_defs.h"
namespace esphome {
namespace esp32_ble {
@ -124,7 +122,7 @@ bool ESP32BLE::ble_setup_() {
;
}
if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) {
err = esp_bt_controller_enable(ESP_BT_MODE_BLE);
err = esp_bt_controller_enable(BT_MODE);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_bt_controller_enable failed: %s", esp_err_to_name(err));
return false;

View file

@ -9,7 +9,7 @@
#include "esphome/core/helpers.h"
#include "ble_event.h"
#include "queue.h"
#include "esphome/components/esp32_bt_common/queue.h"
#ifdef USE_ESP32
@ -118,7 +118,7 @@ class ESP32BLE : public Component {
std::vector<BLEStatusEventHandler *> ble_status_event_handlers_;
BLEComponentState state_{BLE_COMPONENT_STATE_OFF};
Queue<BLEEvent> ble_events_;
esp32_bt_common::Queue<BLEEvent> ble_events_;
BLEAdvertising *advertising_;
esp_ble_io_cap_t io_cap_{ESP_IO_CAP_NONE};
bool enable_on_boot_;

View file

@ -5,6 +5,7 @@ from esphome.core import CORE, TimePeriod
from esphome.components.esp32 import add_idf_sdkconfig_option
from esphome.components import esp32_ble
AUTO_LOAD = ["esp32_bt_common"]
DEPENDENCIES = ["esp32"]
CONFLICTS_WITH = ["esp32_ble_tracker"]

View file

@ -12,9 +12,7 @@
#include <cstring>
#include "esphome/core/hal.h"
#ifdef USE_ARDUINO
#include <esp32-hal-bt.h>
#endif
#include "esphome/components/esp32_bt_common/bt_defs.h"
namespace esphome {
namespace esp32_ble_beacon {
@ -109,7 +107,7 @@ void ESP32BLEBeacon::ble_setup() {
;
}
if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) {
err = esp_bt_controller_enable(ESP_BT_MODE_BLE);
err = esp_bt_controller_enable(BT_MODE);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_bt_controller_enable failed: %s", esp_err_to_name(err));
return;

View file

@ -6,7 +6,6 @@
#include "esphome/components/esp32_ble/ble.h"
#include "esphome/components/esp32_ble/ble_advertising.h"
#include "esphome/components/esp32_ble/ble_uuid.h"
#include "esphome/components/esp32_ble/queue.h"
#include "esphome/core/component.h"
#include "esphome/core/helpers.h"
#include "esphome/core/preferences.h"

View file

@ -24,7 +24,7 @@ from .const import (
_LOGGER = logging.getLogger(__name__)
AUTO_LOAD = ["esp32_ble"]
AUTO_LOAD = ["esp32_bt_common"]
DEPENDENCIES = ["esp32"]
CODEOWNERS = ["@RoboMagus"]
@ -161,3 +161,5 @@ async def to_code(config):
if CORE.using_esp_idf:
add_idf_sdkconfig_option("CONFIG_BT_ENABLED", True)
add_idf_sdkconfig_option("CONFIG_BTDM_CTRL_MODE_BTDM", True)
add_idf_sdkconfig_option("CONFIG_BT_CLASSIC_ENABLED", True)

View file

@ -12,9 +12,7 @@
#include <freertos/task.h>
#include <nvs_flash.h>
#ifdef USE_ARDUINO
#include <esp32-hal-bt.h>
#endif
#include "esphome/components/esp32_bt_common/bt_defs.h"
namespace esphome {
namespace esp32_bt_classic {
@ -63,7 +61,7 @@ bool ESP32BtClassic::bt_setup_() {
;
}
if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) {
err = esp_bt_controller_enable(ESP_BT_MODE_BLE);
err = esp_bt_controller_enable(BT_MODE);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_bt_controller_enable failed: %s", esp_err_to_name(err));
return false;

View file

@ -7,12 +7,12 @@
#ifdef USE_ESP32
#include "esphome/components/esp32_bt_common/queue.h"
// IDF headers
#include <esp_bt_defs.h>
#include <esp_gap_bt_api.h>
#include "esphome/components/esp32_ble/queue.h"
#include "utils.h"
namespace esphome {
@ -139,7 +139,7 @@ class ESP32BtClassic : public Component, public BtClassicItf {
std::vector<BtClassicScanResultListner *> scan_result_listners_;
// Ble-Queue which thread safety precautions:
esp32_ble::Queue<BtGapEvent> bt_events_;
esp32_bt_common::Queue<BtGapEvent> bt_events_;
const uint32_t scan_delay_{100}; // (ms) minimal time between consecutive scans
};

View file

@ -0,0 +1,6 @@
import esphome.codegen as cg
DEPENDENCIES = ["esp32"]
CODEOWNERS = ["@RoboMagus"]
esp32_bt_common_ns = cg.esphome_ns.namespace("esp32_bt_common")

View file

@ -0,0 +1,26 @@
#pragma once
#ifdef USE_ESP32
#include <esp_bt.h>
// Define the configured BT operation mode:
#ifdef USE_ARDUINO
#include <esp32-hal-bt.h>
#else
#ifdef CONFIG_BTDM_CONTROLLER_MODE_BTDM
#define BT_MODE ESP_BT_MODE_BTDM
#elif defined(CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY)
#define BT_MODE ESP_BT_MODE_CLASSIC_BT
#else
#define BT_MODE ESP_BT_MODE_BLE
#endif
#endif
namespace esphome {
namespace esp32_bt_common {
} // namespace esp32_bt_common
} // namespace esphome
#endif

View file

@ -9,7 +9,7 @@
#include <freertos/semphr.h>
/*
* BLE events come in from a separate Task (thread) in the ESP32 stack. Rather
* Bluetooth events come in from a separate Task (thread) in the ESP32 stack. Rather
* than trying to deal with various locking strategies, all incoming GAP and GATT
* events will simply be placed on a semaphore guarded queue. The next time the
* component runs loop(), these events are popped off the queue and handed at
@ -17,7 +17,7 @@
*/
namespace esphome {
namespace esp32_ble {
namespace esp32_bt_common {
template<class T> class Queue {
public:
@ -50,7 +50,7 @@ template<class T> class Queue {
SemaphoreHandle_t m_;
};
} // namespace esp32_ble
} // namespace esp32_bt_common
} // namespace esphome
#endif

View file

@ -89,6 +89,8 @@ mqtt:
vbus:
- uart_id: uart_2
esp32_bt_classic:
binary_sensor:
- platform: gpio
pin: GPIO0
@ -223,6 +225,10 @@ binary_sensor:
name: VBus Custom Binary Sensor
lambda: return x[0] & 1;
- platform: bt_classic_presence
name: BT Classic Presence T0
mac_address: 1a:2b:3c:4d:5e:6f
tlc5947:
data_pin:
number: GPIO12