Denon: fixed reconnection
This commit is contained in:
parent
538e59f68b
commit
7900905922
@ -46,10 +46,15 @@ Heos::Heos(const QHostAddress &hostAddress, QObject *parent) :
|
|||||||
{
|
{
|
||||||
m_socket = new QTcpSocket(this);
|
m_socket = new QTcpSocket(this);
|
||||||
|
|
||||||
connect(m_socket, &QTcpSocket::connected, this, &Heos::onConnected);
|
connect(m_socket, &QTcpSocket::stateChanged, this, &Heos::onStateChanged);
|
||||||
connect(m_socket, &QTcpSocket::disconnected, this, &Heos::onDisconnected);
|
|
||||||
connect(m_socket, &QTcpSocket::readyRead, this, &Heos::readData);
|
connect(m_socket, &QTcpSocket::readyRead, this, &Heos::readData);
|
||||||
connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
|
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()
|
Heos::~Heos()
|
||||||
@ -60,7 +65,7 @@ Heos::~Heos()
|
|||||||
void Heos::connectDevice()
|
void Heos::connectDevice()
|
||||||
{
|
{
|
||||||
if (m_socket->state() == QAbstractSocket::ConnectingState) {
|
if (m_socket->state() == QAbstractSocket::ConnectingState) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_socket->connectToHost(m_hostAddress, 1255);
|
m_socket->connectToHost(m_hostAddress, 1255);
|
||||||
}
|
}
|
||||||
@ -527,6 +532,26 @@ quint32 Heos::playUrl(int playerId, const QUrl &mediaUrl)
|
|||||||
return sequence;
|
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 Heos::addContainerToQueue(int playerId, const QString &sourceId, const QString &containerId, ADD_CRITERIA addCriteria)
|
||||||
{
|
{
|
||||||
quint32 sequence = createRandomNumber();
|
quint32 sequence = createRandomNumber();
|
||||||
@ -544,21 +569,6 @@ quint32 Heos::addContainerToQueue(int playerId, const QString &sourceId, const Q
|
|||||||
return sequence;
|
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)
|
void Heos::onError(QAbstractSocket::SocketError socketError)
|
||||||
{
|
{
|
||||||
qCWarning(dcDenon) << "socket error:" << socketError << m_socket->errorString();
|
qCWarning(dcDenon) << "socket error:" << socketError << m_socket->errorString();
|
||||||
|
|||||||
@ -124,6 +124,7 @@ private:
|
|||||||
bool m_eventRegistered = false;
|
bool m_eventRegistered = false;
|
||||||
QHostAddress m_hostAddress;
|
QHostAddress m_hostAddress;
|
||||||
QTcpSocket *m_socket = nullptr;
|
QTcpSocket *m_socket = nullptr;
|
||||||
|
QTimer *m_reconnectTimer = nullptr;
|
||||||
void setConnected(const bool &connected);
|
void setConnected(const bool &connected);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@ -162,8 +163,7 @@ signals:
|
|||||||
void userChanged(bool signedIn, const QString &userName);
|
void userChanged(bool signedIn, const QString &userName);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onConnected();
|
void onStateChanged(QAbstractSocket::SocketState state);
|
||||||
void onDisconnected();
|
|
||||||
void onError(QAbstractSocket::SocketError socketError);
|
void onError(QAbstractSocket::SocketError socketError);
|
||||||
void readData();
|
void readData();
|
||||||
|
|
||||||
|
|||||||
@ -554,6 +554,20 @@ void IntegrationPluginDenon::onHeosConnectionChanged(bool status)
|
|||||||
|
|
||||||
if (thing->thingClassId() == heosThingClassId) {
|
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);
|
thing->setStateValue(heosConnectedStateTypeId, status);
|
||||||
// update connection status for all child things
|
// update connection status for all child things
|
||||||
foreach (Thing *playerThing, myThings().filterByParentId(thing->id())) {
|
foreach (Thing *playerThing, myThings().filterByParentId(thing->id())) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user