@@ -53,6 +53,23 @@ param_view(const std::vector<rclcpp::Parameter> ¶meters)
53
53
return param_map;
54
54
}
55
55
56
+ rcl_interfaces::msg::SetParametersResult
57
+ format_result (const std::vector<std::string> &msgs)
58
+ {
59
+ rcl_interfaces::msg::SetParametersResult result;
60
+ result.successful = msgs.empty ();
61
+ if (!result.successful ) {
62
+ for (size_t i = 0 ; i < msgs.size (); i++) {
63
+ if (msgs.size () > 1 )
64
+ result.reason += " (" + std::to_string (i) + " ) " ;
65
+ result.reason += msgs[i];
66
+ if (i < msgs.size () - 1 )
67
+ result.reason += " ; " ;
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+
56
73
// TODO: can be used as pre_set cb?
57
74
void
58
75
resolve (std::vector<rclcpp::Parameter> ¶meters)
@@ -140,11 +157,15 @@ check(const std::vector<rclcpp::Parameter> ¶meters_old,
140
157
ParameterHandler::ParameterHandler (rclcpp::Node *const node)
141
158
: node(node)
142
159
{
160
+ param_cb_on = node->add_on_set_parameters_callback (
161
+ std::bind (&ParameterHandler::OnSetValidate, this , std::placeholders::_1));
162
+
163
+ #if defined(RCLCPP_HAS_PARAM_EXT_CB) && 1
143
164
// pre_set -> on_set -> post_set
144
165
145
166
// adjust parameters
146
167
// std::function<void (std::vector<rclcpp::Parameter> &)>
147
- param_cb_adjust = node->add_pre_set_parameters_callback (
168
+ param_cb_pre = node->add_pre_set_parameters_callback (
148
169
[this ](std::vector<rclcpp::Parameter> ¶meters) -> void {
149
170
std::cout << " ParameterHandler pre >>" << std::endl;
150
171
for (const rclcpp::Parameter ¶m : parameters) {
@@ -153,12 +174,9 @@ ParameterHandler::ParameterHandler(rclcpp::Node *const node)
153
174
std::cout << " ParameterHandler pre ##" << std::endl;
154
175
});
155
176
156
- // TODO: callback may take single param, need to gather old + new
157
- // param_cb_adjust = node->add_pre_set_parameters_callback(resolve);
158
-
159
177
// validate parameters
160
178
// std::function<rcl_interfaces::msg::SetParametersResult(const std::vector<rclcpp::Parameter> &)>
161
- param_cb_validate = node->add_on_set_parameters_callback (
179
+ param_cb_on = node->add_on_set_parameters_callback (
162
180
[this ](const std::vector<rclcpp::Parameter> ¶meters) -> rcl_interfaces::msg::SetParametersResult {
163
181
std::cout << " ParameterHandler set >>" << std::endl;
164
182
for (const rclcpp::Parameter ¶m : parameters) {
@@ -170,22 +188,24 @@ ParameterHandler::ParameterHandler(rclcpp::Node *const node)
170
188
return pr;
171
189
});
172
190
173
- param_cb_validate = node->add_on_set_parameters_callback (
174
- std::bind (&ParameterHandler::OnSetValidate, this , std::placeholders::_1));
175
-
176
191
// apply parameters
177
192
// std::function<void (const std::vector<rclcpp::Parameter> &)>
178
- param_cb_apply = node->add_post_set_parameters_callback (
193
+ param_cb_post = node->add_post_set_parameters_callback (
179
194
[this ](const std::vector<rclcpp::Parameter> ¶meters) -> void {
180
195
std::cout << " ParameterHandler post >>" << std::endl;
181
196
for (const rclcpp::Parameter ¶m : parameters) {
182
197
std::cout << " ParameterHandler post: " << param.get_name () << " to " << param.value_to_string () << std::endl;
183
198
}
184
199
std::cout << " ParameterHandler post ##" << std::endl;
185
200
});
201
+ #endif
186
202
187
- param_cb_apply = node->add_post_set_parameters_callback (
203
+ #ifdef RCLCPP_HAS_PARAM_EXT_CB
204
+ param_cb_pre = node->add_pre_set_parameters_callback (
205
+ std::bind (&ParameterHandler::PreSetResolve, this , std::placeholders::_1));
206
+ param_cb_post = node->add_post_set_parameters_callback (
188
207
std::bind (&ParameterHandler::PostSetApply, this , std::placeholders::_1));
208
+ #endif
189
209
}
190
210
191
211
void
@@ -249,7 +269,6 @@ ParameterHandler::declareFromControls(const libcamera::ControlInfoMap &controls)
249
269
// Camera controls can have arrays for minimum and maximum values, but the parameter descriptor
250
270
// only supports scalar bounds.
251
271
// Get smallest bounds for minimum and maximum set but warn user.
252
-
253
272
if (info.min ().isArray () || info.max ().isArray ()) {
254
273
RCLCPP_WARN_STREAM (
255
274
node->get_logger (),
@@ -389,17 +408,15 @@ ParameterHandler::clear()
389
408
}
390
409
391
410
void
392
- ParameterHandler::PreSetResolve (std::vector<rclcpp::Parameter> ¶meters)
411
+ ParameterHandler::resolve (std::vector<rclcpp::Parameter> ¶meters)
393
412
{
413
+ //
394
414
(void )parameters;
395
- // clamp?
396
415
}
397
416
398
- rcl_interfaces::msg::SetParametersResult
399
- ParameterHandler::OnSetValidate (const std::vector<rclcpp::Parameter> ¶meters)
417
+ std::vector<std::string>
418
+ ParameterHandler::validate (const std::vector<rclcpp::Parameter> ¶meters)
400
419
{
401
- std::cout << " OnSetValidate..." << std::endl;
402
-
403
420
// TODO: should just go over "controls"
404
421
// const std::vector<std::string> parameter_names_old = node->list_parameters({}, {}).names;
405
422
std::vector<std::string> parameter_names_old;
@@ -431,22 +448,17 @@ ParameterHandler::OnSetValidate(const std::vector<rclcpp::Parameter> ¶meters
431
448
// }
432
449
// const std::vector<rclcpp::Parameter> parameters_old = node->get_parameters(parameter_names_old);
433
450
434
- { // conflicts
435
- const std::vector<std::string> msgs = check (parameters_old, parameters);
436
- if (!msgs.empty ()) {
437
- rcl_interfaces::msg::SetParametersResult result;
438
- result.successful = msgs.empty ();
439
- for (size_t i = 0 ; i < msgs.size (); i++) {
440
- if (msgs.size () > 1 )
441
- result.reason += " (" + std::to_string (i) + " ) " ;
442
- result.reason += msgs[i];
443
- if (i < msgs.size () - 1 )
444
- result.reason += " ; " ;
445
- }
446
- std::cout << " validate: " << result.reason << std::endl;
447
- return result;
448
- }
451
+ // conflicts
452
+ const std::vector<std::string> msgs = check (parameters_old, parameters);
453
+ // check(parameters_old, parameters)
454
+ // const rcl_interfaces::msg::SetParametersResult result = format_result();
455
+ if (!msgs.empty ()) {
456
+ // std::cout << "validate: " << result.reason << std::endl;
457
+ // return format_result(msgs);
458
+ return msgs;
449
459
}
460
+ // if (!result.successful)
461
+ // return result;
450
462
451
463
// TODO: check other mismatches from 'parameterCheckAndConvert'
452
464
@@ -500,23 +512,15 @@ ParameterHandler::OnSetValidate(const std::vector<rclcpp::Parameter> ¶meters
500
512
} // in parameter_ids
501
513
} // parameters
502
514
503
- // TODO: move to function
504
- rcl_interfaces::msg::SetParametersResult result;
505
- result.successful = msgs_valid_check.empty ();
506
- for (size_t i = 0 ; i < msgs_valid_check.size (); i++) {
507
- if (msgs_valid_check.size () > 1 )
508
- result.reason += " (" + std::to_string (i) + " ) " ;
509
- result.reason += msgs_valid_check[i];
510
- if (i < msgs_valid_check.size () - 1 )
511
- result.reason += " ; " ;
512
- }
513
- return result;
515
+ // return format_result(msgs_valid_check);
516
+
517
+ return msgs_valid_check;
514
518
}
515
519
516
520
void
517
- ParameterHandler::PostSetApply (const std::vector<rclcpp::Parameter> ¶meters)
521
+ ParameterHandler::apply (const std::vector<rclcpp::Parameter> ¶meters)
518
522
{
519
- std::cout << " PostSetApply ..." << std::endl;
523
+ std::cout << " apply ..." << std::endl;
520
524
521
525
parameters_lock.lock ();
522
526
for (const rclcpp::Parameter ¶meter : parameters) {
@@ -527,13 +531,47 @@ ParameterHandler::PostSetApply(const std::vector<rclcpp::Parameter> ¶meters)
527
531
control_values[parameter_ids.at (parameter.get_name ())->id ()] = value;
528
532
}
529
533
parameters_lock.unlock ();
534
+ }
535
+
536
+ rcl_interfaces::msg::SetParametersResult
537
+ ParameterHandler::OnSetValidate (const std::vector<rclcpp::Parameter> ¶meters)
538
+ {
539
+ std::cout << " OnSetValidate..." << std::endl;
540
+
541
+ #ifdef RCLCPP_HAS_PARAM_EXT_CB
542
+ return format_result (validate (parameters));
543
+ #else
544
+ // This is the only parameter callback available.
545
+ // Call the pre-, on= and post-set callbacks manually.
546
+ resolve (parameters);
547
+ const std::vector<std::string> msgs = validate (parameters);
548
+ apply (parameters);
549
+ return format_result (msgs);
550
+ #endif
551
+ }
552
+
553
+ #ifdef RCLCPP_HAS_PARAM_EXT_CB
554
+ void
555
+ ParameterHandler::PreSetResolve (std::vector<rclcpp::Parameter> ¶meters)
556
+ {
557
+ resolve (parameters);
558
+ // clamp?
559
+ }
560
+
561
+ void
562
+ ParameterHandler::PostSetApply (const std::vector<rclcpp::Parameter> ¶meters)
563
+ {
564
+ std::cout << " PostSetApply..." << std::endl;
565
+
566
+ apply (parameters);
530
567
531
568
// std::tie(controls, msgs) = parameter_handler.parameterCheckAndConvert(parameters);
532
569
533
570
// parameters_lock.lock();
534
571
// this->parameters = controls;
535
572
// parameters_lock.unlock();
536
573
}
574
+ #endif
537
575
538
576
// std::tuple<ParameterHandler::ControlValueMap, std::vector<std::string>>
539
577
// ParameterHandler::parameterCheckAndConvert(const std::vector<rclcpp::Parameter> ¶meters)
0 commit comments