From 9dea631202d4c4b57b9c48560f0eef7001990ce2 Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Tue, 21 Mar 2023 19:30:24 -0700 Subject: [PATCH 1/7] Expose type hash on typesupports Signed-off-by: Emerson Knapp --- .../action_type_support_struct.h | 3 ++ .../message_type_support_struct.h | 3 ++ .../service_type_support_struct.h | 3 ++ .../message_introspection.h | 2 -- .../service_introspection.h | 3 ++ .../resource/msg__type_support.c.em | 3 +- .../resource/srv__type_support.c.em | 32 +++++++++---------- .../message_introspection.hpp | 2 -- .../service_introspection.hpp | 3 ++ .../resource/msg__type_support.cpp.em | 2 +- 10 files changed, 34 insertions(+), 22 deletions(-) diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/action_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/action_type_support_struct.h index 801a771ed..34fd23674 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/action_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/action_type_support_struct.h @@ -17,6 +17,7 @@ #include "rosidl_runtime_c/message_type_support_struct.h" #include "rosidl_runtime_c/service_type_support_struct.h" +#include "rosidl_runtime_c/type_hash.h" #include "rosidl_runtime_c/visibility_control.h" #include "rosidl_typesupport_interface/macros.h" @@ -38,6 +39,8 @@ struct rosidl_action_type_support_t const rosidl_service_type_support_t * cancel_service_type_support; const rosidl_message_type_support_t * feedback_message_type_support; const rosidl_message_type_support_t * status_message_type_support; + /// Hash of the action's description + const rosidl_type_hash_t * type_hash; }; /// Get the action type support given a provided action and package. diff --git a/rosidl_runtime_c/include/rosidl_runtime_c/message_type_support_struct.h b/rosidl_runtime_c/include/rosidl_runtime_c/message_type_support_struct.h index c587e673b..5628732f1 100644 --- a/rosidl_runtime_c/include/rosidl_runtime_c/message_type_support_struct.h +++ b/rosidl_runtime_c/include/rosidl_runtime_c/message_type_support_struct.h @@ -15,6 +15,7 @@ #ifndef ROSIDL_RUNTIME_C__MESSAGE_TYPE_SUPPORT_STRUCT_H_ #define ROSIDL_RUNTIME_C__MESSAGE_TYPE_SUPPORT_STRUCT_H_ +#include "rosidl_runtime_c/type_hash.h" #include "rosidl_runtime_c/visibility_control.h" #include "rosidl_typesupport_interface/macros.h" @@ -37,6 +38,8 @@ struct rosidl_message_type_support_t const void * data; /// Pointer to the message type support handler function rosidl_message_typesupport_handle_function func; + /// Hash of the message's description + const rosidl_type_hash_t * type_hash; }; /// Get the message type support handle specific to this identifier. 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 2039d819c..aaabce8eb 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 @@ -19,6 +19,7 @@ #include "rcutils/allocator.h" #include "rosidl_runtime_c/message_type_support_struct.h" +#include "rosidl_runtime_c/type_hash.h" #include "rosidl_runtime_c/visibility_control.h" #include "rosidl_typesupport_interface/macros.h" @@ -87,6 +88,8 @@ struct rosidl_service_type_support_t rosidl_event_message_destroy_handle_function_function event_message_destroy_handle_function; /// Service event message typesupport const rosidl_message_type_support_t * event_typesupport; + /// Hash of the service's description + const rosidl_type_hash_t * type_hash; }; /// Get the service type support handle specific to this identifier. diff --git a/rosidl_typesupport_introspection_c/include/rosidl_typesupport_introspection_c/message_introspection.h b/rosidl_typesupport_introspection_c/include/rosidl_typesupport_introspection_c/message_introspection.h index 12fc4811a..0d16e5923 100644 --- a/rosidl_typesupport_introspection_c/include/rosidl_typesupport_introspection_c/message_introspection.h +++ b/rosidl_typesupport_introspection_c/include/rosidl_typesupport_introspection_c/message_introspection.h @@ -86,8 +86,6 @@ typedef struct rosidl_typesupport_introspection_c__MessageMembers_s const char * message_namespace_; /// The name of the interface, e.g. "Int16" const char * message_name_; - /// Hashed value of the interface description - const rosidl_type_hash_t type_hash_; /// The number of fields in the interface uint32_t member_count_; /// The size of the interface structure in memory 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 ea57dffd6..6f6a1095d 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 @@ -33,10 +33,13 @@ typedef struct rosidl_typesupport_introspection_c__ServiceMembers_s /// The name of the service, e.g. "AddTwoInts" const char * service_name_; /// A pointer to the introspection information structure for the request interface. + const rosidl_message_type_support_t * request_type_support_; const rosidl_typesupport_introspection_c__MessageMembers * request_members_; /// A pointer to the introspection information structure for the response interface. + const rosidl_message_type_support_t * response_type_support_; const rosidl_typesupport_introspection_c__MessageMembers * response_members_; /// A pointer to the introspection information structure for the event interface. + const rosidl_message_type_support_t * event_type_support_; const rosidl_typesupport_introspection_c__MessageMembers * event_members_; } rosidl_typesupport_introspection_c__ServiceMembers; diff --git a/rosidl_typesupport_introspection_c/resource/msg__type_support.c.em b/rosidl_typesupport_introspection_c/resource/msg__type_support.c.em index 1e8beda4f..9b87d94f7 100644 --- a/rosidl_typesupport_introspection_c/resource/msg__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/msg__type_support.c.em @@ -2,6 +2,7 @@ @{ from rosidl_pycommon import convert_camel_case_to_lower_case_underscore from rosidl_generator_c import idl_structure_type_to_c_include_prefix +from rosidl_generator_c import idl_structure_type_to_c_typename from rosidl_parser.definition import AbstractGenericString from rosidl_parser.definition import AbstractNestedType from rosidl_parser.definition import AbstractSequence @@ -270,7 +271,6 @@ for index, member in enumerate(message.structure.members): static const rosidl_typesupport_introspection_c__MessageMembers @(function_prefix)__@(message.structure.namespaced_type.name)_message_members = { "@('__'.join([package_name] + list(interface_path.parents[0].parts)))", // message namespace "@(message.structure.namespaced_type.name)", // message name - @('__'.join(message.structure.namespaced_type.namespaced_name()))__TYPE_VERSION_HASH__INIT, @(len(message.structure.members)), // number of fields sizeof(@('__'.join([package_name] + list(interface_path.parents[0].parts) + [message.structure.namespaced_type.name]))), @(function_prefix)__@(message.structure.namespaced_type.name)_message_member_array, // message members @@ -284,6 +284,7 @@ static rosidl_message_type_support_t @(function_prefix)__@(message.structure.nam 0, &@(function_prefix)__@(message.structure.namespaced_type.name)_message_members, get_message_typesupport_handle_function, + &@(idl_structure_type_to_c_typename(message.structure.namespaced_type))__TYPE_VERSION_HASH, }; ROSIDL_TYPESUPPORT_INTROSPECTION_C_EXPORT_@(package_name) 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 1158d9f50..ac443cfae 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -54,13 +54,13 @@ function_prefix = '__'.join(include_parts) + '__rosidl_typesupport_introspection static rosidl_typesupport_introspection_c__ServiceMembers @(function_prefix)__@(service.namespaced_type.name)_service_members = { "@('__'.join([package_name] + list(interface_path.parents[0].parts)))", // service namespace "@(service.namespaced_type.name)", // service name - // 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 - // @(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 + // these fields are initialized below on the first access + NULL, // request type support + NULL, // request members + NULL, // response type support + NULL, // response members + NULL, // event type support + NULL, // event_message }; @{event_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_EVENT_MESSAGE_SUFFIX}@ @@ -103,19 +103,19 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspecti (rosidl_typesupport_introspection_c__ServiceMembers *)@(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle.data; 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; + service_members->request_type_support_ = + 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))(); + service_members->request_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *)service_members->request_type_support_->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; + service_members->response_type_support_ = + 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))(); + service_members->response_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *)service_members->response_type_support_->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; + service_members->event_type_support_ = + 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))(); + service_members->event_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *)service_members->event_type_support_->data; } return &@(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle; diff --git a/rosidl_typesupport_introspection_cpp/include/rosidl_typesupport_introspection_cpp/message_introspection.hpp b/rosidl_typesupport_introspection_cpp/include/rosidl_typesupport_introspection_cpp/message_introspection.hpp index cc60501f8..6c01c2ce8 100644 --- a/rosidl_typesupport_introspection_cpp/include/rosidl_typesupport_introspection_cpp/message_introspection.hpp +++ b/rosidl_typesupport_introspection_cpp/include/rosidl_typesupport_introspection_cpp/message_introspection.hpp @@ -93,8 +93,6 @@ typedef struct ROSIDL_TYPESUPPORT_INTROSPECTION_CPP_PUBLIC MessageMembers_s const char * message_namespace_; /// The name of the interface, e.g. "Int16" const char * message_name_; - /// Hashed value of the interface description - const rosidl_type_hash_t type_hash_; /// The number of fields in the interface uint32_t member_count_; /// The size of the interface structure in memory 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 cad7e04e8..87f513492 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 @@ -36,10 +36,13 @@ typedef struct ServiceMembers_s /// The name of the service, e.g. "AddTwoInts" const char * service_name_; /// A pointer to the introspection information structure for the request interface. + const rosidl_message_type_support_t * request_type_support_; const MessageMembers * request_members_; /// A pointer to the introspection information structure for the response interface. + const rosidl_message_type_support_t * response_type_support_; const MessageMembers * response_members_; /// A pointer to the introspection information structure for the event interface. + const rosidl_message_type_support_t * event_type_support_; const MessageMembers * event_members_; } ServiceMembers; diff --git a/rosidl_typesupport_introspection_cpp/resource/msg__type_support.cpp.em b/rosidl_typesupport_introspection_cpp/resource/msg__type_support.cpp.em index 7c1cc636b..c492a7c5d 100644 --- a/rosidl_typesupport_introspection_cpp/resource/msg__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/msg__type_support.cpp.em @@ -235,7 +235,6 @@ for index, member in enumerate(message.structure.members): static const ::rosidl_typesupport_introspection_cpp::MessageMembers @(message.structure.namespaced_type.name)_message_members = { "@('::'.join([package_name] + list(interface_path.parents[0].parts)))", // message namespace "@(message.structure.namespaced_type.name)", // message name - @('::'.join(message.structure.namespaced_type.namespaced_name()))::TYPE_VERSION_HASH, @(len(message.structure.members)), // number of fields sizeof(@('::'.join([package_name] + list(interface_path.parents[0].parts) + [message.structure.namespaced_type.name]))), @(message.structure.namespaced_type.name)_message_member_array, // message members @@ -247,6 +246,7 @@ static const rosidl_message_type_support_t @(message.structure.namespaced_type.n ::rosidl_typesupport_introspection_cpp::typesupport_identifier, &@(message.structure.namespaced_type.name)_message_members, get_message_typesupport_handle_function, + &@('::'.join(message.structure.namespaced_type.namespaced_name()))::TYPE_VERSION_HASH, }; } // namespace rosidl_typesupport_introspection_cpp From 4c61b25032ea0dde193c0e1de95c66e2d406d2e3 Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Tue, 21 Mar 2023 22:25:09 -0700 Subject: [PATCH 2/7] Change TYPE_VERSION_HASH to TYPE_HASH, fix variable inlining Signed-off-by: Emerson Knapp --- rosidl_generator_c/resource/idl__struct.h.em | 20 +++++-------------- rosidl_generator_c/resource/msg__struct.h.em | 8 +++----- .../resource/srv__type_support.c.em | 4 ++-- ...dl_generator_cpp_generate_interfaces.cmake | 1 + .../resource/action__struct.hpp.em | 3 ++- .../resource/msg__struct.hpp.em | 6 +++--- .../resource/srv__struct.hpp.em | 15 ++++++++++---- rosidl_generator_type_description/README.md | 2 +- .../__init__.py | 3 +++ .../service_type_support_struct.h | 4 ++++ .../resource/msg__type_support.c.em | 3 ++- .../resource/srv__type_support.c.em | 16 +++++++++++---- .../resource/msg__type_support.cpp.em | 3 ++- .../resource/srv__type_support.cpp.em | 10 +++++++--- 14 files changed, 58 insertions(+), 40 deletions(-) diff --git a/rosidl_generator_c/resource/idl__struct.h.em b/rosidl_generator_c/resource/idl__struct.h.em index 9d6b2d1c4..701a94923 100644 --- a/rosidl_generator_c/resource/idl__struct.h.em +++ b/rosidl_generator_c/resource/idl__struct.h.em @@ -13,6 +13,7 @@ @{ from rosidl_generator_c import idl_structure_type_to_c_typename from rosidl_generator_c import type_hash_to_c_definition +from rosidl_generator_type_description import TYPE_HASH_VAR 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)] @@ -60,10 +61,7 @@ from rosidl_parser.definition import Service }@ @[for service in content.get_elements_of_type(Service)]@ -@{ hash_var = idl_structure_type_to_c_typename(service.namespaced_type) + '__TYPE_VERSION_HASH' }@ -// Note: this define is for MSVC, where the static const var can't be used in downstream aggregate initializers -#define @(hash_var)__INIT @(type_hash_to_c_definition(type_hash['service'], line_final_backslash=True)) -static const rosidl_type_hash_t @(hash_var) = @(hash_var)__INIT; +static const rosidl_type_hash_t @(idl_structure_type_to_c_typename(service.namespaced_type))__@(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['service'])); @{ TEMPLATE( @@ -99,9 +97,7 @@ from rosidl_parser.definition import Action }@ @[for action in content.get_elements_of_type(Action)]@ -@{ hash_var = idl_structure_type_to_c_typename(action.namespaced_type) + '__TYPE_VERSION_HASH' }@ -#define @(hash_var)__INIT @(type_hash_to_c_definition(type_hash['action'], line_final_backslash=True)) -static const rosidl_type_hash_t @(hash_var) = @(hash_var)__INIT; +static const rosidl_type_hash_t @(idl_structure_type_to_c_typename(action.namespaced_type))__@(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['action'])); @{ TEMPLATE( @@ -127,10 +123,7 @@ TEMPLATE( type_hash=type_hash['feedback']) }@ -@{ hash_var = idl_structure_type_to_c_typename(action.send_goal_service.namespaced_type) + '__TYPE_VERSION_HASH' }@ -// Note: this define is for MSVC, where the static const var can't be used in downstream aggregate initializers -#define @(hash_var)__INIT @(type_hash_to_c_definition(type_hash['send_goal_service']['service'], line_final_backslash=True)) -static const rosidl_type_hash_t @(hash_var) = @(hash_var)__INIT; +static const rosidl_type_hash_t @(idl_structure_type_to_c_typename(action.send_goal_service.namespaced_type))__@(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['send_goal_service']['service'])); @{ TEMPLATE( @@ -156,10 +149,7 @@ TEMPLATE( type_hash=type_hash['send_goal_service']['event_message']) }@ -@{ hash_var = idl_structure_type_to_c_typename(action.get_result_service.namespaced_type) + '__TYPE_VERSION_HASH' }@ -// Note: this define is for MSVC, where the static const var can't be used in downstream aggregate initializers -#define @(hash_var)__INIT @(type_hash_to_c_definition(type_hash['get_result_service']['service'], line_final_backslash=True)) -static const rosidl_type_hash_t @(hash_var) = @(hash_var)__INIT; +static const rosidl_type_hash_t @(idl_structure_type_to_c_typename(action.get_result_service.namespaced_type))__@(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['get_result_service']['service'])); @{ TEMPLATE( diff --git a/rosidl_generator_c/resource/msg__struct.h.em b/rosidl_generator_c/resource/msg__struct.h.em index e75077af9..838eababf 100644 --- a/rosidl_generator_c/resource/msg__struct.h.em +++ b/rosidl_generator_c/resource/msg__struct.h.em @@ -23,6 +23,7 @@ from rosidl_generator_c import idl_structure_type_to_c_typename from rosidl_generator_c import interface_path_to_string from rosidl_generator_c import type_hash_to_c_definition from rosidl_generator_c import value_to_c +from rosidl_generator_type_description import TYPE_HASH_VAR }@ @#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @# Collect necessary include directives for all members @@ -63,11 +64,8 @@ for member in message.structure.members: @#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> @#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -// Type Version Hash for interface -@{ hash_var = idl_structure_type_to_c_typename(message.structure.namespaced_type) + '__TYPE_VERSION_HASH' }@ -// Note: this define is for MSVC, where the static const var can't be used in downstream aggregate initializers -#define @(hash_var)__INIT @(type_hash_to_c_definition(type_hash['message'], line_final_backslash=True)) -static const rosidl_type_hash_t @(hash_var) = @(hash_var)__INIT; +// Type Hash for interface +static const rosidl_type_hash_t @(idl_structure_type_to_c_typename(message.structure.namespaced_type))__@(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['message'])); // Constants defined in the message @[for constant in message.constants]@ diff --git a/rosidl_generator_c/resource/srv__type_support.c.em b/rosidl_generator_c/resource/srv__type_support.c.em index 92bb4ae50..c3228a98d 100644 --- a/rosidl_generator_c/resource/srv__type_support.c.em +++ b/rosidl_generator_c/resource/srv__type_support.c.em @@ -1,9 +1,9 @@ @# 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_EVENT_MESSAGE_SUFFIX from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX -from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX +from rosidl_pycommon import convert_camel_case_to_lower_case_underscore 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 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 526ce76c2..151d54cf5 100644 --- a/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake +++ b/rosidl_generator_cpp/cmake/rosidl_generator_cpp_generate_interfaces.cmake @@ -106,6 +106,7 @@ add_dependencies( set(_target_suffix "__rosidl_generator_cpp") add_library(${rosidl_generate_interfaces_TARGET}${_target_suffix} INTERFACE) +target_compile_features(${rosidl_generate_interfaces_TARGET}${_target_suffix} INTERFACE cxx_std_17) add_library(${PROJECT_NAME}::${rosidl_generate_interfaces_TARGET}${_target_suffix} ALIAS ${rosidl_generate_interfaces_TARGET}${_target_suffix}) target_include_directories(${rosidl_generate_interfaces_TARGET}${_target_suffix} diff --git a/rosidl_generator_cpp/resource/action__struct.hpp.em b/rosidl_generator_cpp/resource/action__struct.hpp.em index 9c89bbdc8..cea7d4dec 100644 --- a/rosidl_generator_cpp/resource/action__struct.hpp.em +++ b/rosidl_generator_cpp/resource/action__struct.hpp.em @@ -1,6 +1,7 @@ @# Included from rosidl_generator_cpp/resource/idl__struct.hpp.em @{ from rosidl_generator_c import type_hash_to_c_definition +from rosidl_generator_type_description import TYPE_HASH_VAR from rosidl_parser.definition import ACTION_FEEDBACK_MESSAGE_SUFFIX from rosidl_parser.definition import ACTION_FEEDBACK_SUFFIX from rosidl_parser.definition import ACTION_GOAL_SERVICE_SUFFIX @@ -79,7 +80,7 @@ namespace @(ns) @[end for]@ struct @(action.namespaced_type.name) { - static constexpr const rosidl_type_hash_t TYPE_VERSION_HASH = @(type_hash_to_c_definition(type_hash['action'])); + static constexpr const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['action'])); /// The goal message defined in the action definition. using Goal = @(action_name)@(ACTION_GOAL_SUFFIX); diff --git a/rosidl_generator_cpp/resource/msg__struct.hpp.em b/rosidl_generator_cpp/resource/msg__struct.hpp.em index e66a922d3..5c10bc6d4 100644 --- a/rosidl_generator_cpp/resource/msg__struct.hpp.em +++ b/rosidl_generator_cpp/resource/msg__struct.hpp.em @@ -6,6 +6,7 @@ from rosidl_generator_cpp import escape_string from rosidl_generator_cpp import escape_wstring from rosidl_generator_cpp import msg_type_to_cpp from rosidl_generator_cpp import MSG_TYPE_TO_CPP +from rosidl_generator_type_description import TYPE_HASH_VAR from rosidl_parser.definition import AbstractNestedType from rosidl_parser.definition import AbstractString from rosidl_parser.definition import AbstractWString @@ -102,8 +103,7 @@ struct @(message.structure.namespaced_type.name)_ { using Type = @(message.structure.namespaced_type.name)_; - // Type Version Hash for interface - constexpr static const rosidl_type_hash_t TYPE_VERSION_HASH = @(type_hash_to_c_definition(type_hash['message'])); + constexpr static const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['message'])); @{ # The creation of the constructors for messages is a bit complicated. The goal @@ -362,7 +362,7 @@ using @(message.structure.namespaced_type.name) = @(message_typename)_>; template -constexpr const rosidl_type_hash_t @(message.structure.namespaced_type.name)_::TYPE_VERSION_HASH; +constexpr const rosidl_type_hash_t @(message.structure.namespaced_type.name)_::@(TYPE_HASH_VAR); // constant definitions @[for c in message.constants]@ diff --git a/rosidl_generator_cpp/resource/srv__struct.hpp.em b/rosidl_generator_cpp/resource/srv__struct.hpp.em index 54bc65993..d2ff85e03 100644 --- a/rosidl_generator_cpp/resource/srv__struct.hpp.em +++ b/rosidl_generator_cpp/resource/srv__struct.hpp.em @@ -1,6 +1,10 @@ @# Included from rosidl_generator_cpp/resource/idl__struct.hpp.em @{ from rosidl_generator_c import type_hash_to_c_definition +from rosidl_generator_type_description import TYPE_HASH_VAR +from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX +from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX }@ @{ TEMPLATE( @@ -37,12 +41,15 @@ struct @(service.namespaced_type.name) @{ service_typename = '::'.join(service.namespaced_type.namespaced_name()) }@ - static constexpr const rosidl_type_hash_t TYPE_VERSION_HASH = @(type_hash_to_c_definition(type_hash['service'])); + constexpr static const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['service'])); - using Request = @(service_typename)_Request; - using Response = @(service_typename)_Response; - using Event = @(service_typename)_Event; + using Request = @(service_typename)@(SERVICE_REQUEST_MESSAGE_SUFFIX); + using Response = @(service_typename)@(SERVICE_RESPONSE_MESSAGE_SUFFIX); + using Event = @(service_typename)@(SERVICE_EVENT_MESSAGE_SUFFIX); }; + +// constexpr const rosidl_type_hash_t @(service.namespaced_type.name)::@(TYPE_HASH_VAR); + @ @[for ns in reversed(service.namespaced_type.namespaces)]@ diff --git a/rosidl_generator_type_description/README.md b/rosidl_generator_type_description/README.md index 318d2a05d..4edbf5351 100644 --- a/rosidl_generator_type_description/README.md +++ b/rosidl_generator_type_description/README.md @@ -2,7 +2,7 @@ This generator serializes ROS 2 interface descriptions (message, service, action) to a common format and uses SHA256 to hash that representation into a unique hash for each type. -The SHA256 hashes generated by this package must match those generated by `rcl_calculate_type_version_hash`. The `.json` files generated must, therefore, match the result of `rcl_type_description_to_hashable_json`. +The SHA256 hashes generated by this package must match those generated by `rcl_calculate_type_hash`. The `.json` files generated must, therefore, match the result of `rcl_type_description_to_hashable_json`. ## Generated files diff --git a/rosidl_generator_type_description/rosidl_generator_type_description/__init__.py b/rosidl_generator_type_description/rosidl_generator_type_description/__init__.py index 117a6c951..61f48cc11 100644 --- a/rosidl_generator_type_description/rosidl_generator_type_description/__init__.py +++ b/rosidl_generator_type_description/rosidl_generator_type_description/__init__.py @@ -31,6 +31,9 @@ RIHS01_HASH_VALUE_SIZE = 32 RIHS01_PATTERN = re.compile(r'RIHS([0-9a-f]{2})_([0-9a-f]{64})') +# Used by code generators to create type hash variable names +TYPE_HASH_VAR = 'TYPE_HASH' + def generate_type_hash(generator_arguments_file: str) -> List[str]: with open(generator_arguments_file, 'r') as f: 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 aaabce8eb..b2f4c847f 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 @@ -82,6 +82,10 @@ struct rosidl_service_type_support_t const void * data; /// Pointer to the service type support handler function rosidl_service_typesupport_handle_function func; + /// Service request message typesupport + const rosidl_message_type_support_t * request_typesupport; + /// Service response message typesupport + const rosidl_message_type_support_t * response_typesupport; /// Pointer to function to create the introspection message rosidl_event_message_create_handle_function_function event_message_create_handle_function; /// Pointer to function to finalize the introspection message diff --git a/rosidl_typesupport_introspection_c/resource/msg__type_support.c.em b/rosidl_typesupport_introspection_c/resource/msg__type_support.c.em index 9b87d94f7..a14954a50 100644 --- a/rosidl_typesupport_introspection_c/resource/msg__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/msg__type_support.c.em @@ -3,6 +3,7 @@ from rosidl_pycommon import convert_camel_case_to_lower_case_underscore from rosidl_generator_c import idl_structure_type_to_c_include_prefix from rosidl_generator_c import idl_structure_type_to_c_typename +from rosidl_generator_type_description import TYPE_HASH_VAR from rosidl_parser.definition import AbstractGenericString from rosidl_parser.definition import AbstractNestedType from rosidl_parser.definition import AbstractSequence @@ -284,7 +285,7 @@ static rosidl_message_type_support_t @(function_prefix)__@(message.structure.nam 0, &@(function_prefix)__@(message.structure.namespaced_type.name)_message_members, get_message_typesupport_handle_function, - &@(idl_structure_type_to_c_typename(message.structure.namespaced_type))__TYPE_VERSION_HASH, + &@(idl_structure_type_to_c_typename(message.structure.namespaced_type))__@(TYPE_HASH_VAR), }; ROSIDL_TYPESUPPORT_INTROSPECTION_C_EXPORT_@(package_name) 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 ac443cfae..71c74129b 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -21,10 +21,12 @@ TEMPLATE( }@ @{ -from rosidl_pycommon import convert_camel_case_to_lower_case_underscore +from rosidl_generator_c import idl_structure_type_to_c_typename +from rosidl_generator_type_description import TYPE_HASH_VAR +from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX -from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX +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) @@ -37,7 +39,10 @@ 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' +message_function_prefix = '__'.join([package_name] + list(interface_path.parents[0].parts) + [service.namespaced_type.name]) +request_message_function_prefix = message_function_prefix + f'{SERVICE_REQUEST_MESSAGE_SUFFIX}__rosidl_typesupport_introspection_c' +response_message_function_prefix = message_function_prefix + f'{SERVICE_RESPONSE_MESSAGE_SUFFIX}__rosidl_typesupport_introspection_c' +event_message_function_prefix = message_function_prefix + f'{SERVICE_EVENT_MESSAGE_SUFFIX}__rosidl_typesupport_introspection_c' function_prefix = '__'.join(include_parts) + '__rosidl_typesupport_introspection_c' }@ @[for header_file in header_files]@ @@ -71,6 +76,8 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty 0, &@(function_prefix)__@(service.namespaced_type.name)_service_members, get_service_typesupport_handle_function, + &@(request_message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_REQUEST_MESSAGE_SUFFIX)_message_type_support_handle, + &@(response_message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_RESPONSE_MESSAGE_SUFFIX)_message_type_support_handle, ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( rosidl_typesupport_c, @(',\n '.join(service.namespaced_type.namespaced_name())) @@ -79,7 +86,8 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty 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, + &@(event_message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_EVENT_MESSAGE_SUFFIX)_message_type_support_handle, + &@(idl_structure_type_to_c_typename(service.namespaced_type))__@(TYPE_HASH_VAR), }; // Forward declaration of request/response type support functions diff --git a/rosidl_typesupport_introspection_cpp/resource/msg__type_support.cpp.em b/rosidl_typesupport_introspection_cpp/resource/msg__type_support.cpp.em index c492a7c5d..585c93bb3 100644 --- a/rosidl_typesupport_introspection_cpp/resource/msg__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/msg__type_support.cpp.em @@ -1,5 +1,6 @@ @# Included from rosidl_typesupport_introspection_cpp/resource/idl__type_support.cpp.em @{ +from rosidl_generator_type_description import TYPE_HASH_VAR from rosidl_parser.definition import AbstractGenericString from rosidl_parser.definition import AbstractNestedType from rosidl_parser.definition import AbstractSequence @@ -246,7 +247,7 @@ static const rosidl_message_type_support_t @(message.structure.namespaced_type.n ::rosidl_typesupport_introspection_cpp::typesupport_identifier, &@(message.structure.namespaced_type.name)_message_members, get_message_typesupport_handle_function, - &@('::'.join(message.structure.namespaced_type.namespaced_name()))::TYPE_VERSION_HASH, + &@('::'.join(message.structure.namespaced_type.namespaced_name()))::@(TYPE_HASH_VAR), }; } // 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 bce36658a..7edfbb4ca 100644 --- a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em @@ -21,10 +21,11 @@ TEMPLATE( }@ @{ -from rosidl_pycommon import convert_camel_case_to_lower_case_underscore +from rosidl_generator_type_description import TYPE_HASH_VAR +from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX from rosidl_parser.definition import SERVICE_REQUEST_MESSAGE_SUFFIX from rosidl_parser.definition import SERVICE_RESPONSE_MESSAGE_SUFFIX -from rosidl_parser.definition import SERVICE_EVENT_MESSAGE_SUFFIX +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) @@ -74,9 +75,12 @@ 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, + ::rosidl_typesupport_introspection_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))@(SERVICE_REQUEST_MESSAGE_SUFFIX)>(), + ::rosidl_typesupport_introspection_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))@(SERVICE_RESPONSE_MESSAGE_SUFFIX)>(), &::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_introspection_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]))@(SERVICE_EVENT_MESSAGE_SUFFIX)>(), + &@('::'.join(service.namespaced_type.namespaced_name()))::@(TYPE_HASH_VAR), }; } // namespace rosidl_typesupport_introspection_cpp From 1a8fce43586509799e9d2a00e2e43d32224d10fc Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Tue, 21 Mar 2023 22:37:45 -0700 Subject: [PATCH 3/7] Undo the serviceMembers idea Signed-off-by: Emerson Knapp --- .../resource/srv__struct.hpp.em | 5 +-- .../service_introspection.h | 3 -- .../resource/srv__type_support.c.em | 32 +++++++++---------- .../service_introspection.hpp | 3 -- 4 files changed, 17 insertions(+), 26 deletions(-) diff --git a/rosidl_generator_cpp/resource/srv__struct.hpp.em b/rosidl_generator_cpp/resource/srv__struct.hpp.em index d2ff85e03..3628df24b 100644 --- a/rosidl_generator_cpp/resource/srv__struct.hpp.em +++ b/rosidl_generator_cpp/resource/srv__struct.hpp.em @@ -41,15 +41,12 @@ struct @(service.namespaced_type.name) @{ service_typename = '::'.join(service.namespaced_type.namespaced_name()) }@ - constexpr static const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['service'])); + static constexpr const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['service'])); using Request = @(service_typename)@(SERVICE_REQUEST_MESSAGE_SUFFIX); using Response = @(service_typename)@(SERVICE_RESPONSE_MESSAGE_SUFFIX); using Event = @(service_typename)@(SERVICE_EVENT_MESSAGE_SUFFIX); }; - -// constexpr const rosidl_type_hash_t @(service.namespaced_type.name)::@(TYPE_HASH_VAR); - @ @[for ns in reversed(service.namespaced_type.namespaces)]@ 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 6f6a1095d..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 @@ -33,13 +33,10 @@ typedef struct rosidl_typesupport_introspection_c__ServiceMembers_s /// The name of the service, e.g. "AddTwoInts" const char * service_name_; /// A pointer to the introspection information structure for the request interface. - const rosidl_message_type_support_t * request_type_support_; const rosidl_typesupport_introspection_c__MessageMembers * request_members_; /// A pointer to the introspection information structure for the response interface. - const rosidl_message_type_support_t * response_type_support_; const rosidl_typesupport_introspection_c__MessageMembers * response_members_; /// A pointer to the introspection information structure for the event interface. - const rosidl_message_type_support_t * event_type_support_; const rosidl_typesupport_introspection_c__MessageMembers * event_members_; } rosidl_typesupport_introspection_c__ServiceMembers; 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 71c74129b..3b12525a7 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -59,13 +59,13 @@ function_prefix = '__'.join(include_parts) + '__rosidl_typesupport_introspection static rosidl_typesupport_introspection_c__ServiceMembers @(function_prefix)__@(service.namespaced_type.name)_service_members = { "@('__'.join([package_name] + list(interface_path.parents[0].parts)))", // service namespace "@(service.namespaced_type.name)", // service name - // these fields are initialized below on the first access - NULL, // request type support - NULL, // request members - NULL, // response type support - NULL, // response members - NULL, // event type support - NULL, // event_message + // 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 + // @(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 }; @{event_type = '__'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]) + SERVICE_EVENT_MESSAGE_SUFFIX}@ @@ -111,19 +111,19 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_introspecti (rosidl_typesupport_introspection_c__ServiceMembers *)@(function_prefix)__@(service.namespaced_type.name)_service_type_support_handle.data; if (!service_members->request_members_) { - service_members->request_type_support_ = - 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))(); - service_members->request_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *)service_members->request_type_support_->data; + 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; } if (!service_members->response_members_) { - service_members->response_type_support_ = - 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))(); - service_members->response_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *)service_members->response_type_support_->data; + 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; } if (!service_members->event_members_) { - service_members->event_type_support_ = - 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))(); - service_members->event_members_ = (const rosidl_typesupport_introspection_c__MessageMembers *)service_members->event_type_support_->data; + 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; 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 87f513492..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 @@ -36,13 +36,10 @@ typedef struct ServiceMembers_s /// The name of the service, e.g. "AddTwoInts" const char * service_name_; /// A pointer to the introspection information structure for the request interface. - const rosidl_message_type_support_t * request_type_support_; const MessageMembers * request_members_; /// A pointer to the introspection information structure for the response interface. - const rosidl_message_type_support_t * response_type_support_; const MessageMembers * response_members_; /// A pointer to the introspection information structure for the event interface. - const rosidl_message_type_support_t * event_type_support_; const MessageMembers * event_members_; } ServiceMembers; From 28519cba87b273edf0623d76e4f6ace7a436fbdd Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Tue, 21 Mar 2023 23:48:57 -0700 Subject: [PATCH 4/7] Re-fix hash definition indentation now that not using defines Signed-off-by: Emerson Knapp --- rosidl_generator_c/rosidl_generator_c/__init__.py | 7 +------ rosidl_generator_cpp/resource/action__struct.hpp.em | 2 +- rosidl_generator_cpp/resource/msg__struct.hpp.em | 2 +- rosidl_generator_cpp/resource/srv__struct.hpp.em | 2 +- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/rosidl_generator_c/rosidl_generator_c/__init__.py b/rosidl_generator_c/rosidl_generator_c/__init__.py index 9be5d720e..b9530049a 100644 --- a/rosidl_generator_c/rosidl_generator_c/__init__.py +++ b/rosidl_generator_c/rosidl_generator_c/__init__.py @@ -223,25 +223,20 @@ def escape_wstring(s): return escape_string(s) -def type_hash_to_c_definition(hash_string, *, line_final_backslash=False): +def type_hash_to_c_definition(hash_string, * , indent=2): """Generate empy for rosidl_type_hash_t instance with 8 bytes per line for readability.""" bytes_per_row = 8 rows = 4 assert bytes_per_row * rows == RIHS01_HASH_VALUE_SIZE, 'This function is outdated.' - indent = 4 # Uncrustify prefers this indentation version, value = parse_rihs_string(hash_string) assert version == 1, 'This function only knows how to generate RIHS01 definitions.' result = f'{{{version}, {{' - if line_final_backslash: - result += ' \\' result += '\n' for row in range(rows): result += ' ' * (indent + 1) for i in range(row * bytes_per_row, (row + 1) * bytes_per_row): result += f' 0x{value[i * 2]}{value[i * 2 + 1]},' - if line_final_backslash: - result += ' \\' result += '\n' result += ' ' * indent result += '}}' diff --git a/rosidl_generator_cpp/resource/action__struct.hpp.em b/rosidl_generator_cpp/resource/action__struct.hpp.em index cea7d4dec..efb630496 100644 --- a/rosidl_generator_cpp/resource/action__struct.hpp.em +++ b/rosidl_generator_cpp/resource/action__struct.hpp.em @@ -80,7 +80,7 @@ namespace @(ns) @[end for]@ struct @(action.namespaced_type.name) { - static constexpr const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['action'])); + static constexpr const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['action'], indent=4)); /// The goal message defined in the action definition. using Goal = @(action_name)@(ACTION_GOAL_SUFFIX); diff --git a/rosidl_generator_cpp/resource/msg__struct.hpp.em b/rosidl_generator_cpp/resource/msg__struct.hpp.em index 5c10bc6d4..bea08a923 100644 --- a/rosidl_generator_cpp/resource/msg__struct.hpp.em +++ b/rosidl_generator_cpp/resource/msg__struct.hpp.em @@ -103,7 +103,7 @@ struct @(message.structure.namespaced_type.name)_ { using Type = @(message.structure.namespaced_type.name)_; - constexpr static const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['message'])); + constexpr static const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['message'], indent=4)); @{ # The creation of the constructors for messages is a bit complicated. The goal diff --git a/rosidl_generator_cpp/resource/srv__struct.hpp.em b/rosidl_generator_cpp/resource/srv__struct.hpp.em index 3628df24b..9a1f75644 100644 --- a/rosidl_generator_cpp/resource/srv__struct.hpp.em +++ b/rosidl_generator_cpp/resource/srv__struct.hpp.em @@ -41,7 +41,7 @@ struct @(service.namespaced_type.name) @{ service_typename = '::'.join(service.namespaced_type.namespaced_name()) }@ - static constexpr const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['service'])); + static constexpr const rosidl_type_hash_t @(TYPE_HASH_VAR) = @(type_hash_to_c_definition(type_hash['service'], indent=4)); using Request = @(service_typename)@(SERVICE_REQUEST_MESSAGE_SUFFIX); using Response = @(service_typename)@(SERVICE_RESPONSE_MESSAGE_SUFFIX); From 6fdefcfa6c6d32a89ee044b69dd5f7a1196987c1 Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Wed, 22 Mar 2023 01:24:28 -0700 Subject: [PATCH 5/7] Tweak the separator to match rcl capabilities Signed-off-by: Emerson Knapp --- .../rosidl_generator_type_description/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rosidl_generator_type_description/rosidl_generator_type_description/__init__.py b/rosidl_generator_type_description/rosidl_generator_type_description/__init__.py index 61f48cc11..13fed546e 100644 --- a/rosidl_generator_type_description/rosidl_generator_type_description/__init__.py +++ b/rosidl_generator_type_description/rosidl_generator_type_description/__init__.py @@ -464,7 +464,8 @@ def _calculate_hash_tree(self) -> dict: check_circular=True, allow_nan=False, indent=None, - separators=(',', ': '), + # note: libyaml in C doesn't allow for tweaking these separators, this is its builtin + separators=(', ', ': '), sort_keys=False ) sha = hashlib.sha256() From e4d0b6af443f51303bf3874a853a5c970b06cb30 Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Wed, 22 Mar 2023 12:56:22 -0700 Subject: [PATCH 6/7] Fix flake8 Signed-off-by: Emerson Knapp --- rosidl_generator_c/rosidl_generator_c/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosidl_generator_c/rosidl_generator_c/__init__.py b/rosidl_generator_c/rosidl_generator_c/__init__.py index b9530049a..6fa0cd2cc 100644 --- a/rosidl_generator_c/rosidl_generator_c/__init__.py +++ b/rosidl_generator_c/rosidl_generator_c/__init__.py @@ -223,7 +223,7 @@ def escape_wstring(s): return escape_string(s) -def type_hash_to_c_definition(hash_string, * , indent=2): +def type_hash_to_c_definition(hash_string, *, indent=2): """Generate empy for rosidl_type_hash_t instance with 8 bytes per line for readability.""" bytes_per_row = 8 rows = 4 From 1dcf2f11a1dedb45a1c1f66898684f75dbc52bbf Mon Sep 17 00:00:00 2001 From: Emerson Knapp Date: Thu, 23 Mar 2023 10:05:04 -0700 Subject: [PATCH 7/7] Move service message typesupports together Signed-off-by: Emerson Knapp --- .../include/rosidl_runtime_c/service_type_support_struct.h | 4 ++-- .../resource/srv__type_support.c.em | 2 +- .../resource/srv__type_support.cpp.em | 2 +- 3 files 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 b2f4c847f..21fc79412 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 @@ -86,12 +86,12 @@ struct rosidl_service_type_support_t const rosidl_message_type_support_t * request_typesupport; /// Service response message typesupport const rosidl_message_type_support_t * response_typesupport; + /// Service event message typesupport + const rosidl_message_type_support_t * event_typesupport; /// Pointer to function to create the introspection message 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_function_function event_message_destroy_handle_function; - /// Service event message typesupport - const rosidl_message_type_support_t * event_typesupport; /// Hash of the service's description const rosidl_type_hash_t * type_hash; }; 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 3b12525a7..e21f5b46c 100644 --- a/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em +++ b/rosidl_typesupport_introspection_c/resource/srv__type_support.c.em @@ -78,6 +78,7 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty get_service_typesupport_handle_function, &@(request_message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_REQUEST_MESSAGE_SUFFIX)_message_type_support_handle, &@(response_message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_RESPONSE_MESSAGE_SUFFIX)_message_type_support_handle, + &@(event_message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_EVENT_MESSAGE_SUFFIX)_message_type_support_handle, ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_CREATE_EVENT_MESSAGE_SYMBOL_NAME( rosidl_typesupport_c, @(',\n '.join(service.namespaced_type.namespaced_name())) @@ -86,7 +87,6 @@ static rosidl_service_type_support_t @(function_prefix)__@(service.namespaced_ty rosidl_typesupport_c, @(',\n '.join(service.namespaced_type.namespaced_name())) ), - &@(event_message_function_prefix)__@(service.namespaced_type.name)@(SERVICE_EVENT_MESSAGE_SUFFIX)_message_type_support_handle, &@(idl_structure_type_to_c_typename(service.namespaced_type))__@(TYPE_HASH_VAR), }; 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 7edfbb4ca..c7be2f323 100644 --- a/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_introspection_cpp/resource/srv__type_support.cpp.em @@ -77,9 +77,9 @@ static const rosidl_service_type_support_t @(service.namespaced_type.name)_servi get_service_typesupport_handle_function, ::rosidl_typesupport_introspection_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))@(SERVICE_REQUEST_MESSAGE_SUFFIX)>(), ::rosidl_typesupport_introspection_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))@(SERVICE_RESPONSE_MESSAGE_SUFFIX)>(), + ::rosidl_typesupport_introspection_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))@(SERVICE_EVENT_MESSAGE_SUFFIX)>(), &::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_introspection_cpp::get_message_type_support_handle<@('::'.join([package_name, *interface_path.parents[0].parts, service.namespaced_type.name]))@(SERVICE_EVENT_MESSAGE_SUFFIX)>(), &@('::'.join(service.namespaced_type.namespaced_name()))::@(TYPE_HASH_VAR), };