mirror of
https://github.com/esphome/esphome.git
synced 2025-09-01 10:52:19 +01:00
[api] Optimize protobuf empty message handling to reduce flash and runtime overhead (#9908)
This commit is contained in:
@@ -1772,8 +1772,13 @@ def build_message_type(
|
||||
if base_class:
|
||||
out = f"class {desc.name} : public {base_class} {{\n"
|
||||
else:
|
||||
# Determine inheritance based on whether the message needs decoding
|
||||
base_class = "ProtoDecodableMessage" if needs_decode else "ProtoMessage"
|
||||
# Check if message has any non-deprecated fields
|
||||
has_fields = any(not field.options.deprecated for field in desc.field)
|
||||
# Determine inheritance based on whether the message needs decoding and has fields
|
||||
if needs_decode and has_fields:
|
||||
base_class = "ProtoDecodableMessage"
|
||||
else:
|
||||
base_class = "ProtoMessage"
|
||||
out = f"class {desc.name} : public {base_class} {{\n"
|
||||
out += " public:\n"
|
||||
out += indent("\n".join(public_content)) + "\n"
|
||||
@@ -2039,7 +2044,14 @@ def build_service_message_type(
|
||||
hout += f"virtual void {func}(const {mt.name} &value){{}};\n"
|
||||
case = ""
|
||||
case += f"{mt.name} msg;\n"
|
||||
case += "msg.decode(msg_data, msg_size);\n"
|
||||
# Check if this message has any fields (excluding deprecated ones)
|
||||
has_fields = any(not field.options.deprecated for field in mt.field)
|
||||
if has_fields:
|
||||
# Normal case: decode the message
|
||||
case += "msg.decode(msg_data, msg_size);\n"
|
||||
else:
|
||||
# Empty message optimization: skip decode since there are no fields
|
||||
case += "// Empty message: no decode needed\n"
|
||||
if log:
|
||||
case += "#ifdef HAS_PROTO_MESSAGE_DUMP\n"
|
||||
case += f'ESP_LOGVV(TAG, "{func}: %s", msg.dump().c_str());\n'
|
||||
|
Reference in New Issue
Block a user