]> sigrok.org Git - pulseview.git/blobdiff - pv/mainwindow.cpp
Session: Fix issue #67 by improving error handling
[pulseview.git] / pv / mainwindow.cpp
index 4bf4f127cb9b91925711b72a1756764351160f6a..8646175e2b32f7a6b7f0a7ec7233f07d136d77fb 100644 (file)
@@ -79,6 +79,8 @@ MainWindow::MainWindow(DeviceManager &device_manager, QWidget *parent) :
 {
        setup_ui();
        restore_ui_settings();
+       connect(this, SIGNAL(session_error_raised(const QString, const QString)),
+               this, SLOT(on_session_error_raised(const QString, const QString)));
 }
 
 MainWindow::~MainWindow()
@@ -95,7 +97,7 @@ MainWindow::~MainWindow()
 void MainWindow::show_session_error(const QString text, const QString info_text)
 {
        // TODO Emulate noquote()
-       qDebug() << "Notifying user of session error:" << info_text;
+       qDebug() << "Notifying user of session error: " << text << "; " << info_text;
 
        QMessageBox msg;
        msg.setText(text + "\n\n" + info_text);
@@ -193,6 +195,9 @@ shared_ptr<views::ViewBase> MainWindow::add_view(views::ViewType type,
                qobject_cast<views::ViewBase*>(v.get()),
                SLOT(trigger_event(int, util::Timestamp)));
 
+       connect(&session, SIGNAL(session_error_raised(const QString, const QString)),
+               this, SLOT(on_session_error_raised(const QString, const QString)));
+
        if (type == views::ViewTypeTrace) {
                views::trace::View *tv =
                        qobject_cast<views::trace::View*>(v.get());
@@ -547,10 +552,14 @@ void MainWindow::setup_ui()
        session_selector_.setCornerWidget(static_tab_widget_, Qt::TopLeftCorner);
        session_selector_.setTabsClosable(true);
 
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
+       close_application_shortcut_ = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q), this, SLOT(close()));
+       close_current_tab_shortcut_ = new QShortcut(QKeySequence(Qt::CTRL | Qt::Key_W), this, SLOT(on_close_current_tab()));
+#else
        close_application_shortcut_ = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this, SLOT(close()));
-       close_application_shortcut_->setAutoRepeat(false);
-
        close_current_tab_shortcut_ = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this, SLOT(on_close_current_tab()));
+#endif
+       close_application_shortcut_->setAutoRepeat(false);
 
        connect(new_session_button_, SIGNAL(clicked(bool)),
                this, SLOT(on_new_session_clicked()));
@@ -659,6 +668,54 @@ bool MainWindow::restoreState(const QByteArray &state, int version)
        return false;
 }
 
+void MainWindow::on_run_stop_clicked()
+{
+       GlobalSettings settings;
+       bool all_sessions = settings.value(GlobalSettings::Key_General_StartAllSessions).toBool();
+
+       if (all_sessions)
+       {
+               vector< shared_ptr<Session> > hw_sessions;
+
+               // Make a list of all sessions where a hardware device is used
+               for (const shared_ptr<Session>& s : sessions_) {
+                       shared_ptr<devices::HardwareDevice> 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<Session> &s)
+                               { return (s->get_capture_state() == Session::AwaitingTrigger) ||
+                                               (s->get_capture_state() == Session::Running); });
+
+               for (shared_ptr<Session> s : hw_sessions)
+                       if (any_running)
+                               s->stop_capture();
+                       else
+                               s->start_capture([&](QString message) {Q_EMIT session_error_raised("Capture failed", message);});
+       } else {
+
+               shared_ptr<Session> session = last_focused_session_;
+
+               if (!session)
+                       return;
+
+               switch (session->get_capture_state()) {
+               case Session::Stopped:
+                       session->start_capture([&](QString message) {Q_EMIT session_error_raised("Capture failed", message);});
+                       break;
+               case Session::AwaitingTrigger:
+               case Session::Running:
+                       session->stop_capture();
+                       break;
+               }
+       }
+}
+
 void MainWindow::on_add_view(views::ViewType type, Session *session)
 {
        // We get a pointer and need a reference
@@ -709,30 +766,6 @@ void MainWindow::on_new_session_clicked()
        add_session();
 }
 
-void MainWindow::on_run_stop_clicked()
-{
-       shared_ptr<Session> 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;
-       }
-}
-
-void MainWindow::on_external_trigger()
-{
-       on_run_stop_clicked();
-}
-
 void MainWindow::on_settings_clicked()
 {
        dialogs::Settings dlg(device_manager_);
@@ -951,4 +984,8 @@ void MainWindow::on_close_current_tab()
        on_tab_close_requested(tab);
 }
 
+void MainWindow::on_session_error_raised(const QString text, const QString info_text) {
+       MainWindow::show_session_error(text, info_text);
+}
+
 } // namespace pv