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:
Michael Zanetti 2015-05-28 22:43:38 +02:00
parent 0171b24fb4
commit 6a35dd61e4
2 changed files with 16 additions and 0 deletions

View File

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

View File

@ -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