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_xyDirty(false)
|
||||
{
|
||||
m_busyTimeout.setSingleShot(true);
|
||||
m_busyTimeout.setInterval(2000);
|
||||
connect(&m_busyTimeout, &QTimer::timeout, [this]{ setStateFinished(m_busyStateChangeId, QVariant()); });
|
||||
}
|
||||
|
||||
QHostAddress Light::ip() const
|
||||
@ -140,6 +143,7 @@ void Light::setBri(quint8 bri)
|
||||
params.insert("on", true);
|
||||
}
|
||||
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
||||
m_busyTimeout.start();
|
||||
} else {
|
||||
m_dirtyBri = bri;
|
||||
m_briDirty = true;
|
||||
@ -196,6 +200,7 @@ void Light::setColor(const QColor &color)
|
||||
|
||||
params.insert("on", true);
|
||||
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
||||
m_busyTimeout.start();
|
||||
} else {
|
||||
m_dirtyHue = hue;
|
||||
m_hueDirty = true;
|
||||
@ -229,6 +234,7 @@ void Light::setCt(quint16 ct)
|
||||
params.insert("ct", ct);
|
||||
params.insert("on", true);
|
||||
m_busyStateChangeId = m_bridge->put(m_ip, m_username, "lights/" + QString::number(m_id) + "/state", params, this, "setStateFinished");
|
||||
m_busyTimeout.start();
|
||||
} else {
|
||||
m_dirtyCt = ct;
|
||||
m_ctDirty = true;
|
||||
@ -371,6 +377,7 @@ void Light::setStateFinished(int id, const QVariant &response)
|
||||
emit stateChanged();
|
||||
|
||||
if (m_busyStateChangeId == id) {
|
||||
m_busyTimeout.stop();
|
||||
m_busyStateChangeId = -1;
|
||||
if (m_hueDirty || m_satDirty || m_briDirty) {
|
||||
QVariantMap params;
|
||||
@ -392,12 +399,14 @@ void Light::setStateFinished(int id, const QVariant &response)
|
||||
m_sat = m_dirtySat;
|
||||
|
||||
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) {
|
||||
QVariantMap params;
|
||||
params.insert("ct", m_dirtyCt);
|
||||
m_ctDirty = false;
|
||||
|
||||
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) {
|
||||
QVariantMap params;
|
||||
QVariantList xyList;
|
||||
@ -406,6 +415,7 @@ void Light::setStateFinished(int id, const QVariant &response)
|
||||
m_xyDirty = false;
|
||||
|
||||
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 <QColor>
|
||||
#include <QHostAddress>
|
||||
#include <QTimer>
|
||||
|
||||
class HueBridgeConnection;
|
||||
|
||||
@ -128,6 +129,11 @@ private:
|
||||
quint16 m_dirtyCt;
|
||||
bool m_xyDirty;
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user