From 856c1f7c1722102f1267c567082bf5e72bf5509f Mon Sep 17 00:00:00 2001 From: Francisco Martin Rico Date: Mon, 30 Mar 2020 08:52:04 +0200 Subject: [PATCH 1/5] Support for nested types Signed-off-by: Francisco Martin Rico --- rosidl_generator_dotnet/resource/msg.c.em | 5 ++- rosidl_generator_dotnet/resource/msg.cs.em | 36 ++++++++++++++++++---- rosidl_generator_dotnet/resource/msg.h.em | 4 ++- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/rosidl_generator_dotnet/resource/msg.c.em b/rosidl_generator_dotnet/resource/msg.c.em index d5644ba9..e6ccddd7 100644 --- a/rosidl_generator_dotnet/resource/msg.c.em +++ b/rosidl_generator_dotnet/resource/msg.c.em @@ -84,7 +84,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)__native_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]@ diff --git a/rosidl_generator_dotnet/resource/msg.cs.em b/rosidl_generator_dotnet/resource/msg.cs.em index f8f04c2a..cfa27355 100644 --- a/rosidl_generator_dotnet/resource/msg.cs.em +++ b/rosidl_generator_dotnet/resource/msg.cs.em @@ -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 @(member.type.namespaces[0]).@(member.type.namespaces[1]).@(member.type.name)(); +@[ end if]@ +@[end for]@ + } static @(type_name)() { @@ -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)__native_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]@ } @@ -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]@ @@ -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]@ } @@ -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]@ } @@ -188,7 +212,7 @@ public class @(type_name) : IMessage { @[ 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 @(member.type.namespaces[0]).@(member.type.namespaces[1]).@(member.type.name) @(get_field_name(type_name, member.name)) { get; set; } @[ end if]@ @[end for]@ } diff --git a/rosidl_generator_dotnet/resource/msg.h.em b/rosidl_generator_dotnet/resource/msg.h.em index 08badcc6..1bbd5a0a 100644 --- a/rosidl_generator_dotnet/resource/msg.h.em +++ b/rosidl_generator_dotnet/resource/msg.h.em @@ -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)__native_get_field_@(member.name)_HANDLE(void *); @[ end if]@ @[end for]@ From b253af8bf79c2e9e131f3fd966200a91b568e706 Mon Sep 17 00:00:00 2001 From: Francisco Martin Rico Date: Mon, 30 Mar 2020 20:45:40 +0200 Subject: [PATCH 2/5] Add tests with XUnit Signed-off-by: Francisco Martin Rico --- rcldotnet/CMakeLists.txt | 27 +++++++ rcldotnet/package.xml | 4 + rcldotnet/test/test_messages.cs | 85 ++++++++++++++++++++++ rosidl_generator_dotnet/CMakeLists.txt | 37 ---------- rosidl_generator_dotnet/msg/Bool.msg | 1 - rosidl_generator_dotnet/msg/Byte.msg | 1 - rosidl_generator_dotnet/msg/Char.msg | 1 - rosidl_generator_dotnet/msg/Constants.msg | 3 - rosidl_generator_dotnet/msg/Empty.msg | 0 rosidl_generator_dotnet/msg/Float32.msg | 1 - rosidl_generator_dotnet/msg/Float64.msg | 1 - rosidl_generator_dotnet/msg/Int16.msg | 1 - rosidl_generator_dotnet/msg/Int32.msg | 1 - rosidl_generator_dotnet/msg/Int64.msg | 1 - rosidl_generator_dotnet/msg/Int8.msg | 1 - rosidl_generator_dotnet/msg/Nested.msg | 6 -- rosidl_generator_dotnet/msg/Primitives.msg | 18 ----- rosidl_generator_dotnet/msg/Strings.msg | 4 - rosidl_generator_dotnet/msg/Uint16.msg | 1 - rosidl_generator_dotnet/msg/Uint32.msg | 1 - rosidl_generator_dotnet/msg/Uint64.msg | 1 - rosidl_generator_dotnet/msg/Uint8.msg | 1 - rosidl_generator_dotnet/msg/Various.msg | 27 ------- 23 files changed, 116 insertions(+), 108 deletions(-) create mode 100644 rcldotnet/test/test_messages.cs delete mode 100644 rosidl_generator_dotnet/msg/Bool.msg delete mode 100644 rosidl_generator_dotnet/msg/Byte.msg delete mode 100644 rosidl_generator_dotnet/msg/Char.msg delete mode 100644 rosidl_generator_dotnet/msg/Constants.msg delete mode 100644 rosidl_generator_dotnet/msg/Empty.msg delete mode 100644 rosidl_generator_dotnet/msg/Float32.msg delete mode 100644 rosidl_generator_dotnet/msg/Float64.msg delete mode 100644 rosidl_generator_dotnet/msg/Int16.msg delete mode 100644 rosidl_generator_dotnet/msg/Int32.msg delete mode 100644 rosidl_generator_dotnet/msg/Int64.msg delete mode 100644 rosidl_generator_dotnet/msg/Int8.msg delete mode 100644 rosidl_generator_dotnet/msg/Nested.msg delete mode 100644 rosidl_generator_dotnet/msg/Primitives.msg delete mode 100644 rosidl_generator_dotnet/msg/Strings.msg delete mode 100644 rosidl_generator_dotnet/msg/Uint16.msg delete mode 100644 rosidl_generator_dotnet/msg/Uint32.msg delete mode 100644 rosidl_generator_dotnet/msg/Uint64.msg delete mode 100644 rosidl_generator_dotnet/msg/Uint8.msg delete mode 100644 rosidl_generator_dotnet/msg/Various.msg diff --git a/rcldotnet/CMakeLists.txt b/rcldotnet/CMakeLists.txt index 15a1e572..30b01cc6 100644 --- a/rcldotnet/CMakeLists.txt +++ b/rcldotnet/CMakeLists.txt @@ -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() diff --git a/rcldotnet/package.xml b/rcldotnet/package.xml index 0142eeb0..5aa04a4b 100644 --- a/rcldotnet/package.xml +++ b/rcldotnet/package.xml @@ -23,6 +23,10 @@ rcl + std_msgs + test_msgs + builtin_interfaces + ament_cmake diff --git a/rcldotnet/test/test_messages.cs b/rcldotnet/test/test_messages.cs new file mode 100644 index 00000000..35e63bd5 --- /dev/null +++ b/rcldotnet/test/test_messages.cs @@ -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 chatter_pub = node_string_1.CreatePublisher ("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 chatter_sub = node_string_1.CreateSubscription ( + "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 chatter_pub = node_builtins_1.CreatePublisher ("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 chatter_sub = node_builtins_1.CreateSubscription ( + "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); + } + } +} \ No newline at end of file diff --git a/rosidl_generator_dotnet/CMakeLists.txt b/rosidl_generator_dotnet/CMakeLists.txt index af9864f9..ac18f770 100644 --- a/rosidl_generator_dotnet/CMakeLists.txt +++ b/rosidl_generator_dotnet/CMakeLists.txt @@ -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( diff --git a/rosidl_generator_dotnet/msg/Bool.msg b/rosidl_generator_dotnet/msg/Bool.msg deleted file mode 100644 index b1578abb..00000000 --- a/rosidl_generator_dotnet/msg/Bool.msg +++ /dev/null @@ -1 +0,0 @@ -bool empty_bool diff --git a/rosidl_generator_dotnet/msg/Byte.msg b/rosidl_generator_dotnet/msg/Byte.msg deleted file mode 100644 index 2e6fa040..00000000 --- a/rosidl_generator_dotnet/msg/Byte.msg +++ /dev/null @@ -1 +0,0 @@ -byte empty_byte diff --git a/rosidl_generator_dotnet/msg/Char.msg b/rosidl_generator_dotnet/msg/Char.msg deleted file mode 100644 index 0f2e0c90..00000000 --- a/rosidl_generator_dotnet/msg/Char.msg +++ /dev/null @@ -1 +0,0 @@ -char empty_char diff --git a/rosidl_generator_dotnet/msg/Constants.msg b/rosidl_generator_dotnet/msg/Constants.msg deleted file mode 100644 index 4525694d..00000000 --- a/rosidl_generator_dotnet/msg/Constants.msg +++ /dev/null @@ -1,3 +0,0 @@ -int32 X=123 -int32 Y=-123 -string FOO=foo diff --git a/rosidl_generator_dotnet/msg/Empty.msg b/rosidl_generator_dotnet/msg/Empty.msg deleted file mode 100644 index e69de29b..00000000 diff --git a/rosidl_generator_dotnet/msg/Float32.msg b/rosidl_generator_dotnet/msg/Float32.msg deleted file mode 100644 index a8bb0cb6..00000000 --- a/rosidl_generator_dotnet/msg/Float32.msg +++ /dev/null @@ -1 +0,0 @@ -float32 empty_float32 diff --git a/rosidl_generator_dotnet/msg/Float64.msg b/rosidl_generator_dotnet/msg/Float64.msg deleted file mode 100644 index d6efd991..00000000 --- a/rosidl_generator_dotnet/msg/Float64.msg +++ /dev/null @@ -1 +0,0 @@ -float64 empty_float64 diff --git a/rosidl_generator_dotnet/msg/Int16.msg b/rosidl_generator_dotnet/msg/Int16.msg deleted file mode 100644 index 14426ca1..00000000 --- a/rosidl_generator_dotnet/msg/Int16.msg +++ /dev/null @@ -1 +0,0 @@ -int16 empty_int16 diff --git a/rosidl_generator_dotnet/msg/Int32.msg b/rosidl_generator_dotnet/msg/Int32.msg deleted file mode 100644 index 51c88f0e..00000000 --- a/rosidl_generator_dotnet/msg/Int32.msg +++ /dev/null @@ -1 +0,0 @@ -int32 empty_int32 diff --git a/rosidl_generator_dotnet/msg/Int64.msg b/rosidl_generator_dotnet/msg/Int64.msg deleted file mode 100644 index 75a1c238..00000000 --- a/rosidl_generator_dotnet/msg/Int64.msg +++ /dev/null @@ -1 +0,0 @@ -int64 empty_int64 diff --git a/rosidl_generator_dotnet/msg/Int8.msg b/rosidl_generator_dotnet/msg/Int8.msg deleted file mode 100644 index 76167eb9..00000000 --- a/rosidl_generator_dotnet/msg/Int8.msg +++ /dev/null @@ -1 +0,0 @@ -int8 empty_int8 diff --git a/rosidl_generator_dotnet/msg/Nested.msg b/rosidl_generator_dotnet/msg/Nested.msg deleted file mode 100644 index 86b7f463..00000000 --- a/rosidl_generator_dotnet/msg/Nested.msg +++ /dev/null @@ -1,6 +0,0 @@ -uint8 ANSWER=42 - -Primitives primitives -Primitives[2] two_primitives -#Primitives[<=3] up_to_three_primitives -Primitives[] unbounded_primitives diff --git a/rosidl_generator_dotnet/msg/Primitives.msg b/rosidl_generator_dotnet/msg/Primitives.msg deleted file mode 100644 index 88b84527..00000000 --- a/rosidl_generator_dotnet/msg/Primitives.msg +++ /dev/null @@ -1,18 +0,0 @@ -bool bool_value true -byte byte_value -char char_value -float32 float32_value 3.14159 -float64 float64_value -int8 int8_value -5 -uint8 uint8_value 23 -int16 int16_value -uint16 uint16_value -int32 int32_value -uint32 uint32_value -int64 int64_value -uint64 uint64_value -string string_value -string string_value_with_default 'default' -#string<=5[3] fixed_length_string_value -#string<=5[<=10] upper_bound_string_value -string unbound_string_value diff --git a/rosidl_generator_dotnet/msg/Strings.msg b/rosidl_generator_dotnet/msg/Strings.msg deleted file mode 100644 index f81e029b..00000000 --- a/rosidl_generator_dotnet/msg/Strings.msg +++ /dev/null @@ -1,4 +0,0 @@ -string empty_string -string def_string "Hello world!" -string<=22 ub_string -string<=22 ub_def_string "Upper bounded string." diff --git a/rosidl_generator_dotnet/msg/Uint16.msg b/rosidl_generator_dotnet/msg/Uint16.msg deleted file mode 100644 index 9dd741c4..00000000 --- a/rosidl_generator_dotnet/msg/Uint16.msg +++ /dev/null @@ -1 +0,0 @@ -uint16 empty_uint16 diff --git a/rosidl_generator_dotnet/msg/Uint32.msg b/rosidl_generator_dotnet/msg/Uint32.msg deleted file mode 100644 index cb65d083..00000000 --- a/rosidl_generator_dotnet/msg/Uint32.msg +++ /dev/null @@ -1 +0,0 @@ -uint32 empty_uint32 diff --git a/rosidl_generator_dotnet/msg/Uint64.msg b/rosidl_generator_dotnet/msg/Uint64.msg deleted file mode 100644 index 9e7c0f80..00000000 --- a/rosidl_generator_dotnet/msg/Uint64.msg +++ /dev/null @@ -1 +0,0 @@ -uint64 empty_uint64 diff --git a/rosidl_generator_dotnet/msg/Uint8.msg b/rosidl_generator_dotnet/msg/Uint8.msg deleted file mode 100644 index 6b0876e0..00000000 --- a/rosidl_generator_dotnet/msg/Uint8.msg +++ /dev/null @@ -1 +0,0 @@ -uint8 empty_uint8 diff --git a/rosidl_generator_dotnet/msg/Various.msg b/rosidl_generator_dotnet/msg/Various.msg deleted file mode 100644 index 300e5b1d..00000000 --- a/rosidl_generator_dotnet/msg/Various.msg +++ /dev/null @@ -1,27 +0,0 @@ -bool FOO=true -float32 BAR=3.14159 -uint16 BAZ=42 - -bool bool_value false -byte byte_value -char char_value -float32 float32_value 1.23 -float64 float64_value -int8 int8_value -5 -uint16[2] two_uint16_value [5, 23] -#int32[<=3] up_to_three_int32_values -#int32[<=3] up_to_three_int32_values_with_default_values [5, 23] -uint64[] unbounded_uint64_values - -#string[2] two_string_value ['foo', 'bar'] -#string[<=3] up_to_three_string_values -#uint64[] unbounded_string_values - -Empty empty -Empty[2] two_empty -Empty[] unbounded_empty - -Nested nested -Nested[2] two_nested -#Nested[<=3] up_to_three_nested -Nested[] unbounded_nested From d0f7fa5f2f01adcd8c602e2b60372b8362701c3f Mon Sep 17 00:00:00 2001 From: Sean Kelly Date: Sun, 26 Apr 2020 13:50:42 -0400 Subject: [PATCH 3/5] Extend get_dotnet_type to handle nested types --- rosidl_generator_dotnet/resource/msg.cs.em | 8 +++----- .../rosidl_generator_dotnet/__init__.py | 2 ++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rosidl_generator_dotnet/resource/msg.cs.em b/rosidl_generator_dotnet/resource/msg.cs.em index cfa27355..872e6dbf 100644 --- a/rosidl_generator_dotnet/resource/msg.cs.em +++ b/rosidl_generator_dotnet/resource/msg.cs.em @@ -43,7 +43,7 @@ public class @(type_name) : IMessage { @[ elif isinstance(member.type, AbstractString)]@ @(get_field_name(type_name, member.name)) = ""; @[ else]@ - @(get_field_name(type_name, member.name)) = new @(member.type.namespaces[0]).@(member.type.namespaces[1]).@(member.type.name)(); + @(get_field_name(type_name, member.name)) = new @(get_dotnet_type(member.type))(); @[ end if]@ @[end for]@ } @@ -90,7 +90,7 @@ public class @(type_name) : IMessage { @[ else]@ IntPtr native_get_field_@(member.name)_HANDLE_ptr = dllLoadUtils.GetProcAddress(nativelibrary, "@(msg_typename)__native_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)); @@ -209,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]@ - public @(member.type.namespaces[0]).@(member.type.namespaces[1]).@(member.type.name) @(get_field_name(type_name, member.name)) { get; set; } + public @(get_dotnet_type(member.type)) @(get_field_name(type_name, member.name)) { get; set; } @[ end if]@ @[end for]@ } diff --git a/rosidl_generator_dotnet/rosidl_generator_dotnet/__init__.py b/rosidl_generator_dotnet/rosidl_generator_dotnet/__init__.py index 10d97a9b..2332c3ca 100644 --- a/rosidl_generator_dotnet/rosidl_generator_dotnet/__init__.py +++ b/rosidl_generator_dotnet/rosidl_generator_dotnet/__init__.py @@ -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) From b050030a775c914e69368fa2e75ab6afcdb25b2c Mon Sep 17 00:00:00 2001 From: Francisco Martin Rico Date: Sun, 26 Apr 2020 20:27:51 +0200 Subject: [PATCH 4/5] Fix minor fixes Signed-off-by: Francisco Martin Rico --- rcldotnet/test/test_messages.cs | 4 ++-- rosidl_generator_dotnet/resource/msg.c.em | 16 +--------------- rosidl_generator_dotnet/resource/msg.cs.em | 2 +- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/rcldotnet/test/test_messages.cs b/rcldotnet/test/test_messages.cs index 35e63bd5..3d791682 100644 --- a/rcldotnet/test/test_messages.cs +++ b/rcldotnet/test/test_messages.cs @@ -32,7 +32,7 @@ public void TestPublishString() received=true; msg2 = rcv_msg; } - ); + ); while(!received) { @@ -66,7 +66,7 @@ public void TestPublishBuiltins() received=true; msg2 = rcv_msg; } - ); + ); while(!received) { diff --git a/rosidl_generator_dotnet/resource/msg.c.em b/rosidl_generator_dotnet/resource/msg.c.em index e6ccddd7..0fd1599e 100644 --- a/rosidl_generator_dotnet/resource/msg.c.em +++ b/rosidl_generator_dotnet/resource/msg.c.em @@ -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)]@ @@ -84,7 +70,7 @@ void @(msg_typename)__write_field_@(member.name)(void * message_handle, @(msg_ty @[ end if]@ } @[ else]@ -void * @(msg_typename)__native_get_field_@(member.name)_HANDLE(void * message_handle) { +void * @(msg_typename)__get_field_@(member.name)_HANDLE(void * message_handle) { @(msg_typename) * ros_message = (@(msg_typename) *)message_handle; return &(ros_message->@(member.name)); } diff --git a/rosidl_generator_dotnet/resource/msg.cs.em b/rosidl_generator_dotnet/resource/msg.cs.em index cfa27355..2d87741e 100644 --- a/rosidl_generator_dotnet/resource/msg.cs.em +++ b/rosidl_generator_dotnet/resource/msg.cs.em @@ -89,7 +89,7 @@ public class @(type_name) : IMessage { native_write_field_@(member.name)_ptr, typeof(NativeWriteField@(get_field_name(type_name, member.name))Type)); @[ else]@ IntPtr native_get_field_@(member.name)_HANDLE_ptr = - dllLoadUtils.GetProcAddress(nativelibrary, "@(msg_typename)__native_get_field_@(member.name)_HANDLE"); + 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( From 5b5ee8893ca00de6c233f65ca0260e2a9fa04368 Mon Sep 17 00:00:00 2001 From: Francisco Martin Rico Date: Sun, 26 Apr 2020 21:00:55 +0200 Subject: [PATCH 5/5] Remove __native in names Signed-off-by: Francisco Martin Rico --- rosidl_generator_dotnet/resource/msg.cs.em | 2 +- rosidl_generator_dotnet/resource/msg.h.em | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rosidl_generator_dotnet/resource/msg.cs.em b/rosidl_generator_dotnet/resource/msg.cs.em index 872e6dbf..230713d0 100644 --- a/rosidl_generator_dotnet/resource/msg.cs.em +++ b/rosidl_generator_dotnet/resource/msg.cs.em @@ -89,7 +89,7 @@ public class @(type_name) : IMessage { native_write_field_@(member.name)_ptr, typeof(NativeWriteField@(get_field_name(type_name, member.name))Type)); @[ else]@ IntPtr native_get_field_@(member.name)_HANDLE_ptr = - dllLoadUtils.GetProcAddress(nativelibrary, "@(msg_typename)__native_get_field_@(member.name)_HANDLE"); + 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( diff --git a/rosidl_generator_dotnet/resource/msg.h.em b/rosidl_generator_dotnet/resource/msg.h.em index 1bbd5a0a..dda48a00 100644 --- a/rosidl_generator_dotnet/resource/msg.h.em +++ b/rosidl_generator_dotnet/resource/msg.h.em @@ -57,9 +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]@ +@[ else]@ @(msg_prefix)_EXPORT -void * @(msg_prefix)_CDECL @(msg_typename)__native_get_field_@(member.name)_HANDLE(void *); +void * @(msg_prefix)_CDECL @(msg_typename)__get_field_@(member.name)_HANDLE(void *); @[ end if]@ @[end for]@