refactor: Modernize Qt connections (#914)

This commit is contained in:
Murat Seker 2020-08-02 22:32:00 +02:00 committed by GitHub
parent d1a2b77ce3
commit 031b9a6b7c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 86 additions and 77 deletions

View File

@ -68,7 +68,7 @@ public:
/// ///
/// free all alocated objects, should be called only from constructor or before restarting hyperion /// free all alocated objects, should be called only from constructor or before restarting hyperion
/// ///
void freeObjects(bool emitCloseSignal=false); void freeObjects();
ImageProcessor* getImageProcessor() const { return _imageProcessor; } ImageProcessor* getImageProcessor() const { return _imageProcessor; }
@ -398,8 +398,6 @@ signals:
/// ///
void currentImage(const Image<ColorRgb> & image); void currentImage(const Image<ColorRgb> & image);
void closing();
/// Signal which is emitted, when a new json message should be forwarded /// Signal which is emitted, when a new json message should be forwarded
void forwardJsonMessage(QJsonObject); void forwardJsonMessage(QJsonObject);

View File

@ -1,13 +1,14 @@
#ifndef SSDPDISCOVER_H #ifndef SSDPDISCOVER_H
#define SSDPDISCOVER_H #define SSDPDISCOVER_H
#include <utils/Logger.h>
#include <QHostAddress> #include <QHostAddress>
#include <QMultiMap>
#include <QUrl> #include <QUrl>
#include <QRegularExpression> #include <QRegularExpression>
#include <chrono> #include <chrono>
class Logger;
class QUdpSocket; class QUdpSocket;
enum class searchType{ enum class searchType{
@ -202,7 +203,7 @@ private:
int _ssdpMaxWaitResponseTime; int _ssdpMaxWaitResponseTime;
int _ssdpTimeout; int _ssdpTimeout;
QMap<QString, SSDPService> _services; QMultiMap<QString, SSDPService> _services;
QStringList _usnList; QStringList _usnList;
QString _searchTarget; QString _searchTarget;

View File

@ -39,8 +39,8 @@ BoblightClientConnection::BoblightClientConnection(Hyperion* hyperion, QTcpSocke
_locale.setNumberOptions(QLocale::OmitGroupSeparator | QLocale::RejectGroupSeparator); _locale.setNumberOptions(QLocale::OmitGroupSeparator | QLocale::RejectGroupSeparator);
// connect internal signals and slots // connect internal signals and slots
connect(_socket, SIGNAL(disconnected()), this, SLOT(socketClosed())); connect(_socket, &QTcpSocket::disconnected, this, &BoblightClientConnection::socketClosed);
connect(_socket, SIGNAL(readyRead()), this, SLOT(readData())); connect(_socket, &QTcpSocket::readyRead, this, &BoblightClientConnection::readData);
} }
BoblightClientConnection::~BoblightClientConnection() BoblightClientConnection::~BoblightClientConnection()

View File

@ -28,9 +28,9 @@ BoblightServer::BoblightServer(Hyperion* hyperion,const QJsonDocument& config)
Debug(_log, "Instance created"); Debug(_log, "Instance created");
// listen for component change // listen for component change
connect(_hyperion, SIGNAL(compStateChangeRequest(hyperion::Components,bool)), this, SLOT(compStateChangeRequest(hyperion::Components,bool))); connect(_hyperion, &Hyperion::compStateChangeRequest, this, &BoblightServer::compStateChangeRequest);
// listen new connection signal from server // listen new connection signal from server
connect(_server, SIGNAL(newConnection()), this, SLOT(newConnection())); connect(_server, &QTcpServer::newConnection, this, &BoblightServer::newConnection);
// init // init
handleSettingsUpdate(settings::BOBLSERVER, config); handleSettingsUpdate(settings::BOBLSERVER, config);
@ -101,7 +101,7 @@ void BoblightServer::newConnection()
_openConnections.insert(connection); _openConnections.insert(connection);
// register slot for cleaning up after the connection closed // register slot for cleaning up after the connection closed
connect(connection, SIGNAL(connectionClosed(BoblightClientConnection*)), this, SLOT(closedConnection(BoblightClientConnection*))); connect(connection, &BoblightClientConnection::connectionClosed, this, &BoblightServer::closedConnection);
} }
} }

View File

@ -63,7 +63,7 @@ void BonjourServiceBrowser::browseForServiceType(const QString &serviceType)
else else
{ {
bonjourSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this); bonjourSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this);
connect(bonjourSocket, SIGNAL(activated(int)), this, SLOT(bonjourSocketReadyRead())); connect(bonjourSocket, &QSocketNotifier::activated, this, &BonjourServiceBrowser::bonjourSocketReadyRead);
} }
} }
} }

View File

@ -115,7 +115,7 @@ void BonjourServiceRegister::registerService(const BonjourRecord &record, quint1
else else
{ {
bonjourSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this); bonjourSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this);
connect(bonjourSocket, SIGNAL(activated(int)), this, SLOT(bonjourSocketReadyRead())); connect(bonjourSocket, &QSocketNotifier::activated, this, &BonjourServiceRegister::bonjourSocketReadyRead);
} }
} }
} }

View File

@ -82,7 +82,7 @@ bool BonjourServiceResolver::resolveBonjourRecord(const BonjourRecord &record)
else else
{ {
bonjourSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this); bonjourSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this);
connect(bonjourSocket, SIGNAL(activated(int)), this, SLOT(bonjourSocketReadyRead())); connect(bonjourSocket, &QSocketNotifier::activated, this, &BonjourServiceResolver::bonjourSocketReadyRead);
} }
} }
return true; return true;

View File

@ -32,8 +32,8 @@ EffectEngine::EffectEngine(Hyperion * hyperion)
qRegisterMetaType<hyperion::Components>("hyperion::Components"); qRegisterMetaType<hyperion::Components>("hyperion::Components");
// connect the Hyperion channel clear feedback // connect the Hyperion channel clear feedback
connect(_hyperion, SIGNAL(channelCleared(int)), this, SLOT(channelCleared(int))); connect(_hyperion, &Hyperion::channelCleared, this, &EffectEngine::channelCleared);
connect(_hyperion, SIGNAL(allChannelsCleared()), this, SLOT(allChannelsCleared())); connect(_hyperion, &Hyperion::allChannelsCleared, this, &EffectEngine::allChannelsCleared);
// get notifications about refreshed effect list // get notifications about refreshed effect list
connect(_effectFileHandler, &EffectFileHandler::effectListChanged, this, &EffectEngine::handleUpdatedEffectList); connect(_effectFileHandler, &EffectFileHandler::effectListChanged, this, &EffectEngine::handleUpdatedEffectList);

View File

@ -357,7 +357,7 @@ bool V4L2Grabber::open_device()
// create the notifier for when a new frame is available // create the notifier for when a new frame is available
_streamNotifier = new QSocketNotifier(_fileDescriptor, QSocketNotifier::Read); _streamNotifier = new QSocketNotifier(_fileDescriptor, QSocketNotifier::Read);
_streamNotifier->setEnabled(false); _streamNotifier->setEnabled(false);
connect(_streamNotifier, SIGNAL(activated(int)), this, SLOT(read_frame())); connect(_streamNotifier, &QSocketNotifier::activated, this, &V4L2Grabber::read_frame);
return true; return true;
} }

View File

@ -29,8 +29,8 @@ V4L2Wrapper::V4L2Wrapper(const QString &device,
qRegisterMetaType<Image<ColorRgb>>("Image<ColorRgb>"); qRegisterMetaType<Image<ColorRgb>>("Image<ColorRgb>");
// Handle the image in the captured thread using a direct connection // Handle the image in the captured thread using a direct connection
connect(&_grabber, SIGNAL(newFrame(Image<ColorRgb>)), this, SLOT(newFrame(Image<ColorRgb>)), Qt::DirectConnection); connect(&_grabber, &V4L2Grabber::newFrame, this, &V4L2Wrapper::newFrame, Qt::DirectConnection);
connect(&_grabber, SIGNAL(readError(const char*)), this, SLOT(readError(const char*)), Qt::DirectConnection); connect(&_grabber, &V4L2Grabber::readError, this, &V4L2Wrapper::readError, Qt::DirectConnection);
} }
V4L2Wrapper::~V4L2Wrapper() V4L2Wrapper::~V4L2Wrapper()

View File

@ -39,7 +39,6 @@
// Boblight // Boblight
#include <boblightserver/BoblightServer.h> #include <boblightserver/BoblightServer.h>
Hyperion::Hyperion(const quint8& instance) Hyperion::Hyperion(const quint8& instance)
: QObject() : QObject()
, _instIndex(instance) , _instIndex(instance)
@ -61,7 +60,7 @@ Hyperion::Hyperion(const quint8& instance)
Hyperion::~Hyperion() Hyperion::~Hyperion()
{ {
freeObjects(false); freeObjects();
} }
void Hyperion::start() void Hyperion::start()
@ -152,16 +151,11 @@ void Hyperion::stop()
thread()->wait(); thread()->wait();
} }
void Hyperion::freeObjects(bool emitCloseSignal) void Hyperion::freeObjects()
{ {
// switch off all leds // switch off all leds
clear(-1,true); clear(-1,true);
if (emitCloseSignal)
{
emit closing();
}
// delete components on exit of hyperion core // delete components on exit of hyperion core
delete _boblightServer; delete _boblightServer;
delete _captureCont; delete _captureCont;

View File

@ -80,7 +80,6 @@ SettingsManager::SettingsManager(const quint8& instance, QObject* parent)
saveSettings(dbConfig, true); saveSettings(dbConfig, true);
} }
// validate full dbconfig against schema, on error we need to rewrite entire table // validate full dbconfig against schema, on error we need to rewrite entire table
QJsonSchemaChecker schemaChecker; QJsonSchemaChecker schemaChecker;
schemaChecker.setSchema(schemaJson); schemaChecker.setSchema(schemaJson);

View File

@ -27,7 +27,7 @@ JsonServer::JsonServer(const QJsonDocument& config)
Debug(_log, "Created instance"); Debug(_log, "Created instance");
// Set trigger for incoming connections // Set trigger for incoming connections
connect(_server, SIGNAL(newConnection()), this, SLOT(newConnection())); connect(_server, &QTcpServer::newConnection, this, &JsonServer::newConnection);
// init // init
handleSettingsUpdate(settings::JSONSERVER, config); handleSettingsUpdate(settings::JSONSERVER, config);

View File

@ -245,7 +245,7 @@ int LedDevice::writeBlack(int numberOfBlack)
{ {
// Wait latch time before writing black // Wait latch time before writing black
QEventLoop loop; QEventLoop loop;
QTimer::singleShot( _latchTime_ms, &loop, SLOT( quit() ) ); QTimer::singleShot(_latchTime_ms, &loop, &QEventLoop::quit);
loop.exec(); loop.exec();
} }
rc = write(std::vector<ColorRgb>(static_cast<unsigned long>(_ledCount), ColorRgb::BLACK )); rc = write(std::vector<ColorRgb>(static_cast<unsigned long>(_ledCount), ColorRgb::BLACK ));

View File

@ -128,7 +128,7 @@ httpResponse ProviderRestApi::get(const QUrl &url)
QNetworkReply* reply = _networkManager->get(request); QNetworkReply* reply = _networkManager->get(request);
// Connect requestFinished signal to quit slot of the loop. // Connect requestFinished signal to quit slot of the loop.
QEventLoop loop; QEventLoop loop;
loop.connect(reply, SIGNAL(finished()), SLOT(quit())); loop.connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
// Go into the loop until the request is finished. // Go into the loop until the request is finished.
loop.exec(); loop.exec();
@ -156,7 +156,7 @@ httpResponse ProviderRestApi::put(const QUrl &url, const QString &body)
QNetworkReply* reply = _networkManager->put(request, body.toUtf8()); QNetworkReply* reply = _networkManager->put(request, body.toUtf8());
// Connect requestFinished signal to quit slot of the loop. // Connect requestFinished signal to quit slot of the loop.
QEventLoop loop; QEventLoop loop;
loop.connect(reply, SIGNAL(finished()), SLOT(quit())); loop.connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
// Go into the loop until the request is finished. // Go into the loop until the request is finished.
loop.exec(); loop.exec();

View File

@ -17,8 +17,6 @@ LedDevicePiBlaster::LedDevicePiBlaster(const QJsonObject &deviceConfig)
_activeDeviceType = deviceConfig["type"].toString("UNSPECIFIED").toLower(); _activeDeviceType = deviceConfig["type"].toString("UNSPECIFIED").toLower();
signal(SIGPIPE, SIG_IGN);
// initialise the mapping tables // initialise the mapping tables
// -1 is invalid // -1 is invalid
// z is also meaningless // z is also meaningless

View File

@ -1,5 +1,7 @@
#include "LedDeviceAdalight.h" #include "LedDeviceAdalight.h"
#include <cassert>
LedDeviceAdalight::LedDeviceAdalight(const QJsonObject &deviceConfig) LedDeviceAdalight::LedDeviceAdalight(const QJsonObject &deviceConfig)
: ProviderRs232() : ProviderRs232()
, _headerSize(6) , _headerSize(6)
@ -78,7 +80,9 @@ int LedDeviceAdalight::write(const std::vector<ColorRgb> & ledValues)
} }
else else
{ {
memcpy(_headerSize + _ledBuffer.data(), ledValues.data(), ledValues.size() * 3); assert(_headerSize + ledValues.size() * sizeof(ColorRgb) <= _ledBuffer.size());
memcpy(_headerSize + _ledBuffer.data(), ledValues.data(), ledValues.size() * sizeof(ColorRgb));
} }
int rc = writeBytes(_ledBuffer.size(), _ledBuffer.data()); int rc = writeBytes(_ledBuffer.size(), _ledBuffer.data());

View File

@ -50,7 +50,6 @@ int LedDeviceKarate::write(const std::vector<ColorRgb> &ledValues)
{ {
for (signed iLed=0; iLed< static_cast<int>(_ledCount); iLed++) for (signed iLed=0; iLed< static_cast<int>(_ledCount); iLed++)
{ {
const ColorRgb& rgb = ledValues[iLed]; const ColorRgb& rgb = ledValues[iLed];
_ledBuffer[iLed*3+4] = rgb.green; _ledBuffer[iLed*3+4] = rgb.green;
_ledBuffer[iLed*3+5] = rgb.blue; _ledBuffer[iLed*3+5] = rgb.blue;

View File

@ -12,8 +12,7 @@
// Constants // Constants
constexpr std::chrono::milliseconds WRITE_TIMEOUT{1000}; // device write timeout in ms constexpr std::chrono::milliseconds WRITE_TIMEOUT{1000}; // device write timeout in ms
constexpr std::chrono::milliseconds OPEN_TIMEOUT{5000}; // device open timeout in ms constexpr std::chrono::milliseconds OPEN_TIMEOUT{5000}; // device open timeout in ms
const int MAX_WRITE_TIMEOUTS = 5; // maximum number of allowed timeouts const int MAX_WRITE_TIMEOUTS = 5; // Maximum number of allowed timeouts
const int NUM_POWEROFF_WRITE_BLACK = 2; // Number of write "BLACK" during powering off const int NUM_POWEROFF_WRITE_BLACK = 2; // Number of write "BLACK" during powering off
ProviderRs232::ProviderRs232() ProviderRs232::ProviderRs232()
@ -43,9 +42,9 @@ bool ProviderRs232::init(const QJsonObject &deviceConfig)
// If device name was given as unix /dev/ system-location, get port name // If device name was given as unix /dev/ system-location, get port name
if ( _deviceName.startsWith(QLatin1String("/dev/")) ) if ( _deviceName.startsWith(QLatin1String("/dev/")) )
_deviceName = _deviceName.mid(5); _deviceName = _deviceName.mid(5);
_isAutoDeviceName = _deviceName.toLower() == "auto"; _isAutoDeviceName = _deviceName.toLower() == "auto";
_baudRate_Hz = deviceConfig["rate"].toInt(); _baudRate_Hz = deviceConfig["rate"].toInt();
_delayAfterConnect_ms = deviceConfig["delayAfterConnect"].toInt(1500); _delayAfterConnect_ms = deviceConfig["delayAfterConnect"].toInt(1500);
@ -174,7 +173,7 @@ bool ProviderRs232::tryOpen(const int delayAfterConnect_ms)
// Wait delayAfterConnect_ms before allowing write // Wait delayAfterConnect_ms before allowing write
QEventLoop loop; QEventLoop loop;
QTimer::singleShot( delayAfterConnect_ms, &loop, SLOT( quit() ) ); QTimer::singleShot(delayAfterConnect_ms, &loop, &QEventLoop::quit);
loop.exec(); loop.exec();
Debug(_log, "delayAfterConnect for %d ms - finished", delayAfterConnect_ms); Debug(_log, "delayAfterConnect for %d ms - finished", delayAfterConnect_ms);

View File

@ -1,15 +1,15 @@
#include <ssdp/SSDPDiscover.h> #include <ssdp/SSDPDiscover.h>
#include <utils/Logger.h>
#include <utils/QStringUtils.h> #include <utils/QStringUtils.h>
// Qt includes // Qt includes
#include <QUdpSocket> #include <QUdpSocket>
#include <QUrl> #include <QUrl>
#include <QRegularExpression> #include <QRegularExpression>
#include <QJsonArray>
#include <QJsonObject> #include <QJsonObject>
#include <QtNetwork> #include <QHostInfo>
#include <iostream>
// Constants // Constants
namespace { namespace {

View File

@ -117,8 +117,6 @@ HyperionDaemon::HyperionDaemon(const QString rootPath, QObject *parent, const bo
// spawn all Hyperion instances (non blocking) // spawn all Hyperion instances (non blocking)
_instanceManager->startAll(); _instanceManager->startAll();
//connect(_hyperion,SIGNAL(closing()),this,SLOT(freeObjects())); // TODO for app restart, refactor required
//Cleaning up Hyperion before quit //Cleaning up Hyperion before quit
connect(parent, SIGNAL(aboutToQuit()), this, SLOT(freeObjects())); connect(parent, SIGNAL(aboutToQuit()), this, SLOT(freeObjects()));
@ -175,38 +173,64 @@ void HyperionDaemon::freeObjects()
// destroy network first as a client might want to access hyperion // destroy network first as a client might want to access hyperion
delete _jsonServer; delete _jsonServer;
_jsonServer = nullptr;
auto flatBufferServerThread = _flatBufferServer->thread(); if (_flatBufferServer)
flatBufferServerThread->quit(); {
flatBufferServerThread->wait(); auto flatBufferServerThread = _flatBufferServer->thread();
delete flatBufferServerThread; flatBufferServerThread->quit();
flatBufferServerThread->wait();
delete flatBufferServerThread;
_flatBufferServer = nullptr;
}
auto protoServerThread = _protoServer->thread(); if (_protoServer)
protoServerThread->quit(); {
protoServerThread->wait(); auto protoServerThread = _protoServer->thread();
delete protoServerThread; protoServerThread->quit();
protoServerThread->wait();
delete protoServerThread;
_protoServer = nullptr;
}
//ssdp before webserver //ssdp before webserver
auto ssdpThread = _ssdp->thread(); if (_ssdp)
ssdpThread->quit(); {
ssdpThread->wait(); auto ssdpThread = _ssdp->thread();
delete ssdpThread; ssdpThread->quit();
ssdpThread->wait();
delete ssdpThread;
_ssdp = nullptr;
}
auto webserverThread =_webserver->thread(); if(_webserver)
webserverThread->quit(); {
webserverThread->wait(); auto webserverThread =_webserver->thread();
delete webserverThread; webserverThread->quit();
webserverThread->wait();
delete webserverThread;
_webserver = nullptr;
}
auto sslWebserverThread =_sslWebserver->thread(); if (_sslWebserver)
sslWebserverThread->quit(); {
sslWebserverThread->wait(); auto sslWebserverThread =_sslWebserver->thread();
delete sslWebserverThread; sslWebserverThread->quit();
sslWebserverThread->wait();
delete sslWebserverThread;
_sslWebserver = nullptr;
}
#ifdef ENABLE_CEC #ifdef ENABLE_CEC
_cecHandler->thread()->quit(); if (_cecHandler)
_cecHandler->thread()->wait(1000); {
delete _cecHandler->thread(); auto cecHandlerThread = _cecHandler->thread();
delete _cecHandler; cecHandlerThread->quit();
cecHandlerThread->wait();
delete cecHandlerThread;
delete _cecHandler;
_cecHandler = nullptr;
}
#endif #endif
// stop Hyperions (non blocking) // stop Hyperions (non blocking)
@ -221,19 +245,12 @@ void HyperionDaemon::freeObjects()
delete _v4l2Grabber; delete _v4l2Grabber;
_v4l2Grabber = nullptr; _v4l2Grabber = nullptr;
_cecHandler = nullptr;
_bonjourBrowserWrapper = nullptr; _bonjourBrowserWrapper = nullptr;
_amlGrabber = nullptr; _amlGrabber = nullptr;
_dispmanx = nullptr; _dispmanx = nullptr;
_fbGrabber = nullptr; _fbGrabber = nullptr;
_osxGrabber = nullptr; _osxGrabber = nullptr;
_qtGrabber = nullptr; _qtGrabber = nullptr;
_flatBufferServer = nullptr;
_protoServer = nullptr;
_ssdp = nullptr;
_webserver = nullptr;
_sslWebserver = nullptr;
_jsonServer = nullptr;
} }
void HyperionDaemon::startNetworkServices() void HyperionDaemon::startNetworkServices()