mirror of
https://github.com/esphome/esphome.git
synced 2025-10-18 17:53:47 +01:00
Merge remote-tracking branch 'upstream/dev' into integration
This commit is contained in:
@@ -1519,7 +1519,7 @@ message BluetoothGATTCharacteristic {
|
|||||||
repeated uint64 uuid = 1 [(fixed_array_size) = 2, (fixed_array_skip_zero) = true];
|
repeated uint64 uuid = 1 [(fixed_array_size) = 2, (fixed_array_skip_zero) = true];
|
||||||
uint32 handle = 2;
|
uint32 handle = 2;
|
||||||
uint32 properties = 3;
|
uint32 properties = 3;
|
||||||
repeated BluetoothGATTDescriptor descriptors = 4;
|
repeated BluetoothGATTDescriptor descriptors = 4 [(fixed_vector) = true];
|
||||||
|
|
||||||
// New field for efficient UUID (v1.12+)
|
// New field for efficient UUID (v1.12+)
|
||||||
// Only one of uuid or short_uuid will be set.
|
// Only one of uuid or short_uuid will be set.
|
||||||
@@ -1531,7 +1531,7 @@ message BluetoothGATTCharacteristic {
|
|||||||
message BluetoothGATTService {
|
message BluetoothGATTService {
|
||||||
repeated uint64 uuid = 1 [(fixed_array_size) = 2, (fixed_array_skip_zero) = true];
|
repeated uint64 uuid = 1 [(fixed_array_size) = 2, (fixed_array_skip_zero) = true];
|
||||||
uint32 handle = 2;
|
uint32 handle = 2;
|
||||||
repeated BluetoothGATTCharacteristic characteristics = 3;
|
repeated BluetoothGATTCharacteristic characteristics = 3 [(fixed_vector) = true];
|
||||||
|
|
||||||
// New field for efficient UUID (v1.12+)
|
// New field for efficient UUID (v1.12+)
|
||||||
// Only one of uuid or short_uuid will be set.
|
// Only one of uuid or short_uuid will be set.
|
||||||
|
@@ -64,4 +64,10 @@ extend google.protobuf.FieldOptions {
|
|||||||
// This is typically done through methods returning const T& or special accessor
|
// This is typically done through methods returning const T& or special accessor
|
||||||
// methods like get_options() or supported_modes_for_api_().
|
// methods like get_options() or supported_modes_for_api_().
|
||||||
optional string container_pointer = 50001;
|
optional string container_pointer = 50001;
|
||||||
|
|
||||||
|
// fixed_vector: Use FixedVector instead of std::vector for repeated fields
|
||||||
|
// When set, the repeated field will use FixedVector<T> which requires calling
|
||||||
|
// init(size) before adding elements. This eliminates std::vector template overhead
|
||||||
|
// and is ideal when the exact size is known before populating the array.
|
||||||
|
optional bool fixed_vector = 50013 [default=false];
|
||||||
}
|
}
|
||||||
|
@@ -1923,7 +1923,7 @@ class BluetoothGATTCharacteristic final : public ProtoMessage {
|
|||||||
std::array<uint64_t, 2> uuid{};
|
std::array<uint64_t, 2> uuid{};
|
||||||
uint32_t handle{0};
|
uint32_t handle{0};
|
||||||
uint32_t properties{0};
|
uint32_t properties{0};
|
||||||
std::vector<BluetoothGATTDescriptor> descriptors{};
|
FixedVector<BluetoothGATTDescriptor> descriptors{};
|
||||||
uint32_t short_uuid{0};
|
uint32_t short_uuid{0};
|
||||||
void encode(ProtoWriteBuffer buffer) const override;
|
void encode(ProtoWriteBuffer buffer) const override;
|
||||||
void calculate_size(ProtoSize &size) const override;
|
void calculate_size(ProtoSize &size) const override;
|
||||||
@@ -1937,7 +1937,7 @@ class BluetoothGATTService final : public ProtoMessage {
|
|||||||
public:
|
public:
|
||||||
std::array<uint64_t, 2> uuid{};
|
std::array<uint64_t, 2> uuid{};
|
||||||
uint32_t handle{0};
|
uint32_t handle{0};
|
||||||
std::vector<BluetoothGATTCharacteristic> characteristics{};
|
FixedVector<BluetoothGATTCharacteristic> characteristics{};
|
||||||
uint32_t short_uuid{0};
|
uint32_t short_uuid{0};
|
||||||
void encode(ProtoWriteBuffer buffer) const override;
|
void encode(ProtoWriteBuffer buffer) const override;
|
||||||
void calculate_size(ProtoSize &size) const override;
|
void calculate_size(ProtoSize &size) const override;
|
||||||
|
@@ -749,13 +749,29 @@ class ProtoSize {
|
|||||||
template<typename MessageType>
|
template<typename MessageType>
|
||||||
inline void add_repeated_message(uint32_t field_id_size, const std::vector<MessageType> &messages) {
|
inline void add_repeated_message(uint32_t field_id_size, const std::vector<MessageType> &messages) {
|
||||||
// Skip if the vector is empty
|
// Skip if the vector is empty
|
||||||
if (messages.empty()) {
|
if (!messages.empty()) {
|
||||||
return;
|
// Use the force version for all messages in the repeated field
|
||||||
|
for (const auto &message : messages) {
|
||||||
|
add_message_object_force(field_id_size, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Use the force version for all messages in the repeated field
|
/**
|
||||||
for (const auto &message : messages) {
|
* @brief Calculates and adds the sizes of all messages in a repeated field to the total message size (FixedVector
|
||||||
add_message_object_force(field_id_size, message);
|
* version)
|
||||||
|
*
|
||||||
|
* @tparam MessageType The type of the nested messages in the FixedVector
|
||||||
|
* @param messages FixedVector of message objects
|
||||||
|
*/
|
||||||
|
template<typename MessageType>
|
||||||
|
inline void add_repeated_message(uint32_t field_id_size, const FixedVector<MessageType> &messages) {
|
||||||
|
// Skip if the fixed vector is empty
|
||||||
|
if (!messages.empty()) {
|
||||||
|
// Use the force version for all messages in the repeated field
|
||||||
|
for (const auto &message : messages) {
|
||||||
|
add_message_object_force(field_id_size, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -230,8 +230,8 @@ void BluetoothConnection::send_service_for_discovery_() {
|
|||||||
service_resp.handle = service_result.start_handle;
|
service_resp.handle = service_result.start_handle;
|
||||||
|
|
||||||
if (total_char_count > 0) {
|
if (total_char_count > 0) {
|
||||||
// Reserve space and process characteristics
|
// Initialize FixedVector with exact count and process characteristics
|
||||||
service_resp.characteristics.reserve(total_char_count);
|
service_resp.characteristics.init(total_char_count);
|
||||||
uint16_t char_offset = 0;
|
uint16_t char_offset = 0;
|
||||||
esp_gattc_char_elem_t char_result;
|
esp_gattc_char_elem_t char_result;
|
||||||
while (true) { // characteristics
|
while (true) { // characteristics
|
||||||
@@ -253,9 +253,7 @@ void BluetoothConnection::send_service_for_discovery_() {
|
|||||||
|
|
||||||
service_resp.characteristics.emplace_back();
|
service_resp.characteristics.emplace_back();
|
||||||
auto &characteristic_resp = service_resp.characteristics.back();
|
auto &characteristic_resp = service_resp.characteristics.back();
|
||||||
|
|
||||||
fill_gatt_uuid(characteristic_resp.uuid, characteristic_resp.short_uuid, char_result.uuid, use_efficient_uuids);
|
fill_gatt_uuid(characteristic_resp.uuid, characteristic_resp.short_uuid, char_result.uuid, use_efficient_uuids);
|
||||||
|
|
||||||
characteristic_resp.handle = char_result.char_handle;
|
characteristic_resp.handle = char_result.char_handle;
|
||||||
characteristic_resp.properties = char_result.properties;
|
characteristic_resp.properties = char_result.properties;
|
||||||
char_offset++;
|
char_offset++;
|
||||||
@@ -271,12 +269,11 @@ void BluetoothConnection::send_service_for_discovery_() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (total_desc_count == 0) {
|
if (total_desc_count == 0) {
|
||||||
// No descriptors, continue to next characteristic
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reserve space and process descriptors
|
// Initialize FixedVector with exact count and process descriptors
|
||||||
characteristic_resp.descriptors.reserve(total_desc_count);
|
characteristic_resp.descriptors.init(total_desc_count);
|
||||||
uint16_t desc_offset = 0;
|
uint16_t desc_offset = 0;
|
||||||
esp_gattc_descr_elem_t desc_result;
|
esp_gattc_descr_elem_t desc_result;
|
||||||
while (true) { // descriptors
|
while (true) { // descriptors
|
||||||
@@ -297,9 +294,7 @@ void BluetoothConnection::send_service_for_discovery_() {
|
|||||||
|
|
||||||
characteristic_resp.descriptors.emplace_back();
|
characteristic_resp.descriptors.emplace_back();
|
||||||
auto &descriptor_resp = characteristic_resp.descriptors.back();
|
auto &descriptor_resp = characteristic_resp.descriptors.back();
|
||||||
|
|
||||||
fill_gatt_uuid(descriptor_resp.uuid, descriptor_resp.short_uuid, desc_result.uuid, use_efficient_uuids);
|
fill_gatt_uuid(descriptor_resp.uuid, descriptor_resp.short_uuid, desc_result.uuid, use_efficient_uuids);
|
||||||
|
|
||||||
descriptor_resp.handle = desc_result.handle;
|
descriptor_resp.handle = desc_result.handle;
|
||||||
desc_offset++;
|
desc_offset++;
|
||||||
}
|
}
|
||||||
|
@@ -433,7 +433,7 @@ def final_validation(config):
|
|||||||
FINAL_VALIDATE_SCHEMA = final_validation
|
FINAL_VALIDATE_SCHEMA = final_validation
|
||||||
|
|
||||||
|
|
||||||
# This needs to be run as a job with very low priority so that all components have
|
# This needs to be run as a job with CoroPriority.FINAL priority so that all components have
|
||||||
# a chance to register their handlers before the counts are added to defines.
|
# a chance to register their handlers before the counts are added to defines.
|
||||||
@coroutine_with_priority(CoroPriority.FINAL)
|
@coroutine_with_priority(CoroPriority.FINAL)
|
||||||
async def _add_ble_handler_defines():
|
async def _add_ble_handler_defines():
|
||||||
|
@@ -202,7 +202,11 @@ template<typename T> class FixedVector {
|
|||||||
|
|
||||||
~FixedVector() { cleanup_(); }
|
~FixedVector() { cleanup_(); }
|
||||||
|
|
||||||
// Enable move semantics for use in containers
|
// Disable copy operations (avoid accidental expensive copies)
|
||||||
|
FixedVector(const FixedVector &) = delete;
|
||||||
|
FixedVector &operator=(const FixedVector &) = delete;
|
||||||
|
|
||||||
|
// Enable move semantics (allows use in move-only containers like std::vector)
|
||||||
FixedVector(FixedVector &&other) noexcept : data_(other.data_), size_(other.size_), capacity_(other.capacity_) {
|
FixedVector(FixedVector &&other) noexcept : data_(other.data_), size_(other.size_), capacity_(other.capacity_) {
|
||||||
other.reset_();
|
other.reset_();
|
||||||
}
|
}
|
||||||
|
@@ -12,7 +12,7 @@ platformio==6.1.18 # When updating platformio, also update /docker/Dockerfile
|
|||||||
esptool==5.1.0
|
esptool==5.1.0
|
||||||
click==8.1.7
|
click==8.1.7
|
||||||
esphome-dashboard==20251013.0
|
esphome-dashboard==20251013.0
|
||||||
aioesphomeapi==41.16.0
|
aioesphomeapi==41.16.1
|
||||||
zeroconf==0.148.0
|
zeroconf==0.148.0
|
||||||
puremagic==1.30
|
puremagic==1.30
|
||||||
ruamel.yaml==0.18.15 # dashboard_import
|
ruamel.yaml==0.18.15 # dashboard_import
|
||||||
|
@@ -1415,6 +1415,8 @@ class RepeatedTypeInfo(TypeInfo):
|
|||||||
# Check if this is a pointer field by looking for container_pointer option
|
# Check if this is a pointer field by looking for container_pointer option
|
||||||
self._container_type = get_field_opt(field, pb.container_pointer, "")
|
self._container_type = get_field_opt(field, pb.container_pointer, "")
|
||||||
self._use_pointer = bool(self._container_type)
|
self._use_pointer = bool(self._container_type)
|
||||||
|
# Check if this should use FixedVector instead of std::vector
|
||||||
|
self._use_fixed_vector = get_field_opt(field, pb.fixed_vector, False)
|
||||||
|
|
||||||
# For repeated fields, we need to get the base type info
|
# For repeated fields, we need to get the base type info
|
||||||
# but we can't call create_field_type_info as it would cause recursion
|
# but we can't call create_field_type_info as it would cause recursion
|
||||||
@@ -1438,6 +1440,8 @@ class RepeatedTypeInfo(TypeInfo):
|
|||||||
if "<" in self._container_type and ">" in self._container_type:
|
if "<" in self._container_type and ">" in self._container_type:
|
||||||
return f"const {self._container_type}*"
|
return f"const {self._container_type}*"
|
||||||
return f"const {self._container_type}<{self._ti.cpp_type}>*"
|
return f"const {self._container_type}<{self._ti.cpp_type}>*"
|
||||||
|
if self._use_fixed_vector:
|
||||||
|
return f"FixedVector<{self._ti.cpp_type}>"
|
||||||
return f"std::vector<{self._ti.cpp_type}>"
|
return f"std::vector<{self._ti.cpp_type}>"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
Reference in New Issue
Block a user