Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions simulator/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

import os
import sys

from uprotocol_vsomeip import helper
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))

import asyncio
Expand Down Expand Up @@ -62,10 +62,12 @@ def set_transport(selected_utransport):


@socketio.on(constant.API_SET_SOMEIP_CONFIG, namespace=constant.NAMESPACE)
def set_someip_config(localip, multicastip):
def set_someip_config(localip, multicastip,is_someip_serializer_enabled=False):
print(f"set set_someip_config called {localip}, {multicastip}")
someip_helper.someip_entity = someip_helper.temp_someip_entity
someip_helper.temp_someip_entity = []
someip_helper.is_serializer_enabled=is_someip_serializer_enabled
helper.is_serializer_enabled =is_someip_serializer_enabled
transport_config.set_someip_config(localip, multicastip)
tdk_apis.refresh_transport(transport_config)
time.sleep(0.5)
Expand Down Expand Up @@ -152,4 +154,4 @@ def set_reset_flag():

if __name__ == "__main__":
# Run the server
socketio.run(app, allow_unsafe_werkzeug=True, debug=debug)
socketio.run(app, allow_unsafe_werkzeug=True,port=5000, debug=debug)
2 changes: 1 addition & 1 deletion simulator/ui/templates/includes/sidebar.html
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@

<div class="sidebarFooter copyright-content">
<div>
<span>Simulator Version - 0.1.1-dev</span> &nbsp
<span>Simulator Version - 0.1.3-dev</span> &nbsp
</div>
<div>
<u>
Expand Down
18 changes: 13 additions & 5 deletions simulator/ui/utils/socket_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@
)
from tdk.apis.apis import TdkApis
from tdk.core import protobuf_autoloader
from tdk.helper.someip_helper import configure_someip_service
from tdk.helper import someip_helper
from tdk.helper.someip_helper import configure_someip_service, ensure_defaults
from tdk.helper.transport_configuration import TransportConfiguration

logger = logging.getLogger("Simulator")
Expand Down Expand Up @@ -82,12 +83,19 @@ async def execute_send_rpc(self, json_sendrpc):
version = 1

method_uri = protobuf_autoloader.get_rpc_uri_by_name(service_id, methodname, version)
any_obj = any_pb2.Any()
any_obj.Pack(message)
payload_data = any_obj.SerializeToString()
if someip_helper.is_serializer_enabled:
message = ensure_defaults(message)
payload_data = UPayload.serialize_someip(message) # Use SOME/IP serialization
print(f"message after ensure defaults(SOMEIP) {message}")
payload_format = UPayloadFormat.UPAYLOAD_FORMAT_SOMEIP
else:
any_obj = any_pb2.Any()
any_obj.Pack(message)
payload_data = any_obj.SerializeToString()
payload_format = UPayloadFormat.UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY
payload = UPayload(
data=payload_data,
format=UPayloadFormat.UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY,
format=payload_format,
)
method_uri = protobuf_autoloader.get_uuri_from_name(method_uri)

Expand Down
8 changes: 4 additions & 4 deletions simulator/utils/vehicle_service_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"""

try:
from tdk.helper.someip_helper import someip_entity, temp_someip_entity
from tdk.helper import someip_helper
except Exception:
pass

Expand All @@ -36,9 +36,9 @@ def stop_service(name):


def remove_service_from_someip(name):
for index, entity_name in enumerate(temp_someip_entity):
for index, entity_name in enumerate(someip_helper.temp_someip_entity):
if entity_name == name:
temp_someip_entity.pop(index)
someip_helper.temp_someip_entity.pop(index)
stop_service(name)
break

Expand All @@ -59,7 +59,7 @@ def get_all_running_service():

def get_all_configured_someip_service():
configured_service = []
for entity_name in someip_entity:
for entity_name in someip_helper.someip_entity:
configured_service.append(entity_name)
return configured_service

Expand Down
23 changes: 17 additions & 6 deletions tdk/core/abstract_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@

from tdk.apis.apis import TdkApis
from tdk.core import protobuf_autoloader
from tdk.helper import someip_helper
from tdk.helper.someip_helper import SomeipHelper, ensure_defaults
from tdk.helper.transport_configuration import TransportConfiguration
from tdk.utils import service_util
from tdk.utils.constant import REPO_URL
Expand Down Expand Up @@ -95,8 +97,10 @@ def handle_request(message: UMessage):
res = protobuf_autoloader.get_response_class(service_id, method_name)()
req = UPayload.unpack_data_format(payload, attributes.payload_format, req)
response = self(get_instance(service_id), req, res)

payload_res: UPayload = UPayload.pack_to_any(response)
if someip_helper.is_serializer_enabled:
payload_res: UPayload = UPayload.pack_to_someip_serialization(response)
else:
payload_res: UPayload = UPayload.pack_to_any(response)

if get_instance(service_id).portal_callback is not None:
get_instance(service_id).portal_callback(
Expand Down Expand Up @@ -136,10 +140,17 @@ async def start_rpc_service(self) -> bool:
async def publish(self, uri, params={}, is_from_rpc=False):
message_class = protobuf_autoloader.get_request_class_from_topic_uri(uri)
message = protobuf_autoloader.populate_message(self.service, message_class, params)
any_obj = any_pb2.Any()
any_obj.Pack(message)
payload_data = any_obj.SerializeToString()
payload = UPayload(format=UPayloadFormat.UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY, data=payload_data)
if someip_helper.is_serializer_enabled:
message = ensure_defaults(message)
print(f"abstract_service: message after ensure defaults(SOMEIP) {message}")
payload_data = UPayload.serialize_someip(message) # Use SOME/IP serialization
payload_format= UPayloadFormat.UPAYLOAD_FORMAT_SOMEIP
else:
any_obj = any_pb2.Any()
any_obj.Pack(message)
payload_data = any_obj.SerializeToString()
payload_format = UPayloadFormat.UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY
payload = UPayload(format=payload_format, data=payload_data)
source_uri = protobuf_autoloader.get_uuri_from_name(uri)

if "COVESA" not in REPO_URL:
Expand Down
4 changes: 3 additions & 1 deletion tdk/examples/common_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@
def get_transport_config():
"""Set the helper config, one time configuration."""
config = TransportConfiguration()
config.set_zenoh_config("10.0.0.33", 9090) # this will set the zenoh helper
config.set_zenoh_config(None,None) # this will set the zenoh helper

# config.set_zenoh_config("10.0.0.33", 9090) # this will set the zenoh helper
return config


Expand Down
49 changes: 42 additions & 7 deletions tdk/helper/someip_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@
import os
import pathlib
from typing import List
from google.protobuf.descriptor import FieldDescriptor

from tdk.utils.constant import RESOURCE_CATALOG_JSON_NAME

from google.protobuf.message import Message
try:
from uprotocol_vsomeip.vsomeip_utransport import (
VsomeipHelper,
Expand All @@ -28,7 +29,42 @@

someip_entity = []
temp_someip_entity = []
is_serializer_enabled=False

def ensure_defaults(message: Message) -> Message:
"""
Ensures that all fields in a Protobuf message are explicitly set.
This is required for SOME/IP serialization where no fields should be omitted.

:param message: Protobuf message object
:return: Modified message with default values explicitly set
"""
print("Ensuring defaults for:", message)
default_message = message.__class__() # Create a new instance with default values

for field in message.DESCRIPTOR.fields:
field_name = field.name
field_value = getattr(message, field_name, None)

# ✅ Handle nested Protobuf messages (recursively process)
if field.type == FieldDescriptor.TYPE_MESSAGE and field_value is not None:
ensure_defaults(field_value)

# ✅ Handle fields that do not support HasField() (primitive types like int, string, bool)
elif field.label != FieldDescriptor.LABEL_REPEATED: # Not a repeated field
try:
if not message.HasField(field_name): # Only call HasField() if field supports it
setattr(message, field_name, getattr(default_message, field_name)) # Assign default
except ValueError: # Primitive types (int, float, string) don’t support HasField()
if field_value in [None, "", 0, False]: # If unset, assign default
setattr(message, field_name, getattr(default_message, field_name))

# ✅ Handle repeated fields (lists)
elif field.label == FieldDescriptor.LABEL_REPEATED:
if not field_value: # If list is empty, set to default
setattr(message, field_name, getattr(default_message, field_name))
# print(f"Message with all value set: {message}")
return message #

def configure_someip_service(entity_name):
global temp_someip_entity
Expand Down Expand Up @@ -65,17 +101,16 @@ def services_info(self) -> List[VsomeipHelper.UEntityInfo]:
if "type" in node and node["type"] == "topic":
topic_ids.append(int(node["id"]) + 32768)
for property in data["node"]["properties"]:
if property["name"] == "version_major":
if property["name"] == "service_version_major":
major_version = property["value"]
break
if service_name in someip_entity:
entity_info.append(
VsomeipHelper.UEntityInfo(
Name=service_name,
Id=int(service_id),
Events=topic_ids,
Port=port,
MajorVersion=major_version,
service_id=int(service_id),
events=topic_ids,
port=port,
major_version=major_version,
)
)
port = port + 1
Expand Down
6 changes: 3 additions & 3 deletions tdk/helper/transport_configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@

class TransportConfiguration:
def __init__(self):
self.__SOURCE = UUri(authority_name="tdk", ue_id=99999, ue_version_major=1)
self.__SOURCE = UUri(authority_name="tdk", ue_id=99998, ue_version_major=1)
self.__ZENOH_IP = "10.0.0.33"
self.__ZENOH_PORT = 9090
self.__SOMEIP_UNICAST_IP = "127.0.0.1"
self.__SOMEIP_MULTICAST_IP = "224.224.224.245"
self.__transport = self._update_instance("BINDER")
self.__transport = self._update_instance("SOME/IP")

def _update_instance(self, transport_name="BINDER") -> UTransport:
if transport_name == "BINDER":
Expand All @@ -55,7 +55,7 @@ def _update_instance(self, transport_name="BINDER") -> UTransport:
return UPTransportZenoh.new(conf, self.__SOURCE)
elif transport_name == "SOME/IP":
return VsomeipTransport(
source=self.__SOURCE, multicast=(self.__SOMEIP_MULTICAST_IP, 30490), helper=SomeipHelper()
source=self.__SOURCE,unicast=self.__SOMEIP_UNICAST_IP, multicast=(self.__SOMEIP_MULTICAST_IP, 30490), helper=SomeipHelper()
)

def get_transport(self) -> UTransport:
Expand Down
Loading