Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for nested types #54

Merged
merged 7 commits into from
Apr 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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]@
fmrico marked this conversation as resolved.
Show resolved Hide resolved
}
@[ 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