From 245f9f299a3503fa9acc54517fa9bd541366d7cc Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Wed, 26 Feb 2020 16:44:23 +0100 Subject: Generic(V1): Fix emitting framesReceived when disconnected When one of these plugins was used in the CAN-Example, the frames received slot was still called after disconnecting. That made the example stuck and emitting lots of "Cannot read frame as device is not connected." messages. This is mostly relevant for developers though, as these plugins are not deployed. Change-Id: I675518148f4bf37f11911dd7a0f6423ae18be19d Reviewed-by: Denis Shienkov Reviewed-by: Alex Blasche --- tests/auto/plugins/genericcanbus/dummybackend.cpp | 3 ++- tests/auto/plugins/genericcanbusv1/dummybackendv1.cpp | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/auto/plugins/genericcanbus/dummybackend.cpp b/tests/auto/plugins/genericcanbus/dummybackend.cpp index 83d2480..301e738 100644 --- a/tests/auto/plugins/genericcanbus/dummybackend.cpp +++ b/tests/auto/plugins/genericcanbus/dummybackend.cpp @@ -52,17 +52,18 @@ DummyBackend::DummyBackend() : enqueueReceivedFrames({dummyFrame}); }); - simulateReceivingTimer->start(1000); } bool DummyBackend::open() { + simulateReceivingTimer->start(1000); setState(QCanBusDevice::ConnectedState); return true; } void DummyBackend::close() { + simulateReceivingTimer->stop(); setState(QCanBusDevice::UnconnectedState); } diff --git a/tests/auto/plugins/genericcanbusv1/dummybackendv1.cpp b/tests/auto/plugins/genericcanbusv1/dummybackendv1.cpp index 4d7d9c0..99f7bcd 100644 --- a/tests/auto/plugins/genericcanbusv1/dummybackendv1.cpp +++ b/tests/auto/plugins/genericcanbusv1/dummybackendv1.cpp @@ -52,17 +52,18 @@ DummyBackendV1::DummyBackendV1() : enqueueReceivedFrames({dummyFrame}); }); - simulateReceivingTimer->start(1000); } bool DummyBackendV1::open() { + simulateReceivingTimer->start(1000); setState(QCanBusDevice::ConnectedState); return true; } void DummyBackendV1::close() { + simulateReceivingTimer->stop(); setState(QCanBusDevice::UnconnectedState); } -- cgit v1.2.3 From b63877157c2c9681ced1efbfefe1d2d1debf812e Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Wed, 26 Feb 2020 13:57:11 +0100 Subject: 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 Reviewed-by: Alex Blasche --- examples/serialbus/can/mainwindow.cpp | 55 ++++++++++++++++++++--------------- 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); -- cgit v1.2.3