diff options
author | Andre Hartmann <aha_1980@gmx.de> | 2020-02-26 13:57:11 +0100 |
---|---|---|
committer | André Hartmann <aha_1980@gmx.de> | 2020-02-27 09:59:34 +0000 |
commit | b63877157c2c9681ced1efbfefe1d2d1debf812e (patch) | |
tree | fb28b028f839cac311f2a7572374b74added86fe | |
parent | 245f9f299a3503fa9acc54517fa9bd541366d7cc (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.cpp | 55 | ||||
-rw-r--r-- | examples/serialbus/can/mainwindow.h | 1 |
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); |