Skip to content
This repository was archived by the owner on Dec 9, 2021. It is now read-only.

Commit

Permalink
Fix C typesupport
Browse files Browse the repository at this point in the history
  • Loading branch information
jacobperron committed Nov 30, 2018
1 parent 29eb022 commit 1355781
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,9 @@
set(_target_suffix "__rosidl_typesupport_opensplice_c")

set(_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_opensplice_c/${PROJECT_NAME}")
set(_dds_idl_base_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_dds_idl")

# 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)
# get_filename_component(_name "${_idl_file}" NAME_WE)
# get_filename_component(_parent_folder "${_idl_file}" DIRECTORY)
# get_filename_component(_parent_folder "${_parent_folder}" NAME)
# if(_extension STREQUAL ".msg")
# list(APPEND _dds_idl_files
# "${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_opensplice/${_name}_.idl")
# elseif(_extension STREQUAL ".srv")
# list(APPEND _dds_idl_files
# "${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_opensplice/Sample_${_name}_Request_.idl")
# list(APPEND _dds_idl_files
# "${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_opensplice/Sample_${_name}_Response_.idl")
# endif()
# endforeach()

set(_dds_idl_files "")
set(_generated_files "")
set(_generated_external_files "")
set(_dds_output_path "${CMAKE_CURRENT_BINARY_DIR}/rosidl_typesupport_opensplice_cpp/${PROJECT_NAME}")
Expand All @@ -43,18 +27,20 @@ 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
"${_dds_idl_base_path}/${PROJECT_NAME}/${_parent_folder}/dds_opensplice/${_idl_name}_.idl")
list(APPEND _generated_files "${_output_path}/${_parent_folder}/${_header_name}__rosidl_typesupport_opensplice_c.h")
list(APPEND _generated_files "${_output_path}/${_parent_folder}/dds_opensplice_c/${_header_name}__type_support_c.cpp")
list(APPEND _generated_external_files
"${_dds_output_path}/${_parent_folder}/${_idl_name}_.h"
"${_dds_output_path}/${_parent_folder}/${_idl_name}_.cpp"
"${_dds_output_path}/${_parent_folder}/${_idl_name}_Dcps.h"
"${_dds_output_path}/${_parent_folder}/${_idl_name}_Dcps.cpp"
"${_dds_output_path}/${_parent_folder}/${_idl_name}_Dcps_impl.h"
"${_dds_output_path}/${_parent_folder}/${_idl_name}_Dcps_impl.cpp"
"${_dds_output_path}/${_parent_folder}/${_idl_name}_SplDcps.h"
"${_dds_output_path}/${_parent_folder}/${_idl_name}_SplDcps.cpp"
"${_dds_output_path}/${_parent_folder}/ccpp_${_idl_name}_.h")
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_Dcps.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_Dcps.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_Dcps_impl.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_Dcps_impl.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_SplDcps.h"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/${_idl_name}_SplDcps.cpp"
"${_dds_output_path}/${_parent_folder}/dds_opensplice/ccpp_${_idl_name}_.h")
endforeach()

set(_dependency_files "")
Expand Down Expand Up @@ -105,6 +91,7 @@ rosidl_write_generator_arguments(
add_custom_command(
OUTPUT
${_generated_files}
# ${_generated_external_files}
COMMAND ${PYTHON_EXECUTABLE} ${rosidl_typesupport_opensplice_c_BIN}
--generator-arguments-file "${generator_arguments_file}"
DEPENDS ${target_dependencies} ${_dds_idl_files}
Expand Down Expand Up @@ -137,7 +124,8 @@ endif()

link_directories(${OpenSplice_LIBRARY_DIRS})
add_library(${rosidl_generate_interfaces_TARGET}${_target_suffix} SHARED
${_generated_files})
${_generated_files}
${_generated_external_files})
if(rosidl_generate_interfaces_LIBRARY_NAME)
set_target_properties(${rosidl_generate_interfaces_TARGET}${_target_suffix}
PROPERTIES OUTPUT_NAME "${rosidl_generate_interfaces_LIBRARY_NAME}${_target_suffix}")
Expand Down
83 changes: 67 additions & 16 deletions rosidl_typesupport_opensplice_c/resource/msg__type_support_c.cpp.em
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ from rosidl_parser.definition import BasicType
from rosidl_parser.definition import BaseString
from rosidl_parser.definition import NamespacedType
from rosidl_parser.definition import NestedType
from rosidl_parser.definition import String
from rosidl_parser.definition import WString
include_parts = [package_name] + list(interface_path.parents[0].parts)
include_dir = '/'.join(include_parts)
include_parts.append(convert_camel_case_to_lower_case_underscore(interface_path.stem))
Expand Down Expand Up @@ -37,7 +39,7 @@ header_files = [
package_name + '/msg/rosidl_typesupport_opensplice_c__visibility_control.h',
include_base + '__struct.h',
include_base + '__functions.h',
include_dir + '/dds_opensplice/ccpp_' + message.structure.type.name + '.h',
include_dir + '/dds_opensplice/ccpp_' + message.structure.type.name + '_.h',
]
}@
@[for header_file in header_files]@
Expand Down Expand Up @@ -65,12 +67,21 @@ for member in message.structure.members:
if isinstance(member.type, NestedType):
keys.add('rosidl_generator_c/primitives_sequence.h')
keys.add('rosidl_generator_c/primitives_sequence_functions.h')
elif isinstance(member.type, BaseString):
if isinstance(member.type.basetype, String):
keys.add('rosidl_generator_c/string.h')
keys.add('rosidl_generator_c/string_functions.h')
elif isinstance(member.type.basetype, WString):
keys.add('rosidl_generator_c/u16string.h')
keys.add('rosidl_generator_c/u16string_functions.h')
elif isinstance(member.type, String):
keys.add('rosidl_generator_c/string.h')
keys.add('rosidl_generator_c/string_functions.h')
elif isinstance(member.type, WString):
keys.add('rosidl_generator_c/u16string.h')
keys.add('rosidl_generator_c/u16string_functions.h')
elif isinstance(member.type, NamespacedType):
header_file_name = convert_camel_case_to_lower_case_underscore(member.type.name)
keys.add('%s/msg/%s__functions.h' % ('/'.join(member.type.namespaces), header_file_name))
keys.add('%s/%s__functions.h' % ('/'.join(member.type.namespaces), header_file_name))
for key in keys:
if key not in includes:
includes[key] = set([])
Expand All @@ -96,14 +107,13 @@ ROSIDL_TYPESUPPORT_OPENSPLICE_C_IMPORT_@(package_name)
@[ end if]@
const rosidl_message_type_support_t *
ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(
rosidl_typesupport_opensplice_c, @(key[0]), msg, @(key[1]))();
rosidl_typesupport_opensplice_c, @(key[0]), @(key[1]))();
@[end for]@

@# // Make callback functions specific to this message type.
@{
__type_parts = message.structure.type.namespaces + [message.structure.type.name]
__dds_msg_type_prefix = '::'.join(__type_parts) + '_'
__ros_msg_type_prefix = '__'.join(__type_parts)
__dds_msg_type_prefix = '::'.join(message.structure.type.namespaces + ['dds_'] + [message.structure.type.name]) + '_'
__ros_msg_type_prefix = '__'.join(message.structure.type.namespaces + [message.structure.type.name])
}@
using __dds_msg_type = @(__dds_msg_type_prefix);
using __ros_msg_type = @(__ros_msg_type_prefix);
Expand Down Expand Up @@ -162,14 +172,22 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message)
// Field name: @(member.name)
{
@[ if isinstance(member.type, NamespacedType)]@
const message_type_support_callbacks_t * @('__'.join(member.type.namespaces))__@(member.type.name)__callbacks =
const message_type_support_callbacks_t * @('__'.join(member.type.namespaces + [member.type.name] + ['callbacks'])) =
static_cast<const message_type_support_callbacks_t *>(
ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(
rosidl_typesupport_opensplice_c,
@(', '.join(member.type.namespaces)), @(member.type.name)
)()->data);
@[ end if]@
@[ if isinstance(member.type, NestedType)]@
@[ if isinstance(member.type.basetype, NamespacedType)]@
const message_type_support_callbacks_t * @('__'.join(member.type.basetype.namespaces + [member.type.basetype.name] + ['callbacks'])) =
static_cast<const message_type_support_callbacks_t *>(
ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(
rosidl_typesupport_opensplice_c,
@(', '.join(member.type.basetype.namespaces)), @(member.type.basetype.name)
)()->data);
@[ end if]@
@[ if isinstance(member.type, Array)]@
size_t size = @(member.type.size);
@[ else]@
Expand All @@ -187,7 +205,11 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message)
auto & ros_i = ros_message->@(member.name).data[i];
@[ end if]@
@[ if isinstance(member.type.basetype, BaseString)]@
@[ if isinstance(member.type.basetype, WString)]@
const rosidl_generator_c__U16String * str = &ros_i;
@[ else]@
const rosidl_generator_c__String * str = &ros_i;
@[ end if]@
if (!str) {
return "string field was not allocated";
}
Expand All @@ -209,15 +231,19 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message)
dds_message->@(member.name)_[i] = ros_i;
@[ end if]@
@[ else]@
const char * err_msg = @('__'.join(member.type.basetype.namespaces))__@(member.type.basetype.name)__callbacks->convert_ros_to_dds(
const char * err_msg = @('__'.join(member.type.basetype.namespaces + [member.type.basetype.name] + ['callbacks']))->convert_ros_to_dds(
&ros_i, &dds_message->@(member.name)_[i]);
if (err_msg != 0) {
return err_msg;
}
@[ end if]@
}
@[ elif isinstance(member.type, BaseString)]@
@[ if isinstance(member.type, WString)]@
const rosidl_generator_c__U16String * str = &ros_message->@(member.name);
@[ else]@
const rosidl_generator_c__String * str = &ros_message->@(member.name);
@[ end if]@
if (!str) {
return "string field was not allocated";
}
Expand All @@ -235,7 +261,7 @@ convert_ros_to_dds(const void * untyped_ros_message, void * untyped_dds_message)
@[ elif isinstance(member.type, BasicType)]@
dds_message->@(member.name)_ = ros_message->@(member.name);
@[ else]@
const char * err_msg = @('__'.join(member.type.namespaces))__@(member.type.name)__callbacks->convert_ros_to_dds(
const char * err_msg = @('__'.join(member.type.namespaces + [member.type.name] + ['callbacks']))->convert_ros_to_dds(
&ros_message->@(member.name), &dds_message->@(member.name)_);
if (err_msg != 0) {
return err_msg;
Expand Down Expand Up @@ -270,17 +296,19 @@ publish(void * dds_data_writer, const void * ros_message)
DDS::ReturnCode_t status = data_writer->write(dds_message, DDS::HANDLE_NIL);
@[for member in message.structure.members]@
@[ if isinstance(member.type, NestedType)]@
@[ if isinstance(member.type.basetype, BaseString)]@
{
@[ if isinstance(member.type, Array)]@
@[ if isinstance(member.type, Array)]@
size_t size = @(member.type.size);
@[ else]@
@[ else]@
size_t size = dds_message.@(member.name)_.length();
@[ end if]@
@[ end if]@
for (DDS::ULong i = 0; i < size; ++i) {
// This causes the DDS::String_mgr to release the given c string without freeing it.
dds_message.@(member.name)_[i]._retn();
}
}
@[ end if]@
@[ elif isinstance(member.type, BaseString)]@
// This causes the DDS::String_mgr to release the given c string without freeing it.
dds_message.@(member.name)_._retn();
Expand Down Expand Up @@ -340,9 +368,12 @@ convert_dds_to_ros(const void * untyped_dds_message, void * untyped_ros_message)
size_t size = @(member.type.size);
@[ else]@
@{
if isinstance(member.type.basetype, BaseString):
if isinstance(member.type.basetype, String):
array_init = 'rosidl_generator_c__String__Sequence__init'
array_fini = 'rosidl_generator_c__String__Sequence__fini'
elif isinstance(member.type.basetype, WString):
array_init = 'rosidl_generator_c__U16String__Sequence__init'
array_fini = 'rosidl_generator_c__U16String__Sequence__fini'
elif isinstance(member.type.basetype, BasicType):
type_ = member.type.basetype
if type_.type == 'char':
Expand Down Expand Up @@ -374,7 +405,7 @@ else:
@[ else]@
ros_i = dds_message->@(member.name)_[i];
@[ end if]@
@[ elif isinstance(member.type.basetype, BaseString)]@
@[ elif isinstance(member.type.basetype, String)]@
if (!ros_i.data) {
rosidl_generator_c__String__init(&ros_i);
}
Expand All @@ -384,6 +415,16 @@ else:
if (!succeeded) {
return "failed to assign string into field '@(member.name)'";
}
@[ elif isinstance(member.type.basetype, WString)]@
if (!ros_i.data) {
rosidl_generator_c__U16String__init(&ros_i);
}
bool succeeded = rosidl_generator_c__U16String__assign(
&ros_i,
dds_message->@(member.name)_[i]);
if (!succeeded) {
return "failed to assign string into field '@(member.name)'";
}
@[ else]@
const rosidl_message_type_support_t * ts =
ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_opensplice_c, @(', '.join(member.type.basetype.namespaces)), @(member.type.basetype.name))();
Expand All @@ -392,7 +433,7 @@ else:
callbacks->convert_dds_to_ros(&dds_message->@(member.name)_[i], &ros_i);
@[ end if]@
}
@[ elif isinstance(member.type, BaseString)]@
@[ elif isinstance(member.type, String)]@
if (!ros_message->@(member.name).data) {
rosidl_generator_c__String__init(&ros_message->@(member.name));
}
Expand All @@ -402,6 +443,16 @@ else:
if (!succeeded) {
return "failed to assign string into field '@(member.name)'";
}
@[ elif isinstance(member.type, WString)]@
if (!ros_message->@(member.name).data) {
rosidl_generator_c__U16String__init(&ros_message->@(member.name));
}
bool succeeded = rosidl_generator_c__U16String__assign(
&ros_message->@(member.name),
dds_message->@(member.name)_);
if (!succeeded) {
return "failed to assign string into field '@(member.name)'";
}
@[ elif isinstance(member.type, BasicType)]@
ros_message->@(member.name) = @('(' if member.type.type == 'boolean' else '')dds_message->@(member.name)_@(' != 0)' if member.type.type == 'boolean' else '');
@[ else]@
Expand Down

0 comments on commit 1355781

Please sign in to comment.