summaryrefslogtreecommitdiffstats
path: root/homescreen/src
diff options
context:
space:
mode:
authorLoïc Collignon <loic.collignon@iot.bzh>2018-12-19 15:30:09 +0100
committerLoïc Collignon [ IoT.bzh ] <loic.collignon@iot.bzh>2018-12-19 15:50:33 +0000
commit3229c695fc52e22e773cef89a835915c0bb6d90b (patch)
tree7b0b4ae96bf8dcedb4fa19c6669abc3944ecfa5b /homescreen/src
parent4667d93a852d66a57a2d7d26957c3aab6845756e (diff)
Bind the slider volume to the 4a active role
4a now expose an active role, which is the opened role with the higher priority. This binds the slider to the active role. Bug: 1313 Change-Id: I73766163fc0b8ef1e6b70e9c13e28d3642be858a Signed-off-by: Loïc Collignon <loic.collignon@iot.bzh>
Diffstat (limited to 'homescreen/src')
-rw-r--r--homescreen/src/main.cpp1
-rw-r--r--homescreen/src/mastervolume.cpp83
-rw-r--r--homescreen/src/mastervolume.h51
3 files changed, 104 insertions, 31 deletions
diff --git a/homescreen/src/main.cpp b/homescreen/src/main.cpp
index 8ecfd68..939577f 100644
--- a/homescreen/src/main.cpp
+++ b/homescreen/src/main.cpp
@@ -134,6 +134,7 @@ int main(int argc, char *argv[])
// mail.qml loading
QQmlApplicationEngine engine;
+ engine.rootContext()->setContextProperty("bindingAddress", bindingAddress);
engine.rootContext()->setContextProperty("layoutHandler", layoutHandler);
engine.rootContext()->setContextProperty("homescreenHandler", homescreenHandler);
engine.rootContext()->setContextProperty("launcher", launcher);
diff --git a/homescreen/src/mastervolume.cpp b/homescreen/src/mastervolume.cpp
index 9fb92a9..35b47fc 100644
--- a/homescreen/src/mastervolume.cpp
+++ b/homescreen/src/mastervolume.cpp
@@ -15,17 +15,86 @@
*/
#include "mastervolume.h"
+#include <QJsonObject>
+#include <QTimer>
+#include <QtDebug>
-void MasterVolume::setVolume(int volume)
+MasterVolume::MasterVolume(QObject* parent)
+ : QObject(parent)
+ , m_volume{50}
{
- int volume_delta = volume - m_volume;
- m_volume = volume;
- emit sliderVolumeChanged(volume_delta);
+ connect(&m_client, SIGNAL(connected()), this, SLOT(onClientConnected()));
+ connect(&m_client, SIGNAL(disconnected()), this, SLOT(onClientDisconnected()));
+ connect(&m_client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onClientError(QAbstractSocket::SocketError)));
+ connect(&m_client, SIGNAL(eventReceived(QString, const QJsonValue&)), this, SLOT(onClientEventReceived(QString, const QJsonValue&)));
+}
+
+void MasterVolume::open(const QUrl& url)
+{
+ m_url = url;
+ TryOpen();
+}
+
+qint32 MasterVolume::getVolume() const
+{
+ return m_volume;
+}
+
+void MasterVolume::setVolume(qint32 volume)
+{
+ if (m_volume != volume)
+ {
+ m_volume = volume;
+ QJsonObject arg;
+ arg.insert("action", "volume");
+ arg.insert("value", volume);
+ m_client.call("ahl-4a", "activerole", arg, [](bool, const QJsonValue&) {
+ // Nothing to do, events will update sliders
+ });
+ }
+}
+void MasterVolume::onClientConnected()
+{
+ // Subscribe to 4a events
+ m_client.call("ahl-4a", "subscribe", QJsonValue(), [this](bool r, const QJsonValue&) {
+ if (r) qDebug() << "MasterVolume::onClientConnected - subscribed to 4a events!";
+ else qCritical () << "MasterVolume::onClientConnected - Failed to subscribe to 4a events!";
+ });
+}
+
+void MasterVolume::onClientDisconnected()
+{
+ qDebug() << "MasterVolume::onClientDisconnected!";
+ QTimer::singleShot(1000, this, SLOT(TryOpen()));
+}
+
+void MasterVolume::onClientError(QAbstractSocket::SocketError se)
+{
+ qDebug() << "MasterVolume::onClientError: " << se;
+}
+
+void MasterVolume::onClientEventReceived(QString name, const QJsonValue& data)
+{
+ qDebug() << "MasterVolume::onClientEventReceived[" << name << "]: " << data;
+ if (name == "ahl-4a/volume_changed")
+ {
+ QJsonObject arg = data.toObject();
+ bool active = arg["active"].toBool();
+ if (active)
+ {
+ // QString role = arg["role"].toString();
+ int volume = arg["volume"].toInt();
+ if (m_volume != volume)
+ {
+ m_volume = volume;
+ emit VolumeChanged();
+ }
+ }
+ }
}
-void MasterVolume::changeExternalVolume(int volume)
+void MasterVolume::TryOpen()
{
- m_volume = volume;
- emit volumeChanged();
+ m_client.open(m_url);
}
diff --git a/homescreen/src/mastervolume.h b/homescreen/src/mastervolume.h
index bca6356..e23e8d1 100644
--- a/homescreen/src/mastervolume.h
+++ b/homescreen/src/mastervolume.h
@@ -16,31 +16,34 @@
#include <QtCore/QObject>
#include <QQmlEngine>
+#include "../helpers/qafbwebsocketclient.h"
-class MasterVolume : public QObject
+class MasterVolume
+ : public QObject
{
Q_OBJECT
- Q_PROPERTY (uint32_t volume READ getVolume WRITE setVolume NOTIFY volumeChanged)
-
- public:
- MasterVolume(QObject *parent = 0)
- : QObject(parent), m_volume(32768)
- {
- }
-
- ~MasterVolume() {}
-
- uint32_t getVolume() const { return m_volume; }
- void setVolume(int volume);
-
- public slots:
- void changeExternalVolume(int volume);
-
- signals:
- void volumeChanged(void);
- void sliderVolumeChanged(int volume_delta);
- void externalVolumeChanged(uint32_t volume);
-
- private:
- uint32_t m_volume;
+ Q_PROPERTY (uint32_t volume READ getVolume WRITE setVolume NOTIFY VolumeChanged)
+
+private:
+ QAfbWebsocketClient m_client;
+ QUrl m_url;
+ qint32 m_volume;
+
+public:
+ MasterVolume(QObject* parent = nullptr);
+ ~MasterVolume() = default;
+
+ Q_INVOKABLE void open(const QUrl& url);
+ Q_INVOKABLE qint32 getVolume() const;
+ Q_INVOKABLE void setVolume(qint32 val);
+
+private slots:
+ void onClientConnected();
+ void onClientDisconnected();
+ void onClientError(QAbstractSocket::SocketError se);
+ void onClientEventReceived(QString name, const QJsonValue& data);
+ void TryOpen();
+
+signals:
+ void VolumeChanged();
};