Denon: fixed reconnection
parent
538e59f68b
commit
7900905922
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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())) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue