From 5564014962ed4dd08a7da1d8ada815d89e30940a Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Wed, 28 Nov 2018 14:27:10 -0800 Subject: [PATCH 01/20] Switch C++ type support generation pipeline. --- .../bin/rosidl_typesupport_connext_cpp | 19 +--- ...port_connext_cpp_generate_interfaces.cmake | 104 +++++------------- ...dl_typesupport_connext_cpp-extras.cmake.in | 2 +- .../__init__.py | 97 ++-------------- 4 files changed, 46 insertions(+), 176 deletions(-) diff --git a/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp b/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp index 7652ca8..932f243 100755 --- a/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp +++ b/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp @@ -3,12 +3,10 @@ import argparse import sys -from rosidl_cmake import extract_message_types from rosidl_cmake import read_generator_arguments from rosidl_parser import UnknownMessageType from rosidl_typesupport_connext_cpp import generate_cpp from rosidl_typesupport_connext_cpp import generate_dds_connext_cpp -from rosidl_typesupport_connext_cpp import parse_ros_interface_files def main(argv=sys.argv[1:]): @@ -20,7 +18,7 @@ def main(argv=sys.argv[1:]): required=True, help='The location of the file containing the generator arguments') parser.add_argument( - '--dds-interface-base-path', + '--idl-base-path', required=True, help='The base location of the DDS interface files') parser.add_argument( @@ -31,15 +29,8 @@ def main(argv=sys.argv[1:]): generator_args = read_generator_arguments(args.generator_arguments_file) - message_specs, service_specs = parse_ros_interface_files( - generator_args['package_name'], generator_args['ros_interface_files']) - - known_msg_types = extract_message_types( - generator_args['package_name'], generator_args['ros_interface_files'], - generator_args.get('ros_interface_dependencies', [])) - try: - rc = generate_cpp(generator_args, message_specs, service_specs, known_msg_types) + rc = generate_cpp(args.generator_arguments_file) except UnknownMessageType as e: print(str(e), file=sys.stderr) return 1 @@ -48,12 +39,10 @@ def main(argv=sys.argv[1:]): return generate_dds_connext_cpp( generator_args['package_name'], generator_args.get('additional_files', []), - args.dds_interface_base_path, + args.idl_base_path, generator_args.get('ros_interface_dependencies', []), generator_args['output_dir'], - args.idl_pp, - message_specs, - service_specs, + args.idl_pp ) diff --git a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake index a45b8aa..e25c1c7 100644 --- a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake @@ -12,67 +12,28 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(_ros_idl_files "") -foreach(_idl_file ${rosidl_generate_interfaces_IDL_FILES}) - get_filename_component(_extension "${_idl_file}" EXT) - # Skip .srv files - if(_extension STREQUAL ".msg") - list(APPEND _ros_idl_files "${_idl_file}") - endif() -endforeach() - -rosidl_generate_dds_interfaces( - ${rosidl_generate_interfaces_TARGET}__dds_connext_idl - IDL_FILES ${_ros_idl_files} - DEPENDENCY_PACKAGE_NAMES ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES} - OUTPUT_SUBFOLDERS "dds_connext" -) +set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_cpp/${PROJECT_NAME}") +set(_connext_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_idl/${PROJECT_NAME}") set(_dds_idl_files "") -set(_dds_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_dds_idl") -foreach(_idl_file ${rosidl_generate_interfaces_IDL_FILES}) - get_filename_component(_extension "${_idl_file}" EXT) - if(_extension STREQUAL ".msg") - get_filename_component(_parent_folder "${_idl_file}" DIRECTORY) - get_filename_component(_parent_folder "${_parent_folder}" NAME) - get_filename_component(_name "${_idl_file}" NAME_WE) - list(APPEND _dds_idl_files - "${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_connext/${_name}_.idl") - endif() -endforeach() - -set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_cpp/${PROJECT_NAME}") set(_generated_files "") set(_generated_external_files "") -foreach(_idl_file ${rosidl_generate_interfaces_IDL_FILES}) - get_filename_component(_extension "${_idl_file}" EXT) - get_filename_component(_parent_folder "${_idl_file}" DIRECTORY) +foreach(_idl_tuple ${rosidl_generate_interfaces_IDL_TUPLES}) + # Get full path to idl files + string(REGEX REPLACE ":([^:]*)$" "/\\1" _abs_idl_file "${_idl_tuple}") + get_filename_component(_parent_folder "${_abs_idl_file}" DIRECTORY) get_filename_component(_parent_folder "${_parent_folder}" NAME) - get_filename_component(_msg_name "${_idl_file}" NAME_WE) - string_camel_case_to_lower_case_underscore("${_msg_name}" _header_name) - if(_extension STREQUAL ".msg") - set(_allowed_parent_folders "msg" "srv" "action") - if(NOT _parent_folder IN_LIST _allowed_parent_folders) - message(FATAL_ERROR "Interface file with unknown parent folder: ${_idl_file}") - endif() - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_msg_name}_.h") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_msg_name}_.cxx") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_msg_name}_Plugin.h") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_msg_name}_Plugin.cxx") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_msg_name}_Support.h") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_msg_name}_Support.cxx") - list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_cpp.hpp") - list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext/${_header_name}__type_support.cpp") - elseif(_extension STREQUAL ".srv") - set(_allowed_parent_folders "srv" "action") - if(NOT _parent_folder IN_LIST _allowed_parent_folders) - message(FATAL_ERROR "Interface file with unknown parent folder: ${_idl_file}") - endif() - list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_cpp.hpp") - list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext/${_header_name}__type_support.cpp") - else() - message(FATAL_ERROR "Interface file with unknown extension: ${_idl_file}") - endif() + get_filename_component(_idl_name "${_abs_idl_file}" NAME_WE) + string_camel_case_to_lower_case_underscore("${_idl_name}" _header_name) + list(APPEND _dds_idl_files "${_abs_idl_file}") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.h") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.cxx") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.h") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.cxx") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.h") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.cxx") + list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_cpp.hpp") + list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext/${_header_name}__type_support.cpp") endforeach() # If not on Windows, disable some warnings with Connext's generated code @@ -103,25 +64,21 @@ endif() set(_dependency_files "") set(_dependencies "") foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) - foreach(_idl_file ${${_pkg_name}_INTERFACE_FILES}) - get_filename_component(_extension "${_idl_file}" EXT) - if(_extension STREQUAL ".msg") - get_filename_component(_parent_folder "${_idl_file}" DIRECTORY) - get_filename_component(_parent_folder "${_parent_folder}" NAME) - get_filename_component(_name "${_idl_file}" NAME_WE) - set(_abs_idl_file "${${_pkg_name}_DIR}/../${_parent_folder}/dds_connext/${_name}_.idl") - normalize_path(_abs_idl_file "${_abs_idl_file}") - list(APPEND _dependency_files "${_abs_idl_file}") - set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}") - normalize_path(_abs_idl_file "${_abs_idl_file}") - list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}") - endif() + foreach(_idl_file ${${_pkg_name}_IDL_FILES}) + # ${{_pkg_name}_DIR} is absolute path ending in 'share//cmake', so go back one + # directory for IDL files + set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}") + normalize_path(_abs_idl_file "${_abs_idl_file}") + list(APPEND _dependency_files "${_abs_idl_file}") + list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}") endforeach() endforeach() set(target_dependencies "${rosidl_typesupport_connext_cpp_BIN}" ${rosidl_typesupport_connext_cpp_GENERATOR_FILES} + "${rosidl_typesupport_connext_cpp_TEMPLATE_DIR}/idl__rosidl_typesupport_connext_cpp.hpp.em" + "${rosidl_typesupport_connext_cpp_TEMPLATE_DIR}/idl__dds_connext__type_support.cpp.em" "${rosidl_typesupport_connext_cpp_TEMPLATE_DIR}/msg__rosidl_typesupport_connext_cpp.hpp.em" "${rosidl_typesupport_connext_cpp_TEMPLATE_DIR}/msg__type_support.cpp.em" "${rosidl_typesupport_connext_cpp_TEMPLATE_DIR}/srv__rosidl_typesupport_connext_cpp.hpp.em" @@ -129,10 +86,7 @@ set(target_dependencies ${_dependency_files}) foreach(dep ${target_dependencies}) if(NOT EXISTS "${dep}") - get_property(is_generated SOURCE "${dep}" PROPERTY GENERATED) - if(NOT ${_is_generated}) - message(FATAL_ERROR "Target dependency '${dep}' does not exist") - endif() + message(FATAL_ERROR "Target dependency '${dep}' does not exist") endif() endforeach() @@ -140,7 +94,7 @@ set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_con rosidl_write_generator_arguments( "${generator_arguments_file}" PACKAGE_NAME "${PROJECT_NAME}" - ROS_INTERFACE_FILES "${rosidl_generate_interfaces_IDL_FILES}" + IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}" ROS_INTERFACE_DEPENDENCIES "${_dependencies}" OUTPUT_DIR "${_output_path}" TEMPLATE_DIR "${rosidl_typesupport_connext_cpp_TEMPLATE_DIR}" @@ -158,7 +112,7 @@ add_custom_command( OUTPUT ${_generated_files} ${_generated_external_files} COMMAND ${PYTHON_EXECUTABLE} ${rosidl_typesupport_connext_cpp_BIN} --generator-arguments-file "${generator_arguments_file}" - --dds-interface-base-path "${_dds_idl_base_path}" + --idl-base-path "${_connext_idl_base_path}" --idl-pp "${_idl_pp}" DEPENDS ${target_dependencies} ${_dds_idl_files} COMMENT "Generating C++ type support for RTI Connext (using '${_idl_pp}')" diff --git a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp-extras.cmake.in b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp-extras.cmake.in index c31b555..5deef97 100644 --- a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp-extras.cmake.in +++ b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp-extras.cmake.in @@ -9,7 +9,7 @@ if(NOT Connext_FOUND) else() find_package(ament_cmake_core QUIET REQUIRED) ament_register_extension( - "rosidl_generate_interfaces" + "rosidl_generate_idl_interfaces" "rosidl_typesupport_connext_cpp" "rosidl_typesupport_connext_cpp_generate_interfaces.cmake") diff --git a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py index 70ce221..518c35a 100644 --- a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py +++ b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py @@ -16,31 +16,12 @@ import subprocess import sys -from rosidl_cmake import convert_camel_case_to_lower_case_underscore -from rosidl_cmake import expand_template -from rosidl_cmake import get_newest_modification_time -from rosidl_parser import parse_message_file -from rosidl_parser import parse_service_file -from rosidl_parser import validate_field_types - - -def parse_ros_interface_files(pkg_name, ros_interface_files): - message_specs = [] - service_specs = [] - for idl_file in ros_interface_files: - extension = os.path.splitext(idl_file)[1] - if extension == '.msg': - message_spec = parse_message_file(pkg_name, idl_file) - message_specs.append((idl_file, message_spec)) - elif extension == '.srv': - service_spec = parse_service_file(pkg_name, idl_file) - service_specs.append((idl_file, service_spec)) - return (message_specs, service_specs) - - -def generate_dds_connext_cpp( - pkg_name, dds_interface_files, dds_interface_base_path, deps, - output_basepath, idl_pp, message_specs, service_specs): +from rosidl_cmake import generate_files + + +def generate_dds_connext_cpp(pkg_name, dds_interface_files, + dds_interface_base_path, deps, + output_basepath, idl_pp): include_dirs = [dds_interface_base_path] for dep in deps: @@ -135,66 +116,12 @@ def _modify(filename, pkg_name, msg_name, callback): h.write('\n'.join(lines)) -def generate_cpp(args, message_specs, service_specs, known_msg_types): - template_dir = args['template_dir'] - mapping_msgs = { - os.path.join(template_dir, 'msg__rosidl_typesupport_connext_cpp.hpp.em'): - '%s__rosidl_typesupport_connext_cpp.hpp', - os.path.join(template_dir, 'msg__type_support.cpp.em'): - '%s__type_support.cpp', - } - mapping_srvs = { - os.path.join(template_dir, 'srv__rosidl_typesupport_connext_cpp.hpp.em'): +def generate_cpp(arguments_file): + mapping = { + 'idl__rosidl_typesupport_connext_cpp.hpp.em': '%s__rosidl_typesupport_connext_cpp.hpp', - os.path.join(template_dir, 'srv__type_support.cpp.em'): - '%s__type_support.cpp', + 'idl__dds_connext__type_support.cpp.em': + '%s__type_support.cpp' } - - for template_file in mapping_msgs.keys(): - assert os.path.exists(template_file), 'Could not find template: ' + template_file - for template_file in mapping_srvs.keys(): - assert os.path.exists(template_file), 'Could not find template: ' + template_file - - functions = { - 'get_header_filename_from_msg_name': convert_camel_case_to_lower_case_underscore, - } - # generate_dds_connext_cpp() and therefore the make target depend on the additional files - # therefore they must be listed here even if the generated type support files are independent - latest_target_timestamp = get_newest_modification_time( - args['target_dependencies'] + args.get('additional_files', [])) - - for idl_file, spec in message_specs: - validate_field_types(spec, known_msg_types) - subfolder = os.path.basename(os.path.dirname(idl_file)) - for template_file, generated_filename in mapping_msgs.items(): - generated_file = os.path.join(args['output_dir'], subfolder) - if generated_filename.endswith('.cpp'): - generated_file = os.path.join(generated_file, 'dds_connext') - generated_file = os.path.join( - generated_file, generated_filename % - convert_camel_case_to_lower_case_underscore(spec.base_type.type)) - - data = {'spec': spec, 'subfolder': subfolder} - data.update(functions) - expand_template( - template_file, data, generated_file, - minimum_timestamp=latest_target_timestamp) - - for idl_file, spec in service_specs: - validate_field_types(spec, known_msg_types) - subfolder = os.path.basename(os.path.dirname(idl_file)) - for template_file, generated_filename in mapping_srvs.items(): - generated_file = os.path.join(args['output_dir'], subfolder) - if generated_filename.endswith('.cpp'): - generated_file = os.path.join(generated_file, 'dds_connext') - generated_file = os.path.join( - generated_file, generated_filename % - convert_camel_case_to_lower_case_underscore(spec.srv_name)) - - data = {'spec': spec, 'subfolder': subfolder} - data.update(functions) - expand_template( - template_file, data, generated_file, - minimum_timestamp=latest_target_timestamp) - + generate_files(arguments_file, mapping) return 0 From 6fc33c9fac87df61af9eb02502792f47abf6299b Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Wed, 28 Nov 2018 14:45:15 -0800 Subject: [PATCH 02/20] Adds outer C++ IDL templates. --- .../idl__dds_connext__type_support.cpp.em | 55 +++++++++++++++ ...idl__rosidl_typesupport_connext_cpp.hpp.em | 68 +++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em create mode 100644 rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em diff --git a/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em new file mode 100644 index 0000000..4e68ea1 --- /dev/null +++ b/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em @@ -0,0 +1,55 @@ +// generated from rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em +// with input from @(package_name):@(interface_path) +// generated code does not contain a copyright notice + +@{ +####################################################################### +# EmPy template for generating __type_support.cpp files +# +# Context: +# - package_name (string) +# - content (rosidl_parser.definition.IdlContent result of parsing IDL file) +# - interface_path (Path relative to the directory named after the package) +####################################################################### +include_directives = set() +####################################################################### +# Handle message +####################################################################### +from rosidl_parser.definition import Message +for message in content.get_elements_of_type(Message): + TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, message=message, + include_directives=include_directives + ) +####################################################################### +# Handle service +####################################################################### +from rosidl_parser.definition import Service +for service in content.get_elements_of_type(Service): + TEMPLATE( + 'srv__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, service=service, + include_directives=include_directives + ) +####################################################################### +# Handle action +####################################################################### +from rosidl_parser.definition import Action +for action in content.get_elements_of_type(Action): + TEMPLATE( + 'srv__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, service=action.goal_service, + include_directives=include_directives + ) + TEMPLATE( + 'srv__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, service=action.result_service, + include_directives=include_directives + ) + TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, message=action.feedback_message, + include_directives=include_directives + ) +}@ diff --git a/rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em b/rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em new file mode 100644 index 0000000..8673107 --- /dev/null +++ b/rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em @@ -0,0 +1,68 @@ +// generated from rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em +// with input from @(package_name):@(interface_path) +// generated code does not contain a copyright notice + +@{ +####################################################################### +# EmPy template for generating __rosidl_typesupport_connext_cpp.hpp files +# +# Context: +# - package_name (string) +# - content (rosidl_parser.definition.IdlContent result of parsing IDL file) +# - interface_path (Path relative to the directory named after the package) +####################################################################### +from rosidl_cmake import convert_camel_case_to_lower_case_underscore +include_parts = [package_name] + list(interface_path.parents[0].parts) + \ + [convert_camel_case_to_lower_case_underscore(interface_path.stem)] +header_guard_variable = '__'.join([x.upper() for x in include_parts]) + \ + '__ROSIDL_TYPESUPPORT_CONNEXT_CPP_HPP_' +include_directives = set() +}@ + +#ifndef @(header_guard_variable) +#define @(header_guard_variable) + +@{ +####################################################################### +# Handle message +####################################################################### +from rosidl_parser.definition import Message +for message in content.get_elements_of_type(Message): + TEMPLATE( + 'msg__rosidl_typesupport_connext_cpp.hpp.em', + package_name=package_name, interface_path=interface_path, message=message, + include_directives=include_directives + ) +####################################################################### +# Handle service +####################################################################### +from rosidl_parser.definition import Service +for service in content.get_elements_of_type(Service): + TEMPLATE( + 'srv__rosidl_typesupport_connext_cpp.hpp.em', + package_name=package_name, interface_path=interface_path, service=service, + include_directives=include_directives + ) +####################################################################### +# Handle action +####################################################################### +from rosidl_parser.definition import Action +for action in content.get_elements_of_type(Action): + TEMPLATE( + 'srv__rosidl_typesupport_connext_cpp.hpp.em', + package_name=package_name, interface_path=interface_path, service=action.goal_service, + include_directives=include_directives + ) + TEMPLATE( + 'srv__rosidl_typesupport_connext_cpp.hpp.em', + package_name=package_name, interface_path=interface_path, service=action.result_service, + include_directives=include_directives + ) + TEMPLATE( + 'msg__rosidl_typesupport_connext_cpp.hpp.em', + package_name=package_name, interface_path=interface_path, message=action.feedback_message, + include_directives=include_directives + ) +}@ + +#endif // @(header_guard_variable) \ No newline at end of file From 699ab41629793149d367d07db00d2471c691c54a Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Wed, 28 Nov 2018 15:22:48 -0800 Subject: [PATCH 03/20] Adapts C++ msg & srv header templates. --- ...msg__rosidl_typesupport_connext_cpp.hpp.em | 124 ++++++++++-------- ...srv__rosidl_typesupport_connext_cpp.hpp.em | 115 ++++++++-------- 2 files changed, 122 insertions(+), 117 deletions(-) diff --git a/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em b/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em index 5751548..3d19b65 100644 --- a/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em +++ b/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em @@ -1,42 +1,39 @@ -// generated from -// rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em -// generated code does not contain a copyright notice - -@####################################################################### -@# EmPy template for generating -@# __rosidl_typesupport_connext_cpp.hpp files -@# -@# Context: -@# - spec (rosidl_parser.MessageSpecification) -@# Parsed specification of the .msg file -@# - subfolder (string) -@# The subfolder / subnamespace of the message -@# Either 'msg' or 'srv' -@# - get_header_filename_from_msg_name (function) -@####################################################################### -@ +@# Included from rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em + @{ -header_guard_parts = [ - spec.base_type.pkg_name, subfolder, - get_header_filename_from_msg_name(spec.base_type.type) + '__rosidl_typesupport_connext_cpp_hpp'] -header_guard_variable = '__'.join([x.upper() for x in header_guard_parts]) + '_' +from rosidl_cmake import convert_camel_case_to_lower_case_underscore +include_parts = [package_name] + list(interface_path.parents[0].parts) +include_base = '/'.join(include_parts) +header_filename = convert_camel_case_to_lower_case_underscore(interface_path.stem) +header_files = [ + 'rosidl_generator_c/message_type_support_struct.h', + 'rosidl_typesupport_interface/macros.h', + package_name + '/msg/rosidl_typesupport_connext_cpp__visibility_control.h' + include_base + '/' + header_filename + '__struct.hpp' +] +dds_specific_header_files = [ + include_base + '/dds_connext/' + interface_path.stem + '_Support.h', + include_base + '/dds_connext/' + interface_path.stem + '_Plugin.h', + 'ndds/ndds_cpp.h' +] +# TODO(hidmic): no longer needed? +# header_filename = get_header_filename_from_msg_name(spec.base_type.type) +# if header_filename.endswith('__request'): +# header_filename = header_filename[:-9] +# elif header_filename.endswith('__response'): +# header_filename = header_filename[:-10] }@ -#ifndef @(header_guard_variable) -#define @(header_guard_variable) - -#include "rosidl_generator_c/message_type_support_struct.h" -#include "rosidl_typesupport_interface/macros.h" -#include "@(spec.base_type.pkg_name)/msg/rosidl_typesupport_connext_cpp__visibility_control.h" +@[for header_file in header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ -@{ -header_filename = get_header_filename_from_msg_name(spec.base_type.type) -if header_filename.endswith('__request'): - header_filename = header_filename[:-9] -elif header_filename.endswith('__response'): - header_filename = header_filename[:-10] -}@ -#include "@(spec.base_type.pkg_name)/@(subfolder)/@(header_filename)__struct.hpp" #ifndef _WIN32 # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunused-parameter" @@ -45,10 +42,17 @@ elif header_filename.endswith('__response'): # pragma clang diagnostic ignored "-Wreturn-type-c-linkage" # endif #endif -#include "@(spec.base_type.pkg_name)/@(subfolder)/dds_connext/@(spec.base_type.type)_Support.h" -#include "@(spec.base_type.pkg_name)/@(subfolder)/dds_connext/@(spec.base_type.type)_Plugin.h" -#include "ndds/ndds_cpp.h" +@[for header_file in dds_specific_header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ + #ifndef _WIN32 # pragma GCC diagnostic pop #endif @@ -61,57 +65,67 @@ class DDSDomainParticipant; class DDSDataWriter; class DDSDataReader; -namespace @(spec.base_type.pkg_name) -{ +@[for ns in message.structure.namespaces]@ -namespace @(subfolder) +namespace @(ns) { +@[end for]@ + +@{ +__ros_msg_pkg_prefix = '::'.join(message.structure.namespaces) +__ros_msg_type = __ros_msg_pkg_prefix + '::' + message.structure.type.name +__dds_msg_type_prefix = __ros_msg_pkg_prefix + '::dds_::' + message.structure.type.name +__dds_msg_type = __dds_msg_type_prefix + '_' +}@ namespace typesupport_connext_cpp { DDS_TypeCode * -get_type_code__@(spec.base_type.type)(); +get_type_code__@(message.structure.type.name)(); bool -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.base_type.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) convert_ros_message_to_dds( - const @(spec.base_type.pkg_name)::@(subfolder)::@(spec.base_type.type) & ros_message, - @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_ & dds_message); + const @(__ros_msg_type) & ros_message, + @(__dds_msg_type) & dds_message); bool -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.base_type.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) convert_dds_message_to_ros( - const @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_ & dds_message, - @(spec.base_type.pkg_name)::@(subfolder)::@(spec.base_type.type) & ros_message); + const @(__dds_msg_type) & dds_message, + @(__ros_msg_type) & ros_message); bool -to_cdr_stream__@(spec.base_type.type)( +to_cdr_stream__@(message.structure.type.name)( const void * untyped_ros_message, ConnextStaticCDRStream * cdr_stream); bool -to_message__@(spec.base_type.type)( +to_message__@(message.structure.type.name)( const ConnextStaticCDRStream * cdr_stream, void * untyped_ros_message); } // namespace typesupport_connext_cpp -} // namespace @(subfolder) +@[for ns in reversed(message.structure.namespaces)]@ +} // namespace @(ns) -} // namespace @(spec.base_type.pkg_name) +@[end for]@ #ifdef __cplusplus extern "C" { #endif -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.base_type.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) const rosidl_message_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_cpp, @(spec.base_type.pkg_name), @(subfolder), @(spec.base_type.type))(); + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_cpp, + @(', '.join([package_name] + list(interface_path.parents[0].parts))), + @(message.structure.type.name))(); #ifdef __cplusplus } #endif -#endif // @(header_guard_variable) diff --git a/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em b/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em index 6344d5f..7e79445 100644 --- a/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em +++ b/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em @@ -1,47 +1,36 @@ -// generated from -// rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em -// generated code does not contain a copyright notice - -@####################################################################### -@# EmPy template for generating -@# __rosidl_typesupport_connext_cpp.hpp files -@# -@# Context: -@# - spec (rosidl_parser.MessageSpecification) -@# Parsed specification of the .srv file -@# - subfolder (string) -@# The subfolder / subnamespace of the message -@# Either 'srv' or 'action' -@# - get_header_filename_from_srv_name (function) -@####################################################################### -@ +@# Included from rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em + @{ -header_guard_parts = [ - spec.pkg_name, subfolder, - get_header_filename_from_msg_name(spec.srv_name) + '__rosidl_typesupport_connext_cpp_hpp'] -header_guard_variable = '__'.join([x.upper() for x in header_guard_parts]) + '_' +header_files = [ + 'rmw/types.h', + 'rosidl_typesupport_cpp/service_type_support.hpp', + 'rosidl_typesupport_interface/macros.h', + package_name + '/msg/rosidl_typesupport_connext_cpp__visibility_control.h' +] }@ -#ifndef @(header_guard_variable) -#define @(header_guard_variable) - -#include - -#include "rosidl_typesupport_cpp/service_type_support.hpp" -#include "rosidl_typesupport_interface/macros.h" -#include "@(spec.pkg_name)/msg/rosidl_typesupport_connext_cpp__visibility_control.h" +@[for header_file in header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ -namespace @(spec.pkg_name) -{ +@[for ns in service.structure.namespaces]@ -namespace @(subfolder) +namespace @(ns) { +@[end for]@ namespace typesupport_connext_cpp { -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) + +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) void * -create_requester__@(spec.srv_name)( +create_requester__@(service.structure_type.name)( void * untyped_participant, const char * request_topic_str, const char * response_topic_str, @@ -51,21 +40,21 @@ create_requester__@(spec.srv_name)( void ** untyped_writer, void * (*allocator)(size_t)); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) const char * -destroy_requester__@(spec.srv_name)( +destroy_requester__@(service.structure_type.name)( void * untyped_requester, void (* deallocator)(void *)); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) int64_t -send_request__@(spec.srv_name)( +send_request__@(service.structure_type.name)( void * untyped_requester, const void * untyped_ros_request); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) void * -create_replier__@(spec.srv_name)( +create_replier__@(service.structure_type.name)( void * untyped_participant, const char * request_topic_str, const char * response_topic_str, @@ -75,66 +64,68 @@ create_replier__@(spec.srv_name)( void ** untyped_writer, void * (*allocator)(size_t)); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) const char * -destroy_replier__@(spec.srv_name)( +destroy_replier__@(service.structure_type.name)( void * untyped_replier, void (* deallocator)(void *)); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) bool -take_request__@(spec.srv_name)( +take_request__@(service.structure_type.name)( void * untyped_replier, rmw_request_id_t * request_header, void * untyped_ros_request); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) bool -take_response__@(spec.srv_name)( +take_response__@(service.structure_type.name)( void * untyped_requester, rmw_request_id_t * request_header, void * untyped_ros_response); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) bool -send_response__@(spec.srv_name)( +send_response__@(service.structure_type.name)( void * untyped_replier, const rmw_request_id_t * request_header, const void * untyped_ros_response); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) void * -get_request_datawriter__@(spec.srv_name)(void * untyped_requester); +get_request_datawriter__@(service.structure_type.name)(void * untyped_requester); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) void * -get_reply_datareader__@(spec.srv_name)(void * untyped_requester); +get_reply_datareader__@(service.structure_type.name)(void * untyped_requester); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) void * -get_request_datareader__@(spec.srv_name)(void * untyped_replier); +get_request_datareader__@(service.structure_type.name)(void * untyped_replier); -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) void * -get_reply_datawriter__@(spec.srv_name)(void * untyped_replier); +get_reply_datawriter__@(service.structure_type.name)(void * untyped_replier); } // namespace typesupport_connext_cpp -} // namespace @(subfolder) +@[for ns in reversed(service.structure.namespaces)]@ +} // namespace @(ns) -} // namespace @(spec.pkg_name) +@[end for]@ #ifdef __cplusplus extern "C" { #endif -ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_PUBLIC_@(package_name) const rosidl_service_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_connext_cpp, @(spec.pkg_name), @(subfolder), @(spec.srv_name))(); + ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( + rosidl_typesupport_connext_cpp, + @(', '.join([package_name] + list(interface_path.parents[0].parts))), + @(service.structure.type.name))(); #ifdef __cplusplus } #endif - -#endif // @(header_guard_variable) From 842735fecbae4e1b5607f2224bf0873123a0dc22 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Wed, 28 Nov 2018 16:09:37 -0800 Subject: [PATCH 04/20] Adapts C++ msg & srv source templates. --- .../resource/msg__type_support.cpp.em | 284 ++++++++++-------- .../resource/srv__type_support.cpp.em | 269 ++++++++++------- 2 files changed, 321 insertions(+), 232 deletions(-) diff --git a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em index 1775792..079f825 100644 --- a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em @@ -1,138 +1,162 @@ -// generated from rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em -// generated code does not contain a copyright notice - -@####################################################################### -@# EmPy template for generating __type_support.cpp files -@# -@# Context: -@# - spec (rosidl_parser.MessageSpecification) -@# Parsed specification of the .msg file -@# - subfolder (string) -@# The subfolder / subnamespace of the message -@# Could be 'msg', 'srv' or 'action' -@# - get_header_filename_from_msg_name (function) -@####################################################################### -@ -#include "@(spec.base_type.pkg_name)/@(subfolder)/@(get_header_filename_from_msg_name(spec.base_type.type))__rosidl_typesupport_connext_cpp.hpp" - -#include -#include - -#include "rcutils/types/uint8_array.h" - -#include "rosidl_typesupport_cpp/message_type_support.hpp" - -#include "rosidl_typesupport_connext_cpp/identifier.hpp" -#include "rosidl_typesupport_connext_cpp/message_type_support.h" -#include "rosidl_typesupport_connext_cpp/message_type_support_decl.hpp" +@# Included from rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em + +@{ +from rosidl_cmake import convert_camel_case_to_lower_case_underscore +include_parts = [package_name] + list(interface_path.parents[0].parts) +include_base = '/'.join(include_parts) +message_name = convert_camel_case_to_lower_case_underscore(message.structure.type.name) + +system_header_files = [ + 'limits', 'stdexcept' +] + +header_files = [ + include_base + '/' + message_name + '__rosidl_typesupport_connext_cpp.hpp', + 'rcutils/types/uint8_array.h', + 'rosidl_typesupport_cpp/message_type_support.hpp', + 'rosidl_typesupport_connext_cpp/identifier.hpp', + 'rosidl_typesupport_connext_cpp/message_type_support.h', + 'rosidl_typesupport_connext_cpp/message_type_support_decl.hpp' +] +}@ + +@[for header_file in system_header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include <@(header_file)> +@[end for]@ + +@[for header_file in header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ // forward declaration of message dependencies and their conversion functions -@[for field in spec.fields]@ -@[ if not field.type.is_primitive_type()]@ -namespace @(field.type.pkg_name) -{ -namespace msg +@[for member in message.structure.members]@ +@[ if isinstance(member.type, NamespacedType)]@ +@[ for ns in member.type.namespaces]@ +namespace @(ns) { +@[ end for]@ namespace dds_ { -class @(field.type.type)_; +class @(member.type.name)_; } // namespace dds_ +@[ member_ros_msg_pkg_prefix = '::'.join(member.type.namespaces)]@ +@[ member_ros_msg_type = member_ros_msg_pkg_prefix + '::' + member.type.name]@ +@[ member_dds_msg_type = member_ros_msg_pkg_prefix + '::dds_::' + member.type.name + '_']@ namespace typesupport_connext_cpp { bool convert_ros_message_to_dds( - const @(field.type.pkg_name)::msg::@(field.type.type) &, - @(field.type.pkg_name)::msg::dds_::@(field.type.type)_ &); + const @(member_ros_msg_type) &, + @(member_dds_msg_type) &); bool convert_dds_message_to_ros( - const @(field.type.pkg_name)::msg::dds_::@(field.type.type)_ &, - @(field.type.pkg_name)::msg::@(field.type.type) &); + const @(member_dds_msg_type) &, + @(member_ros_msg_type) &); } // namespace typesupport_connext_cpp -} // namespace msg -} // namespace @(field.type.pkg_name) - -@[ end if]@ +@[ for ns in reversed(member.type.namespaces)]@ +} // namespace @(ns) +@[ end for]@ +@[ end if]@ @[end for]@ -namespace @(spec.base_type.pkg_name) -{ +@[for ns in message.structure.namespaces]@ -namespace @(subfolder) +namespace @(ns) { +@[end for]@ namespace typesupport_connext_cpp { +@{ +__ros_msg_pkg_prefix = '::'.join(message.structure.namespaces) +__ros_msg_type = __ros_msg_pkg_prefix + '::' + message.structure.type.name +__dds_msg_type_prefix = __ros_msg_pkg_prefix + '::dds_::' + message.structure.type.name +__dds_msg_type = __dds_msg_type_prefix + '_' +}@ + DDS_TypeCode * -get_type_code__@(spec.base_type.type)() +get_type_code__@(message.structure.type.name)() { - return @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_TypeSupport::get_typecode(); + return @(__dds_msg_type_prefix)_TypeSupport::get_typecode(); } bool convert_ros_message_to_dds( - const @(spec.base_type.pkg_name)::@(subfolder)::@(spec.base_type.type) & ros_message, - @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_ & dds_message) + const @(__ros_msg_type) & ros_message, + @(__dds_msg_type) & dds_message) { -@[if not spec.fields]@ +@[if not message.structure.members]@ (void)ros_message; (void)dds_message; @[end if]@ -@[for field in spec.fields]@ - // field.name @(field.name) -@[ if field.type.is_array]@ +@[for member in member.structure.members]@ + // member.name @(member.name) +@[ if isinstance(member.type, NestedType)]@ { -@[ if field.type.array_size and not field.type.is_upper_bound]@ - size_t size = @(field.type.array_size); +@[ if isinstance(member.type, Array)]@ + size_t size = @(member.type.size); @[ else]@ - size_t size = ros_message.@(field.name).size(); + size_t size = ros_message.@(member.name).size(); if (size > (std::numeric_limits::max)()) { throw std::runtime_error("array size exceeds maximum DDS sequence size"); } -@[ if field.type.is_upper_bound]@ - if (size > @(field.type.array_size)) { +@[ if isinstance(member.type, BoundedSequence)]@ + if (size > @(member.type.upper_bound)) { throw std::runtime_error("array size exceeds upper bound"); } @[ end if]@ DDS_Long length = static_cast(size); - if (length > dds_message.@(field.name)_.maximum()) { - if (!dds_message.@(field.name)_.maximum(length)) { + if (length > dds_message.@(member.name)_.maximum()) { + if (!dds_message.@(member.name)_.maximum(length)) { throw std::runtime_error("failed to set maximum of sequence"); } } - if (!dds_message.@(field.name)_.length(length)) { + if (!dds_message.@(member.name)_.length(length)) { throw std::runtime_error("failed to set length of sequence"); } @[ end if]@ for (size_t i = 0; i < size; i++) { -@[ if field.type.type == 'string']@ - DDS_String_free(dds_message.@(field.name)_[static_cast(i)]); - dds_message.@(field.name)_[static_cast(i)] = - DDS_String_dup(ros_message.@(field.name)[i].c_str()); -@[ elif field.type.is_primitive_type()]@ - dds_message.@(field.name)_[static_cast(i)] = - ros_message.@(field.name)[i]; +@[ if isinstance(member.type, BaseString)]@ + DDS_String_free(dds_message.@(member.name)_[static_cast(i)]); + dds_message.@(member.name)_[static_cast(i)] = + DDS_String_dup(ros_message.@(member.name)[i].c_str()); +@[ elif isinstance(member.type, BasicType)]@ + dds_message.@(member.name)_[static_cast(i)] = + ros_message.@(member.name)[i]; @[ else]@ if ( - !@(field.type.pkg_name)::msg::typesupport_connext_cpp::convert_ros_message_to_dds( - ros_message.@(field.name)[i], - dds_message.@(field.name)_[static_cast(i)])) + !@('::'.join(member.type.basetype.namespaces))::typesupport_connext_cpp::convert_ros_message_to_dds( + ros_message.@(member.name)[i], + dds_message.@(member.name)_[static_cast(i)])) { return false; } @[ end if]@ } } -@[ elif field.type.type == 'string']@ - DDS_String_free(dds_message.@(field.name)_); - dds_message.@(field.name)_ = - DDS_String_dup(ros_message.@(field.name).c_str()); -@[ elif field.type.is_primitive_type()]@ - dds_message.@(field.name)_ = - ros_message.@(field.name); +@[ elif isinstance(member.type, BaseString)]@ + DDS_String_free(dds_message.@(member.name)_); + dds_message.@(member.name)_ = + DDS_String_dup(ros_message.@(member.name).c_str()); +@[ elif isinstance(member.type, BasicType)]@ + dds_message.@(member.name)_ = + ros_message.@(member.name); @[ else]@ if ( - !@(field.type.pkg_name)::msg::typesupport_connext_cpp::convert_ros_message_to_dds( - ros_message.@(field.name), - dds_message.@(field.name)_)) + !@('::'.join(member.type.namespaces))::typesupport_connext_cpp::convert_ros_message_to_dds( + ros_message.@(member.name), + dds_message.@(member.name)_)) { return false; } @@ -144,46 +168,46 @@ convert_ros_message_to_dds( bool convert_dds_message_to_ros( - const @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_ & dds_message, - @(spec.base_type.pkg_name)::@(subfolder)::@(spec.base_type.type) & ros_message) + const @(__dds_msg_type) & dds_message, + @(__ros_msg_type) & ros_message) { -@[if not spec.fields]@ +@[if not message.structure.members]@ (void)ros_message; (void)dds_message; @[end if]@ -@[for field in spec.fields]@ - // field.name @(field.name) -@[ if field.type.is_array]@ +@[for member in message.structure.members]@ + // member.name @(member.name) +@[ if isinstance(member.type, NestedType)]@ { -@[ if field.type.array_size and not field.type.is_upper_bound]@ - size_t size = @(field.type.array_size); +@[ if isinstance(member.type, Array)]@ + size_t size = @(member.type.size); @[ else]@ - size_t size = dds_message.@(field.name)_.length(); - ros_message.@(field.name).resize(size); + size_t size = dds_message.@(member.name)_.length(); + ros_message.@(member.name).resize(size); @[ end if]@ for (size_t i = 0; i < size; i++) { -@[ if field.type.is_primitive_type()]@ - ros_message.@(field.name)[i] = - dds_message.@(field.name)_[static_cast(i)]@(' == DDS_BOOLEAN_TRUE' if field.type.type == 'bool' else ''); +@[ if isinstance(member.type, BasicType)]@ + ros_message.@(member.name)[i] = + dds_message.@(member.name)_[static_cast(i)]@(' == DDS_BOOLEAN_TRUE' if member.type.type == 'boolean' else ''); @[ else]@ if ( - !@(field.type.pkg_name)::msg::typesupport_connext_cpp::convert_dds_message_to_ros( - dds_message.@(field.name)_[static_cast(i)], - ros_message.@(field.name)[i])) + !@('::'.join(member.type.basetype.namespaces))::typesupport_connext_cpp::convert_dds_message_to_ros( + dds_message.@(member.name)_[static_cast(i)], + ros_message.@(member.name)[i])) { return false; } @[ end if]@ } } -@[ elif field.type.is_primitive_type()]@ - ros_message.@(field.name) = - dds_message.@(field.name)_@(' == DDS_BOOLEAN_TRUE' if field.type.type == 'bool' else ''); +@[ elif isinstance(member.type, BasicType)]@ + ros_message.@(member.name) = + dds_message.@(member.name)_@(' == DDS_BOOLEAN_TRUE' if member.type.type == 'boolean' else ''); @[ else]@ if ( - !@(field.type.pkg_name)::msg::typesupport_connext_cpp::convert_dds_message_to_ros( - dds_message.@(field.name)_, - ros_message.@(field.name))) + !@('::'.join(member.type.namespaces))::typesupport_connext_cpp::convert_dds_message_to_ros( + dds_message.@(member.name)_, + ros_message.@(member.name))) { return false; } @@ -194,7 +218,7 @@ convert_dds_message_to_ros( } bool -to_cdr_stream__@(spec.base_type.type)( +to_cdr_stream__@(message.structure.type.name)( const void * untyped_ros_message, rcutils_uint8_array_t * cdr_stream) { @@ -206,11 +230,11 @@ to_cdr_stream__@(spec.base_type.type)( } // cast the untyped to the known ros message - const @(spec.base_type.pkg_name)::@(subfolder)::@(spec.base_type.type) & ros_message = - *(const @(spec.base_type.pkg_name)::@(subfolder)::@(spec.base_type.type) *)untyped_ros_message; + const @(__ros_msg_type) & ros_message = + *(const @(__ros_msg_type) *)untyped_ros_message; // create a respective connext dds type - @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_ * dds_message = @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_TypeSupport::create_data(); + @(__dds_msg_type) * dds_message = @(__dds_msg_type_prefix)_TypeSupport::create_data(); if (!dds_message) { return false; } @@ -222,12 +246,12 @@ to_cdr_stream__@(spec.base_type.type)( // call the serialize function for the first time to get the expected length of the message unsigned int expected_length; - if (@(spec.base_type.type)_Plugin_serialize_to_cdr_buffer( + if (@(message.structure.type.name)_Plugin_serialize_to_cdr_buffer( NULL, &expected_length, dds_message) != RTI_TRUE) { - fprintf(stderr, "failed to call @(spec.base_type.type)_Plugin_serialize_to_cdr_buffer()\n"); + fprintf(stderr, "failed to call @(message.structure.type.name)_Plugin_serialize_to_cdr_buffer()\n"); return false; } cdr_stream->buffer_length = expected_length; @@ -248,14 +272,14 @@ to_cdr_stream__@(spec.base_type.type)( { return false; } - if (@(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { + if (@(__dds_msg_type_prefix)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { return false; } return true; } bool -to_message__@(spec.base_type.type)( +to_message__@(message.structure.type.name)( const rcutils_uint8_array_t * cdr_stream, void * untyped_ros_message) { @@ -269,13 +293,13 @@ to_message__@(spec.base_type.type)( return false; } - @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_ * dds_message = - @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_TypeSupport::create_data(); + @(__dds_msg_type) * dds_message = + @(__dds_msg_type_prefix)_TypeSupport::create_data(); if (cdr_stream->buffer_length > (std::numeric_limits::max)()) { fprintf(stderr, "cdr_stream->buffer_length, unexpectedly larger than max unsigned int\n"); return false; } - if (@(spec.base_type.type)_Plugin_deserialize_from_cdr_buffer( + if (@(message.structure.type.name)_Plugin_deserialize_from_cdr_buffer( dds_message, reinterpret_cast(cdr_stream->buffer), static_cast(cdr_stream->buffer_length)) != RTI_TRUE) @@ -284,23 +308,23 @@ to_message__@(spec.base_type.type)( return false; } - @(spec.base_type.pkg_name)::@(subfolder)::@(spec.base_type.type) & ros_message = - *(@(spec.base_type.pkg_name)::@(subfolder)::@(spec.base_type.type) *)untyped_ros_message; + @(__ros_msg_type) & ros_message = + *(@(__ros_msg_type_prefix) *)untyped_ros_message; bool success = convert_dds_message_to_ros(*dds_message, ros_message); - if (@(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { + if (@(__dds_msg_type_prefix)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { return false; } return success; } static message_type_support_callbacks_t callbacks = { - "@(spec.base_type.pkg_name)", - "@(spec.base_type.type)", - &get_type_code__@(spec.base_type.type), + "@(package_name)", + "@(message.structure.type.name)", + &get_type_code__@(message.structure.type.name), nullptr, nullptr, - &to_cdr_stream__@(spec.base_type.type), - &to_message__@(spec.base_type.type) + &to_cdr_stream__@(message.structure.type.name), + &to_message__@(message.structure.type.name) }; static rosidl_message_type_support_t handle = { @@ -311,19 +335,20 @@ static rosidl_message_type_support_t handle = { } // namespace typesupport_connext_cpp -} // namespace @(subfolder) +@[for ns in reversed(message.structure.namespaces)]@ +} // namespace @(ns) -} // namespace @(spec.base_type.pkg_name) +@[end for]@ namespace rosidl_typesupport_connext_cpp { template<> -ROSIDL_TYPESUPPORT_CONNEXT_CPP_EXPORT_@(spec.base_type.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_EXPORT_@(package_name) const rosidl_message_type_support_t * -get_message_type_support_handle<@(spec.base_type.pkg_name)::@(subfolder)::@(spec.base_type.type)>() +get_message_type_support_handle<@(__ros_msg_type)>() { - return &@(spec.base_type.pkg_name)::@(subfolder)::typesupport_connext_cpp::handle; + return &@(__ros_msg_pkg_prefix)::typesupport_connext_cpp::handle; } } // namespace rosidl_typesupport_connext_cpp @@ -334,8 +359,11 @@ extern "C" #endif const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_cpp, @(spec.base_type.pkg_name), @(subfolder), @(spec.base_type.type))() { - return &@(spec.base_type.pkg_name)::@(subfolder)::typesupport_connext_cpp::handle; +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_cpp, + @(', '.join([package_name] + list(interface_path.parents[0].parts))), + @(message.structure.type.name))() { + return &@(__ros_msg_pkg_prefix)::typesupport_connext_cpp::handle; } #ifdef __cplusplus diff --git a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em index ccf3170..628a880 100644 --- a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em @@ -1,19 +1,49 @@ -// generated from rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em -// generated code does not contain a copyright notice - -@####################################################################### -@# EmPy template for generating __type_support.cpp files -@# -@# Context: -@# - spec (rosidl_parser.ServiceSpecification) -@# Parsed specification of the .srv file -@# - subfolder (string) -@# The subfolder / subnamespace of the message -@# Either 'srv' or 'action' -@# - get_header_filename_from_msg_name (function) -@####################################################################### -@ -#include "@(spec.pkg_name)/@(subfolder)/@(get_header_filename_from_msg_name(spec.srv_name))__rosidl_typesupport_connext_cpp.hpp" +@# Included from rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em + +@{ +TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, message=service.request_message, + include_directives=include_directives +) +}@ + +@{ +TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, message=service.response_message, + include_directives=include_directives +) +}@ + +@{ +from rosidl_cmake import convert_camel_case_to_lower_case_underscore +include_parts = [package_name] + list(interface_path.parents[0].parts) +include_base = '/'.join(include_parts) +service_name = convert_camel_case_to_lower_case_underscore(service.structure.type.name) +request_message_name = convert_camel_case_to_lower_case_underscore(service.request_message.structure.type.name) +response_message_name = convert_camel_case_to_lower_case_underscore(service.response_message.structure.type.name) + +header_files = [ + include_base + '/' + service_name + '__rosidl_typesupport_connext_cpp.hpp', + 'rmw/error_handling.h', + 'rosidl_typesupport_connext_cpp/identifier.hpp', + 'rosidl_typesupport_connext_cpp/service_type_support.h', + 'rosidl_typesupport_connext_cpp/service_type_support_decl.hpp', + include_base + '/' + service_name + '__struct.hpp', + include_base + '/dds_connext/' + service.request_message.structure.type.name + '_Support.h', + include_base + '/' + request_message_name + '__rosidl_typesupport_connext_cpp.hpp', + include_base + '/dds_connext/' + service.response_message.structure.type.name + '_Support.h', + include_base + '/' + response_message_name + '__rosidl_typesupport_connext_cpp.hpp' +] + +dds_specific_header_files = [ + 'ndds/connext_cpp/connext_cpp_requester_details.h', + 'ndds/ndds_cpp.h', + 'ndds/ndds_requestreply_cpp.h' +] + +}@ #ifdef Connext_GLIBCXX_USE_CXX11_ABI_ZERO #define _GLIBCXX_USE_CXX11_ABI 0 @@ -27,45 +57,63 @@ # pragma clang diagnostic ignored "-Wreturn-type-c-linkage" # endif #endif -#include -#include -#include + +@[for header_file in dds_specific_header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include <@(header_file)> +@[end for]@ + #ifndef _WIN32 # pragma GCC diagnostic pop #endif -#include "rmw/error_handling.h" -#include "rosidl_typesupport_connext_cpp/identifier.hpp" -#include "rosidl_typesupport_connext_cpp/service_type_support.h" -#include "rosidl_typesupport_connext_cpp/service_type_support_decl.hpp" +@[for header_file in header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ @{ -header_filename = get_header_filename_from_msg_name(spec.srv_name) -if header_filename.endswith('__request'): - header_filename = header_filename[:-9] -elif header_filename.endswith('__response'): - header_filename = header_filename[:-10] +# TODO(hidmic): still necessary? +# header_filename = get_header_filename_from_msg_name(spec.srv_name) +# if header_filename.endswith('__request'): +# header_filename = header_filename[:-9] +# elif header_filename.endswith('__response'): +# header_filename = header_filename[:-10] }@ -#include "@(spec.pkg_name)/@(subfolder)/@(header_filename)__struct.hpp" -#include "@(spec.pkg_name)/@(subfolder)/dds_connext/@(spec.srv_name)_Request_Support.h" -#include "@(spec.pkg_name)/@(subfolder)/@(get_header_filename_from_msg_name(spec.srv_name + '_Request'))__rosidl_typesupport_connext_cpp.hpp" -#include "@(spec.pkg_name)/@(subfolder)/dds_connext/@(spec.srv_name)_Response_Support.h" -#include "@(spec.pkg_name)/@(subfolder)/@(get_header_filename_from_msg_name(spec.srv_name + '_Response'))__rosidl_typesupport_connext_cpp.hpp" class DDSDomainParticipant; class DDSDataReader; struct DDS_SampleIdentity_t; -namespace @(spec.pkg_name) -{ +@[for ns in service.structure.namespaces]@ -namespace @(subfolder) +namespace @(ns) { +@[end for]@ namespace typesupport_connext_cpp { -void * create_requester__@(spec.srv_name)( +@{ +__ros_srv_pkg_prefix = '::'.join(service.structure.namespaces) +__ros_srv_type = __ros_srv_pkg_prefix + '::' + service.structure.type.name +__ros_request_msg_type = __ros_srv_pkg_prefix + '::' + service.request_message.structure.type.name +__ros_response_msg_type = __ros_srv_pkg_prefix + '::' + service.response_message.structure.type.name +__dds_request_msg_type = __ros_srv_pkg_prefix + '::dds_::' + service.request_message.structure.type.name + '_' +__dds_response_msg_type = __ros_srv_pkg_prefix + '::dds_::' + service.response_message.structure.type.name + '_' +}@ + +void * create_requester__@(service.structure_type.name)( void * untyped_participant, const char * request_topic_str, const char * response_topic_str, @@ -76,8 +124,8 @@ void * create_requester__@(spec.srv_name)( void * (*allocator)(size_t)) { using RequesterType = connext::Requester< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; if (!untyped_participant || !request_topic_str || !response_topic_str || !untyped_reader) { return NULL; @@ -126,13 +174,13 @@ void * create_requester__@(spec.srv_name)( return requester; } -const char * destroy_requester__@(spec.srv_name)( +const char * destroy_requester__@(service.structure.type.name)( void * untyped_requester, void (* deallocator)(void *)) { using RequesterType = connext::Requester< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; auto requester = static_cast(untyped_requester); @@ -142,20 +190,20 @@ const char * destroy_requester__@(spec.srv_name)( return nullptr; } -int64_t send_request__@(spec.srv_name)( +int64_t send_request__@(service.structure.type.name)( void * untyped_requester, const void * untyped_ros_request) { - using ROSRequestType = @(spec.pkg_name)::@(subfolder)::@(spec.srv_name)_Request; + using ROSRequestType = @(__ros_request_msg_type); using RequesterType = connext::Requester< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; connext::WriteSample< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_> request; + @(__dds_request_msg_type)> request; const ROSRequestType & ros_request = *( static_cast(untyped_ros_request)); - @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::convert_ros_message_to_dds( + @(__ros_srv_pkg_prefix)::typesupport_connext_cpp::convert_ros_message_to_dds( ros_request, request.data()); RequesterType * requester = static_cast(untyped_requester); @@ -166,7 +214,7 @@ int64_t send_request__@(spec.srv_name)( return sequence_number; } -void * create_replier__@(spec.srv_name)( +void * create_replier__@(service.structure.type.name)( void * untyped_participant, const char * request_topic_str, const char * response_topic_str, @@ -177,8 +225,8 @@ void * create_replier__@(spec.srv_name)( void * (*allocator)(size_t)) { using ReplierType = connext::Replier< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; if (!untyped_participant || !request_topic_str || !response_topic_str || !untyped_reader) { return NULL; @@ -188,7 +236,10 @@ void * create_replier__@(spec.srv_name)( DDSDomainParticipant * participant = static_cast(untyped_participant); const DDS_DataReaderQos * datareader_qos = static_cast(untyped_datareader_qos); const DDS_DataWriterQos * datawriter_qos = static_cast(untyped_datawriter_qos); - connext::ReplierParams<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_> replier_params(participant); + connext::ReplierParams< + @(__dds_request_msg_type), + @(__dds_response_msg_type) + > replier_params(participant); // we create separate publishers and subscribers // because the default publisher is a singleton within @@ -227,13 +278,13 @@ void * create_replier__@(spec.srv_name)( return replier; } -const char * destroy_replier__@(spec.srv_name)( +const char * destroy_replier__@(service.structure.type.name)( void * untyped_replier, void (* deallocator)(void *)) { using ReplierType = connext::Replier< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; auto replier = static_cast(untyped_replier); @@ -243,16 +294,16 @@ const char * destroy_replier__@(spec.srv_name)( return nullptr; } -bool take_request__@(spec.srv_name)( +bool take_request__@(service.structure.type.name)( void * untyped_replier, rmw_request_id_t * request_header, void * untyped_ros_request) { using ReplierType = connext::Replier< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; - using ROSRequestType = @(spec.pkg_name)::@(subfolder)::@(spec.srv_name)_Request; + using ROSRequestType = @(__ros_request_msg_type); if (!untyped_replier || !request_header || !untyped_ros_request) { return false; } @@ -261,7 +312,7 @@ bool take_request__@(spec.srv_name)( ROSRequestType & ros_request = *static_cast(untyped_ros_request); - connext::Sample<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_> request; + connext::Sample<@(__dds_request_msg_type)> request; bool taken = replier->take_request(request); if (!taken) { return false; @@ -271,7 +322,7 @@ bool take_request__@(spec.srv_name)( } bool converted = - @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::convert_dds_message_to_ros(request.data(), ros_request); + @(__ros_srv_pkg_prefix)::typesupport_connext_cpp::convert_dds_message_to_ros(request.data(), ros_request); if (!converted) { return false; } @@ -283,13 +334,16 @@ bool take_request__@(spec.srv_name)( return true; } -bool take_response__@(spec.srv_name)( +bool take_response__@(service.structure.type.name)( void * untyped_requester, rmw_request_id_t * request_header, void * untyped_ros_response) { - using RequesterType = connext::Requester<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_>; - using ROSResponseType = @(spec.pkg_name)::@(subfolder)::@(spec.srv_name)_Response; + using RequesterType = connext::Requester< + @(__dds_request_msg_type), + @(__dds_response_msg_type) + >; + using ROSResponseType = @(__ros_response_msg_type); if (!untyped_requester || !request_header || !untyped_ros_response) { return false; } @@ -298,7 +352,7 @@ bool take_response__@(spec.srv_name)( ROSResponseType & ros_response = *static_cast(untyped_ros_response); - connext::Sample<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_> response; + connext::Sample<@(__dds_response_msg_type)> response; bool received = requester->take_reply(response); if (!received) { return false; @@ -313,25 +367,28 @@ bool take_response__@(spec.srv_name)( request_header->sequence_number = sequence_number; bool converted = - @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::convert_dds_message_to_ros(response.data(), ros_response); + @(__ros_srv_pkg_prefix)::typesupport_connext_cpp::convert_dds_message_to_ros(response.data(), ros_response); return converted; } -bool send_response__@(spec.srv_name)( +bool send_response__@(service.structure.type.name)( void * untyped_replier, const rmw_request_id_t * request_header, const void * untyped_ros_response) { - using ROSResponseType = const @(spec.pkg_name)::@(subfolder)::@(spec.srv_name)_Response; - using ReplierType = connext::Replier<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_>; + using ROSResponseType = @(__ros_response_msg_type); + using ReplierType = connext::Replier< + @(__dds_request_msg_type), + @(__dds_response_msg_type) + >; if (!untyped_replier || !request_header || !untyped_ros_response) { return false; } - connext::WriteSample<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_> response; + connext::WriteSample<@(__dds_response_msg_type)> response; ROSResponseType & ros_response = *(reinterpret_cast(untyped_ros_response)); bool converted = - @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::convert_ros_message_to_dds(ros_response, response.data()); + @(__ros_srv_pkg_prefix)::typesupport_connext_cpp::convert_ros_message_to_dds(ros_response, response.data()); if (!converted) { return false; } @@ -351,76 +408,76 @@ bool send_response__@(spec.srv_name)( } void * -get_request_datawriter__@(spec.srv_name)(void * untyped_requester) +get_request_datawriter__@(service.structure.type.name)(void * untyped_requester) { if (!untyped_requester) { return NULL; } using RequesterType = connext::Requester< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; RequesterType * requester = reinterpret_cast(untyped_requester); return requester->get_request_datawriter(); } void * -get_reply_datareader__@(spec.srv_name)(void * untyped_requester) +get_reply_datareader__@(service.structure.type.name)(void * untyped_requester) { if (!untyped_requester) { return NULL; } using RequesterType = connext::Requester< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; RequesterType * requester = reinterpret_cast(untyped_requester); return requester->get_reply_datareader(); } void * -get_request_datareader__@(spec.srv_name)(void * untyped_replier) +get_request_datareader__@(service.structure.type.name)(void * untyped_replier) { if (!untyped_replier) { return NULL; } using ReplierType = connext::Replier< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; ReplierType * replier = reinterpret_cast(untyped_replier); return replier->get_request_datareader(); } void * -get_reply_datawriter__@(spec.srv_name)(void * untyped_replier) +get_reply_datawriter__@(service.structure.type.name)(void * untyped_replier) { if (!untyped_replier) { return NULL; } using ReplierType = connext::Replier< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; ReplierType * replier = reinterpret_cast(untyped_replier); return replier->get_reply_datawriter(); } static service_type_support_callbacks_t callbacks = { - "@(spec.pkg_name)", - "@(spec.srv_name)", - &create_requester__@(spec.srv_name), - &destroy_requester__@(spec.srv_name), - &create_replier__@(spec.srv_name), - &destroy_replier__@(spec.srv_name), - &send_request__@(spec.srv_name), - &take_request__@(spec.srv_name), - &send_response__@(spec.srv_name), - &take_response__@(spec.srv_name), - &get_request_datawriter__@(spec.srv_name), - &get_reply_datareader__@(spec.srv_name), - &get_request_datareader__@(spec.srv_name), - &get_reply_datawriter__@(spec.srv_name), + "@(package_name)", + "@(service.structure.type.name)", + &create_requester__@(service.structure.type.name), + &destroy_requester__@(service.structure.type.name), + &create_replier__@(service.structure.type.name), + &destroy_replier__@(service.structure.type.name), + &send_request__@(service.structure.type.name), + &take_request__@(service.structure.type.name), + &send_response__@(service.structure.type.name), + &take_response__@(service.structure.type.name), + &get_request_datawriter__@(service.structure.type.name), + &get_reply_datareader__@(service.structure.type.name), + &get_request_datareader__@(service.structure.type.name), + &get_reply_datawriter__@(service.structure.type.name), }; static rosidl_service_type_support_t handle = { @@ -431,19 +488,20 @@ static rosidl_service_type_support_t handle = { } // namespace typesupport_connext_cpp -} // namespace @(subfolder) +@[for ns in reversed(service.structure.namespaces)]@ +} // namespace @(ns) -} // namespace @(spec.pkg_name) +@[end for]@ namespace rosidl_typesupport_connext_cpp { template<> -ROSIDL_TYPESUPPORT_CONNEXT_CPP_EXPORT_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_CPP_EXPORT_@(package_name) const rosidl_service_type_support_t * -get_service_type_support_handle<@(spec.pkg_name)::@(subfolder)::@(spec.srv_name)>() +get_service_type_support_handle<@(__ros_srv_type)>() { - return &@(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::handle; + return &@(__ros_srv_pkg_prefix)::typesupport_connext_cpp::handle; } } // namespace rosidl_typesupport_connext_cpp @@ -454,8 +512,11 @@ extern "C" #endif const rosidl_service_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_connext_cpp, @(spec.pkg_name), @(subfolder), @(spec.srv_name))() { - return &@(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::handle; +ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( + rosidl_typesupport_connext_cpp, + @(', '.join([package_name] + list(interface_path.parents[0].parts))), + @(service.structure.type.name))(); + return &@(__ros_srv_pkg_prefix)::typesupport_connext_cpp::handle; } #ifdef __cplusplus From cc833216d4665f1a695ec85b0173783603ca3cfd Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Wed, 28 Nov 2018 17:10:23 -0800 Subject: [PATCH 05/20] Switch C type support generation pipeline. --- .../bin/rosidl_typesupport_connext_c | 4 +- ...upport_connext_c_generate_interfaces.cmake | 100 +++++------------- ...sidl_typesupport_connext_c-extras.cmake.in | 2 +- .../rosidl_typesupport_connext_c/__init__.py | 93 ++-------------- ...port_connext_cpp_generate_interfaces.cmake | 4 +- 5 files changed, 40 insertions(+), 163 deletions(-) diff --git a/rosidl_typesupport_connext_c/bin/rosidl_typesupport_connext_c b/rosidl_typesupport_connext_c/bin/rosidl_typesupport_connext_c index 012c55b..cd9c350 100644 --- a/rosidl_typesupport_connext_c/bin/rosidl_typesupport_connext_c +++ b/rosidl_typesupport_connext_c/bin/rosidl_typesupport_connext_c @@ -28,10 +28,8 @@ def main(argv=sys.argv[1:]): help='The location of the file containing the generator arguments') args = parser.parse_args(argv) - generator_args = read_generator_arguments(args.generator_arguments_file) - try: - rc = generate_typesupport_connext_c(generator_args) + rc = generate_typesupport_connext_c(args.generator_arguments_file) except UnknownMessageType as e: print(str(e), file=sys.stderr) return 1 diff --git a/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake b/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake index 69db365..1199fa2 100644 --- a/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake @@ -12,65 +12,29 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(_ros_idl_files "") -foreach(_idl_file ${rosidl_generate_interfaces_IDL_FILES}) - get_filename_component(_extension "${_idl_file}" EXT) - # Skip .srv files - if(_extension STREQUAL ".msg") - list(APPEND _ros_idl_files "${_idl_file}") - endif() -endforeach() - -set(_dds_idl_files "") -set(_dds_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_dds_idl") -foreach(_idl_file ${rosidl_generate_interfaces_IDL_FILES}) - get_filename_component(_extension "${_idl_file}" EXT) - if(_extension STREQUAL ".msg") - get_filename_component(_parent_folder "${_idl_file}" DIRECTORY) - get_filename_component(_parent_folder "${_parent_folder}" NAME) - get_filename_component(_name "${_idl_file}" NAME_WE) - list(APPEND _dds_idl_files - "${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_connext/${_name}_.idl") - endif() -endforeach() set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_c/${PROJECT_NAME}") -set(_dds_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_cpp/${PROJECT_NAME}") + +set(_dds_idl_files "") set(_generated_files "") set(_generated_external_files "") -foreach(_idl_file ${rosidl_generate_interfaces_IDL_FILES}) - get_filename_component(_parent_folder "${_idl_file}" DIRECTORY) +foreach(_idl_tuple ${rosidl_generate_interfaces_IDL_TUPLES}) + # Get second part of tuple which has form "msg/Name.idl" or "srv/Name.idl" or "action/Name.idl" + string(REGEX REPLACE ":([^:]*)$" "/\\1" _rel_idl_file "${_idl_tuple}") + get_filename_component(_parent_folder "${_rel_idl_file}" DIRECTORY) get_filename_component(_parent_folder "${_parent_folder}" NAME) - get_filename_component(_extension "${_idl_file}" EXT) - get_filename_component(_msg_name "${_idl_file}" NAME_WE) - string_camel_case_to_lower_case_underscore("${_msg_name}" _header_name) - if(_extension STREQUAL ".msg" AND _msg_name MATCHES "Response$|Request$") - # Don't do anything - elseif(_extension STREQUAL ".msg") - set(_allowed_parent_folders "msg" "srv" "action") - if(NOT _parent_folder IN_LIST _allowed_parent_folders) - message(FATAL_ERROR "Interface file with unknown parent folder: ${_idl_file}") - endif() - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_msg_name}_.h") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_msg_name}_.cxx") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_msg_name}_Plugin.h") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_msg_name}_Plugin.cxx") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_msg_name}_Support.h") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_msg_name}_Support.cxx") - list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_c.h") - list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext_c/${_header_name}__type_support_c.cpp") - elseif(_extension STREQUAL ".srv") - set(_allowed_parent_folders "srv" "action") - if(NOT _parent_folder IN_LIST _allowed_parent_folders) - message(FATAL_ERROR "Interface file with unknown parent folder: ${_idl_file}") - endif() - list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_c.h") - list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext_c/${_header_name}__type_support_c.cpp") - list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext_c/${_header_name}__request__type_support_c.cpp") - list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext_c/${_header_name}__response__type_support_c.cpp") - else() - message(FATAL_ERROR "Interface file with unknown extension: ${_idl_file}") - endif() + get_filename_component(_idl_name "${_idl_file}" NAME_WE) + # Turn idl name into file names + string_camel_case_to_lower_case_underscore("${_idl_name}" _header_name) + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.h") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.cxx") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.h") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.cxx") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.h") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.cxx") + list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext/${_header_name}__type_support.c") + list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_c.h") + list(APPEND _dds_idl_files "${_abs_idl_file}") endforeach() # If not on Windows, disable some warnings with Connext's generated code @@ -101,34 +65,26 @@ endif() set(_dependency_files "") set(_dependencies "") foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) - foreach(_idl_file ${${_pkg_name}_INTERFACE_FILES}) - get_filename_component(_extension "${_idl_file}" EXT) - if(_extension STREQUAL ".msg") - get_filename_component(_parent_folder "${_idl_file}" DIRECTORY) - get_filename_component(_parent_folder "${_parent_folder}" NAME) - get_filename_component(_name "${_idl_file}" NAME_WE) - set(_abs_idl_file "${${_pkg_name}_DIR}/../${_parent_folder}/dds_connext/${_name}_.idl") - normalize_path(_abs_idl_file "${_abs_idl_file}") - list(APPEND _dependency_files "${_abs_idl_file}") - set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}") - normalize_path(_abs_idl_file "${_abs_idl_file}") - list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}") - endif() - endforeach() + foreach(_idl_file ${${_pkg_name}_IDL_FILES}) + # ${{_pkg_name}_DIR} is absolute path ending in 'share//cmake', so go back one + # directory for IDL files + set(_abs_idl_file "${${_pkg_name}_DIR}/../${_idl_file}") + normalize_path(_abs_idl_file "${_abs_idl_file}") + list(APPEND _dependency_files "${_abs_idl_file}") + list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}") endforeach() set(target_dependencies "${rosidl_typesupport_connext_c_BIN}" ${rosidl_typesupport_connext_c_GENERATOR_FILES} + "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/idl__rosidl_typesupport_connext_c.h.em" + "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/idl__dds_connext__type_support_c.cpp.em" "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/msg__type_support_c.cpp.em" "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/srv__type_support_c.cpp.em" ${_dependency_files}) foreach(dep ${target_dependencies}) if(NOT EXISTS "${dep}") - get_property(is_generated SOURCE "${dep}" PROPERTY GENERATED) - if(NOT ${_is_generated}) message(FATAL_ERROR "Target dependency '${dep}' does not exist") - endif() endif() endforeach() @@ -136,7 +92,7 @@ set(generator_arguments_file "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_con rosidl_write_generator_arguments( "${generator_arguments_file}" PACKAGE_NAME "${PROJECT_NAME}" - ROS_INTERFACE_FILES "${rosidl_generate_interfaces_IDL_FILES}" + IDL_TUPLES "${rosidl_generate_interfaces_IDL_TUPLES}" ROS_INTERFACE_DEPENDENCIES "${_dependencies}" OUTPUT_DIR "${_output_path}" TEMPLATE_DIR "${rosidl_typesupport_connext_c_TEMPLATE_DIR}" diff --git a/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c-extras.cmake.in b/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c-extras.cmake.in index e6c2069..510e1d4 100644 --- a/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c-extras.cmake.in +++ b/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c-extras.cmake.in @@ -9,7 +9,7 @@ if(NOT Connext_FOUND) else() find_package(ament_cmake_core QUIET REQUIRED) ament_register_extension( - "rosidl_generate_interfaces" + "rosidl_generate_idl_interfaces" "rosidl_typesupport_connext_c" "rosidl_typesupport_connext_c_generate_interfaces.cmake") diff --git a/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c/__init__.py b/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c/__init__.py index a7b924c..257c0e9 100644 --- a/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c/__init__.py +++ b/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c/__init__.py @@ -12,92 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os +from rosidl_cmake import generate_files -from rosidl_cmake import convert_camel_case_to_lower_case_underscore -from rosidl_cmake import expand_template -from rosidl_cmake import extract_message_types -from rosidl_cmake import get_newest_modification_time -from rosidl_parser import parse_message_file -from rosidl_parser import parse_service_file -from rosidl_parser import validate_field_types - -def generate_typesupport_connext_c(args): - template_dir = args['template_dir'] - mapping_msgs = { - os.path.join(template_dir, 'msg__rosidl_typesupport_connext_c.h.em'): - '%s__rosidl_typesupport_connext_c.h', - os.path.join(template_dir, 'msg__type_support_c.cpp.em'): - '%s__type_support_c.cpp', - } - - mapping_srvs = { - os.path.join(template_dir, 'srv__rosidl_typesupport_connext_c.h.em'): - '%s__rosidl_typesupport_connext_c.h', - os.path.join(template_dir, 'srv__type_support_c.cpp.em'): - '%s__type_support_c.cpp', +def generate_typesupport_connext_c(arguments_file): + mapping = { + 'idl__rosidl_typesupport_connext_c.h.em': + '%__rosidl_typesupport_connext_c.h', + 'idl__dds_connext__type_support_c.cpp.em': + 'dds_connext/%s__type_support_c.cpp' } - - for template_file in mapping_msgs.keys(): - assert os.path.exists(template_file), 'Could not find template: ' + template_file - - for template_file in mapping_srvs.keys(): - assert os.path.exists(template_file), 'Could not find template: ' + template_file - - pkg_name = args['package_name'] - known_msg_types = extract_message_types( - pkg_name, args['ros_interface_files'], args.get('ros_interface_dependencies', [])) - - functions = { - 'get_header_filename_from_msg_name': convert_camel_case_to_lower_case_underscore, - } - # generate_dds_connext_cpp() and therefore the make target depend on the additional files - # therefore they must be listed here even if the generated type support files are independent - latest_target_timestamp = get_newest_modification_time( - args['target_dependencies'] + args.get('additional_files', [])) - - for idl_file in args['ros_interface_files']: - extension = os.path.splitext(idl_file)[1] - subfolder = os.path.basename(os.path.dirname(idl_file)) - if extension == '.msg': - spec = parse_message_file(pkg_name, idl_file) - validate_field_types(spec, known_msg_types) - for template_file, generated_filename in mapping_msgs.items(): - generated_file = os.path.join(args['output_dir'], subfolder) - if generated_filename.endswith('.cpp'): - generated_file = os.path.join(generated_file, 'dds_connext_c') - generated_file = os.path.join( - generated_file, generated_filename % - convert_camel_case_to_lower_case_underscore(spec.base_type.type)) - - data = { - 'spec': spec, - 'pkg': spec.base_type.pkg_name, - 'msg': spec.msg_name, - 'type': spec.base_type.type, - 'subfolder': subfolder, - } - data.update(functions) - expand_template( - template_file, data, generated_file, - minimum_timestamp=latest_target_timestamp) - - elif extension == '.srv': - spec = parse_service_file(pkg_name, idl_file) - validate_field_types(spec, known_msg_types) - for template_file, generated_filename in mapping_srvs.items(): - generated_file = os.path.join(args['output_dir'], subfolder) - if generated_filename.endswith('.cpp'): - generated_file = os.path.join(generated_file, 'dds_connext_c') - generated_file = os.path.join( - generated_file, generated_filename % - convert_camel_case_to_lower_case_underscore(spec.srv_name)) - - data = {'spec': spec, 'subfolder': subfolder} - data.update(functions) - expand_template( - template_file, data, generated_file, - minimum_timestamp=latest_target_timestamp) - + generate_files(arguments_file, mapping) return 0 diff --git a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake index e25c1c7..69a0d53 100644 --- a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake @@ -25,7 +25,6 @@ foreach(_idl_tuple ${rosidl_generate_interfaces_IDL_TUPLES}) get_filename_component(_parent_folder "${_parent_folder}" NAME) get_filename_component(_idl_name "${_abs_idl_file}" NAME_WE) string_camel_case_to_lower_case_underscore("${_idl_name}" _header_name) - list(APPEND _dds_idl_files "${_abs_idl_file}") list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.h") list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.cxx") list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.h") @@ -34,6 +33,7 @@ foreach(_idl_tuple ${rosidl_generate_interfaces_IDL_TUPLES}) list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.cxx") list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_cpp.hpp") list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext/${_header_name}__type_support.cpp") + list(APPEND _dds_idl_files "${_abs_idl_file}") endforeach() # If not on Windows, disable some warnings with Connext's generated code @@ -179,7 +179,7 @@ ament_target_dependencies(${rosidl_generate_interfaces_TARGET}${_target_suffix} foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) set(_msg_include_dir "${${_pkg_name}_DIR}/../../../include/${_pkg_name}/msg/dds_connext") set(_srv_include_dir "${${_pkg_name}_DIR}/../../../include/${_pkg_name}/srv/dds_connext") - set(_action_include_dir "${${_pkg_name}_DIR}/../../../include/${_pkg_name}/action/dds_connext_c") + set(_action_include_dir "${${_pkg_name}_DIR}/../../../include/${_pkg_name}/action/dds_connext") normalize_path(_msg_include_dir "${_msg_include_dir}") normalize_path(_srv_include_dir "${_srv_include_dir}") normalize_path(_action_include_dir "${_action_include_dir}") From 7adbb90cc14f1c4891c6890338c34ddfaa0013cf Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Wed, 28 Nov 2018 17:32:20 -0800 Subject: [PATCH 06/20] Adds outer C IDL templates. --- .../idl__dds_connext__type_support_c.cpp.em | 55 +++++++++++++++ .../idl__rosidl_typesupport_connext_c.h.em | 68 +++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em create mode 100644 rosidl_typesupport_connext_c/resource/idl__rosidl_typesupport_connext_c.h.em diff --git a/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em new file mode 100644 index 0000000..cd6304f --- /dev/null +++ b/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em @@ -0,0 +1,55 @@ +// generated from rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em +// with input from @(package_name):@(interface_path) +// generated code does not contain a copyright notice + +@{ +####################################################################### +# EmPy template for generating __type_support_c.cpp files +# +# Context: +# - package_name (string) +# - content (rosidl_parser.definition.IdlContent result of parsing IDL file) +# - interface_path (Path relative to the directory named after the package) +####################################################################### +include_directives = set() +####################################################################### +# Handle message +####################################################################### +from rosidl_parser.definition import Message +for message in content.get_elements_of_type(Message): + TEMPLATE( + 'msg__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, message=message, + include_directives=include_directives + ) +####################################################################### +# Handle service +####################################################################### +from rosidl_parser.definition import Service +for service in content.get_elements_of_type(Service): + TEMPLATE( + 'srv__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, service=service, + include_directives=include_directives + ) +####################################################################### +# Handle action +####################################################################### +from rosidl_parser.definition import Action +for action in content.get_elements_of_type(Action): + TEMPLATE( + 'srv__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, service=action.goal_service, + include_directives=include_directives + ) + TEMPLATE( + 'srv__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, service=action.result_service, + include_directives=include_directives + ) + TEMPLATE( + 'msg__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, message=action.feedback_message, + include_directives=include_directives + ) +}@ diff --git a/rosidl_typesupport_connext_c/resource/idl__rosidl_typesupport_connext_c.h.em b/rosidl_typesupport_connext_c/resource/idl__rosidl_typesupport_connext_c.h.em new file mode 100644 index 0000000..a3f3f43 --- /dev/null +++ b/rosidl_typesupport_connext_c/resource/idl__rosidl_typesupport_connext_c.h.em @@ -0,0 +1,68 @@ +// generated from rosidl_typesupport_connext_c/resource/idl__rosidl_typesupport_connext_c.h.em +// with input from @(package_name):@(interface_path) +// generated code does not contain a copyright notice + +@{ +####################################################################### +# EmPy template for generating __rosidl_typesupport_connext_c.h files +# +# Context: +# - package_name (string) +# - content (rosidl_parser.definition.IdlContent result of parsing IDL file) +# - interface_path (Path relative to the directory named after the package) +####################################################################### +from rosidl_cmake import convert_camel_case_to_lower_case_underscore +include_parts = [package_name] + list(interface_path.parents[0].parts) + \ + [convert_camel_case_to_lower_case_underscore(interface_path.stem)] +header_guard_variable = '__'.join([x.upper() for x in include_parts]) + \ + '__ROSIDL_TYPESUPPORT_CONNEXT_C_H_' +include_directives = set() +}@ + +#ifndef @(header_guard_variable) +#define @(header_guard_variable) + +@{ +####################################################################### +# Handle message +####################################################################### +from rosidl_parser.definition import Message +for message in content.get_elements_of_type(Message): + TEMPLATE( + 'msg__rosidl_typesupport_connext_c.h.em', + package_name=package_name, interface_path=interface_path, message=message, + include_directives=include_directives + ) +####################################################################### +# Handle service +####################################################################### +from rosidl_parser.definition import Service +for service in content.get_elements_of_type(Service): + TEMPLATE( + 'srv__rosidl_typesupport_connext_c.h.em', + package_name=package_name, interface_path=interface_path, service=service, + include_directives=include_directives + ) +####################################################################### +# Handle action +####################################################################### +from rosidl_parser.definition import Action +for action in content.get_elements_of_type(Action): + TEMPLATE( + 'srv__rosidl_typesupport_connext_c.h.em', + package_name=package_name, interface_path=interface_path, service=action.goal_service, + include_directives=include_directives + ) + TEMPLATE( + 'srv__rosidl_typesupport_connext_c.h.em', + package_name=package_name, interface_path=interface_path, service=action.result_service, + include_directives=include_directives + ) + TEMPLATE( + 'msg__rosidl_typesupport_connext_c.h.em', + package_name=package_name, interface_path=interface_path, message=action.feedback_message, + include_directives=include_directives + ) +}@ + +#endif // @(header_guard_variable) \ No newline at end of file From ac74581f85c8704cb9431902d598e7815d45bc52 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Wed, 28 Nov 2018 17:37:34 -0800 Subject: [PATCH 07/20] Adapts C msg & srv header templates. --- .../msg__rosidl_typesupport_connext_c.h.em | 51 ++++++++----------- .../srv__rosidl_typesupport_connext_c.h.em | 50 ++++++++---------- 2 files changed, 41 insertions(+), 60 deletions(-) diff --git a/rosidl_typesupport_connext_c/resource/msg__rosidl_typesupport_connext_c.h.em b/rosidl_typesupport_connext_c/resource/msg__rosidl_typesupport_connext_c.h.em index 4f62b0e..fd1409f 100644 --- a/rosidl_typesupport_connext_c/resource/msg__rosidl_typesupport_connext_c.h.em +++ b/rosidl_typesupport_connext_c/resource/msg__rosidl_typesupport_connext_c.h.em @@ -1,45 +1,36 @@ -// generated from -// rosidl_typesupport_connext_c/resource/msg__rosidl_typesupport_connext_c.h.em -// generated code does not contain a copyright notice +@# Included from rosidl_typesupport_connext_c/resource/idl__rosidl_typesupport_connext_c.h.em -@####################################################################### -@# EmPy template for generating -@# __rosidl_typesupport_connext_c.h files -@# -@# Context: -@# - spec (rosidl_parser.MessageSpecification) -@# Parsed specification of the .msg file -@# - subfolder (string) -@# The subfolder / subnamespace of the message -@# Could be 'msg', 'srv' or 'action' -@# - get_header_filename_from_msg_name (function) -@####################################################################### -@ @{ -header_guard_parts = [ - spec.base_type.pkg_name, subfolder, - get_header_filename_from_msg_name(spec.base_type.type) + '__rosidl_typesupport_connext_c_h'] -header_guard_variable = '__'.join([x.upper() for x in header_guard_parts]) + '_' +header_files = [ + 'rosidl_generator_c/message_type_support_struct.h', + 'rosidl_typesupport_interface/macros.h', + package_name + '/msg/rosidl_typesupport_connext_cpp__visibility_control.h' +] }@ -#ifndef @(header_guard_variable) -#define @(header_guard_variable) -#include "rosidl_generator_c/message_type_support_struct.h" -#include "rosidl_typesupport_interface/macros.h" - -#include "@(spec.base_type.pkg_name)/msg/rosidl_typesupport_connext_c__visibility_control.h" +@[for header_file in header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ #ifdef __cplusplus extern "C" { #endif -ROSIDL_TYPESUPPORT_CONNEXT_C_PUBLIC_@(spec.base_type.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_C_PUBLIC_@(package_name) const rosidl_message_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(spec.base_type.pkg_name), @(subfolder), @(spec.base_type.type))(); + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join([package_name] + list(interface_path.parents[0].parts))), + @(message.structure.type.name))(); + #ifdef __cplusplus } #endif - -#endif // @(header_guard_variable) diff --git a/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em b/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em index da34b1c..0fd4d1a 100644 --- a/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em +++ b/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em @@ -1,45 +1,35 @@ -// generated from -// rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em -// generated code does not contain a copyright notice +@# Included from rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em -@####################################################################### -@# EmPy template for generating -@# __rosidl_typesupport_connext_c.h files -@# -@# Context: -@# - spec (rosidl_parser.MessageSpecification) -@# Parsed specification of the .srv file -@# - subfolder (string) -@# The subfolder / subnamespace of the message -@# Either 'srv' or 'action' -@# - get_header_filename_from_srv_name (function) -@####################################################################### -@ @{ -header_guard_parts = [ - spec.pkg_name, subfolder, - get_header_filename_from_msg_name(spec.srv_name) + '__rosidl_typesupport_connext_c_h'] -header_guard_variable = '__'.join([x.upper() for x in header_guard_parts]) + '_' +header_files = [ + 'rosidl_generator_c/service_type_support_struct.h', + 'rosidl_typesupport_interface/macros.h', + package_name + '/msg/rosidl_typesupport_connext_cpp__visibility_control.h' +] }@ -#ifndef @(header_guard_variable) -#define @(header_guard_variable) -#include "rosidl_generator_c/service_type_support_struct.h" -#include "rosidl_typesupport_interface/macros.h" - -#include "@(spec.pkg_name)/msg/rosidl_typesupport_connext_c__visibility_control.h" +@[for header_file in header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ #ifdef __cplusplus extern "C" { #endif -ROSIDL_TYPESUPPORT_CONNEXT_C_PUBLIC_@(spec.pkg_name) +ROSIDL_TYPESUPPORT_CONNEXT_C_PUBLIC_@(package_name) const rosidl_service_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(spec.pkg_name), @(subfolder), @(spec.srv_name))(); + ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join([package_name] + list(interface_path.parents[0].parts))), + @(service.structure.type.name))(); #ifdef __cplusplus } #endif - -#endif // @(header_guard_variable) From 52ac07c2beb0dc8f7291b01a19f3c5e2aa272f36 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Wed, 28 Nov 2018 18:09:28 -0800 Subject: [PATCH 08/20] Adapts C msg source template. --- .../resource/msg__type_support_c.cpp.em | 392 ++++++++++-------- 1 file changed, 222 insertions(+), 170 deletions(-) diff --git a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em index 300611f..321c12b 100644 --- a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em @@ -1,46 +1,50 @@ -// generated from rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em -// generated code does not contain a copyright notice - -@########################################################################## -@# EmPy template for generating __type_support_c.cpp files for Connext -@# -@# Context: -@# - spec (rosidl_parser.MessageSpecification) -@# Parsed specification of the .msg file -@# - pkg (string) -@# name of the containing package; equivalent to spec.base_type.pkg_name -@# - msg (string) -@# name of the message; equivalent to spec.msg_name -@# - type (string) -@# full type of the message; equivalent to spec.base_type.type -@# - subfolder (string) -@# The subfolder / subnamespace of the message -@# Could be 'msg', 'srv' or 'action' -@# - get_header_filename_from_msg_name (function) -@########################################################################## -@ -#include "@(spec.base_type.pkg_name)/@(subfolder)/@(get_header_filename_from_msg_name(spec.base_type.type))__rosidl_typesupport_connext_c.h" +@# Included from rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em -#include -#include +@{ +from rosidl_cmake import convert_camel_case_to_lower_case_underscore +include_parts = [package_name] + list(interface_path.parents[0].parts) +include_base = '/'.join(include_parts) +message_name = convert_camel_case_to_lower_case_underscore(message.structure.type.name) -#include "rcutils/types/uint8_array.h" +system_header_files = [ + 'cassert', 'limits' +] -// Provides the rosidl_typesupport_connext_c__identifier symbol declaration. -#include "rosidl_typesupport_connext_c/identifier.h" -// Provides the definition of the message_type_support_callbacks_t struct. -#include "rosidl_typesupport_connext_cpp/message_type_support.h" +header_files = [ + include_base + '/' + message_name + '__rosidl_typesupport_connext_c.h', + 'rcutils/types/uint8_array.h', + 'rosidl_typesupport_connext_c/identifier.h', + 'rosidl_typesupport_connext_c/message_type_support.h', + package_name + '/msg/rosidl_typesupport_connext_c__visibility_control.h', + include_base + '/' + message_name + '__struct.h', + include_base + '/' + message_name + '__functions.h' +] -#include "@(pkg)/msg/rosidl_typesupport_connext_c__visibility_control.h" -@{ -header_filename = get_header_filename_from_msg_name(spec.base_type.type) -if header_filename.endswith('__request'): - header_filename = header_filename[:-9] -elif header_filename.endswith('__response'): - header_filename = header_filename[:-10] +dds_specific_header_files = [ + include_base + '/dds_connext/' + message.structure.type.name + '_Support.h', + include_base + '/dds_connext/' + message.structure.type.name + '_Plugin.h' +] }@ -#include "@(pkg)/@(subfolder)/@(header_filename)__struct.h" -#include "@(pkg)/@(subfolder)/@(header_filename)__functions.h" + +@[for header_file in system_header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include <@(header_file)> +@[end for]@ + +@[for header_file in header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ #ifndef _WIN32 # pragma GCC diagnostic push @@ -50,8 +54,17 @@ elif header_filename.endswith('__response'): # pragma clang diagnostic ignored "-Wreturn-type-c-linkage" # endif #endif -#include "@(spec.base_type.pkg_name)/@(subfolder)/dds_connext/@(spec.base_type.type)_Support.h" -#include "@(spec.base_type.pkg_name)/@(subfolder)/dds_connext/@(spec.base_type.type)_Plugin.h" + +@[for header_file in dds_specific_header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ + #ifndef _WIN32 # pragma GCC diagnostic pop #endif @@ -65,63 +78,92 @@ extern "C" #endif @{ -includes = {} -for field in spec.fields: - keys = set([]) - if field.type.is_primitive_type(): - if field.type.is_array: - keys.add('rosidl_generator_c/primitives_sequence.h') - keys.add('rosidl_generator_c/primitives_sequence_functions.h') - if field.type.type == 'string': - keys.add('rosidl_generator_c/string.h') - keys.add('rosidl_generator_c/string_functions.h') +from collections import OrderedDict +includes = OrderedDict() +for member in message.structure.members: + if isinstance(member.type, Sequence) and isinstance(member.type.basetype, BasicType): + includes.setdefault('rosidl_generator_c/primitives_sequence.h', []).append(member.name) + includes.setdefault('rosidl_generator_c/primitives_sequence_functions.h', []).append(member.name) + continue + type_ = member.type + if isinstance(type_, NestedType): + type_ = type_.basetype + if isinstance(member.type, String): + includes.setdefault('rosidl_generator_c/string.h', []).append(member.name) + includes.setdefault('rosidl_generator_c/string_functions.h', []).append(member.name) + elif isinstance(member.type, WString): + includes.setdefault('rosidl_generator_c/u16string.h', []).append(member.name) + includes.setdefault('rosidl_generator_c/u16string_functions.h', []).append(member.name) else: - header_file_name = get_header_filename_from_msg_name(field.type.type) - if header_file_name.endswith('__request'): - header_file_name = header_file_name[:-9] - elif header_file_name.endswith('__response'): - header_file_name = header_file_name[:-10] - keys.add('%s/msg/%s__functions.h' % (field.type.pkg_name, header_file_name)) - for key in keys: - if key not in includes: - includes[key] = set([]) - includes[key].add(field.name) + include_prefix = idl_structure_type_to_c_include_prefix(type_) + if include_prefix.endswith('__request'): + include_prefix = include_prefix[:-9] + elif include_prefix.endswith('__response'): + include_prefix = include_prefix[:-10] + if include_prefix.endswith('__goal'): + include_prefix = include_prefix[:-6] + elif include_prefix.endswith('__result'): + include_prefix = include_prefix[:-8] + elif include_prefix.endswith('__feedback'): + include_prefix = include_prefix[:-10] + includes.setdefault(include_prefix + '__struct.h', []).append(member.name) + includes.setdefault(include_prefix + '__functions.h', []).append(member.name) }@ -@[for key in sorted(includes.keys())]@ -#include "@(key)" // @(', '.join(includes[key])) -@[end for]@ + +@[if includes]@ +// Include directives for member types +@[ for header_file, member_names in includes.items()]@ +@[ for member_name in member_names]@ +// Member '@(member_name)' +@[ end for]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[ end for]@ +@[end if]@ // forward declare type support functions @{ -forward_declares = {} -for field in spec.fields: - if not field.type.is_primitive_type(): - key = (field.type.pkg_name, field.type.type) - if key not in includes: - forward_declares[key] = set([]) - forward_declares[key].add(field.name) +from collections import OrderedDict +forward_declares = OrderedDict() +for member in message.structure.members: + if isinstance(member.type, NamespacedType): + forward_declares.setdefault(member.type, []).append(member.name) }@ -@[for key in sorted(forward_declares.keys())]@ -@[ if key[0] != pkg]@ -ROSIDL_TYPESUPPORT_CONNEXT_C_IMPORT_@(pkg) + +@[for member_type, member_names in forward_declares.items())]@ +@[ for name in member_names]@ +// Member '@(name)' +@[ end for]@ +@[ if member_type.namespaces[0] != package_name]@ +ROSIDL_TYPESUPPORT_CONNEXT_C_IMPORT_@(type_.namespaces[0]) @[ end if]@ const rosidl_message_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(key[0]), msg, @(key[1]))(); + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join(member_type.namespaces)), + member_type.name)(); @[end for]@ @# // Make callback functions specific to this message type. @{ -__dds_msg_type_prefix = "{0}::{1}::dds_::{2}_".format( - spec.base_type.pkg_name, subfolder, spec.base_type.type) +__ros_c_msg_type = '__'.join(message.structure.namespaces + [message.structure.type.name]) +__dds_cpp_msg_type_prefix = '::'.join(message.structure.namespaces + ['dds_', message.structure.type.name]) +__dds_cpp_msg_type = __dds_msg_type_prefix + '_' }@ -using __dds_msg_type = @(__dds_msg_type_prefix); -using __ros_msg_type = @(pkg)__@(subfolder)__@(type); + +using __dds_msg_type = @(__dds_cpp_msg_type); +using __ros_msg_type = @(__ros_c_msg_type); static DDS_TypeCode * get_type_code() { - return @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_TypeSupport::get_typecode(); + return @(__dds_cpp_msg_type_prefix)_TypeSupport::get_typecode(); } static bool @@ -137,54 +179,59 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) } const __ros_msg_type * ros_message = static_cast(untyped_ros_message); __dds_msg_type * dds_message = static_cast<__dds_msg_type *>(untyped_dds_message); -@[if not spec.fields]@ +@[if not message.structure.members]@ // No fields is a no-op. (void)dds_message; (void)ros_message; @[end if]@ -@[for field in spec.fields]@ - // Field name: @(field.name) - { -@[ if not field.type.is_primitive_type()]@ - const message_type_support_callbacks_t * @(field.type.pkg_name)__msg__@(field.type.type)__callbacks = +@[for member in message.structure.members]@ + // Member name: @(member.name) + { +@{ + type_ = member.type + if isinstance(type_, NestedType): + type_ = type_.basetype +}@ +@[ if isinstance(type_, NamespacedType)]@ + const message_type_support_callbacks_t * @('__'.join(type_.namespaces + type_.name))__callbacks = static_cast( - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(field.type.pkg_name), msg, @(field.type.type) + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(', '.join(type_.namespaces)), @(type_.name) )()->data); @[ end if]@ -@[ if field.type.is_array]@ -@[ if field.type.array_size and not field.type.is_upper_bound]@ - size_t size = @(field.type.array_size); +@[ if isinstance(member.type, NestedType)]@ +@[ if isinstance(member.type, Array)]@ + size_t size = @(member.type.size); @[ else]@ - size_t size = ros_message->@(field.name).size; + size_t size = ros_message->@(member.name).size; if (size > (std::numeric_limits::max)()) { fprintf(stderr, "array size exceeds maximum DDS sequence size\n"); return false; } -@[ if field.type.is_upper_bound]@ - if (size > @(field.type.array_size)) { +@[ if isinstance(member.type, BoundedSequence)]@ + if (size > @(field.type.upper_bound)) { fprintf(stderr, "array size exceeds upper bound\n"); return false; } @[ end if]@ DDS_Long length = static_cast(size); - if (length > dds_message->@(field.name)_.maximum()) { - if (!dds_message->@(field.name)_.maximum(length)) { + if (length > dds_message->@(member.name)_.maximum()) { + if (!dds_message->@(member.name)_.maximum(length)) { fprintf(stderr, "failed to set maximum of sequence\n"); return false; } } - if (!dds_message->@(field.name)_.length(length)) { + if (!dds_message->@(member.name)_.length(length)) { fprintf(stderr, "failed to set length of sequence\n"); return false; } @[ end if]@ for (DDS_Long i = 0; i < static_cast(size); ++i) { -@[ if field.type.array_size and not field.type.is_upper_bound]@ - auto & ros_i = ros_message->@(field.name)[i]; +@[ if isinstance(member.type, Array)]@ + auto & ros_i = ros_message->@(member.name)[i]; @[ else]@ - auto & ros_i = ros_message->@(field.name).data[i]; + auto & ros_i = ros_message->@(member.name).data[i]; @[ end if]@ -@[ if field.type.type == 'string']@ +@[ if isinstance(member.type, String)]@ const rosidl_generator_c__String * str = &ros_i; if (str->capacity == 0 || str->capacity <= str->size) { fprintf(stderr, "string capacity not greater than size\n"); @@ -194,21 +241,25 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) fprintf(stderr, "string not null-terminated\n"); return false; } - dds_message->@(field.name)_[static_cast(i)] = DDS_String_dup(str->data); -@[ elif field.type.type == 'bool']@ - dds_message->@(field.name)_[i] = 1 ? ros_i : 0; -@[ elif field.type.is_primitive_type()]@ - dds_message->@(field.name)_[i] = ros_i; + dds_message->@(member.name)_[static_cast(i)] = DDS_String_dup(str->data); +@[ elif isinstance(member.type, WString)]@ +@[ assert False, 'TBD']@ +@[ elif isinstance(member.type, BasicType)]@ +@[ if member.type.type == 'boolean']@ + dds_message->@(member.name)_[i] = 1 ? ros_i : 0; +@[ else]@ + dds_message->@(member.name)_[i] = ros_i; +@[ end if]@ @[ else]@ - if (!@(field.type.pkg_name)__msg__@(field.type.type)__callbacks->convert_ros_to_dds( - &ros_i, &dds_message->@(field.name)_[i])) + if (!@(idl_structure_type_to_c_typename(member.type))__callbacks->convert_ros_to_dds( + &ros_i, &dds_message->@(member.name)_[i])) { return false; } @[ end if]@ } -@[ elif field.type.type == 'string']@ - const rosidl_generator_c__String * str = &ros_message->@(field.name); +@[ elif isinstance(member.type, String)]@ + const rosidl_generator_c__String * str = &ros_message->@(member.name); if (str->capacity == 0 || str->capacity <= str->size) { fprintf(stderr, "string capacity not greater than size\n"); return false; @@ -217,12 +268,14 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) fprintf(stderr, "string not null-terminated\n"); return false; } - dds_message->@(field.name)_ = DDS_String_dup(str->data); -@[ elif field.type.is_primitive_type()]@ - dds_message->@(field.name)_ = ros_message->@(field.name); + dds_message->@(member.name)_ = DDS_String_dup(str->data); +@[ elif isinstance(member.type, WString)]@ +@[ assert False, 'TBD']@ +@[ elif isinstance(member.type, BasicType)]@ + dds_message->@(member.name)_ = ros_message->@(member.name); @[ else]@ - if (!@(field.type.pkg_name)__msg__@(field.type.type)__callbacks->convert_ros_to_dds( - &ros_message->@(field.name), &dds_message->@(field.name)_)) + if (!@(idl_structure_type_to_c_typename(member.type))__callbacks->convert_ros_to_dds( + &ros_message->@(member.name), &dds_message->@(member.name)_)) { return false; } @@ -246,88 +299,84 @@ convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message) } const __dds_msg_type * dds_message = static_cast(untyped_dds_message); __ros_msg_type * ros_message = static_cast<__ros_msg_type *>(untyped_ros_message); -@[if not spec.fields]@ +@[if not message.structure.members]@ // No fields is a no-op. (void)dds_message; (void)ros_message; @[end if]@ -@[for field in spec.fields]@ - // Field name: @(field.name) +@[for member in message.structure.members]@ + // Member name: @(member.name) { -@[ if field.type.is_array]@ -@[ if field.type.array_size and not field.type.is_upper_bound]@ - DDS_Long size = @(field.type.array_size); +@[ if isinstance(member.type, NestedType)]@ +@[ if isinstance(member.type, Array)]@ + DDS_Long size = @(member.type.size); @[ else]@ -@{ -if field.type.type == 'string': - array_init = 'rosidl_generator_c__String__Sequence__init' - array_fini = 'rosidl_generator_c__String__Sequence__fini' -elif field.type.is_primitive_type(): - type_ = field.type.type - if type_ == 'char': - type_ = 'uint8' - array_init = 'rosidl_generator_c__{type_}__Sequence__init'.format(**locals()) - array_fini = 'rosidl_generator_c__{type_}__Sequence__fini'.format(**locals()) -else: - array_init = '{field.type.pkg_name}__msg__{field.type.type}__Sequence__init'.format(**locals()) - array_fini = '{field.type.pkg_name}__msg__{field.type.type}__Sequence__fini'.format(**locals()) -}@ - DDS_Long size = dds_message->@(field.name)_.length(); - if (ros_message->@(field.name).data) { - @(array_fini)(&ros_message->@(field.name)); + DDS_Long size = dds_message->@(member.name)_.length(); + if (ros_message->@(member.name).data) { + @(idl_type_to_c(member.type) + '__fini')(&ros_message->@(member.name)); } - if (!@(array_init)(&ros_message->@(field.name), size)) { - return "failed to create array for field '@(field.name)'"; + if (!@(idl_type_to_c(member.type) + '__init')(&ros_message->@(member.name), size)) { + return "failed to create array for field '@(member.name)'"; } @[ end if]@ for (DDS_Long i = 0; i < size; i++) { -@[ if field.type.array_size and not field.type.is_upper_bound]@ - auto & ros_i = ros_message->@(field.name)[i]; +@[ if isinstance(member.type, Array)]@ + auto & ros_i = ros_message->@(member.name)[i]; @[ else]@ - auto & ros_i = ros_message->@(field.name).data[i]; + auto & ros_i = ros_message->@(member.name).data[i]; @[ end if]@ -@[ if field.type.type == 'bool']@ - ros_i = (dds_message->@(field.name)_[i] != 0); -@[ elif field.type.type == 'string']@ +@[ if isinstance(member.type, BasicType) and member.type.type == 'boolean']@ + ros_i = (dds_message->@(member.name)_[i] != 0); +@[ elif isinstance(member.type, String)]@ if (!ros_i.data) { rosidl_generator_c__String__init(&ros_i); } bool succeeded = rosidl_generator_c__String__assign( &ros_i, - dds_message->@(field.name)_[i]); + dds_message->@(member.name)_[i]); if (!succeeded) { - fprintf(stderr, "failed to assign string into field '@(field.name)'\n"); + fprintf(stderr, "failed to assign string into field '@(member.name)'\n"); return false; } -@[ elif field.type.is_primitive_type()]@ - ros_i = dds_message->@(field.name)_[i]; +@[ elif isinstance(member.type, WString)]@ +@[ assert False, 'TBD']@ +@[ elif isinstance(member.type, BasicType)]@ + ros_i = dds_message->@(member.name)_[i]; @[ else]@ const rosidl_message_type_support_t * ts = - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(field.type.pkg_name), msg, @(field.type.type))(); + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join(member.type.namespaces)), + @(member.type.name))(); const message_type_support_callbacks_t * callbacks = static_cast(ts->data); - callbacks->convert_dds_to_ros(&dds_message->@(field.name)_[i], &ros_i); + callbacks->convert_dds_to_ros(&dds_message->@(member.name)_[i], &ros_i); @[ end if]@ } -@[ elif field.type.type == 'string']@ - if (!ros_message->@(field.name).data) { - rosidl_generator_c__String__init(&ros_message->@(field.name)); +@[ elif isinstance(member.type, String)]@ + if (!ros_message->@(member.name).data) { + rosidl_generator_c__String__init(&ros_message->@(member.name)); } bool succeeded = rosidl_generator_c__String__assign( - &ros_message->@(field.name), - dds_message->@(field.name)_); + &ros_message->@(member.name), + dds_message->@(member.name)_); if (!succeeded) { - fprintf(stderr, "failed to assign string into field '@(field.name)'\n"); + fprintf(stderr, "failed to assign string into field '@(member.name)'\n"); return false; } -@[ elif field.type.is_primitive_type()]@ - ros_message->@(field.name) = dds_message->@(field.name)_@(' == static_cast(true)' if field.type.type == 'bool' else ''); +@[ elif isinstance(member.type, WString)]@ +@[ assert False, 'TBD']@ +@[ elif isinstance(member.type, BasicType)]@ + ros_message->@(member.name) = dds_message->@(member.name)_@(' == static_cast(true)' if member.type.type == 'boolean' else ''); @[ else]@ const rosidl_message_type_support_t * ts = - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(field.type.pkg_name), msg, @(field.type.type))(); + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(','.join(member.type.namespaces)), + @(member.type.name))(); const message_type_support_callbacks_t * callbacks = static_cast(ts->data); - callbacks->convert_dds_to_ros(&dds_message->@(field.name)_, &ros_message->@(field.name)); + callbacks->convert_dds_to_ros(&dds_message->@(member.name)_, &ros_message->@(member.name)); @[ end if]@ } @@ -355,10 +404,10 @@ to_cdr_stream( // call the serialize function for the first time to get the expected length of the message unsigned int expected_length; - if (@(spec.base_type.type)_Plugin_serialize_to_cdr_buffer( + if (@(message.structure.type.name)_Plugin_serialize_to_cdr_buffer( NULL, &expected_length, &dds_message) != RTI_TRUE) { - fprintf(stderr, "failed to call @(spec.base_type.type)_Plugin_serialize_to_cdr_buffer()\n"); + fprintf(stderr, "failed to call @(message.structure.type.name)_Plugin_serialize_to_cdr_buffer()\n"); return false; } cdr_stream->buffer_length = expected_length; @@ -372,7 +421,7 @@ to_cdr_stream( } // call the function again and fill the buffer this time unsigned int buffer_length_uint = static_cast(cdr_stream->buffer_length); - if (@(spec.base_type.type)_Plugin_serialize_to_cdr_buffer( + if (@(message.structure.type.name)_Plugin_serialize_to_cdr_buffer( reinterpret_cast(cdr_stream->buffer), &buffer_length_uint, &dds_message) != RTI_TRUE) @@ -395,13 +444,13 @@ to_message( return false; } - @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_ * dds_message = - @(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_TypeSupport::create_data(); + @(__dds_msg_type) * dds_message = + @(__dds_msg_type_prefix)_TypeSupport::create_data(); if (cdr_stream->buffer_length > (std::numeric_limits::max)()) { fprintf(stderr, "cdr_stream->buffer_length, unexpectedly larger than max unsigned int\n"); return false; } - if (@(spec.base_type.type)_Plugin_deserialize_from_cdr_buffer( + if (@(message.structure.type.name)_Plugin_deserialize_from_cdr_buffer( dds_message, reinterpret_cast(cdr_stream->buffer), static_cast(cdr_stream->buffer_length)) != RTI_TRUE) @@ -410,7 +459,7 @@ to_message( return false; } bool success = convert_dds_to_ros(dds_message, untyped_ros_message); - if (@(spec.base_type.pkg_name)::@(subfolder)::dds_::@(spec.base_type.type)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { + if (@(__dds_msg_type_prefix)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { return false; } return success; @@ -420,8 +469,8 @@ to_message( @# // Collect the callback functions and provide a function to get the type support struct. static message_type_support_callbacks_t __callbacks = { - "@(pkg)", // package_name - "@(msg)", // message_name + "@(package_name)", // package_name + "@(message.structure.type.name)", // message_name get_type_code, // get_type_code convert_ros_to_dds, // convert_ros_to_dds convert_dds_to_ros, // convert_dds_to_ros @@ -436,7 +485,10 @@ static rosidl_message_type_support_t __type_support = { }; const rosidl_message_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(pkg), @(subfolder), @(msg))() { +ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join([package_name] + list(interface_path.parents[0].parts))), + @(message.structure.type.name))() {} return &__type_support; } From 45ed6e55282d4ec9a3ce50d78dd5e531db90330d Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Thu, 29 Nov 2018 07:43:40 -0800 Subject: [PATCH 09/20] Adapts C msg & srv source templates. --- .../srv__rosidl_typesupport_connext_c.h.em | 2 +- .../resource/srv__type_support_c.cpp.em | 249 +++++++++++------- .../resource/srv__type_support.cpp.em | 54 ++-- 3 files changed, 178 insertions(+), 127 deletions(-) diff --git a/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em b/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em index 0fd4d1a..2854b93 100644 --- a/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em +++ b/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em @@ -28,7 +28,7 @@ const rosidl_service_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( rosidl_typesupport_connext_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), - @(service.structure.type.name))(); + @(service.structure_type.name))(); #ifdef __cplusplus } diff --git a/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em index 0d03a5e..0a9131f 100644 --- a/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em @@ -1,19 +1,52 @@ -// generated from rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em -// generated code does not contain a copyright notice - -@####################################################################### -@# EmPy template for generating __type_support_c.cpp files -@# -@# Context: -@# - spec (rosidl_parser.ServiceSpecification) -@# Parsed specification of the .srv file -@# - subfolder (string) -@# The subfolder / subnamespace of the message -@# Either 'srv' or 'action' -@# - get_header_filename_from_msg_name (function) -@####################################################################### -@ -#include "@(spec.pkg_name)/@(subfolder)/@(get_header_filename_from_msg_name(spec.srv_name))__rosidl_typesupport_connext_c.h" +@# Included from rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em + +@{ +TEMPLATE( + 'msg__type_support.c.em', + package_name=package_name, interface_path=interface_path, message=service.request_message, + include_directives=include_directives +) +}@ + +@{ +TEMPLATE( + 'msg__type_support.c.em', + package_name=package_name, interface_path=interface_path, message=service.response_message, + include_directives=include_directives +) +}@ + +@{ +from rosidl_cmake import convert_camel_case_to_lower_case_underscore +include_parts = [package_name] + list(interface_path.parents[0].parts) +include_base = '/'.join(include_parts) +service_name = convert_camel_case_to_lower_case_underscore(service.structure.type.name) +request_message_name = convert_camel_case_to_lower_case_underscore(service.request_message.structure.type.name) +response_message_name = convert_camel_case_to_lower_case_underscore(service.response_message.structure.type.name) + +header_files = [ + include_base + '/' + service_name + '__rosidl_typesupport_connext_c.h', + 'rosidl_typesupport_connext_cpp/service_type_support.h', + 'rosidl_typesupport_connext_cpp/message_type_support.h' + 'rmw/rmw.h', + 'rosidl_typesupport_cpp/service_type_support.hpp', + 'rosidl_typesupport_connext_c/identifier.h', + package_name + '/msg/rosidl_typesupport_connext_c__visibility_control.h', + include_base + '/' + service_name + '.h', + include_base + '/dds_connext/' + service.request_message.structure.type.name + '_Support.h', + include_base + '/' + request_message_name + '__rosidl_typesupport_connext_c.h', + include_base + '/dds_connext/' + service.response_message.structure.type.name + '_Support.h', + include_base + '/' + response_message_name + '__rosidl_typesupport_connext_c.h' +# Re-use most of the functions from C++ typesupport + include_base + '/' + service_name + '__rosidl_typesupport_connext_cpp.hpp', +] + +dds_specific_header_files = [ + 'ndds/connext_cpp/connext_cpp_requester_details.h', + 'ndds/ndds_cpp.h', + 'ndds/ndds_requestreply_cpp.h' +] +}@ #ifdef Connext_GLIBCXX_USE_CXX11_ABI_ZERO #define _GLIBCXX_USE_CXX11_ABI 0 @@ -27,34 +60,30 @@ # pragma clang diagnostic ignored "-Wreturn-type-c-linkage" # endif #endif -#include -#include -#include + +@[for header_file in dds_specific_header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include <@(header_file)> +@[end for]@ + #ifndef _WIN32 # pragma GCC diagnostic pop #endif -// Provides the definition of the service_type_support_callbacks_t struct. -#include -// Provides the definition of the message_type_support_callbacks_t struct. -#include - -#include "rmw/rmw.h" -#include "rmw/error_handling.h" -#include "rosidl_typesupport_cpp/service_type_support.hpp" -#include "rosidl_typesupport_connext_c/identifier.h" - -#include "@(spec.pkg_name)/msg/rosidl_typesupport_connext_c__visibility_control.h" -@{header_file_name = get_header_filename_from_msg_name(spec.srv_name)}@ -#include "@(spec.pkg_name)/@(subfolder)/@(header_file_name).h" - -#include "@(spec.pkg_name)/@(subfolder)/dds_connext/@(spec.srv_name)_Request_Support.h" -#include "@(spec.pkg_name)/@(subfolder)/@(get_header_filename_from_msg_name(spec.srv_name + '_Request'))__rosidl_typesupport_connext_c.h" -#include "@(spec.pkg_name)/@(subfolder)/dds_connext/@(spec.srv_name)_Response_Support.h" -#include "@(spec.pkg_name)/@(subfolder)/@(get_header_filename_from_msg_name(spec.srv_name + '_Response'))__rosidl_typesupport_connext_c.h" - -// Re-use most of the functions from C++ typesupport -#include "@(spec.pkg_name)/@(subfolder)/@(get_header_filename_from_msg_name(spec.srv_name))__rosidl_typesupport_connext_cpp.hpp" +@[for header_file in header_files]@ +@[ if header_file in include_directives]@ +// already included above +// @ +@[ else]@ +@{include_directives.add(header_file)}@ +@[ end if]@ +#include "@(header_file)" +@[end for]@ class DDSDomainParticipant; class DDSDataReader; @@ -65,13 +94,15 @@ extern "C" { #endif -// forward declare type support functions -const rosidl_message_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(spec.pkg_name), @(subfolder), @(spec.srv_name)_Request)(); -const rosidl_message_type_support_t * - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(spec.pkg_name), @(subfolder), @(spec.srv_name)_Response)(); +@{ +__ros_srv_pkg_prefix = '::'.join(service.structure_type.namespaces) +__ros_request_msg_type = __ros_srv_pkg_prefix + '::' + service.request_message.structure.type.name +__ros_response_msg_type = __ros_srv_pkg_prefix + '::' + service.response_message.structure.type.name +__dds_request_msg_type = __ros_srv_pkg_prefix + '::dds_::' + service.request_message.structure.type.name + '_' +__dds_response_msg_type = __ros_srv_pkg_prefix + '::dds_::' + service.response_message.structure.type.name + '_' +}@ -void * create_requester__@(subfolder)__@(spec.srv_name)( +static void * create_requester__@(service.structure_type.name)( void * untyped_participant, const char * request_topic_str, const char * response_topic_str, @@ -81,7 +112,7 @@ void * create_requester__@(subfolder)__@(spec.srv_name)( void ** untyped_writer, void * (*allocator)(size_t)) { - return @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::create_requester__@(spec.srv_name)( + return @('::'.join(service.structure_type.namespaces))::typesupport_connext_cpp::create_requester__@(service.structure_type.name)( untyped_participant, request_topic_str, response_topic_str, @@ -91,26 +122,28 @@ void * create_requester__@(subfolder)__@(spec.srv_name)( untyped_writer, allocator); } -const char * destroy_requester__@(subfolder)__@(spec.srv_name)( +static const char * destroy_requester__@(service.structure_type.name)( void * untyped_requester, void (* deallocator)(void *)) { - return @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::destroy_requester__@(spec.srv_name)( + return @('::'.join(service.structure_type.namespaces))::typesupport_connext_cpp::destroy_requester__@(service.structure_type.name)( untyped_requester, deallocator); } -int64_t send_request__@(subfolder)__@(spec.srv_name)( +static int64_t send_request__@(service.structure_type.name)( void * untyped_requester, const void * untyped_ros_request) { using RequesterType = connext::Requester< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; - connext::WriteSample< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_> request; + connext::WriteSample<@(__dds_request_msg_type)> request; const rosidl_message_type_support_t * ts = - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(spec.pkg_name), @(subfolder), @(spec.srv_name)_Request)(); + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join(service.request_message.structure.type.namespaces)), + @(service.request_message.structure.type.name))(); const message_type_support_callbacks_t * callbacks = static_cast(ts->data); bool converted = callbacks->convert_ros_to_dds( @@ -128,7 +161,7 @@ int64_t send_request__@(subfolder)__@(spec.srv_name)( return sequence_number; } -void * create_replier__@(subfolder)__@(spec.srv_name)( +static void * create_replier__@(service.structure_type.name)( void * untyped_participant, const char * request_topic_str, const char * response_topic_str, @@ -138,7 +171,7 @@ void * create_replier__@(subfolder)__@(spec.srv_name)( void ** untyped_writer, void * (*allocator)(size_t)) { - return @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::create_replier__@(spec.srv_name)( + return @('::'.join(service.structure_type.namespaces))::typesupport_connext_cpp::create_replier__@(service.structure_type.name)( untyped_participant, request_topic_str, response_topic_str, @@ -149,22 +182,22 @@ void * create_replier__@(subfolder)__@(spec.srv_name)( allocator); } -const char * destroy_replier__@(subfolder)__@(spec.srv_name)( +static const char * destroy_replier__@(service.structure_type.name)( void * untyped_replier, void (* deallocator)(void *)) { - return @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::destroy_replier__@(spec.srv_name)( + return @('::'.join(service.structure_type.namespaces))::typesupport_connext_cpp::destroy_replier__@(service.structure_type.name)( untyped_replier, deallocator); } -bool take_request__@(subfolder)__@(spec.srv_name)( +static bool take_request__@(service.structure_type.name)( void * untyped_replier, rmw_request_id_t * request_header, void * untyped_ros_request) { using ReplierType = connext::Replier< - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, - @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_ + @(__dds_request_msg_type), + @(__dds_response_msg_type) >; if (!untyped_replier || !request_header || !untyped_ros_request) { return false; @@ -172,7 +205,7 @@ bool take_request__@(subfolder)__@(spec.srv_name)( ReplierType * replier = reinterpret_cast(untyped_replier); - connext::Sample<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_> request; + connext::Sample<@(__dds_request_msg_type)> request; bool taken = replier->take_request(request); if (!taken) { return false; @@ -182,7 +215,10 @@ bool take_request__@(subfolder)__@(spec.srv_name)( } const rosidl_message_type_support_t * ts = - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(spec.pkg_name), @(subfolder), @(spec.srv_name)_Request)(); + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join(service.request_message.structure.type.namespaces)), + @(service.request_message.structure.type.name))(); const message_type_support_callbacks_t * callbacks = static_cast(ts->data); bool converted = callbacks->convert_dds_to_ros( @@ -198,19 +234,22 @@ bool take_request__@(subfolder)__@(spec.srv_name)( return true; } -bool take_response__@(subfolder)__@(spec.srv_name)( +static bool take_response__@(service.structure_type.name)( void * untyped_requester, rmw_request_id_t * request_header, void * untyped_ros_response) { - using RequesterType = connext::Requester<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_>; + using RequesterType = connext::Requester< + @(__dds_request_msg_type), + @(__dds_response_msg_type) + >; if (!untyped_requester || !request_header || !untyped_ros_response) { return false; } RequesterType * requester = reinterpret_cast(untyped_requester); - connext::Sample<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_> response; + connext::Sample<@(__dds_response_msg_type)> response; bool received = requester->take_reply(response); if (!received) { return false; @@ -225,7 +264,10 @@ bool take_response__@(subfolder)__@(spec.srv_name)( request_header->sequence_number = sequence_number; const rosidl_message_type_support_t * ts = - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(spec.pkg_name), @(subfolder), @(spec.srv_name)_Response)(); + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join(service.response_message.structure.type.namespaces)), + @(service.response_message.structure.type.name))(); const message_type_support_callbacks_t * callbacks = static_cast(ts->data); bool converted = callbacks->convert_dds_to_ros( @@ -233,19 +275,25 @@ bool take_response__@(subfolder)__@(spec.srv_name)( return converted; } -bool send_response__@(subfolder)__@(spec.srv_name)( +bool send_response__@(service.structure_type.name)( void * untyped_replier, const rmw_request_id_t * request_header, const void * untyped_ros_response) { - using ReplierType = connext::Replier<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Request_, @(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_>; + using ReplierType = connext::Replier< + @(__dds_request_msg_type), + @(__dds_response_msg_type) + >; if (!untyped_replier || !request_header || !untyped_ros_response) { return false; } - connext::WriteSample<@(spec.pkg_name)::@(subfolder)::dds_::@(spec.srv_name)_Response_> response; + connext::WriteSample<@(__dds_response_msg_type)> response; const rosidl_message_type_support_t * ts = - ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(spec.pkg_name), @(subfolder), @(spec.srv_name)_Response)(); + ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join(service.response_message.structure.type.namespaces)), + @(service.response_message.structure.type.name))(); const message_type_support_callbacks_t * callbacks = static_cast(ts->data); bool converted = callbacks->convert_ros_to_dds( @@ -268,49 +316,49 @@ bool send_response__@(subfolder)__@(spec.srv_name)( return true; } -void * -get_request_datawriter__@(subfolder)__@(spec.srv_name)(void * untyped_requester) +static void * +get_request_datawriter__@(service.structure_type.name)(void * untyped_requester) { - return @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::get_request_datawriter__@(spec.srv_name)( + return @('::'.join(service.structure_type.namespaces))::typesupport_connext_cpp::get_request_datawriter__@(service.structure_type.name)( untyped_requester); } -void * -get_reply_datareader__@(subfolder)__@(spec.srv_name)(void * untyped_requester) +static void * +get_reply_datareader__@(service.structure_type.name)(void * untyped_requester) { - return @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::get_reply_datareader__@(spec.srv_name)( + return @('::'.join(service.structure_type.namespaces))::typesupport_connext_cpp::get_reply_datareader__@(service.structure_type.name)( untyped_requester); } -void * -get_request_datareader__@(subfolder)__@(spec.srv_name)(void * untyped_replier) +static void * +get_request_datareader__@(service.structure_type.name)(void * untyped_replier) { - return @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::get_request_datareader__@(spec.srv_name)( + return @('::'.join(service.structure_type.namespaces))::typesupport_connext_cpp::get_request_datareader__@(service.structure_type.name)( untyped_replier); } -void * -get_reply_datawriter__@(subfolder)__@(spec.srv_name)(void * untyped_replier) +static void * +get_reply_datawriter__@(service.structure_type.name)(void * untyped_replier) { - return @(spec.pkg_name)::@(subfolder)::typesupport_connext_cpp::get_reply_datawriter__@(spec.srv_name)( + return @('::'.join(service.structure_type.namespaces))::typesupport_connext_cpp::get_reply_datawriter__@(service.structure_type.name)( untyped_replier); } static service_type_support_callbacks_t __callbacks = { - "@(spec.pkg_name)", - "@(spec.srv_name)", - &create_requester__@(subfolder)__@(spec.srv_name), - &destroy_requester__@(subfolder)__@(spec.srv_name), - &create_replier__@(subfolder)__@(spec.srv_name), - &destroy_replier__@(subfolder)__@(spec.srv_name), - &send_request__@(subfolder)__@(spec.srv_name), - &take_request__@(subfolder)__@(spec.srv_name), - &send_response__@(subfolder)__@(spec.srv_name), - &take_response__@(subfolder)__@(spec.srv_name), - &get_request_datawriter__@(subfolder)__@(spec.srv_name), - &get_reply_datareader__@(subfolder)__@(spec.srv_name), - &get_request_datareader__@(subfolder)__@(spec.srv_name), - &get_reply_datawriter__@(subfolder)__@(spec.srv_name), + "@(package_name)", + "@(service.structure_type.name)", + &create_requester__@(service.structure_type.name), + &destroy_requester__@(service.structure_type.name), + &create_replier__@(service.structure_type.name), + &destroy_replier__@(service.structure_type.name), + &send_request__@(service.structure_type.name), + &take_request__@(service.structure_type.name), + &send_response__@(service.structure_type.name), + &take_response__@(service.structure_type.name), + &get_request_datawriter__@(service.structure_type.name), + &get_reply_datareader__@(service.structure_type.name), + &get_request_datareader__@(service.structure_type.name), + &get_reply_datawriter__@(service.structure_type.name) }; static rosidl_service_type_support_t __type_support = { @@ -321,7 +369,10 @@ static rosidl_service_type_support_t __type_support = { const rosidl_service_type_support_t * -ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(spec.pkg_name), @(subfolder), @(spec.srv_name))() { +ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( + rosidl_typesupport_connext_c, + @(', '.join([package_name] + list(interface_path.parents[0].parts))), + @(service.structure_type.name))() { return &__type_support; } diff --git a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em index 628a880..5ec40ae 100644 --- a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em @@ -95,7 +95,7 @@ class DDSDomainParticipant; class DDSDataReader; struct DDS_SampleIdentity_t; -@[for ns in service.structure.namespaces]@ +@[for ns in service.structure_type.namespaces]@ namespace @(ns) { @@ -174,7 +174,7 @@ void * create_requester__@(service.structure_type.name)( return requester; } -const char * destroy_requester__@(service.structure.type.name)( +const char * destroy_requester__@(service.structure_type.name)( void * untyped_requester, void (* deallocator)(void *)) { @@ -190,7 +190,7 @@ const char * destroy_requester__@(service.structure.type.name)( return nullptr; } -int64_t send_request__@(service.structure.type.name)( +int64_t send_request__@(service.structure_type.name)( void * untyped_requester, const void * untyped_ros_request) { @@ -214,7 +214,7 @@ int64_t send_request__@(service.structure.type.name)( return sequence_number; } -void * create_replier__@(service.structure.type.name)( +void * create_replier__@(service.structure_type.name)( void * untyped_participant, const char * request_topic_str, const char * response_topic_str, @@ -278,7 +278,7 @@ void * create_replier__@(service.structure.type.name)( return replier; } -const char * destroy_replier__@(service.structure.type.name)( +const char * destroy_replier__@(service.structure_type.name)( void * untyped_replier, void (* deallocator)(void *)) { @@ -294,7 +294,7 @@ const char * destroy_replier__@(service.structure.type.name)( return nullptr; } -bool take_request__@(service.structure.type.name)( +bool take_request__@(service.structure_type.name)( void * untyped_replier, rmw_request_id_t * request_header, void * untyped_ros_request) @@ -334,7 +334,7 @@ bool take_request__@(service.structure.type.name)( return true; } -bool take_response__@(service.structure.type.name)( +bool take_response__@(service.structure_type.name)( void * untyped_requester, rmw_request_id_t * request_header, void * untyped_ros_response) @@ -371,7 +371,7 @@ bool take_response__@(service.structure.type.name)( return converted; } -bool send_response__@(service.structure.type.name)( +bool send_response__@(service.structure_type.name)( void * untyped_replier, const rmw_request_id_t * request_header, const void * untyped_ros_response) @@ -408,7 +408,7 @@ bool send_response__@(service.structure.type.name)( } void * -get_request_datawriter__@(service.structure.type.name)(void * untyped_requester) +get_request_datawriter__@(service.structure_type.name)(void * untyped_requester) { if (!untyped_requester) { return NULL; @@ -422,7 +422,7 @@ get_request_datawriter__@(service.structure.type.name)(void * untyped_requester) } void * -get_reply_datareader__@(service.structure.type.name)(void * untyped_requester) +get_reply_datareader__@(service.structure_type.name)(void * untyped_requester) { if (!untyped_requester) { return NULL; @@ -436,7 +436,7 @@ get_reply_datareader__@(service.structure.type.name)(void * untyped_requester) } void * -get_request_datareader__@(service.structure.type.name)(void * untyped_replier) +get_request_datareader__@(service.structure_type.name)(void * untyped_replier) { if (!untyped_replier) { return NULL; @@ -450,7 +450,7 @@ get_request_datareader__@(service.structure.type.name)(void * untyped_replier) } void * -get_reply_datawriter__@(service.structure.type.name)(void * untyped_replier) +get_reply_datawriter__@(service.structure_type.name)(void * untyped_replier) { if (!untyped_replier) { return NULL; @@ -465,19 +465,19 @@ get_reply_datawriter__@(service.structure.type.name)(void * untyped_replier) static service_type_support_callbacks_t callbacks = { "@(package_name)", - "@(service.structure.type.name)", - &create_requester__@(service.structure.type.name), - &destroy_requester__@(service.structure.type.name), - &create_replier__@(service.structure.type.name), - &destroy_replier__@(service.structure.type.name), - &send_request__@(service.structure.type.name), - &take_request__@(service.structure.type.name), - &send_response__@(service.structure.type.name), - &take_response__@(service.structure.type.name), - &get_request_datawriter__@(service.structure.type.name), - &get_reply_datareader__@(service.structure.type.name), - &get_request_datareader__@(service.structure.type.name), - &get_reply_datawriter__@(service.structure.type.name), + "@(service.structure_type.name)", + &create_requester__@(service.structure_type.name), + &destroy_requester__@(service.structure_type.name), + &create_replier__@(service.structure_type.name), + &destroy_replier__@(service.structure_type.name), + &send_request__@(service.structure_type.name), + &take_request__@(service.structure_type.name), + &send_response__@(service.structure_type.name), + &take_response__@(service.structure_type.name), + &get_request_datawriter__@(service.structure_type.name), + &get_reply_datareader__@(service.structure_type.name), + &get_request_datareader__@(service.structure_type.name), + &get_reply_datawriter__@(service.structure_type.name), }; static rosidl_service_type_support_t handle = { @@ -488,7 +488,7 @@ static rosidl_service_type_support_t handle = { } // namespace typesupport_connext_cpp -@[for ns in reversed(service.structure.namespaces)]@ +@[for ns in reversed(service.structure_type.namespaces)]@ } // namespace @(ns) @[end for]@ @@ -515,7 +515,7 @@ const rosidl_service_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( rosidl_typesupport_connext_cpp, @(', '.join([package_name] + list(interface_path.parents[0].parts))), - @(service.structure.type.name))(); + @(service.structure_type.name))(); return &@(__ros_srv_pkg_prefix)::typesupport_connext_cpp::handle; } From 503a81e0a15782a35201923856d126c159a7c8dc Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Thu, 29 Nov 2018 09:25:53 -0800 Subject: [PATCH 10/20] Adds missing Python imports in templates. --- .../resource/msg__type_support_c.cpp.em | 8 ++++++++ .../resource/msg__type_support.cpp.em | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em index 321c12b..1ba8646 100644 --- a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em @@ -2,6 +2,14 @@ @{ from rosidl_cmake import convert_camel_case_to_lower_case_underscore +from rosidl_parser.definition import Array +from rosidl_parser.definition import BoundedSequence +from rosidl_parser.definition import BasicType +from rosidl_parser.definition import NamespacedType +from rosidl_parser.definition import NestedType +from rosidl_parser.definition import Sequence +from rosidl_parser.definition import String +from rosidl_parser.definition import WString include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) message_name = convert_camel_case_to_lower_case_underscore(message.structure.type.name) diff --git a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em index 079f825..400e8a6 100644 --- a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em @@ -2,6 +2,11 @@ @{ from rosidl_cmake import convert_camel_case_to_lower_case_underscore +from rosidl_parser.definition import Array +from rosidl_parser.definition import BasicType +from rosidl_parser.definition import BaseString +from rosidl_parser.definition import NamespacedType +from rosidl_parser.definition import NestedType include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) message_name = convert_camel_case_to_lower_case_underscore(message.structure.type.name) From 858e66bbbfea5e364fd5cd3f116f6e396806daee Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Thu, 29 Nov 2018 10:52:30 -0800 Subject: [PATCH 11/20] Converts IDL files to RTI Connext IDL files. --- rosidl_typesupport_connext_c/CMakeLists.txt | 1 - rosidl_typesupport_connext_cpp/CMakeLists.txt | 1 - .../bin/rosidl_typesupport_connext_cpp | 1 - ...port_connext_cpp_generate_interfaces.cmake | 2 +- .../__init__.py | 22 +++----- .../convert_to_connext_idl.py | 52 +++++++++++++++++++ 6 files changed, 60 insertions(+), 19 deletions(-) create mode 100644 rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py diff --git a/rosidl_typesupport_connext_c/CMakeLists.txt b/rosidl_typesupport_connext_c/CMakeLists.txt index 0d45636..86472d3 100644 --- a/rosidl_typesupport_connext_c/CMakeLists.txt +++ b/rosidl_typesupport_connext_c/CMakeLists.txt @@ -47,7 +47,6 @@ find_package(rosidl_typesupport_connext_cpp REQUIRED) ament_export_dependencies(rmw) ament_export_dependencies(rosidl_cmake) ament_export_dependencies(rosidl_generator_c) -ament_export_dependencies(rosidl_generator_dds_idl) ament_export_dependencies(rosidl_typesupport_connext_cpp) ament_export_include_directories(include) diff --git a/rosidl_typesupport_connext_cpp/CMakeLists.txt b/rosidl_typesupport_connext_cpp/CMakeLists.txt index a8eafc6..bf46433 100644 --- a/rosidl_typesupport_connext_cpp/CMakeLists.txt +++ b/rosidl_typesupport_connext_cpp/CMakeLists.txt @@ -43,7 +43,6 @@ ament_export_dependencies(rmw) ament_export_dependencies(rosidl_cmake) ament_export_dependencies(rosidl_generator_c) ament_export_dependencies(rosidl_generator_cpp) -ament_export_dependencies(rosidl_generator_dds_idl) ament_export_dependencies(rosidl_typesupport_interface) ament_export_include_directories(include) diff --git a/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp b/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp index 932f243..cc7c8b0 100755 --- a/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp +++ b/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp @@ -40,7 +40,6 @@ def main(argv=sys.argv[1:]): generator_args['package_name'], generator_args.get('additional_files', []), args.idl_base_path, - generator_args.get('ros_interface_dependencies', []), generator_args['output_dir'], args.idl_pp ) diff --git a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake index 69a0d53..3301977 100644 --- a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake @@ -13,7 +13,7 @@ # limitations under the License. set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_cpp/${PROJECT_NAME}") -set(_connext_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_idl/${PROJECT_NAME}") +set(_connext_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_idl") set(_dds_idl_files "") set(_generated_files "") diff --git a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py index 518c35a..ee5005d 100644 --- a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py +++ b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py @@ -17,27 +17,16 @@ import sys from rosidl_cmake import generate_files +from convert_to_connext_idl import convert_to_connext_idl def generate_dds_connext_cpp(pkg_name, dds_interface_files, - dds_interface_base_path, deps, + dds_interface_base_path, output_basepath, idl_pp): - include_dirs = [dds_interface_base_path] - for dep in deps: - # Only take the first : for separation, as Windows follows with a C:\ - dep_parts = dep.split(':', 1) - assert len(dep_parts) == 2, "The dependency '%s' must contain a double colon" % dep - idl_path = dep_parts[1] - idl_base_path = os.path.dirname( - os.path.dirname(os.path.dirname(os.path.normpath(idl_path)))) - if idl_base_path not in include_dirs: - include_dirs.append(idl_base_path) - for index, idl_file in enumerate(dds_interface_files): assert os.path.exists(idl_file), 'Could not find IDL file: ' + idl_file - - # get two level of parent folders for idl file + # Get two level of parent folders for idl file folder = os.path.dirname(idl_file) parent_folder = os.path.dirname(folder) output_path = os.path.join( @@ -49,6 +38,9 @@ def generate_dds_connext_cpp(pkg_name, dds_interface_files, except FileExistsError: pass + # Convert IDL file to a form that's compatible with what RTI Connext expects. + converted_idl_file = convert_to_connext_idl(idl_file, dds_interface_base_path) + cmd = [idl_pp] for include_dir in include_dirs: cmd += ['-I', include_dir] @@ -58,7 +50,7 @@ def generate_dds_connext_cpp(pkg_name, dds_interface_files, '-namespace', '-update', 'typefiles', '-unboundedSupport', - idl_file + converted_idl_file ] if os.name == 'nt': cmd[-5:-5] = ['-dllExportMacroSuffix', pkg_name] diff --git a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py new file mode 100644 index 0000000..11a65eb --- /dev/null +++ b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py @@ -0,0 +1,52 @@ +# Copyright 2018 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import os +import re + + +def convert_to_opensplice_idl(input_idl_file_path, output_basepath): + """ + Convert a generic IDL file to a new IDL file compatible with RTI Connext. + The new IDL file is created with the same base name as the input file. + A file with the same name in the output path wil be overwritten. + :param: input_idl_file_path The path to the input IDL file. + :param: output_basepath The output path where the new IDL file is written. + """ + # Get two level of parent folders for idl file + folder = os.path.dirname(input_idl_file_path) + parent_folder = os.path.dirname(folder) + output_idl_file_path = os.path.join( + output_basepath, + os.path.basename(parent_folder), + os.path.basename(folder) + ) + # Regexes for find and replace + regex_substitutions = [] + # Replace unsupported types + regex_substitutions.append((re.compile(r'([<>,\s])int8([<>,\s])'), r'\1octet\2')) + regex_substitutions.append((re.compile(r'([<>,\s])uint8([<>,\s])'), r'\1octet\2')) + regex_substitutions.append((re.compile(r'([<>,\s])int16([<>,\s])'), r'\1short\2')) + regex_substitutions.append((re.compile(r'([<>,\s])uint16([<>,\s])'), r'\1unsigned short\2')) + regex_substitutions.append((re.compile(r'([<>,\s])int32([<>,\s])'), r'\1long\2')) + regex_substitutions.append((re.compile(r'([<>,\s])uint32([<>,\s])'), r'\1unsigned long\2')) + regex_substitutions.append((re.compile(r'([<>,\s])int64([<>,\s])'), r'\1long long\2')) + regex_substitutions.append((re.compile(r'([<>,\s])uint64([<>,\s])'), r'\1unsigned long long\2')) + with open(output_idl_file_path, 'w') as output_idl: + with open(input_idl_file_path, 'r') as input_idl: + for line in input_idl: + # Replace unsupported types + for regex, substitution in regex_substitutions: + line = regex.sub(substitution, line) + output_idl.write(line) + return output_idl_file_path From 26ad16b5daf37baf0bbad9abef519e35dcf4ffa4 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Thu, 29 Nov 2018 12:23:08 -0800 Subject: [PATCH 12/20] Fixing typesupport generation issues. --- ...upport_connext_c_generate_interfaces.cmake | 25 ++++++------- ...port_connext_cpp_generate_interfaces.cmake | 4 -- ...msg__rosidl_typesupport_connext_cpp.hpp.em | 8 ++-- .../resource/msg__type_support.cpp.em | 37 ++++++++++++------- .../__init__.py | 29 ++++++++------- .../convert_to_connext_idl.py | 10 ++++- 6 files changed, 62 insertions(+), 51 deletions(-) diff --git a/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake b/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake index 1199fa2..48bc6d0 100644 --- a/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake @@ -20,18 +20,18 @@ set(_generated_files "") set(_generated_external_files "") foreach(_idl_tuple ${rosidl_generate_interfaces_IDL_TUPLES}) # Get second part of tuple which has form "msg/Name.idl" or "srv/Name.idl" or "action/Name.idl" - string(REGEX REPLACE ":([^:]*)$" "/\\1" _rel_idl_file "${_idl_tuple}") - get_filename_component(_parent_folder "${_rel_idl_file}" DIRECTORY) + string(REGEX REPLACE ":([^:]*)$" "/\\1" _abs_idl_file "${_idl_tuple}") + get_filename_component(_parent_folder "${_abs_idl_file}" DIRECTORY) get_filename_component(_parent_folder "${_parent_folder}" NAME) - get_filename_component(_idl_name "${_idl_file}" NAME_WE) + get_filename_component(_idl_name "${_abs_idl_file}" NAME_WE) # Turn idl name into file names string_camel_case_to_lower_case_underscore("${_idl_name}" _header_name) - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.h") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.cxx") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.h") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.cxx") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.h") - list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.cxx") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.h") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.cxx") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.h") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.cxx") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.h") + list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.cxx") list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext/${_header_name}__type_support.c") list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_c.h") list(APPEND _dds_idl_files "${_abs_idl_file}") @@ -72,6 +72,7 @@ foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) normalize_path(_abs_idl_file "${_abs_idl_file}") list(APPEND _dependency_files "${_abs_idl_file}") list(APPEND _dependencies "${_pkg_name}:${_abs_idl_file}") + endforeach() endforeach() set(target_dependencies @@ -106,7 +107,7 @@ add_custom_command( --generator-arguments-file "${generator_arguments_file}" DEPENDS ${target_dependencies} - ${generated_external_files} + ${_generated_external_files} ${_dds_idl_files} COMMENT "Generating C type support for RTI Connext" VERBATIM @@ -210,10 +211,6 @@ add_dependencies( ${rosidl_generate_interfaces_TARGET}${_target_suffix} ${rosidl_generate_interfaces_TARGET}__cpp ) -add_dependencies( - ${rosidl_generate_interfaces_TARGET}${_target_suffix} - ${rosidl_generate_interfaces_TARGET}__dds_connext_idl -) if(NOT rosidl_generate_interfaces_SKIP_INSTALL) install( diff --git a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake index 3301977..64eefc1 100644 --- a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake @@ -203,10 +203,6 @@ add_dependencies( ${rosidl_generate_interfaces_TARGET}${_target_suffix} ${rosidl_generate_interfaces_TARGET}__cpp ) -add_dependencies( - ${rosidl_generate_interfaces_TARGET}__dds_connext_idl - ${rosidl_generate_interfaces_TARGET}${_target_suffix} -) if(NOT rosidl_generate_interfaces_SKIP_INSTALL) install( diff --git a/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em b/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em index 3d19b65..c20179a 100644 --- a/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em +++ b/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em @@ -8,7 +8,7 @@ header_filename = convert_camel_case_to_lower_case_underscore(interface_path.ste header_files = [ 'rosidl_generator_c/message_type_support_struct.h', 'rosidl_typesupport_interface/macros.h', - package_name + '/msg/rosidl_typesupport_connext_cpp__visibility_control.h' + package_name + '/msg/rosidl_typesupport_connext_cpp__visibility_control.h', include_base + '/' + header_filename + '__struct.hpp' ] dds_specific_header_files = [ @@ -65,14 +65,14 @@ class DDSDomainParticipant; class DDSDataWriter; class DDSDataReader; -@[for ns in message.structure.namespaces]@ +@[for ns in message.structure.type.namespaces]@ namespace @(ns) { @[end for]@ @{ -__ros_msg_pkg_prefix = '::'.join(message.structure.namespaces) +__ros_msg_pkg_prefix = '::'.join(message.structure.type.namespaces) __ros_msg_type = __ros_msg_pkg_prefix + '::' + message.structure.type.name __dds_msg_type_prefix = __ros_msg_pkg_prefix + '::dds_::' + message.structure.type.name __dds_msg_type = __dds_msg_type_prefix + '_' @@ -108,7 +108,7 @@ to_message__@(message.structure.type.name)( } // namespace typesupport_connext_cpp -@[for ns in reversed(message.structure.namespaces)]@ +@[for ns in reversed(message.structure.type.namespaces)]@ } // namespace @(ns) @[end for]@ diff --git a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em index 400e8a6..bd1d1e0 100644 --- a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em @@ -5,6 +5,7 @@ from rosidl_cmake import convert_camel_case_to_lower_case_underscore from rosidl_parser.definition import Array from rosidl_parser.definition import BasicType from rosidl_parser.definition import BaseString +from rosidl_parser.definition import BoundedSequence from rosidl_parser.definition import NamespacedType from rosidl_parser.definition import NestedType include_parts = [package_name] + list(interface_path.parents[0].parts) @@ -56,11 +57,16 @@ namespace dds_ { class @(member.type.name)_; } // namespace dds_ -@[ member_ros_msg_pkg_prefix = '::'.join(member.type.namespaces)]@ -@[ member_ros_msg_type = member_ros_msg_pkg_prefix + '::' + member.type.name]@ -@[ member_dds_msg_type = member_ros_msg_pkg_prefix + '::dds_::' + member.type.name + '_']@ + namespace typesupport_connext_cpp { + +@{ +member_ros_msg_pkg_prefix = '::'.join(member.type.namespaces) +member_ros_msg_type = member_ros_msg_pkg_prefix + '::' + member.type.name +member_dds_msg_type = member_ros_msg_pkg_prefix + '::dds_::' + member.type.name + '_' +}@ + bool convert_ros_message_to_dds( const @(member_ros_msg_type) &, @(member_dds_msg_type) &); @@ -74,7 +80,7 @@ bool convert_dds_message_to_ros( @[ end if]@ @[end for]@ -@[for ns in message.structure.namespaces]@ +@[for ns in message.structure.type.namespaces]@ namespace @(ns) { @@ -84,7 +90,7 @@ namespace typesupport_connext_cpp { @{ -__ros_msg_pkg_prefix = '::'.join(message.structure.namespaces) +__ros_msg_pkg_prefix = '::'.join(message.structure.type.namespaces) __ros_msg_type = __ros_msg_pkg_prefix + '::' + message.structure.type.name __dds_msg_type_prefix = __ros_msg_pkg_prefix + '::dds_::' + message.structure.type.name __dds_msg_type = __dds_msg_type_prefix + '_' @@ -105,7 +111,7 @@ convert_ros_message_to_dds( (void)ros_message; (void)dds_message; @[end if]@ -@[for member in member.structure.members]@ +@[for member in message.structure.members]@ // member.name @(member.name) @[ if isinstance(member.type, NestedType)]@ { @@ -132,11 +138,11 @@ convert_ros_message_to_dds( } @[ end if]@ for (size_t i = 0; i < size; i++) { -@[ if isinstance(member.type, BaseString)]@ +@[ if isinstance(member.type.basetype, BaseString)]@ DDS_String_free(dds_message.@(member.name)_[static_cast(i)]); dds_message.@(member.name)_[static_cast(i)] = DDS_String_dup(ros_message.@(member.name)[i].c_str()); -@[ elif isinstance(member.type, BasicType)]@ +@[ elif isinstance(member.type.basetype, BasicType)]@ dds_message.@(member.name)_[static_cast(i)] = ros_message.@(member.name)[i]; @[ else]@ @@ -191,9 +197,12 @@ convert_dds_message_to_ros( ros_message.@(member.name).resize(size); @[ end if]@ for (size_t i = 0; i < size; i++) { -@[ if isinstance(member.type, BasicType)]@ +@[ if isinstance(member.type.basetype, BasicType)]@ + ros_message.@(member.name)[i] = + dds_message.@(member.name)_[static_cast(i)]@(' == DDS_BOOLEAN_TRUE' if member.type.basetype.type == 'boolean' else ''); +@[ elif isinstance(member.type.basetype, BaseString)] ros_message.@(member.name)[i] = - dds_message.@(member.name)_[static_cast(i)]@(' == DDS_BOOLEAN_TRUE' if member.type.type == 'boolean' else ''); + dds_message.@(member.name)_[static_cast(i)]; @[ else]@ if ( !@('::'.join(member.type.basetype.namespaces))::typesupport_connext_cpp::convert_dds_message_to_ros( @@ -208,6 +217,8 @@ convert_dds_message_to_ros( @[ elif isinstance(member.type, BasicType)]@ ros_message.@(member.name) = dds_message.@(member.name)_@(' == DDS_BOOLEAN_TRUE' if member.type.type == 'boolean' else ''); +@[ elif isinstance(member.type, BaseString)]@ + ros_message.@(member.name) = dds_message.@(member.name)_; @[ else]@ if ( !@('::'.join(member.type.namespaces))::typesupport_connext_cpp::convert_dds_message_to_ros( @@ -270,7 +281,7 @@ to_cdr_stream__@(message.structure.type.name)( } // call the function again and fill the buffer this time unsigned int buffer_length_uint = static_cast(cdr_stream->buffer_length); - if (@(spec.base_type.type)_Plugin_serialize_to_cdr_buffer( + if (@(message.structure.type.name)_Plugin_serialize_to_cdr_buffer( reinterpret_cast(cdr_stream->buffer), &buffer_length_uint, dds_message) != RTI_TRUE) @@ -314,7 +325,7 @@ to_message__@(message.structure.type.name)( } @(__ros_msg_type) & ros_message = - *(@(__ros_msg_type_prefix) *)untyped_ros_message; + *(@(__ros_msg_type) *)untyped_ros_message; bool success = convert_dds_message_to_ros(*dds_message, ros_message); if (@(__dds_msg_type_prefix)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { return false; @@ -340,7 +351,7 @@ static rosidl_message_type_support_t handle = { } // namespace typesupport_connext_cpp -@[for ns in reversed(message.structure.namespaces)]@ +@[for ns in reversed(message.structure.type.namespaces)]@ } // namespace @(ns) @[end for]@ diff --git a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py index ee5005d..d15ba1b 100644 --- a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py +++ b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py @@ -17,30 +17,30 @@ import sys from rosidl_cmake import generate_files -from convert_to_connext_idl import convert_to_connext_idl +from .convert_to_connext_idl import convert_to_connext_idl def generate_dds_connext_cpp(pkg_name, dds_interface_files, dds_interface_base_path, output_basepath, idl_pp): - include_dirs = [dds_interface_base_path] - for index, idl_file in enumerate(dds_interface_files): + converted_dds_interface_files = [] + for idl_file in dds_interface_files: assert os.path.exists(idl_file), 'Could not find IDL file: ' + idl_file - # Get two level of parent folders for idl file - folder = os.path.dirname(idl_file) - parent_folder = os.path.dirname(folder) + converted_dds_interface_files.append( + convert_to_connext_idl(idl_file, dds_interface_base_path) + ) + + include_dirs = [dds_interface_base_path] + for idl_file in converted_dds_interface_files: + idl_file_folder = os.path.basename(os.path.dirname(idl_file)) output_path = os.path.join( - output_basepath, - os.path.basename(parent_folder), - os.path.basename(folder)) + output_basepath, idl_file_folder, 'dds_connext' + ) try: os.makedirs(output_path) except FileExistsError: pass - # Convert IDL file to a form that's compatible with what RTI Connext expects. - converted_idl_file = convert_to_connext_idl(idl_file, dds_interface_base_path) - cmd = [idl_pp] for include_dir in include_dirs: cmd += ['-I', include_dir] @@ -50,7 +50,7 @@ def generate_dds_connext_cpp(pkg_name, dds_interface_files, '-namespace', '-update', 'typefiles', '-unboundedSupport', - converted_idl_file + idl_file ] if os.name == 'nt': cmd[-5:-5] = ['-dllExportMacroSuffix', pkg_name] @@ -58,6 +58,7 @@ def generate_dds_connext_cpp(pkg_name, dds_interface_files, msg_name = os.path.splitext(os.path.basename(idl_file))[0] count = 1 max_count = 5 + print(' '.join(cmd)) while True: subprocess.check_call(cmd) @@ -113,7 +114,7 @@ def generate_cpp(arguments_file): 'idl__rosidl_typesupport_connext_cpp.hpp.em': '%s__rosidl_typesupport_connext_cpp.hpp', 'idl__dds_connext__type_support.cpp.em': - '%s__type_support.cpp' + 'dds_connext/%s__type_support.cpp' } generate_files(arguments_file, mapping) return 0 diff --git a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py index 11a65eb..2ef9863 100644 --- a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py +++ b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py @@ -15,7 +15,7 @@ import re -def convert_to_opensplice_idl(input_idl_file_path, output_basepath): +def convert_to_connext_idl(input_idl_file_path, output_basepath): """ Convert a generic IDL file to a new IDL file compatible with RTI Connext. The new IDL file is created with the same base name as the input file. @@ -29,8 +29,14 @@ def convert_to_opensplice_idl(input_idl_file_path, output_basepath): output_idl_file_path = os.path.join( output_basepath, os.path.basename(parent_folder), - os.path.basename(folder) + os.path.basename(folder), + os.path.basename(input_idl_file_path) ) + try: + os.makedirs(os.path.dirname(output_idl_file_path)) + except FileExistsError: + pass + # Regexes for find and replace regex_substitutions = [] # Replace unsupported types From e8cc80909ac2abcf966dbc9f01f9830eb83ac702 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Fri, 30 Nov 2018 10:41:42 -0800 Subject: [PATCH 13/20] Uses rosidl_dds again for IDL2IDL conversion. --- ...port_connext_cpp_generate_interfaces.cmake | 17 +++++- .../__init__.py | 35 ++++++----- .../convert_to_connext_idl.py | 58 ------------------- 3 files changed, 35 insertions(+), 75 deletions(-) delete mode 100644 rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py diff --git a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake index 64eefc1..75259b9 100644 --- a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake @@ -13,7 +13,14 @@ # limitations under the License. set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_cpp/${PROJECT_NAME}") -set(_connext_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_idl") +set(_dds_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_dds_idl") + +rosidl_generate_dds_interfaces( + ${rosidl_generate_interfaces_TARGET}__dds_connext_idl + IDL_TUPLES ${rosidl_generate_interfaces_IDL_TUPLES} + DEPENDENCY_PACKAGE_NAMES ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES} + OUTPUT_SUBFOLDERS "dds_connext" +) set(_dds_idl_files "") set(_generated_files "") @@ -33,7 +40,7 @@ foreach(_idl_tuple ${rosidl_generate_interfaces_IDL_TUPLES}) list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.cxx") list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_cpp.hpp") list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext/${_header_name}__type_support.cpp") - list(APPEND _dds_idl_files "${_abs_idl_file}") + list(APPEND _dds_idl_files "${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_connext/${_idl_name}_.idl") endforeach() # If not on Windows, disable some warnings with Connext's generated code @@ -112,7 +119,7 @@ add_custom_command( OUTPUT ${_generated_files} ${_generated_external_files} COMMAND ${PYTHON_EXECUTABLE} ${rosidl_typesupport_connext_cpp_BIN} --generator-arguments-file "${generator_arguments_file}" - --idl-base-path "${_connext_idl_base_path}" + --dds-interface-base-path "${_dds_idl_base_path}" --idl-pp "${_idl_pp}" DEPENDS ${target_dependencies} ${_dds_idl_files} COMMENT "Generating C++ type support for RTI Connext (using '${_idl_pp}')" @@ -203,6 +210,10 @@ add_dependencies( ${rosidl_generate_interfaces_TARGET}${_target_suffix} ${rosidl_generate_interfaces_TARGET}__cpp ) +add_dependencies( + ${rosidl_generate_interfaces_TARGET}__dds_connext_idl + ${rosidl_generate_interfaces_TARGET}${_target_suffix} +) if(NOT rosidl_generate_interfaces_SKIP_INSTALL) install( diff --git a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py index d15ba1b..4071340 100644 --- a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py +++ b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py @@ -17,25 +17,33 @@ import sys from rosidl_cmake import generate_files -from .convert_to_connext_idl import convert_to_connext_idl -def generate_dds_connext_cpp(pkg_name, dds_interface_files, - dds_interface_base_path, - output_basepath, idl_pp): - converted_dds_interface_files = [] +def generate_dds_connext_cpp( + pkg_name, dds_interface_files, dds_interface_base_path, deps, + output_basepath, idl_pp): + + include_dirs = [dds_interface_base_path] + for dep in deps: + # Only take the first : for separation, as Windows follows with a C:\ + dep_parts = dep.split(':', 1) + assert len(dep_parts) == 2, "The dependency '%s' must contain a double colon" % dep + idl_path = dep_parts[1] + idl_base_path = os.path.dirname( + os.path.dirname(os.path.dirname(os.path.normpath(idl_path)))) + if idl_base_path not in include_dirs: + include_dirs.append(idl_base_path) + for idl_file in dds_interface_files: assert os.path.exists(idl_file), 'Could not find IDL file: ' + idl_file - converted_dds_interface_files.append( - convert_to_connext_idl(idl_file, dds_interface_base_path) - ) - include_dirs = [dds_interface_base_path] - for idl_file in converted_dds_interface_files: - idl_file_folder = os.path.basename(os.path.dirname(idl_file)) + # get two level of parent folders for idl file + folder = os.path.dirname(idl_file) + parent_folder = os.path.dirname(folder) output_path = os.path.join( - output_basepath, idl_file_folder, 'dds_connext' - ) + output_basepath, + os.path.basename(parent_folder), + os.path.basename(folder)) try: os.makedirs(output_path) except FileExistsError: @@ -58,7 +66,6 @@ def generate_dds_connext_cpp(pkg_name, dds_interface_files, msg_name = os.path.splitext(os.path.basename(idl_file))[0] count = 1 max_count = 5 - print(' '.join(cmd)) while True: subprocess.check_call(cmd) diff --git a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py deleted file mode 100644 index 2ef9863..0000000 --- a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/convert_to_connext_idl.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2018 Open Source Robotics Foundation, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import os -import re - - -def convert_to_connext_idl(input_idl_file_path, output_basepath): - """ - Convert a generic IDL file to a new IDL file compatible with RTI Connext. - The new IDL file is created with the same base name as the input file. - A file with the same name in the output path wil be overwritten. - :param: input_idl_file_path The path to the input IDL file. - :param: output_basepath The output path where the new IDL file is written. - """ - # Get two level of parent folders for idl file - folder = os.path.dirname(input_idl_file_path) - parent_folder = os.path.dirname(folder) - output_idl_file_path = os.path.join( - output_basepath, - os.path.basename(parent_folder), - os.path.basename(folder), - os.path.basename(input_idl_file_path) - ) - try: - os.makedirs(os.path.dirname(output_idl_file_path)) - except FileExistsError: - pass - - # Regexes for find and replace - regex_substitutions = [] - # Replace unsupported types - regex_substitutions.append((re.compile(r'([<>,\s])int8([<>,\s])'), r'\1octet\2')) - regex_substitutions.append((re.compile(r'([<>,\s])uint8([<>,\s])'), r'\1octet\2')) - regex_substitutions.append((re.compile(r'([<>,\s])int16([<>,\s])'), r'\1short\2')) - regex_substitutions.append((re.compile(r'([<>,\s])uint16([<>,\s])'), r'\1unsigned short\2')) - regex_substitutions.append((re.compile(r'([<>,\s])int32([<>,\s])'), r'\1long\2')) - regex_substitutions.append((re.compile(r'([<>,\s])uint32([<>,\s])'), r'\1unsigned long\2')) - regex_substitutions.append((re.compile(r'([<>,\s])int64([<>,\s])'), r'\1long long\2')) - regex_substitutions.append((re.compile(r'([<>,\s])uint64([<>,\s])'), r'\1unsigned long long\2')) - with open(output_idl_file_path, 'w') as output_idl: - with open(input_idl_file_path, 'r') as input_idl: - for line in input_idl: - # Replace unsupported types - for regex, substitution in regex_substitutions: - line = regex.sub(substitution, line) - output_idl.write(line) - return output_idl_file_path From 9ef1e4f8b0b16e5b68f2f6f33fa3b176a2115544 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Fri, 30 Nov 2018 14:45:13 -0800 Subject: [PATCH 14/20] Applies many fixes to C & C++ typesupport. --- rosidl_typesupport_connext_c/CMakeLists.txt | 1 + ...upport_connext_c_generate_interfaces.cmake | 24 +++-- .../msg__rosidl_typesupport_connext_c.h.em | 2 +- .../resource/msg__type_support_c.cpp.em | 93 +++++++++++-------- .../rosidl_typesupport_connext_c/__init__.py | 2 +- rosidl_typesupport_connext_cpp/CMakeLists.txt | 1 + .../bin/rosidl_typesupport_connext_cpp | 6 +- ...port_connext_cpp_generate_interfaces.cmake | 6 +- 8 files changed, 80 insertions(+), 55 deletions(-) diff --git a/rosidl_typesupport_connext_c/CMakeLists.txt b/rosidl_typesupport_connext_c/CMakeLists.txt index 86472d3..0d45636 100644 --- a/rosidl_typesupport_connext_c/CMakeLists.txt +++ b/rosidl_typesupport_connext_c/CMakeLists.txt @@ -47,6 +47,7 @@ find_package(rosidl_typesupport_connext_cpp REQUIRED) ament_export_dependencies(rmw) ament_export_dependencies(rosidl_cmake) ament_export_dependencies(rosidl_generator_c) +ament_export_dependencies(rosidl_generator_dds_idl) ament_export_dependencies(rosidl_typesupport_connext_cpp) ament_export_include_directories(include) diff --git a/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake b/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake index 48bc6d0..1eb990f 100644 --- a/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake @@ -14,6 +14,8 @@ set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_c/${PROJECT_NAME}") +set(_dds_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_cpp/${PROJECT_NAME}") +set(_dds_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_dds_idl") set(_dds_idl_files "") set(_generated_files "") @@ -26,15 +28,15 @@ foreach(_idl_tuple ${rosidl_generate_interfaces_IDL_TUPLES}) get_filename_component(_idl_name "${_abs_idl_file}" NAME_WE) # Turn idl name into file names string_camel_case_to_lower_case_underscore("${_idl_name}" _header_name) - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.h") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.cxx") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.h") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.cxx") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.h") - list(APPEND _generated_external_files "${_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.cxx") - list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext/${_header_name}__type_support.c") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.h") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_.cxx") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.h") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Plugin.cxx") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.h") + list(APPEND _generated_external_files "${_dds_output_path}/${_parent_folder}/dds_connext/${_idl_name}_Support.cxx") + list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_connext/${_header_name}__type_support_c.cpp") list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_connext_c.h") - list(APPEND _dds_idl_files "${_abs_idl_file}") + list(APPEND _dds_idl_files "${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_connext/${_idl_name}_.idl") endforeach() # If not on Windows, disable some warnings with Connext's generated code @@ -80,7 +82,9 @@ set(target_dependencies ${rosidl_typesupport_connext_c_GENERATOR_FILES} "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/idl__rosidl_typesupport_connext_c.h.em" "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/idl__dds_connext__type_support_c.cpp.em" + "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/msg__rosidl_typesupport_connext_c.h.em" "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/msg__type_support_c.cpp.em" + "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/srv__rosidl_typesupport_connext_c.h.em" "${rosidl_typesupport_connext_c_TEMPLATE_DIR}/srv__type_support_c.cpp.em" ${_dependency_files}) foreach(dep ${target_dependencies}) @@ -211,6 +215,10 @@ add_dependencies( ${rosidl_generate_interfaces_TARGET}${_target_suffix} ${rosidl_generate_interfaces_TARGET}__cpp ) +add_dependencies( + ${rosidl_generate_interfaces_TARGET}${_target_suffix} + ${rosidl_generate_interfaces_TARGET}__dds_connext_idl +) if(NOT rosidl_generate_interfaces_SKIP_INSTALL) install( diff --git a/rosidl_typesupport_connext_c/resource/msg__rosidl_typesupport_connext_c.h.em b/rosidl_typesupport_connext_c/resource/msg__rosidl_typesupport_connext_c.h.em index fd1409f..b2eeb40 100644 --- a/rosidl_typesupport_connext_c/resource/msg__rosidl_typesupport_connext_c.h.em +++ b/rosidl_typesupport_connext_c/resource/msg__rosidl_typesupport_connext_c.h.em @@ -4,7 +4,7 @@ header_files = [ 'rosidl_generator_c/message_type_support_struct.h', 'rosidl_typesupport_interface/macros.h', - package_name + '/msg/rosidl_typesupport_connext_cpp__visibility_control.h' + package_name + '/msg/rosidl_typesupport_connext_c__visibility_control.h' ] }@ diff --git a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em index 1ba8646..82968b2 100644 --- a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em @@ -2,6 +2,9 @@ @{ from rosidl_cmake 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_c import idl_type_to_c from rosidl_parser.definition import Array from rosidl_parser.definition import BoundedSequence from rosidl_parser.definition import BasicType @@ -22,7 +25,7 @@ header_files = [ include_base + '/' + message_name + '__rosidl_typesupport_connext_c.h', 'rcutils/types/uint8_array.h', 'rosidl_typesupport_connext_c/identifier.h', - 'rosidl_typesupport_connext_c/message_type_support.h', + 'rosidl_typesupport_connext_cpp/message_type_support.h', package_name + '/msg/rosidl_typesupport_connext_c__visibility_control.h', include_base + '/' + message_name + '__struct.h', include_base + '/' + message_name + '__functions.h' @@ -96,13 +99,13 @@ for member in message.structure.members: type_ = member.type if isinstance(type_, NestedType): type_ = type_.basetype - if isinstance(member.type, String): + if isinstance(type_, String): includes.setdefault('rosidl_generator_c/string.h', []).append(member.name) includes.setdefault('rosidl_generator_c/string_functions.h', []).append(member.name) - elif isinstance(member.type, WString): + if isinstance(type_, WString): includes.setdefault('rosidl_generator_c/u16string.h', []).append(member.name) includes.setdefault('rosidl_generator_c/u16string_functions.h', []).append(member.name) - else: + if isinstance(type_, NamespacedType): include_prefix = idl_structure_type_to_c_include_prefix(type_) if include_prefix.endswith('__request'): include_prefix = include_prefix[:-9] @@ -140,29 +143,30 @@ from collections import OrderedDict forward_declares = OrderedDict() for member in message.structure.members: if isinstance(member.type, NamespacedType): - forward_declares.setdefault(member.type, []).append(member.name) + _, member_names = forward_declares.setdefault(member.type.name, (member.type, [])) + member_names.append(member.name) }@ -@[for member_type, member_names in forward_declares.items())]@ +@[for member_type, member_names in forward_declares.values()]@ @[ for name in member_names]@ // Member '@(name)' @[ end for]@ @[ if member_type.namespaces[0] != package_name]@ -ROSIDL_TYPESUPPORT_CONNEXT_C_IMPORT_@(type_.namespaces[0]) +ROSIDL_TYPESUPPORT_CONNEXT_C_IMPORT_@(member_type.namespaces[0]) @[ end if]@ const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( rosidl_typesupport_connext_c, @(', '.join(member_type.namespaces)), - member_type.name)(); + @(member_type.name))(); @[end for]@ @# // Make callback functions specific to this message type. @{ -__ros_c_msg_type = '__'.join(message.structure.namespaces + [message.structure.type.name]) -__dds_cpp_msg_type_prefix = '::'.join(message.structure.namespaces + ['dds_', message.structure.type.name]) -__dds_cpp_msg_type = __dds_msg_type_prefix + '_' +__ros_c_msg_type = '__'.join(message.structure.type.namespaces + [message.structure.type.name]) +__dds_cpp_msg_type_prefix = '::'.join(message.structure.type.namespaces + ['dds_', message.structure.type.name]) +__dds_cpp_msg_type = __dds_cpp_msg_type_prefix + '_' }@ using __dds_msg_type = @(__dds_cpp_msg_type); @@ -196,12 +200,12 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) // Member name: @(member.name) { @{ - type_ = member.type - if isinstance(type_, NestedType): - type_ = type_.basetype +type_ = member.type +if isinstance(type_, NestedType): + type_ = type_.basetype }@ @[ if isinstance(type_, NamespacedType)]@ - const message_type_support_callbacks_t * @('__'.join(type_.namespaces + type_.name))__callbacks = + const message_type_support_callbacks_t * @('__'.join(type_.namespaces + [type_.name]))__callbacks = static_cast( ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_connext_c, @(', '.join(type_.namespaces)), @(type_.name) )()->data); @@ -216,7 +220,7 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) return false; } @[ if isinstance(member.type, BoundedSequence)]@ - if (size > @(field.type.upper_bound)) { + if (size > @(member.type.upper_bound)) { fprintf(stderr, "array size exceeds upper bound\n"); return false; } @@ -239,7 +243,7 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) @[ else]@ auto & ros_i = ros_message->@(member.name).data[i]; @[ end if]@ -@[ if isinstance(member.type, String)]@ +@[ if isinstance(type_, String)]@ const rosidl_generator_c__String * str = &ros_i; if (str->capacity == 0 || str->capacity <= str->size) { fprintf(stderr, "string capacity not greater than size\n"); @@ -250,16 +254,16 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) return false; } dds_message->@(member.name)_[static_cast(i)] = DDS_String_dup(str->data); -@[ elif isinstance(member.type, WString)]@ -@[ assert False, 'TBD']@ -@[ elif isinstance(member.type, BasicType)]@ -@[ if member.type.type == 'boolean']@ +@[ elif isinstance(type_, WString)]@ +@{ assert False, 'TBD'}@ +@[ elif isinstance(type_, BasicType)]@ +@[ if type_.type == 'boolean']@ dds_message->@(member.name)_[i] = 1 ? ros_i : 0; @[ else]@ dds_message->@(member.name)_[i] = ros_i; @[ end if]@ @[ else]@ - if (!@(idl_structure_type_to_c_typename(member.type))__callbacks->convert_ros_to_dds( + if (!@(idl_structure_type_to_c_typename(type_))__callbacks->convert_ros_to_dds( &ros_i, &dds_message->@(member.name)_[i])) { return false; @@ -278,7 +282,7 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) } dds_message->@(member.name)_ = DDS_String_dup(str->data); @[ elif isinstance(member.type, WString)]@ -@[ assert False, 'TBD']@ +@{ assert False, 'TBD'}@ @[ elif isinstance(member.type, BasicType)]@ dds_message->@(member.name)_ = ros_message->@(member.name); @[ else]@ @@ -315,6 +319,11 @@ convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message) @[for member in message.structure.members]@ // Member name: @(member.name) { +@{ +type_ = member.type +if isinstance(type_, NestedType): + type_ = type_.basetype +}@ @[ if isinstance(member.type, NestedType)]@ @[ if isinstance(member.type, Array)]@ DDS_Long size = @(member.type.size); @@ -333,9 +342,13 @@ convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message) @[ else]@ auto & ros_i = ros_message->@(member.name).data[i]; @[ end if]@ -@[ if isinstance(member.type, BasicType) and member.type.type == 'boolean']@ +@[ if isinstance(type_, BasicType)]@ +@[ if type_.type == 'boolean']@ ros_i = (dds_message->@(member.name)_[i] != 0); -@[ elif isinstance(member.type, String)]@ +@[ else]@ + ros_i = dds_message->@(member.name)_[i]; +@[ end if]@ +@[ elif isinstance(type_, String)]@ if (!ros_i.data) { rosidl_generator_c__String__init(&ros_i); } @@ -346,19 +359,19 @@ convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message) fprintf(stderr, "failed to assign string into field '@(member.name)'\n"); return false; } -@[ elif isinstance(member.type, WString)]@ -@[ assert False, 'TBD']@ -@[ elif isinstance(member.type, BasicType)]@ - ros_i = dds_message->@(member.name)_[i]; -@[ else]@ +@[ elif isinstance(type_, WString)]@ +@{ assert False, 'TBD'}@ +@[ elif isinstance(type_, NamespacedType)]@ const rosidl_message_type_support_t * ts = ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( rosidl_typesupport_connext_c, - @(', '.join(member.type.namespaces)), - @(member.type.name))(); + @(', '.join(type_.namespaces)), + @(type_.name))(); const message_type_support_callbacks_t * callbacks = static_cast(ts->data); callbacks->convert_dds_to_ros(&dds_message->@(member.name)_[i], &ros_i); +@[ else]@ +@{ assert False, 'Unknown member base type'}@ @[ end if]@ } @[ elif isinstance(member.type, String)]@ @@ -372,11 +385,11 @@ convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message) fprintf(stderr, "failed to assign string into field '@(member.name)'\n"); return false; } -@[ elif isinstance(member.type, WString)]@ -@[ assert False, 'TBD']@ +@[ elif isinstance(member.type, WString)]@ +@{ assert False, 'TBD'}@ @[ elif isinstance(member.type, BasicType)]@ ros_message->@(member.name) = dds_message->@(member.name)_@(' == static_cast(true)' if member.type.type == 'boolean' else ''); -@[ else]@ +@[ elif isinstance(member.type, NamespacedType)]@ const rosidl_message_type_support_t * ts = ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( rosidl_typesupport_connext_c, @@ -385,6 +398,8 @@ convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message) const message_type_support_callbacks_t * callbacks = static_cast(ts->data); callbacks->convert_dds_to_ros(&dds_message->@(member.name)_, &ros_message->@(member.name)); +@[ else]@ +@{ assert False, 'Unknown member type'}@ @[ end if]@ } @@ -452,8 +467,8 @@ to_message( return false; } - @(__dds_msg_type) * dds_message = - @(__dds_msg_type_prefix)_TypeSupport::create_data(); + __dds_msg_type * dds_message = + @(__dds_cpp_msg_type_prefix)_TypeSupport::create_data(); if (cdr_stream->buffer_length > (std::numeric_limits::max)()) { fprintf(stderr, "cdr_stream->buffer_length, unexpectedly larger than max unsigned int\n"); return false; @@ -467,7 +482,7 @@ to_message( return false; } bool success = convert_dds_to_ros(dds_message, untyped_ros_message); - if (@(__dds_msg_type_prefix)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { + if (@(__dds_cpp_msg_type_prefix)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { return false; } return success; @@ -496,7 +511,7 @@ const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( rosidl_typesupport_connext_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), - @(message.structure.type.name))() {} + @(message.structure.type.name))() { return &__type_support; } diff --git a/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c/__init__.py b/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c/__init__.py index 257c0e9..b71f9a9 100644 --- a/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c/__init__.py +++ b/rosidl_typesupport_connext_c/rosidl_typesupport_connext_c/__init__.py @@ -18,7 +18,7 @@ def generate_typesupport_connext_c(arguments_file): mapping = { 'idl__rosidl_typesupport_connext_c.h.em': - '%__rosidl_typesupport_connext_c.h', + '%s__rosidl_typesupport_connext_c.h', 'idl__dds_connext__type_support_c.cpp.em': 'dds_connext/%s__type_support_c.cpp' } diff --git a/rosidl_typesupport_connext_cpp/CMakeLists.txt b/rosidl_typesupport_connext_cpp/CMakeLists.txt index bf46433..a8eafc6 100644 --- a/rosidl_typesupport_connext_cpp/CMakeLists.txt +++ b/rosidl_typesupport_connext_cpp/CMakeLists.txt @@ -43,6 +43,7 @@ ament_export_dependencies(rmw) ament_export_dependencies(rosidl_cmake) ament_export_dependencies(rosidl_generator_c) ament_export_dependencies(rosidl_generator_cpp) +ament_export_dependencies(rosidl_generator_dds_idl) ament_export_dependencies(rosidl_typesupport_interface) ament_export_include_directories(include) diff --git a/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp b/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp index cc7c8b0..359f89d 100755 --- a/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp +++ b/rosidl_typesupport_connext_cpp/bin/rosidl_typesupport_connext_cpp @@ -18,7 +18,7 @@ def main(argv=sys.argv[1:]): required=True, help='The location of the file containing the generator arguments') parser.add_argument( - '--idl-base-path', + '--dds-interface-base-path', required=True, help='The base location of the DDS interface files') parser.add_argument( @@ -39,11 +39,11 @@ def main(argv=sys.argv[1:]): return generate_dds_connext_cpp( generator_args['package_name'], generator_args.get('additional_files', []), - args.idl_base_path, + args.dds_interface_base_path, + generator_args.get('ros_interface_dependencies', []), generator_args['output_dir'], args.idl_pp ) - if __name__ == '__main__': sys.exit(main()) diff --git a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake index 75259b9..51124b0 100644 --- a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_cpp/${PROJECT_NAME}") -set(_dds_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_dds_idl") - rosidl_generate_dds_interfaces( ${rosidl_generate_interfaces_TARGET}__dds_connext_idl IDL_TUPLES ${rosidl_generate_interfaces_IDL_TUPLES} @@ -22,6 +19,9 @@ rosidl_generate_dds_interfaces( OUTPUT_SUBFOLDERS "dds_connext" ) +set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_connext_cpp/${PROJECT_NAME}") +set(_dds_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_dds_idl") + set(_dds_idl_files "") set(_generated_files "") set(_generated_external_files "") From fd7a320b1b18b5346df4a5e76416d4670e313a03 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Fri, 30 Nov 2018 16:36:47 -0800 Subject: [PATCH 15/20] Fixes for C++ srv templates. --- .../resource/srv__rosidl_typesupport_connext_cpp.hpp.em | 6 +++--- .../resource/srv__type_support.cpp.em | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em b/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em index 7e79445..fdfe453 100644 --- a/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em +++ b/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em @@ -19,7 +19,7 @@ header_files = [ #include "@(header_file)" @[end for]@ -@[for ns in service.structure.namespaces]@ +@[for ns in service.structure_type.namespaces]@ namespace @(ns) { @@ -109,7 +109,7 @@ get_reply_datawriter__@(service.structure_type.name)(void * untyped_replier); } // namespace typesupport_connext_cpp -@[for ns in reversed(service.structure.namespaces)]@ +@[for ns in reversed(service.structure_type.namespaces)]@ } // namespace @(ns) @[end for]@ @@ -124,7 +124,7 @@ const rosidl_service_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( rosidl_typesupport_connext_cpp, @(', '.join([package_name] + list(interface_path.parents[0].parts))), - @(service.structure.type.name))(); + @(service.structure_type.name))(); #ifdef __cplusplus } diff --git a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em index 5ec40ae..8a3aadd 100644 --- a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em @@ -20,7 +20,7 @@ TEMPLATE( from rosidl_cmake import convert_camel_case_to_lower_case_underscore include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) -service_name = convert_camel_case_to_lower_case_underscore(service.structure.type.name) +service_name = convert_camel_case_to_lower_case_underscore(service.structure_type.name) request_message_name = convert_camel_case_to_lower_case_underscore(service.request_message.structure.type.name) response_message_name = convert_camel_case_to_lower_case_underscore(service.response_message.structure.type.name) @@ -105,8 +105,8 @@ namespace typesupport_connext_cpp { @{ -__ros_srv_pkg_prefix = '::'.join(service.structure.namespaces) -__ros_srv_type = __ros_srv_pkg_prefix + '::' + service.structure.type.name +__ros_srv_pkg_prefix = '::'.join(service.structure_type.namespaces) +__ros_srv_type = __ros_srv_pkg_prefix + '::' + service.structure_type.name __ros_request_msg_type = __ros_srv_pkg_prefix + '::' + service.request_message.structure.type.name __ros_response_msg_type = __ros_srv_pkg_prefix + '::' + service.response_message.structure.type.name __dds_request_msg_type = __ros_srv_pkg_prefix + '::dds_::' + service.request_message.structure.type.name + '_' From 7028707bbba58f674d74d77ec61bef3d4af7c74d Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Fri, 30 Nov 2018 19:49:14 -0800 Subject: [PATCH 16/20] Many fixes to C & C++ type support. --- .../idl__dds_connext__type_support_c.cpp.em | 18 ++-- .../resource/msg__type_support_c.cpp.em | 84 ++++++++++--------- .../srv__rosidl_typesupport_connext_c.h.em | 4 +- .../resource/srv__type_support_c.cpp.em | 62 +++++++------- .../idl__dds_connext__type_support.cpp.em | 18 ++-- .../resource/msg__type_support.cpp.em | 42 ++++++---- ...srv__rosidl_typesupport_connext_cpp.hpp.em | 2 +- .../resource/srv__type_support.cpp.em | 67 +++++++-------- 8 files changed, 157 insertions(+), 140 deletions(-) diff --git a/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em index cd6304f..f788bb3 100644 --- a/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em @@ -19,7 +19,8 @@ from rosidl_parser.definition import Message for message in content.get_elements_of_type(Message): TEMPLATE( 'msg__type_support_c.cpp.em', - package_name=package_name, interface_path=interface_path, message=message, + package_name=package_name, interface_path=interface_path, + message=message, include_prefix=message.structure.type.name, include_directives=include_directives ) ####################################################################### @@ -29,7 +30,8 @@ from rosidl_parser.definition import Service for service in content.get_elements_of_type(Service): TEMPLATE( 'srv__type_support_c.cpp.em', - package_name=package_name, interface_path=interface_path, service=service, + package_name=package_name, interface_path=interface_path, + service=service, include_prefix=service.structure_type.name, include_directives=include_directives ) ####################################################################### @@ -39,17 +41,23 @@ from rosidl_parser.definition import Action for action in content.get_elements_of_type(Action): TEMPLATE( 'srv__type_support_c.cpp.em', - package_name=package_name, interface_path=interface_path, service=action.goal_service, + package_name=package_name, interface_path=interface_path, + service=action.goal_service, + include_prefix=action.goal_service.structure_type.name, include_directives=include_directives ) TEMPLATE( 'srv__type_support_c.cpp.em', - package_name=package_name, interface_path=interface_path, service=action.result_service, + package_name=package_name, interface_path=interface_path, + service=action.result_service, + include_prefix=action.result_service.structure_type.name, include_directives=include_directives ) TEMPLATE( 'msg__type_support_c.cpp.em', - package_name=package_name, interface_path=interface_path, message=action.feedback_message, + package_name=package_name, interface_path=interface_path, + message=action.feedback_message, + include_prefix=action.feedback_message.structure.type.name, include_directives=include_directives ) }@ diff --git a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em index 82968b2..b9e943f 100644 --- a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em @@ -15,25 +15,26 @@ from rosidl_parser.definition import String from rosidl_parser.definition import WString include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) -message_name = convert_camel_case_to_lower_case_underscore(message.structure.type.name) + +lower_case_include_prefix = convert_camel_case_to_lower_case_underscore(include_prefix) system_header_files = [ 'cassert', 'limits' ] header_files = [ - include_base + '/' + message_name + '__rosidl_typesupport_connext_c.h', + include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_c.h', 'rcutils/types/uint8_array.h', 'rosidl_typesupport_connext_c/identifier.h', 'rosidl_typesupport_connext_cpp/message_type_support.h', package_name + '/msg/rosidl_typesupport_connext_c__visibility_control.h', - include_base + '/' + message_name + '__struct.h', - include_base + '/' + message_name + '__functions.h' + include_base + '/' + lower_case_include_prefix + '__struct.h', + include_base + '/' + lower_case_include_prefix + '__functions.h' ] dds_specific_header_files = [ - include_base + '/dds_connext/' + message.structure.type.name + '_Support.h', - include_base + '/dds_connext/' + message.structure.type.name + '_Plugin.h' + include_base + '/dds_connext/' + include_prefix + '_Support.h', + include_base + '/dds_connext/' + include_prefix + '_Plugin.h' ] }@ @@ -142,8 +143,11 @@ for member in message.structure.members: from collections import OrderedDict forward_declares = OrderedDict() for member in message.structure.members: - if isinstance(member.type, NamespacedType): - _, member_names = forward_declares.setdefault(member.type.name, (member.type, [])) + type_ = member.type + if isinstance(type_, NestedType): + type_ = type_.basetype + if isinstance(type_, NamespacedType): + _, member_names = forward_declares.setdefault(type_.name, (type_, [])) member_names.append(member.name) }@ @@ -152,7 +156,7 @@ for member in message.structure.members: // Member '@(name)' @[ end for]@ @[ if member_type.namespaces[0] != package_name]@ -ROSIDL_TYPESUPPORT_CONNEXT_C_IMPORT_@(member_type.namespaces[0]) +ROSIDL_TYPESUPPORT_CONNEXT_C_IMPORT_@(package_name) @[ end if]@ const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( @@ -169,17 +173,14 @@ __dds_cpp_msg_type_prefix = '::'.join(message.structure.type.namespaces + ['dds_ __dds_cpp_msg_type = __dds_cpp_msg_type_prefix + '_' }@ -using __dds_msg_type = @(__dds_cpp_msg_type); -using __ros_msg_type = @(__ros_c_msg_type); - static DDS_TypeCode * -get_type_code() +_@(message.structure.type.name)__get_type_code() { return @(__dds_cpp_msg_type_prefix)_TypeSupport::get_typecode(); } static bool -convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) +_@(message.structure.type.name)__convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) { if (!untyped_ros_message) { fprintf(stderr, "ros message handle is null\n"); @@ -189,8 +190,10 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message) fprintf(stderr, "dds message handle is null\n"); return false; } - const __ros_msg_type * ros_message = static_cast(untyped_ros_message); - __dds_msg_type * dds_message = static_cast<__dds_msg_type *>(untyped_dds_message); + const @(__ros_c_msg_type) * ros_message = + static_cast(untyped_ros_message); + @(__dds_cpp_msg_type) * dds_message = + static_cast<@(__dds_cpp_msg_type) *>(untyped_dds_message); @[if not message.structure.members]@ // No fields is a no-op. (void)dds_message; @@ -299,7 +302,7 @@ if isinstance(type_, NestedType): } static bool -convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message) +_@(message.structure.type.name)__convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message) { if (!untyped_ros_message) { fprintf(stderr, "ros message handle is null\n"); @@ -309,8 +312,10 @@ convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message) fprintf(stderr, "dds message handle is null\n"); return false; } - const __dds_msg_type * dds_message = static_cast(untyped_dds_message); - __ros_msg_type * ros_message = static_cast<__ros_msg_type *>(untyped_ros_message); + const @(__dds_cpp_msg_type) * dds_message = + static_cast(untyped_dds_message); + @(__ros_c_msg_type) * ros_message = + static_cast<@(__ros_c_msg_type) *>(untyped_ros_message); @[if not message.structure.members]@ // No fields is a no-op. (void)dds_message; @@ -409,7 +414,7 @@ if isinstance(type_, NestedType): static bool -to_cdr_stream( +_@(message.structure.type.name)__to_cdr_stream( const void * untyped_ros_message, rcutils_uint8_array_t * cdr_stream) { @@ -419,18 +424,19 @@ to_cdr_stream( if (!cdr_stream) { return false; } - const __ros_msg_type * ros_message = static_cast(untyped_ros_message); - __dds_msg_type dds_message; - if (!convert_ros_to_dds(ros_message, &dds_message)) { + const @(__ros_c_msg_type) * ros_message = + static_cast(untyped_ros_message); + @(__dds_cpp_msg_type) dds_message; + if (!_@(message.structure.type.name)__convert_ros_to_dds(ros_message, &dds_message)) { return false; } // call the serialize function for the first time to get the expected length of the message unsigned int expected_length; - if (@(message.structure.type.name)_Plugin_serialize_to_cdr_buffer( + if (@(__dds_cpp_msg_type_prefix)_Plugin_serialize_to_cdr_buffer( NULL, &expected_length, &dds_message) != RTI_TRUE) { - fprintf(stderr, "failed to call @(message.structure.type.name)_Plugin_serialize_to_cdr_buffer()\n"); + fprintf(stderr, "failed to call @(__dds_cpp_msg_type_prefix)_Plugin_serialize_to_cdr_buffer()\n"); return false; } cdr_stream->buffer_length = expected_length; @@ -444,7 +450,7 @@ to_cdr_stream( } // call the function again and fill the buffer this time unsigned int buffer_length_uint = static_cast(cdr_stream->buffer_length); - if (@(message.structure.type.name)_Plugin_serialize_to_cdr_buffer( + if (@(__dds_cpp_msg_type_prefix)_Plugin_serialize_to_cdr_buffer( reinterpret_cast(cdr_stream->buffer), &buffer_length_uint, &dds_message) != RTI_TRUE) @@ -456,7 +462,7 @@ to_cdr_stream( } static bool -to_message( +_@(message.structure.type.name)__to_message( const rcutils_uint8_array_t * cdr_stream, void * untyped_ros_message) { @@ -467,13 +473,13 @@ to_message( return false; } - __dds_msg_type * dds_message = + @(__dds_cpp_msg_type) * dds_message = @(__dds_cpp_msg_type_prefix)_TypeSupport::create_data(); if (cdr_stream->buffer_length > (std::numeric_limits::max)()) { fprintf(stderr, "cdr_stream->buffer_length, unexpectedly larger than max unsigned int\n"); return false; } - if (@(message.structure.type.name)_Plugin_deserialize_from_cdr_buffer( + if (@(__dds_cpp_msg_type_prefix)_Plugin_deserialize_from_cdr_buffer( dds_message, reinterpret_cast(cdr_stream->buffer), static_cast(cdr_stream->buffer_length)) != RTI_TRUE) @@ -481,7 +487,7 @@ to_message( fprintf(stderr, "deserialize from cdr buffer failed\n"); return false; } - bool success = convert_dds_to_ros(dds_message, untyped_ros_message); + bool success = _@(message.structure.type.name)__convert_dds_to_ros(dds_message, untyped_ros_message); if (@(__dds_cpp_msg_type_prefix)_TypeSupport::delete_data(dds_message) != DDS_RETCODE_OK) { return false; } @@ -491,19 +497,19 @@ to_message( @ @# // Collect the callback functions and provide a function to get the type support struct. -static message_type_support_callbacks_t __callbacks = { +static message_type_support_callbacks_t _@(message.structure.type.name)__callbacks = { "@(package_name)", // package_name "@(message.structure.type.name)", // message_name - get_type_code, // get_type_code - convert_ros_to_dds, // convert_ros_to_dds - convert_dds_to_ros, // convert_dds_to_ros - to_cdr_stream, // to_cdr_stream - to_message // to_message + _@(message.structure.type.name)__get_type_code, // get_type_code + _@(message.structure.type.name)__convert_ros_to_dds, // convert_ros_to_dds + _@(message.structure.type.name)__convert_dds_to_ros, // convert_dds_to_ros + _@(message.structure.type.name)__to_cdr_stream, // to_cdr_stream + _@(message.structure.type.name)__to_message // to_message }; -static rosidl_message_type_support_t __type_support = { +static rosidl_message_type_support_t _@(message.structure.type.name)__type_support = { rosidl_typesupport_connext_c__identifier, - &__callbacks, + &_@(message.structure.type.name)__callbacks, get_message_typesupport_handle_function, }; @@ -512,7 +518,7 @@ ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( rosidl_typesupport_connext_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(message.structure.type.name))() { - return &__type_support; + return &_@(message.structure.type.name)__type_support; } #if defined(__cplusplus) diff --git a/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em b/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em index 2854b93..4103775 100644 --- a/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em +++ b/rosidl_typesupport_connext_c/resource/srv__rosidl_typesupport_connext_c.h.em @@ -4,7 +4,7 @@ header_files = [ 'rosidl_generator_c/service_type_support_struct.h', 'rosidl_typesupport_interface/macros.h', - package_name + '/msg/rosidl_typesupport_connext_cpp__visibility_control.h' + package_name + '/msg/rosidl_typesupport_connext_c__visibility_control.h' ] }@ @@ -28,7 +28,7 @@ const rosidl_service_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( rosidl_typesupport_connext_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), - @(service.structure_type.name))(); + @(interface_path.stem))(); #ifdef __cplusplus } diff --git a/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em index 0a9131f..3f00ad5 100644 --- a/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em @@ -1,44 +1,22 @@ @# Included from rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em - -@{ -TEMPLATE( - 'msg__type_support.c.em', - package_name=package_name, interface_path=interface_path, message=service.request_message, - include_directives=include_directives -) -}@ - -@{ -TEMPLATE( - 'msg__type_support.c.em', - package_name=package_name, interface_path=interface_path, message=service.response_message, - include_directives=include_directives -) -}@ - @{ from rosidl_cmake import convert_camel_case_to_lower_case_underscore include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) -service_name = convert_camel_case_to_lower_case_underscore(service.structure.type.name) -request_message_name = convert_camel_case_to_lower_case_underscore(service.request_message.structure.type.name) -response_message_name = convert_camel_case_to_lower_case_underscore(service.response_message.structure.type.name) +lower_case_include_prefix = convert_camel_case_to_lower_case_underscore(include_prefix) header_files = [ - include_base + '/' + service_name + '__rosidl_typesupport_connext_c.h', + include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_c.h', 'rosidl_typesupport_connext_cpp/service_type_support.h', - 'rosidl_typesupport_connext_cpp/message_type_support.h' + 'rosidl_typesupport_connext_cpp/message_type_support.h', 'rmw/rmw.h', 'rosidl_typesupport_cpp/service_type_support.hpp', 'rosidl_typesupport_connext_c/identifier.h', package_name + '/msg/rosidl_typesupport_connext_c__visibility_control.h', - include_base + '/' + service_name + '.h', - include_base + '/dds_connext/' + service.request_message.structure.type.name + '_Support.h', - include_base + '/' + request_message_name + '__rosidl_typesupport_connext_c.h', - include_base + '/dds_connext/' + service.response_message.structure.type.name + '_Support.h', - include_base + '/' + response_message_name + '__rosidl_typesupport_connext_c.h' + include_base + '/dds_connext/' + include_prefix + '_Support.h', + include_base + '/' + lower_case_include_prefix + '.h', # Re-use most of the functions from C++ typesupport - include_base + '/' + service_name + '__rosidl_typesupport_connext_cpp.hpp', + include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_cpp.hpp', ] dds_specific_header_files = [ @@ -85,6 +63,26 @@ dds_specific_header_files = [ #include "@(header_file)" @[end for]@ +@{ +TEMPLATE( + 'msg__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, + message=service.request_message, + include_prefix=include_prefix, + include_directives=include_directives +) +}@ + +@{ +TEMPLATE( + 'msg__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, + message=service.response_message, + include_prefix=include_prefix, + include_directives=include_directives +) +}@ + class DDSDomainParticipant; class DDSDataReader; struct DDS_SampleIdentity_t; @@ -344,7 +342,7 @@ get_reply_datawriter__@(service.structure_type.name)(void * untyped_replier) untyped_replier); } -static service_type_support_callbacks_t __callbacks = { +static service_type_support_callbacks_t _@(service.structure_type.name)__callbacks = { "@(package_name)", "@(service.structure_type.name)", &create_requester__@(service.structure_type.name), @@ -361,9 +359,9 @@ static service_type_support_callbacks_t __callbacks = { &get_reply_datawriter__@(service.structure_type.name) }; -static rosidl_service_type_support_t __type_support = { +static rosidl_service_type_support_t _@(service.structure_type.name)__type_support = { rosidl_typesupport_connext_c__identifier, - &__callbacks, + &_@(service.structure_type.name)__callbacks, get_service_typesupport_handle_function, }; @@ -373,7 +371,7 @@ ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( rosidl_typesupport_connext_c, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(service.structure_type.name))() { - return &__type_support; + return &_@(service.structure_type.name)__type_support; } #if defined(__cplusplus) diff --git a/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em index 4e68ea1..cd8e473 100644 --- a/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em @@ -19,7 +19,8 @@ from rosidl_parser.definition import Message for message in content.get_elements_of_type(Message): TEMPLATE( 'msg__type_support.cpp.em', - package_name=package_name, interface_path=interface_path, message=message, + package_name=package_name, interface_path=interface_path, + message=message, include_prefix=message.structure.type.name, include_directives=include_directives ) ####################################################################### @@ -29,7 +30,8 @@ from rosidl_parser.definition import Service for service in content.get_elements_of_type(Service): TEMPLATE( 'srv__type_support.cpp.em', - package_name=package_name, interface_path=interface_path, service=service, + package_name=package_name, interface_path=interface_path, + service=service, include_prefix=service.structure_type.name, include_directives=include_directives ) ####################################################################### @@ -39,17 +41,23 @@ from rosidl_parser.definition import Action for action in content.get_elements_of_type(Action): TEMPLATE( 'srv__type_support.cpp.em', - package_name=package_name, interface_path=interface_path, service=action.goal_service, + package_name=package_name, interface_path=interface_path, + service=action.goal_service, + include_prefix=action.goal_service.structure_type.name, include_directives=include_directives ) TEMPLATE( 'srv__type_support.cpp.em', - package_name=package_name, interface_path=interface_path, service=action.result_service, + package_name=package_name, interface_path=interface_path, + service=action.result_service, + include_prefix=action.result_service.structure_type.name, include_directives=include_directives ) TEMPLATE( 'msg__type_support.cpp.em', - package_name=package_name, interface_path=interface_path, message=action.feedback_message, + package_name=package_name, interface_path=interface_path, + message=action.feedback_message, + include_prefix=action.feedback_message.structure.type.name, include_directives=include_directives ) }@ diff --git a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em index bd1d1e0..985d0da 100644 --- a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em @@ -10,14 +10,15 @@ from rosidl_parser.definition import NamespacedType from rosidl_parser.definition import NestedType include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) -message_name = convert_camel_case_to_lower_case_underscore(message.structure.type.name) + +lower_case_include_prefix = convert_camel_case_to_lower_case_underscore(include_prefix) system_header_files = [ 'limits', 'stdexcept' ] header_files = [ - include_base + '/' + message_name + '__rosidl_typesupport_connext_cpp.hpp', + include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_cpp.hpp', 'rcutils/types/uint8_array.h', 'rosidl_typesupport_cpp/message_type_support.hpp', 'rosidl_typesupport_connext_cpp/identifier.hpp', @@ -48,23 +49,28 @@ header_files = [ // forward declaration of message dependencies and their conversion functions @[for member in message.structure.members]@ -@[ if isinstance(member.type, NamespacedType)]@ -@[ for ns in member.type.namespaces]@ +@{ +type_ = member.type +if isinstance(type_, NestedType): + type_ = type_.basetype +}@ +@[ if isinstance(type_, NamespacedType)]@ +@[ for ns in type_.namespaces]@ namespace @(ns) { @[ end for]@ namespace dds_ { -class @(member.type.name)_; +class @(type_.name)_; } // namespace dds_ namespace typesupport_connext_cpp { @{ -member_ros_msg_pkg_prefix = '::'.join(member.type.namespaces) -member_ros_msg_type = member_ros_msg_pkg_prefix + '::' + member.type.name -member_dds_msg_type = member_ros_msg_pkg_prefix + '::dds_::' + member.type.name + '_' +member_ros_msg_pkg_prefix = '::'.join(type_.namespaces) +member_ros_msg_type = member_ros_msg_pkg_prefix + '::' + type_.name +member_dds_msg_type = member_ros_msg_pkg_prefix + '::dds_::' + type_.name + '_' }@ bool convert_ros_message_to_dds( @@ -74,7 +80,7 @@ bool convert_dds_message_to_ros( const @(member_dds_msg_type) &, @(member_ros_msg_type) &); } // namespace typesupport_connext_cpp -@[ for ns in reversed(member.type.namespaces)]@ +@[ for ns in reversed(type_.namespaces)]@ } // namespace @(ns) @[ end for]@ @[ end if]@ @@ -262,12 +268,12 @@ to_cdr_stream__@(message.structure.type.name)( // call the serialize function for the first time to get the expected length of the message unsigned int expected_length; - if (@(message.structure.type.name)_Plugin_serialize_to_cdr_buffer( + if (@(__dds_msg_type_prefix)_Plugin_serialize_to_cdr_buffer( NULL, &expected_length, dds_message) != RTI_TRUE) { - fprintf(stderr, "failed to call @(message.structure.type.name)_Plugin_serialize_to_cdr_buffer()\n"); + fprintf(stderr, "failed to call @(__dds_msg_type_prefix)_Plugin_serialize_to_cdr_buffer()\n"); return false; } cdr_stream->buffer_length = expected_length; @@ -281,7 +287,7 @@ to_cdr_stream__@(message.structure.type.name)( } // call the function again and fill the buffer this time unsigned int buffer_length_uint = static_cast(cdr_stream->buffer_length); - if (@(message.structure.type.name)_Plugin_serialize_to_cdr_buffer( + if (@(__dds_msg_type_prefix)_Plugin_serialize_to_cdr_buffer( reinterpret_cast(cdr_stream->buffer), &buffer_length_uint, dds_message) != RTI_TRUE) @@ -315,7 +321,7 @@ to_message__@(message.structure.type.name)( fprintf(stderr, "cdr_stream->buffer_length, unexpectedly larger than max unsigned int\n"); return false; } - if (@(message.structure.type.name)_Plugin_deserialize_from_cdr_buffer( + if (@(__dds_msg_type_prefix)_Plugin_deserialize_from_cdr_buffer( dds_message, reinterpret_cast(cdr_stream->buffer), static_cast(cdr_stream->buffer_length)) != RTI_TRUE) @@ -333,7 +339,7 @@ to_message__@(message.structure.type.name)( return success; } -static message_type_support_callbacks_t callbacks = { +static message_type_support_callbacks_t _@(message.structure.type.name)__callbacks = { "@(package_name)", "@(message.structure.type.name)", &get_type_code__@(message.structure.type.name), @@ -343,9 +349,9 @@ static message_type_support_callbacks_t callbacks = { &to_message__@(message.structure.type.name) }; -static rosidl_message_type_support_t handle = { +static rosidl_message_type_support_t _@(message.structure.type.name)__handle = { rosidl_typesupport_connext_cpp::typesupport_identifier, - &callbacks, + &_@(message.structure.type.name)__callbacks, get_message_typesupport_handle_function, }; @@ -364,7 +370,7 @@ ROSIDL_TYPESUPPORT_CONNEXT_CPP_EXPORT_@(package_name) const rosidl_message_type_support_t * get_message_type_support_handle<@(__ros_msg_type)>() { - return &@(__ros_msg_pkg_prefix)::typesupport_connext_cpp::handle; + return &@(__ros_msg_pkg_prefix)::typesupport_connext_cpp::_@(message.structure.type.name)__handle; } } // namespace rosidl_typesupport_connext_cpp @@ -379,7 +385,7 @@ ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME( rosidl_typesupport_connext_cpp, @(', '.join([package_name] + list(interface_path.parents[0].parts))), @(message.structure.type.name))() { - return &@(__ros_msg_pkg_prefix)::typesupport_connext_cpp::handle; + return &@(__ros_msg_pkg_prefix)::typesupport_connext_cpp::_@(message.structure.type.name)__handle; } #ifdef __cplusplus diff --git a/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em b/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em index fdfe453..9d9e731 100644 --- a/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em +++ b/rosidl_typesupport_connext_cpp/resource/srv__rosidl_typesupport_connext_cpp.hpp.em @@ -124,7 +124,7 @@ const rosidl_service_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( rosidl_typesupport_connext_cpp, @(', '.join([package_name] + list(interface_path.parents[0].parts))), - @(service.structure_type.name))(); + @(interface_path.stem))(); #ifdef __cplusplus } diff --git a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em index 8a3aadd..8006670 100644 --- a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em @@ -1,40 +1,20 @@ @# Included from rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em -@{ -TEMPLATE( - 'msg__type_support.cpp.em', - package_name=package_name, interface_path=interface_path, message=service.request_message, - include_directives=include_directives -) -}@ - -@{ -TEMPLATE( - 'msg__type_support.cpp.em', - package_name=package_name, interface_path=interface_path, message=service.response_message, - include_directives=include_directives -) -}@ - @{ from rosidl_cmake import convert_camel_case_to_lower_case_underscore include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) -service_name = convert_camel_case_to_lower_case_underscore(service.structure_type.name) -request_message_name = convert_camel_case_to_lower_case_underscore(service.request_message.structure.type.name) -response_message_name = convert_camel_case_to_lower_case_underscore(service.response_message.structure.type.name) +lower_case_include_prefix = convert_camel_case_to_lower_case_underscore(include_prefix) header_files = [ - include_base + '/' + service_name + '__rosidl_typesupport_connext_cpp.hpp', + include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_cpp.hpp', 'rmw/error_handling.h', 'rosidl_typesupport_connext_cpp/identifier.hpp', 'rosidl_typesupport_connext_cpp/service_type_support.h', 'rosidl_typesupport_connext_cpp/service_type_support_decl.hpp', - include_base + '/' + service_name + '__struct.hpp', - include_base + '/dds_connext/' + service.request_message.structure.type.name + '_Support.h', - include_base + '/' + request_message_name + '__rosidl_typesupport_connext_cpp.hpp', - include_base + '/dds_connext/' + service.response_message.structure.type.name + '_Support.h', - include_base + '/' + response_message_name + '__rosidl_typesupport_connext_cpp.hpp' + include_base + '/' + lower_case_include_prefix + '__struct.hpp', + include_base + '/dds_connext/' + include_prefix + '_Support.h', + include_base + '/dds_connext/' + include_prefix + '_Plugin.h' ] dds_specific_header_files = [ @@ -83,12 +63,23 @@ dds_specific_header_files = [ @[end for]@ @{ -# TODO(hidmic): still necessary? -# header_filename = get_header_filename_from_msg_name(spec.srv_name) -# if header_filename.endswith('__request'): -# header_filename = header_filename[:-9] -# elif header_filename.endswith('__response'): -# header_filename = header_filename[:-10] +TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, + message=service.request_message, + include_prefix=include_prefix, + include_directives=include_directives +) +}@ + +@{ +TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, + message=service.response_message, + include_prefix=include_prefix, + include_directives=include_directives +) }@ class DDSDomainParticipant; @@ -376,7 +367,7 @@ bool send_response__@(service.structure_type.name)( const rmw_request_id_t * request_header, const void * untyped_ros_response) { - using ROSResponseType = @(__ros_response_msg_type); + using ROSResponseType = const @(__ros_response_msg_type); using ReplierType = connext::Replier< @(__dds_request_msg_type), @(__dds_response_msg_type) @@ -463,7 +454,7 @@ get_reply_datawriter__@(service.structure_type.name)(void * untyped_replier) return replier->get_reply_datawriter(); } -static service_type_support_callbacks_t callbacks = { +static service_type_support_callbacks_t _@(service.structure_type.name)__callbacks = { "@(package_name)", "@(service.structure_type.name)", &create_requester__@(service.structure_type.name), @@ -480,9 +471,9 @@ static service_type_support_callbacks_t callbacks = { &get_reply_datawriter__@(service.structure_type.name), }; -static rosidl_service_type_support_t handle = { +static rosidl_service_type_support_t _@(service.structure_type.name)__handle = { rosidl_typesupport_connext_cpp::typesupport_identifier, - &callbacks, + &_@(service.structure_type.name)__callbacks, get_service_typesupport_handle_function, }; @@ -501,7 +492,7 @@ ROSIDL_TYPESUPPORT_CONNEXT_CPP_EXPORT_@(package_name) const rosidl_service_type_support_t * get_service_type_support_handle<@(__ros_srv_type)>() { - return &@(__ros_srv_pkg_prefix)::typesupport_connext_cpp::handle; + return &@(__ros_srv_pkg_prefix)::typesupport_connext_cpp::_@(service.structure_type.name)__handle; } } // namespace rosidl_typesupport_connext_cpp @@ -515,8 +506,8 @@ const rosidl_service_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__SERVICE_SYMBOL_NAME( rosidl_typesupport_connext_cpp, @(', '.join([package_name] + list(interface_path.parents[0].parts))), - @(service.structure_type.name))(); - return &@(__ros_srv_pkg_prefix)::typesupport_connext_cpp::handle; + @(service.structure_type.name))() { + return &@(__ros_srv_pkg_prefix)::typesupport_connext_cpp::_@(service.structure_type.name)__handle; } #ifdef __cplusplus From 7e4a64f0a9e6c4d021927b0abf1a3c0c115ab049 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Sun, 2 Dec 2018 14:09:23 -0800 Subject: [PATCH 17/20] Yet more fixes to C & C++ type support. --- .../idl__dds_connext__type_support_c.cpp.em | 9 ++------- .../resource/msg__type_support_c.cpp.em | 13 +++++++------ .../resource/srv__type_support_c.cpp.em | 14 +++++++------- .../resource/idl__dds_connext__type_support.cpp.em | 9 ++------- .../idl__rosidl_typesupport_connext_cpp.hpp.em | 3 ++- .../msg__rosidl_typesupport_connext_cpp.hpp.em | 6 ------ .../resource/msg__type_support.cpp.em | 4 ++-- .../resource/srv__type_support.cpp.em | 14 +++++++------- 8 files changed, 29 insertions(+), 43 deletions(-) diff --git a/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em index f788bb3..f1858e8 100644 --- a/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em @@ -20,8 +20,7 @@ for message in content.get_elements_of_type(Message): TEMPLATE( 'msg__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, - message=message, include_prefix=message.structure.type.name, - include_directives=include_directives + message=message, include_directives=include_directives ) ####################################################################### # Handle service @@ -31,8 +30,7 @@ for service in content.get_elements_of_type(Service): TEMPLATE( 'srv__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, - service=service, include_prefix=service.structure_type.name, - include_directives=include_directives + service=service, include_directives=include_directives ) ####################################################################### # Handle action @@ -43,21 +41,18 @@ for action in content.get_elements_of_type(Action): 'srv__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, service=action.goal_service, - include_prefix=action.goal_service.structure_type.name, include_directives=include_directives ) TEMPLATE( 'srv__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, service=action.result_service, - include_prefix=action.result_service.structure_type.name, include_directives=include_directives ) TEMPLATE( 'msg__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, message=action.feedback_message, - include_prefix=action.feedback_message.structure.type.name, include_directives=include_directives ) }@ diff --git a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em index b9e943f..a452840 100644 --- a/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/msg__type_support_c.cpp.em @@ -16,25 +16,26 @@ from rosidl_parser.definition import WString include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) -lower_case_include_prefix = convert_camel_case_to_lower_case_underscore(include_prefix) +cpp_include_prefix = interface_path.stem +c_include_prefix = convert_camel_case_to_lower_case_underscore(cpp_include_prefix) system_header_files = [ 'cassert', 'limits' ] header_files = [ - include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_c.h', + include_base + '/' + c_include_prefix + '__rosidl_typesupport_connext_c.h', 'rcutils/types/uint8_array.h', 'rosidl_typesupport_connext_c/identifier.h', 'rosidl_typesupport_connext_cpp/message_type_support.h', package_name + '/msg/rosidl_typesupport_connext_c__visibility_control.h', - include_base + '/' + lower_case_include_prefix + '__struct.h', - include_base + '/' + lower_case_include_prefix + '__functions.h' + include_base + '/' + c_include_prefix + '__struct.h', + include_base + '/' + c_include_prefix + '__functions.h' ] dds_specific_header_files = [ - include_base + '/dds_connext/' + include_prefix + '_Support.h', - include_base + '/dds_connext/' + include_prefix + '_Plugin.h' + include_base + '/dds_connext/' + cpp_include_prefix + '_Support.h', + include_base + '/dds_connext/' + cpp_include_prefix + '_Plugin.h' ] }@ diff --git a/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em index 3f00ad5..fb693a8 100644 --- a/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/srv__type_support_c.cpp.em @@ -3,20 +3,22 @@ from rosidl_cmake import convert_camel_case_to_lower_case_underscore include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) -lower_case_include_prefix = convert_camel_case_to_lower_case_underscore(include_prefix) +cpp_include_prefix = interface_path.stem + +c_include_prefix = convert_camel_case_to_lower_case_underscore(cpp_include_prefix) header_files = [ - include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_c.h', + include_base + '/' + c_include_prefix + '__rosidl_typesupport_connext_c.h', 'rosidl_typesupport_connext_cpp/service_type_support.h', 'rosidl_typesupport_connext_cpp/message_type_support.h', 'rmw/rmw.h', 'rosidl_typesupport_cpp/service_type_support.hpp', 'rosidl_typesupport_connext_c/identifier.h', package_name + '/msg/rosidl_typesupport_connext_c__visibility_control.h', - include_base + '/dds_connext/' + include_prefix + '_Support.h', - include_base + '/' + lower_case_include_prefix + '.h', + include_base + '/dds_connext/' + cpp_include_prefix + '_Support.h', + include_base + '/' + c_include_prefix + '.h', # Re-use most of the functions from C++ typesupport - include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_cpp.hpp', + include_base + '/' + c_include_prefix + '__rosidl_typesupport_connext_cpp.hpp', ] dds_specific_header_files = [ @@ -68,7 +70,6 @@ TEMPLATE( 'msg__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, message=service.request_message, - include_prefix=include_prefix, include_directives=include_directives ) }@ @@ -78,7 +79,6 @@ TEMPLATE( 'msg__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, message=service.response_message, - include_prefix=include_prefix, include_directives=include_directives ) }@ diff --git a/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em index cd8e473..2f04378 100644 --- a/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em @@ -20,8 +20,7 @@ for message in content.get_elements_of_type(Message): TEMPLATE( 'msg__type_support.cpp.em', package_name=package_name, interface_path=interface_path, - message=message, include_prefix=message.structure.type.name, - include_directives=include_directives + message=message, include_directives=include_directives ) ####################################################################### # Handle service @@ -31,8 +30,7 @@ for service in content.get_elements_of_type(Service): TEMPLATE( 'srv__type_support.cpp.em', package_name=package_name, interface_path=interface_path, - service=service, include_prefix=service.structure_type.name, - include_directives=include_directives + service=service, include_directives=include_directives ) ####################################################################### # Handle action @@ -43,21 +41,18 @@ for action in content.get_elements_of_type(Action): 'srv__type_support.cpp.em', package_name=package_name, interface_path=interface_path, service=action.goal_service, - include_prefix=action.goal_service.structure_type.name, include_directives=include_directives ) TEMPLATE( 'srv__type_support.cpp.em', package_name=package_name, interface_path=interface_path, service=action.result_service, - include_prefix=action.result_service.structure_type.name, include_directives=include_directives ) TEMPLATE( 'msg__type_support.cpp.em', package_name=package_name, interface_path=interface_path, message=action.feedback_message, - include_prefix=action.feedback_message.structure.type.name, include_directives=include_directives ) }@ diff --git a/rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em b/rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em index 8673107..aca7931 100644 --- a/rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em +++ b/rosidl_typesupport_connext_cpp/resource/idl__rosidl_typesupport_connext_cpp.hpp.em @@ -55,7 +55,8 @@ for action in content.get_elements_of_type(Action): ) TEMPLATE( 'srv__rosidl_typesupport_connext_cpp.hpp.em', - package_name=package_name, interface_path=interface_path, service=action.result_service, + package_name=package_name, interface_path=interface_path, + service=action.result_service, include_directives=include_directives ) TEMPLATE( diff --git a/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em b/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em index c20179a..a99cdd4 100644 --- a/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em +++ b/rosidl_typesupport_connext_cpp/resource/msg__rosidl_typesupport_connext_cpp.hpp.em @@ -16,12 +16,6 @@ dds_specific_header_files = [ include_base + '/dds_connext/' + interface_path.stem + '_Plugin.h', 'ndds/ndds_cpp.h' ] -# TODO(hidmic): no longer needed? -# header_filename = get_header_filename_from_msg_name(spec.base_type.type) -# if header_filename.endswith('__request'): -# header_filename = header_filename[:-9] -# elif header_filename.endswith('__response'): -# header_filename = header_filename[:-10] }@ @[for header_file in header_files]@ diff --git a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em index 985d0da..dce64e4 100644 --- a/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/msg__type_support.cpp.em @@ -11,14 +11,14 @@ from rosidl_parser.definition import NestedType include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) -lower_case_include_prefix = convert_camel_case_to_lower_case_underscore(include_prefix) +include_prefix = convert_camel_case_to_lower_case_underscore(interface_path.stem) system_header_files = [ 'limits', 'stdexcept' ] header_files = [ - include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_cpp.hpp', + include_base + '/' + include_prefix + '__rosidl_typesupport_connext_cpp.hpp', 'rcutils/types/uint8_array.h', 'rosidl_typesupport_cpp/message_type_support.hpp', 'rosidl_typesupport_connext_cpp/identifier.hpp', diff --git a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em index 8006670..1418d13 100644 --- a/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/srv__type_support.cpp.em @@ -4,17 +4,19 @@ from rosidl_cmake import convert_camel_case_to_lower_case_underscore include_parts = [package_name] + list(interface_path.parents[0].parts) include_base = '/'.join(include_parts) -lower_case_include_prefix = convert_camel_case_to_lower_case_underscore(include_prefix) +cpp_include_prefix = interface_path.stem + +c_include_prefix = convert_camel_case_to_lower_case_underscore(cpp_include_prefix) header_files = [ - include_base + '/' + lower_case_include_prefix + '__rosidl_typesupport_connext_cpp.hpp', + include_base + '/' + c_include_prefix + '__rosidl_typesupport_connext_cpp.hpp', 'rmw/error_handling.h', 'rosidl_typesupport_connext_cpp/identifier.hpp', 'rosidl_typesupport_connext_cpp/service_type_support.h', 'rosidl_typesupport_connext_cpp/service_type_support_decl.hpp', - include_base + '/' + lower_case_include_prefix + '__struct.hpp', - include_base + '/dds_connext/' + include_prefix + '_Support.h', - include_base + '/dds_connext/' + include_prefix + '_Plugin.h' + include_base + '/' + c_include_prefix + '__struct.hpp', + include_base + '/dds_connext/' + cpp_include_prefix + '_Support.h', + include_base + '/dds_connext/' + cpp_include_prefix + '_Plugin.h' ] dds_specific_header_files = [ @@ -67,7 +69,6 @@ TEMPLATE( 'msg__type_support.cpp.em', package_name=package_name, interface_path=interface_path, message=service.request_message, - include_prefix=include_prefix, include_directives=include_directives ) }@ @@ -77,7 +78,6 @@ TEMPLATE( 'msg__type_support.cpp.em', package_name=package_name, interface_path=interface_path, message=service.response_message, - include_prefix=include_prefix, include_directives=include_directives ) }@ From a1ec8a81391ddb1d36e5add8e5ec4b7db2625600 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Mon, 3 Dec 2018 08:44:10 -0800 Subject: [PATCH 18/20] Fixes copyright dates. --- .../rosidl_typesupport_connext_c_generate_interfaces.cmake | 2 +- .../rosidl_typesupport_connext_cpp_generate_interfaces.cmake | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake b/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake index 1eb990f..74c2985 100644 --- a/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_c/cmake/rosidl_typesupport_connext_c_generate_interfaces.cmake @@ -1,4 +1,4 @@ -# Copyright 2016 Open Source Robotics Foundation, Inc. +# Copyright 2016-2018 Open Source Robotics Foundation, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake index 51124b0..bb25cd7 100644 --- a/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake +++ b/rosidl_typesupport_connext_cpp/cmake/rosidl_typesupport_connext_cpp_generate_interfaces.cmake @@ -1,4 +1,4 @@ -# Copyright 2014-2015 Open Source Robotics Foundation, Inc. +# Copyright 2014-2018 Open Source Robotics Foundation, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From a84971bae7b9d89bd0c24c856ae5d458eaf1460b Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Mon, 3 Dec 2018 12:39:19 -0800 Subject: [PATCH 19/20] Adds back attribute to generated code constants. --- .../rosidl_typesupport_connext_cpp/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py index 4071340..4999ac2 100644 --- a/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py +++ b/rosidl_typesupport_connext_cpp/rosidl_typesupport_connext_cpp/__init__.py @@ -98,7 +98,7 @@ def generate_dds_connext_cpp( def _inject_unused_attribute(pkg_name, msg_name, lines): # prepend attribute before constants of string type - prefix = 'static const DDS_Char * Constants__' + prefix = 'static const DDS_Char *' inject_prefix = '__attribute__((unused)) ' for index, line in enumerate(lines): if not line.lstrip().startswith(prefix): From 7a4a4e480c12adfdde07a612eedd5244a0496526 Mon Sep 17 00:00:00 2001 From: Michel Hidalgo Date: Tue, 4 Dec 2018 11:15:35 -0800 Subject: [PATCH 20/20] Adds missing type support for action messages. --- .../idl__dds_connext__type_support_c.cpp.em | 18 ++++++++++++++++++ .../idl__dds_connext__type_support.cpp.em | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em b/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em index f1858e8..1c1da98 100644 --- a/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em +++ b/rosidl_typesupport_connext_c/resource/idl__dds_connext__type_support_c.cpp.em @@ -37,18 +37,36 @@ for service in content.get_elements_of_type(Service): ####################################################################### from rosidl_parser.definition import Action for action in content.get_elements_of_type(Action): + TEMPLATE( + 'msg__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, + service=action.goal_request, + include_directives=include_directives + ) TEMPLATE( 'srv__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, service=action.goal_service, include_directives=include_directives ) + TEMPLATE( + 'msg__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, + service=action.result_response, + include_directives=include_directives + ) TEMPLATE( 'srv__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, service=action.result_service, include_directives=include_directives ) + TEMPLATE( + 'msg__type_support_c.cpp.em', + package_name=package_name, interface_path=interface_path, + message=action.feedback, + include_directives=include_directives + ) TEMPLATE( 'msg__type_support_c.cpp.em', package_name=package_name, interface_path=interface_path, diff --git a/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em b/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em index 2f04378..d4ebfb9 100644 --- a/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em +++ b/rosidl_typesupport_connext_cpp/resource/idl__dds_connext__type_support.cpp.em @@ -37,18 +37,36 @@ for service in content.get_elements_of_type(Service): ####################################################################### from rosidl_parser.definition import Action for action in content.get_elements_of_type(Action): + TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, + service=action.goal_request, + include_directives=include_directives + ) TEMPLATE( 'srv__type_support.cpp.em', package_name=package_name, interface_path=interface_path, service=action.goal_service, include_directives=include_directives ) + TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, + service=action.result_response, + include_directives=include_directives + ) TEMPLATE( 'srv__type_support.cpp.em', package_name=package_name, interface_path=interface_path, service=action.result_service, include_directives=include_directives ) + TEMPLATE( + 'msg__type_support.cpp.em', + package_name=package_name, interface_path=interface_path, + message=action.feedback, + include_directives=include_directives + ) TEMPLATE( 'msg__type_support.cpp.em', package_name=package_name, interface_path=interface_path,