mirror of
https://github.com/esphome/esphome.git
synced 2025-08-09 03:47:48 +00:00
[bluetooth_proxy] Optimize connection loop to reduce CPU usage (#10133)
This commit is contained in:
parent
58504662d8
commit
7e4d09dbd8
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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};
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user