diff --git a/flasher.cpp b/flasher.cpp index 1d024df..b5c0f7b 100755 --- a/flasher.cpp +++ b/flasher.cpp @@ -136,6 +136,8 @@ void Flasher::Init() connect(file_downloader_.get(), &file_downloader::FileDownloader::Downloaded, this, &Flasher::FileDownloaded); connect(file_downloader_.get(), &file_downloader::FileDownloader::DownloadProgress, this, &Flasher::DownloadProgress); + connect(&serial_port_, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(HandleSerialPortError(QSerialPort::SerialPortError))); + Worker *worker = new Worker; worker->moveToThread(&worker_thread_); connect(&worker_thread_, &QThread::finished, worker, &QObject::deleteLater); @@ -397,7 +399,6 @@ void Flasher::LoopHandler() emit ClearProgress(); if (flashing_info.success) { - serial_port_.CloseConn(); SetState(FlasherStates::kTryToConnect); } else { emit ClearStatusMsg(); @@ -729,6 +730,18 @@ bool Flasher::GetVersionJson(QJsonObject& out_json_object) return success; } +void Flasher::HandleSerialPortError(QSerialPort::SerialPortError error) +{ + if (error == QSerialPort::ResourceError) { + qInfo() << "Serial port error"; + serial_port_.CloseConn(); + emit ClearStatusMsg(); + emit DisableAllButtons(); + emit EnableConnectButton(); + SetState(FlasherStates::kIdle); + } +} + bool Flasher::IsBootloaderDetected() const { return is_bootloader_; @@ -903,6 +916,7 @@ void Flasher::TryToConnect() if (is_timer_started_) { if (serial_port_.TryOpenPort(is_bootloader_)) { + emit EnableDisconnectButton(); SetState(FlasherStates::kConnected); is_timer_started_ = false; is_connected = true; diff --git a/flasher.h b/flasher.h index c62dd61..b909a35 100755 --- a/flasher.h +++ b/flasher.h @@ -134,6 +134,8 @@ class Flasher : public QObject void SetButtons(const bool& isBootloader); void SetReadProtectionButtonText(const bool& isEnabled); void DisableAllButtons(); + void EnableConnectButton(); + void EnableDisconnectButton(); void EnableLoadButton(); void SetFirmwareList(const QJsonArray& product_info); @@ -141,6 +143,7 @@ class Flasher : public QObject void LoopHandler(); void FileDownloaded(); void DownloadProgress(const qint64& bytes_received, const qint64& bytes_total); + void HandleSerialPortError(QSerialPort::SerialPortError error); private: QString board_id_; diff --git a/mainwindow.cpp b/mainwindow.cpp index ab56b9f..4878a72 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -68,6 +68,10 @@ MainWindow::MainWindow(std::shared_ptr flasher, QWidget *paren connect(flasher_.get(), &flasher::Flasher::ClearStatusMsg, this, [&] { ui_.statusLabel->clear(); }); + connect(flasher_.get(), &flasher::Flasher::EnableConnectButton, this, &MainWindow::EnableConnectButton); + + connect(flasher_.get(), &flasher::Flasher::EnableDisconnectButton, this, &MainWindow::EnableDisconnectButton); + connect(flasher_.get(), &flasher::Flasher::FailedToConnect, this, [&] { ShowStatusMessage(tr("Failed to connect!")); ui_.actionConnect->setEnabled(true); @@ -141,15 +145,13 @@ void MainWindow::ConnectActions() { connect(ui_.actionConnect, &QAction::triggered, this, [&] (void) { - ui_.actionConnect->setEnabled(false); - ui_.actionDisconnect->setEnabled(true); + EnableDisconnectButton(); flasher_->SetState(flasher::FlasherStates::kTryToConnect); }); connect(ui_.actionDisconnect, &QAction::triggered, this, [&] (void) { - ui_.actionConnect->setEnabled(true); - ui_.actionDisconnect->setEnabled(false); + EnableConnectButton(); DisableAllButtons(); flasher_->SetState(flasher::FlasherStates::kDisconnected); }); @@ -163,10 +165,21 @@ void MainWindow::ConnectActions() }); } -void MainWindow::InitActions() +void MainWindow::EnableConnectButton() { ui_.actionConnect->setEnabled(true); ui_.actionDisconnect->setEnabled(false); +} + +void MainWindow::EnableDisconnectButton() +{ + ui_.actionConnect->setEnabled(false); + ui_.actionDisconnect->setEnabled(true); +} + +void MainWindow::InitActions() +{ + EnableConnectButton(); ui_.actionQuit->setEnabled(true); ui_.availableFirmware->hide(); } diff --git a/mainwindow.h b/mainwindow.h index 694ec8e..1ccaeb9 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -72,6 +72,8 @@ class MainWindow : public QMainWindow void ConnectActions(); void ClearProgress(); void DisableAllButtons(); + void EnableConnectButton(); + void EnableDisconnectButton(); void InitActions(); void ShowStatusMessage(const QString& message); void SetFirmwareList(const QJsonArray& product_info); diff --git a/serial_port.cpp b/serial_port.cpp index c2b92bc..1773a28 100755 --- a/serial_port.cpp +++ b/serial_port.cpp @@ -54,6 +54,7 @@ SerialPort::SerialPort() { connect(this, &communication::SerialPort::readyRead, this, &communication::SerialPort::ReadyRead); } + SerialPort::~SerialPort() = default; void SerialPort::ReadyRead() @@ -88,7 +89,6 @@ void SerialPort::WaitForReadyRead(int timeout) } } - void SerialPort::CloseConn() { if (isOpen()) {