diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d69c888..e1731877 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,6 +139,8 @@ if(BUILD_GUI) find_package(Qt5Widgets REQUIRED) find_package(Qwt REQUIRED) + set(CMAKE_AUTORCC ON) + qt5_wrap_cpp(GENERATED_SOURCES src/gui/MainWindow.hpp src/gui/NotFoundDialog.hpp @@ -173,6 +175,7 @@ if(BUILD_GUI) src/gui/PointsBuffer.cpp src/gui/RightClickPickerMachine.cpp src/gui/SignalEstimator.cpp + src/gui/SignalEstimator.qrc ) add_dependencies(signal-estimator-gui diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 07abde5b..cadb1a54 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -6,6 +6,7 @@ #include "ui_MainWindow.h" #include +#include #include #include @@ -24,6 +25,12 @@ MainWindow::MainWindow(IDeviceManager& device_manager, QWidget* parent) connect(signal_estimator_, &SignalEstimator::error, this, &MainWindow::show_error); connect(signal_estimator_, &SignalEstimator::can_read, this, &MainWindow::read_graph_data); + connect(signal_estimator_, &SignalEstimator::finished, this, [this]() { + ui->actionStart->setEnabled(true); + ui->actionStop->setEnabled(false); + ui->StatusLabel->setText(""); + timer_->stop(); + }); ui->OutputSig->setCanvasBackground(Qt::white); @@ -99,7 +106,14 @@ MainWindow::~MainWindow() { delete ui; } -void MainWindow::on_StartButton_released() { +void MainWindow::closeEvent(QCloseEvent* event) { + signal_estimator_->stop(); + event->accept(); +} + +void MainWindow::on_start() { + ui->actionStart->setEnabled(false); + ui->actionStop->setEnabled(true); QStringList args = set_up_program_(); set_update_plots_(true); // must be true to update graphs @@ -119,9 +133,9 @@ void MainWindow::on_StartButton_released() { } if (signal_estimator_->start(args)) { - ui->ErrorLabel->setText(""); + ui->StatusLabel->setText("Running"); } else { - ui->ErrorLabel->setText(QString("Failed to open signal-estimator")); + ui->StatusLabel->setText(QString("Failed to open signal-estimator")); } set_update_plots_(true); @@ -129,12 +143,20 @@ void MainWindow::on_StartButton_released() { timer_->start(); } -void MainWindow::on_StopButton_clicked() { +void MainWindow::on_stop() { + ui->actionStart->setEnabled(true); + ui->actionStop->setEnabled(false); + ui->StatusLabel->setText(""); signal_estimator_->stop(); set_update_plots_(false); } +void MainWindow::on_DurationCheckBox_stateChanged(int state) { + const bool checked = (state == Qt::Checked); + ui->Duration->setEnabled(!checked); +} + void MainWindow::update_graphs() { if (auto latencyValues = signal_estimator_->latencyUpdate()) { update_latency_(*latencyValues); @@ -177,7 +199,7 @@ void MainWindow::read_graph_data() { } void MainWindow::show_error(QString error) { - ui->ErrorLabel->setText(error); + ui->StatusLabel->setText(error); } QStringList MainWindow::set_up_program_() { @@ -217,7 +239,12 @@ QStringList MainWindow::set_up_program_() { list.append("-l"); list.append(t); - t = ui->Duration->cleanText(); + if (ui->Duration->isEnabled()) { + t = ui->Duration->cleanText(); + } else { + // one year. TODO find a better solution to have infinite measurement + t = "31536000"; + } list.append("-d"); list.append(t); diff --git a/src/gui/MainWindow.hpp b/src/gui/MainWindow.hpp index d17e53c7..d5a05680 100644 --- a/src/gui/MainWindow.hpp +++ b/src/gui/MainWindow.hpp @@ -39,9 +39,13 @@ class MainWindow : public QMainWindow { explicit MainWindow(IDeviceManager& device_manager, QWidget* parent = nullptr); ~MainWindow() override; +protected slots: + void closeEvent(QCloseEvent*) override; + private slots: - void on_StartButton_released(); - void on_StopButton_clicked(); + void on_start(); + void on_stop(); + void on_DurationCheckBox_stateChanged(int state); void update_graphs(); void read_graph_data(); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 4ec8d4d2..e7f914d3 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -169,32 +169,6 @@ - - - - - - - <html><head/><body><p>Run signal-estimator and graph the results</p></body></html> - - - Start - - - - - - - <html><head/><body><p>Stop graphing. Please wait for the sounds of signal-estimator to stop</p></body></html> - - - Stop - - - - - - @@ -283,13 +257,9 @@ true - - - - - - <html><head/><body><p>show grid</p></body></html> - + + show grid + @@ -535,20 +505,53 @@ - - + + 0 - - 2147483647 - - - 1 - - - 10 - - + + + + 1 + + + 2147483647 + + + 1 + + + 10 + + + false + + + + + + + true + + + run measurement unlimited + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + @@ -770,7 +773,7 @@ - + @@ -787,15 +790,80 @@ 26 + + + File + + + + + + Measurement + + + + + + + + Qt::ToolButtonTextUnderIcon + TopToolBarArea false + + + + + Quit + + + Quit application + + + Ctrl+Q + + + + + Start + + + Start measurement (Ctrl+R) + + + Ctrl+R + + + :/images/start.png + + + + + Stop + + + Stop measurement (Ctrl+A) + + + Ctrl+A + + + :/images/stop.png + + + false + + + :/images/stop.png + + @@ -808,5 +876,54 @@ - + + + actionQuit + triggered() + MainWindow + close() + + + -1 + -1 + + + 399 + 299 + + + + + actionStart + triggered() + MainWindow + on_start() + + + -1 + -1 + + + 399 + 299 + + + + + actionStop + triggered() + MainWindow + on_stop() + + + -1 + -1 + + + 399 + 299 + + + + diff --git a/src/gui/SignalEstimator.cpp b/src/gui/SignalEstimator.cpp index 6211190b..1d60476c 100644 --- a/src/gui/SignalEstimator.cpp +++ b/src/gui/SignalEstimator.cpp @@ -84,7 +84,7 @@ QString SignalEstimator::find() { return {}; } -bool SignalEstimator::start(QStringList args) { +bool SignalEstimator::start(const QStringList& args) { stop(); proc_ = QSharedPointer(new QProcess); @@ -97,15 +97,19 @@ bool SignalEstimator::start(QStringList args) { connect(proc_.data(), &QProcess::readyReadStandardOutput, this, &SignalEstimator::can_read); - connect(proc_.data(), qOverload(&QProcess::errorOccurred), - this, [this]() { + connect( + proc_.data(), qOverload(&QProcess::errorOccurred), this, + [this]() { if (proc_) { - error(proc_->errorString()); + emit error(proc_->errorString()); } - }); + }, + Qt::QueuedConnection); + connect(proc_.data(), qOverload(&QProcess::finished), this, + [this](int, QProcess::ExitStatus) { emit finished(); }); if (!proc_->open(QProcess::ReadOnly)) { - proc_ = {}; + proc_.reset(); return false; } @@ -116,8 +120,7 @@ void SignalEstimator::stop() { if (proc_ && proc_->isOpen()) { proc_->close(); } - - proc_ = {}; + proc_.reset(); } std::optional> SignalEstimator::read() { @@ -169,7 +172,7 @@ std::optional> SignalEstimator::parseIO_( QPointF pt; try { - pt.setX(tokens[1].toDouble() / 1000000); + pt.setX(tokens[1].toDouble() / 1'000'000); } catch (const std::invalid_argument&) { return {}; } diff --git a/src/gui/SignalEstimator.hpp b/src/gui/SignalEstimator.hpp index 589a5b1d..8dc5a4e5 100644 --- a/src/gui/SignalEstimator.hpp +++ b/src/gui/SignalEstimator.hpp @@ -34,10 +34,10 @@ class SignalEstimator : public QObject { public: static QString find(); - SignalEstimator(QObject* parent = nullptr); + explicit SignalEstimator(QObject* parent = nullptr); ~SignalEstimator() override; - bool start(QStringList args); + bool start(const QStringList& args); void stop(); std::optional> read(); @@ -47,6 +47,7 @@ class SignalEstimator : public QObject { signals: void can_read(); void error(QString); + void finished(); private: std::optional> parseIO_(const QString& buffer); diff --git a/src/gui/SignalEstimator.qrc b/src/gui/SignalEstimator.qrc new file mode 100644 index 00000000..0bf511d5 --- /dev/null +++ b/src/gui/SignalEstimator.qrc @@ -0,0 +1,14 @@ +<<<<<<< HEAD + +======= +>>>>>>> 969546e (Added toolbar button icons (WIP)) + + + images/start.png + images/stop.png + +<<<<<<< HEAD + +======= + +>>>>>>> 969546e (Added toolbar button icons (WIP)) diff --git a/src/gui/images/start.png b/src/gui/images/start.png new file mode 100644 index 00000000..83d182e1 Binary files /dev/null and b/src/gui/images/start.png differ diff --git a/src/gui/images/stop.png b/src/gui/images/stop.png new file mode 100644 index 00000000..7ca87ebb Binary files /dev/null and b/src/gui/images/stop.png differ