mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	[esp32_ble_tracker] Refactor to use CORE.data instead of module-level globals
This commit is contained in:
		| @@ -60,11 +60,21 @@ class RegistrationCounts: | ||||
|     clients: int = 0 | ||||
|  | ||||
|  | ||||
| # Set to track which features are needed by components | ||||
| _required_features: set[BLEFeatures] = set() | ||||
| # CORE.data keys for state management | ||||
| ESP32_BLE_TRACKER_REQUIRED_FEATURES_KEY = "esp32_ble_tracker_required_features" | ||||
| ESP32_BLE_TRACKER_REGISTRATION_COUNTS_KEY = "esp32_ble_tracker_registration_counts" | ||||
|  | ||||
| # Track registration counts for StaticVector sizing | ||||
| _registration_counts = RegistrationCounts() | ||||
|  | ||||
| def _get_required_features() -> set[BLEFeatures]: | ||||
|     """Get the set of required BLE features from CORE.data.""" | ||||
|     return CORE.data.setdefault(ESP32_BLE_TRACKER_REQUIRED_FEATURES_KEY, set()) | ||||
|  | ||||
|  | ||||
| def _get_registration_counts() -> RegistrationCounts: | ||||
|     """Get the registration counts from CORE.data.""" | ||||
|     return CORE.data.setdefault( | ||||
|         ESP32_BLE_TRACKER_REGISTRATION_COUNTS_KEY, RegistrationCounts() | ||||
|     ) | ||||
|  | ||||
|  | ||||
| def register_ble_features(features: set[BLEFeatures]) -> None: | ||||
| @@ -73,7 +83,7 @@ def register_ble_features(features: set[BLEFeatures]) -> None: | ||||
|     Args: | ||||
|         features: Set of BLEFeatures enum members | ||||
|     """ | ||||
|     _required_features.update(features) | ||||
|     _get_required_features().update(features) | ||||
|  | ||||
|  | ||||
| esp32_ble_tracker_ns = cg.esphome_ns.namespace("esp32_ble_tracker") | ||||
| @@ -267,15 +277,17 @@ async def to_code(config): | ||||
|     ): | ||||
|         register_ble_features({BLEFeatures.ESP_BT_DEVICE}) | ||||
|  | ||||
|     registration_counts = _get_registration_counts() | ||||
|  | ||||
|     for conf in config.get(CONF_ON_BLE_ADVERTISE, []): | ||||
|         _registration_counts.listeners += 1 | ||||
|         registration_counts.listeners += 1 | ||||
|         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) | ||||
|         if CONF_MAC_ADDRESS in conf: | ||||
|             addr_list = [it.as_hex for it in conf[CONF_MAC_ADDRESS]] | ||||
|             cg.add(trigger.set_addresses(addr_list)) | ||||
|         await automation.build_automation(trigger, [(ESPBTDeviceConstRef, "x")], conf) | ||||
|     for conf in config.get(CONF_ON_BLE_SERVICE_DATA_ADVERTISE, []): | ||||
|         _registration_counts.listeners += 1 | ||||
|         registration_counts.listeners += 1 | ||||
|         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) | ||||
|         if len(conf[CONF_SERVICE_UUID]) == len(bt_uuid16_format): | ||||
|             cg.add(trigger.set_service_uuid16(as_hex(conf[CONF_SERVICE_UUID]))) | ||||
| @@ -288,7 +300,7 @@ async def to_code(config): | ||||
|             cg.add(trigger.set_address(conf[CONF_MAC_ADDRESS].as_hex)) | ||||
|         await automation.build_automation(trigger, [(adv_data_t_const_ref, "x")], conf) | ||||
|     for conf in config.get(CONF_ON_BLE_MANUFACTURER_DATA_ADVERTISE, []): | ||||
|         _registration_counts.listeners += 1 | ||||
|         registration_counts.listeners += 1 | ||||
|         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) | ||||
|         if len(conf[CONF_MANUFACTURER_ID]) == len(bt_uuid16_format): | ||||
|             cg.add(trigger.set_manufacturer_uuid16(as_hex(conf[CONF_MANUFACTURER_ID]))) | ||||
| @@ -301,7 +313,7 @@ async def to_code(config): | ||||
|             cg.add(trigger.set_address(conf[CONF_MAC_ADDRESS].as_hex)) | ||||
|         await automation.build_automation(trigger, [(adv_data_t_const_ref, "x")], conf) | ||||
|     for conf in config.get(CONF_ON_SCAN_END, []): | ||||
|         _registration_counts.listeners += 1 | ||||
|         registration_counts.listeners += 1 | ||||
|         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) | ||||
|         await automation.build_automation(trigger, [], conf) | ||||
|  | ||||
| @@ -331,19 +343,21 @@ async def to_code(config): | ||||
| @coroutine_with_priority(CoroPriority.FINAL) | ||||
| async def _add_ble_features(): | ||||
|     # Add feature-specific defines based on what's needed | ||||
|     if BLEFeatures.ESP_BT_DEVICE in _required_features: | ||||
|     required_features = _get_required_features() | ||||
|     if BLEFeatures.ESP_BT_DEVICE in required_features: | ||||
|         cg.add_define("USE_ESP32_BLE_DEVICE") | ||||
|         cg.add_define("USE_ESP32_BLE_UUID") | ||||
|  | ||||
|     # Add defines for StaticVector sizing based on registration counts | ||||
|     # Only define if count > 0 to avoid allocating unnecessary memory | ||||
|     if _registration_counts.listeners > 0: | ||||
|     registration_counts = _get_registration_counts() | ||||
|     if registration_counts.listeners > 0: | ||||
|         cg.add_define( | ||||
|             "ESPHOME_ESP32_BLE_TRACKER_LISTENER_COUNT", _registration_counts.listeners | ||||
|             "ESPHOME_ESP32_BLE_TRACKER_LISTENER_COUNT", registration_counts.listeners | ||||
|         ) | ||||
|     if _registration_counts.clients > 0: | ||||
|     if registration_counts.clients > 0: | ||||
|         cg.add_define( | ||||
|             "ESPHOME_ESP32_BLE_TRACKER_CLIENT_COUNT", _registration_counts.clients | ||||
|             "ESPHOME_ESP32_BLE_TRACKER_CLIENT_COUNT", registration_counts.clients | ||||
|         ) | ||||
|  | ||||
|  | ||||
| @@ -395,7 +409,7 @@ async def register_ble_device( | ||||
|     var: cg.SafeExpType, config: ConfigType | ||||
| ) -> cg.SafeExpType: | ||||
|     register_ble_features({BLEFeatures.ESP_BT_DEVICE}) | ||||
|     _registration_counts.listeners += 1 | ||||
|     _get_registration_counts().listeners += 1 | ||||
|     paren = await cg.get_variable(config[CONF_ESP32_BLE_ID]) | ||||
|     cg.add(paren.register_listener(var)) | ||||
|     return var | ||||
| @@ -403,7 +417,7 @@ async def register_ble_device( | ||||
|  | ||||
| async def register_client(var: cg.SafeExpType, config: ConfigType) -> cg.SafeExpType: | ||||
|     register_ble_features({BLEFeatures.ESP_BT_DEVICE}) | ||||
|     _registration_counts.clients += 1 | ||||
|     _get_registration_counts().clients += 1 | ||||
|     paren = await cg.get_variable(config[CONF_ESP32_BLE_ID]) | ||||
|     cg.add(paren.register_client(var)) | ||||
|     return var | ||||
| @@ -417,7 +431,7 @@ async def register_raw_ble_device( | ||||
|     This does NOT register the ESP_BT_DEVICE feature, meaning ESPBTDevice | ||||
|     will not be compiled in if this is the only registration method used. | ||||
|     """ | ||||
|     _registration_counts.listeners += 1 | ||||
|     _get_registration_counts().listeners += 1 | ||||
|     paren = await cg.get_variable(config[CONF_ESP32_BLE_ID]) | ||||
|     cg.add(paren.register_listener(var)) | ||||
|     return var | ||||
| @@ -431,7 +445,7 @@ async def register_raw_client( | ||||
|     This does NOT register the ESP_BT_DEVICE feature, meaning ESPBTDevice | ||||
|     will not be compiled in if this is the only registration method used. | ||||
|     """ | ||||
|     _registration_counts.clients += 1 | ||||
|     _get_registration_counts().clients += 1 | ||||
|     paren = await cg.get_variable(config[CONF_ESP32_BLE_ID]) | ||||
|     cg.add(paren.register_client(var)) | ||||
|     return var | ||||
|   | ||||
		Reference in New Issue
	
	Block a user