31 #include <QApplication>
40 static const std::string config_key_imrecman =
"imrecman_name";
41 static const std::string config_key_start_in =
"start_in";
52 m_poll_timer->setSingleShot(
false);
53 m_poll_timer->setInterval(50);
56 connect(m_poll_timer, &QTimer::timeout,
this, &this_class::poll_statuses);
58 m_widget.add_image_provider, &QPushButton::clicked,
this, &this_class::add_image_provider);
59 connect(m_widget.copy_config_json,
60 &QPushButton::clicked,
62 &this_class::copy_config_json_to_clipboard);
64 m_widget.config_get, &QPushButton::clicked,
this, &this_class::get_config_from_imrecman);
65 connect(m_widget.config_set, &QPushButton::clicked,
this, &this_class::set_config_at_imrecman);
66 connect(m_widget.start_in,
67 QOverload<double>::of(&QDoubleSpinBox::valueChanged),
69 &this_class::update_start_rec_label);
70 connect(m_widget.start_rec, &QPushButton::clicked,
this, &this_class::start_recordings);
71 connect(m_widget.stop_rec, &QPushButton::clicked,
this, &this_class::stop_recordings);
72 connect(m_widget.edit_mode, &QCheckBox::stateChanged,
this, &this_class::edit_mode_changed);
73 connect(
this, &this_class::component_connected,
this, &this_class::init_gui);
74 connect(
this, &this_class::component_connected,
this, &this_class::get_config_from_imrecman);
75 connect(
this, &this_class::component_connected,
this, &this_class::update_start_rec_label);
76 connect(
this, &this_class::component_disconnected,
this, &this_class::uninit_gui);
78 edit_mode_changed(m_widget.edit_mode->checkState());
86 if (not m_imrecman_name.empty())
88 usingProxy(m_imrecman_name);
97 getProxy(m_imrecman, m_imrecman_name);
99 emit component_connected();
107 emit component_disconnected();
124 settings->value(QString::fromStdString(::config_key_imrecman),
"ImageRecordingManager")
127 m_widget.start_in->setValue(
128 settings->value(QString::fromStdString(::config_key_start_in), 1.0).toDouble());
136 settings->setValue(QString::fromStdString(::config_key_imrecman),
137 QString::fromStdString(m_imrecman_name));
138 settings->setValue(QString::fromStdString(::config_key_start_in), m_widget.start_in->value());
146 if (not m_config_dialog)
149 m_config_dialog->
addProxyFinder<ImageRecordingManagerInterfacePrx>(
150 {::config_key_imrecman,
"Image recording manager",
"*"});
152 return qobject_cast<QDialog*>(m_config_dialog);
162 m_imrecman_name = m_config_dialog->getProxyName(::config_key_imrecman);
168 const std::map<std::string, imrec::Config>& configs)
172 for (
const auto& [image_provider_name, config_widget] : m_config_widgets)
174 m_widget.image_providers->layout()->removeWidget(config_widget);
175 config_widget->deleteLater();
177 m_config_widgets.clear();
179 if (not configs.empty())
181 const imrec::Config& ref_config = configs.begin()->second;
182 m_widget.pp_package->setText(QString::fromStdString(ref_config.location.package));
183 m_widget.pp_path->setText(QString::fromStdString(ref_config.location.path));
184 m_widget.recording_name->setText(QString::fromStdString(ref_config.name));
187 for (
const auto& [image_provider_name, config] : configs)
189 add_image_provider_conf_widget(image_provider_name, config);
195 const std::map<std::string, visionx::imrec::Status>& statuses)
200 for (
const auto& [image_provider_name,
status] : statuses)
202 if (m_config_widgets.find(image_provider_name) != m_config_widgets.end())
204 m_config_widgets.at(image_provider_name)->setImageProviderStatus(
status);
210 std::optional<imrec::Status> empty_status;
211 for (
const auto& [image_provider_name, config_widget] : m_config_widgets)
213 if (statuses.find(image_provider_name) == statuses.end())
215 m_config_widgets.at(image_provider_name)->setImageProviderStatus(empty_status);
222 const std::string& image_provider_name,
223 const imrec::Config& config)
228 m_widget.image_providers, getIceManager(), image_provider_name, config.channelConfigs};
230 m_config_widgets[image_provider_name] = cw;
231 m_widget.image_providers->layout()->addWidget(cw);
236 &ImageRecorderWidgetController::rename_image_provider);
240 &ImageRecorderWidgetController::remove_image_provider);
242 if (m_widget.auto_sync->isChecked())
244 set_config_at_imrecman();
248 std::map<std::string, visionx::imrec::Config>
253 const IceUtil::Time start_in = IceUtil::Time::secondsDouble(m_widget.start_in->value());
254 const IceUtil::Time start_at = IceUtil::Time::now() + start_in;
256 std::map<std::string, visionx::imrec::Config> configs;
257 visionx::imrec::Config config_template;
258 config_template.location.package = m_widget.pp_package->text().toStdString();
259 config_template.location.path = m_widget.pp_path->text().toStdString();
260 config_template.name = m_widget.recording_name->text().toStdString();
262 if (config_template.name.empty())
264 config_template.name =
"rec_%TIMESTAMP%";
267 for (
const auto& [name, config_widget] : m_config_widgets)
269 config_template.channelConfigs = config_widget->toChannelConfigs();
270 configs[name] = config_template;
276 visionx::ImageRecorderWidgetController::init_gui()
281 m_widget.start_rec->setEnabled(
enabled);
282 m_widget.stop_rec->setEnabled(
enabled);
283 m_widget.config_get->setEnabled(
enabled);
284 m_widget.config_set->setEnabled(
enabled);
285 m_poll_timer->start();
289 visionx::ImageRecorderWidgetController::uninit_gui()
294 m_widget.start_rec->setEnabled(
enabled);
295 m_widget.stop_rec->setEnabled(
enabled);
296 m_widget.config_get->setEnabled(
enabled);
297 m_widget.config_set->setEnabled(
enabled);
298 m_poll_timer->stop();
302 visionx::ImageRecorderWidgetController::poll_statuses()
308 if (m_imrecman->isConfigured())
310 update_statuses(m_imrecman->getRecordingStatuses());
320 visionx::ImageRecorderWidgetController::get_config_from_imrecman()
326 if (m_imrecman->isConfigured())
328 build_ui_from_config(m_imrecman->getConfiguration());
338 visionx::ImageRecorderWidgetController::set_config_at_imrecman()
344 m_imrecman->configureRecordings(to_config_map());
353 visionx::ImageRecorderWidgetController::add_image_provider()
357 visionx::imrec::Config config;
358 add_image_provider_conf_widget(
"image_provider_" +
std::to_string(++m_image_provider_ctr),
363 visionx::ImageRecorderWidgetController::copy_config_json_to_clipboard()
367 nlohmann::json j = to_config_map();
368 const std::string config_map_json = j.dump();
369 QClipboard* clipboard = QGuiApplication::clipboard();
370 clipboard->setText(QString::fromStdString(config_map_json));
374 visionx::ImageRecorderWidgetController::update_start_rec_label()
378 QString text =
"Start recordings in ";
379 text += m_widget.start_in->cleanText();
381 m_widget.start_rec->setText(text);
385 visionx::ImageRecorderWidgetController::start_recordings()
391 m_imrecman->configureRecordings(to_config_map());
392 m_imrecman->startRecordings();
401 visionx::ImageRecorderWidgetController::stop_recordings()
407 auto fn = [&] { m_imrecman->stopRecordings(); };
418 visionx::ImageRecorderWidgetController::edit_mode_changed(
const int state)
422 for (
const auto& [image_provider_name, config_widget] : m_config_widgets)
424 config_widget->setViewMode(viewMode);
430 m_widget.config_get->setEnabled(
true);
431 m_widget.config_set->setEnabled(
true);
432 m_widget.add_image_provider->show();
435 m_widget.config_get->setEnabled(
false);
436 m_widget.config_set->setEnabled(
false);
437 m_widget.add_image_provider->hide();
443 visionx::ImageRecorderWidgetController::rename_image_provider(
const std::string& old_name,
444 const std::string& new_name)
448 if (m_config_widgets.find(new_name) == m_config_widgets.end())
450 auto node_handler = m_config_widgets.extract(old_name);
451 node_handler.key() = new_name;
452 m_config_widgets.insert(std::move(node_handler));
453 m_config_widgets.at(new_name)->confirmImageProviderName(new_name);
455 if (m_widget.auto_sync->isChecked())
457 set_config_at_imrecman();
462 m_config_widgets.at(new_name)->rejectImageProviderName(new_name);
467 visionx::ImageRecorderWidgetController::remove_image_provider(
const std::string& name)
471 ImageProviderConfigWidget* config_widget = m_config_widgets.at(name);
472 m_widget.image_providers->layout()->removeWidget(config_widget);
473 config_widget->deleteLater();
474 m_config_widgets.erase(m_config_widgets.find(name));
476 if (m_widget.auto_sync->isChecked())
478 set_config_at_imrecman();