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

View File

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