From 747a70c2f549d3eaaed0490a89b8a16f48654916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mi=C5=A1i=C4=87?= Date: Tue, 5 Jul 2022 20:25:53 +0200 Subject: [PATCH 1/2] Update progress bar only on change On Windows frequent updating resulted in lagging GUI --- flasher.cpp | 21 ++++++++++++++++++--- flasher.h | 15 +++++++++++---- mainwindow.cpp | 8 +------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/flasher.cpp b/flasher.cpp index 416eacf..a83dd8f 100755 --- a/flasher.cpp +++ b/flasher.cpp @@ -149,9 +149,24 @@ void Flasher::FileDownloaded() { is_firmware_downloaded_ = true; } +void Flasher::UpdateProgressBar(const quint64& sent_size, const quint64& firmware_size) +{ + int progress_percentage = 0; + if (firmware_size != 0) { + progress_percentage = (100 * sent_size) / firmware_size; + } + + if (last_progress_percentage_ != progress_percentage) { + last_progress_percentage_ = progress_percentage; + qInfo() << sent_size << "/" << firmware_size << "B, " << progress_percentage << "%"; + emit UpdateProgressBarSignal(progress_percentage); + } +} + void Flasher::DownloadProgress(const qint64& bytes_received, const qint64& bytes_total) { timer_.start(); - emit UpdateProgressBar(bytes_received, bytes_total); + UpdateProgressBar(bytes_received, bytes_total); + } void Flasher::LoopHandler() { @@ -477,7 +492,7 @@ FlashingInfo Flasher::Flash() { // Send file in packages for (qint64 packet = 0; packet < num_of_packets; ++packet) { const char *data_position = data_firmware + (packet * kPacketSize); - emit UpdateProgressBar((packet + 1U) * kPacketSize, firmware_size); + UpdateProgressBar((packet + 1U) * kPacketSize, firmware_size); flashing_info.success = SendMessage(data_position, kPacketSize, kSerialTimeoutInMs); if (!flashing_info.success) { @@ -491,7 +506,7 @@ FlashingInfo Flasher::Flash() { const qint64 rest_size = firmware_size % kPacketSize; if (rest_size > 0) { - emit UpdateProgressBar(num_of_packets * kPacketSize + rest_size, firmware_size); + UpdateProgressBar(num_of_packets * kPacketSize + rest_size, firmware_size); flashing_info.success = SendMessage(data_firmware + (num_of_packets * kPacketSize), rest_size, kSerialTimeoutInMs); if (!flashing_info.success) { diff --git a/flasher.h b/flasher.h index f2546cb..b10bcaf 100755 --- a/flasher.h +++ b/flasher.h @@ -159,13 +159,19 @@ class Flasher : public QObject { */ void TryToConnectConsole(); + /*! + * \brief Update progress bar + * \param sent_size - Size that is sent + * \param firmware_size - Firmware size + */ + void UpdateProgressBar(const quint64& sent_size, const quint64& firmware_size); + signals: /*! - * \brief UpdateProgressBar signal - * \param sent_size - Size that is sent - * \param firmware_size - Firmware size + * \brief Update progress bar signal + * \param progress_percentage - value for the update in percentage */ - void UpdateProgressBar(const qint64& sent_size, const qint64& firmware_size); + void UpdateProgressBarSignal(const qint8& progress_percentage); /*! * \brief Clear progress signal @@ -276,6 +282,7 @@ class Flasher : public QObject { QFile config_file_; //!< Configuration file QFile firmware_file_; //!< Firmware file qint64 signature_size_{0}; //!< Firmware signature size + quint8 last_progress_percentage_{0}; //!< Last progress percentage bool is_bootloader_ {false}; //!< Is bootloader detected flag bool is_bootloader_expected_ {false}; //!< Is bootloader expected after board reset bool is_read_protection_enabled_ {false}; //!< Is read protection enabled flag diff --git a/mainwindow.cpp b/mainwindow.cpp index b014035..fd62249 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -51,14 +51,8 @@ MainWindow::MainWindow(std::shared_ptr flasher) : DisableAllButtons(); ClearProgress(); - connect(flasher_.get(), &flasher::Flasher::UpdateProgressBar, this, [&] (const qint64& sent_size, const qint64& firmware_size) { // *NOPAD* - int progress_percentage = 0; - if (firmware_size != 0) { - progress_percentage = (100 * sent_size) / firmware_size; - } - + connect(flasher_.get(), &flasher::Flasher::UpdateProgressBarSignal, this, [&] (const quint8& progress_percentage) { // *NOPAD* ui_.progressBar->setValue(progress_percentage); - qInfo() << sent_size << "/" << firmware_size << "B, " << progress_percentage << "%"; }); connect(flasher_.get(), &flasher::Flasher::ClearProgress, this, &MainWindow::ClearProgress); From d5d83dea94be3103f3c3a0bcd001ead46c13d93c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20Mi=C5=A1i=C4=87?= Date: Tue, 5 Jul 2022 20:41:10 +0200 Subject: [PATCH 2/2] mainwindow: set DirectConnection signal-slot type for update progress --- mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index fd62249..d2e31b0 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -53,7 +53,7 @@ MainWindow::MainWindow(std::shared_ptr flasher) : connect(flasher_.get(), &flasher::Flasher::UpdateProgressBarSignal, this, [&] (const quint8& progress_percentage) { // *NOPAD* ui_.progressBar->setValue(progress_percentage); - }); + }, Qt::DirectConnection); connect(flasher_.get(), &flasher::Flasher::ClearProgress, this, &MainWindow::ClearProgress);