From: Soeren Apel Date: Fri, 13 Nov 2020 20:53:40 +0000 (+0100) Subject: Add "start acquisition for all devices" option X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=5d58e6ce2b4b0e786edb3945953e59a664685c1a;p=pulseview.git Add "start acquisition for all devices" option --- diff --git a/pv/dialogs/settings.cpp b/pv/dialogs/settings.cpp index efe854af..b07a6369 100644 --- a/pv/dialogs/settings.cpp +++ b/pv/dialogs/settings.cpp @@ -276,6 +276,11 @@ QWidget *Settings::get_general_settings_form(QWidget *parent) const SLOT(on_general_save_with_setup_changed(int))); general_layout->addRow(tr("Save session &setup along with .sr file"), cb); + cb = create_checkbox(GlobalSettings::Key_General_StartAllSessions, + SLOT(on_general_start_all_sessions_changed(int))); + general_layout->addRow(tr("Start acquisition for all open sessions when clicking 'Run'"), cb); + + return form; } @@ -679,6 +684,12 @@ void Settings::on_general_save_with_setup_changed(int state) settings.setValue(GlobalSettings::Key_General_SaveWithSetup, state ? true : false); } +void Settings::on_general_start_all_sessions_changed(int state) +{ + GlobalSettings settings; + settings.setValue(GlobalSettings::Key_General_StartAllSessions, state ? true : false); +} + void Settings::on_view_zoomToFitDuringAcq_changed(int state) { GlobalSettings settings; diff --git a/pv/dialogs/settings.hpp b/pv/dialogs/settings.hpp index 18920b81..d419350c 100644 --- a/pv/dialogs/settings.hpp +++ b/pv/dialogs/settings.hpp @@ -62,6 +62,7 @@ private Q_SLOTS: void on_general_theme_changed(int value); void on_general_style_changed(int value); void on_general_save_with_setup_changed(int state); + void on_general_start_all_sessions_changed(int state); void on_view_zoomToFitDuringAcq_changed(int state); void on_view_zoomToFitAfterAcq_changed(int state); void on_view_triggerIsZero_changed(int state); diff --git a/pv/globalsettings.cpp b/pv/globalsettings.cpp index ca649bef..4fa9bc33 100644 --- a/pv/globalsettings.cpp +++ b/pv/globalsettings.cpp @@ -52,6 +52,7 @@ const QString GlobalSettings::Key_General_Language = "General_Language"; const QString GlobalSettings::Key_General_Theme = "General_Theme"; const QString GlobalSettings::Key_General_Style = "General_Style"; const QString GlobalSettings::Key_General_SaveWithSetup = "General_SaveWithSetup"; +const QString GlobalSettings::Key_General_StartAllSessions = "General_StartAllSessions"; const QString GlobalSettings::Key_View_ZoomToFitDuringAcq = "View_ZoomToFitDuringAcq"; const QString GlobalSettings::Key_View_ZoomToFitAfterAcq = "View_ZoomToFitAfterAcq"; const QString GlobalSettings::Key_View_TriggerIsZeroTime = "View_TriggerIsZeroTime"; diff --git a/pv/globalsettings.hpp b/pv/globalsettings.hpp index e41c2ea9..2b8bf17f 100644 --- a/pv/globalsettings.hpp +++ b/pv/globalsettings.hpp @@ -57,6 +57,7 @@ public: static const QString Key_General_Theme; static const QString Key_General_Style; static const QString Key_General_SaveWithSetup; + static const QString Key_General_StartAllSessions; static const QString Key_View_ZoomToFitDuringAcq; static const QString Key_View_ZoomToFitAfterAcq; static const QString Key_View_TriggerIsZeroTime; diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index 6749b5f0..8e3cb9d1 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -661,20 +661,51 @@ bool MainWindow::restoreState(const QByteArray &state, int version) void MainWindow::on_run_stop_clicked() { - shared_ptr session = last_focused_session_; + GlobalSettings settings; + bool all_sessions = settings.value(GlobalSettings::Key_General_StartAllSessions).toBool(); - if (!session) - return; + if (all_sessions) + { + vector< shared_ptr > hw_sessions; + + // Make a list of all sessions where a hardware device is used + for (shared_ptr s : sessions_) { + shared_ptr hw_device = + dynamic_pointer_cast< devices::HardwareDevice >(s->device()); + if (!hw_device) + continue; + hw_sessions.push_back(s); + } + + // Stop all acquisitions if there are any running ones, start all otherwise + bool any_running = any_of(hw_sessions.begin(), hw_sessions.end(), + [](const shared_ptr &s) + { return (s->get_capture_state() == Session::AwaitingTrigger) || + (s->get_capture_state() == Session::Running); }); + + for (shared_ptr s : hw_sessions) + if (any_running) + s->stop_capture(); + else + s->start_capture([&](QString message) { + show_session_error("Capture failed", message); }); + } else { + + shared_ptr session = last_focused_session_; + + if (!session) + return; - switch (session->get_capture_state()) { - case Session::Stopped: - session->start_capture([&](QString message) { - show_session_error("Capture failed", message); }); - break; - case Session::AwaitingTrigger: - case Session::Running: - session->stop_capture(); - break; + switch (session->get_capture_state()) { + case Session::Stopped: + session->start_capture([&](QString message) { + show_session_error("Capture failed", message); }); + break; + case Session::AwaitingTrigger: + case Session::Running: + session->stop_capture(); + break; + } } }