[bluetooth_proxy] Optimize connection loop to reduce CPU usage (#10133)

This commit is contained in:
J. Nick Koston 2025-08-07 16:24:26 -10:00 committed by GitHub
parent 58504662d8
commit 7e4d09dbd8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 20 additions and 9 deletions

View File

@ -107,15 +107,26 @@ void BluetoothConnection::set_address(uint64_t address) {
void BluetoothConnection::loop() { void BluetoothConnection::loop() {
BLEClientBase::loop(); BLEClientBase::loop();
// Early return if no active connection or not in service discovery phase // Early return if no active connection
if (this->address_ == 0 || this->send_service_ < 0 || this->send_service_ > this->service_count_) { if (this->address_ == 0) {
return; return;
} }
// Handle service discovery // Handle service discovery if in valid range
if (this->send_service_ >= 0 && this->send_service_ <= this->service_count_) {
this->send_service_for_discovery_(); this->send_service_for_discovery_();
} }
// Check if we should disable the loop
// - For V3_WITH_CACHE: Services are never sent, disable after INIT state
// - For other connections: Disable only after service discovery is complete
// (send_service_ == DONE_SENDING_SERVICES, which is only set after services are sent)
if (this->state_ != espbt::ClientState::INIT && (this->connection_type_ == espbt::ConnectionType::V3_WITH_CACHE ||
this->send_service_ == DONE_SENDING_SERVICES)) {
this->disable_loop();
}
}
void BluetoothConnection::reset_connection_(esp_err_t reason) { void BluetoothConnection::reset_connection_(esp_err_t reason) {
// Send disconnection notification // Send disconnection notification
this->proxy_->send_device_connection(this->address_, false, 0, reason); this->proxy_->send_device_connection(this->address_, false, 0, reason);
@ -127,7 +138,7 @@ void BluetoothConnection::reset_connection_(esp_err_t reason) {
// to detect incomplete service discovery rather than relying on us to // to detect incomplete service discovery rather than relying on us to
// tell them about a partial list. // tell them about a partial list.
this->set_address(0); this->set_address(0);
this->send_service_ = DONE_SENDING_SERVICES; this->send_service_ = INIT_SENDING_SERVICES;
this->proxy_->send_connections_free(); this->proxy_->send_connections_free();
} }

View File

@ -44,7 +44,7 @@ class BluetoothConnection : public esp32_ble_client::BLEClientBase {
BluetoothProxy *proxy_; BluetoothProxy *proxy_;
// Group 2: 2-byte types // Group 2: 2-byte types
int16_t send_service_{-2}; // Needs to handle negative values and service count int16_t send_service_{-3}; // -3 = INIT_SENDING_SERVICES, -2 = DONE_SENDING_SERVICES, >=0 = service index
// Group 3: 1-byte types // Group 3: 1-byte types
bool seen_mtu_or_services_{false}; bool seen_mtu_or_services_{false};

View File

@ -192,7 +192,7 @@ BluetoothConnection *BluetoothProxy::get_connection_(uint64_t address, bool rese
for (uint8_t i = 0; i < this->connection_count_; i++) { for (uint8_t i = 0; i < this->connection_count_; i++) {
auto *connection = this->connections_[i]; auto *connection = this->connections_[i];
if (connection->get_address() == 0) { if (connection->get_address() == 0) {
connection->send_service_ = DONE_SENDING_SERVICES; connection->send_service_ = INIT_SENDING_SERVICES;
connection->set_address(address); connection->set_address(address);
// All connections must start at INIT // All connections must start at INIT
// We only set the state if we allocate the connection // We only set the state if we allocate the connection
@ -373,8 +373,7 @@ void BluetoothProxy::bluetooth_gatt_send_services(const api::BluetoothGATTGetSer
this->send_gatt_services_done(msg.address); this->send_gatt_services_done(msg.address);
return; return;
} }
if (connection->send_service_ == if (connection->send_service_ == INIT_SENDING_SERVICES) // Start sending services if not started yet
DONE_SENDING_SERVICES) // Only start sending services if we're not already sending them
connection->send_service_ = 0; connection->send_service_ = 0;
} }

View File

@ -23,6 +23,7 @@ namespace esphome::bluetooth_proxy {
static const esp_err_t ESP_GATT_NOT_CONNECTED = -1; static const esp_err_t ESP_GATT_NOT_CONNECTED = -1;
static const int DONE_SENDING_SERVICES = -2; static const int DONE_SENDING_SERVICES = -2;
static const int INIT_SENDING_SERVICES = -3;
using namespace esp32_ble_client; using namespace esp32_ble_client;