From ab4a21e84d9afe9e602422b2926a16ee62ffa8e3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 9 Jul 2025 22:20:49 -1000 Subject: [PATCH] fix --- esphome/components/api/proto.cpp | 58 ++++++++++++++---------- esphome/components/api/proto_templates.h | 6 +-- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/esphome/components/api/proto.cpp b/esphome/components/api/proto.cpp index 7691dbf7f6..e406a846d1 100644 --- a/esphome/components/api/proto.cpp +++ b/esphome/components/api/proto.cpp @@ -164,67 +164,67 @@ void encode_bytes_field(ProtoWriteBuffer &buffer, const void *field_ptr, uint8_t // Type-specific size calculation functions void size_string_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *str = static_cast(field_ptr); - ProtoSize::add_string_field(total_size, 1, *str, force); + ProtoSize::add_string_field(total_size, field_num, *str, force); } void size_fixed32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_fixed_field<4>(total_size, 1, *val != 0 || force, force); + ProtoSize::add_fixed_field<4>(total_size, field_num, *val != 0 || force, force); } void size_bool_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_bool_field(total_size, 1, *val, force); + ProtoSize::add_bool_field(total_size, field_num, *val, force); } void size_float_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_fixed_field<4>(total_size, 1, *val != 0.0f || force, force); + ProtoSize::add_fixed_field<4>(total_size, field_num, *val != 0.0f || force, force); } void size_int32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_int32_field(total_size, 1, *val, force); + ProtoSize::add_int32_field(total_size, field_num, *val, force); } void size_uint32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_uint32_field(total_size, 1, *val, force); + ProtoSize::add_uint32_field(total_size, field_num, *val, force); } void size_int64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_int64_field(total_size, 1, *val, force); + ProtoSize::add_int64_field(total_size, field_num, *val, force); } void size_uint64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_uint64_field(total_size, 1, *val, force); + ProtoSize::add_uint64_field(total_size, field_num, *val, force); } void size_sint32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_sint32_field(total_size, 1, *val, force); + ProtoSize::add_sint32_field(total_size, field_num, *val, force); } void size_sint64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_sint64_field(total_size, 1, *val, force); + ProtoSize::add_sint64_field(total_size, field_num, *val, force); } void size_fixed64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_fixed_field<8>(total_size, 1, *val != 0 || force, force); + ProtoSize::add_fixed_field<8>(total_size, field_num, *val != 0 || force, force); } void size_double_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_fixed_field<8>(total_size, 1, *val != 0.0 || force, force); + ProtoSize::add_fixed_field<8>(total_size, field_num, *val != 0.0 || force, force); } void size_bytes_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *str = static_cast(field_ptr); - ProtoSize::add_string_field(total_size, 1, *str, force); + ProtoSize::add_string_field(total_size, field_num, *str, force); } // Type-specific decode functions @@ -404,56 +404,56 @@ void encode_repeated_double_field(ProtoWriteBuffer &buffer, const void *field_pt void size_repeated_string_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); for (const auto &item : *vec) { - ProtoSize::add_string_field(total_size, 1, item, true); + ProtoSize::add_string_field(total_size, field_num, item, true); } } void size_repeated_bool_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); for (bool val : *vec) { - ProtoSize::add_bool_field(total_size, 1, val, true); + ProtoSize::add_bool_field(total_size, field_num, val, true); } } void size_repeated_uint32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); for (const auto &val : *vec) { - ProtoSize::add_uint32_field(total_size, 1, val, true); + ProtoSize::add_uint32_field(total_size, field_num, val, true); } } void size_repeated_int32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); for (const auto &val : *vec) { - ProtoSize::add_int32_field(total_size, 1, val, true); + ProtoSize::add_int32_field(total_size, field_num, val, true); } } void size_repeated_uint64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); for (const auto &val : *vec) { - ProtoSize::add_uint64_field(total_size, 1, val, true); + ProtoSize::add_uint64_field(total_size, field_num, val, true); } } void size_repeated_int64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); for (const auto &val : *vec) { - ProtoSize::add_int64_field(total_size, 1, val, true); + ProtoSize::add_int64_field(total_size, field_num, val, true); } } void size_repeated_sint32_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); for (const auto &val : *vec) { - ProtoSize::add_sint32_field(total_size, 1, val, true); + ProtoSize::add_sint32_field(total_size, field_num, val, true); } } void size_repeated_sint64_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); for (const auto &val : *vec) { - ProtoSize::add_sint64_field(total_size, 1, val, true); + ProtoSize::add_sint64_field(total_size, field_num, val, true); } } @@ -461,7 +461,9 @@ void size_repeated_fixed32_field(uint32_t &total_size, const void *field_ptr, ui const auto *vec = static_cast *>(field_ptr); size_t count = vec->size(); if (count > 0) { - total_size += count * (1 + 4); // field_id + 4 bytes per item + // Calculate proper field tag size + uint32_t tag_size = ProtoSize::varint(static_cast((field_num << 3) | 5)); // wire type 5 for fixed32 + total_size += count * (tag_size + 4); // field tag + 4 bytes per item } } @@ -469,7 +471,9 @@ void size_repeated_fixed64_field(uint32_t &total_size, const void *field_ptr, ui const auto *vec = static_cast *>(field_ptr); size_t count = vec->size(); if (count > 0) { - total_size += count * (1 + 8); // field_id + 8 bytes per item + // Calculate proper field tag size + uint32_t tag_size = ProtoSize::varint(static_cast((field_num << 3) | 1)); // wire type 1 for fixed64 + total_size += count * (tag_size + 8); // field tag + 8 bytes per item } } @@ -477,7 +481,9 @@ void size_repeated_float_field(uint32_t &total_size, const void *field_ptr, uint const auto *vec = static_cast *>(field_ptr); size_t count = vec->size(); if (count > 0) { - total_size += count * (1 + 4); // field_id + 4 bytes per item + // Calculate proper field tag size + uint32_t tag_size = ProtoSize::varint(static_cast((field_num << 3) | 5)); // wire type 5 for float + total_size += count * (tag_size + 4); // field tag + 4 bytes per item } } @@ -485,7 +491,9 @@ void size_repeated_double_field(uint32_t &total_size, const void *field_ptr, uin const auto *vec = static_cast *>(field_ptr); size_t count = vec->size(); if (count > 0) { - total_size += count * (1 + 8); // field_id + 8 bytes per item + // Calculate proper field tag size + uint32_t tag_size = ProtoSize::varint(static_cast((field_num << 3) | 1)); // wire type 1 for double + total_size += count * (tag_size + 8); // field tag + 8 bytes per item } } diff --git a/esphome/components/api/proto_templates.h b/esphome/components/api/proto_templates.h index 2e593250fe..f0a34e04f6 100644 --- a/esphome/components/api/proto_templates.h +++ b/esphome/components/api/proto_templates.h @@ -16,7 +16,7 @@ inline void encode_enum_field(ProtoWriteBuffer &buffer, const void *field_ptr, u template inline void size_enum_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num, bool force) { const auto *val = static_cast(field_ptr); - ProtoSize::add_enum_field(total_size, 1, static_cast(*val), force); + ProtoSize::add_enum_field(total_size, field_num, static_cast(*val), force); } template inline bool decode_enum_field(void *field_ptr, ProtoVarInt value) { @@ -47,14 +47,14 @@ template inline void size_repeated_enum_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); for (const auto &val : *vec) { - ProtoSize::add_enum_field(total_size, 1, static_cast(val), true); + ProtoSize::add_enum_field(total_size, field_num, static_cast(val), true); } } template inline void size_repeated_message_field(uint32_t &total_size, const void *field_ptr, uint8_t field_num) { const auto *vec = static_cast *>(field_ptr); - ProtoSize::add_repeated_message(total_size, 1, *vec); + ProtoSize::add_repeated_message(total_size, field_num, *vec); } } // namespace api