Denon: fixed reconnection

master
bernhard.trinnes 2020-03-25 23:28:55 +01:00
parent 538e59f68b
commit 7900905922
3 changed files with 44 additions and 20 deletions

View File

@ -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();

View File

@ -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();

View File

@ -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())) {