From 6bebe72b9cda877fa6c7d76c5deacea78fc85962 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Thu, 28 Jul 2022 12:18:03 -0700 Subject: [PATCH 1/3] add service event message support Signed-off-by: Brian Chen --- .../resource/_idl_support.c.em | 23 +++++++++++++++++++ rosidl_generator_py/resource/_msg.py.em | 8 +++++++ .../resource/_msg_support.c.em | 7 +++++- rosidl_generator_py/resource/_srv.py.em | 7 ++++++ .../_srv_pkg_typesupport_entry_point.c.em | 9 ++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/rosidl_generator_py/resource/_idl_support.c.em b/rosidl_generator_py/resource/_idl_support.c.em index abb7536e..d46c0228 100644 --- a/rosidl_generator_py/resource/_idl_support.c.em +++ b/rosidl_generator_py/resource/_idl_support.c.em @@ -50,6 +50,13 @@ TEMPLATE( package_name=package_name, interface_path=interface_path, message=service.response_message, include_directives=include_directives) }@ + +@{ +TEMPLATE( + '_msg_support.c.em', + package_name=package_name, interface_path=interface_path, + message=service.event_message, include_directives=include_directives) +}@ @[end for]@ @ @####################################################################### @@ -97,6 +104,14 @@ TEMPLATE( include_directives=include_directives) }@ +@{ +TEMPLATE( + '_msg_support.c.em', + package_name=package_name, interface_path=interface_path, + message=action.send_goal_service.event_message, + include_directives=include_directives) +}@ + @{ TEMPLATE( '_msg_support.c.em', @@ -113,6 +128,14 @@ TEMPLATE( include_directives=include_directives) }@ +@{ +TEMPLATE( + '_msg_support.c.em', + package_name=package_name, interface_path=interface_path, + message=action.get_result_service.event_message, + include_directives=include_directives) +}@ + @{ TEMPLATE( '_msg_support.c.em', diff --git a/rosidl_generator_py/resource/_msg.py.em b/rosidl_generator_py/resource/_msg.py.em index b2cc43d2..9fbe2d86 100644 --- a/rosidl_generator_py/resource/_msg.py.em +++ b/rosidl_generator_py/resource/_msg.py.em @@ -13,6 +13,9 @@ from rosidl_parser.definition import AbstractWString from rosidl_parser.definition import ACTION_FEEDBACK_SUFFIX from rosidl_parser.definition import ACTION_GOAL_SUFFIX from rosidl_parser.definition import ACTION_RESULT_SUFFIX +from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX from rosidl_parser.definition import Array from rosidl_parser.definition import BasicType from rosidl_parser.definition import BOOLEAN_TYPE @@ -129,6 +132,11 @@ for member in message.structure.members: if isinstance(type_, AbstractNestedType): type_ = type_.value_type if isinstance(type_, NamespacedType): + if ( + type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX) or + type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) + ): + continue if ( type_.name.endswith(ACTION_GOAL_SUFFIX) or type_.name.endswith(ACTION_RESULT_SUFFIX) or diff --git a/rosidl_generator_py/resource/_msg_support.c.em b/rosidl_generator_py/resource/_msg_support.c.em index efa53a10..1afdafb6 100644 --- a/rosidl_generator_py/resource/_msg_support.c.em +++ b/rosidl_generator_py/resource/_msg_support.c.em @@ -11,6 +11,8 @@ from rosidl_parser.definition import Array from rosidl_parser.definition import BasicType from rosidl_parser.definition import EMPTY_STRUCTURE_REQUIRED_MEMBER_NAME from rosidl_parser.definition import NamespacedType +from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX def primitive_msg_type_to_c(type_): @@ -119,7 +121,10 @@ if isinstance(member.type, AbstractNestedType) and isinstance(member.type.value_ nested_header = '/'.join(type_[:-1] + ('detail', convert_camel_case_to_lower_case_underscore(type_[-1]),)) nested_header += '__functions.h' }@ -@[ if nested_header in include_directives]@ +@[ if type_[-1].endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or type_[-1].endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX)] +@# Service request/response messages are included in the srv__struct +@[continue] +@[ elif nested_header in include_directives]@ // already included above // @ @[ else]@ diff --git a/rosidl_generator_py/resource/_srv.py.em b/rosidl_generator_py/resource/_srv.py.em index ccd6d90d..24d4548f 100644 --- a/rosidl_generator_py/resource/_srv.py.em +++ b/rosidl_generator_py/resource/_srv.py.em @@ -13,6 +13,10 @@ TEMPLATE( '_msg.py.em', package_name=package_name, interface_path=interface_path, message=service.response_message, import_statements=import_statements) +TEMPLATE( + '_msg.py.em', + package_name=package_name, interface_path=interface_path, + message=service.event_message, import_statements=import_statements) }@ @@ -42,11 +46,14 @@ class Metaclass_@(service.namespaced_type.name)(type): @(module_name).Metaclass_@(service.request_message.structure.namespaced_type.name).__import_type_support__() if @(module_name).Metaclass_@(service.response_message.structure.namespaced_type.name)._TYPE_SUPPORT is None: @(module_name).Metaclass_@(service.response_message.structure.namespaced_type.name).__import_type_support__() + if @(module_name).Metaclass_@(service.event_message.structure.namespaced_type.name)._TYPE_SUPPORT is None: + @(module_name).Metaclass_@(service.event_message.structure.namespaced_type.name).__import_type_support__() class @(service.namespaced_type.name)(metaclass=Metaclass_@(service.namespaced_type.name)): from @('.'.join(service.namespaced_type.namespaces)).@(module_name) import @(service.request_message.structure.namespaced_type.name) as Request from @('.'.join(service.namespaced_type.namespaces)).@(module_name) import @(service.response_message.structure.namespaced_type.name) as Response + from @('.'.join(service.namespaced_type.namespaces)).@(module_name) import @(service.event_message.structure.namespaced_type.name) as Event def __init__(self): raise NotImplementedError('Service classes can not be instantiated') diff --git a/rosidl_generator_py/resource/_srv_pkg_typesupport_entry_point.c.em b/rosidl_generator_py/resource/_srv_pkg_typesupport_entry_point.c.em index e5ab4f18..353b01f1 100644 --- a/rosidl_generator_py/resource/_srv_pkg_typesupport_entry_point.c.em +++ b/rosidl_generator_py/resource/_srv_pkg_typesupport_entry_point.c.em @@ -16,6 +16,15 @@ TEMPLATE( include_directives=include_directives, register_functions=register_functions) }@ + +@{ +TEMPLATE( + '_msg_pkg_typesupport_entry_point.c.em', + package_name=package_name, idl_type=idl_type, + message=service.event_message, typesupport_impl=typesupport_impl, + include_directives=include_directives, + register_functions=register_functions) +}@ @ @{ from rosidl_pycommon import convert_camel_case_to_lower_case_underscore From e5c848e5e834398fa9973e51d1bb42d41567558a Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 8 Aug 2022 11:21:46 -0700 Subject: [PATCH 2/3] import req/response/event msgs for services & action srvs Signed-off-by: Brian Chen --- .../rosidl_generator_py/generate_py_impl.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py b/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py index 87a9f271..35a853dc 100644 --- a/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py +++ b/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py @@ -131,6 +131,35 @@ def print_warning_if_reserved_keyword(member_name, interface_type, interface_nam f.write( f'from {package_name}.{subfolder}.{module_name} import ' f'{idl_stem} # noqa: F401\n') + if subfolder == 'srv': + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_Request # noqa: F401\n') + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_Response # noqa: F401\n') + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_Event # noqa: F401\n') + elif subfolder == 'action': + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_GetResult_Request # noqa: F401\n') + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_GetResult_Response # noqa: F401\n') + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_GetResult_Event # noqa: F401\n') + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_SendGoal_Request # noqa: F401\n') + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_SendGoal_Response # noqa: F401\n') + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_SendGoal_Event # noqa: F401\n') # expand templates per available typesupport implementation template_dir = args['template_dir'] From cd44fa0be4af99b420b81ec3d93c8bd952a1783d Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Thu, 2 Feb 2023 18:50:04 +0000 Subject: [PATCH 3/3] Style cleanups. Signed-off-by: Chris Lalancette --- rosidl_generator_py/resource/_msg.py.em | 2 +- .../rosidl_generator_py/generate_py_impl.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rosidl_generator_py/resource/_msg.py.em b/rosidl_generator_py/resource/_msg.py.em index 9fbe2d86..a5b9cabc 100644 --- a/rosidl_generator_py/resource/_msg.py.em +++ b/rosidl_generator_py/resource/_msg.py.em @@ -133,7 +133,7 @@ for member in message.structure.members: type_ = type_.value_type if isinstance(type_, NamespacedType): if ( - type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX) or + type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX) or type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) ): continue diff --git a/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py b/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py index 35a853dc..0cbaaa10 100644 --- a/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py +++ b/rosidl_generator_py/rosidl_generator_py/generate_py_impl.py @@ -132,16 +132,19 @@ def print_warning_if_reserved_keyword(member_name, interface_type, interface_nam f'from {package_name}.{subfolder}.{module_name} import ' f'{idl_stem} # noqa: F401\n') if subfolder == 'srv': + f.write( + f'from {package_name}.{subfolder}.{module_name} import ' + f'{idl_stem}_Event # noqa: F401\n') f.write( f'from {package_name}.{subfolder}.{module_name} import ' f'{idl_stem}_Request # noqa: F401\n') f.write( f'from {package_name}.{subfolder}.{module_name} import ' f'{idl_stem}_Response # noqa: F401\n') + elif subfolder == 'action': f.write( f'from {package_name}.{subfolder}.{module_name} import ' - f'{idl_stem}_Event # noqa: F401\n') - elif subfolder == 'action': + f'{idl_stem}_GetResult_Event # noqa: F401\n') f.write( f'from {package_name}.{subfolder}.{module_name} import ' f'{idl_stem}_GetResult_Request # noqa: F401\n') @@ -150,16 +153,13 @@ def print_warning_if_reserved_keyword(member_name, interface_type, interface_nam f'{idl_stem}_GetResult_Response # noqa: F401\n') f.write( f'from {package_name}.{subfolder}.{module_name} import ' - f'{idl_stem}_GetResult_Event # noqa: F401\n') + f'{idl_stem}_SendGoal_Event # noqa: F401\n') f.write( f'from {package_name}.{subfolder}.{module_name} import ' f'{idl_stem}_SendGoal_Request # noqa: F401\n') f.write( f'from {package_name}.{subfolder}.{module_name} import ' f'{idl_stem}_SendGoal_Response # noqa: F401\n') - f.write( - f'from {package_name}.{subfolder}.{module_name} import ' - f'{idl_stem}_SendGoal_Event # noqa: F401\n') # expand templates per available typesupport implementation template_dir = args['template_dir']