workaround responses for hue getting lost
missing responses caused the plugin to hang. This workaround assumes a missing response after 2 secs and proceeds with sending.
This commit is contained in:
parent
0171b24fb4
commit
6a35dd61e4
@ -40,6 +40,9 @@ Light::Light(const QHostAddress &ip, const QString &username, int id, QObject *p
|
|||||||
m_ctDirty(false),
|
m_ctDirty(false),
|
||||||
m_xyDirty(false)
|
m_xyDirty(false)
|
||||||
{
|
{
|
||||||
|
m_busyTimeout.setSingleShot(true);
|
||||||
|
m_busyTimeout.setInterval(2000);
|
||||||
|
connect(&m_busyTimeout, &QTimer::timeout, [this]{ setStateFinished(m_busyStateChangeId, QVariant()); });
|
||||||
}
|
}
|
||||||
|
|
||||||
QHostAddress Light::ip() const
|
QHostAddress Light::ip() const
|
||||||
@ -140,6 +143,7 @@ void Light::setBri(quint8 bri)
|
|||||||
params.insert("on", true);
|
params.insert("on", true);
|
||||||
}
|
}
|
||||||
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
||||||
|
m_busyTimeout.start();
|
||||||
} else {
|
} else {
|
||||||
m_dirtyBri = bri;
|
m_dirtyBri = bri;
|
||||||
m_briDirty = true;
|
m_briDirty = true;
|
||||||
@ -196,6 +200,7 @@ void Light::setColor(const QColor &color)
|
|||||||
|
|
||||||
params.insert("on", true);
|
params.insert("on", true);
|
||||||
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
||||||
|
m_busyTimeout.start();
|
||||||
} else {
|
} else {
|
||||||
m_dirtyHue = hue;
|
m_dirtyHue = hue;
|
||||||
m_hueDirty = true;
|
m_hueDirty = true;
|
||||||
@ -229,6 +234,7 @@ void Light::setCt(quint16 ct)
|
|||||||
params.insert("ct", ct);
|
params.insert("ct", ct);
|
||||||
params.insert("on", true);
|
params.insert("on", true);
|
||||||
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
||||||
|
m_busyTimeout.start();
|
||||||
} else {
|
} else {
|
||||||
m_dirtyCt = ct;
|
m_dirtyCt = ct;
|
||||||
m_ctDirty = true;
|
m_ctDirty = true;
|
||||||
@ -371,6 +377,7 @@ void Light::setStateFinished(int id, const QVariant &response)
|
|||||||
emit stateChanged();
|
emit stateChanged();
|
||||||
|
|
||||||
if (m_busyStateChangeId == id) {
|
if (m_busyStateChangeId == id) {
|
||||||
|
m_busyTimeout.stop();
|
||||||
m_busyStateChangeId = -1;
|
m_busyStateChangeId = -1;
|
||||||
if (m_hueDirty || m_satDirty || m_briDirty) {
|
if (m_hueDirty || m_satDirty || m_briDirty) {
|
||||||
QVariantMap params;
|
QVariantMap params;
|
||||||
@ -392,12 +399,14 @@ void Light::setStateFinished(int id, const QVariant &response)
|
|||||||
m_sat = m_dirtySat;
|
m_sat = m_dirtySat;
|
||||||
|
|
||||||
m_busyStateChangeId = m_bridge->put(QHostAddress(m_ip), m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
m_busyStateChangeId = m_bridge->put(QHostAddress(m_ip), m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
||||||
|
m_busyTimeout.start();
|
||||||
} else if(m_ctDirty) {
|
} else if(m_ctDirty) {
|
||||||
QVariantMap params;
|
QVariantMap params;
|
||||||
params.insert("ct", m_dirtyCt);
|
params.insert("ct", m_dirtyCt);
|
||||||
m_ctDirty = false;
|
m_ctDirty = false;
|
||||||
|
|
||||||
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
||||||
|
m_busyTimeout.start();
|
||||||
} else if (m_xyDirty) {
|
} else if (m_xyDirty) {
|
||||||
QVariantMap params;
|
QVariantMap params;
|
||||||
QVariantList xyList;
|
QVariantList xyList;
|
||||||
@ -406,6 +415,7 @@ void Light::setStateFinished(int id, const QVariant &response)
|
|||||||
m_xyDirty = false;
|
m_xyDirty = false;
|
||||||
|
|
||||||
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
||||||
|
m_busyTimeout.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,6 +25,7 @@
|
|||||||
#include <QPointF>
|
#include <QPointF>
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
class HueBridgeConnection;
|
class HueBridgeConnection;
|
||||||
|
|
||||||
@ -128,6 +129,11 @@ private:
|
|||||||
quint16 m_dirtyCt;
|
quint16 m_dirtyCt;
|
||||||
bool m_xyDirty;
|
bool m_xyDirty;
|
||||||
QPointF m_dirtyXy;
|
QPointF m_dirtyXy;
|
||||||
|
|
||||||
|
// FIXME: This is needed as sometimes we don't get a reply from the bridge
|
||||||
|
// Can't use guhtimer right now as that triggers in intervals that aren't
|
||||||
|
// related to our sending. Perhaps we should create a guhtimeout thing?
|
||||||
|
QTimer m_busyTimeout;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user