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