diff options
author | Scott Murray <scott.murray@konsulko.com> | 2022-06-16 00:43:21 -0400 |
---|---|---|
committer | Scott Murray <scott.murray@konsulko.com> | 2022-07-04 21:23:25 +0000 |
commit | b2cb90d9f5e3e87e963e42f4320edcfad8391f50 (patch) | |
tree | 1b34e6c1cfbaac24e22a56f06daac59ee8327ca6 | |
parent | 607f2b680891c25b51917d5b7f20bc3a3ffc6a65 (diff) |
Reimplement HVAC API with VIS signals
Reimplement the HVAC interface with use of VIS signals. There is
some impedance mismatching done between VIS signal notifications
and the API Qt signals to avoid changing the clients signficantly
for now. If the Qt demo lifetime is extended, this may be revisited
to either switch to directly using the VehicleSignals interface or
doing a more granular mapping that works better with the VSS schema
and VIS.
Bug-AGL: SPEC-4409
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Change-Id: I6f1763836945600d84d6f70faea40eaa7d45ce27
(cherry picked from commit 01a723bf51a286b4a6b984a6115c2835d9e99b73)
-rw-r--r-- | hvac/CMakeLists.txt | 2 | ||||
-rw-r--r-- | hvac/hvac.cpp | 83 | ||||
-rw-r--r-- | hvac/hvac.h | 29 |
3 files changed, 88 insertions, 26 deletions
diff --git a/hvac/CMakeLists.txt b/hvac/CMakeLists.txt index dd0ceea..ba62be7 100644 --- a/hvac/CMakeLists.txt +++ b/hvac/CMakeLists.txt @@ -8,7 +8,7 @@ add_library(qtappfw-hvac SHARED hvac.cpp) target_include_directories(qtappfw-hvac PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}") target_include_directories(qtappfw-hvac PUBLIC "${CMAKE_INSTALL_INCLUDEDIR}") -target_link_libraries(qtappfw-hvac Qt5::Core) +target_link_libraries(qtappfw-hvac Qt5::Core qtappfw-vehicle-signals) set_target_properties(qtappfw-hvac PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1 diff --git a/hvac/hvac.cpp b/hvac/hvac.cpp index bb5fc10..246fa63 100644 --- a/hvac/hvac.cpp +++ b/hvac/hvac.cpp @@ -15,40 +15,93 @@ */ #include <QDebug> -#include <QMetaEnum> -#include <QMimeDatabase> -#include <QtQml/QQmlEngine> #include "hvac.h" +#include "vehiclesignals.h" // TODO: don't duplicate defaults from HVAC service here -HVAC::HVAC (QObject * parent) : - QObject(parent), - m_fanspeed(0), - m_temp_left_zone(21), - m_temp_right_zone(21) +HVAC::HVAC(VehicleSignals *vs, QObject * parent) : + QObject(parent), + m_vs(vs), + m_connected(false), + m_fanspeed(0), + m_temp_left_zone(21), + m_temp_right_zone(21) { -} + QObject::connect(m_vs, &VehicleSignals::connected, this, &HVAC::onConnected); + QObject::connect(m_vs, &VehicleSignals::authorized, this, &HVAC::onAuthorized); + QObject::connect(m_vs, &VehicleSignals::disconnected, this, &HVAC::onDisconnected); -HVAC::~HVAC() -{ + if (m_vs) + m_vs->connect(); } -void HVAC::control(QString verb, QString field, int value) +HVAC::~HVAC() { + delete m_vs; } void HVAC::set_fanspeed(int speed) { - emit fanSpeedChanged(speed); + if (!(m_vs && m_connected)) + return; + + // Scale incoming 0-255 speed to 0-100 to match VSS signal + double value = (speed % 256) * 100.0 / 255.0; + m_vs->set("Vehicle.Cabin.HVAC.Station.Row1.Left.FanSpeed", QString::number((int) (value + 0.5))); + emit fanSpeedChanged(speed); } void HVAC::set_temp_left_zone(int temp) { - emit leftTemperatureChanged(temp); + if (!(m_vs && m_connected)) + return; + + // Make sure value is within VSS signal range + int value = temp; + if (value > 50) + value = 50; + else if (value < -50) + value = -50; + m_vs->set("Vehicle.Cabin.HVAC.Station.Row1.Left.Temperature", QString::number(value)); + emit leftTemperatureChanged(temp); } void HVAC::set_temp_right_zone(int temp) { - emit rightTemperatureChanged(temp); + if (!(m_vs && m_connected)) + return; + + // Make sure value is within VSS signal range + int value = temp; + if (value > 50) + value = 50; + else if (value < -50) + value = -50; + m_vs->set("Vehicle.Cabin.HVAC.Station.Row1.Right.Temperature", QString::number(value)); + emit rightTemperatureChanged(temp); +} + +void HVAC::onConnected() +{ + if (!m_vs) + return; + + m_vs->authorize(); +} + +void HVAC::onAuthorized() +{ + if (!m_vs) + return; + + // Could subscribe and connect notification signal here to monitor + // external updates... + + m_connected = true; +} + +void HVAC::onDisconnected() +{ + m_connected = false; } diff --git a/hvac/hvac.h b/hvac/hvac.h index 1a8b233..34530fa 100644 --- a/hvac/hvac.h +++ b/hvac/hvac.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Konsulko Group + * Copyright (C) 2020-2022 Konsulko Group * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,25 +23,35 @@ #include <QtQml/QQmlContext> #include <QtQml/QQmlListProperty> +class VehicleSignals; + class HVAC : public QObject { - Q_OBJECT + Q_OBJECT - Q_PROPERTY(int fanSpeed READ get_fanspeed WRITE set_fanspeed NOTIFY fanSpeedChanged) - Q_PROPERTY(int leftTemperature READ get_temp_left_zone WRITE set_temp_left_zone NOTIFY leftTemperatureChanged) - Q_PROPERTY(int rightTemperature READ get_temp_right_zone WRITE set_temp_right_zone NOTIFY rightTemperatureChanged) + Q_PROPERTY(int fanSpeed READ get_fanspeed WRITE set_fanspeed NOTIFY fanSpeedChanged) + Q_PROPERTY(int leftTemperature READ get_temp_left_zone WRITE set_temp_left_zone NOTIFY leftTemperatureChanged) + Q_PROPERTY(int rightTemperature READ get_temp_right_zone WRITE set_temp_right_zone NOTIFY rightTemperatureChanged) - public: - explicit HVAC(QObject * parent = Q_NULLPTR); +public: + explicit HVAC(VehicleSignals *vs, QObject * parent = Q_NULLPTR); virtual ~HVAC(); - signals: +signals: void fanSpeedChanged(int fanSpeed); void leftTemperatureChanged(int temp); void rightTemperatureChanged(int temp); void languageChanged(QString language); - private: +private slots: + void onConnected(); + void onAuthorized(); + void onDisconnected(); + +private: + VehicleSignals *m_vs; + bool m_connected; + int m_fanspeed; int m_temp_left_zone; int m_temp_right_zone; @@ -50,7 +60,6 @@ class HVAC : public QObject int get_temp_left_zone() const { return m_temp_left_zone; }; int get_temp_right_zone() const { return m_temp_right_zone; }; - void control(QString verb, QString field, int value); void set_fanspeed(int speed); void set_temp_left_zone(int temp); void set_temp_right_zone(int temp); |