mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	[esp32_ble] Conditionally compile BLE advertising to reduce flash usage (#10099)
This commit is contained in:
		| @@ -12,6 +12,7 @@ import esphome.final_validate as fv | ||||
|  | ||||
| DEPENDENCIES = ["esp32"] | ||||
| CODEOWNERS = ["@jesserockz", "@Rapsssito", "@bdraco"] | ||||
| DOMAIN = "esp32_ble" | ||||
|  | ||||
|  | ||||
| class BTLoggers(Enum): | ||||
| @@ -115,6 +116,7 @@ def register_bt_logger(*loggers: BTLoggers) -> None: | ||||
|  | ||||
| CONF_BLE_ID = "ble_id" | ||||
| CONF_IO_CAPABILITY = "io_capability" | ||||
| CONF_ADVERTISING = "advertising" | ||||
| CONF_ADVERTISING_CYCLE_TIME = "advertising_cycle_time" | ||||
| CONF_DISABLE_BT_LOGS = "disable_bt_logs" | ||||
| CONF_CONNECTION_TIMEOUT = "connection_timeout" | ||||
| @@ -163,6 +165,7 @@ CONFIG_SCHEMA = cv.Schema( | ||||
|             IO_CAPABILITY, lower=True | ||||
|         ), | ||||
|         cv.Optional(CONF_ENABLE_ON_BOOT, default=True): cv.boolean, | ||||
|         cv.Optional(CONF_ADVERTISING, default=False): cv.boolean, | ||||
|         cv.Optional( | ||||
|             CONF_ADVERTISING_CYCLE_TIME, default="10s" | ||||
|         ): cv.positive_time_period_milliseconds, | ||||
| @@ -289,6 +292,9 @@ async def to_code(config): | ||||
|  | ||||
|     cg.add_define("USE_ESP32_BLE") | ||||
|  | ||||
|     if config[CONF_ADVERTISING]: | ||||
|         cg.add_define("USE_ESP32_BLE_ADVERTISING") | ||||
|  | ||||
|  | ||||
| @automation.register_condition("ble.enabled", BLEEnabledCondition, cv.Schema({})) | ||||
| async def ble_enabled_to_code(config, condition_id, template_arg, args): | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #ifdef USE_ESP32 | ||||
|  | ||||
| #include "ble.h" | ||||
|  | ||||
| #ifdef USE_ESP32 | ||||
|  | ||||
| #include "esphome/core/application.h" | ||||
| #include "esphome/core/helpers.h" | ||||
| #include "esphome/core/log.h" | ||||
| @@ -53,6 +53,7 @@ void ESP32BLE::disable() { | ||||
|  | ||||
| bool ESP32BLE::is_active() { return this->state_ == BLE_COMPONENT_STATE_ACTIVE; } | ||||
|  | ||||
| #ifdef USE_ESP32_BLE_ADVERTISING | ||||
| void ESP32BLE::advertising_start() { | ||||
|   this->advertising_init_(); | ||||
|   if (!this->is_active()) | ||||
| @@ -88,6 +89,7 @@ void ESP32BLE::advertising_remove_service_uuid(ESPBTUUID uuid) { | ||||
|   this->advertising_->remove_service_uuid(uuid); | ||||
|   this->advertising_start(); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| bool ESP32BLE::ble_pre_setup_() { | ||||
|   esp_err_t err = nvs_flash_init(); | ||||
| @@ -98,6 +100,7 @@ bool ESP32BLE::ble_pre_setup_() { | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| #ifdef USE_ESP32_BLE_ADVERTISING | ||||
| void ESP32BLE::advertising_init_() { | ||||
|   if (this->advertising_ != nullptr) | ||||
|     return; | ||||
| @@ -107,6 +110,7 @@ void ESP32BLE::advertising_init_() { | ||||
|   this->advertising_->set_min_preferred_interval(0x06); | ||||
|   this->advertising_->set_appearance(this->appearance_); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| bool ESP32BLE::ble_setup_() { | ||||
|   esp_err_t err; | ||||
| @@ -394,9 +398,11 @@ void ESP32BLE::loop() { | ||||
|     this->ble_event_pool_.release(ble_event); | ||||
|     ble_event = this->ble_events_.pop(); | ||||
|   } | ||||
| #ifdef USE_ESP32_BLE_ADVERTISING | ||||
|   if (this->advertising_ != nullptr) { | ||||
|     this->advertising_->loop(); | ||||
|   } | ||||
| #endif | ||||
|  | ||||
|   // Log dropped events periodically | ||||
|   uint16_t dropped = this->ble_events_.get_and_reset_dropped_count(); | ||||
|   | ||||
| @@ -1,14 +1,17 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "ble_advertising.h" | ||||
| #include "esphome/core/defines.h"  // Must be included before conditional includes | ||||
|  | ||||
| #include "ble_uuid.h" | ||||
| #include "ble_scan_result.h" | ||||
| #ifdef USE_ESP32_BLE_ADVERTISING | ||||
| #include "ble_advertising.h" | ||||
| #endif | ||||
|  | ||||
| #include <functional> | ||||
|  | ||||
| #include "esphome/core/automation.h" | ||||
| #include "esphome/core/component.h" | ||||
| #include "esphome/core/defines.h" | ||||
| #include "esphome/core/helpers.h" | ||||
|  | ||||
| #include "ble_event.h" | ||||
| @@ -106,6 +109,7 @@ class ESP32BLE : public Component { | ||||
|   float get_setup_priority() const override; | ||||
|   void set_name(const std::string &name) { this->name_ = name; } | ||||
|  | ||||
| #ifdef USE_ESP32_BLE_ADVERTISING | ||||
|   void advertising_start(); | ||||
|   void advertising_set_service_data(const std::vector<uint8_t> &data); | ||||
|   void advertising_set_manufacturer_data(const std::vector<uint8_t> &data); | ||||
| @@ -113,6 +117,7 @@ class ESP32BLE : public Component { | ||||
|   void advertising_add_service_uuid(ESPBTUUID uuid); | ||||
|   void advertising_remove_service_uuid(ESPBTUUID uuid); | ||||
|   void advertising_register_raw_advertisement_callback(std::function<void(bool)> &&callback); | ||||
| #endif | ||||
|  | ||||
|   void register_gap_event_handler(GAPEventHandler *handler) { this->gap_event_handlers_.push_back(handler); } | ||||
|   void register_gap_scan_event_handler(GAPScanEventHandler *handler) { | ||||
| @@ -133,7 +138,9 @@ class ESP32BLE : public Component { | ||||
|   bool ble_setup_(); | ||||
|   bool ble_dismantle_(); | ||||
|   bool ble_pre_setup_(); | ||||
| #ifdef USE_ESP32_BLE_ADVERTISING | ||||
|   void advertising_init_(); | ||||
| #endif | ||||
|  | ||||
|  private: | ||||
|   template<typename... Args> friend void enqueue_ble_event(Args... args); | ||||
| @@ -153,7 +160,9 @@ class ESP32BLE : public Component { | ||||
|   optional<std::string> name_; | ||||
|  | ||||
|   // 4-byte aligned members | ||||
|   BLEAdvertising *advertising_{};             // 4 bytes (pointer) | ||||
| #ifdef USE_ESP32_BLE_ADVERTISING | ||||
|   BLEAdvertising *advertising_{};  // 4 bytes (pointer) | ||||
| #endif | ||||
|   esp_ble_io_cap_t io_cap_{ESP_IO_CAP_NONE};  // 4 bytes (enum) | ||||
|   uint32_t advertising_cycle_time_{};         // 4 bytes | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| #include "ble_advertising.h" | ||||
|  | ||||
| #ifdef USE_ESP32 | ||||
| #ifdef USE_ESP32_BLE_ADVERTISING | ||||
|  | ||||
| #include <cstdio> | ||||
| #include <cstring> | ||||
| @@ -161,4 +162,5 @@ void BLEAdvertising::register_raw_advertisement_callback(std::function<void(bool | ||||
|  | ||||
| }  // namespace esphome::esp32_ble | ||||
|  | ||||
| #endif | ||||
| #endif  // USE_ESP32_BLE_ADVERTISING | ||||
| #endif  // USE_ESP32 | ||||
|   | ||||
| @@ -1,10 +1,13 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "esphome/core/defines.h" | ||||
|  | ||||
| #include <array> | ||||
| #include <functional> | ||||
| #include <vector> | ||||
|  | ||||
| #ifdef USE_ESP32 | ||||
| #ifdef USE_ESP32_BLE_ADVERTISING | ||||
|  | ||||
| #include <esp_bt.h> | ||||
| #include <esp_gap_ble_api.h> | ||||
| @@ -56,4 +59,5 @@ class BLEAdvertising { | ||||
|  | ||||
| }  // namespace esphome::esp32_ble | ||||
|  | ||||
| #endif | ||||
| #endif  // USE_ESP32_BLE_ADVERTISING | ||||
| #endif  // USE_ESP32 | ||||
|   | ||||
| @@ -82,6 +82,8 @@ async def to_code(config): | ||||
|     cg.add(var.set_measured_power(config[CONF_MEASURED_POWER])) | ||||
|     cg.add(var.set_tx_power(config[CONF_TX_POWER])) | ||||
|  | ||||
|     cg.add_define("USE_ESP32_BLE_ADVERTISING") | ||||
|  | ||||
|     if CORE.using_esp_idf: | ||||
|         add_idf_sdkconfig_option("CONFIG_BT_ENABLED", True) | ||||
|         add_idf_sdkconfig_option("CONFIG_BT_BLE_42_FEATURES_SUPPORTED", True) | ||||
|   | ||||
| @@ -571,6 +571,7 @@ async def to_code(config): | ||||
|             config[CONF_ON_DISCONNECT], | ||||
|         ) | ||||
|     cg.add_define("USE_ESP32_BLE_SERVER") | ||||
|     cg.add_define("USE_ESP32_BLE_ADVERTISING") | ||||
|     if CORE.using_esp_idf: | ||||
|         add_idf_sdkconfig_option("CONFIG_BT_ENABLED", True) | ||||
|  | ||||
|   | ||||
| @@ -153,6 +153,7 @@ | ||||
| #define USE_ESP32_BLE_CLIENT | ||||
| #define USE_ESP32_BLE_DEVICE | ||||
| #define USE_ESP32_BLE_SERVER | ||||
| #define USE_ESP32_BLE_ADVERTISING | ||||
| #define USE_I2C | ||||
| #define USE_IMPROV | ||||
| #define USE_MICROPHONE | ||||
|   | ||||
		Reference in New Issue
	
	Block a user