Skip to content

Commit

Permalink
Automatically detect serial port error
Browse files Browse the repository at this point in the history
- automatically detect serial port error
- in case of the error, close connection, disable all buttons except Connect button
- improvements: automatically detect USB unplug
  • Loading branch information
jciberlin committed Apr 26, 2022
1 parent 7ae3ac2 commit 4778409
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 7 deletions.
16 changes: 15 additions & 1 deletion flasher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -397,7 +399,6 @@ void Flasher::LoopHandler()
emit ClearProgress();

if (flashing_info.success) {
serial_port_.CloseConn();
SetState(FlasherStates::kTryToConnect);
} else {
emit ClearStatusMsg();
Expand Down Expand Up @@ -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_;
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions flasher.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,13 +134,16 @@ 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);

public slots:
void LoopHandler();
void FileDownloaded();
void DownloadProgress(const qint64& bytes_received, const qint64& bytes_total);
void HandleSerialPortError(QSerialPort::SerialPortError error);

private:
QString board_id_;
Expand Down
23 changes: 18 additions & 5 deletions mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ MainWindow::MainWindow(std::shared_ptr<flasher::Flasher> 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);
Expand Down Expand Up @@ -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);
});
Expand All @@ -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();
}
Expand Down
2 changes: 2 additions & 0 deletions mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion serial_port.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ SerialPort::SerialPort()
{
connect(this, &communication::SerialPort::readyRead, this, &communication::SerialPort::ReadyRead);
}

SerialPort::~SerialPort() = default;

void SerialPort::ReadyRead()
Expand Down Expand Up @@ -88,7 +89,6 @@ void SerialPort::WaitForReadyRead(int timeout)
}
}


void SerialPort::CloseConn()
{
if (isOpen()) {
Expand Down

0 comments on commit 4778409

Please sign in to comment.