From f2edb55712e1f295935582558f694077da8d81e6 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Mon, 11 Mar 2013 23:24:42 +0000 Subject: [PATCH] Added UI error handling for file loading and capturing --- pv/mainwindow.cpp | 33 +++++++++++++++++++++++++++++++-- pv/mainwindow.h | 6 ++++++ pv/sigsession.cpp | 31 ++++++++++++++++++------------- pv/sigsession.h | 14 ++++++++++---- 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index da018587..90ac324b 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -20,10 +20,13 @@ #include +#include + #include #include #include #include +#include #include #include #include @@ -210,9 +213,33 @@ void MainWindow::scan_devices() _sampling_bar->set_device_list(_devices); } +void MainWindow::session_error( + const QString text, const QString info_text) +{ + QMetaObject::invokeMethod(this, "show_session_error", + Qt::QueuedConnection, Q_ARG(QString, text), + Q_ARG(QString, info_text)); +} + void MainWindow::load_file(QString file_name) { - _session.load_file(file_name.toStdString()); + const QString errorMessage( + QString("Failed to load file %1").arg(file_name)); + const QString infoMessage; + _session.load_file(file_name.toStdString(), + boost::bind(&MainWindow::session_error, this, + errorMessage, infoMessage)); +} + +void MainWindow::show_session_error( + const QString text, const QString info_text) +{ + QMessageBox msg(this); + msg.setText(text); + msg.setInformativeText(info_text); + msg.setStandardButtons(QMessageBox::Ok); + msg.setIcon(QMessageBox::Warning); + msg.exec(); } void MainWindow::on_actionOpen_triggered() @@ -272,7 +299,9 @@ void MainWindow::run_stop() case SigSession::Stopped: _session.start_capture( _sampling_bar->get_selected_device(), - _sampling_bar->get_record_length()); + _sampling_bar->get_record_length(), + boost::bind(&MainWindow::session_error, this, + QString("Capture failed"), _1)); break; case SigSession::Running: diff --git a/pv/mainwindow.h b/pv/mainwindow.h index ac48852e..8b797374 100644 --- a/pv/mainwindow.h +++ b/pv/mainwindow.h @@ -55,6 +55,8 @@ private: void setup_ui(); void scan_devices(); + void session_error(const QString text, const QString info_text); + private: SigSession _session; @@ -85,6 +87,10 @@ private: private slots: void load_file(QString file_name); + + void show_session_error( + const QString text, const QString info_text); + void on_actionOpen_triggered(); void on_actionQuit_triggered(); diff --git a/pv/sigsession.cpp b/pv/sigsession.cpp index b2670b6f..8ab7dab8 100644 --- a/pv/sigsession.cpp +++ b/pv/sigsession.cpp @@ -27,8 +27,6 @@ #include "view/analogsignal.h" #include "view/logicsignal.h" -#include - #include using namespace boost; @@ -58,11 +56,13 @@ SigSession::~SigSession() _session = NULL; } -void SigSession::load_file(const string &name) +void SigSession::load_file(const string &name, + function error_handler) { stop_capture(); _sampling_thread.reset(new boost::thread( - &SigSession::load_thread_proc, this, name)); + &SigSession::load_thread_proc, this, name, + error_handler)); } SigSession::capture_state SigSession::get_capture_state() const @@ -72,13 +72,14 @@ SigSession::capture_state SigSession::get_capture_state() const } void SigSession::start_capture(struct sr_dev_inst *sdi, - uint64_t record_length) + uint64_t record_length, + function error_handler) { stop_capture(); _sampling_thread.reset(new boost::thread( &SigSession::sample_thread_proc, this, sdi, - record_length)); + record_length, error_handler)); } void SigSession::stop_capture() @@ -112,17 +113,18 @@ void SigSession::set_capture_state(capture_state state) capture_state_changed(state); } -void SigSession::load_thread_proc(const string name) +void SigSession::load_thread_proc(const string name, + function error_handler) { if (sr_session_load(name.c_str()) != SR_OK) { - qDebug() << "Failed to load file."; + error_handler(tr("Failed to load file.")); return; } sr_session_datafeed_callback_add(data_feed_in_proc); if (sr_session_start() != SR_OK) { - qDebug() << "Failed to start session."; + error_handler(tr("Failed to start session.")); return; } @@ -135,15 +137,17 @@ void SigSession::load_thread_proc(const string name) } void SigSession::sample_thread_proc(struct sr_dev_inst *sdi, - uint64_t record_length) + uint64_t record_length, + function error_handler) { assert(sdi); + assert(error_handler); sr_session_new(); sr_session_datafeed_callback_add(data_feed_in_proc); if (sr_session_dev_add(sdi) != SR_OK) { - qDebug() << "Failed to use device."; + error_handler(tr("Failed to use device.")); sr_session_destroy(); return; } @@ -151,13 +155,14 @@ void SigSession::sample_thread_proc(struct sr_dev_inst *sdi, // Set the sample limit if (sr_config_set(sdi, SR_CONF_LIMIT_SAMPLES, &record_length) != SR_OK) { - qDebug() << "Failed to configure time-based sample limit."; + error_handler(tr("Failed to configure " + "time-based sample limit.")); sr_session_destroy(); return; } if (sr_session_start() != SR_OK) { - qDebug() << "Failed to start session."; + error_handler(tr("Failed to start session.")); return; } diff --git a/pv/sigsession.h b/pv/sigsession.h index 7805eec6..b2dc4676 100644 --- a/pv/sigsession.h +++ b/pv/sigsession.h @@ -21,6 +21,7 @@ #ifndef PULSEVIEW_PV_SIGSESSION_H #define PULSEVIEW_PV_SIGSESSION_H +#include #include #include @@ -29,6 +30,7 @@ #include #include +#include #include @@ -60,12 +62,14 @@ public: ~SigSession(); - void load_file(const std::string &name); + void load_file(const std::string &name, + boost::function error_handler); capture_state get_capture_state() const; void start_capture(struct sr_dev_inst* sdi, - uint64_t record_length); + uint64_t record_length, + boost::function error_handler); void stop_capture(); @@ -78,10 +82,12 @@ private: void set_capture_state(capture_state state); private: - void load_thread_proc(const std::string name); + void load_thread_proc(const std::string name, + boost::function error_handler); void sample_thread_proc(struct sr_dev_inst *sdi, - uint64_t record_length); + uint64_t record_length, + boost::function error_handler); void feed_in_header(const sr_dev_inst *sdi); -- 2.30.2