From 994cadc91fd68d22a2d0753cf2c4fae99ff32519 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Thu, 3 Mar 2022 11:06:18 +0000 Subject: [PATCH] Open/close serial ports in worker thread. Fix for #1153 --- .../gs232controller/gs232controllerworker.cpp | 25 +++++++++++++++---- .../gs232controller/gs232controllerworker.h | 2 ++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/plugins/feature/gs232controller/gs232controllerworker.cpp b/plugins/feature/gs232controller/gs232controllerworker.cpp index cdb18233a..4f9a3d500 100644 --- a/plugins/feature/gs232controller/gs232controllerworker.cpp +++ b/plugins/feature/gs232controller/gs232controllerworker.cpp @@ -45,8 +45,6 @@ GS232ControllerWorker::GS232ControllerWorker() : m_spidStatusSent(false), m_rotCtlDReadAz(false) { - connect(&m_pollTimer, SIGNAL(timeout()), this, SLOT(update())); - m_pollTimer.start(1000); } GS232ControllerWorker::~GS232ControllerWorker() @@ -69,6 +67,15 @@ bool GS232ControllerWorker::startWork() { QMutexLocker mutexLocker(&m_mutex); connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + connect(thread(), SIGNAL(started()), this, SLOT(started())); + connect(thread(), SIGNAL(finished()), this, SLOT(finished())); + m_running = true; + return m_running; +} + +// startWork() is called from main thread. Serial ports on Linux need to be opened/closed on worker thread +void GS232ControllerWorker::started() +{ connect(&m_serialPort, &QSerialPort::readyRead, this, &GS232ControllerWorker::readData); connect(&m_socket, &QTcpSocket::readyRead, this, &GS232ControllerWorker::readData); if (m_settings.m_connection == GS232ControllerSettings::TCP) { @@ -76,21 +83,29 @@ bool GS232ControllerWorker::startWork() } else { m_device = openSerialPort(m_settings); } - m_running = true; - return m_running; + connect(&m_pollTimer, SIGNAL(timeout()), this, SLOT(update())); + m_pollTimer.start(1000); + disconnect(thread(), SIGNAL(started()), this, SLOT(started())); } void GS232ControllerWorker::stopWork() { QMutexLocker mutexLocker(&m_mutex); + disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); +} + +void GS232ControllerWorker::finished() +{ // Close serial port as USB/controller activity can create RFI if (m_device && m_device->isOpen()) { m_device->close(); } - disconnect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); disconnect(&m_serialPort, &QSerialPort::readyRead, this, &GS232ControllerWorker::readData); disconnect(&m_socket, &QTcpSocket::readyRead, this, &GS232ControllerWorker::readData); + m_pollTimer.stop(); + disconnect(&m_pollTimer, SIGNAL(timeout()), this, SLOT(update())); m_running = false; + disconnect(thread(), SIGNAL(finished()), this, SLOT(finished())); } void GS232ControllerWorker::handleInputMessages() diff --git a/plugins/feature/gs232controller/gs232controllerworker.h b/plugins/feature/gs232controller/gs232controllerworker.h index 479b0410b..fae1fe087 100644 --- a/plugins/feature/gs232controller/gs232controllerworker.h +++ b/plugins/feature/gs232controller/gs232controllerworker.h @@ -95,6 +95,8 @@ private: void setAzimuthElevation(float azimuth, float elevation); private slots: + void started(); + void finished(); void handleInputMessages(); void readData(); void update();