diff options
Diffstat (limited to 'homescreen/src')
-rw-r--r-- | homescreen/src/main.cpp | 1 | ||||
-rw-r--r-- | homescreen/src/mastervolume.cpp | 83 | ||||
-rw-r--r-- | homescreen/src/mastervolume.h | 51 |
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(); }; |