@@ -168,7 +168,8 @@ ParameterHandler::ParameterHandler(rclcpp::Node *const node)
168
168
return pr;
169
169
});
170
170
171
- param_cb_validate = node->add_on_set_parameters_callback (std::bind (&ParameterHandler::validate, this , std::placeholders::_1));
171
+ param_cb_validate = node->add_on_set_parameters_callback (
172
+ std::bind (&ParameterHandler::OnSetValidate, this , std::placeholders::_1));
172
173
173
174
// apply parameters
174
175
// std::function<void (const std::vector<rclcpp::Parameter> &)>
@@ -180,6 +181,9 @@ ParameterHandler::ParameterHandler(rclcpp::Node *const node)
180
181
}
181
182
std::cout << " ParameterHandler post ##" << std::endl;
182
183
});
184
+
185
+ param_cb_apply = node->add_post_set_parameters_callback (
186
+ std::bind (&ParameterHandler::PostSetApply, this , std::placeholders::_1));
183
187
}
184
188
185
189
void
@@ -346,7 +350,7 @@ ParameterHandler::declareFromControls(const libcamera::ControlInfoMap &controls)
346
350
347
351
node->set_parameters (parameters);
348
352
349
- std::vector<rclcpp::Parameter> aa = node->get_parameters ({" AeEnable" , " ExposureTime" });
353
+ // std::vector<rclcpp::Parameter> aa = node->get_parameters({"AeEnable", "ExposureTime"});
350
354
351
355
// resolve conflicts in default control values
352
356
// TODO: let conflicts be resolved with callback?
@@ -366,10 +370,33 @@ ParameterHandler::declareFromControls(const libcamera::ControlInfoMap &controls)
366
370
// node->set_parameters(parameters_init_list);
367
371
}
368
372
373
+ ParameterHandler::ControlValueMap
374
+ ParameterHandler::get ()
375
+ {
376
+ // parameters_lock.lock();
377
+ const std::lock_guard<std::mutex> lock (parameters_lock);
378
+ return control_values;
379
+ }
380
+
381
+ void
382
+ ParameterHandler::clear ()
383
+ {
384
+ parameters_lock.lock ();
385
+ control_values.clear ();
386
+ parameters_lock.unlock ();
387
+ }
388
+
389
+ void
390
+ ParameterHandler::PreSetResolve (std::vector<rclcpp::Parameter> ¶meters)
391
+ {
392
+ (void )parameters;
393
+ // clamp?
394
+ }
395
+
369
396
rcl_interfaces::msg::SetParametersResult
370
- ParameterHandler::validate (const std::vector<rclcpp::Parameter> ¶meters)
397
+ ParameterHandler::OnSetValidate (const std::vector<rclcpp::Parameter> ¶meters)
371
398
{
372
- std::cout << " validate ..." << std::endl;
399
+ std::cout << " OnSetValidate ..." << std::endl;
373
400
374
401
// TODO: should just go over "controls"
375
402
// const std::vector<std::string> parameter_names_old = node->list_parameters({}, {}).names;
@@ -403,7 +430,6 @@ ParameterHandler::validate(const std::vector<rclcpp::Parameter> ¶meters)
403
430
// const std::vector<rclcpp::Parameter> parameters_old = node->get_parameters(parameter_names_old);
404
431
405
432
{ // conflicts
406
- std::cout << " validate....." << std::endl;
407
433
const std::vector<std::string> msgs = check (parameters_old, parameters);
408
434
if (!msgs.empty ()) {
409
435
rcl_interfaces::msg::SetParametersResult result;
@@ -422,24 +448,7 @@ ParameterHandler::validate(const std::vector<rclcpp::Parameter> ¶meters)
422
448
423
449
// TODO: check other mismatches from 'parameterCheckAndConvert'
424
450
425
- rcl_interfaces::msg::SetParametersResult result;
426
- result.successful = true ;
427
- return result;
428
- }
429
-
430
- std::tuple<ParameterHandler::ControlValueMap, std::vector<std::string>>
431
- ParameterHandler::parameterCheckAndConvert (const std::vector<rclcpp::Parameter> ¶meters)
432
- {
433
- // check target parameter state (current and new parameters)
434
- // for conflicting configuration
435
- const std::vector<std::string> msgs_conflicts = check_conflicts (parameters, parameters_full);
436
- if (!msgs_conflicts.empty ()) {
437
- return {ControlValueMap {}, msgs_conflicts};
438
- }
439
-
440
- ControlValueMap control_values;
441
451
std::vector<std::string> msgs_valid_check;
442
-
443
452
for (const rclcpp::Parameter ¶meter : parameters) {
444
453
RCLCPP_DEBUG_STREAM (node->get_logger (),
445
454
" setting " << parameter.get_type_name () << " parameter "
@@ -480,11 +489,108 @@ ParameterHandler::parameterCheckAndConvert(const std::vector<rclcpp::Parameter>
480
489
continue ;
481
490
}
482
491
483
- control_values[parameter_ids.at (parameter.get_name ())->id ()] = value;
484
- parameters_full[parameter.get_name ()] = parameter.get_parameter_value ();
485
- }
486
- }
492
+ // TODO: value clamping into pre_set
493
+
494
+ // TODO: set control_values in post_set callback
495
+ // control_values[parameter_ids.at(parameter.get_name())->id()] = value;
496
+ // parameters_full[parameter.get_name()] = parameter.get_parameter_value();
497
+ } // not None
498
+ } // in parameter_ids
499
+ } // parameters
500
+
501
+ // TODO: move to function
502
+ rcl_interfaces::msg::SetParametersResult result;
503
+ result.successful = msgs_valid_check.empty ();
504
+ for (size_t i = 0 ; i < msgs_valid_check.size (); i++) {
505
+ if (msgs_valid_check.size () > 1 )
506
+ result.reason += " (" + std::to_string (i) + " ) " ;
507
+ result.reason += msgs_valid_check[i];
508
+ if (i < msgs_valid_check.size () - 1 )
509
+ result.reason += " ; " ;
487
510
}
511
+ return result;
512
+ }
488
513
489
- return {control_values, msgs_valid_check};
514
+ void
515
+ ParameterHandler::PostSetApply (const std::vector<rclcpp::Parameter> ¶meters)
516
+ {
517
+ std::cout << " PostSetApply..." << std::endl;
518
+
519
+ parameters_lock.lock ();
520
+ for (const rclcpp::Parameter ¶meter : parameters) {
521
+ if (!parameter_ids.count (parameter.get_name ()))
522
+ continue ;
523
+ const libcamera::ControlId *id = parameter_ids.at (parameter.get_name ());
524
+ const libcamera::ControlValue value = pv_to_cv (parameter, id->type ());
525
+ control_values[parameter_ids.at (parameter.get_name ())->id ()] = value;
526
+ }
527
+ parameters_lock.unlock ();
528
+
529
+ // std::tie(controls, msgs) = parameter_handler.parameterCheckAndConvert(parameters);
530
+
531
+ // parameters_lock.lock();
532
+ // this->parameters = controls;
533
+ // parameters_lock.unlock();
490
534
}
535
+
536
+ // std::tuple<ParameterHandler::ControlValueMap, std::vector<std::string>>
537
+ // ParameterHandler::parameterCheckAndConvert(const std::vector<rclcpp::Parameter> ¶meters)
538
+ // {
539
+ // // check target parameter state (current and new parameters)
540
+ // // for conflicting configuration
541
+ // // const std::vector<std::string> msgs_conflicts = check_conflicts(parameters, parameters_full);
542
+ // // if (!msgs_conflicts.empty()) {
543
+ // // return {ControlValueMap {}, msgs_conflicts};
544
+ // // }
545
+
546
+ // ControlValueMap control_values;
547
+ // std::vector<std::string> msgs_valid_check;
548
+
549
+ // // for (const rclcpp::Parameter ¶meter : parameters) {
550
+ // // RCLCPP_DEBUG_STREAM(node->get_logger(),
551
+ // // "setting " << parameter.get_type_name() << " parameter "
552
+ // // << parameter.get_name() << " to "
553
+ // // << parameter.value_to_string());
554
+
555
+ // // if (parameter_ids.count(parameter.get_name())) {
556
+ // // const libcamera::ControlId *id = parameter_ids.at(parameter.get_name());
557
+ // // const libcamera::ControlValue value = pv_to_cv(parameter, id->type());
558
+
559
+ // // if (!value.isNone()) {
560
+ // // // verify parameter type and dimension against default
561
+ // // const libcamera::ControlInfo &ci = parameter_info.at(parameter.get_name());
562
+
563
+ // // if (value.type() != id->type()) {
564
+ // // msgs_valid_check.push_back(
565
+ // // parameter.get_name() + ": parameter types mismatch, expected '" +
566
+ // // std::to_string(id->type()) + "', got '" + std::to_string(value.type()) +
567
+ // // "'");
568
+ // // continue;
569
+ // // }
570
+
571
+ // // const std::size_t extent = get_extent(id);
572
+ // // if (value.isArray() &&
573
+ // // (extent != libcamera::dynamic_extent) &&
574
+ // // (value.numElements() != extent))
575
+ // // {
576
+ // // msgs_valid_check.push_back(
577
+ // // parameter.get_name() + ": array dimensions mismatch, expected " +
578
+ // // std::to_string(extent) + ", got " + std::to_string(value.numElements()));
579
+ // // continue;
580
+ // // }
581
+
582
+ // // // check bounds and return error
583
+ // // if (value < ci.min() || value > ci.max()) {
584
+ // // msgs_valid_check.push_back(
585
+ // // "parameter value " + value.toString() + " outside of range: " + ci.toString());
586
+ // // continue;
587
+ // // }
588
+
589
+ // // control_values[parameter_ids.at(parameter.get_name())->id()] = value;
590
+ // // parameters_full[parameter.get_name()] = parameter.get_parameter_value();
591
+ // // } // not None
592
+ // // } // in parameter_ids
593
+ // // } // parameters
594
+
595
+ // return {control_values, msgs_valid_check};
596
+ // }
0 commit comments