Skip to content

Commit 00e86f9

Browse files
committed
Add support for node parameters
1 parent eda5080 commit 00e86f9

File tree

2 files changed

+29
-22
lines changed

2 files changed

+29
-22
lines changed

rclrs/src/node/builder.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ impl NodeBuilder {
246246
err,
247247
s: self.namespace.clone(),
248248
})?;
249-
let node_options = self.create_node_options()?;
249+
let rcl_node_options = self.create_rcl_node_options()?;
250250
let rcl_context = &mut *self.context.lock();
251251

252252
// SAFETY: Getting a zero-initialized value is always safe.
@@ -261,14 +261,18 @@ impl NodeBuilder {
261261
node_name.as_ptr(),
262262
node_namespace.as_ptr(),
263263
rcl_context,
264-
&node_options,
264+
&rcl_node_options,
265265
)
266266
.ok()?;
267267
};
268268

269269
let _parameter_map = unsafe {
270270
let fqn = call_string_getter_with_handle(&rcl_node, rcl_node_get_fully_qualified_name);
271-
resolve_parameter_overrides(fqn, &rcl_context.global_arguments)?
271+
resolve_parameter_overrides(
272+
fqn,
273+
&rcl_node_options.arguments,
274+
&rcl_context.global_arguments,
275+
)?
272276
};
273277
let rcl_node_mtx = Arc::new(Mutex::new(rcl_node));
274278

@@ -280,15 +284,15 @@ impl NodeBuilder {
280284
})
281285
}
282286

283-
/// Creates node options.
287+
/// Creates a rcl_node_options_t struct from this builder.
284288
///
285289
/// Any fields not present in the builder will have their default value.
286290
/// For detail about default values, see [`NodeBuilder`][1] docs.
287291
///
288292
/// [1]: crate::NodeBuilder
289-
fn create_node_options(&self) -> Result<rcl_node_options_t, RclrsError> {
293+
fn create_rcl_node_options(&self) -> Result<rcl_node_options_t, RclrsError> {
290294
// SAFETY: No preconditions for this function.
291-
let mut node_options = unsafe { rcl_node_get_default_options() };
295+
let mut rcl_node_options = unsafe { rcl_node_get_default_options() };
292296

293297
let cstring_args = self
294298
.arguments
@@ -307,17 +311,17 @@ impl NodeBuilder {
307311
cstring_arg_ptrs.len() as i32,
308312
cstring_arg_ptrs.as_ptr(),
309313
rcutils_get_default_allocator(),
310-
&mut node_options.arguments,
314+
&mut rcl_node_options.arguments,
311315
)
312316
}
313317
.ok()?;
314318

315-
node_options.use_global_arguments = self.use_global_arguments;
316-
node_options.enable_rosout = self.enable_rosout;
319+
rcl_node_options.use_global_arguments = self.use_global_arguments;
320+
rcl_node_options.enable_rosout = self.enable_rosout;
317321
// SAFETY: No preconditions for this function.
318-
node_options.allocator = unsafe { rcutils_get_default_allocator() };
322+
rcl_node_options.allocator = unsafe { rcutils_get_default_allocator() };
319323

320-
Ok(node_options)
324+
Ok(rcl_node_options)
321325
}
322326
}
323327

rclrs/src/parameter/override_map.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -109,23 +109,26 @@ pub(crate) type ParameterOverrideMap = BTreeMap<String, ParameterValue>;
109109
/// sizes or dangling pointers.
110110
pub(crate) unsafe fn resolve_parameter_overrides(
111111
node_fqn: String,
112+
rcl_node_arguments: &rcl_arguments_t,
112113
rcl_global_arguments: &rcl_arguments_t,
113114
) -> Result<ParameterOverrideMap, RclrsError> {
114115
let mut map = BTreeMap::new();
115-
let mut rcl_params = std::ptr::null_mut();
116-
rcl_arguments_get_param_overrides(rcl_global_arguments, &mut rcl_params).ok()?;
117-
// Check for the /** node first, and later overwrite with the more specific node
118-
// parameters, if they exist
119-
for name_to_match in ["/**", node_fqn.as_str()] {
120-
for (node_name, node_params) in RclParamsIter::new(rcl_params) {
121-
if node_name == name_to_match {
122-
for (param_name, variant) in RclNodeParamsIter::new(node_params) {
123-
let value = ParameterValue::from_rcl_variant(variant);
124-
map.insert(param_name, value);
116+
for rcl_arguments in [rcl_global_arguments, rcl_node_arguments] {
117+
let mut rcl_params = std::ptr::null_mut();
118+
rcl_arguments_get_param_overrides(rcl_arguments, &mut rcl_params).ok()?;
119+
// Check for the /** node first, and later overwrite with the more specific node
120+
// parameters, if they exist
121+
for name_to_match in ["/**", node_fqn.as_str()] {
122+
for (node_name, node_params) in RclParamsIter::new(rcl_params) {
123+
if node_name == name_to_match {
124+
for (param_name, variant) in RclNodeParamsIter::new(node_params) {
125+
let value = ParameterValue::from_rcl_variant(variant);
126+
map.insert(param_name, value);
127+
}
125128
}
126129
}
127130
}
131+
rcl_yaml_node_struct_fini(rcl_params);
128132
}
129-
rcl_yaml_node_struct_fini(rcl_params);
130133
Ok(map)
131134
}

0 commit comments

Comments
 (0)