From fe1f90583c6e2625909918a1ddb84c3ad2979647 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Thu, 21 Jul 2022 11:27:18 -0700 Subject: [PATCH 01/54] add service event message Signed-off-by: Brian Chen --- rosidl_adapter/rosidl_adapter/parser.py | 1 + rosidl_generator_c/resource/idl__functions.c.em | 8 ++++++++ rosidl_generator_c/resource/idl__functions.h.em | 7 +++++++ rosidl_generator_c/resource/idl__struct.h.em | 7 +++++++ rosidl_generator_c/resource/srv__type_support.h.em | 7 +++++++ rosidl_generator_cpp/resource/srv__builder.hpp.em | 7 +++++++ rosidl_generator_cpp/resource/srv__struct.hpp.em | 8 ++++++++ rosidl_generator_cpp/resource/srv__traits.hpp.em | 7 +++++++ rosidl_parser/rosidl_parser/definition.py | 8 +++++++- 9 files changed, 59 insertions(+), 1 deletion(-) diff --git a/rosidl_adapter/rosidl_adapter/parser.py b/rosidl_adapter/rosidl_adapter/parser.py index 41ed6bf20..836a3b751 100644 --- a/rosidl_adapter/rosidl_adapter/parser.py +++ b/rosidl_adapter/rosidl_adapter/parser.py @@ -26,6 +26,7 @@ SERVICE_REQUEST_RESPONSE_SEPARATOR = '---' SERVICE_REQUEST_MESSAGE_SUFFIX = '_Request' SERVICE_RESPONSE_MESSAGE_SUFFIX = '_Response' +SERVICE_EVENT_MESSAGE_SUFFIX = '_Event' ACTION_REQUEST_RESPONSE_SEPARATOR = '---' ACTION_GOAL_SUFFIX = '_Goal' diff --git a/rosidl_generator_c/resource/idl__functions.c.em b/rosidl_generator_c/resource/idl__functions.c.em index 86b75e507..49cd1392e 100644 --- a/rosidl_generator_c/resource/idl__functions.c.em +++ b/rosidl_generator_c/resource/idl__functions.c.em @@ -64,6 +64,14 @@ TEMPLATE( package_name=package_name, interface_path=interface_path, message=service.response_message, include_directives=include_directives) }@ + +@{ +TEMPLATE( + 'msg__functions.c.em', + package_name=package_name, interface_path=interface_path, + message=service.event_message, include_directives=include_directives) +}@ + @[end for]@ @ @####################################################################### diff --git a/rosidl_generator_c/resource/idl__functions.h.em b/rosidl_generator_c/resource/idl__functions.h.em index ef2a933da..90bbc33d8 100644 --- a/rosidl_generator_c/resource/idl__functions.h.em +++ b/rosidl_generator_c/resource/idl__functions.h.em @@ -72,6 +72,13 @@ TEMPLATE( message=service.response_message) }@ +@{ +TEMPLATE( + 'msg__functions.h.em', + package_name=package_name, interface_path=interface_path, + message=service.event_message) +}@ + @[end for]@ @ @####################################################################### diff --git a/rosidl_generator_c/resource/idl__struct.h.em b/rosidl_generator_c/resource/idl__struct.h.em index dca413791..da7d21dc0 100644 --- a/rosidl_generator_c/resource/idl__struct.h.em +++ b/rosidl_generator_c/resource/idl__struct.h.em @@ -69,6 +69,13 @@ TEMPLATE( message=service.response_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__struct.h.em', + package_name=package_name, interface_path=interface_path, + message=service.event_message, include_directives=include_directives) +}@ + @[end for]@ @ @####################################################################### diff --git a/rosidl_generator_c/resource/srv__type_support.h.em b/rosidl_generator_c/resource/srv__type_support.h.em index c6108cb5b..9a2c7e5c6 100644 --- a/rosidl_generator_c/resource/srv__type_support.h.em +++ b/rosidl_generator_c/resource/srv__type_support.h.em @@ -13,6 +13,13 @@ TEMPLATE( include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__type_support.h.em', + package_name=package_name, message=service.event_message, + include_directives=include_directives) +}@ + @{header_file = 'rosidl_runtime_c/service_type_support_struct.h'}@ @[if header_file in include_directives]@ // already included above diff --git a/rosidl_generator_cpp/resource/srv__builder.hpp.em b/rosidl_generator_cpp/resource/srv__builder.hpp.em index feca7be94..40778af04 100644 --- a/rosidl_generator_cpp/resource/srv__builder.hpp.em +++ b/rosidl_generator_cpp/resource/srv__builder.hpp.em @@ -12,3 +12,10 @@ TEMPLATE( package_name=package_name, interface_path=interface_path, message=service.response_message, include_directives=include_directives) }@ + +@{ +TEMPLATE( + 'msg__builder.hpp.em', + package_name=package_name, interface_path=interface_path, + message=service.event_message, include_directives=include_directives) +}@ diff --git a/rosidl_generator_cpp/resource/srv__struct.hpp.em b/rosidl_generator_cpp/resource/srv__struct.hpp.em index 12744269a..1466c9980 100644 --- a/rosidl_generator_cpp/resource/srv__struct.hpp.em +++ b/rosidl_generator_cpp/resource/srv__struct.hpp.em @@ -13,6 +13,13 @@ TEMPLATE( message=service.response_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__struct.hpp.em', + package_name=package_name, interface_path=interface_path, + message=service.event_message, include_directives=include_directives) +}@ + @[for ns in service.namespaced_type.namespaces]@ namespace @(ns) { @@ -26,6 +33,7 @@ service_typename = '::'.join(service.namespaced_type.namespaced_name()) }@ using Request = @(service_typename)_Request; using Response = @(service_typename)_Response; + using Event = @(service_typename)_Event; }; @ @[for ns in reversed(service.namespaced_type.namespaces)]@ diff --git a/rosidl_generator_cpp/resource/srv__traits.hpp.em b/rosidl_generator_cpp/resource/srv__traits.hpp.em index 03326754b..3000565e0 100644 --- a/rosidl_generator_cpp/resource/srv__traits.hpp.em +++ b/rosidl_generator_cpp/resource/srv__traits.hpp.em @@ -13,6 +13,13 @@ TEMPLATE( message=service.response_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__traits.hpp.em', + package_name=package_name, interface_path=interface_path, + message=service.event_message, include_directives=include_directives) +}@ + @{ service_typename = '::'.join(service.namespaced_type.namespaced_name()) service_fully_qualified_name = '/'.join(service.namespaced_type.namespaced_name()) diff --git a/rosidl_parser/rosidl_parser/definition.py b/rosidl_parser/rosidl_parser/definition.py index 20b6f7af8..6119cf7cf 100644 --- a/rosidl_parser/rosidl_parser/definition.py +++ b/rosidl_parser/rosidl_parser/definition.py @@ -91,6 +91,7 @@ SERVICE_REQUEST_MESSAGE_SUFFIX = '_Request' SERVICE_RESPONSE_MESSAGE_SUFFIX = '_Response' +SERVICE_EVENT_MESSAGE_SUFFIX = '_Event' ACTION_GOAL_SUFFIX = '_Goal' ACTION_RESULT_SUFFIX = '_Result' @@ -562,7 +563,7 @@ def __init__(self, structure: Structure): class Service: """A namespaced type containing a request and response message.""" - __slots__ = ('namespaced_type', 'request_message', 'response_message') + __slots__ = ('namespaced_type', 'request_message', 'response_message', 'event_message') def __init__( self, namespaced_type: NamespacedType, request: Message, @@ -595,6 +596,11 @@ def __init__( namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX self.response_message = response + self.event_message = Message(Structure(NamespacedType( + namespaces=namespaced_type.namespaces, + name=f"{namespaced_type.name}{SERVICE_EVENT_MESSAGE_SUFFIX}" + ))) + class Action: """A namespaced type of an action including the derived types.""" From 0b85d8c99467ed39ecf532d721eef4c894ad40cd Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 25 Jul 2022 15:19:19 -0700 Subject: [PATCH 02/54] fix service introspection message compilation issues Signed-off-by: Brian Chen --- .../resource/msg__struct.hpp.em | 7 +++++++ .../resource/msg__traits.hpp.em | 7 +++++++ rosidl_parser/rosidl_parser/definition.py | 21 +++++++++++++++---- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/rosidl_generator_cpp/resource/msg__struct.hpp.em b/rosidl_generator_cpp/resource/msg__struct.hpp.em index 5f8a82c82..b0bcb3c16 100644 --- a/rosidl_generator_cpp/resource/msg__struct.hpp.em +++ b/rosidl_generator_cpp/resource/msg__struct.hpp.em @@ -11,6 +11,8 @@ 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_REQUEST_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX from rosidl_parser.definition import BasicType from rosidl_parser.definition import BOOLEAN_TYPE from rosidl_parser.definition import CHARACTER_TYPES @@ -37,6 +39,11 @@ for member in message.structure.members: if isinstance(type_, AbstractNestedType): type_ = type_.value_type if isinstance(type_, NamespacedType): + if ( + type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or + type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX) + ): + continue if ( type_.name.endswith(ACTION_GOAL_SUFFIX) or type_.name.endswith(ACTION_RESULT_SUFFIX) or diff --git a/rosidl_generator_cpp/resource/msg__traits.hpp.em b/rosidl_generator_cpp/resource/msg__traits.hpp.em index 9fa1923dd..99f1246c1 100644 --- a/rosidl_generator_cpp/resource/msg__traits.hpp.em +++ b/rosidl_generator_cpp/resource/msg__traits.hpp.em @@ -3,6 +3,8 @@ 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_REQUEST_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX from rosidl_parser.definition import Array from rosidl_parser.definition import AbstractGenericString from rosidl_parser.definition import BasicType @@ -28,6 +30,11 @@ for member in message.structure.members: if isinstance(type_, (AbstractSequence, Array)): type_ = type_.value_type if isinstance(type_, NamespacedType): + if ( + type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or + type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX) + ): + continue if ( type_.name.endswith(ACTION_GOAL_SUFFIX) or type_.name.endswith(ACTION_RESULT_SUFFIX) or diff --git a/rosidl_parser/rosidl_parser/definition.py b/rosidl_parser/rosidl_parser/definition.py index 6119cf7cf..13763ea37 100644 --- a/rosidl_parser/rosidl_parser/definition.py +++ b/rosidl_parser/rosidl_parser/definition.py @@ -596,10 +596,23 @@ def __init__( namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX self.response_message = response - self.event_message = Message(Structure(NamespacedType( - namespaces=namespaced_type.namespaces, - name=f"{namespaced_type.name}{SERVICE_EVENT_MESSAGE_SUFFIX}" - ))) + self.event_message = Message( + Structure( + NamespacedType( + namespaces=namespaced_type.namespaces, + name=f'{namespaced_type.name}{SERVICE_EVENT_MESSAGE_SUFFIX}' + ), + members=[ + Member(BasicType('uint8'), 'event_type'), + Member(BasicType('int32'), 'stamp_sec'), + Member(BasicType('uint32'), 'stamp_nsec'), + Member(Array(BasicType('uint8'), 16), 'client_id'), + Member(BasicType('int64'), 'sequence_number'), + Member(request.structure.namespaced_type, 'request'), + Member(response.structure.namespaced_type, 'response'), + ] + ) + ) class Action: From 1e2ba8a77873dfd26fc7ffdd33cbd0713d059404 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Thu, 28 Jul 2022 11:43:41 -0700 Subject: [PATCH 03/54] Add service_msgs to rosidl_cmake Signed-off-by: Brian Chen --- rosidl_cmake/cmake/rosidl_generate_interfaces.cmake | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake index f585d93ee..b565000a9 100644 --- a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake +++ b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake @@ -155,6 +155,18 @@ macro(rosidl_generate_interfaces target) ament_export_dependencies(action_msgs) break() endif() + if("${_parent_dir}" STREQUAL "srv") + find_package(service_msgs QUIET) + if(NOT ${service_msgs_FOUND}) + message(FATAL_ERROR + "Unable to generate service interface for '${_tuple_file}'. " + "In order to generate service interfaces you must add a depend tag " + "for 'service_msgs' in your package.xml.") + endif() + list_append_unique(_ARG_DEPENDENCIES "service_msgs") + ament_export_dependencies(service_msgs) + break() + endif() endforeach() # collect all interface files from dependencies From 45c078fc5a7e67a19d1c2548b73f8b1aa4c55a7e Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Thu, 28 Jul 2022 11:44:12 -0700 Subject: [PATCH 04/54] event_messages for action services Signed-off-by: Brian Chen --- rosidl_generator_c/resource/idl__functions.c.em | 14 ++++++++++++++ rosidl_generator_c/resource/idl__functions.h.em | 14 ++++++++++++++ rosidl_generator_c/resource/idl__struct.h.em | 14 ++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/rosidl_generator_c/resource/idl__functions.c.em b/rosidl_generator_c/resource/idl__functions.c.em index 49cd1392e..48c3b1177 100644 --- a/rosidl_generator_c/resource/idl__functions.c.em +++ b/rosidl_generator_c/resource/idl__functions.c.em @@ -117,6 +117,13 @@ TEMPLATE( message=action.send_goal_service.response_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__functions.c.em', + package_name=package_name, interface_path=interface_path, + message=action.send_goal_service.event_message, include_directives=include_directives) +}@ + @{ TEMPLATE( 'msg__functions.c.em', @@ -131,6 +138,13 @@ TEMPLATE( message=action.get_result_service.response_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__functions.c.em', + package_name=package_name, interface_path=interface_path, + message=action.get_result_service.event_message, include_directives=include_directives) +}@ + @{ TEMPLATE( 'msg__functions.c.em', diff --git a/rosidl_generator_c/resource/idl__functions.h.em b/rosidl_generator_c/resource/idl__functions.h.em index 90bbc33d8..6cf7b18b8 100644 --- a/rosidl_generator_c/resource/idl__functions.h.em +++ b/rosidl_generator_c/resource/idl__functions.h.em @@ -123,6 +123,13 @@ TEMPLATE( message=action.send_goal_service.response_message) }@ +@{ +TEMPLATE( + 'msg__functions.h.em', + package_name=package_name, interface_path=interface_path, + message=action.send_goal_service.event_message) +}@ + @{ TEMPLATE( 'msg__functions.h.em', @@ -137,6 +144,13 @@ TEMPLATE( message=action.get_result_service.response_message) }@ +@{ +TEMPLATE( + 'msg__functions.h.em', + package_name=package_name, interface_path=interface_path, + message=action.get_result_service.event_message) +}@ + @{ TEMPLATE( 'msg__functions.h.em', diff --git a/rosidl_generator_c/resource/idl__struct.h.em b/rosidl_generator_c/resource/idl__struct.h.em index da7d21dc0..94bf39bf4 100644 --- a/rosidl_generator_c/resource/idl__struct.h.em +++ b/rosidl_generator_c/resource/idl__struct.h.em @@ -120,6 +120,13 @@ TEMPLATE( message=action.send_goal_service.response_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__struct.h.em', + package_name=package_name, interface_path=interface_path, + message=action.send_goal_service.event_message, include_directives=include_directives) +}@ + @{ TEMPLATE( 'msg__struct.h.em', @@ -134,6 +141,13 @@ TEMPLATE( message=action.get_result_service.response_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__struct.h.em', + package_name=package_name, interface_path=interface_path, + message=action.get_result_service.event_message, include_directives=include_directives) +}@ + @{ TEMPLATE( 'msg__struct.h.em', From 0f430422f689319281fdccf6143eabde35f42a41 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Thu, 28 Jul 2022 11:44:37 -0700 Subject: [PATCH 05/54] codegen a sequence extending fn Signed-off-by: Brian Chen --- .../resource/msg__functions.c.em | 29 +++++++++++++++++++ .../resource/msg__functions.h.em | 10 +++++++ 2 files changed, 39 insertions(+) diff --git a/rosidl_generator_c/resource/msg__functions.c.em b/rosidl_generator_c/resource/msg__functions.c.em index 0c15b7475..85a7a6ca8 100644 --- a/rosidl_generator_c/resource/msg__functions.c.em +++ b/rosidl_generator_c/resource/msg__functions.c.em @@ -453,6 +453,35 @@ bool return true; } +bool +@(array_typename)__extendn(@(array_typename) * seq, size_t n) { + if (!seq) { + return false; + } + + if (seq->size + n > seq->capacity) { // but this assumes that capacity is the bound! which it doesn't appear to be. + return false; + } + + rcutils_allocator_t allocator = rcutils_get_default_allocator(); + @(message_typename) * data = allocator.reallocate(seq->data, (seq->size + n) * sizeof(@(message_typename)), allocator.state); + if (NULL == data) { + return false; + } + + for (size_t i = seq->size; i < seq->size + n; ++i) { + if (!@(message_typename)__init(&seq->data[i])) { + for (; i-- > seq->size; ) { + @(message_typename)__fini(&seq->data[i]); + } + return false; + } + } + + seq->size = seq->size + n; + return true; +} + bool @(array_typename)__copy( const @(array_typename) * input, diff --git a/rosidl_generator_c/resource/msg__functions.h.em b/rosidl_generator_c/resource/msg__functions.h.em index 15cd8b42e..3d030146f 100644 --- a/rosidl_generator_c/resource/msg__functions.h.em +++ b/rosidl_generator_c/resource/msg__functions.h.em @@ -149,6 +149,16 @@ ROSIDL_GENERATOR_C_PUBLIC_@(package_name) bool @(array_typename)__are_equal(const @(array_typename) * lhs, const @(array_typename) * rhs); + +/// Extend array by n +/** + * + */ +bool +@(array_typename)__extendn(@(array_typename) * seq, size_t n); + + + /// Copy an array of @(interface_path_to_string(interface_path)) messages. /** * This functions performs a deep copy, as opposed to the shallow copy that From 41945b8f2512ca572a90631b5daf1b69118114f7 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Thu, 28 Jul 2022 11:45:32 -0700 Subject: [PATCH 06/54] embed message types into generated service_event msg Signed-off-by: Brian Chen --- rosidl_parser/rosidl_parser/definition.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/rosidl_parser/rosidl_parser/definition.py b/rosidl_parser/rosidl_parser/definition.py index 13763ea37..689b71384 100644 --- a/rosidl_parser/rosidl_parser/definition.py +++ b/rosidl_parser/rosidl_parser/definition.py @@ -603,13 +603,9 @@ def __init__( name=f'{namespaced_type.name}{SERVICE_EVENT_MESSAGE_SUFFIX}' ), members=[ - Member(BasicType('uint8'), 'event_type'), - Member(BasicType('int32'), 'stamp_sec'), - Member(BasicType('uint32'), 'stamp_nsec'), - Member(Array(BasicType('uint8'), 16), 'client_id'), - Member(BasicType('int64'), 'sequence_number'), - Member(request.structure.namespaced_type, 'request'), - Member(response.structure.namespaced_type, 'response'), + Member(NamespacedType(['service_msgs', 'msg'], 'ServiceEventInfo'), 'info'), + Member(BoundedSequence(request.structure.namespaced_type, 1), 'request'), + Member(BoundedSequence(response.structure.namespaced_type, 1), 'response'), ] ) ) From b7d9b99679a345a6f90fabcd383db3be71757470 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Thu, 28 Jul 2022 11:46:25 -0700 Subject: [PATCH 07/54] add handles to creating/finalizing introspection messages to service_introspection_info_t Signed-off-by: Brian Chen --- .../service_type_support_struct.h | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index 368c94f03..a756d2b56 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -15,9 +15,11 @@ #ifndef ROSIDL_RUNTIME_C__SERVICE_TYPE_SUPPORT_STRUCT_H_ #define ROSIDL_RUNTIME_C__SERVICE_TYPE_SUPPORT_STRUCT_H_ +#include "rosidl_runtime_c/message_type_support_struct.h" #include "rosidl_runtime_c/visibility_control.h" #include "rosidl_typesupport_interface/macros.h" +#include "stdint.h" #ifdef __cplusplus extern "C" @@ -29,6 +31,27 @@ typedef struct rosidl_service_type_support_t rosidl_service_type_support_t; typedef const rosidl_service_type_support_t * (* rosidl_service_typesupport_handle_function)( const rosidl_service_type_support_t *, const char *); +typedef struct rosidl_service_introspection_info_s { + uint8_t event_type; + int32_t stamp_sec; + uint32_t stamp_nanosec; + uint32_t client_id[16]; + int64_t sequence_number; +} rosidl_service_introspection_info_t; + +/// Fills in a service introspection request or response message +/** + * + * + */ +typedef void * (* rosidl_service_introspection_message_create_handle)( + const rosidl_service_introspection_info_t * info, + void * request_message, + void * response_message); + +typedef void (* rosidl_service_introspection_message_fini_handle)( + void * event_message); + /// Contains rosidl service type support data struct rosidl_service_type_support_t { @@ -38,6 +61,12 @@ struct rosidl_service_type_support_t const void * data; /// Pointer to the service type support handler function rosidl_service_typesupport_handle_function func; + /// Pointer to function to create the introspection message + rosidl_service_introspection_message_create_handle introspection_message_create_handle; + /// Pointer to function to finalize the introspection message + rosidl_service_introspection_message_fini_handle introspection_message_fini_handle; + /// Service event message typesupport + const rosidl_message_type_support_t * event_typesupport; }; /// Get the service type support handle specific to this identifier. From a076ffe404be7d0556e83088ea3b90bc0861bd95 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 8 Aug 2022 11:01:32 -0700 Subject: [PATCH 08/54] remote __extendn msg__function Signed-off-by: Brian Chen --- .../resource/msg__functions.c.em | 29 ------------------- .../resource/msg__functions.h.em | 10 ------- 2 files changed, 39 deletions(-) diff --git a/rosidl_generator_c/resource/msg__functions.c.em b/rosidl_generator_c/resource/msg__functions.c.em index 85a7a6ca8..0c15b7475 100644 --- a/rosidl_generator_c/resource/msg__functions.c.em +++ b/rosidl_generator_c/resource/msg__functions.c.em @@ -453,35 +453,6 @@ bool return true; } -bool -@(array_typename)__extendn(@(array_typename) * seq, size_t n) { - if (!seq) { - return false; - } - - if (seq->size + n > seq->capacity) { // but this assumes that capacity is the bound! which it doesn't appear to be. - return false; - } - - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - @(message_typename) * data = allocator.reallocate(seq->data, (seq->size + n) * sizeof(@(message_typename)), allocator.state); - if (NULL == data) { - return false; - } - - for (size_t i = seq->size; i < seq->size + n; ++i) { - if (!@(message_typename)__init(&seq->data[i])) { - for (; i-- > seq->size; ) { - @(message_typename)__fini(&seq->data[i]); - } - return false; - } - } - - seq->size = seq->size + n; - return true; -} - bool @(array_typename)__copy( const @(array_typename) * input, diff --git a/rosidl_generator_c/resource/msg__functions.h.em b/rosidl_generator_c/resource/msg__functions.h.em index 3d030146f..15cd8b42e 100644 --- a/rosidl_generator_c/resource/msg__functions.h.em +++ b/rosidl_generator_c/resource/msg__functions.h.em @@ -149,16 +149,6 @@ ROSIDL_GENERATOR_C_PUBLIC_@(package_name) bool @(array_typename)__are_equal(const @(array_typename) * lhs, const @(array_typename) * rhs); - -/// Extend array by n -/** - * - */ -bool -@(array_typename)__extendn(@(array_typename) * seq, size_t n); - - - /// Copy an array of @(interface_path_to_string(interface_path)) messages. /** * This functions performs a deep copy, as opposed to the shallow copy that From d2d2da9ca7f49bcfb965c9c05847fc7a4c3707de Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 8 Aug 2022 11:02:07 -0700 Subject: [PATCH 09/54] introspection ts for service event messages Signed-off-by: Brian Chen --- .../service_introspection.h | 2 ++ ...v__rosidl_typesupport_introspection_c.h.em | 7 ++++++ .../resource/srv__type_support.c.em | 20 +++++++++++++++- .../service_introspection.hpp | 2 ++ .../resource/srv__type_support.cpp.em | 23 +++++++++++++++++-- 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/rosidl_typesupport_introspection_c/include/rosidl_typesupport_introspection_c/service_introspection.h b/rosidl_typesupport_introspection_c/include/rosidl_typesupport_introspection_c/service_introspection.h index 059ab00fc..ea57dffd6 100644 --- a/rosidl_typesupport_introspection_c/include/rosidl_typesupport_introspection_c/service_introspection.h +++ b/rosidl_typesupport_introspection_c/include/rosidl_typesupport_introspection_c/service_introspection.h @@ -36,6 +36,8 @@ typedef struct rosidl_typesupport_introspection_c__ServiceMembers_s const rosidl_typesupport_introspection_c__MessageMembers * request_members_; /// A pointer to the introspection information structure for the response interface. const rosidl_typesupport_introspection_c__MessageMembers * response_members_; + /// A pointer to the introspection information structure for the event interface. + const rosidl_typesupport_introspection_c__MessageMembers * event_members_; } rosidl_typesupport_introspection_c__ServiceMembers; #endif // ROSIDL_TYPESUPPORT_INTROSPECTION_C__SERVICE_INTROSPECTION_H_ diff --git a/rosidl_typesupport_introspection_c/resource/srv__rosidl_typesupport_introspection_c.h.em b/rosidl_typesupport_introspection_c/resource/srv__rosidl_typesupport_introspection_c.h.em index 360ea1f7e..c686b8aea 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__rosidl_typesupport_introspection_c.h.em +++ b/rosidl_typesupport_introspection_c/resource/srv__rosidl_typesupport_introspection_c.h.em @@ -13,6 +13,13 @@ TEMPLATE( include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__rosidl_typesupport_introspection_c.h.em', + package_name=package_name, interface_path=interface_path, message=service.event_message, + include_directives=include_directives) +}@ + @{ header_files = [ 'rosidl_runtime_c/service_type_support_struct.h', diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 3922e5830..105b4515f 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -13,6 +13,13 @@ TEMPLATE( include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__type_support.c.em', + package_name=package_name, interface_path=interface_path, message=service.event_message, + include_directives=include_directives) +}@ + @{ from rosidl_pycommon import convert_camel_case_to_lower_case_underscore include_parts = [package_name] + list(interface_path.parents[0].parts) + [ @@ -46,7 +53,9 @@ static rosidl_typesupport_introspection_c__ServiceMembers @(function_prefix)__@( // these two fields are initialized below on the first access NULL, // request message // @(function_prefix)__@(service.request_message.structure.namespaced_type.name)_message_type_support_handle, - NULL // response message + NULL, // response message + // @(function_prefix)__@(service.response_message.structure.namespaced_type.name)_message_type_support_handle + NULL // event_message // @(function_prefix)__@(service.response_message.structure.namespaced_type.name)_message_type_support_handle }; @@ -56,6 +65,7 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty get_service_typesupport_handle_function, }; +// TODO(ihasdapie): Use postfixes from rosidl_parser.definition // Forward declaration of request/response type support functions const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Request)(); @@ -63,6 +73,9 @@ ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspecti const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Response)(); +const rosidl_message_type_support_t * +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Event)(); + ROSIDL_TYPESUPPORT_INTROSPECTION_C_EXPORT_@(package_name) const rosidl_service_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name))() { @@ -83,6 +96,11 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspecti (const rosidl_typesupport_introspection_c__MessageMembers *) ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Response)()->data; } + if (!service_members->response_members_) { + service_members->response_members_ = + (const rosidl_typesupport_introspection_c__MessageMembers *) + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Event)()->data; + } return &@(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle; } diff --git a/rosidl_typesupport_introspection_cpp/include/rosidl_typesupport_introspection_cpp/service_introspection.hpp b/rosidl_typesupport_introspection_cpp/include/rosidl_typesupport_introspection_cpp/service_introspection.hpp index df6f910d8..cad7e04e8 100644 --- a/rosidl_typesupport_introspection_cpp/include/rosidl_typesupport_introspection_cpp/service_introspection.hpp +++ b/rosidl_typesupport_introspection_cpp/include/rosidl_typesupport_introspection_cpp/service_introspection.hpp @@ -39,6 +39,8 @@ typedef struct ServiceMembers_s const MessageMembers * request_members_; /// A pointer to the introspection information structure for the response interface. const MessageMembers * response_members_; + /// A pointer to the introspection information structure for the event interface. + const MessageMembers * event_members_; } ServiceMembers; } // namespace rosidl_typesupport_introspection_cpp diff --git a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em index 0e2883e1d..a96a2ea79 100644 --- a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em @@ -13,6 +13,13 @@ TEMPLATE( include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, message=service.event_message, + include_directives=include_directives) +}@ + @{ from rosidl_pycommon import convert_camel_case_to_lower_case_underscore include_parts = [package_name] + list(interface_path.parents[0].parts) + [ @@ -57,7 +64,8 @@ static ::rosidl_typesupport_introspection_cpp::ServiceMembers @(service.namespac // these two fields are initialized below on the first access // see get_service_type_support_handle<@('::'.join([package_name] + list(interface_path.parents[0].parts) + [service.namespaced_type.name]))>() nullptr, // request message - nullptr // response message + nullptr, // response message + nullptr, // event message }; static const rosidl_service_type_support_t @(service.namespaced_type.name)_service_type_support_handle = { @@ -92,7 +100,9 @@ get_service_type_support_handle<@('::'.join([package_name] + list(interface_path // if they are not, initialize them if ( service_members->request_members_ == nullptr || - service_members->response_members_ == nullptr) + service_members->response_members_ == nullptr || + service_members->event_members_ == nullptr + ) { // initialize the request_members_ with the static function from the external library service_members->request_members_ = static_cast< @@ -110,6 +120,15 @@ get_service_type_support_handle<@('::'.join([package_name] + list(interface_path ::@('::'.join([package_name] + list(interface_path.parents[0].parts)))::@(service.response_message.structure.namespaced_type.name) >()->data ); + + // initialize the event_members_ with the static function from the external library + service_members->event_members_ = static_cast< + const ::rosidl_typesupport_introspection_cpp::MessageMembers * + >( + ::rosidl_typesupport_introspection_cpp::get_message_type_support_handle< + ::@('::'.join([package_name] + list(interface_path.parents[0].parts)))::@(service.event_message.structure.namespaced_type.name) + >()->data + ); } // finally return the properly initialized service_type_support handle return service_type_support; From 90e498a25efb8916ff7080ec701c1f002271e445 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 8 Aug 2022 11:03:53 -0700 Subject: [PATCH 10/54] turn on/off enabling message payload Signed-off-by: Brian Chen --- .../service_type_support_struct.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index a756d2b56..8f5ce9649 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -15,6 +15,7 @@ #ifndef ROSIDL_RUNTIME_C__SERVICE_TYPE_SUPPORT_STRUCT_H_ #define ROSIDL_RUNTIME_C__SERVICE_TYPE_SUPPORT_STRUCT_H_ +#include "rcutils/allocator.h" #include "rosidl_runtime_c/message_type_support_struct.h" #include "rosidl_runtime_c/visibility_control.h" @@ -28,6 +29,7 @@ extern "C" typedef struct rosidl_service_type_support_t rosidl_service_type_support_t; +// TODO(ihasdapie): Some documentation for this fn would be nice typedef const rosidl_service_type_support_t * (* rosidl_service_typesupport_handle_function)( const rosidl_service_type_support_t *, const char *); @@ -41,16 +43,19 @@ typedef struct rosidl_service_introspection_info_s { /// Fills in a service introspection request or response message /** - * + * - Returns NULL ptr if fail * */ typedef void * (* rosidl_service_introspection_message_create_handle)( const rosidl_service_introspection_info_t * info, + rcutils_allocator_t * allocator, void * request_message, - void * response_message); + void * response_message, + bool enable_message_payload); -typedef void (* rosidl_service_introspection_message_fini_handle)( - void * event_message); +typedef bool (* rosidl_service_introspection_message_destroy_handle)( + void * event_message, + rcutils_allocator_t * allocator); /// Contains rosidl service type support data struct rosidl_service_type_support_t @@ -64,7 +69,7 @@ struct rosidl_service_type_support_t /// Pointer to function to create the introspection message rosidl_service_introspection_message_create_handle introspection_message_create_handle; /// Pointer to function to finalize the introspection message - rosidl_service_introspection_message_fini_handle introspection_message_fini_handle; + rosidl_service_introspection_message_destroy_handle introspection_message_destroy_handle; /// Service event message typesupport const rosidl_message_type_support_t * event_typesupport; }; From a8c14413ecc831672014b5dd776ca6ec37014665 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 8 Aug 2022 11:04:36 -0700 Subject: [PATCH 11/54] add service_msgs to action_msgs cmake macro Signed-off-by: Brian Chen --- rosidl_cmake/cmake/rosidl_generate_interfaces.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake index b565000a9..f4cfb7ae8 100644 --- a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake +++ b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake @@ -145,6 +145,7 @@ macro(rosidl_generate_interfaces target) get_filename_component(_parent_dir "${_tuple_file}" DIRECTORY) if("${_parent_dir}" STREQUAL "action") find_package(action_msgs QUIET) + find_package(service_msgs QUIET) if(NOT ${action_msgs_FOUND}) message(FATAL_ERROR "Unable to generate action interface for '${_tuple_file}'. " From 610bbf1c846c63c7db282e440c65d000894bd36b Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Mon, 1 Aug 2022 14:31:45 -0700 Subject: [PATCH 12/54] Move common Python functions into new package Deprecate the Python module in rosidl_cmake and move the implementation to the new package rosidl_pycommon. This works towards removing a dependency on rosidl_cmake in generator packages. Signed-off-by: Jacob Perron --- rosidl_cmake/rosidl_cmake/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/rosidl_cmake/rosidl_cmake/__init__.py b/rosidl_cmake/rosidl_cmake/__init__.py index 3dccb6d86..423b6b2c5 100644 --- a/rosidl_cmake/rosidl_cmake/__init__.py +++ b/rosidl_cmake/rosidl_cmake/__init__.py @@ -13,9 +13,7 @@ # limitations under the License. import warnings - from rosidl_pycommon import * # noqa: F401, F403 - warnings.warn( "The 'rosidl_cmake' Python module is deprecated. Use 'rosidl_pycommon' instead.", UserWarning From b7db73918e3f44cafd1e7ebbf46b79ddfde39be1 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Tue, 2 Aug 2022 12:01:25 -0700 Subject: [PATCH 13/54] Lint Signed-off-by: Jacob Perron --- rosidl_cmake/rosidl_cmake/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rosidl_cmake/rosidl_cmake/__init__.py b/rosidl_cmake/rosidl_cmake/__init__.py index 423b6b2c5..3dccb6d86 100644 --- a/rosidl_cmake/rosidl_cmake/__init__.py +++ b/rosidl_cmake/rosidl_cmake/__init__.py @@ -13,7 +13,9 @@ # limitations under the License. import warnings + from rosidl_pycommon import * # noqa: F401, F403 + warnings.warn( "The 'rosidl_cmake' Python module is deprecated. Use 'rosidl_pycommon' instead.", UserWarning From dccf0a155dcf3466978a4d0cace6f83ddbda7d5d Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Tue, 9 Aug 2022 11:06:02 -0700 Subject: [PATCH 14/54] fix find_package-ing for packages defining services and actions Signed-off-by: Brian Chen --- .../cmake/rosidl_generate_interfaces.cmake | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake index f4cfb7ae8..c62c29c0b 100644 --- a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake +++ b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake @@ -139,24 +139,43 @@ macro(rosidl_generate_interfaces target) # afterwards all remaining interface files are .idl files list(APPEND _idl_tuples ${_idl_adapter_tuples}) - # to generate action interfaces, we need to depend on "action_msgs" + set(_service_msgs_added FALSE) + set(_action_msgs_added FALSE) foreach(_tuple ${_interface_tuples}) string(REGEX REPLACE ".*:([^:]*)$" "\\1" _tuple_file "${_tuple}") get_filename_component(_parent_dir "${_tuple_file}" DIRECTORY) - if("${_parent_dir}" STREQUAL "action") - find_package(action_msgs QUIET) + + if("${_parent_dir}" STREQUAL "action" AND NOT _action_msgs_added) + list_append_unique(_ARG_DEPENDENCIES "action_msgs") + list_append_unique(_ARG_DEPENDENCIES "service_msgs") + ament_export_dependencies(action_msgs) + ament_export_dependencies(service_msgs) + set(_action_msgs_added TRUE) + break() + elseif("${_parent_dir}" STREQUAL "srv" AND NOT _service_msgs_added) + list_append_unique(_ARG_DEPENDENCIES "service_msgs") + ament_export_dependencies(service_msgs) + set(_service_msgs_added TRUE) + endif() + + if("${_parent_dir}" STREQUAL "action" AND NOT DEFINED action_msgs_FOUND) find_package(service_msgs QUIET) + find_package(action_msgs QUIET) if(NOT ${action_msgs_FOUND}) message(FATAL_ERROR "Unable to generate action interface for '${_tuple_file}'. " "In order to generate action interfaces you must add a depend tag " "for 'action_msgs' in your package.xml.") endif() - list_append_unique(_ARG_DEPENDENCIES "action_msgs") ament_export_dependencies(action_msgs) + ament_export_dependencies(service_msgs) + list_append_unique(_ARG_DEPENDENCIES "action_msgs") + list_append_unique(_ARG_DEPENDENCIES "service_msgs") + set(_action_msgs_added TRUE) break() endif() - if("${_parent_dir}" STREQUAL "srv") + + if("${_parent_dir}" STREQUAL "srv" AND NOT DEFINED service_msgs_FOUND) find_package(service_msgs QUIET) if(NOT ${service_msgs_FOUND}) message(FATAL_ERROR @@ -164,9 +183,9 @@ macro(rosidl_generate_interfaces target) "In order to generate service interfaces you must add a depend tag " "for 'service_msgs' in your package.xml.") endif() - list_append_unique(_ARG_DEPENDENCIES "service_msgs") ament_export_dependencies(service_msgs) - break() + list_append_unique(_ARG_DEPENDENCIES "service_msgs") + set(_service_msgs_added TRUE) endif() endforeach() From 957f0a986f448f3220decbde97623fbe76ed7628 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Wed, 10 Aug 2022 16:15:58 -0700 Subject: [PATCH 15/54] use postfixes from rosidl_parser.definition and add some docs Signed-off-by: Brian Chen --- .../service_type_support_struct.h | 23 +++++++++++++++---- .../resource/srv__type_support.c.em | 16 +++++++------ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index 8f5ce9649..07a47c0f2 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -29,7 +29,6 @@ extern "C" typedef struct rosidl_service_type_support_t rosidl_service_type_support_t; -// TODO(ihasdapie): Some documentation for this fn would be nice typedef const rosidl_service_type_support_t * (* rosidl_service_typesupport_handle_function)( const rosidl_service_type_support_t *, const char *); @@ -41,11 +40,19 @@ typedef struct rosidl_service_introspection_info_s { int64_t sequence_number; } rosidl_service_introspection_info_t; -/// Fills in a service introspection request or response message +/// Creates a ServiceEvent message for the service. /** - * - Returns NULL ptr if fail + * Instantiates a ServiceEvent message with the given info and request/response message. + * The message is allocated using the given allocator and must be deallocated using + * the rosidl_service_introspection_destroy_handle * - */ + * \param[in] POD fields of service_msgs/msg/ServiceEventInfo to be passed from rcl + * \param[in] allocator The allocator to use for allocating the ServiceEvent message + * \param[in] request_message type-erased handle to request message from rcl. Can be NULL. + * \param[in] response_message type-erased handle to request message from rcl. Can be NULL. + * \param[in] enable_message_payload Whether to enable message payloads in the ServiceEvent message + * \return The built ServiceEvent message. Will return NULL if the message could not be built. + **/ typedef void * (* rosidl_service_introspection_message_create_handle)( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, @@ -53,6 +60,14 @@ typedef void * (* rosidl_service_introspection_message_create_handle)( void * response_message, bool enable_message_payload); +/// Destroys a ServiceEvent message +/** + * Destroys a ServiceEvent message returned by a rosidl_service_introspection_message_create_handle + * by calling the corresponding __fini function then deallocating + * + * \param[in] event_message The message to destroy. + * \param[in] allocator The allocator to use for deallocating the message. + */ typedef bool (* rosidl_service_introspection_message_destroy_handle)( void * event_message, rcutils_allocator_t * allocator); diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 105b4515f..778f54cea 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -22,6 +22,9 @@ TEMPLATE( @{ from rosidl_pycommon import convert_camel_case_to_lower_case_underscore +from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX include_parts = [package_name] + list(interface_path.parents[0].parts) + [ 'detail', convert_camel_case_to_lower_case_underscore(interface_path.stem)] include_base = '/'.join(include_parts) @@ -65,16 +68,15 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty get_service_typesupport_handle_function, }; -// TODO(ihasdapie): Use postfixes from rosidl_parser.definition // Forward declaration of request/response type support functions const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Request)(); +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_REQUEST_MESSAGE_SUFFIX)(); const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Response)(); +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX)(); const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Event)(); +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX)(); ROSIDL_TYPESUPPORT_INTROSPECTION_C_EXPORT_@(package_name) const rosidl_service_type_support_t * @@ -89,17 +91,17 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspecti if (!service_members->request_members_) { service_members->request_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *) - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Request)()->data; + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_REQUEST_MESSAGE_SUFFIX)()->data; } if (!service_members->response_members_) { service_members->response_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *) - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Response)()->data; + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX)()->data; } if (!service_members->response_members_) { service_members->response_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *) - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Event)()->data; + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX)()->data; } return &@(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle; From 9743d97535177f92f59ce77417bd88dcc6d8b06d Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Wed, 10 Aug 2022 16:22:25 -0700 Subject: [PATCH 16/54] missing bracket Signed-off-by: Brian Chen --- .../resource/srv__type_support.c.em | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 778f54cea..317b8b6ab 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -70,13 +70,13 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty // Forward declaration of request/response type support functions const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_REQUEST_MESSAGE_SUFFIX)(); +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_REQUEST_MESSAGE_SUFFIX))(); const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX)(); +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX))(); const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX)(); +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX))(); ROSIDL_TYPESUPPORT_INTROSPECTION_C_EXPORT_@(package_name) const rosidl_service_type_support_t * @@ -91,17 +91,17 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspecti if (!service_members->request_members_) { service_members->request_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *) - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_REQUEST_MESSAGE_SUFFIX)()->data; + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_REQUEST_MESSAGE_SUFFIX))()->data; } if (!service_members->response_members_) { service_members->response_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *) - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX)()->data; + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX))()->data; } if (!service_members->response_members_) { service_members->response_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *) - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX)()->data; + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX))()->data; } return &@(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle; From a4925f27a2c2dcfade78a44b709de41123bb651c Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Thu, 28 Jul 2022 11:44:12 -0700 Subject: [PATCH 17/54] event_messages for action services Signed-off-by: Brian Chen --- rosidl_generator_c/resource/idl__functions.c.em | 14 ++++++++++++++ rosidl_generator_c/resource/idl__functions.h.em | 14 ++++++++++++++ rosidl_generator_c/resource/idl__struct.h.em | 14 ++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/rosidl_generator_c/resource/idl__functions.c.em b/rosidl_generator_c/resource/idl__functions.c.em index 48c3b1177..cdec86531 100644 --- a/rosidl_generator_c/resource/idl__functions.c.em +++ b/rosidl_generator_c/resource/idl__functions.c.em @@ -124,6 +124,13 @@ TEMPLATE( message=action.send_goal_service.event_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__functions.c.em', + package_name=package_name, interface_path=interface_path, + message=action.send_goal_service.event_message, include_directives=include_directives) +}@ + @{ TEMPLATE( 'msg__functions.c.em', @@ -145,6 +152,13 @@ TEMPLATE( message=action.get_result_service.event_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__functions.c.em', + package_name=package_name, interface_path=interface_path, + message=action.get_result_service.event_message, include_directives=include_directives) +}@ + @{ TEMPLATE( 'msg__functions.c.em', diff --git a/rosidl_generator_c/resource/idl__functions.h.em b/rosidl_generator_c/resource/idl__functions.h.em index 6cf7b18b8..b144c70a3 100644 --- a/rosidl_generator_c/resource/idl__functions.h.em +++ b/rosidl_generator_c/resource/idl__functions.h.em @@ -130,6 +130,13 @@ TEMPLATE( message=action.send_goal_service.event_message) }@ +@{ +TEMPLATE( + 'msg__functions.h.em', + package_name=package_name, interface_path=interface_path, + message=action.send_goal_service.event_message) +}@ + @{ TEMPLATE( 'msg__functions.h.em', @@ -151,6 +158,13 @@ TEMPLATE( message=action.get_result_service.event_message) }@ +@{ +TEMPLATE( + 'msg__functions.h.em', + package_name=package_name, interface_path=interface_path, + message=action.get_result_service.event_message) +}@ + @{ TEMPLATE( 'msg__functions.h.em', diff --git a/rosidl_generator_c/resource/idl__struct.h.em b/rosidl_generator_c/resource/idl__struct.h.em index 94bf39bf4..7634f9028 100644 --- a/rosidl_generator_c/resource/idl__struct.h.em +++ b/rosidl_generator_c/resource/idl__struct.h.em @@ -127,6 +127,13 @@ TEMPLATE( message=action.send_goal_service.event_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__struct.h.em', + package_name=package_name, interface_path=interface_path, + message=action.send_goal_service.event_message, include_directives=include_directives) +}@ + @{ TEMPLATE( 'msg__struct.h.em', @@ -148,6 +155,13 @@ TEMPLATE( message=action.get_result_service.event_message, include_directives=include_directives) }@ +@{ +TEMPLATE( + 'msg__struct.h.em', + package_name=package_name, interface_path=interface_path, + message=action.get_result_service.event_message, include_directives=include_directives) +}@ + @{ TEMPLATE( 'msg__struct.h.em', From f6820555186465c7c2dfc20f8f824303dbf11751 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Thu, 28 Jul 2022 11:44:37 -0700 Subject: [PATCH 18/54] codegen a sequence extending fn Signed-off-by: Brian Chen --- .../resource/msg__functions.c.em | 29 +++++++++++++++++++ .../resource/msg__functions.h.em | 10 +++++++ 2 files changed, 39 insertions(+) diff --git a/rosidl_generator_c/resource/msg__functions.c.em b/rosidl_generator_c/resource/msg__functions.c.em index 0c15b7475..85a7a6ca8 100644 --- a/rosidl_generator_c/resource/msg__functions.c.em +++ b/rosidl_generator_c/resource/msg__functions.c.em @@ -453,6 +453,35 @@ bool return true; } +bool +@(array_typename)__extendn(@(array_typename) * seq, size_t n) { + if (!seq) { + return false; + } + + if (seq->size + n > seq->capacity) { // but this assumes that capacity is the bound! which it doesn't appear to be. + return false; + } + + rcutils_allocator_t allocator = rcutils_get_default_allocator(); + @(message_typename) * data = allocator.reallocate(seq->data, (seq->size + n) * sizeof(@(message_typename)), allocator.state); + if (NULL == data) { + return false; + } + + for (size_t i = seq->size; i < seq->size + n; ++i) { + if (!@(message_typename)__init(&seq->data[i])) { + for (; i-- > seq->size; ) { + @(message_typename)__fini(&seq->data[i]); + } + return false; + } + } + + seq->size = seq->size + n; + return true; +} + bool @(array_typename)__copy( const @(array_typename) * input, diff --git a/rosidl_generator_c/resource/msg__functions.h.em b/rosidl_generator_c/resource/msg__functions.h.em index 15cd8b42e..3d030146f 100644 --- a/rosidl_generator_c/resource/msg__functions.h.em +++ b/rosidl_generator_c/resource/msg__functions.h.em @@ -149,6 +149,16 @@ ROSIDL_GENERATOR_C_PUBLIC_@(package_name) bool @(array_typename)__are_equal(const @(array_typename) * lhs, const @(array_typename) * rhs); + +/// Extend array by n +/** + * + */ +bool +@(array_typename)__extendn(@(array_typename) * seq, size_t n); + + + /// Copy an array of @(interface_path_to_string(interface_path)) messages. /** * This functions performs a deep copy, as opposed to the shallow copy that From 4d474247f5c71860016ab43ca706ccc368b6810d Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 8 Aug 2022 11:01:32 -0700 Subject: [PATCH 19/54] remote __extendn msg__function Signed-off-by: Brian Chen --- .../resource/msg__functions.c.em | 29 ------------------- .../resource/msg__functions.h.em | 10 ------- 2 files changed, 39 deletions(-) diff --git a/rosidl_generator_c/resource/msg__functions.c.em b/rosidl_generator_c/resource/msg__functions.c.em index 85a7a6ca8..0c15b7475 100644 --- a/rosidl_generator_c/resource/msg__functions.c.em +++ b/rosidl_generator_c/resource/msg__functions.c.em @@ -453,35 +453,6 @@ bool return true; } -bool -@(array_typename)__extendn(@(array_typename) * seq, size_t n) { - if (!seq) { - return false; - } - - if (seq->size + n > seq->capacity) { // but this assumes that capacity is the bound! which it doesn't appear to be. - return false; - } - - rcutils_allocator_t allocator = rcutils_get_default_allocator(); - @(message_typename) * data = allocator.reallocate(seq->data, (seq->size + n) * sizeof(@(message_typename)), allocator.state); - if (NULL == data) { - return false; - } - - for (size_t i = seq->size; i < seq->size + n; ++i) { - if (!@(message_typename)__init(&seq->data[i])) { - for (; i-- > seq->size; ) { - @(message_typename)__fini(&seq->data[i]); - } - return false; - } - } - - seq->size = seq->size + n; - return true; -} - bool @(array_typename)__copy( const @(array_typename) * input, diff --git a/rosidl_generator_c/resource/msg__functions.h.em b/rosidl_generator_c/resource/msg__functions.h.em index 3d030146f..15cd8b42e 100644 --- a/rosidl_generator_c/resource/msg__functions.h.em +++ b/rosidl_generator_c/resource/msg__functions.h.em @@ -149,16 +149,6 @@ ROSIDL_GENERATOR_C_PUBLIC_@(package_name) bool @(array_typename)__are_equal(const @(array_typename) * lhs, const @(array_typename) * rhs); - -/// Extend array by n -/** - * - */ -bool -@(array_typename)__extendn(@(array_typename) * seq, size_t n); - - - /// Copy an array of @(interface_path_to_string(interface_path)) messages. /** * This functions performs a deep copy, as opposed to the shallow copy that From ba1ec5114d9d5a6f1c4f7d63619225f3bb82f9b8 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 8 Aug 2022 11:02:07 -0700 Subject: [PATCH 20/54] introspection ts for service event messages Signed-off-by: Brian Chen --- .../resource/srv__type_support.c.em | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 317b8b6ab..5269a886f 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -68,6 +68,7 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty get_service_typesupport_handle_function, }; +// TODO(ihasdapie): Use postfixes from rosidl_parser.definition // Forward declaration of request/response type support functions const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_REQUEST_MESSAGE_SUFFIX))(); @@ -78,6 +79,9 @@ ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspecti const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX))(); +const rosidl_message_type_support_t * +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Event)(); + ROSIDL_TYPESUPPORT_INTROSPECTION_C_EXPORT_@(package_name) const rosidl_service_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name))() { @@ -103,6 +107,11 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspecti (const rosidl_typesupport_introspection_c__MessageMembers *) ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX))()->data; } + if (!service_members->response_members_) { + service_members->response_members_ = + (const rosidl_typesupport_introspection_c__MessageMembers *) + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Event)()->data; + } return &@(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle; } From 42dd4d240875b2132097265e87b70d1fe0cf45f0 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 8 Aug 2022 11:03:53 -0700 Subject: [PATCH 21/54] turn on/off enabling message payload Signed-off-by: Brian Chen --- .../include/rosidl_runtime_c/service_type_support_struct.h | 1 + 1 file changed, 1 insertion(+) diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index 07a47c0f2..fc1cea3c7 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -29,6 +29,7 @@ extern "C" typedef struct rosidl_service_type_support_t rosidl_service_type_support_t; +// TODO(ihasdapie): Some documentation for this fn would be nice typedef const rosidl_service_type_support_t * (* rosidl_service_typesupport_handle_function)( const rosidl_service_type_support_t *, const char *); From 3d5537baa55d7c84584859559fd356a3f32eb89e Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Mon, 8 Aug 2022 11:04:36 -0700 Subject: [PATCH 22/54] add service_msgs to action_msgs cmake macro Signed-off-by: Brian Chen --- rosidl_cmake/cmake/rosidl_generate_interfaces.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake index c62c29c0b..3055c350b 100644 --- a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake +++ b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake @@ -161,6 +161,7 @@ macro(rosidl_generate_interfaces target) if("${_parent_dir}" STREQUAL "action" AND NOT DEFINED action_msgs_FOUND) find_package(service_msgs QUIET) find_package(action_msgs QUIET) + find_package(service_msgs QUIET) if(NOT ${action_msgs_FOUND}) message(FATAL_ERROR "Unable to generate action interface for '${_tuple_file}'. " From fb9c2bf1e7abaef5d0587224e68668b97df78c83 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Tue, 9 Aug 2022 11:06:02 -0700 Subject: [PATCH 23/54] fix find_package-ing for packages defining services and actions Signed-off-by: Brian Chen --- rosidl_cmake/cmake/rosidl_generate_interfaces.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake index 3055c350b..c62c29c0b 100644 --- a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake +++ b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake @@ -161,7 +161,6 @@ macro(rosidl_generate_interfaces target) if("${_parent_dir}" STREQUAL "action" AND NOT DEFINED action_msgs_FOUND) find_package(service_msgs QUIET) find_package(action_msgs QUIET) - find_package(service_msgs QUIET) if(NOT ${action_msgs_FOUND}) message(FATAL_ERROR "Unable to generate action interface for '${_tuple_file}'. " From 1a560be1dcdb3d18919e9b58ae66bf5aa7322dbf Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Wed, 10 Aug 2022 16:15:58 -0700 Subject: [PATCH 24/54] use postfixes from rosidl_parser.definition and add some docs Signed-off-by: Brian Chen --- .../rosidl_runtime_c/service_type_support_struct.h | 1 - .../resource/srv__type_support.c.em | 13 +------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index fc1cea3c7..07a47c0f2 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -29,7 +29,6 @@ extern "C" typedef struct rosidl_service_type_support_t rosidl_service_type_support_t; -// TODO(ihasdapie): Some documentation for this fn would be nice typedef const rosidl_service_type_support_t * (* rosidl_service_typesupport_handle_function)( const rosidl_service_type_support_t *, const char *); diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 5269a886f..f75781cdf 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -68,7 +68,6 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty get_service_typesupport_handle_function, }; -// TODO(ihasdapie): Use postfixes from rosidl_parser.definition // Forward declaration of request/response type support functions const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_REQUEST_MESSAGE_SUFFIX))(); @@ -80,7 +79,7 @@ const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX))(); const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Event)(); +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX)(); ROSIDL_TYPESUPPORT_INTROSPECTION_C_EXPORT_@(package_name) const rosidl_service_type_support_t * @@ -102,16 +101,6 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspecti (const rosidl_typesupport_introspection_c__MessageMembers *) ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX))()->data; } - if (!service_members->response_members_) { - service_members->response_members_ = - (const rosidl_typesupport_introspection_c__MessageMembers *) - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX))()->data; - } - if (!service_members->response_members_) { - service_members->response_members_ = - (const rosidl_typesupport_introspection_c__MessageMembers *) - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name)_Event)()->data; - } return &@(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle; } From bbed8ad711b4e8bf2d06c70f0d936782fa7c08e2 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Wed, 10 Aug 2022 16:22:25 -0700 Subject: [PATCH 25/54] missing bracket Signed-off-by: Brian Chen --- .../resource/srv__type_support.c.em | 3 --- 1 file changed, 3 deletions(-) diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index f75781cdf..49c187398 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -78,9 +78,6 @@ ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspecti const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX))(); -const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX)(); - ROSIDL_TYPESUPPORT_INTROSPECTION_C_EXPORT_@(package_name) const rosidl_service_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name))() { From 373cebef265465970fd15cd961575c3d479a1e5a Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Wed, 24 Aug 2022 01:32:06 -0700 Subject: [PATCH 26/54] add service_msgs tag where needed Signed-off-by: Brian Chen --- rosidl_generator_tests/package.xml | 1 + rosidl_typesupport_introspection_tests/package.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/rosidl_generator_tests/package.xml b/rosidl_generator_tests/package.xml index 9c6d716af..06b3a47ba 100644 --- a/rosidl_generator_tests/package.xml +++ b/rosidl_generator_tests/package.xml @@ -27,6 +27,7 @@ rosidl_runtime_c rosidl_runtime_cpp test_interface_files + service_msgs ament_cmake diff --git a/rosidl_typesupport_introspection_tests/package.xml b/rosidl_typesupport_introspection_tests/package.xml index b5aa95a92..3463aba69 100644 --- a/rosidl_typesupport_introspection_tests/package.xml +++ b/rosidl_typesupport_introspection_tests/package.xml @@ -29,6 +29,7 @@ rosidl_typesupport_introspection_cpp rosidl_typesupport_interface test_interface_files + service_msgs ament_cmake From 171caee1406619e5c71abcad729a2528a2eae7af Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Wed, 24 Aug 2022 01:32:45 -0700 Subject: [PATCH 27/54] make service_introspection_message_create_handle take const void* Signed-off-by: Brian Chen --- .../include/rosidl_runtime_c/service_type_support_struct.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index 07a47c0f2..d80636533 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -56,8 +56,8 @@ typedef struct rosidl_service_introspection_info_s { typedef void * (* rosidl_service_introspection_message_create_handle)( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, - void * request_message, - void * response_message, + const void * request_message, + const void * response_message, bool enable_message_payload); /// Destroys a ServiceEvent message From 62f1f9e9b3182256c57b0922006b5854a561d832 Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Wed, 24 Aug 2022 01:32:53 -0700 Subject: [PATCH 28/54] add parser test Signed-off-by: Brian Chen --- rosidl_parser/test/test_parser.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rosidl_parser/test/test_parser.py b/rosidl_parser/test/test_parser.py index 988032c5a..90fc38696 100644 --- a/rosidl_parser/test/test_parser.py +++ b/rosidl_parser/test/test_parser.py @@ -15,7 +15,6 @@ import pathlib import pytest - from rosidl_parser.definition import Action from rosidl_parser.definition import Array from rosidl_parser.definition import BasicType @@ -27,6 +26,7 @@ from rosidl_parser.definition import Message from rosidl_parser.definition import NamespacedType from rosidl_parser.definition import Service +from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX from rosidl_parser.definition import UnboundedSequence from rosidl_parser.definition import UnboundedString from rosidl_parser.definition import UnboundedWString @@ -315,6 +315,13 @@ def test_service_parser(service_idl_file): assert srv.namespaced_type.name == 'MyService' assert len(srv.request_message.structure.members) == 2 assert len(srv.response_message.structure.members) == 1 + assert(srv.event_message.structure.namespaced_type.name == + 'MyService' + SERVICE_EVENT_MESSAGE_SUFFIX) + + event_message_members = [i.name for i in srv.event_message.structure.members] + assert('request' in event_message_members) + assert('response' in event_message_members) + assert('info' in event_message_members) constants = srv.request_message.constants assert len(constants) == 1 From ca9ec5f2f41b93b70ad36d514c7dee4ade4c115f Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Wed, 24 Aug 2022 01:33:08 -0700 Subject: [PATCH 29/54] streamline rosidl_generate_interfaces cmake logic Signed-off-by: Brian Chen --- .../cmake/rosidl_generate_interfaces.cmake | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake index c62c29c0b..f4fb3b7f6 100644 --- a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake +++ b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake @@ -146,20 +146,18 @@ macro(rosidl_generate_interfaces target) get_filename_component(_parent_dir "${_tuple_file}" DIRECTORY) if("${_parent_dir}" STREQUAL "action" AND NOT _action_msgs_added) - list_append_unique(_ARG_DEPENDENCIES "action_msgs") - list_append_unique(_ARG_DEPENDENCIES "service_msgs") - ament_export_dependencies(action_msgs) - ament_export_dependencies(service_msgs) - set(_action_msgs_added TRUE) - break() - elseif("${_parent_dir}" STREQUAL "srv" AND NOT _service_msgs_added) - list_append_unique(_ARG_DEPENDENCIES "service_msgs") - ament_export_dependencies(service_msgs) - set(_service_msgs_added TRUE) - endif() - - if("${_parent_dir}" STREQUAL "action" AND NOT DEFINED action_msgs_FOUND) - find_package(service_msgs QUIET) + if (_service_msgs_added) + find_package(service_msgs QUIET) + if(NOT ${service_msgs_FOUND}) + message(FATAL_ERROR + "Unable to generate service interface for '${_tuple_file}'. " + "In order to generate service interfaces you must add a depend tag " + "for 'service_msgs' in your package.xml.") + endif() + ament_export_dependencies(service_msgs) + list_append_unique(_ARG_DEPENDENCIES "service_msgs") + set(_service_msgs_added TRUE) + endif() find_package(action_msgs QUIET) if(NOT ${action_msgs_FOUND}) message(FATAL_ERROR @@ -168,14 +166,11 @@ macro(rosidl_generate_interfaces target) "for 'action_msgs' in your package.xml.") endif() ament_export_dependencies(action_msgs) - ament_export_dependencies(service_msgs) list_append_unique(_ARG_DEPENDENCIES "action_msgs") - list_append_unique(_ARG_DEPENDENCIES "service_msgs") set(_action_msgs_added TRUE) break() - endif() - if("${_parent_dir}" STREQUAL "srv" AND NOT DEFINED service_msgs_FOUND) + elseif("${_parent_dir}" STREQUAL "srv" AND NOT _service_msgs_added) find_package(service_msgs QUIET) if(NOT ${service_msgs_FOUND}) message(FATAL_ERROR @@ -187,6 +182,7 @@ macro(rosidl_generate_interfaces target) list_append_unique(_ARG_DEPENDENCIES "service_msgs") set(_service_msgs_added TRUE) endif() + endforeach() # collect all interface files from dependencies From 9a89ee5b2be2815345ff7f1c3ee735f8721477cf Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Sat, 27 Aug 2022 01:45:04 -0700 Subject: [PATCH 30/54] add some generator tests Signed-off-by: Brian Chen --- .../test_srv_initialization.cpp | 15 ++++++++++++++- .../test/rosidl_generator_cpp/test_traits.cpp | 7 +++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp b/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp index c774b9466..6041abd2d 100644 --- a/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp +++ b/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp @@ -24,7 +24,7 @@ TEST(Test_srv_initialization, no_arg_request_constructor) { EXPECT_EQ(false, basic_types.bool_value); EXPECT_EQ(0, basic_types.byte_value); EXPECT_EQ(0, basic_types.char_value); - EXPECT_EQ(0.0f, basic_types.float32_value); + EXPECT_EQ(0.0F, basic_types.float32_value); EXPECT_EQ(0.0, basic_types.float64_value); EXPECT_EQ(0, basic_types.int8_value); EXPECT_EQ(0u, basic_types.uint8_value); @@ -57,6 +57,19 @@ TEST(Test_srv_initialization, no_arg_response_constructor) { EXPECT_EQ("", basic_types.string_value); } +TEST(Test_srv_initialization, no_arg_event_constructor) { + rosidl_generator_tests::srv::Empty::Event empty; + + rosidl_generator_tests::srv::BasicTypes::Event basic_types; + EXPECT_EQ(basic_types.info.event_type, 0); + EXPECT_EQ(basic_types.info.stamp.sec, 0); + EXPECT_EQ(basic_types.info.stamp.nanosec, 0); + for (auto i : basic_types.info.client_id.uuid) { + EXPECT_EQ(i, 0U); + } + EXPECT_EQ(basic_types.request.size(), 0); + EXPECT_EQ(basic_types.response.size(), 0); +} // Note that we very specifically don't add tests for some of the other // possibilities here (bounded strings, bounded / unbounded arrays, other // initialization parameters, etc). That's because that is all tested in diff --git a/rosidl_generator_tests/test/rosidl_generator_cpp/test_traits.cpp b/rosidl_generator_tests/test/rosidl_generator_cpp/test_traits.cpp index 0b79fee6f..2238b54ac 100644 --- a/rosidl_generator_tests/test/rosidl_generator_cpp/test_traits.cpp +++ b/rosidl_generator_tests/test/rosidl_generator_cpp/test_traits.cpp @@ -406,6 +406,7 @@ TEST(Test_rosidl_generator_traits, is_service) { using Service = rosidl_generator_tests::srv::Empty; using ServiceReq = Service::Request; using ServiceResp = Service::Response; + using ServiceEvent = Service::Event; EXPECT_TRUE(is_service()); EXPECT_FALSE(is_message()); @@ -423,4 +424,10 @@ TEST(Test_rosidl_generator_traits, is_service) { EXPECT_TRUE(is_message()); EXPECT_FALSE(is_service_request()); EXPECT_TRUE(is_service_response()); + + // Events are additionally messages + EXPECT_FALSE(is_service()); + EXPECT_TRUE(is_message()); + EXPECT_FALSE(is_service_request()); + EXPECT_TRUE(is_service_response()); } From 5fdfded229076dfaff547371a1a745f67271048a Mon Sep 17 00:00:00 2001 From: Brian Chen Date: Sat, 3 Sep 2022 15:55:14 -0400 Subject: [PATCH 31/54] rename from introspection_message handles to event_message handles Signed-off-by: Brian Chen --- .../rosidl_runtime_c/service_type_support_struct.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index d80636533..bbbd6c4f7 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -53,7 +53,7 @@ typedef struct rosidl_service_introspection_info_s { * \param[in] enable_message_payload Whether to enable message payloads in the ServiceEvent message * \return The built ServiceEvent message. Will return NULL if the message could not be built. **/ -typedef void * (* rosidl_service_introspection_message_create_handle)( +typedef void * (* rosidl_event_message_create_handle)( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, const void * request_message, @@ -68,7 +68,7 @@ typedef void * (* rosidl_service_introspection_message_create_handle)( * \param[in] event_message The message to destroy. * \param[in] allocator The allocator to use for deallocating the message. */ -typedef bool (* rosidl_service_introspection_message_destroy_handle)( +typedef bool (* rosidl_event_message_destroy_handle)( void * event_message, rcutils_allocator_t * allocator); @@ -82,9 +82,9 @@ struct rosidl_service_type_support_t /// Pointer to the service type support handler function rosidl_service_typesupport_handle_function func; /// Pointer to function to create the introspection message - rosidl_service_introspection_message_create_handle introspection_message_create_handle; + rosidl_event_message_create_handle event_message_create_handle; /// Pointer to function to finalize the introspection message - rosidl_service_introspection_message_destroy_handle introspection_message_destroy_handle; + rosidl_event_message_destroy_handle event_message_destroy_handle; /// Service event message typesupport const rosidl_message_type_support_t * event_typesupport; }; From 820712fbaec63ecece732987ee8b0318c3729cdb Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Thu, 29 Sep 2022 13:53:33 -0700 Subject: [PATCH 32/54] Remove duplicate template instances This was probably a bug introduced during a rebase. Signed-off-by: Jacob Perron --- rosidl_generator_c/resource/idl__functions.c.em | 14 -------------- rosidl_generator_c/resource/idl__functions.h.em | 14 -------------- rosidl_generator_c/resource/idl__struct.h.em | 14 -------------- 3 files changed, 42 deletions(-) diff --git a/rosidl_generator_c/resource/idl__functions.c.em b/rosidl_generator_c/resource/idl__functions.c.em index cdec86531..48c3b1177 100644 --- a/rosidl_generator_c/resource/idl__functions.c.em +++ b/rosidl_generator_c/resource/idl__functions.c.em @@ -124,13 +124,6 @@ TEMPLATE( message=action.send_goal_service.event_message, include_directives=include_directives) }@ -@{ -TEMPLATE( - 'msg__functions.c.em', - package_name=package_name, interface_path=interface_path, - message=action.send_goal_service.event_message, include_directives=include_directives) -}@ - @{ TEMPLATE( 'msg__functions.c.em', @@ -152,13 +145,6 @@ TEMPLATE( message=action.get_result_service.event_message, include_directives=include_directives) }@ -@{ -TEMPLATE( - 'msg__functions.c.em', - package_name=package_name, interface_path=interface_path, - message=action.get_result_service.event_message, include_directives=include_directives) -}@ - @{ TEMPLATE( 'msg__functions.c.em', diff --git a/rosidl_generator_c/resource/idl__functions.h.em b/rosidl_generator_c/resource/idl__functions.h.em index b144c70a3..6cf7b18b8 100644 --- a/rosidl_generator_c/resource/idl__functions.h.em +++ b/rosidl_generator_c/resource/idl__functions.h.em @@ -130,13 +130,6 @@ TEMPLATE( message=action.send_goal_service.event_message) }@ -@{ -TEMPLATE( - 'msg__functions.h.em', - package_name=package_name, interface_path=interface_path, - message=action.send_goal_service.event_message) -}@ - @{ TEMPLATE( 'msg__functions.h.em', @@ -158,13 +151,6 @@ TEMPLATE( message=action.get_result_service.event_message) }@ -@{ -TEMPLATE( - 'msg__functions.h.em', - package_name=package_name, interface_path=interface_path, - message=action.get_result_service.event_message) -}@ - @{ TEMPLATE( 'msg__functions.h.em', diff --git a/rosidl_generator_c/resource/idl__struct.h.em b/rosidl_generator_c/resource/idl__struct.h.em index 7634f9028..94bf39bf4 100644 --- a/rosidl_generator_c/resource/idl__struct.h.em +++ b/rosidl_generator_c/resource/idl__struct.h.em @@ -127,13 +127,6 @@ TEMPLATE( message=action.send_goal_service.event_message, include_directives=include_directives) }@ -@{ -TEMPLATE( - 'msg__struct.h.em', - package_name=package_name, interface_path=interface_path, - message=action.send_goal_service.event_message, include_directives=include_directives) -}@ - @{ TEMPLATE( 'msg__struct.h.em', @@ -155,13 +148,6 @@ TEMPLATE( message=action.get_result_service.event_message, include_directives=include_directives) }@ -@{ -TEMPLATE( - 'msg__struct.h.em', - package_name=package_name, interface_path=interface_path, - message=action.get_result_service.event_message, include_directives=include_directives) -}@ - @{ TEMPLATE( 'msg__struct.h.em', From d535a6ee57e843761c768337274571d4bd93c738 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Thu, 29 Sep 2022 18:05:21 -0700 Subject: [PATCH 33/54] Refactor action/service loop Signed-off-by: Jacob Perron --- .../cmake/rosidl_generate_interfaces.cmake | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake index f4fb3b7f6..396f0cf33 100644 --- a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake +++ b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake @@ -139,25 +139,24 @@ macro(rosidl_generate_interfaces target) # afterwards all remaining interface files are .idl files list(APPEND _idl_tuples ${_idl_adapter_tuples}) - set(_service_msgs_added FALSE) - set(_action_msgs_added FALSE) + # Check for any action or service interfaces + # Which have implicit dependencies that need to be found foreach(_tuple ${_interface_tuples}) + # We use the parent directory name to identify if the interface is an action or service string(REGEX REPLACE ".*:([^:]*)$" "\\1" _tuple_file "${_tuple}") get_filename_component(_parent_dir "${_tuple_file}" DIRECTORY) - if("${_parent_dir}" STREQUAL "action" AND NOT _action_msgs_added) - if (_service_msgs_added) - find_package(service_msgs QUIET) - if(NOT ${service_msgs_FOUND}) - message(FATAL_ERROR - "Unable to generate service interface for '${_tuple_file}'. " - "In order to generate service interfaces you must add a depend tag " - "for 'service_msgs' in your package.xml.") - endif() - ament_export_dependencies(service_msgs) - list_append_unique(_ARG_DEPENDENCIES "service_msgs") - set(_service_msgs_added TRUE) + if("${_parent_dir}" STREQUAL "action") + # Actions depend on the packages service_msgs and action_msgs + find_package(service_msgs QUIET) + if(NOT ${service_msgs_FOUND}) + message(FATAL_ERROR + "Unable to generate action interface for '${_tuple_file}'. " + "In order to generate action interfaces you must add a depend tag " + "for 'service_msgs' in your package.xml.") endif() + ament_export_dependencies(service_msgs) + list_append_unique(_ARG_DEPENDENCIES "service_msgs") find_package(action_msgs QUIET) if(NOT ${action_msgs_FOUND}) message(FATAL_ERROR @@ -167,10 +166,12 @@ macro(rosidl_generate_interfaces target) endif() ament_export_dependencies(action_msgs) list_append_unique(_ARG_DEPENDENCIES "action_msgs") - set(_action_msgs_added TRUE) - break() - elseif("${_parent_dir}" STREQUAL "srv" AND NOT _service_msgs_added) + # It is safe to break out of the loop since services only depend on service_msgs + # Which has already been found above + break() + elseif(NOT service_msgs_FOUND AND "${_parent_dir}" STREQUAL "srv") + # Services depend on service_msgs find_package(service_msgs QUIET) if(NOT ${service_msgs_FOUND}) message(FATAL_ERROR @@ -180,9 +181,7 @@ macro(rosidl_generate_interfaces target) endif() ament_export_dependencies(service_msgs) list_append_unique(_ARG_DEPENDENCIES "service_msgs") - set(_service_msgs_added TRUE) endif() - endforeach() # collect all interface files from dependencies From ad1bd4aaacee57f28fbd67d5ae78658f42df8cfb Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Mon, 3 Oct 2022 16:34:34 -0700 Subject: [PATCH 34/54] Use last directory in path to identify actions and services This allows users to pass interfaces in nested directories, e.g. test/srv/Foo.srv, instead of requiring them to be directly inside a 'srv' or 'action' directory relative to the cmake source directory. Signed-off-by: Jacob Perron --- rosidl_cmake/cmake/rosidl_generate_interfaces.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake index 396f0cf33..4fe00e3eb 100644 --- a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake +++ b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake @@ -145,6 +145,7 @@ macro(rosidl_generate_interfaces target) # We use the parent directory name to identify if the interface is an action or service string(REGEX REPLACE ".*:([^:]*)$" "\\1" _tuple_file "${_tuple}") get_filename_component(_parent_dir "${_tuple_file}" DIRECTORY) + get_filename_component(_parent_dir ${_parent_dir} NAME) if("${_parent_dir}" STREQUAL "action") # Actions depend on the packages service_msgs and action_msgs From e0d75d15599ec1cd2fa4c7f26176870e6ebecfa8 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Mon, 3 Oct 2022 16:46:06 -0700 Subject: [PATCH 35/54] Do not rely on service_msgs_FOUND Signed-off-by: Jacob Perron --- rosidl_cmake/cmake/rosidl_generate_interfaces.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake index 4fe00e3eb..c0273e66d 100644 --- a/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake +++ b/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake @@ -171,7 +171,7 @@ macro(rosidl_generate_interfaces target) # It is safe to break out of the loop since services only depend on service_msgs # Which has already been found above break() - elseif(NOT service_msgs_FOUND AND "${_parent_dir}" STREQUAL "srv") + elseif("${_parent_dir}" STREQUAL "srv") # Services depend on service_msgs find_package(service_msgs QUIET) if(NOT ${service_msgs_FOUND}) From 96f32230c8b3fdfb59ec89fd5fd823b001c3dc04 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Wed, 12 Oct 2022 15:10:57 -0700 Subject: [PATCH 36/54] Lint Signed-off-by: Jacob Perron --- .../resource/idl__functions.c.em | 1 - .../resource/idl__functions.h.em | 1 - .../service_type_support_struct.h | 20 ++++++++++--------- .../resource/srv__type_support.cpp.em | 3 +-- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/rosidl_generator_c/resource/idl__functions.c.em b/rosidl_generator_c/resource/idl__functions.c.em index 48c3b1177..8614665e7 100644 --- a/rosidl_generator_c/resource/idl__functions.c.em +++ b/rosidl_generator_c/resource/idl__functions.c.em @@ -71,7 +71,6 @@ TEMPLATE( package_name=package_name, interface_path=interface_path, message=service.event_message, include_directives=include_directives) }@ - @[end for]@ @ @####################################################################### diff --git a/rosidl_generator_c/resource/idl__functions.h.em b/rosidl_generator_c/resource/idl__functions.h.em index 6cf7b18b8..ba6729df3 100644 --- a/rosidl_generator_c/resource/idl__functions.h.em +++ b/rosidl_generator_c/resource/idl__functions.h.em @@ -78,7 +78,6 @@ TEMPLATE( package_name=package_name, interface_path=interface_path, message=service.event_message) }@ - @[end for]@ @ @####################################################################### diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index bbbd6c4f7..158e029a3 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -15,12 +15,13 @@ #ifndef ROSIDL_RUNTIME_C__SERVICE_TYPE_SUPPORT_STRUCT_H_ #define ROSIDL_RUNTIME_C__SERVICE_TYPE_SUPPORT_STRUCT_H_ +#include + #include "rcutils/allocator.h" #include "rosidl_runtime_c/message_type_support_struct.h" #include "rosidl_runtime_c/visibility_control.h" #include "rosidl_typesupport_interface/macros.h" -#include "stdint.h" #ifdef __cplusplus extern "C" @@ -32,7 +33,8 @@ typedef struct rosidl_service_type_support_t rosidl_service_type_support_t; typedef const rosidl_service_type_support_t * (* rosidl_service_typesupport_handle_function)( const rosidl_service_type_support_t *, const char *); -typedef struct rosidl_service_introspection_info_s { +typedef struct rosidl_service_introspection_info_s +{ uint8_t event_type; int32_t stamp_sec; uint32_t stamp_nanosec; @@ -54,11 +56,11 @@ typedef struct rosidl_service_introspection_info_s { * \return The built ServiceEvent message. Will return NULL if the message could not be built. **/ typedef void * (* rosidl_event_message_create_handle)( - const rosidl_service_introspection_info_t * info, - rcutils_allocator_t * allocator, - const void * request_message, - const void * response_message, - bool enable_message_payload); + const rosidl_service_introspection_info_t * info, + rcutils_allocator_t * allocator, + const void * request_message, + const void * response_message, + bool enable_message_payload); /// Destroys a ServiceEvent message /** @@ -69,8 +71,8 @@ typedef void * (* rosidl_event_message_create_handle)( * \param[in] allocator The allocator to use for deallocating the message. */ typedef bool (* rosidl_event_message_destroy_handle)( - void * event_message, - rcutils_allocator_t * allocator); + void * event_message, + rcutils_allocator_t * allocator); /// Contains rosidl service type support data struct rosidl_service_type_support_t diff --git a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em index a96a2ea79..a2b4e1ee4 100644 --- a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em @@ -101,8 +101,7 @@ get_service_type_support_handle<@('::'.join([package_name] + list(interface_path if ( service_members->request_members_ == nullptr || service_members->response_members_ == nullptr || - service_members->event_members_ == nullptr - ) + service_members->event_members_ == nullptr) { // initialize the request_members_ with the static function from the external library service_members->request_members_ = static_cast< From 220ff594ebb92a16bbb745c99ff68ebf66df3624 Mon Sep 17 00:00:00 2001 From: Jacob Perron Date: Wed, 12 Oct 2022 16:24:09 -0700 Subject: [PATCH 37/54] Fix test Signed-off-by: Jacob Perron --- .../test/rosidl_generator_cpp/test_traits.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosidl_generator_tests/test/rosidl_generator_cpp/test_traits.cpp b/rosidl_generator_tests/test/rosidl_generator_cpp/test_traits.cpp index 2238b54ac..7e16d450c 100644 --- a/rosidl_generator_tests/test/rosidl_generator_cpp/test_traits.cpp +++ b/rosidl_generator_tests/test/rosidl_generator_cpp/test_traits.cpp @@ -429,5 +429,5 @@ TEST(Test_rosidl_generator_traits, is_service) { EXPECT_FALSE(is_service()); EXPECT_TRUE(is_message()); EXPECT_FALSE(is_service_request()); - EXPECT_TRUE(is_service_response()); + EXPECT_FALSE(is_service_response()); } From 00b543367d55308f1ea238fa7a5982a2d848f6e6 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Fri, 11 Nov 2022 15:30:22 -0300 Subject: [PATCH 38/54] Modify recursive includes in rosidl_generator_c/rosidl_generator_cpp Signed-off-by: Ivan Santiago Paunovic --- rosidl_generator_c/resource/msg__struct.h.em | 10 ++++++++++ rosidl_generator_cpp/resource/msg__struct.hpp.em | 7 +++++-- rosidl_generator_cpp/resource/msg__traits.hpp.em | 7 +++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/rosidl_generator_c/resource/msg__struct.h.em b/rosidl_generator_c/resource/msg__struct.h.em index ad4b53b1e..9425298fd 100644 --- a/rosidl_generator_c/resource/msg__struct.h.em +++ b/rosidl_generator_c/resource/msg__struct.h.em @@ -13,6 +13,8 @@ from rosidl_parser.definition import FLOATING_POINT_TYPES from rosidl_parser.definition import INTEGER_TYPES from rosidl_parser.definition import NamespacedType from rosidl_parser.definition import OCTET_TYPE +from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX from rosidl_generator_c import basetype_to_c from rosidl_generator_c import idl_declaration_to_c from rosidl_generator_c import idl_structure_type_sequence_to_c_typename @@ -43,6 +45,14 @@ for member in message.structure.members: 'rosidl_runtime_c/u16string.h', []) member_names.append(member.name) elif isinstance(type_, NamespacedType): + if ( + message.structure.namespaced_type.namespaces[-1] == 'srv' and ( + type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or + type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX)) + ): + typename = type_.name.rsplit('_', 1)[0] + if typename == message.structure.namespaced_type.name.rsplit('_', 1)[0]: + continue include_prefix = idl_structure_type_to_c_include_prefix( type_, 'detail') member_names = includes.setdefault( diff --git a/rosidl_generator_cpp/resource/msg__struct.hpp.em b/rosidl_generator_cpp/resource/msg__struct.hpp.em index b0bcb3c16..928d11231 100644 --- a/rosidl_generator_cpp/resource/msg__struct.hpp.em +++ b/rosidl_generator_cpp/resource/msg__struct.hpp.em @@ -40,10 +40,13 @@ for member in message.structure.members: type_ = type_.value_type if isinstance(type_, NamespacedType): if ( + message.structure.namespaced_type.namespaces[-1] == 'srv' and ( type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or - type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX) + type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX)) ): - continue + typename = type_.name.rsplit('_', 1)[0] + if typename == message.structure.namespaced_type.name.rsplit('_', 1)[0]: + continue if ( type_.name.endswith(ACTION_GOAL_SUFFIX) or type_.name.endswith(ACTION_RESULT_SUFFIX) or diff --git a/rosidl_generator_cpp/resource/msg__traits.hpp.em b/rosidl_generator_cpp/resource/msg__traits.hpp.em index 99f1246c1..bba806eb6 100644 --- a/rosidl_generator_cpp/resource/msg__traits.hpp.em +++ b/rosidl_generator_cpp/resource/msg__traits.hpp.em @@ -31,10 +31,13 @@ for member in message.structure.members: type_ = type_.value_type if isinstance(type_, NamespacedType): if ( + message.structure.namespaced_type.namespaces[-1] == 'srv' and ( type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or - type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX) + type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX)) ): - continue + typename = type_.name.rsplit('_', 1)[0] + if typename == message.structure.namespaced_type.name.rsplit('_', 1)[0]: + continue if ( type_.name.endswith(ACTION_GOAL_SUFFIX) or type_.name.endswith(ACTION_RESULT_SUFFIX) or From 68ff7b5cf470871df584a7cd3ddcf3b31c890f97 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Fri, 11 Nov 2022 17:26:29 -0300 Subject: [PATCH 39/54] add service event create/destroy function for typesupport introspection c/cpp Signed-off-by: Ivan Santiago Paunovic --- .../resource/srv__type_support.c.em | 78 +++++++++++++++++++ .../resource/srv__type_support.cpp.em | 62 +++++++++++++++ 2 files changed, 140 insertions(+) diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 49c187398..07e39fee8 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -37,6 +37,7 @@ header_files = [ 'rosidl_typesupport_introspection_c/service_introspection.h', ] +message_function_prefix = '__'.join([package_name] + list(interface_path.parents[0].parts) + [service.namespaced_type.name]) + f'{SERVICE_EVENT_MESSAGE_SUFFIX}__rosidl_typesupport_introspection_c' function_prefix = '__'.join(include_parts) + '__rosidl_typesupport_introspection_c' }@ @[for header_file in header_files]@ @@ -62,11 +63,88 @@ static rosidl_typesupport_introspection_c__ServiceMembers @(function_prefix)__@( // @(function_prefix)__@(service.response_message.structure.namespaced_type.name)_message_type_support_handle }; +@{event_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_EVENT_MESSAGE_SUFFIX}@ +@{request_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_REQUEST_MESSAGE_SUFFIX}@ +@{response_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_RESPONSE_MESSAGE_SUFFIX}@ + +void * +rosidl_typesupport_introspection_c_@('__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))__event_message__create( + const rosidl_service_introspection_info_t * info, + rcutils_allocator_t * allocator, + const void * request_message, + const void * response_message, + bool enable_message_payload) +{ + @event_type * event_msg = (@event_type *)(allocator->allocate(sizeof(@event_type), allocator->state)); + if (!@(event_type)__init(event_msg)) { + allocator->deallocate(event_msg, allocator->state); + return NULL; + } + + event_msg->info.event_type = info->event_type; + event_msg->info.sequence_number = info->sequence_number; + event_msg->info.stamp.sec = info->stamp_sec; + event_msg->info.stamp.nanosec = info->stamp_nanosec; + for (size_t i = 0; i < 16; ++i) { + event_msg->info.client_id.uuid[i] = info->client_id[i]; + } + + if (!enable_message_payload) { + return event_msg; + } + + if (request_message) { + event_msg->response.capacity = 1; + event_msg->response.size = 1; + event_msg->response.data = (@response_type *)(allocator->allocate(sizeof(@response_type), allocator->state)); + if (!@(response_type)__copy((const @response_type *)(response_message), &event_msg->response.data[0])) { + allocator->deallocate(event_msg, allocator->state); + return NULL; + } + } + if (response_message) { + event_msg->request.capacity = 1; + event_msg->request.size = 1; + event_msg->request.data = (@request_type *)(allocator->allocate(sizeof(@request_type), allocator->state)); + if (!@(request_type)__copy((const @request_type *)(request_message), &event_msg->request.data[0])) { + allocator->deallocate(event_msg, allocator->state); + return NULL; + } + } + return event_msg; +} + +bool +rosidl_typesupport_introspection_c_@('__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))__event_message__destroy( + void * event_msg, + rcutils_allocator_t * allocator) +{ + if (NULL == event_msg) { + return false; + } + @event_type * _event_msg = (@event_type *)(event_msg); + + @(event_type)__fini((@event_type *)(_event_msg)); + if (_event_msg->request.data) { + allocator->deallocate(_event_msg->request.data, allocator->state); + } + if (_event_msg->response.data) { + allocator->deallocate(_event_msg->response.data, allocator->state); + } + allocator->deallocate(_event_msg, allocator->state); + return true; +} + static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle = { 0, &@(function_prefix)__@(service.namespaced_type.name)_service_members, get_service_typesupport_handle_function, + rosidl_typesupport_introspection_c_@('__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))__event_message__create, + rosidl_typesupport_introspection_c_@('__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))__event_message__destroy, + &@(message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_EVENT_MESSAGE_SUFFIX)_message_type_support_handle, }; +// rcl_interfaces__srv__GetParameters_Event__rosidl_typesupport_introspection_c__GetParameters_Event_message_type_support_handle +// rcl_interfaces__srv__detail__get_parameters__rosidl_typesupport_introspection_c__GetParameters_Event_message_type_support_handle, // Forward declaration of request/response type support functions const rosidl_message_type_support_t * diff --git a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em index a2b4e1ee4..2f0493af5 100644 --- a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em @@ -22,6 +22,9 @@ TEMPLATE( @{ from rosidl_pycommon import convert_camel_case_to_lower_case_underscore +from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX include_parts = [package_name] + list(interface_path.parents[0].parts) + [ 'detail', convert_camel_case_to_lower_case_underscore(interface_path.stem)] include_base = '/'.join(include_parts) @@ -68,10 +71,69 @@ static ::rosidl_typesupport_introspection_cpp::ServiceMembers @(service.namespac nullptr, // event message }; +@{ +event_type = '::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_EVENT_MESSAGE_SUFFIX}@ +void * +rosidl_typesupport_introspection_cpp_@('_'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_event_message_create( + const rosidl_service_introspection_info_t * info, + rcutils_allocator_t * allocator, + const void * request_message, + const void * response_message, + bool enable_message_payload) +{ + if (nullptr == info) { + throw std::invalid_argument("service introspection info struct cannot be null"); + } + if (nullptr == allocator) { + throw std::invalid_argument("allocator cannot be null"); + } + auto * event_msg = static_cast<@event_type *>(allocator->allocate(sizeof(@event_type), allocator->state)); + if (nullptr == event_msg) { + throw std::invalid_argument("allocation failed for service event message"); + } + event_msg = new(event_msg) @(event_type)(); + + event_msg->info.set__event_type(info->event_type); + event_msg->info.set__sequence_number(info->sequence_number); + event_msg->info.stamp.set__sec(info->stamp_sec); + event_msg->info.stamp.set__nanosec(info->stamp_nanosec); + + std::array client_id; + std::move(std::begin(info->client_id), std::end(info->client_id), client_id.begin()); + event_msg->info.client_id.set__uuid(client_id); + + // TODO(jacobperron): consider removing this argument and let users pass nullptr for both request and response messages + if (!enable_message_payload) { + return event_msg; + } + if (nullptr != request_message) { + event_msg->request.push_back(*static_cast(request_message)); + } + if (nullptr != response_message) { + event_msg->response.push_back(*static_cast(response_message)); + } + + return event_msg; +} + +bool +rosidl_typesupport_introspection_cpp_@('_'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_event_message_destroy( + void * event_msg, + rcutils_allocator_t * allocator) +{ + auto * event_msg_ = static_cast<@event_type *>(event_msg); + event_msg_->~@(service.namespaced_type.name)_Event(); + allocator->deallocate(event_msg, allocator->state); + return true; +} + static const rosidl_service_type_support_t @(service.namespaced_type.name)_service_type_support_handle = { ::rosidl_typesupport_introspection_cpp::typesupport_identifier, &@(service.namespaced_type.name)_service_members, get_service_typesupport_handle_function, + rosidl_typesupport_introspection_cpp_@('_'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_event_message_create, + rosidl_typesupport_introspection_cpp_@('_'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_event_message_destroy, + ::rosidl_typesupport_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_Event>(), }; } // namespace rosidl_typesupport_introspection_cpp From b3be446e22064e2145454c80e6578c3fb528832b Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Tue, 15 Nov 2022 10:58:08 -0300 Subject: [PATCH 40/54] Generate only one implementation of functions per generator Signed-off-by: Ivan Santiago Paunovic --- ...sidl_generator_c_generate_interfaces.cmake | 3 + .../resource/idl__type_support.c.em | 53 ++++++++++++ .../resource/srv__type_support.c.em | 85 +++++++++++++++++++ .../resource/srv__type_support.h.em | 23 +++++ .../rosidl_generator_c/__init__.py | 1 + .../rosidl_typesupport_interface/macros.h | 12 +++ .../resource/srv__type_support.c.em | 78 ++--------------- 7 files changed, 185 insertions(+), 70 deletions(-) create mode 100644 rosidl_generator_c/resource/idl__type_support.c.em create mode 100644 rosidl_generator_c/resource/srv__type_support.c.em diff --git a/rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake b/rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake index b024fe054..e10aa97fc 100644 --- a/rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake +++ b/rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake @@ -34,6 +34,7 @@ foreach(_abs_idl_file ${rosidl_generate_interfaces_ABS_IDL_FILES}) ) list(APPEND _generated_sources "${_output_path}/${_parent_folder}/detail/${_header_name}__functions.c" + "${_output_path}/${_parent_folder}/detail/${_header_name}__type_support.c" ) endforeach() @@ -56,11 +57,13 @@ set(target_dependencies "${rosidl_generator_c_TEMPLATE_DIR}/idl__functions.c.em" "${rosidl_generator_c_TEMPLATE_DIR}/idl__functions.h.em" "${rosidl_generator_c_TEMPLATE_DIR}/idl__struct.h.em" + "${rosidl_generator_c_TEMPLATE_DIR}/idl__type_support.c.em" "${rosidl_generator_c_TEMPLATE_DIR}/idl__type_support.h.em" "${rosidl_generator_c_TEMPLATE_DIR}/msg__functions.c.em" "${rosidl_generator_c_TEMPLATE_DIR}/msg__functions.h.em" "${rosidl_generator_c_TEMPLATE_DIR}/msg__struct.h.em" "${rosidl_generator_c_TEMPLATE_DIR}/msg__type_support.h.em" + "${rosidl_generator_c_TEMPLATE_DIR}/srv__type_support.c.em" "${rosidl_generator_c_TEMPLATE_DIR}/srv__type_support.h.em" ${rosidl_generate_interfaces_ABS_IDL_FILES} ${_dependency_files}) diff --git a/rosidl_generator_c/resource/idl__type_support.c.em b/rosidl_generator_c/resource/idl__type_support.c.em new file mode 100644 index 000000000..14d75c7a3 --- /dev/null +++ b/rosidl_generator_c/resource/idl__type_support.c.em @@ -0,0 +1,53 @@ +// generated from rosidl_generator_c/resource/idl__type_support.c.em +// with input from @(package_name):@(interface_path) +// generated code does not contain a copyright notice +@ +@####################################################################### +@# EmPy template for generating __type_support.c files +@# +@# Context: +@# - package_name (string) +@# - interface_path (Path relative to the directory named after the package) +@# - content (IdlContent, list of elements, e.g. Messages or Services) +@####################################################################### +@{ +from rosidl_pycommon import convert_camel_case_to_lower_case_underscore +include_parts = [package_name] + list(interface_path.parents[0].parts) + [ + 'detail', convert_camel_case_to_lower_case_underscore(interface_path.stem)] +include_base = '/'.join(include_parts) + +include_directives = { + 'rosidl_typesupport_interface/macros.h', + include_base + '__type_support.h', + include_base + '__struct.h', + include_base + '__functions.h'} +}@ + +@[for header_file in include_directives]@ +#include "@(header_file)" +@[end for]@ + +#ifdef __cplusplus +extern "C" +{ +#endif + +@####################################################################### +@# Handle service +@####################################################################### +@{ +from rosidl_parser.definition import Service +}@ +@[for service in content.get_elements_of_type(Service)]@ +@{ +TEMPLATE( + 'srv__type_support.c.em', + package_name=package_name, service=service, + interface_path=interface_path, include_directives=include_directives) +}@ + +@[end for]@ + +#ifdef __cplusplus +} +#endif diff --git a/rosidl_generator_c/resource/srv__type_support.c.em b/rosidl_generator_c/resource/srv__type_support.c.em new file mode 100644 index 000000000..5028f9fbe --- /dev/null +++ b/rosidl_generator_c/resource/srv__type_support.c.em @@ -0,0 +1,85 @@ +@# Included from rosidl_generator_c/resource/srv__type_support.c.em +@{ +from rosidl_pycommon import convert_camel_case_to_lower_case_underscore +from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX +event_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_EVENT_MESSAGE_SUFFIX +request_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_REQUEST_MESSAGE_SUFFIX +response_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_RESPONSE_MESSAGE_SUFFIX +} + +void * +ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( + rosidl_typesupport_c, + @(',\n '.join(service.namespaced_type.namespaced_name())) +)( + const rosidl_service_introspection_info_t * info, + rcutils_allocator_t * allocator, + const void * request_message, + const void * response_message, + bool enable_message_payload) +{ + @event_type * event_msg = (@event_type *)(allocator->allocate(sizeof(@event_type), allocator->state)); + if (!@(event_type)__init(event_msg)) { + allocator->deallocate(event_msg, allocator->state); + return NULL; + } + + event_msg->info.event_type = info->event_type; + event_msg->info.sequence_number = info->sequence_number; + event_msg->info.stamp.sec = info->stamp_sec; + event_msg->info.stamp.nanosec = info->stamp_nanosec; + for (size_t i = 0; i < 16; ++i) { + event_msg->info.client_id.uuid[i] = info->client_id[i]; + } + + if (!enable_message_payload) { + return event_msg; + } + + if (request_message) { + event_msg->response.capacity = 1; + event_msg->response.size = 1; + event_msg->response.data = (@response_type *)(allocator->allocate(sizeof(@response_type), allocator->state)); + if (!@(response_type)__copy((const @response_type *)(response_message), &event_msg->response.data[0])) { + allocator->deallocate(event_msg, allocator->state); + return NULL; + } + } + if (response_message) { + event_msg->request.capacity = 1; + event_msg->request.size = 1; + event_msg->request.data = (@request_type *)(allocator->allocate(sizeof(@request_type), allocator->state)); + if (!@(request_type)__copy((const @request_type *)(request_message), &event_msg->request.data[0])) { + allocator->deallocate(event_msg, allocator->state); + return NULL; + } + } + return event_msg; +} + +// Forward declare the get type support functions for this type. +bool +ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_DESTROY_EVENT_MESSAGE_SYMBOL_NAME( + rosidl_typesupport_c, + @(',\n '.join(service.namespaced_type.namespaced_name())) +)( + void * event_msg, + rcutils_allocator_t * allocator) +{ + if (NULL == event_msg) { + return false; + } + @event_type * _event_msg = (@event_type *)(event_msg); + + @(event_type)__fini((@event_type *)(_event_msg)); + if (_event_msg->request.data) { + allocator->deallocate(_event_msg->request.data, allocator->state); + } + if (_event_msg->response.data) { + allocator->deallocate(_event_msg->response.data, allocator->state); + } + allocator->deallocate(_event_msg, allocator->state); + return true; +} diff --git a/rosidl_generator_c/resource/srv__type_support.h.em b/rosidl_generator_c/resource/srv__type_support.h.em index 9a2c7e5c6..f2140b404 100644 --- a/rosidl_generator_c/resource/srv__type_support.h.em +++ b/rosidl_generator_c/resource/srv__type_support.h.em @@ -36,3 +36,26 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( rosidl_typesupport_c, @(',\n '.join(service.namespaced_type.namespaced_name())) )(); + +// Forward declare the function to create a service event message for this type. +ROSIDL_GENERATOR_C_PUBLIC_@(package_name) +void * +ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( + rosidl_typesupport_c, + @(',\n '.join(service.namespaced_type.namespaced_name())) +)( + const rosidl_service_introspection_info_t * info, + rcutils_allocator_t * allocator, + const void * request_message, + const void * response_message, + bool enable_message_payload); + +// Forward declare the function to destroy a service event message for this type. +ROSIDL_GENERATOR_C_PUBLIC_@(package_name) +bool +ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_DESTROY_EVENT_MESSAGE_SYMBOL_NAME( + rosidl_typesupport_c, + @(',\n '.join(service.namespaced_type.namespaced_name())) +)( + void * event_msg, + rcutils_allocator_t * allocator); diff --git a/rosidl_generator_c/rosidl_generator_c/__init__.py b/rosidl_generator_c/rosidl_generator_c/__init__.py index 02aa5e884..17071b67f 100644 --- a/rosidl_generator_c/rosidl_generator_c/__init__.py +++ b/rosidl_generator_c/rosidl_generator_c/__init__.py @@ -32,6 +32,7 @@ def generate_c(generator_arguments_file): 'idl__functions.c.em': 'detail/%s__functions.c', 'idl__functions.h.em': 'detail/%s__functions.h', 'idl__struct.h.em': 'detail/%s__struct.h', + 'idl__type_support.c.em': 'detail/%s__type_support.c', 'idl__type_support.h.em': 'detail/%s__type_support.h', } return generate_files( diff --git a/rosidl_typesupport_interface/include/rosidl_typesupport_interface/macros.h b/rosidl_typesupport_interface/include/rosidl_typesupport_interface/macros.h index aa619b252..de3fbef41 100644 --- a/rosidl_typesupport_interface/include/rosidl_typesupport_interface/macros.h +++ b/rosidl_typesupport_interface/include/rosidl_typesupport_interface/macros.h @@ -47,4 +47,16 @@ typesupport_name, get_action_type_support_handle, \ package_name, interface_type, action_name) +#define ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( \ + typesupport_name, package_name, interface_type, service_name) \ + ROSIDL_TYPESUPPORT_INTERFACE__SYMBOL_NAME( \ + typesupport_name, create_service_event_message, \ + package_name, interface_type, service_name) + +#define ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_DESTROY_EVENT_MESSAGE_SYMBOL_NAME( \ + typesupport_name, package_name, interface_type, service_name) \ + ROSIDL_TYPESUPPORT_INTERFACE__SYMBOL_NAME( \ + typesupport_name, destroy_service_event_message, \ + package_name, interface_type, service_name) + #endif // ROSIDL_TYPESUPPORT_INTERFACE__MACROS_H_ diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 07e39fee8..70a220b31 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -67,80 +67,18 @@ static rosidl_typesupport_introspection_c__ServiceMembers @(function_prefix)__@( @{request_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_REQUEST_MESSAGE_SUFFIX}@ @{response_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_RESPONSE_MESSAGE_SUFFIX}@ -void * -rosidl_typesupport_introspection_c_@('__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))__event_message__create( - const rosidl_service_introspection_info_t * info, - rcutils_allocator_t * allocator, - const void * request_message, - const void * response_message, - bool enable_message_payload) -{ - @event_type * event_msg = (@event_type *)(allocator->allocate(sizeof(@event_type), allocator->state)); - if (!@(event_type)__init(event_msg)) { - allocator->deallocate(event_msg, allocator->state); - return NULL; - } - - event_msg->info.event_type = info->event_type; - event_msg->info.sequence_number = info->sequence_number; - event_msg->info.stamp.sec = info->stamp_sec; - event_msg->info.stamp.nanosec = info->stamp_nanosec; - for (size_t i = 0; i < 16; ++i) { - event_msg->info.client_id.uuid[i] = info->client_id[i]; - } - - if (!enable_message_payload) { - return event_msg; - } - - if (request_message) { - event_msg->response.capacity = 1; - event_msg->response.size = 1; - event_msg->response.data = (@response_type *)(allocator->allocate(sizeof(@response_type), allocator->state)); - if (!@(response_type)__copy((const @response_type *)(response_message), &event_msg->response.data[0])) { - allocator->deallocate(event_msg, allocator->state); - return NULL; - } - } - if (response_message) { - event_msg->request.capacity = 1; - event_msg->request.size = 1; - event_msg->request.data = (@request_type *)(allocator->allocate(sizeof(@request_type), allocator->state)); - if (!@(request_type)__copy((const @request_type *)(request_message), &event_msg->request.data[0])) { - allocator->deallocate(event_msg, allocator->state); - return NULL; - } - } - return event_msg; -} - -bool -rosidl_typesupport_introspection_c_@('__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))__event_message__destroy( - void * event_msg, - rcutils_allocator_t * allocator) -{ - if (NULL == event_msg) { - return false; - } - @event_type * _event_msg = (@event_type *)(event_msg); - - @(event_type)__fini((@event_type *)(_event_msg)); - if (_event_msg->request.data) { - allocator->deallocate(_event_msg->request.data, allocator->state); - } - if (_event_msg->response.data) { - allocator->deallocate(_event_msg->response.data, allocator->state); - } - allocator->deallocate(_event_msg, allocator->state); - return true; -} - static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle = { 0, &@(function_prefix)__@(service.namespaced_type.name)_service_members, get_service_typesupport_handle_function, - rosidl_typesupport_introspection_c_@('__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))__event_message__create, - rosidl_typesupport_introspection_c_@('__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))__event_message__destroy, + ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( + rosidl_typesupport_c, + @(',\n '.join(service.namespaced_type.namespaced_name())) + ), + ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_DESTROY_EVENT_MESSAGE_SYMBOL_NAME( + rosidl_typesupport_c, + @(',\n '.join(service.namespaced_type.namespaced_name())) + ), &@(message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_EVENT_MESSAGE_SUFFIX)_message_type_support_handle, }; // rcl_interfaces__srv__GetParameters_Event__rosidl_typesupport_introspection_c__GetParameters_Event_message_type_support_handle From 99607eed030d913344ae3900ecb6a245547ceac9 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Tue, 15 Nov 2022 17:20:09 -0300 Subject: [PATCH 41/54] Create only one create/destroy service event function for all cpp typesupports Signed-off-by: Ivan Santiago Paunovic --- ...dl_generator_cpp_generate_interfaces.cmake | 2 + .../resource/idl__typesupport.hpp.em | 51 ++++++++++++++++ .../resource/srv__typesupport.hpp.em | 55 +++++++++++++++++ .../rosidl_generator_cpp/__init__.py | 1 + .../service_type_support.hpp | 13 ++++ .../resource/srv__type_support.cpp.em | 61 +------------------ 6 files changed, 125 insertions(+), 58 deletions(-) create mode 100644 rosidl_generator_cpp/resource/idl__typesupport.hpp.em create mode 100644 rosidl_generator_cpp/resource/srv__typesupport.hpp.em diff --git a/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake b/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake index 9e8f9f546..1faa80b46 100644 --- a/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake +++ b/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake @@ -52,12 +52,14 @@ set(target_dependencies "${rosidl_generator_cpp_TEMPLATE_DIR}/idl__builder.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/idl__struct.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/idl__traits.hpp.em" + "${rosidl_generator_cpp_TEMPLATE_DIR}/idl__typesupport.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/msg__builder.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/msg__struct.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/msg__traits.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/srv__builder.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/srv__struct.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/srv__traits.hpp.em" + "${rosidl_generator_cpp_TEMPLATE_DIR}/srv__typesupport.hpp.em" ${rosidl_generate_interfaces_ABS_IDL_FILES} ${_dependency_files}) foreach(dep ${target_dependencies}) diff --git a/rosidl_generator_cpp/resource/idl__typesupport.hpp.em b/rosidl_generator_cpp/resource/idl__typesupport.hpp.em new file mode 100644 index 000000000..ae7c25704 --- /dev/null +++ b/rosidl_generator_cpp/resource/idl__typesupport.hpp.em @@ -0,0 +1,51 @@ +// generated from rosidl_generator_cpp/resource/idl__typesupport.hpp.em +// with input from @(package_name):@(interface_path) +// generated code does not contain a copyright notice +@ +@####################################################################### +@# EmPy template for generating __typesupport.hpp files +@# +@# Context: +@# - package_name (string) +@# - interface_path (Path relative to the directory named after the package) +@# - content (IdlContent, list of elements, e.g. Messages or Services) +@####################################################################### +@{ +from rosidl_pycommon import convert_camel_case_to_lower_case_underscore +include_parts = [package_name] + list(interface_path.parents[0].parts) + [ + 'detail', convert_camel_case_to_lower_case_underscore(interface_path.stem)] +include_base = '/'.join(include_parts) + +header_guard_variable = '__'.join([x.upper() for x in include_parts]) + \ + '__TYPESUPPORT_HPP_' + +include_directives = set() + +include_directives = { + 'rosidl_typesupport_cpp/service_type_support.hpp', + include_base + '__struct.hpp'} +}@ + +#ifndef @(header_guard_variable) +#define @(header_guard_variable) + +@[for header_file in include_directives]@ +#include "@(header_file)" +@[end for]@ + +@####################################################################### +@# Handle service +@####################################################################### +@{ +from rosidl_parser.definition import Service +}@ +@[for service in content.get_elements_of_type(Service)]@ + @{ +TEMPLATE( + 'srv__typesupport.hpp.em', + package_name=package_name, interface_path=interface_path, service=service, + include_directives=include_directives) +}@ +@[end for]@ + +#endif // @(header_guard_variable) diff --git a/rosidl_generator_cpp/resource/srv__typesupport.hpp.em b/rosidl_generator_cpp/resource/srv__typesupport.hpp.em new file mode 100644 index 000000000..9e3039984 --- /dev/null +++ b/rosidl_generator_cpp/resource/srv__typesupport.hpp.em @@ -0,0 +1,55 @@ +@# Included from rosidl_generator_c/resource/srv__type_support.hpp.em + +template +void * service_create_event_message( + const rosidl_service_introspection_info_t * info, + rcutils_allocator_t * allocator, + const void * request_message, + const void * response_message, + bool enable_message_payload) +{ + if (nullptr == info) { + throw std::invalid_argument("service introspection info struct cannot be null"); + } + if (nullptr == allocator) { + throw std::invalid_argument("allocator cannot be null"); + } + auto * event_msg = static_cast(allocator->allocate(sizeof(typename T::Event), allocator->state)); + if (nullptr == event_msg) { + throw std::invalid_argument("allocation failed for service event message"); + } + event_msg = new(event_msg) typename T::Event(); + + event_msg->info.set__event_type(info->event_type); + event_msg->info.set__sequence_number(info->sequence_number); + event_msg->info.stamp.set__sec(info->stamp_sec); + event_msg->info.stamp.set__nanosec(info->stamp_nanosec); + + std::array client_id; + std::move(std::begin(info->client_id), std::end(info->client_id), client_id.begin()); + event_msg->info.client_id.set__uuid(client_id); + + // TODO(jacobperron): consider removing this argument and let users pass nullptr for both request and response messages + if (!enable_message_payload) { + return event_msg; + } + if (nullptr != request_message) { + event_msg->request.push_back(*static_cast(request_message)); + } + if (nullptr != response_message) { + event_msg->response.push_back(*static_cast(response_message)); + } + return event_msg; +} + +template +bool service_destroy_event_message( + void * event_msg, + rcutils_allocator_t * allocator) +{ + auto * event_msg_ = static_cast(event_msg); + using EventT = typename T::Event; + event_msg_->~EventT(); + allocator->deallocate(event_msg, allocator->state); + return true; +} diff --git a/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py b/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py index 9ea047290..506de5ff7 100644 --- a/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py +++ b/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py @@ -34,6 +34,7 @@ def generate_cpp(generator_arguments_file): 'idl__builder.hpp.em': 'detail/%s__builder.hpp', 'idl__struct.hpp.em': 'detail/%s__struct.hpp', 'idl__traits.hpp.em': 'detail/%s__traits.hpp', + 'idl__typesupport.hpp.em': 'detail/%s__typesupport.hpp', } return generate_files( generator_arguments_file, mapping, diff --git a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp index d0fc4e58e..331089a17 100644 --- a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp +++ b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp @@ -24,6 +24,19 @@ namespace rosidl_typesupport_cpp template const rosidl_service_type_support_t * get_service_type_support_handle(); +template +void * service_create_event_message( + const rosidl_service_introspection_info_t * info, + rcutils_allocator_t * allocator, + const void * request_message, + const void * response_message, + bool enable_message_payload); + +template +bool service_destroy_event_message( + void * event_msg, + rcutils_allocator_t * allocator); + } // namespace rosidl_typesupport_cpp #endif // ROSIDL_TYPESUPPORT_CPP__SERVICE_TYPE_SUPPORT_HPP_ diff --git a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em index 2f0493af5..0cfb18699 100644 --- a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em @@ -36,6 +36,7 @@ header_files = [ 'rosidl_typesupport_interface/macros.h', 'rosidl_typesupport_introspection_cpp/visibility_control.h', include_base + '__struct.hpp', + include_base + '__typesupport.hpp', 'rosidl_typesupport_introspection_cpp/identifier.hpp', 'rosidl_typesupport_introspection_cpp/message_type_support_decl.hpp', 'rosidl_typesupport_introspection_cpp/service_introspection.hpp', @@ -71,68 +72,12 @@ static ::rosidl_typesupport_introspection_cpp::ServiceMembers @(service.namespac nullptr, // event message }; -@{ -event_type = '::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_EVENT_MESSAGE_SUFFIX}@ -void * -rosidl_typesupport_introspection_cpp_@('_'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_event_message_create( - const rosidl_service_introspection_info_t * info, - rcutils_allocator_t * allocator, - const void * request_message, - const void * response_message, - bool enable_message_payload) -{ - if (nullptr == info) { - throw std::invalid_argument("service introspection info struct cannot be null"); - } - if (nullptr == allocator) { - throw std::invalid_argument("allocator cannot be null"); - } - auto * event_msg = static_cast<@event_type *>(allocator->allocate(sizeof(@event_type), allocator->state)); - if (nullptr == event_msg) { - throw std::invalid_argument("allocation failed for service event message"); - } - event_msg = new(event_msg) @(event_type)(); - - event_msg->info.set__event_type(info->event_type); - event_msg->info.set__sequence_number(info->sequence_number); - event_msg->info.stamp.set__sec(info->stamp_sec); - event_msg->info.stamp.set__nanosec(info->stamp_nanosec); - - std::array client_id; - std::move(std::begin(info->client_id), std::end(info->client_id), client_id.begin()); - event_msg->info.client_id.set__uuid(client_id); - - // TODO(jacobperron): consider removing this argument and let users pass nullptr for both request and response messages - if (!enable_message_payload) { - return event_msg; - } - if (nullptr != request_message) { - event_msg->request.push_back(*static_cast(request_message)); - } - if (nullptr != response_message) { - event_msg->response.push_back(*static_cast(response_message)); - } - - return event_msg; -} - -bool -rosidl_typesupport_introspection_cpp_@('_'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_event_message_destroy( - void * event_msg, - rcutils_allocator_t * allocator) -{ - auto * event_msg_ = static_cast<@event_type *>(event_msg); - event_msg_->~@(service.namespaced_type.name)_Event(); - allocator->deallocate(event_msg, allocator->state); - return true; -} - static const rosidl_service_type_support_t @(service.namespaced_type.name)_service_type_support_handle = { ::rosidl_typesupport_introspection_cpp::typesupport_identifier, &@(service.namespaced_type.name)_service_members, get_service_typesupport_handle_function, - rosidl_typesupport_introspection_cpp_@('_'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_event_message_create, - rosidl_typesupport_introspection_cpp_@('_'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_event_message_destroy, + &service_create_event_message<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))>, + &service_destroy_event_message<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))>, ::rosidl_typesupport_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_Event>(), }; From 81e768f52fdbb77b6b67bfa35352d53136f062ab Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Wed, 16 Nov 2022 10:57:00 -0300 Subject: [PATCH 42/54] Remove enable_message_payload from create service event message signature Signed-off-by: Ivan Santiago Paunovic --- rosidl_generator_c/resource/srv__type_support.c.em | 8 +------- rosidl_generator_c/resource/srv__type_support.h.em | 3 +-- rosidl_generator_cpp/resource/srv__typesupport.hpp.em | 7 +------ .../rosidl_runtime_c/service_type_support_struct.h | 3 +-- .../rosidl_typesupport_cpp/service_type_support.hpp | 3 +-- 5 files changed, 5 insertions(+), 19 deletions(-) diff --git a/rosidl_generator_c/resource/srv__type_support.c.em b/rosidl_generator_c/resource/srv__type_support.c.em index 5028f9fbe..76fe447e2 100644 --- a/rosidl_generator_c/resource/srv__type_support.c.em +++ b/rosidl_generator_c/resource/srv__type_support.c.em @@ -17,8 +17,7 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, const void * request_message, - const void * response_message, - bool enable_message_payload) + const void * response_message) { @event_type * event_msg = (@event_type *)(allocator->allocate(sizeof(@event_type), allocator->state)); if (!@(event_type)__init(event_msg)) { @@ -33,11 +32,6 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( for (size_t i = 0; i < 16; ++i) { event_msg->info.client_id.uuid[i] = info->client_id[i]; } - - if (!enable_message_payload) { - return event_msg; - } - if (request_message) { event_msg->response.capacity = 1; event_msg->response.size = 1; diff --git a/rosidl_generator_c/resource/srv__type_support.h.em b/rosidl_generator_c/resource/srv__type_support.h.em index f2140b404..af2621cfc 100644 --- a/rosidl_generator_c/resource/srv__type_support.h.em +++ b/rosidl_generator_c/resource/srv__type_support.h.em @@ -47,8 +47,7 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, const void * request_message, - const void * response_message, - bool enable_message_payload); + const void * response_message); // Forward declare the function to destroy a service event message for this type. ROSIDL_GENERATOR_C_PUBLIC_@(package_name) diff --git a/rosidl_generator_cpp/resource/srv__typesupport.hpp.em b/rosidl_generator_cpp/resource/srv__typesupport.hpp.em index 9e3039984..cea6f9887 100644 --- a/rosidl_generator_cpp/resource/srv__typesupport.hpp.em +++ b/rosidl_generator_cpp/resource/srv__typesupport.hpp.em @@ -5,8 +5,7 @@ void * service_create_event_message( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, const void * request_message, - const void * response_message, - bool enable_message_payload) + const void * response_message) { if (nullptr == info) { throw std::invalid_argument("service introspection info struct cannot be null"); @@ -29,10 +28,6 @@ void * service_create_event_message( std::move(std::begin(info->client_id), std::end(info->client_id), client_id.begin()); event_msg->info.client_id.set__uuid(client_id); - // TODO(jacobperron): consider removing this argument and let users pass nullptr for both request and response messages - if (!enable_message_payload) { - return event_msg; - } if (nullptr != request_message) { event_msg->request.push_back(*static_cast(request_message)); } diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index 158e029a3..318135b7b 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -59,8 +59,7 @@ typedef void * (* rosidl_event_message_create_handle)( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, const void * request_message, - const void * response_message, - bool enable_message_payload); + const void * response_message); /// Destroys a ServiceEvent message /** diff --git a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp index 331089a17..01aea5e41 100644 --- a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp +++ b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp @@ -29,8 +29,7 @@ void * service_create_event_message( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, const void * request_message, - const void * response_message, - bool enable_message_payload); + const void * response_message); template bool service_destroy_event_message( From 0649944f14473595ae6fe82f2a0933c0f327a177 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Thu, 17 Nov 2022 10:56:17 -0300 Subject: [PATCH 43/54] fixes Signed-off-by: Ivan Santiago Paunovic --- ...sidl_generator_c_generate_interfaces.cmake | 1 + .../resource/action__type_support.c.em | 14 +++++ .../resource/idl__type_support.c.em | 15 ++++++ rosidl_generator_c/resource/msg__struct.h.em | 2 +- ...dl_generator_cpp_generate_interfaces.cmake | 2 - .../resource/idl__typesupport.hpp.em | 51 ------------------- .../resource/msg__struct.hpp.em | 2 +- .../resource/msg__traits.hpp.em | 2 +- .../resource/srv__typesupport.hpp.em | 50 ------------------ .../rosidl_generator_cpp/__init__.py | 1 - .../service_type_support.hpp | 41 ++++++++++++++- .../resource/srv__type_support.cpp.em | 6 +-- 12 files changed, 74 insertions(+), 113 deletions(-) create mode 100644 rosidl_generator_c/resource/action__type_support.c.em delete mode 100644 rosidl_generator_cpp/resource/idl__typesupport.hpp.em delete mode 100644 rosidl_generator_cpp/resource/srv__typesupport.hpp.em diff --git a/rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake b/rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake index e10aa97fc..11652ea9b 100644 --- a/rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake +++ b/rosidl_generator_c/cmake/rosidl_generator_c_generate_interfaces.cmake @@ -53,6 +53,7 @@ set(target_dependencies "${rosidl_generator_c_BIN}" ${rosidl_generator_c_GENERATOR_FILES} "${rosidl_generator_c_TEMPLATE_DIR}/action__type_support.h.em" + "${rosidl_generator_c_TEMPLATE_DIR}/action__type_support.c.em" "${rosidl_generator_c_TEMPLATE_DIR}/idl.h.em" "${rosidl_generator_c_TEMPLATE_DIR}/idl__functions.c.em" "${rosidl_generator_c_TEMPLATE_DIR}/idl__functions.h.em" diff --git a/rosidl_generator_c/resource/action__type_support.c.em b/rosidl_generator_c/resource/action__type_support.c.em new file mode 100644 index 000000000..7255649d6 --- /dev/null +++ b/rosidl_generator_c/resource/action__type_support.c.em @@ -0,0 +1,14 @@ +@# Included from rosidl_generator_c/resource/idl__type_support.c.em +@{ +TEMPLATE( + 'srv__type_support.c.em', + package_name=package_name, service=action.send_goal_service, + interface_path=interface_path, include_directives=include_directives) +}@ + +@{ +TEMPLATE( + 'srv__type_support.c.em', + package_name=package_name, service=action.get_result_service, + interface_path=interface_path, include_directives=include_directives) +}@ diff --git a/rosidl_generator_c/resource/idl__type_support.c.em b/rosidl_generator_c/resource/idl__type_support.c.em index 14d75c7a3..bff611ee9 100644 --- a/rosidl_generator_c/resource/idl__type_support.c.em +++ b/rosidl_generator_c/resource/idl__type_support.c.em @@ -47,7 +47,22 @@ TEMPLATE( }@ @[end for]@ +@ +@####################################################################### +@# Handle action +@####################################################################### +@{ +from rosidl_parser.definition import Action +}@ +@[for action in content.get_elements_of_type(Action)]@ +@{ +TEMPLATE( + 'action__type_support.c.em', + package_name=package_name, action=action, + interface_path=interface_path, include_directives=include_directives) +}@ +@[end for]@ #ifdef __cplusplus } #endif diff --git a/rosidl_generator_c/resource/msg__struct.h.em b/rosidl_generator_c/resource/msg__struct.h.em index 9425298fd..f0b99e166 100644 --- a/rosidl_generator_c/resource/msg__struct.h.em +++ b/rosidl_generator_c/resource/msg__struct.h.em @@ -46,7 +46,7 @@ for member in message.structure.members: member_names.append(member.name) elif isinstance(type_, NamespacedType): if ( - message.structure.namespaced_type.namespaces[-1] == 'srv' and ( + message.structure.namespaced_type.namespaces[-1] in ['action', 'srv'] and ( type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX)) ): diff --git a/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake b/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake index 1faa80b46..9e8f9f546 100644 --- a/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake +++ b/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake @@ -52,14 +52,12 @@ set(target_dependencies "${rosidl_generator_cpp_TEMPLATE_DIR}/idl__builder.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/idl__struct.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/idl__traits.hpp.em" - "${rosidl_generator_cpp_TEMPLATE_DIR}/idl__typesupport.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/msg__builder.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/msg__struct.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/msg__traits.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/srv__builder.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/srv__struct.hpp.em" "${rosidl_generator_cpp_TEMPLATE_DIR}/srv__traits.hpp.em" - "${rosidl_generator_cpp_TEMPLATE_DIR}/srv__typesupport.hpp.em" ${rosidl_generate_interfaces_ABS_IDL_FILES} ${_dependency_files}) foreach(dep ${target_dependencies}) diff --git a/rosidl_generator_cpp/resource/idl__typesupport.hpp.em b/rosidl_generator_cpp/resource/idl__typesupport.hpp.em deleted file mode 100644 index ae7c25704..000000000 --- a/rosidl_generator_cpp/resource/idl__typesupport.hpp.em +++ /dev/null @@ -1,51 +0,0 @@ -// generated from rosidl_generator_cpp/resource/idl__typesupport.hpp.em -// with input from @(package_name):@(interface_path) -// generated code does not contain a copyright notice -@ -@####################################################################### -@# EmPy template for generating __typesupport.hpp files -@# -@# Context: -@# - package_name (string) -@# - interface_path (Path relative to the directory named after the package) -@# - content (IdlContent, list of elements, e.g. Messages or Services) -@####################################################################### -@{ -from rosidl_pycommon import convert_camel_case_to_lower_case_underscore -include_parts = [package_name] + list(interface_path.parents[0].parts) + [ - 'detail', convert_camel_case_to_lower_case_underscore(interface_path.stem)] -include_base = '/'.join(include_parts) - -header_guard_variable = '__'.join([x.upper() for x in include_parts]) + \ - '__TYPESUPPORT_HPP_' - -include_directives = set() - -include_directives = { - 'rosidl_typesupport_cpp/service_type_support.hpp', - include_base + '__struct.hpp'} -}@ - -#ifndef @(header_guard_variable) -#define @(header_guard_variable) - -@[for header_file in include_directives]@ -#include "@(header_file)" -@[end for]@ - -@####################################################################### -@# Handle service -@####################################################################### -@{ -from rosidl_parser.definition import Service -}@ -@[for service in content.get_elements_of_type(Service)]@ - @{ -TEMPLATE( - 'srv__typesupport.hpp.em', - package_name=package_name, interface_path=interface_path, service=service, - include_directives=include_directives) -}@ -@[end for]@ - -#endif // @(header_guard_variable) diff --git a/rosidl_generator_cpp/resource/msg__struct.hpp.em b/rosidl_generator_cpp/resource/msg__struct.hpp.em index 928d11231..02097f15e 100644 --- a/rosidl_generator_cpp/resource/msg__struct.hpp.em +++ b/rosidl_generator_cpp/resource/msg__struct.hpp.em @@ -40,7 +40,7 @@ for member in message.structure.members: type_ = type_.value_type if isinstance(type_, NamespacedType): if ( - message.structure.namespaced_type.namespaces[-1] == 'srv' and ( + message.structure.namespaced_type.namespaces[-1] in ['action', 'srv'] and ( type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX)) ): diff --git a/rosidl_generator_cpp/resource/msg__traits.hpp.em b/rosidl_generator_cpp/resource/msg__traits.hpp.em index bba806eb6..7381f2869 100644 --- a/rosidl_generator_cpp/resource/msg__traits.hpp.em +++ b/rosidl_generator_cpp/resource/msg__traits.hpp.em @@ -31,7 +31,7 @@ for member in message.structure.members: type_ = type_.value_type if isinstance(type_, NamespacedType): if ( - message.structure.namespaced_type.namespaces[-1] == 'srv' and ( + message.structure.namespaced_type.namespaces[-1] in ['action', 'srv'] and ( type_.name.endswith(SERVICE_REQUEST_MESSAGE_SUFFIX) or type_.name.endswith(SERVICE_RESPONSE_MESSAGE_SUFFIX)) ): diff --git a/rosidl_generator_cpp/resource/srv__typesupport.hpp.em b/rosidl_generator_cpp/resource/srv__typesupport.hpp.em deleted file mode 100644 index cea6f9887..000000000 --- a/rosidl_generator_cpp/resource/srv__typesupport.hpp.em +++ /dev/null @@ -1,50 +0,0 @@ -@# Included from rosidl_generator_c/resource/srv__type_support.hpp.em - -template -void * service_create_event_message( - const rosidl_service_introspection_info_t * info, - rcutils_allocator_t * allocator, - const void * request_message, - const void * response_message) -{ - if (nullptr == info) { - throw std::invalid_argument("service introspection info struct cannot be null"); - } - if (nullptr == allocator) { - throw std::invalid_argument("allocator cannot be null"); - } - auto * event_msg = static_cast(allocator->allocate(sizeof(typename T::Event), allocator->state)); - if (nullptr == event_msg) { - throw std::invalid_argument("allocation failed for service event message"); - } - event_msg = new(event_msg) typename T::Event(); - - event_msg->info.set__event_type(info->event_type); - event_msg->info.set__sequence_number(info->sequence_number); - event_msg->info.stamp.set__sec(info->stamp_sec); - event_msg->info.stamp.set__nanosec(info->stamp_nanosec); - - std::array client_id; - std::move(std::begin(info->client_id), std::end(info->client_id), client_id.begin()); - event_msg->info.client_id.set__uuid(client_id); - - if (nullptr != request_message) { - event_msg->request.push_back(*static_cast(request_message)); - } - if (nullptr != response_message) { - event_msg->response.push_back(*static_cast(response_message)); - } - return event_msg; -} - -template -bool service_destroy_event_message( - void * event_msg, - rcutils_allocator_t * allocator) -{ - auto * event_msg_ = static_cast(event_msg); - using EventT = typename T::Event; - event_msg_->~EventT(); - allocator->deallocate(event_msg, allocator->state); - return true; -} diff --git a/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py b/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py index 506de5ff7..9ea047290 100644 --- a/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py +++ b/rosidl_generator_cpp/rosidl_generator_cpp/__init__.py @@ -34,7 +34,6 @@ def generate_cpp(generator_arguments_file): 'idl__builder.hpp.em': 'detail/%s__builder.hpp', 'idl__struct.hpp.em': 'detail/%s__struct.hpp', 'idl__traits.hpp.em': 'detail/%s__traits.hpp', - 'idl__typesupport.hpp.em': 'detail/%s__typesupport.hpp', } return generate_files( generator_arguments_file, mapping, diff --git a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp index 01aea5e41..01fba9afb 100644 --- a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp +++ b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp @@ -29,12 +29,49 @@ void * service_create_event_message( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, const void * request_message, - const void * response_message); + const void * response_message) +{ + if (nullptr == info) { + throw std::invalid_argument("service introspection info struct cannot be null"); + } + if (nullptr == allocator) { + throw std::invalid_argument("allocator cannot be null"); + } + auto * event_msg = static_cast(allocator->allocate(sizeof(typename T::Event), allocator->state)); + if (nullptr == event_msg) { + throw std::invalid_argument("allocation failed for service event message"); + } + event_msg = new(event_msg) typename T::Event(); + + event_msg->info.set__event_type(info->event_type); + event_msg->info.set__sequence_number(info->sequence_number); + event_msg->info.stamp.set__sec(info->stamp_sec); + event_msg->info.stamp.set__nanosec(info->stamp_nanosec); + + std::array client_id; + std::move(std::begin(info->client_id), std::end(info->client_id), client_id.begin()); + event_msg->info.client_id.set__uuid(client_id); + + if (nullptr != request_message) { + event_msg->request.push_back(*static_cast(request_message)); + } + if (nullptr != response_message) { + event_msg->response.push_back(*static_cast(response_message)); + } + return event_msg; +} template bool service_destroy_event_message( void * event_msg, - rcutils_allocator_t * allocator); + rcutils_allocator_t * allocator) +{ + auto * event_msg_ = static_cast(event_msg); + using EventT = typename T::Event; + event_msg_->~EventT(); + allocator->deallocate(event_msg, allocator->state); + return true; +} } // namespace rosidl_typesupport_cpp diff --git a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em index 0cfb18699..b137d0b79 100644 --- a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em @@ -30,13 +30,11 @@ include_parts = [package_name] + list(interface_path.parents[0].parts) + [ include_base = '/'.join(include_parts) header_files = [ - 'rosidl_runtime_c/service_type_support_struct.h', 'rosidl_typesupport_cpp/message_type_support.hpp', 'rosidl_typesupport_cpp/service_type_support.hpp', 'rosidl_typesupport_interface/macros.h', 'rosidl_typesupport_introspection_cpp/visibility_control.h', include_base + '__struct.hpp', - include_base + '__typesupport.hpp', 'rosidl_typesupport_introspection_cpp/identifier.hpp', 'rosidl_typesupport_introspection_cpp/message_type_support_decl.hpp', 'rosidl_typesupport_introspection_cpp/service_introspection.hpp', @@ -76,8 +74,8 @@ static const rosidl_service_type_support_t @(service.namespaced_type.name)_servi ::rosidl_typesupport_introspection_cpp::typesupport_identifier, &@(service.namespaced_type.name)_service_members, get_service_typesupport_handle_function, - &service_create_event_message<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))>, - &service_destroy_event_message<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))>, + &::rosidl_typesupport_cpp::service_create_event_message<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))>, + &::rosidl_typesupport_cpp::service_destroy_event_message<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))>, ::rosidl_typesupport_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_Event>(), }; From ec537d76671abd23d75ea45191a3693508a214a1 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Thu, 17 Nov 2022 15:21:53 -0300 Subject: [PATCH 44/54] Add missing includes Signed-off-by: Ivan Santiago Paunovic --- .../include/rosidl_typesupport_cpp/service_type_support.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp index 01fba9afb..94e5009d7 100644 --- a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp +++ b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp @@ -15,6 +15,10 @@ #ifndef ROSIDL_TYPESUPPORT_CPP__SERVICE_TYPE_SUPPORT_HPP_ #define ROSIDL_TYPESUPPORT_CPP__SERVICE_TYPE_SUPPORT_HPP_ +#include +#include +#include + #include #include From 11e4f8b550969e47fd374a4e6fdc4df87b9ff923 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Thu, 17 Nov 2022 15:26:43 -0300 Subject: [PATCH 45/54] Include name Signed-off-by: Ivan Santiago Paunovic --- .../include/rosidl_typesupport_cpp/service_type_support.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp index 94e5009d7..152f913ba 100644 --- a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp +++ b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp @@ -17,7 +17,7 @@ #include #include -#include +#include #include #include From d5f40ef57b749d7c76f2363beb2b33b4246a5165 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Fri, 18 Nov 2022 18:47:57 -0300 Subject: [PATCH 46/54] Fix Signed-off-by: Ivan Santiago Paunovic --- .../resource/srv__type_support.cpp.em | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em index b137d0b79..bce36658a 100644 --- a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em @@ -76,7 +76,7 @@ static const rosidl_service_type_support_t @(service.namespaced_type.name)_servi get_service_typesupport_handle_function, &::rosidl_typesupport_cpp::service_create_event_message<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))>, &::rosidl_typesupport_cpp::service_destroy_event_message<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))>, - ::rosidl_typesupport_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_Event>(), + ::rosidl_typesupport_introspection_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))_Event>(), }; } // namespace rosidl_typesupport_introspection_cpp From 785c3a17e76fd030b6c87fcb5dc243c61fa05c8d Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Tue, 6 Dec 2022 18:09:24 -0300 Subject: [PATCH 47/54] please linters Signed-off-by: Ivan Santiago Paunovic --- rosidl_generator_c/resource/srv__type_support.c.em | 1 - .../resource/srv__type_support.c.em | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/rosidl_generator_c/resource/srv__type_support.c.em b/rosidl_generator_c/resource/srv__type_support.c.em index 76fe447e2..365994b1e 100644 --- a/rosidl_generator_c/resource/srv__type_support.c.em +++ b/rosidl_generator_c/resource/srv__type_support.c.em @@ -8,7 +8,6 @@ event_type = '__'.join([package_name, *interface_path.parents[0].parts, service. request_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_REQUEST_MESSAGE_SUFFIX response_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_RESPONSE_MESSAGE_SUFFIX } - void * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( rosidl_typesupport_c, diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 70a220b31..99f143de2 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -73,11 +73,11 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty get_service_typesupport_handle_function, ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( rosidl_typesupport_c, - @(',\n '.join(service.namespaced_type.namespaced_name())) + @(',\n '.join(service.namespaced_type.namespaced_name())) ), ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_DESTROY_EVENT_MESSAGE_SYMBOL_NAME( rosidl_typesupport_c, - @(',\n '.join(service.namespaced_type.namespaced_name())) + @(',\n '.join(service.namespaced_type.namespaced_name())) ), &@(message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_EVENT_MESSAGE_SUFFIX)_message_type_support_handle, }; From 84299e5ef5625c55067ec54e60a662280d62b26e Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Tue, 13 Dec 2022 11:53:29 -0300 Subject: [PATCH 48/54] Avoid signed unsigned comparison Signed-off-by: Ivan Santiago Paunovic --- .../rosidl_generator_cpp/test_srv_initialization.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp b/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp index 6041abd2d..fa0ce5701 100644 --- a/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp +++ b/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp @@ -61,14 +61,14 @@ TEST(Test_srv_initialization, no_arg_event_constructor) { rosidl_generator_tests::srv::Empty::Event empty; rosidl_generator_tests::srv::BasicTypes::Event basic_types; - EXPECT_EQ(basic_types.info.event_type, 0); + EXPECT_EQ(basic_types.info.event_type, 0u); EXPECT_EQ(basic_types.info.stamp.sec, 0); - EXPECT_EQ(basic_types.info.stamp.nanosec, 0); + EXPECT_EQ(basic_types.info.stamp.nanosec, 0u); for (auto i : basic_types.info.client_id.uuid) { - EXPECT_EQ(i, 0U); + EXPECT_EQ(i, 0u); } - EXPECT_EQ(basic_types.request.size(), 0); - EXPECT_EQ(basic_types.response.size(), 0); + EXPECT_EQ(basic_types.request.size(), 0u); + EXPECT_EQ(basic_types.response.size(), 0u); } // Note that we very specifically don't add tests for some of the other // possibilities here (bounded strings, bounded / unbounded arrays, other From e842886582103ee5d39321e03f9cb0cc9c8dabce Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Wed, 14 Dec 2022 10:08:53 -0300 Subject: [PATCH 49/54] Complete implementation Signed-off-by: Ivan Santiago Paunovic --- .../resource/srv__type_support.c.em | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 99f143de2..9aef33112 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -114,6 +114,11 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspecti (const rosidl_typesupport_introspection_c__MessageMembers *) ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_RESPONSE_MESSAGE_SUFFIX))()->data; } + if (!service_members->event_members_) { + service_members->event_members_ = + (const rosidl_typesupport_introspection_c__MessageMembers *) + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_introspection_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.namespaced_type.name + SERVICE_EVENT_MESSAGE_SUFFIX))()->data; + } return &@(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle; } From 937858380d6718452adedeaadbb000e7e34db658 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Wed, 14 Dec 2022 16:57:16 -0300 Subject: [PATCH 50/54] Fix rosidl_runtime_cpp linters Signed-off-by: Ivan Santiago Paunovic --- .../rosidl_typesupport_cpp/service_type_support.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp index 152f913ba..2f8d645e1 100644 --- a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp +++ b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp @@ -19,8 +19,8 @@ #include #include -#include -#include +#include "rosidl_runtime_c/service_type_support_struct.h" +#include "rosidl_runtime_c/visibility_control.h" namespace rosidl_typesupport_cpp { @@ -41,7 +41,8 @@ void * service_create_event_message( if (nullptr == allocator) { throw std::invalid_argument("allocator cannot be null"); } - auto * event_msg = static_cast(allocator->allocate(sizeof(typename T::Event), allocator->state)); + auto * event_msg = static_cast( + allocator->allocate(sizeof(typename T::Event), allocator->state)); if (nullptr == event_msg) { throw std::invalid_argument("allocation failed for service event message"); } From b3edf00c3aacc8b577f3785341bebf59f439395b Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Fri, 23 Dec 2022 14:43:06 -0300 Subject: [PATCH 51/54] Address peer review comments Signed-off-by: Ivan Santiago Paunovic --- .../rosidl_runtime_c/service_type_support_struct.h | 11 +++++------ .../resource/srv__type_support.c.em | 2 -- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index 318135b7b..c73774797 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -48,14 +48,13 @@ typedef struct rosidl_service_introspection_info_s * The message is allocated using the given allocator and must be deallocated using * the rosidl_service_introspection_destroy_handle * - * \param[in] POD fields of service_msgs/msg/ServiceEventInfo to be passed from rcl + * \param[in] info POD fields of service_msgs/msg/ServiceEventInfo to be passed from rcl * \param[in] allocator The allocator to use for allocating the ServiceEvent message * \param[in] request_message type-erased handle to request message from rcl. Can be NULL. * \param[in] response_message type-erased handle to request message from rcl. Can be NULL. - * \param[in] enable_message_payload Whether to enable message payloads in the ServiceEvent message * \return The built ServiceEvent message. Will return NULL if the message could not be built. **/ -typedef void * (* rosidl_event_message_create_handle)( +typedef void * (* rosidl_event_message_create_handle_function_function)( const rosidl_service_introspection_info_t * info, rcutils_allocator_t * allocator, const void * request_message, @@ -69,7 +68,7 @@ typedef void * (* rosidl_event_message_create_handle)( * \param[in] event_message The message to destroy. * \param[in] allocator The allocator to use for deallocating the message. */ -typedef bool (* rosidl_event_message_destroy_handle)( +typedef bool (* rosidl_event_message_destroy_handle_function_function)( void * event_message, rcutils_allocator_t * allocator); @@ -83,9 +82,9 @@ struct rosidl_service_type_support_t /// Pointer to the service type support handler function rosidl_service_typesupport_handle_function func; /// Pointer to function to create the introspection message - rosidl_event_message_create_handle event_message_create_handle; + rosidl_event_message_create_handle_function_function event_message_create_handle_function; /// Pointer to function to finalize the introspection message - rosidl_event_message_destroy_handle event_message_destroy_handle; + rosidl_event_message_destroy_handle_function_function event_message_destroy_handle_function; /// Service event message typesupport const rosidl_message_type_support_t * event_typesupport; }; diff --git a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em index 9aef33112..1158d9f50 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -81,8 +81,6 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty ), &@(message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_EVENT_MESSAGE_SUFFIX)_message_type_support_handle, }; -// rcl_interfaces__srv__GetParameters_Event__rosidl_typesupport_introspection_c__GetParameters_Event_message_type_support_handle -// rcl_interfaces__srv__detail__get_parameters__rosidl_typesupport_introspection_c__GetParameters_Event_message_type_support_handle, // Forward declaration of request/response type support functions const rosidl_message_type_support_t * From a3712caa63cf6e7d063d021b2f1b0d541f72a9d7 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Fri, 23 Dec 2022 18:32:23 -0300 Subject: [PATCH 52/54] Fixes after adding tests for rosidl_typesupport_c in rosidl_typesupport_tests Signed-off-by: Ivan Santiago Paunovic --- .../resource/srv__type_support.c.em | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/rosidl_generator_c/resource/srv__type_support.c.em b/rosidl_generator_c/resource/srv__type_support.c.em index 365994b1e..4f7885e69 100644 --- a/rosidl_generator_c/resource/srv__type_support.c.em +++ b/rosidl_generator_c/resource/srv__type_support.c.em @@ -18,6 +18,9 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( const void * request_message, const void * response_message) { + if (!allocator || !info) { + return NULL; + } @event_type * event_msg = (@event_type *)(allocator->allocate(sizeof(@event_type), allocator->state)); if (!@(event_type)__init(event_msg)) { allocator->deallocate(event_msg, allocator->state); @@ -32,23 +35,24 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( event_msg->info.client_id.uuid[i] = info->client_id[i]; } if (request_message) { - event_msg->response.capacity = 1; - event_msg->response.size = 1; - event_msg->response.data = (@response_type *)(allocator->allocate(sizeof(@response_type), allocator->state)); - if (!@(response_type)__copy((const @response_type *)(response_message), &event_msg->response.data[0])) { + @(request_type)__Sequence__init( + &event_msg->request, + 1); + if (!@(request_type)__copy((const @request_type *)(request_message), event_msg->request.data)) { allocator->deallocate(event_msg, allocator->state); return NULL; } } if (response_message) { - event_msg->request.capacity = 1; - event_msg->request.size = 1; - event_msg->request.data = (@request_type *)(allocator->allocate(sizeof(@request_type), allocator->state)); - if (!@(request_type)__copy((const @request_type *)(request_message), &event_msg->request.data[0])) { + @(response_type)__Sequence__init( + &event_msg->response, + 1); + if (!@(response_type)__copy((const @response_type *)(response_message), event_msg->response.data)) { allocator->deallocate(event_msg, allocator->state); return NULL; } } + fprintf(stderr, "request message return!!\n"); return event_msg; } @@ -61,6 +65,9 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_DESTROY_EVENT_MESSAGE_SYMBOL_NAME( void * event_msg, rcutils_allocator_t * allocator) { + if (!allocator) { + return false; + } if (NULL == event_msg) { return false; } From 00b37847c9303328bad722deea09c456a79a00d9 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Fri, 23 Dec 2022 18:33:03 -0300 Subject: [PATCH 53/54] Remove debug message Signed-off-by: Ivan Santiago Paunovic --- rosidl_generator_c/resource/srv__type_support.c.em | 1 - 1 file changed, 1 deletion(-) diff --git a/rosidl_generator_c/resource/srv__type_support.c.em b/rosidl_generator_c/resource/srv__type_support.c.em index 4f7885e69..61615b425 100644 --- a/rosidl_generator_c/resource/srv__type_support.c.em +++ b/rosidl_generator_c/resource/srv__type_support.c.em @@ -52,7 +52,6 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( return NULL; } } - fprintf(stderr, "request message return!!\n"); return event_msg; } From 01beadaf060b03fce5c0e9323d3774d5522692d0 Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Wed, 25 Jan 2023 17:55:31 +0000 Subject: [PATCH 54/54] Switch to a client_gid. That is more correct, as this should not be a UUID. Signed-off-by: Chris Lalancette --- rosidl_generator_c/resource/idl__type_support.c.em | 2 ++ rosidl_generator_c/resource/srv__type_support.c.em | 4 +--- .../test/rosidl_generator_cpp/test_srv_initialization.cpp | 2 +- .../include/rosidl_runtime_c/service_type_support_struct.h | 2 +- .../rosidl_typesupport_cpp/service_type_support.hpp | 7 ++----- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/rosidl_generator_c/resource/idl__type_support.c.em b/rosidl_generator_c/resource/idl__type_support.c.em index bff611ee9..77128406b 100644 --- a/rosidl_generator_c/resource/idl__type_support.c.em +++ b/rosidl_generator_c/resource/idl__type_support.c.em @@ -23,6 +23,8 @@ include_directives = { include_base + '__functions.h'} }@ +#include + @[for header_file in include_directives]@ #include "@(header_file)" @[end for]@ diff --git a/rosidl_generator_c/resource/srv__type_support.c.em b/rosidl_generator_c/resource/srv__type_support.c.em index 61615b425..92bb4ae50 100644 --- a/rosidl_generator_c/resource/srv__type_support.c.em +++ b/rosidl_generator_c/resource/srv__type_support.c.em @@ -31,9 +31,7 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( event_msg->info.sequence_number = info->sequence_number; event_msg->info.stamp.sec = info->stamp_sec; event_msg->info.stamp.nanosec = info->stamp_nanosec; - for (size_t i = 0; i < 16; ++i) { - event_msg->info.client_id.uuid[i] = info->client_id[i]; - } + memcpy(event_msg->info.client_gid, info->client_gid, 16); if (request_message) { @(request_type)__Sequence__init( &event_msg->request, diff --git a/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp b/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp index fa0ce5701..f4cbdd366 100644 --- a/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp +++ b/rosidl_generator_tests/test/rosidl_generator_cpp/test_srv_initialization.cpp @@ -64,7 +64,7 @@ TEST(Test_srv_initialization, no_arg_event_constructor) { EXPECT_EQ(basic_types.info.event_type, 0u); EXPECT_EQ(basic_types.info.stamp.sec, 0); EXPECT_EQ(basic_types.info.stamp.nanosec, 0u); - for (auto i : basic_types.info.client_id.uuid) { + for (auto i : basic_types.info.client_gid) { EXPECT_EQ(i, 0u); } EXPECT_EQ(basic_types.request.size(), 0u); diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h index c73774797..2039d819c 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/service_type_support_struct.h @@ -38,7 +38,7 @@ typedef struct rosidl_service_introspection_info_s uint8_t event_type; int32_t stamp_sec; uint32_t stamp_nanosec; - uint32_t client_id[16]; + uint8_t client_gid[16]; int64_t sequence_number; } rosidl_service_introspection_info_t; diff --git a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp index 2f8d645e1..2931b8736 100644 --- a/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp +++ b/rosidl_runtime_cpp/include/rosidl_typesupport_cpp/service_type_support.hpp @@ -15,9 +15,8 @@ #ifndef ROSIDL_TYPESUPPORT_CPP__SERVICE_TYPE_SUPPORT_HPP_ #define ROSIDL_TYPESUPPORT_CPP__SERVICE_TYPE_SUPPORT_HPP_ -#include +#include #include -#include #include "rosidl_runtime_c/service_type_support_struct.h" #include "rosidl_runtime_c/visibility_control.h" @@ -53,9 +52,7 @@ void * service_create_event_message( event_msg->info.stamp.set__sec(info->stamp_sec); event_msg->info.stamp.set__nanosec(info->stamp_nanosec); - std::array client_id; - std::move(std::begin(info->client_id), std::end(info->client_id), client_id.begin()); - event_msg->info.client_id.set__uuid(client_id); + std::memcpy(&event_msg->info.client_gid[0], info->client_gid, 16); if (nullptr != request_message) { event_msg->request.push_back(*static_cast(request_message));