summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndre Hartmann <aha_1980@gmx.de>2020-02-26 13:57:11 +0100
committerAndré Hartmann <aha_1980@gmx.de>2020-02-27 09:59:34 +0000
commitb63877157c2c9681ced1efbfefe1d2d1debf812e (patch)
treefb28b028f839cac311f2a7572374b74added86fe
parent245f9f299a3503fa9acc54517fa9bd541366d7cc (diff)
CAN-Example: Fix two issues with the status timer
1. Fix a crash when device open fails If opening of m_canDevice failed, m_canDevice is reset to nullptr in line 154. Dereferencing that leads to a crash. 2. Avoid connecting multiple slots to status timer Opening and closing multiple times lead to multiple connections of the lambda slot, which triggered the call to m_canDevice->busStatus() unnecessarily often. The solution is to do the connection only once, and stop the timer when m_canDevice becomes nullptr. It is started again after a successful open. Amends f83587a9978bd212d [ChangeLog][Examples] Fixed a crash in CAN-Example when opening the CAN bus device failed. Change-Id: I4d19f382593fa26fa3b8166f7121e7ff14fd2e74 Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com> Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r--examples/serialbus/can/mainwindow.cpp55
-rw-r--r--examples/serialbus/can/mainwindow.h1
2 files changed, 33 insertions, 23 deletions
diff --git a/examples/serialbus/can/mainwindow.cpp b/examples/serialbus/can/mainwindow.cpp
index a1c10fe..e8d688b 100644
--- a/examples/serialbus/can/mainwindow.cpp
+++ b/examples/serialbus/can/mainwindow.cpp
@@ -75,6 +75,8 @@ MainWindow::MainWindow(QWidget *parent) :
initActionsConnections();
QTimer::singleShot(50, m_connectDialog, &ConnectDialog::show);
+
+ connect(m_busStatusTimer, &QTimer::timeout, this, &MainWindow::busStatus);
}
MainWindow::~MainWindow()
@@ -177,32 +179,39 @@ void MainWindow::connectDevice()
m_status->setText(tr("Plugin: %1, connected to %2")
.arg(p.pluginName).arg(p.deviceInterfaceName));
}
- }
- connect(m_busStatusTimer, &QTimer::timeout, this, [this]() {
- switch (m_canDevice->busStatus()) {
- case QCanBusDevice::CanBusStatus::Good:
- m_ui->busStatus->setText("CAN bus status: Good.");
- break;
- case QCanBusDevice::CanBusStatus::Warning:
- m_ui->busStatus->setText("CAN bus status: Warning.");
- break;
- case QCanBusDevice::CanBusStatus::Error:
- m_ui->busStatus->setText("CAN bus status: Error.");
- break;
- case QCanBusDevice::CanBusStatus::BusOff:
- m_ui->busStatus->setText("CAN bus status: Bus Off.");
- break;
- default:
- m_ui->busStatus->setText("CAN bus status: Unknown.");
- break;
- }
- });
+ if (m_canDevice->hasBusStatus())
+ m_busStatusTimer->start(2000);
+ else
+ m_ui->busStatus->setText(tr("No CAN bus status available."));
+ }
+}
- if (m_canDevice->hasBusStatus())
- m_busStatusTimer->start(2000);
- else
+void MainWindow::busStatus()
+{
+ if (!m_canDevice || !m_canDevice->hasBusStatus()) {
m_ui->busStatus->setText(tr("No CAN bus status available."));
+ m_busStatusTimer->stop();
+ return;
+ }
+
+ switch (m_canDevice->busStatus()) {
+ case QCanBusDevice::CanBusStatus::Good:
+ m_ui->busStatus->setText("CAN bus status: Good.");
+ break;
+ case QCanBusDevice::CanBusStatus::Warning:
+ m_ui->busStatus->setText("CAN bus status: Warning.");
+ break;
+ case QCanBusDevice::CanBusStatus::Error:
+ m_ui->busStatus->setText("CAN bus status: Error.");
+ break;
+ case QCanBusDevice::CanBusStatus::BusOff:
+ m_ui->busStatus->setText("CAN bus status: Bus Off.");
+ break;
+ default:
+ m_ui->busStatus->setText("CAN bus status: Unknown.");
+ break;
+ }
}
void MainWindow::disconnectDevice()
diff --git a/examples/serialbus/can/mainwindow.h b/examples/serialbus/can/mainwindow.h
index 2e910d1..febe72d 100644
--- a/examples/serialbus/can/mainwindow.h
+++ b/examples/serialbus/can/mainwindow.h
@@ -82,6 +82,7 @@ private slots:
void sendFrame(const QCanBusFrame &frame) const;
void processErrors(QCanBusDevice::CanBusError) const;
void connectDevice();
+ void busStatus();
void disconnectDevice();
void processFramesWritten(qint64);