Skip to content

Commit dc9615a

Browse files
set controls as control list
1 parent 93c2f48 commit dc9615a

File tree

3 files changed

+31
-14
lines changed

3 files changed

+31
-14
lines changed

src/CameraNode.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -565,17 +565,24 @@ CameraNode::process(libcamera::Request *const request)
565565
request->reuse(libcamera::Request::ReuseBuffers);
566566

567567
// update parameters
568-
const ParameterHandler::ControlValueMap parameters = parameter_handler.get();
569-
if (!parameters.empty()) {
570-
RCLCPP_DEBUG_STREAM(get_logger(), request->toString() << " setting " << parameters.size() << " controls");
571-
for (const auto &[id, value] : parameters) {
572-
const std::string &name = libcamera::controls::controls.at(id)->name();
573-
RCLCPP_DEBUG_STREAM(get_logger(), "apply " << name << ": " << value.toString());
574-
request->controls().set(id, value);
575-
}
576-
parameter_handler.clear();
568+
request->controls() = parameter_handler.get();
569+
parameter_handler.clear();
570+
for (const auto &[id, value] : request->controls()) {
571+
const std::string &name = libcamera::controls::controls.at(id)->name();
572+
RCLCPP_DEBUG_STREAM(get_logger(), "applied " << name << ": " << value.toString());
577573
}
578574

575+
// const auto parameters = parameter_handler.get();
576+
// if (!parameters.empty()) {
577+
// RCLCPP_DEBUG_STREAM(get_logger(), request->toString() << " setting " << parameters.size() << " controls");
578+
// for (const auto &[id, value] : parameters) {
579+
// const std::string &name = libcamera::controls::controls.at(id)->name();
580+
// RCLCPP_DEBUG_STREAM(get_logger(), "apply " << name << ": " << value.toString());
581+
// request->controls().set(id, value);
582+
// }
583+
// parameter_handler.clear();
584+
// }
585+
579586
camera->queueRequest(request);
580587
}
581588
}

src/ParameterHandler.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ ParameterHandler::declare(const libcamera::ControlInfoMap &controls)
408408
// node->set_parameters(parameters_init_list);
409409
}
410410

411-
ParameterHandler::ControlValueMap
411+
libcamera::ControlList &
412412
ParameterHandler::get()
413413
{
414414
const std::lock_guard<std::mutex> lock(parameters_lock);
@@ -544,13 +544,22 @@ ParameterHandler::apply(const std::vector<rclcpp::Parameter> &parameters)
544544
{
545545
std::cout << "apply..." << std::endl;
546546

547+
// NOTE: apply could be called multiple times before 'control_values' is read,
548+
// should we clear 'control_values' on every apply to keep previous checks valid?
549+
550+
// TODO: use a callback to set controls immediately on request
551+
547552
parameters_lock.lock();
553+
// control_values.clear(); // need this??
548554
for (const rclcpp::Parameter &parameter : parameters) {
549555
if (!parameter_ids.count(parameter.get_name()))
550556
continue;
551557
const libcamera::ControlId *id = parameter_ids.at(parameter.get_name());
552558
const libcamera::ControlValue value = pv_to_cv(parameter, id->type());
553-
control_values[parameter_ids.at(parameter.get_name())->id()] = value;
559+
// control_values[parameter_ids.at(parameter.get_name())->id()] = value;
560+
// const std::string &name = libcamera::controls::controls.at(id)->name();
561+
RCLCPP_DEBUG_STREAM(node->get_logger(), "apply " << id->name() << ": " << value.toString());
562+
control_values.set(parameter_ids[parameter.get_name()]->id(), value);
554563
// TODO: What if 'control_values' gets conflcit here? Should we gather this before?
555564
}
556565
parameters_lock.unlock();

src/ParameterHandler.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ class ParameterHandler
1818
{
1919
public:
2020
// re-definition of the private ControlList::ControlListMap
21-
typedef std::unordered_map<unsigned int, libcamera::ControlValue> ControlValueMap;
21+
// typedef std::unordered_map<unsigned int, libcamera::ControlValue> ControlValueMap;
2222

2323
ParameterHandler(rclcpp::Node *const node);
2424

2525
void
2626
declare(const libcamera::ControlInfoMap &controls);
2727

28-
ControlValueMap
28+
libcamera::ControlList &
2929
get();
3030

3131
void
@@ -51,7 +51,8 @@ class ParameterHandler
5151
// keep track of set parameters
5252
// ParameterMap parameters_full;
5353

54-
ControlValueMap control_values;
54+
// ControlValueMap control_values;
55+
libcamera::ControlList control_values;
5556
std::mutex parameters_lock;
5657

5758
void

0 commit comments

Comments
 (0)