Skip to content

Commit

Permalink
Merge pull request #54 from fmrico/eloquent_nested_types
Browse files Browse the repository at this point in the history
Support for nested types
  • Loading branch information
theseankelly committed Apr 27, 2020
2 parents f928c55 + 5b5ee88 commit 4043f2f
Show file tree
Hide file tree
Showing 27 changed files with 155 additions and 132 deletions.
27 changes: 27 additions & 0 deletions rcldotnet/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,33 @@ ament_export_dependencies(rosidl_typesupport_c)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
ament_lint_auto_find_test_dependencies()

find_package(std_msgs REQUIRED)
find_package(test_msgs REQUIRED)

ament_lint_auto_find_test_dependencies()

set(_assemblies_dep_dlls
${rcldotnet_common_ASSEMBLIES_DLL}
${std_msgs_ASSEMBLIES_DLL}
${test_msgs_ASSEMBLIES_DLL}
${builtin_interfaces_ASSEMBLIES_DLL}
)

add_dotnet_test(test_messages
${CS_SOURCES}
test/test_messages.cs
INCLUDE_DLLS
${_assemblies_dep_dlls}
INCLUDE_REFERENCES
"Microsoft.NET.Test.Sdk=15.9.0"
"xunit=2.4.1"
"xunit.runner.visualstudio=2.4.1"
)
add_dependencies(test_messages ${PROJECT_NAME}_assemblies ${_target_name})

install_dotnet(test_messages DESTINATION lib/${PROJECT_NAME}/dotnet )

endif()

ament_package()
4 changes: 4 additions & 0 deletions rcldotnet/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@

<exec_depend>rcl</exec_depend>

<test_depend>std_msgs</test_depend>
<test_depend>test_msgs</test_depend>
<test_depend>builtin_interfaces</test_depend>

<export>
<build_type>ament_cmake</build_type>
</export>
Expand Down
85 changes: 85 additions & 0 deletions rcldotnet/test/test_messages.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
using System;
using System.Reflection;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Threading;

using ROS2;
using ROS2.Utils;

using Xunit;

namespace RCLdotnetTests
{
public class TestMessages
{
[Fact]
public void TestPublishString()
{
RCLdotnet.Init ();
INode node_string_1 = RCLdotnet.CreateNode ("test_string_1");
INode node_string_2 = RCLdotnet.CreateNode ("test_string_2");
IPublisher<std_msgs.msg.String> chatter_pub = node_string_1.CreatePublisher<std_msgs.msg.String> ("topic_string");

std_msgs.msg.String msg = new std_msgs.msg.String ();
std_msgs.msg.String msg2 = new std_msgs.msg.String ();
msg.Data = "Hello";

bool received=false;
ISubscription<std_msgs.msg.String> chatter_sub = node_string_1.CreateSubscription<std_msgs.msg.String> (
"topic_string", rcv_msg =>
{
received=true;
msg2 = rcv_msg;
}
);

while(!received)
{
chatter_pub.Publish (msg);

RCLdotnet.SpinOnce(node_string_1, 500);
RCLdotnet.SpinOnce(node_string_1, 500);
}
Assert.Equal("Hello", msg2.Data);
}

[Fact]
public void TestPublishBuiltins()
{
RCLdotnet.Init ();
INode node_builtins_1 = RCLdotnet.CreateNode ("test_builtins_1");
INode node_builtins_2 = RCLdotnet.CreateNode ("test_builtins_2");
IPublisher<test_msgs.msg.Builtins> chatter_pub = node_builtins_1.CreatePublisher<test_msgs.msg.Builtins> ("topic_builtins");

test_msgs.msg.Builtins msg = new test_msgs.msg.Builtins ();
test_msgs.msg.Builtins msg2 = new test_msgs.msg.Builtins ();
msg.Duration_value.Sec = 1;
msg.Duration_value.Nanosec = 2u;
msg.Time_value.Sec = 3;
msg.Time_value.Nanosec = 4u;

bool received=false;
ISubscription<test_msgs.msg.Builtins> chatter_sub = node_builtins_1.CreateSubscription<test_msgs.msg.Builtins> (
"topic_builtins", rcv_msg =>
{
received=true;
msg2 = rcv_msg;
}
);

while(!received)
{
chatter_pub.Publish (msg);

RCLdotnet.SpinOnce(node_builtins_1, 500);
RCLdotnet.SpinOnce(node_builtins_1, 500);
}

Assert.Equal(1, msg2.Duration_value.Sec);
Assert.Equal(2u, msg2.Duration_value.Nanosec);
Assert.Equal(3, msg2.Time_value.Sec);
Assert.Equal(4u, msg2.Time_value.Nanosec);
}
}
}
37 changes: 0 additions & 37 deletions rosidl_generator_dotnet/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,43 +19,6 @@ if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
ament_lint_auto_find_test_dependencies()

set(message_files
"msg/Bool.msg"
"msg/Byte.msg"
"msg/Char.msg"
"msg/Constants.msg"
"msg/Empty.msg"
"msg/Float32.msg"
"msg/Float64.msg"
"msg/Int16.msg"
"msg/Int32.msg"
"msg/Int64.msg"
"msg/Int8.msg"
"msg/Nested.msg"
"msg/Primitives.msg"
"msg/Strings.msg"
"msg/Uint16.msg"
"msg/Uint32.msg"
"msg/Uint64.msg"
"msg/Uint8.msg"
"msg/Various.msg"
)

include(cmake/register_dotnet.cmake)
include(cmake/rosidl_generator_dotnet_get_typesupports.cmake)

set(rosidl_generator_dotnet_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

rosidl_generator_dotnet_extras(
"${CMAKE_CURRENT_SOURCE_DIR}/bin/rosidl_generator_dotnet"
"${CMAKE_CURRENT_SOURCE_DIR}/rosidl_generator_dotnet/__init__.py"
"${CMAKE_CURRENT_SOURCE_DIR}/resource"
)

rosidl_generate_interfaces(${PROJECT_NAME} ${message_files}
SKIP_INSTALL
)

endif()

install(
Expand Down
1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Bool.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Byte.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Char.msg

This file was deleted.

3 changes: 0 additions & 3 deletions rosidl_generator_dotnet/msg/Constants.msg

This file was deleted.

Empty file.
1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Float32.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Float64.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Int16.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Int32.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Int64.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Int8.msg

This file was deleted.

6 changes: 0 additions & 6 deletions rosidl_generator_dotnet/msg/Nested.msg

This file was deleted.

18 changes: 0 additions & 18 deletions rosidl_generator_dotnet/msg/Primitives.msg

This file was deleted.

4 changes: 0 additions & 4 deletions rosidl_generator_dotnet/msg/Strings.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Uint16.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Uint32.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Uint64.msg

This file was deleted.

1 change: 0 additions & 1 deletion rosidl_generator_dotnet/msg/Uint8.msg

This file was deleted.

27 changes: 0 additions & 27 deletions rosidl_generator_dotnet/msg/Various.msg

This file was deleted.

19 changes: 4 additions & 15 deletions rosidl_generator_dotnet/resource/msg.c.em
Original file line number Diff line number Diff line change
Expand Up @@ -60,20 +60,6 @@ const void * @(msg_typename)__get_typesupport() {
return ros_message->@(member.name);
@[ end if]@
}
@[ else]@
// TODO: Nested types are not supported
@[ end if]@
@[end for]@


@[for member in message.structure.members]@
@[ if isinstance(member.type, Array)]@
// TODO: Array types are not supported
@[ elif isinstance(member.type, AbstractSequence)]@
// TODO: Sequence types are not supported
@[ elif isinstance(member.type, AbstractWString)]@
// TODO: Unicode types are not supported
@[ elif isinstance(member.type, BasicType) or isinstance(member.type, AbstractString)]@
void @(msg_typename)__write_field_@(member.name)(void * message_handle, @(msg_type_to_c(member.type)) value) {
@(msg_typename) * ros_message = (@(msg_typename) *)message_handle;
@[ if isinstance(member.type, AbstractGenericString)]@
Expand All @@ -84,7 +70,10 @@ void @(msg_typename)__write_field_@(member.name)(void * message_handle, @(msg_ty
@[ end if]@
}
@[ else]@
// TODO: Nested types are not supported
void * @(msg_typename)__get_field_@(member.name)_HANDLE(void * message_handle) {
@(msg_typename) * ros_message = (@(msg_typename) *)message_handle;
return &(ros_message->@(member.name));
}
@[ end if]@
@[end for]@

Expand Down
38 changes: 30 additions & 8 deletions rosidl_generator_dotnet/resource/msg.cs.em
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,23 @@ namespace @(ns)
public class @(type_name) : IMessage {
private static readonly DllLoadUtils dllLoadUtils;

public @(type_name)() {}
public @(type_name)()
{
@[for member in message.structure.members]@
@[ if isinstance(member.type, Array)]@
// TODO: Array types are not supported
@[ elif isinstance(member.type, AbstractSequence)]@
// TODO: Sequence types are not supported
@[ elif isinstance(member.type, AbstractWString)]@
// TODO: Unicode types are not supported
@[ elif isinstance(member.type, BasicType)]@
@[ elif isinstance(member.type, AbstractString)]@
@(get_field_name(type_name, member.name)) = "";
@[ else]@
@(get_field_name(type_name, member.name)) = new @(get_dotnet_type(member.type))();
@[ end if]@
@[end for]@
}

static @(type_name)()
{
Expand Down Expand Up @@ -72,7 +88,12 @@ public class @(type_name) : IMessage {
(NativeWriteField@(get_field_name(type_name, member.name))Type)Marshal.GetDelegateForFunctionPointer(
native_write_field_@(member.name)_ptr, typeof(NativeWriteField@(get_field_name(type_name, member.name))Type));
@[ else]@
// TODO: Nested types are not supported
IntPtr native_get_field_@(member.name)_HANDLE_ptr =
dllLoadUtils.GetProcAddress(nativelibrary, "@(msg_typename)__get_field_@(member.name)_HANDLE");

@(type_name).native_get_field_@(member.name)_HANDLE =
(NativeGetField@(get_field_name(type_name, member.name))Type)Marshal.GetDelegateForFunctionPointer(
native_get_field_@(member.name)_HANDLE_ptr, typeof(NativeGetField@(get_field_name(type_name, member.name))Type));
@[ end if]@
@[end for]@
}
Expand Down Expand Up @@ -120,7 +141,10 @@ public class @(type_name) : IMessage {

private static NativeWriteField@(get_field_name(type_name, member.name))Type native_write_field_@(member.name) = null;
@[ else]@
// TODO: Nested types are not supported
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
private delegate IntPtr NativeGetField@(get_field_name(type_name, member.name))Type(IntPtr messageHandle);

private static NativeGetField@(get_field_name(type_name, member.name))Type native_get_field_@(member.name)_HANDLE = null;
@[ end if]@
@[end for]@

Expand Down Expand Up @@ -148,7 +172,7 @@ public class @(type_name) : IMessage {
@(get_field_name(type_name, member.name)) = native_read_field_@(member.name)(messageHandle);
@[ end if]@
@[ else]@
// TODO: Nested types are not supported
@(get_field_name(type_name, member.name))._READ_HANDLE(native_get_field_@(member.name)_HANDLE(messageHandle));
@[ end if]@
@[end for]@
}
Expand All @@ -164,7 +188,7 @@ public class @(type_name) : IMessage {
@[ elif isinstance(member.type, BasicType) or isinstance(member.type, AbstractString)]@
native_write_field_@(member.name)(messageHandle, @(get_field_name(type_name, member.name)));
@[ else]@
// TODO: Nested types are not supported
@(get_field_name(type_name, member.name))._WRITE_HANDLE(native_get_field_@(member.name)_HANDLE(messageHandle));
@[ end if]@
@[end for]@
}
Expand All @@ -185,10 +209,8 @@ public class @(type_name) : IMessage {
// TODO: Sequence types are not supported
@[ elif isinstance(member.type, AbstractWString)]@
// TODO: Unicode types are not supported
@[ elif isinstance(member.type, BasicType) or isinstance(member.type, AbstractString)]@
public @(get_dotnet_type(member.type)) @(get_field_name(type_name, member.name)) { get; set; }
@[ else]@
// TODO: Nested types are not supported
public @(get_dotnet_type(member.type)) @(get_field_name(type_name, member.name)) { get; set; }
@[ end if]@
@[end for]@
}
Expand Down
4 changes: 3 additions & 1 deletion rosidl_generator_dotnet/resource/msg.h.em
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,9 @@ void @(msg_prefix)_CDECL @(msg_typename)__destroy_native_message(void *);

@(msg_prefix)_EXPORT
void @(msg_typename)__write_field_@(member.name)(void *, @(msg_type_to_c(member.type)));

@[ else]@
@(msg_prefix)_EXPORT
void * @(msg_prefix)_CDECL @(msg_typename)__get_field_@(member.name)_HANDLE(void *);
@[ end if]@
@[end for]@

Expand Down
2 changes: 2 additions & 0 deletions rosidl_generator_dotnet/rosidl_generator_dotnet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ def get_builtin_dotnet_type(type_, use_primitives=True):
def get_dotnet_type(type_, use_primitives=True):
if isinstance(type_, AbstractGenericString):
return 'System.String'
if isinstance(type_, NamespacedType):
return '.'.join(type_.namespaced_name())

return get_builtin_dotnet_type(type_.typename, use_primitives=use_primitives)

Expand Down

0 comments on commit 4043f2f

Please sign in to comment.