|
16 | 16 | import os |
17 | 17 | import pathlib |
18 | 18 | from typing import List |
| 19 | +from google.protobuf.descriptor import FieldDescriptor |
19 | 20 |
|
20 | 21 | from tdk.utils.constant import RESOURCE_CATALOG_JSON_NAME |
21 | | - |
| 22 | +from google.protobuf.message import Message |
22 | 23 | try: |
23 | 24 | from uprotocol_vsomeip.vsomeip_utransport import ( |
24 | 25 | VsomeipHelper, |
|
28 | 29 |
|
29 | 30 | someip_entity = [] |
30 | 31 | temp_someip_entity = [] |
| 32 | +is_serializer_enabled=False |
| 33 | + |
| 34 | +def ensure_defaults(message: Message) -> Message: |
| 35 | + """ |
| 36 | + Ensures that all fields in a Protobuf message are explicitly set. |
| 37 | + This is required for SOME/IP serialization where no fields should be omitted. |
| 38 | +
|
| 39 | + :param message: Protobuf message object |
| 40 | + :return: Modified message with default values explicitly set |
| 41 | + """ |
| 42 | + print("Ensuring defaults for:", message) |
| 43 | + default_message = message.__class__() # Create a new instance with default values |
| 44 | + |
| 45 | + for field in message.DESCRIPTOR.fields: |
| 46 | + field_name = field.name |
| 47 | + field_value = getattr(message, field_name, None) |
| 48 | + |
| 49 | + # ✅ Handle nested Protobuf messages (recursively process) |
| 50 | + if field.type == FieldDescriptor.TYPE_MESSAGE and field_value is not None: |
| 51 | + ensure_defaults(field_value) |
| 52 | + |
| 53 | + # ✅ Handle fields that do not support HasField() (primitive types like int, string, bool) |
| 54 | + elif field.label != FieldDescriptor.LABEL_REPEATED: # Not a repeated field |
| 55 | + try: |
| 56 | + if not message.HasField(field_name): # Only call HasField() if field supports it |
| 57 | + setattr(message, field_name, getattr(default_message, field_name)) # Assign default |
| 58 | + except ValueError: # Primitive types (int, float, string) don’t support HasField() |
| 59 | + if field_value in [None, "", 0, False]: # If unset, assign default |
| 60 | + setattr(message, field_name, getattr(default_message, field_name)) |
31 | 61 |
|
| 62 | + # ✅ Handle repeated fields (lists) |
| 63 | + elif field.label == FieldDescriptor.LABEL_REPEATED: |
| 64 | + if not field_value: # If list is empty, set to default |
| 65 | + setattr(message, field_name, getattr(default_message, field_name)) |
| 66 | + # print(f"Message with all value set: {message}") |
| 67 | + return message # |
32 | 68 |
|
33 | 69 | def configure_someip_service(entity_name): |
34 | 70 | global temp_someip_entity |
@@ -65,17 +101,16 @@ def services_info(self) -> List[VsomeipHelper.UEntityInfo]: |
65 | 101 | if "type" in node and node["type"] == "topic": |
66 | 102 | topic_ids.append(int(node["id"]) + 32768) |
67 | 103 | for property in data["node"]["properties"]: |
68 | | - if property["name"] == "version_major": |
| 104 | + if property["name"] == "service_version_major": |
69 | 105 | major_version = property["value"] |
70 | 106 | break |
71 | 107 | if service_name in someip_entity: |
72 | 108 | entity_info.append( |
73 | 109 | VsomeipHelper.UEntityInfo( |
74 | | - Name=service_name, |
75 | | - Id=int(service_id), |
76 | | - Events=topic_ids, |
77 | | - Port=port, |
78 | | - MajorVersion=major_version, |
| 110 | + service_id=int(service_id), |
| 111 | + events=topic_ids, |
| 112 | + port=port, |
| 113 | + major_version=major_version, |
79 | 114 | ) |
80 | 115 | ) |
81 | 116 | port = port + 1 |
|
0 commit comments