summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2022-06-16 00:43:21 -0400
committerScott Murray <scott.murray@konsulko.com>2022-07-04 21:23:25 +0000
commitb2cb90d9f5e3e87e963e42f4320edcfad8391f50 (patch)
tree1b34e6c1cfbaac24e22a56f06daac59ee8327ca6
parent607f2b680891c25b51917d5b7f20bc3a3ffc6a65 (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.txt2
-rw-r--r--hvac/hvac.cpp83
-rw-r--r--hvac/hvac.h29
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);