mirror of
https://github.com/esphome/esphome.git
synced 2025-07-29 14:46:40 +00:00
Improve BLE Connection Reliability by Enabling Software Coexistence (#8683)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
8465017db9
commit
45d019a7e4
@ -44,6 +44,7 @@ CONF_ESP32_BLE_ID = "esp32_ble_id"
|
|||||||
CONF_SCAN_PARAMETERS = "scan_parameters"
|
CONF_SCAN_PARAMETERS = "scan_parameters"
|
||||||
CONF_WINDOW = "window"
|
CONF_WINDOW = "window"
|
||||||
CONF_ON_SCAN_END = "on_scan_end"
|
CONF_ON_SCAN_END = "on_scan_end"
|
||||||
|
CONF_SOFTWARE_COEXISTENCE = "software_coexistence"
|
||||||
|
|
||||||
DEFAULT_MAX_CONNECTIONS = 3
|
DEFAULT_MAX_CONNECTIONS = 3
|
||||||
IDF_MAX_CONNECTIONS = 9
|
IDF_MAX_CONNECTIONS = 9
|
||||||
@ -203,6 +204,7 @@ CONFIG_SCHEMA = cv.All(
|
|||||||
cv.Optional(CONF_ON_SCAN_END): automation.validate_automation(
|
cv.Optional(CONF_ON_SCAN_END): automation.validate_automation(
|
||||||
{cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(BLEEndOfScanTrigger)}
|
{cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(BLEEndOfScanTrigger)}
|
||||||
),
|
),
|
||||||
|
cv.OnlyWith(CONF_SOFTWARE_COEXISTENCE, "wifi", default=True): bool,
|
||||||
}
|
}
|
||||||
).extend(cv.COMPONENT_SCHEMA),
|
).extend(cv.COMPONENT_SCHEMA),
|
||||||
)
|
)
|
||||||
@ -310,6 +312,8 @@ async def to_code(config):
|
|||||||
|
|
||||||
if CORE.using_esp_idf:
|
if CORE.using_esp_idf:
|
||||||
add_idf_sdkconfig_option("CONFIG_BT_ENABLED", True)
|
add_idf_sdkconfig_option("CONFIG_BT_ENABLED", True)
|
||||||
|
if config.get(CONF_SOFTWARE_COEXISTENCE):
|
||||||
|
add_idf_sdkconfig_option("CONFIG_SW_COEXIST_ENABLE", True)
|
||||||
# https://github.com/espressif/esp-idf/issues/4101
|
# https://github.com/espressif/esp-idf/issues/4101
|
||||||
# https://github.com/espressif/esp-idf/issues/2503
|
# https://github.com/espressif/esp-idf/issues/2503
|
||||||
# Match arduino CONFIG_BTU_TASK_STACK_SIZE
|
# Match arduino CONFIG_BTU_TASK_STACK_SIZE
|
||||||
@ -331,6 +335,8 @@ async def to_code(config):
|
|||||||
|
|
||||||
cg.add_define("USE_OTA_STATE_CALLBACK") # To be notified when an OTA update starts
|
cg.add_define("USE_OTA_STATE_CALLBACK") # To be notified when an OTA update starts
|
||||||
cg.add_define("USE_ESP32_BLE_CLIENT")
|
cg.add_define("USE_ESP32_BLE_CLIENT")
|
||||||
|
if config.get(CONF_SOFTWARE_COEXISTENCE):
|
||||||
|
cg.add_define("USE_ESP32_BLE_SOFTWARE_COEXISTENCE")
|
||||||
|
|
||||||
|
|
||||||
ESP32_BLE_START_SCAN_ACTION_SCHEMA = cv.Schema(
|
ESP32_BLE_START_SCAN_ACTION_SCHEMA = cv.Schema(
|
||||||
|
@ -21,6 +21,10 @@
|
|||||||
#include "esphome/components/ota/ota_backend.h"
|
#include "esphome/components/ota/ota_backend.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
|
||||||
|
#include <esp_coexist.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef USE_ARDUINO
|
#ifdef USE_ARDUINO
|
||||||
#include <esp32-hal-bt.h>
|
#include <esp32-hal-bt.h>
|
||||||
#endif
|
#endif
|
||||||
@ -194,9 +198,17 @@ void ESP32BLETracker::loop() {
|
|||||||
https://github.com/espressif/esp-idf/issues/6688
|
https://github.com/espressif/esp-idf/issues/6688
|
||||||
|
|
||||||
*/
|
*/
|
||||||
if (this->scanner_state_ == ScannerState::IDLE && this->scan_continuous_ && !connecting && !disconnecting &&
|
if (this->scanner_state_ == ScannerState::IDLE && !connecting && !disconnecting && !promote_to_connecting) {
|
||||||
!promote_to_connecting) {
|
#ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
|
||||||
this->start_scan_(false); // first = false
|
if (this->coex_prefer_ble_) {
|
||||||
|
this->coex_prefer_ble_ = false;
|
||||||
|
ESP_LOGD(TAG, "Setting coexistence preference to balanced.");
|
||||||
|
esp_coex_preference_set(ESP_COEX_PREFER_BALANCE); // Reset to default
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (this->scan_continuous_) {
|
||||||
|
this->start_scan_(false); // first = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// If there is a discovered client and no connecting
|
// If there is a discovered client and no connecting
|
||||||
// clients and no clients using the scanner to search for
|
// clients and no clients using the scanner to search for
|
||||||
@ -213,6 +225,13 @@ void ESP32BLETracker::loop() {
|
|||||||
ESP_LOGD(TAG, "Promoting client to connect...");
|
ESP_LOGD(TAG, "Promoting client to connect...");
|
||||||
// We only want to promote one client at a time.
|
// We only want to promote one client at a time.
|
||||||
// once the scanner is fully stopped.
|
// once the scanner is fully stopped.
|
||||||
|
#ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
|
||||||
|
ESP_LOGD(TAG, "Setting coexistence to Bluetooth to make connection.");
|
||||||
|
if (!this->coex_prefer_ble_) {
|
||||||
|
this->coex_prefer_ble_ = true;
|
||||||
|
esp_coex_preference_set(ESP_COEX_PREFER_BT); // Prioritize Bluetooth
|
||||||
|
}
|
||||||
|
#endif
|
||||||
client->set_state(ClientState::READY_TO_CONNECT);
|
client->set_state(ClientState::READY_TO_CONNECT);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -299,6 +299,9 @@ class ESP32BLETracker : public Component,
|
|||||||
int discovered_{0};
|
int discovered_{0};
|
||||||
int searching_{0};
|
int searching_{0};
|
||||||
int disconnecting_{0};
|
int disconnecting_{0};
|
||||||
|
#ifdef USE_ESP32_BLE_SOFTWARE_COEXISTENCE
|
||||||
|
bool coex_prefer_ble_{false};
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
// NOLINTNEXTLINE
|
// NOLINTNEXTLINE
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<<: !include common.yaml
|
<<: !include common.yaml
|
||||||
|
|
||||||
esp32_ble_tracker:
|
esp32_ble_tracker:
|
||||||
|
software_coexistence: true
|
||||||
max_connections: 3
|
max_connections: 3
|
||||||
|
@ -2,3 +2,4 @@
|
|||||||
|
|
||||||
esp32_ble_tracker:
|
esp32_ble_tracker:
|
||||||
max_connections: 3
|
max_connections: 3
|
||||||
|
software_coexistence: false
|
||||||
|
@ -2,3 +2,4 @@
|
|||||||
|
|
||||||
esp32_ble_tracker:
|
esp32_ble_tracker:
|
||||||
max_connections: 9
|
max_connections: 9
|
||||||
|
software_coexistence: false
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<<: !include common.yaml
|
<<: !include common.yaml
|
||||||
|
|
||||||
esp32_ble_tracker:
|
esp32_ble_tracker:
|
||||||
|
software_coexistence: true
|
||||||
max_connections: 9
|
max_connections: 9
|
||||||
|
Loading…
x
Reference in New Issue
Block a user