mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	[bluetooth_proxy] Optimize memory usage with fixed-size array and const string references
This commit is contained in:
		| @@ -35,8 +35,8 @@ void BluetoothProxy::setup() { | |||||||
|   // Don't pre-allocate pool - let it grow only if needed in busy environments |   // Don't pre-allocate pool - let it grow only if needed in busy environments | ||||||
|   // Many devices in quiet areas will never need the overflow pool |   // Many devices in quiet areas will never need the overflow pool | ||||||
|  |  | ||||||
|   this->connections_free_response_.limit = this->connections_.size(); |   this->connections_free_response_.limit = this->connection_count_; | ||||||
|   this->connections_free_response_.free = this->connections_.size(); |   this->connections_free_response_.free = this->connection_count_; | ||||||
|  |  | ||||||
|   this->parent_->add_scanner_state_callback([this](esp32_ble_tracker::ScannerState state) { |   this->parent_->add_scanner_state_callback([this](esp32_ble_tracker::ScannerState state) { | ||||||
|     if (this->api_connection_ != nullptr) { |     if (this->api_connection_ != nullptr) { | ||||||
| @@ -134,12 +134,13 @@ void BluetoothProxy::dump_config() { | |||||||
|   ESP_LOGCONFIG(TAG, |   ESP_LOGCONFIG(TAG, | ||||||
|                 "  Active: %s\n" |                 "  Active: %s\n" | ||||||
|                 "  Connections: %d", |                 "  Connections: %d", | ||||||
|                 YESNO(this->active_), this->connections_.size()); |                 YESNO(this->active_), this->connection_count_); | ||||||
| } | } | ||||||
|  |  | ||||||
| void BluetoothProxy::loop() { | void BluetoothProxy::loop() { | ||||||
|   if (!api::global_api_server->is_connected() || this->api_connection_ == nullptr) { |   if (!api::global_api_server->is_connected() || this->api_connection_ == nullptr) { | ||||||
|     for (auto *connection : this->connections_) { |     for (uint8_t i = 0; i < this->connection_count_; i++) { | ||||||
|  |       auto *connection = this->connections_[i]; | ||||||
|       if (connection->get_address() != 0 && !connection->disconnect_pending()) { |       if (connection->get_address() != 0 && !connection->disconnect_pending()) { | ||||||
|         connection->disconnect(); |         connection->disconnect(); | ||||||
|       } |       } | ||||||
| @@ -162,7 +163,8 @@ esp32_ble_tracker::AdvertisementParserType BluetoothProxy::get_advertisement_par | |||||||
| } | } | ||||||
|  |  | ||||||
| BluetoothConnection *BluetoothProxy::get_connection_(uint64_t address, bool reserve) { | BluetoothConnection *BluetoothProxy::get_connection_(uint64_t address, bool reserve) { | ||||||
|   for (auto *connection : this->connections_) { |   for (uint8_t i = 0; i < this->connection_count_; i++) { | ||||||
|  |     auto *connection = this->connections_[i]; | ||||||
|     if (connection->get_address() == address) |     if (connection->get_address() == address) | ||||||
|       return connection; |       return connection; | ||||||
|   } |   } | ||||||
| @@ -170,7 +172,8 @@ BluetoothConnection *BluetoothProxy::get_connection_(uint64_t address, bool rese | |||||||
|   if (!reserve) |   if (!reserve) | ||||||
|     return nullptr; |     return nullptr; | ||||||
|  |  | ||||||
|   for (auto *connection : this->connections_) { |   for (uint8_t i = 0; i < this->connection_count_; 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_ = DONE_SENDING_SERVICES; | ||||||
|       connection->set_address(address); |       connection->set_address(address); | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ | |||||||
|  |  | ||||||
| #ifdef USE_ESP32 | #ifdef USE_ESP32 | ||||||
|  |  | ||||||
|  | #include <array> | ||||||
| #include <map> | #include <map> | ||||||
| #include <vector> | #include <vector> | ||||||
|  |  | ||||||
| @@ -63,8 +64,10 @@ class BluetoothProxy : public esp32_ble_tracker::ESPBTDeviceListener, public Com | |||||||
|   esp32_ble_tracker::AdvertisementParserType get_advertisement_parser_type() override; |   esp32_ble_tracker::AdvertisementParserType get_advertisement_parser_type() override; | ||||||
|  |  | ||||||
|   void register_connection(BluetoothConnection *connection) { |   void register_connection(BluetoothConnection *connection) { | ||||||
|     this->connections_.push_back(connection); |     if (this->connection_count_ < BLUETOOTH_PROXY_MAX_CONNECTIONS) { | ||||||
|     connection->proxy_ = this; |       this->connections_[this->connection_count_++] = connection; | ||||||
|  |       connection->proxy_ = this; | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   void bluetooth_device_request(const api::BluetoothDeviceRequest &msg); |   void bluetooth_device_request(const api::BluetoothDeviceRequest &msg); | ||||||
| @@ -138,8 +141,8 @@ class BluetoothProxy : public esp32_ble_tracker::ESPBTDeviceListener, public Com | |||||||
|   // Group 1: Pointers (4 bytes each, naturally aligned) |   // Group 1: Pointers (4 bytes each, naturally aligned) | ||||||
|   api::APIConnection *api_connection_{nullptr}; |   api::APIConnection *api_connection_{nullptr}; | ||||||
|  |  | ||||||
|   // Group 2: Container types (typically 12 bytes on 32-bit) |   // Group 2: Fixed-size array of connection pointers | ||||||
|   std::vector<BluetoothConnection *> connections_{}; |   std::array<BluetoothConnection *, BLUETOOTH_PROXY_MAX_CONNECTIONS> connections_{}; | ||||||
|  |  | ||||||
|   // BLE advertisement batching |   // BLE advertisement batching | ||||||
|   std::vector<api::BluetoothLERawAdvertisement> advertisement_pool_; |   std::vector<api::BluetoothLERawAdvertisement> advertisement_pool_; | ||||||
| @@ -154,7 +157,8 @@ class BluetoothProxy : public esp32_ble_tracker::ESPBTDeviceListener, public Com | |||||||
|   // Group 4: 1-byte types grouped together |   // Group 4: 1-byte types grouped together | ||||||
|   bool active_; |   bool active_; | ||||||
|   uint8_t advertisement_count_{0}; |   uint8_t advertisement_count_{0}; | ||||||
|   // 2 bytes used, 2 bytes padding |   uint8_t connection_count_{0}; | ||||||
|  |   // 3 bytes used, 1 byte padding | ||||||
| }; | }; | ||||||
|  |  | ||||||
| extern BluetoothProxy *global_bluetooth_proxy;  // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) | extern BluetoothProxy *global_bluetooth_proxy;  // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) | ||||||
|   | |||||||
| @@ -66,7 +66,7 @@ class BLEClientBase : public espbt::ESPBTClient, public Component { | |||||||
|                        (uint8_t) (this->address_ >> 0) & 0xff); |                        (uint8_t) (this->address_ >> 0) & 0xff); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   std::string address_str() const { return this->address_str_; } |   const std::string &address_str() const { return this->address_str_; } | ||||||
|  |  | ||||||
|   BLEService *get_service(espbt::ESPBTUUID uuid); |   BLEService *get_service(espbt::ESPBTUUID uuid); | ||||||
|   BLEService *get_service(uint16_t uuid); |   BLEService *get_service(uint16_t uuid); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user