Skip to content

Commit

Permalink
Using safer typing and improving style
Browse files Browse the repository at this point in the history
  • Loading branch information
alectutin-qut authored and hoffmann-stefan committed Jul 29, 2024
1 parent f74b787 commit 2f53181
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 18 deletions.
4 changes: 2 additions & 2 deletions rcldotnet/ParameterHandling/ParameterDelegates.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ internal static class ParameterDelegates
internal static NativeRCLDestroyRclParamsType native_rcl_destroy_rcl_params = null;

[UnmanagedFunctionPointer(CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal delegate bool NativeRCLTrGetParameterType(SafeHandle parameterValueHandle, SafeRclParamsHandle paramsHandle, SafeNodeHandle nodeHandle, [MarshalAs(UnmanagedType.LPStr)] string name);
internal delegate int NativeRCLTryGetParameterType(SafeHandle parameterValueHandle, SafeRclParamsHandle paramsHandle, SafeNodeHandle nodeHandle, [MarshalAs(UnmanagedType.LPStr)] string name);

internal static NativeRCLTrGetParameterType native_rcl_try_get_parameter = null;
internal static NativeRCLTryGetParameterType native_rcl_try_get_parameter = null;

static ParameterDelegates()
{
Expand Down
2 changes: 1 addition & 1 deletion rcldotnet/ParameterHandling/ParameterHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ private bool TryGetParameterOverride(string name, ref ParameterValue parameterOv
using (SafeHandle messageHandle = MessageStaticMemberCache<ParameterValue>.CreateMessageHandle())
{
RCLdotnet.WriteToMessageHandle(parameterOverride, messageHandle);
overrideExists = ParameterDelegates.native_rcl_try_get_parameter(messageHandle, RCLdotnet.GlobalParameterOverrideHandle, _node.Handle, name);
overrideExists = ParameterDelegates.native_rcl_try_get_parameter(messageHandle, RCLdotnet.GlobalParameterOverrideHandle, _node.Handle, name) != 0;
RCLdotnet.ReadFromMessageHandle(parameterOverride, messageHandle);
}

Expand Down
30 changes: 16 additions & 14 deletions rcldotnet/rcldotnet_params.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ void native_rcl_destroy_rcl_params(void *rcl_params) {
rcl_yaml_node_struct_fini((rcl_params_t *)rcl_params);
}

void copy_to_rosidl_runtime_c__String(rosidl_runtime_c__String *dest, const char * src) {
void rcldotnet_params_copy_to_rosidl_runtime_c__String(rosidl_runtime_c__String *dest, const char * src) {
size_t length = strlen(src);
size_t capacity = sizeof(char) * (length + 1);
dest->size = length;
Expand All @@ -52,7 +52,7 @@ void copy_to_rosidl_runtime_c__String(rosidl_runtime_c__String *dest, const char
memcpy(dest->data, src, capacity);
}

void copy_yaml_array_to_parameter_array(rosidl_runtime_c__void__Sequence *dest, const rcl_void_array_t *src, size_t element_size) {
void rcldotnet_params_copy_yaml_array_to_parameter_array(rosidl_runtime_c__void__Sequence *dest, const rcl_void_array_t *src, size_t element_size) {
size_t length = src->size;
size_t length_bytes = length * element_size;
dest->size = length;
Expand All @@ -69,7 +69,7 @@ void copy_yaml_array_to_parameter_array(rosidl_runtime_c__void__Sequence *dest,
memcpy(dest->data, src->values, length_bytes);
}

void copy_yaml_string_array_to_parameter_string_array(rosidl_runtime_c__String__Sequence *dest, rcutils_string_array_t *src) {
void rcldotnet_params_copy_yaml_string_array_to_parameter_string_array(rosidl_runtime_c__String__Sequence *dest, rcutils_string_array_t *src) {
size_t length = src->size;

if (dest->capacity != length) {
Expand All @@ -96,11 +96,11 @@ void copy_yaml_string_array_to_parameter_string_array(rosidl_runtime_c__String__

for (int i = 0; i < length; i++) {
rosidl_runtime_c__String *dest_element = &dest->data[i];
copy_to_rosidl_runtime_c__String(&(dest->data[i]), src->data[i]);
rcldotnet_params_copy_to_rosidl_runtime_c__String(&(dest->data[i]), src->data[i]);
}
}

bool try_get_parameter_from_node_params(const rcl_node_params_t *node_params, const char *name, rcl_interfaces__msg__ParameterValue *param_value) {
bool rcldotnet_params_try_get_parameter_from_node_params(const rcl_node_params_t *node_params, const char *name, rcl_interfaces__msg__ParameterValue *param_value) {
int param_index = 0;
for (; param_index < node_params->num_params; param_index++) {
if (strcmp(name, node_params->parameter_names[param_index]) == 0) {
Expand All @@ -125,28 +125,30 @@ bool try_get_parameter_from_node_params(const rcl_node_params_t *node_params, co
param_value->double_value = *rcl_param_value->double_value;
break;
case rcl_interfaces__msg__ParameterType__PARAMETER_STRING:
copy_to_rosidl_runtime_c__String(&param_value->string_value, rcl_param_value->string_value);
rcldotnet_params_copy_to_rosidl_runtime_c__String(&param_value->string_value, rcl_param_value->string_value);
break;
case rcl_interfaces__msg__ParameterType__PARAMETER_BYTE_ARRAY:
// Byte array parameter loading from YAML not implemented in RCL.
//copy_yaml_array_to_parameter_array((rosidl_runtime_c__void__Sequence *)&param_value->byte_array_value, (rcl_void_array_t *)rcl_param_value->byte_array_value, sizeof(char));
//rcldotnet_params_copy_yaml_array_to_parameter_array((rosidl_runtime_c__void__Sequence *)&param_value->byte_array_value, (rcl_void_array_t *)rcl_param_value->byte_array_value, sizeof(char));
break;
case rcl_interfaces__msg__ParameterType__PARAMETER_BOOL_ARRAY:
copy_yaml_array_to_parameter_array((rosidl_runtime_c__void__Sequence *)&param_value->bool_array_value, (rcl_void_array_t *)rcl_param_value->bool_array_value, sizeof(bool));
rcldotnet_params_copy_yaml_array_to_parameter_array((rosidl_runtime_c__void__Sequence *)&param_value->bool_array_value, (rcl_void_array_t *)rcl_param_value->bool_array_value, sizeof(bool));
break;
case rcl_interfaces__msg__ParameterType__PARAMETER_INTEGER_ARRAY:
copy_yaml_array_to_parameter_array((rosidl_runtime_c__void__Sequence *)&param_value->integer_array_value, (rcl_void_array_t *)rcl_param_value->integer_array_value, sizeof(int64_t));
rcldotnet_params_copy_yaml_array_to_parameter_array((rosidl_runtime_c__void__Sequence *)&param_value->integer_array_value, (rcl_void_array_t *)rcl_param_value->integer_array_value, sizeof(int64_t));
break;
case rcl_interfaces__msg__ParameterType__PARAMETER_DOUBLE_ARRAY:
copy_yaml_array_to_parameter_array((rosidl_runtime_c__void__Sequence *)&param_value->double_array_value, (rcl_void_array_t *)rcl_param_value->double_array_value, sizeof(double));
rcldotnet_params_copy_yaml_array_to_parameter_array((rosidl_runtime_c__void__Sequence *)&param_value->double_array_value, (rcl_void_array_t *)rcl_param_value->double_array_value, sizeof(double));
break;
case rcl_interfaces__msg__ParameterType__PARAMETER_STRING_ARRAY:
copy_yaml_string_array_to_parameter_string_array(&param_value->string_array_value, rcl_param_value->string_array_value);
rcldotnet_params_copy_yaml_string_array_to_parameter_string_array(&param_value->string_array_value, rcl_param_value->string_array_value);
break;
}

return true;
}

bool native_rcl_try_get_parameter(void *param_value_handle, const void *params_handle, const void *node_handle, const char *name) {
int32_t /* bool */ native_rcl_try_get_parameter(void *param_value_handle, const void *params_handle, const void *node_handle, const char *name) {
if (params_handle == NULL) return false;

rcl_interfaces__msg__ParameterValue *param_value = (rcl_interfaces__msg__ParameterValue *)param_value_handle;
Expand All @@ -157,7 +159,7 @@ bool native_rcl_try_get_parameter(void *param_value_handle, const void *params_h
// First check if there is an override which matches the fully qualified node name.
for (int i = 0; i < rcl_params->num_nodes; i++) {
if (strcmp(node_name, rcl_params->node_names[i]) == 0) {
if (try_get_parameter_from_node_params(&rcl_params->params[i], name, param_value)) {
if (rcldotnet_params_try_get_parameter_from_node_params(&rcl_params->params[i], name, param_value)) {
return true;
}
}
Expand All @@ -166,7 +168,7 @@ bool native_rcl_try_get_parameter(void *param_value_handle, const void *params_h
// Then check if there is a global override.
for (int i = 0; i < rcl_params->num_nodes; i++) {
if (strcmp("/**", rcl_params->node_names[i]) == 0) {
if (try_get_parameter_from_node_params(&rcl_params->params[i], name, param_value)) {
if (rcldotnet_params_try_get_parameter_from_node_params(&rcl_params->params[i], name, param_value)) {
return true;
}
}
Expand Down
2 changes: 1 addition & 1 deletion rcldotnet/rcldotnet_params.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ RCLDOTNET_EXPORT
void RCLDOTNET_CDECL native_rcl_destroy_rcl_params(void *rcl_params);

RCLDOTNET_EXPORT
bool RCLDOTNET_CDECL native_rcl_try_get_parameter(void *param_value_handle, const void *params_handle, const void *node_handle, const char *name);
int32_t /* bool */ RCLDOTNET_CDECL native_rcl_try_get_parameter(void *param_value_handle, const void *params_handle, const void *node_handle, const char *name);

#endif // RCLDOTNET_PARAMS_H

0 comments on commit 2f53181

Please sign in to comment.