@@ -35,8 +35,8 @@ use crate::subscribers::*;
3535/// be called continously.
3636pub struct Node {
3737 context : Context ,
38- /// ROS parameter values .
39- pub params : Arc < Mutex < HashMap < String , ParameterValue > > > ,
38+ /// ROS parameters .
39+ pub params : Arc < Mutex < HashMap < String , Parameter > > > ,
4040 node_handle : Box < rcl_node_t > ,
4141 // the node owns the subscribers
4242 subscribers : Vec < Box < dyn Subscriber_ > > ,
@@ -146,7 +146,7 @@ impl Node {
146146 let s = unsafe { CStr :: from_ptr ( * s) } ;
147147 let key = s. to_str ( ) . unwrap_or ( "" ) ;
148148 let val = ParameterValue :: from_rcl ( v) ;
149- params. insert ( key. to_owned ( ) , val) ;
149+ params. insert ( key. to_owned ( ) , Parameter :: new ( val) ) ;
150150 }
151151 }
152152
@@ -243,7 +243,7 @@ impl Node {
243243 // register all parameters
244244 ps. lock ( )
245245 . unwrap ( )
246- . register_parameters ( "" , & mut self . params . lock ( ) . unwrap ( ) ) ?;
246+ . register_parameters ( "" , None , & mut self . params . lock ( ) . unwrap ( ) ) ?;
247247 }
248248 let mut handlers: Vec < std:: pin:: Pin < Box < dyn Future < Output = ( ) > + Send > > > = Vec :: new ( ) ;
249249 let ( mut event_tx, event_rx) = mpsc:: channel :: < ( String , ParameterValue ) > ( 10 ) ;
@@ -266,19 +266,31 @@ impl Node {
266266 . lock ( )
267267 . unwrap ( )
268268 . get ( & p. name )
269- . map ( |v| v != & val)
269+ . map ( |v| v. value != val)
270270 . unwrap_or ( true ) ; // changed=true if new
271271 let r = if let Some ( ps) = & params_struct_clone {
272+ // Update parameter structure
272273 let result = ps. lock ( ) . unwrap ( ) . set_parameter ( & p. name , & val) ;
273274 if result. is_ok ( ) {
274- params. lock ( ) . unwrap ( ) . insert ( p. name . clone ( ) , val. clone ( ) ) ;
275+ // Also update Node::params
276+ params
277+ . lock ( )
278+ . unwrap ( )
279+ . entry ( p. name . clone ( ) )
280+ . and_modify ( |p| p. value = val. clone ( ) ) ;
275281 }
276282 rcl_interfaces:: msg:: SetParametersResult {
277283 successful : result. is_ok ( ) ,
278284 reason : result. err ( ) . map_or ( "" . into ( ) , |e| e. to_string ( ) ) ,
279285 }
280286 } else {
281- params. lock ( ) . unwrap ( ) . insert ( p. name . clone ( ) , val. clone ( ) ) ;
287+ // No parameter structure - update only Node::params
288+ params
289+ . lock ( )
290+ . unwrap ( )
291+ . entry ( p. name . clone ( ) )
292+ . and_modify ( |p| p. value = val. clone ( ) )
293+ . or_insert ( Parameter :: new ( val. clone ( ) ) ) ;
282294 rcl_interfaces:: msg:: SetParametersResult {
283295 successful : true ,
284296 reason : "" . into ( ) ,
@@ -316,17 +328,17 @@ impl Node {
316328 . names
317329 . iter ( )
318330 . map ( |n| {
331+ // First try to get the parameter from the param structure
319332 if let Some ( ps) = & params_struct_clone {
320- ps. lock ( )
321- . unwrap ( )
322- . get_parameter ( & n)
323- . unwrap_or ( ParameterValue :: NotSet )
324- } else {
325- match params. get ( n) {
326- Some ( v) => v. clone ( ) ,
327- None => ParameterValue :: NotSet ,
333+ if let Ok ( value) = ps. lock ( ) . unwrap ( ) . get_parameter ( & n) {
334+ return value;
328335 }
329336 }
337+ // Otherwise get it from node HashMap
338+ match params. get ( n) {
339+ Some ( v) => v. value . clone ( ) ,
340+ None => ParameterValue :: NotSet ,
341+ }
330342 } )
331343 . map ( |v| v. into_parameter_value_msg ( ) )
332344 . collect :: < Vec < rcl_interfaces:: msg:: ParameterValue > > ( ) ;
@@ -384,7 +396,7 @@ impl Node {
384396 . names
385397 . iter ( )
386398 . map ( |name| match params. get ( name) {
387- Some ( pv ) => pv . into_parameter_type ( ) ,
399+ Some ( param ) => param . value . into_parameter_type ( ) ,
388400 None => rcl_interfaces:: msg:: ParameterType :: PARAMETER_NOT_SET as u8 ,
389401 } )
390402 . collect ( ) ;
@@ -402,7 +414,7 @@ impl Node {
402414
403415 fn handle_list_parameters (
404416 req : ServiceRequest < rcl_interfaces:: srv:: ListParameters :: Service > ,
405- params : & Arc < Mutex < HashMap < String , ParameterValue > > > ,
417+ params : & Arc < Mutex < HashMap < String , Parameter > > > ,
406418 ) -> future:: Ready < ( ) > {
407419 use rcl_interfaces:: srv:: ListParameters ;
408420
@@ -445,26 +457,21 @@ impl Node {
445457
446458 fn handle_desc_parameters (
447459 req : ServiceRequest < rcl_interfaces:: srv:: DescribeParameters :: Service > ,
448- params : & Arc < Mutex < HashMap < String , ParameterValue > > > ,
460+ params : & Arc < Mutex < HashMap < String , Parameter > > > ,
449461 ) -> future:: Ready < ( ) > {
450462 use rcl_interfaces:: msg:: ParameterDescriptor ;
451463 use rcl_interfaces:: srv:: DescribeParameters ;
452464 let mut descriptors = Vec :: < ParameterDescriptor > :: new ( ) ;
453465 let params = params. lock ( ) . unwrap ( ) ;
454466 for name in & req. message . names {
455- if let Some ( pv) = params. get ( name) {
456- descriptors. push ( ParameterDescriptor {
457- name : name. clone ( ) ,
458- type_ : pv. into_parameter_type ( ) ,
459- ..Default :: default ( )
460- } ) ;
461- } else {
462- // parameter not found, but undeclared allowed, so return empty
463- descriptors. push ( ParameterDescriptor {
464- name : name. clone ( ) ,
465- ..Default :: default ( )
466- } ) ;
467- }
467+ let default = Parameter :: empty ( ) ;
468+ let param = params. get ( name) . unwrap_or ( & default) ;
469+ descriptors. push ( ParameterDescriptor {
470+ name : name. clone ( ) ,
471+ type_ : param. value . into_parameter_type ( ) ,
472+ description : param. description . to_string ( ) ,
473+ ..Default :: default ( )
474+ } ) ;
468475 }
469476 req. respond ( DescribeParameters :: Response { descriptors } )
470477 . expect ( "could not send reply to describe parameters request" ) ;
0 commit comments