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

Implemented RCL global argument parsing. #121

Closed
wants to merge 3 commits into from
Closed
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
24 changes: 24 additions & 0 deletions rcldotnet/Node.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,14 @@ internal delegate RCLRet NativeRCLActionDestroyServerHandleType(

internal static NativeRCLActionDestroyServerHandleType native_rcl_action_destroy_server_handle = null;

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate string NativeRCLGetStringType(
SafeNodeHandle nodeHandle);

internal static NativeRCLGetStringType native_rcl_get_name_handle = null;

internal static NativeRCLGetStringType native_rcl_get_namespace_handle = null;

static NodeDelegates()
{
_dllLoadUtils = DllLoadUtilsFactory.GetDllLoadUtils();
Expand Down Expand Up @@ -182,6 +190,18 @@ static NodeDelegates()
NodeDelegates.native_rcl_action_destroy_server_handle =
(NativeRCLActionDestroyServerHandleType)Marshal.GetDelegateForFunctionPointer(
native_rcl_action_destroy_server_handle_ptr, typeof(NativeRCLActionDestroyServerHandleType));

IntPtr native_rcl_get_name_handle_ptr = _dllLoadUtils.GetProcAddress(
nativeLibrary, "native_rcl_get_name_handle");
NodeDelegates.native_rcl_get_name_handle =
(NativeRCLGetStringType)Marshal.GetDelegateForFunctionPointer(
native_rcl_get_name_handle_ptr, typeof(NativeRCLGetStringType));

IntPtr native_rcl_get_namespace_handle_ptr = _dllLoadUtils.GetProcAddress(
nativeLibrary, "native_rcl_get_namespace_handle");
NodeDelegates.native_rcl_get_namespace_handle =
(NativeRCLGetStringType)Marshal.GetDelegateForFunctionPointer(
native_rcl_get_namespace_handle_ptr, typeof(NativeRCLGetStringType));
}
}

Expand Down Expand Up @@ -440,5 +460,9 @@ private static CancelResponse DefaultCancelCallback(ActionServerGoalHandle goalH
{
return CancelResponse.Reject;
}

public string GetName() => NodeDelegates.native_rcl_get_name_handle(Handle);

public string GetNamespace() => NodeDelegates.native_rcl_get_namespace_handle(Handle);
}
}
6 changes: 4 additions & 2 deletions rcldotnet/RCLdotnet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ internal static class RCLdotnetDelegates
internal static readonly DllLoadUtils _dllLoadUtils;

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate RCLRet NativeRCLInitType();
internal delegate RCLRet NativeRCLInitType(
int argc, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] argv);

internal static NativeRCLInitType native_rcl_init = null;

Expand Down Expand Up @@ -1396,7 +1397,8 @@ public static void Init()
{
if (!initialized)
{
RCLRet ret = RCLdotnetDelegates.native_rcl_init();
string[] args = System.Environment.GetCommandLineArgs();
RCLRet ret = RCLdotnetDelegates.native_rcl_init(args.Length, args);
RCLExceptionHelper.CheckReturnValue(ret, $"{nameof(RCLdotnetDelegates.native_rcl_init)}() failed.");
initialized = true;
}
Expand Down
7 changes: 2 additions & 5 deletions rcldotnet/rcldotnet.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,15 @@
static rcl_context_t context;
static rcl_clock_t clock;

int32_t native_rcl_init() {
// TODO(esteve): parse args
int num_args = 0;
int32_t native_rcl_init(int argc, const char *argv[]) {
context = rcl_get_zero_initialized_context();
rcl_allocator_t allocator = rcl_get_default_allocator();
rcl_init_options_t init_options = rcl_get_zero_initialized_init_options();
rcl_ret_t ret = rcl_init_options_init(&init_options, allocator);
if (RCL_RET_OK != ret) {
return ret;
}
const char ** arg_values = NULL;
ret = rcl_init(num_args, arg_values, &init_options, &context);
ret = rcl_init(argc, argv, &init_options, &context);
if (ret != RCL_RET_OK) {
return ret;
}
Expand Down
2 changes: 1 addition & 1 deletion rcldotnet/rcldotnet.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#include "rcldotnet_macros.h"

RCLDOTNET_EXPORT
int32_t RCLDOTNET_CDECL native_rcl_init();
int32_t RCLDOTNET_CDECL native_rcl_init(int argc, const char *argv[]);

rcl_clock_t *native_rcl_get_default_clock();

Expand Down
22 changes: 22 additions & 0 deletions rcldotnet/rcldotnet_node.c
Original file line number Diff line number Diff line change
Expand Up @@ -240,3 +240,25 @@ int32_t native_rcl_action_destroy_server_handle(void *action_server_handle, void

return ret;
}

// Avoid problems caused by automatic free of the original string.
const char * get_str_cpy(const char * src) {
size_t size = strlen(src) + 1;

char *copy = (char *)malloc(size);
memcpy(copy, src, size);

return copy;
}

const char * native_rcl_get_name_handle(void *node_handle) {
rcl_node_t *node = (rcl_node_t *)node_handle;

return get_str_cpy(rcl_node_get_name(node));
}

const char * native_rcl_get_namespace_handle(void *node_handle) {
rcl_node_t *node = (rcl_node_t *)node_handle;

return get_str_cpy(rcl_node_get_namespace(node));
}
6 changes: 6 additions & 0 deletions rcldotnet/rcldotnet_node.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,10 @@ int32_t RCLDOTNET_CDECL native_rcl_action_create_server_handle(void **action_ser
RCLDOTNET_EXPORT
int32_t RCLDOTNET_CDECL native_rcl_action_destroy_server_handle(void *action_server_handle, void *node_handle);

RCLDOTNET_EXPORT
const char * RCLDOTNET_CDECL native_rcl_get_name_handle(void *node_handle);

RCLDOTNET_EXPORT
const char * RCLDOTNET_CDECL native_rcl_get_namespace_handle(void *node_handle);

#endif // RCLDOTNET_NODE_H