From 7900905922a3ed1805c5d2b9d677577c4cc857a7 Mon Sep 17 00:00:00 2001 From: "bernhard.trinnes" Date: Wed, 25 Mar 2020 23:28:55 +0100 Subject: [PATCH] Denon: fixed reconnection --- denon/heos.cpp | 46 +++++++++++++++++++------------- denon/heos.h | 4 +-- denon/integrationplugindenon.cpp | 14 ++++++++++ 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/denon/heos.cpp b/denon/heos.cpp index 8bc981b6..65902612 100644 --- a/denon/heos.cpp +++ b/denon/heos.cpp @@ -46,10 +46,15 @@ Heos::Heos(const QHostAddress &hostAddress, QObject *parent) : { m_socket = new QTcpSocket(this); - connect(m_socket, &QTcpSocket::connected, this, &Heos::onConnected); - connect(m_socket, &QTcpSocket::disconnected, this, &Heos::onDisconnected); + connect(m_socket, &QTcpSocket::stateChanged, this, &Heos::onStateChanged); connect(m_socket, &QTcpSocket::readyRead, this, &Heos::readData); connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); + + m_reconnectTimer = new QTimer(this); + m_reconnectTimer->setInterval(5000); + connect(m_reconnectTimer, &QTimer::timeout, this, [this]{ + connectDevice(); + }); } Heos::~Heos() @@ -60,7 +65,7 @@ Heos::~Heos() void Heos::connectDevice() { if (m_socket->state() == QAbstractSocket::ConnectingState) { - return; + return; } m_socket->connectToHost(m_hostAddress, 1255); } @@ -527,6 +532,26 @@ quint32 Heos::playUrl(int playerId, const QUrl &mediaUrl) return sequence; } +void Heos::onStateChanged(QAbstractSocket::SocketState state) +{ + switch (state) { + case QAbstractSocket::ConnectedState: + qCDebug(dcDenon()) << "connected successfully to" << m_hostAddress.toString(); + m_reconnectTimer->stop(); + emit connectionStatusChanged(true); + break; + case QAbstractSocket::ConnectingState: + break; + case QAbstractSocket::UnconnectedState: + m_reconnectTimer->start(); + qCDebug(dcDenon()) << "Disconnected from" << m_hostAddress.toString() << "try reconnecting in 5 seconds"; + emit connectionStatusChanged(false); + break; + default: + emit connectionStatusChanged(false); + } +} + quint32 Heos::addContainerToQueue(int playerId, const QString &sourceId, const QString &containerId, ADD_CRITERIA addCriteria) { quint32 sequence = createRandomNumber(); @@ -544,21 +569,6 @@ quint32 Heos::addContainerToQueue(int playerId, const QString &sourceId, const Q return sequence; } -void Heos::onConnected() -{ - qCDebug(dcDenon()) << "connected successfully to" << m_hostAddress.toString(); - emit connectionStatusChanged(true); -} - -void Heos::onDisconnected() -{ - qCDebug(dcDenon()) << "Disconnected from" << m_hostAddress.toString() << "try reconnecting in 5 seconds"; - QTimer::singleShot(5000, this, [this](){ - connectDevice(); - }); - emit connectionStatusChanged(false); -} - void Heos::onError(QAbstractSocket::SocketError socketError) { qCWarning(dcDenon) << "socket error:" << socketError << m_socket->errorString(); diff --git a/denon/heos.h b/denon/heos.h index 42d19227..310aa17f 100644 --- a/denon/heos.h +++ b/denon/heos.h @@ -124,6 +124,7 @@ private: bool m_eventRegistered = false; QHostAddress m_hostAddress; QTcpSocket *m_socket = nullptr; + QTimer *m_reconnectTimer = nullptr; void setConnected(const bool &connected); signals: @@ -162,8 +163,7 @@ signals: void userChanged(bool signedIn, const QString &userName); private slots: - void onConnected(); - void onDisconnected(); + void onStateChanged(QAbstractSocket::SocketState state); void onError(QAbstractSocket::SocketError socketError); void readData(); diff --git a/denon/integrationplugindenon.cpp b/denon/integrationplugindenon.cpp index 367cdb97..cc4581e0 100644 --- a/denon/integrationplugindenon.cpp +++ b/denon/integrationplugindenon.cpp @@ -554,6 +554,20 @@ void IntegrationPluginDenon::onHeosConnectionChanged(bool status) if (thing->thingClassId() == heosThingClassId) { + if (pluginStorage()->childGroups().contains(thing->id().toString())) { + pluginStorage()->beginGroup(thing->id().toString()); + QString username = pluginStorage()->value("username").toString(); + QString password = pluginStorage()->value("password").toString(); + pluginStorage()->endGroup(); + heos->setUserAccount(username, password); + } else { + qCWarning(dcDenon()) << "Plugin storage doesn't contain this deviceId"; + } + + if (!status) { + thing->setStateValue(heosLoggedInStateTypeId, false); + thing->setStateValue(heosUserDisplayNameStateTypeId, ""); + } thing->setStateValue(heosConnectedStateTypeId, status); // update connection status for all child things foreach (Thing *playerThing, myThings().filterByParentId(thing->id())) {