diff --git a/esphome/components/bthome/__init__.py b/esphome/components/bthome/__init__.py index 7cadbe26fc..b66a343ba0 100644 --- a/esphome/components/bthome/__init__.py +++ b/esphome/components/bthome/__init__.py @@ -172,6 +172,16 @@ FINAL_VALIDATE_SCHEMA = esp32_ble.validate_variant async def to_code(config): + # Calculate sizes for StaticVector compile-time allocation + num_sensors = max(1, len(config.get(CONF_SENSORS, []))) + num_binary_sensors = max(1, len(config.get(CONF_BINARY_SENSORS, []))) + max_packets = max(1, num_sensors + num_binary_sensors) + + # Add defines for compile-time sizes (must be before new_Pvariable) + cg.add_define("BTHOME_MAX_MEASUREMENTS", num_sensors) + cg.add_define("BTHOME_MAX_BINARY_MEASUREMENTS", num_binary_sensors) + cg.add_define("BTHOME_MAX_ADV_PACKETS", max_packets) + var = cg.new_Pvariable(config[CONF_ID]) parent = await cg.get_variable(config[esp32_ble.CONF_BLE_ID]) @@ -182,17 +192,6 @@ async def to_code(config): cg.add(var.set_max_interval(config[CONF_MAX_INTERVAL])) cg.add(var.set_tx_power(config[CONF_TX_POWER])) - # Initialize FixedVectors with proper sizes - num_sensors = len(config.get(CONF_SENSORS, [])) - num_binary_sensors = len(config.get(CONF_BINARY_SENSORS, [])) - max_packets = max(1, num_sensors + num_binary_sensors) - - # Initialize the measurements and binary_measurements FixedVectors - cg.add(cg.RawExpression(f"{var}->measurements_.init({num_sensors})")) - cg.add(cg.RawExpression(f"{var}->binary_measurements_.init({num_binary_sensors})")) - cg.add(cg.RawExpression(f"{var}->adv_packets_.init({max_packets})")) - cg.add(cg.RawExpression(f"{var}->adv_packet_sizes_.init({max_packets})")) - if CONF_ENCRYPTION_KEY in config: key = config[CONF_ENCRYPTION_KEY] key_bytes = [cg.RawExpression(f"0x{key[i:i+2]}") for i in range(0, len(key), 2)] diff --git a/esphome/components/bthome/bthome.h b/esphome/components/bthome/bthome.h index 8cabc522d1..add8ab39ba 100644 --- a/esphome/components/bthome/bthome.h +++ b/esphome/components/bthome/bthome.h @@ -57,8 +57,8 @@ class BTHome : public Component, public GAPEventHandler, public Parented measurements_; - FixedVector binary_measurements_; + StaticVector measurements_; + StaticVector binary_measurements_; uint16_t min_interval_{}; uint16_t max_interval_{}; @@ -72,8 +72,8 @@ class BTHome : public Component, public GAPEventHandler, public Parented> adv_packets_; // Multiple advertisement packets - FixedVector adv_packet_sizes_; // Size of each packet + StaticVector, BTHOME_MAX_ADV_PACKETS> adv_packets_; // Multiple advertisement packets + StaticVector adv_packet_sizes_; // Size of each packet uint8_t current_packet_index_{0}; bool data_changed_{true}; bool immediate_advertising_pending_{false}; diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 41f4b28cd5..895c1125b0 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -176,6 +176,9 @@ #define USE_ESP32_BLE_SERVER #define USE_ESP32_BLE_UUID #define USE_ESP32_BLE_ADVERTISING +#define BTHOME_MAX_MEASUREMENTS 8 +#define BTHOME_MAX_BINARY_MEASUREMENTS 8 +#define BTHOME_MAX_ADV_PACKETS 16 #define USE_ESP32_BLE_SERVER_SET_VALUE_ACTION #define USE_ESP32_BLE_SERVER_DESCRIPTOR_SET_VALUE_ACTION #define USE_ESP32_BLE_SERVER_NOTIFY_ACTION