summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorzheng_wenlong <wenlong_zheng@nexty-ele.com>2019-04-08 18:09:20 +0900
committerzheng_wenlong <wenlong_zheng@nexty-ele.com>2019-04-10 09:44:12 +0900
commit36b6338c8c610028daf88033b80a8af3a813e2cd (patch)
treedcf9906feb9277571c3efe2e843749802dfe4598 /app
Add demo3 havc source code for cluster mode. [Patch Set 2]Update LICENSE file. Change-Id: I0dbbf7d35779072f0ca8ad22a89a3158e58dd88e BUG-AGL: SPEC-2261 Signed-off-by: zheng_wenlong <wenlong_zheng@nexty-ele.com>
Diffstat (limited to 'app')
-rw-r--r--app/HVAC.qml176
-rw-r--r--app/HeatDegree.qml55
-rw-r--r--app/SeatHeatButton.qml78
-rw-r--r--app/api/Binding.qml93
-rw-r--r--app/api/MessageId.js22
-rw-r--r--app/app.pri20
-rw-r--r--app/app.pro17
-rw-r--r--app/config.tests/libhomescreen/libhomescreen.cpp8
-rw-r--r--app/config.tests/libhomescreen/libhomescreen.pro5
-rwxr-xr-xapp/config.tests/libhomescreen/pkg-config_wrapper.sh6
-rwxr-xr-xapp/config.tests/qlibwindowmanager/pkg-config_wrapper.sh6
-rw-r--r--app/config.tests/qlibwindowmanager/qlibwindowmanager.cpp8
-rw-r--r--app/config.tests/qlibwindowmanager/qlibwindowmanager.pro5
-rw-r--r--app/hvac.qrc9
-rw-r--r--app/images/HMI_HVAC_Active.svg35
-rw-r--r--app/images/HMI_HVAC_AirDown_Active.svg66
-rw-r--r--app/images/HMI_HVAC_AirDown_Inactive.svg69
-rw-r--r--app/images/HMI_HVAC_AirRight_Active.svg69
-rw-r--r--app/images/HMI_HVAC_AirRight_Inactive.svg72
-rw-r--r--app/images/HMI_HVAC_AirUp_Active.svg74
-rw-r--r--app/images/HMI_HVAC_AirUp_Inactive.svg75
-rw-r--r--app/images/HMI_HVAC_ChairIndicator_OFF.svg76
-rw-r--r--app/images/HMI_HVAC_ChairIndicator_One.svg31
-rw-r--r--app/images/HMI_HVAC_ChairIndicator_Two.svg30
-rw-r--r--app/images/HMI_HVAC_Circulation_Active.svg87
-rw-r--r--app/images/HMI_HVAC_Circulation_Inactive.svg87
-rw-r--r--app/images/HMI_HVAC_Fan_Icon.svg46
-rw-r--r--app/images/HMI_HVAC_Front_Active.svg75
-rw-r--r--app/images/HMI_HVAC_Front_Inactive.svg72
-rw-r--r--app/images/HMI_HVAC_Inactive.svg31
-rw-r--r--app/images/HMI_HVAC_Left_Chair_OFF.svg87
-rw-r--r--app/images/HMI_HVAC_Left_Chair_ON.svg59
-rw-r--r--app/images/HMI_HVAC_Rear_Active.svg101
-rw-r--r--app/images/HMI_HVAC_Rear_Inactive.svg91
-rw-r--r--app/images/HMI_HVAC_Right_Chair_OFF.svg87
-rw-r--r--app/images/HMI_HVAC_Right_Chair_ON.svg60
-rw-r--r--app/images/images.qrc26
-rw-r--r--app/main.cpp116
-rw-r--r--app/translations.pri16
-rw-r--r--app/translations/hvac_fr_FR.ts53
-rw-r--r--app/translations/hvac_ja_JP.ts53
-rw-r--r--app/translator.cpp52
-rw-r--r--app/translator.h32
43 files changed, 2336 insertions, 0 deletions
diff --git a/app/HVAC.qml b/app/HVAC.qml
new file mode 100644
index 0000000..55251c7
--- /dev/null
+++ b/app/HVAC.qml
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (c) 2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+import AGL.Demo.Controls 1.0
+import Translator 1.0
+import 'api' as API
+
+ApplicationWindow {
+ id: root
+
+ width: container.width * container.scale
+ height: container.height * container.scale
+
+ Translator {
+ id: translator
+ language: binding.language
+ }
+
+ API.Binding {
+ id: binding
+ url: bindingAddress
+ onFanSpeedChanged: fanSpeedSlider.value = fanSpeed
+ onLanguageChanged: translator.language = language
+ }
+
+ Item {
+ id: container
+// anchors.centerIn: parent
+ x: 555
+ y: -465
+ width: 720
+ height: 1920
+ rotation: -90
+ scale: screenInfo.scale_factor()
+
+ ColumnLayout {
+ anchors.fill: parent
+ anchors.topMargin: width / 10
+ anchors.bottomMargin: width / 10
+
+ RowLayout {
+ Layout.fillHeight: true
+ Layout.alignment: Qt.AlignHCenter
+ Image {
+ source: './images/HMI_HVAC_Fan_Icon.svg'
+ }
+ Item {
+ width: container.width * 0.8
+ Slider {
+ id: fanSpeedSlider
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.verticalCenter: parent.verticalCenter
+ from: 0.0
+ to: 255.0
+ stepSize: 1.0
+ onValueChanged: {
+ binding.fanSpeed = value
+ }
+ }
+ Label {
+ anchors.left: fanSpeedSlider.left
+ anchors.top: fanSpeedSlider.bottom
+ font.pixelSize: 32
+ text: translator.translate(qsTr('FAN SPEED'), translator.language)
+ }
+ }
+ }
+ RowLayout {
+ Layout.fillHeight: true
+ Layout.fillWidth: true
+ Layout.alignment: Qt.AlignHCenter
+ rotation: 90
+ spacing: 20
+ ColumnLayout {
+ Layout.fillWidth: true
+ spacing: 20
+ SeatHeatButton {
+ id: leftSeat
+ side: 'Left'
+ }
+ HeatDegree {
+ onCurrentItemChanged: {
+ console.log("Left Temp changed",degree)
+ binding.leftTemperature = degree
+ }
+ }
+ }
+ ColumnLayout {
+ Layout.fillWidth: true
+ spacing: 20
+ ToggleButton {
+ onImage: './images/HMI_HVAC_Active.svg'
+ offImage: './images/HMI_HVAC_Inactive.svg'
+ Label {
+ anchors.centerIn: parent
+ color: parent.checked ? '#00ADDC' : '#848286'
+ text: translator.translate(qsTr('A/C'), translator.language)
+ font.pixelSize: parent.height / 3
+ }
+ onCheckedChanged: {
+ console.debug('A/C', checked)
+ }
+ }
+ ToggleButton {
+ onImage: './images/HMI_HVAC_Active.svg'
+ offImage: './images/HMI_HVAC_Inactive.svg'
+ Label {
+ anchors.centerIn: parent
+ color: parent.checked ? '#00ADDC' : '#848286'
+ text: translator.translate(qsTr('AUTO'), translator.language)
+ font.pixelSize: parent.height / 3
+ }
+ onCheckedChanged: {
+ console.debug('AUTO', checked)
+ }
+ }
+ ToggleButton {
+ onImage: './images/HMI_HVAC_Circulation_Active.svg'
+ offImage: './images/HMI_HVAC_Circulation_Inactive.svg'
+ onCheckedChanged: {
+ console.debug('Circulation', checked)
+ }
+ }
+ }
+
+ ColumnLayout {
+ Layout.fillWidth: true
+ spacing: 20
+ SeatHeatButton {
+ id: rightSeat
+ side: 'Right'
+ }
+ HeatDegree {
+ onCurrentItemChanged: {
+ console.log("Right Temp changed",degree)
+ binding.rightTemperature = degree
+ }
+ }
+ }
+ }
+ RowLayout {
+ Layout.fillHeight: true
+ Layout.alignment: Qt.AlignHCenter
+ Repeater {
+ model: ['AirDown', 'AirUp', 'AirRight', 'Rear', 'Front']
+ ToggleButton {
+ onImage: './images/HMI_HVAC_%1_Active.svg'.arg(model.modelData)
+ offImage: './images/HMI_HVAC_%1_Inactive.svg'.arg(model.modelData)
+ rotation: 90
+ onCheckedChanged: {
+ console.debug(model.modelData, checked)
+ }
+ }
+ }
+ }
+ }
+}
+}
diff --git a/app/HeatDegree.qml b/app/HeatDegree.qml
new file mode 100644
index 0000000..a9bc83c
--- /dev/null
+++ b/app/HeatDegree.qml
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Controls 2.0
+
+ListView {
+ id: root
+ clip: true
+ width: 318
+ height: 219 * 2 + 20
+ spacing: 20
+ opacity: enabled ? 1 : 0.5
+
+ property int degree: currentIndex > -1 ? model.get(currentIndex).value : -1
+ model: ListModel {
+ Component.onCompleted: {
+ append({value: 15, modelData: translator.translate(qsTr('LO'), translator.language)})
+ for (var d = 16; d < 30; d++) {
+ append({value: d, modelData: translator.translate(qsTr('%1\u00b0'), translator.language).arg(d.toFixed(0))})
+ }
+ append({value: 30, modelData: translator.translate(qsTr('HI'), translator.language)})
+ }
+ }
+ delegate: Label {
+ width: ListView.view.width
+ height: 219
+ horizontalAlignment: Label.AlignHCenter
+ verticalAlignment: Label.AlignVCenter
+ text: model.modelData
+ font.pixelSize: height * 0.7
+ color: (ListView.view.enabled && ListView.isCurrentItem) ? '#00ADDC' : 'white'
+ }
+
+ preferredHighlightBegin: 0.5
+ preferredHighlightEnd: 0.5
+ highlightRangeMode: ListView.StrictlyEnforceRange
+ highlight: Rectangle {
+ color: 'white'
+ opacity: 0.2
+ }
+}
diff --git a/app/SeatHeatButton.qml b/app/SeatHeatButton.qml
new file mode 100644
index 0000000..3495cf6
--- /dev/null
+++ b/app/SeatHeatButton.qml
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+import AGL.Demo.Controls 1.0
+
+
+Item {
+ id: root
+ implicitWidth: 318
+ implicitHeight: 219
+
+ property string side: 'Left'
+ property int headLevel: 0
+
+ Column {
+ id: background
+ anchors.centerIn: parent
+ Image {
+ id: chair
+ source: './images/HMI_HVAC_%1_Chair_OFF.svg'.arg(root.side)
+ states: [
+ State {
+ when: root.headLevel > 0
+ PropertyChanges {
+ target: chair
+ source: './images/HMI_HVAC_%1_Chair_ON.svg'.arg(root.side)
+ }
+ }
+ ]
+ }
+ Image {
+ id: indicator
+ width: 178
+ height: 18
+ source: './images/HMI_HVAC_ChairIndicator_OFF.svg'
+ states: [
+ State {
+ when: root.headLevel === 1
+ PropertyChanges {
+ target: indicator
+ source: './images/HMI_HVAC_ChairIndicator_One.svg'
+ }
+ },
+ State {
+ when: root.headLevel === 2
+ PropertyChanges {
+ target: indicator
+ source: './images/HMI_HVAC_ChairIndicator_Two.svg'
+ }
+ }
+ ]
+ }
+
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ root.headLevel = (root.headLevel + 1) % 3
+ }
+ }
+}
diff --git a/app/api/Binding.qml b/app/api/Binding.qml
new file mode 100644
index 0000000..2d88087
--- /dev/null
+++ b/app/api/Binding.qml
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtWebSockets 1.0
+import 'MessageId.js' as MessageId
+
+WebSocket {
+ id: root
+ active: true
+
+ property string statusString: "waiting..."
+
+ property real fanSpeed: 0.0
+ property real leftTemperature: 21.0
+ property real rightTemperature: 21.0
+ property string language: "en_US"
+
+ property Connections c : Connections {
+ target: root
+ onFanSpeedChanged: {
+ var json = [MessageId.call, '9999', 'hvac/set', {'FanSpeed': fanSpeed}]
+ console.debug(JSON.stringify(json))
+ sendTextMessage(JSON.stringify(json))
+ }
+ onLeftTemperatureChanged: {
+ var json = [MessageId.call, '9999', 'hvac/set', {'LeftTemperature': leftTemperature}]
+ console.debug(JSON.stringify(json))
+ sendTextMessage(JSON.stringify(json))
+
+ var json1 = [MessageId.call, '9999', 'hvac/temp_left_zone_led', {'LeftLed': leftTemperature}]
+ console.debug(JSON.stringify(json1))
+ sendTextMessage(JSON.stringify(json1))
+ }
+ onRightTemperatureChanged: {
+ var json = [MessageId.call, '9999', 'hvac/set', {'RightTemperature': rightTemperature}]
+ console.debug(JSON.stringify(json))
+ sendTextMessage(JSON.stringify(json))
+
+ var json1 = [MessageId.call, '9999', 'hvac/temp_right_zone_led', {'RightLed': rightTemperature}]
+ console.debug(JSON.stringify(json1))
+ sendTextMessage(JSON.stringify(json1))
+ }
+ onLanguageChanged: {
+ var json = [MessageId.call, '9999', 'hvac/set', {'Language': language}]
+ console.debug(JSON.stringify(json))
+ sendTextMessage(JSON.stringify(json))
+ }
+ }
+
+ onTextMessageReceived: {
+ var json = JSON.parse(message)
+ var request = json[2].request
+ var response = json[2].response
+ console.log("HVAC Binding Message: ",message)
+ switch (json[0]) {
+ case MessageId.call:
+ break
+ case MessageId.retok:
+ root.statusString = request.status
+ break
+ case MessageId.reterr:
+ root.statusString = "Bad return value, binding probably not installed"
+ break
+ case MessageId.event:
+ if (json[1] == "hvac/language")
+ console.log("HVAC event received: ",json[2])
+ root.language = json[2].data
+ root.statusString = "Language changed to "+language
+ break
+ }
+ }
+ onStatusChanged: {
+ switch (status) {
+ case WebSocket.Error:
+ root.statusString = "WebSocket error: " + root.errorString
+ break
+ }
+ }
+}
diff --git a/app/api/MessageId.js b/app/api/MessageId.js
new file mode 100644
index 0000000..001ea93
--- /dev/null
+++ b/app/api/MessageId.js
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.pragma library
+
+var call = 2
+var retok = 3
+var reterr = 4
+var event = 5
diff --git a/app/app.pri b/app/app.pri
new file mode 100644
index 0000000..590c154
--- /dev/null
+++ b/app/app.pri
@@ -0,0 +1,20 @@
+TEMPLATE = app
+
+load(configure)
+
+qtCompileTest(libhomescreen)
+qtCompileTest(qlibwindowmanager)
+
+config_libhomescreen {
+ CONFIG += link_pkgconfig
+ PKGCONFIG += libhomescreen
+ DEFINES += HAVE_LIBHOMESCREEN
+}
+
+config_qlibwindowmanager {
+ CONFIG += link_pkgconfig
+ PKGCONFIG += qlibwindowmanager
+ DEFINES += HAVE_QLIBWINDOWMANAGER
+}
+
+DESTDIR = $${OUT_PWD}/../package/root/bin
diff --git a/app/app.pro b/app/app.pro
new file mode 100644
index 0000000..edd08aa
--- /dev/null
+++ b/app/app.pro
@@ -0,0 +1,17 @@
+TARGET = hvac
+QT = quick qml
+
+HEADERS += \
+ translator.h
+
+SOURCES = main.cpp \
+ translator.cpp
+
+RESOURCES += \
+ hvac.qrc \
+ images/images.qrc
+
+include(app.pri)
+
+LANGUAGES = ja_JP fr_FR
+include(translations.pri)
diff --git a/app/config.tests/libhomescreen/libhomescreen.cpp b/app/config.tests/libhomescreen/libhomescreen.cpp
new file mode 100644
index 0000000..d698b05
--- /dev/null
+++ b/app/config.tests/libhomescreen/libhomescreen.cpp
@@ -0,0 +1,8 @@
+#include <libhomescreen.hpp>
+
+int main(int argc,char **argv)
+{
+ LibHomeScreen libHomeScreen;
+ return 0;
+}
+
diff --git a/app/config.tests/libhomescreen/libhomescreen.pro b/app/config.tests/libhomescreen/libhomescreen.pro
new file mode 100644
index 0000000..7d43112
--- /dev/null
+++ b/app/config.tests/libhomescreen/libhomescreen.pro
@@ -0,0 +1,5 @@
+SOURCES = libhomescreen.cpp
+
+CONFIG -= qt
+CONFIG += link_pkgconfig
+PKGCONFIG += libhomescreen
diff --git a/app/config.tests/libhomescreen/pkg-config_wrapper.sh b/app/config.tests/libhomescreen/pkg-config_wrapper.sh
new file mode 100755
index 0000000..756b922
--- /dev/null
+++ b/app/config.tests/libhomescreen/pkg-config_wrapper.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+PKG_CONFIG_SYSROOT_DIR=/home/tte/work/sdk/sysroots/aarch64-agl-linux
+export PKG_CONFIG_SYSROOT_DIR
+PKG_CONFIG_LIBDIR=/home/tte/work/sdk/sysroots/aarch64-agl-linux/usr/lib/pkgconfig:/home/tte/work/sdk/sysroots/aarch64-agl-linux/usr/share/pkgconfig:/home/tte/work/sdk/sysroots/aarch64-agl-linux/usr/lib/aarch64-agl-linux/pkgconfig
+export PKG_CONFIG_LIBDIR
+exec pkg-config "$@"
diff --git a/app/config.tests/qlibwindowmanager/pkg-config_wrapper.sh b/app/config.tests/qlibwindowmanager/pkg-config_wrapper.sh
new file mode 100755
index 0000000..756b922
--- /dev/null
+++ b/app/config.tests/qlibwindowmanager/pkg-config_wrapper.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+PKG_CONFIG_SYSROOT_DIR=/home/tte/work/sdk/sysroots/aarch64-agl-linux
+export PKG_CONFIG_SYSROOT_DIR
+PKG_CONFIG_LIBDIR=/home/tte/work/sdk/sysroots/aarch64-agl-linux/usr/lib/pkgconfig:/home/tte/work/sdk/sysroots/aarch64-agl-linux/usr/share/pkgconfig:/home/tte/work/sdk/sysroots/aarch64-agl-linux/usr/lib/aarch64-agl-linux/pkgconfig
+export PKG_CONFIG_LIBDIR
+exec pkg-config "$@"
diff --git a/app/config.tests/qlibwindowmanager/qlibwindowmanager.cpp b/app/config.tests/qlibwindowmanager/qlibwindowmanager.cpp
new file mode 100644
index 0000000..bb95c93
--- /dev/null
+++ b/app/config.tests/qlibwindowmanager/qlibwindowmanager.cpp
@@ -0,0 +1,8 @@
+#include <qlibwindowmanager.h>
+
+int main(int argc,char **argv)
+{
+ QLibWindowmanager qwm;
+ return 0;
+}
+
diff --git a/app/config.tests/qlibwindowmanager/qlibwindowmanager.pro b/app/config.tests/qlibwindowmanager/qlibwindowmanager.pro
new file mode 100644
index 0000000..cb51d98
--- /dev/null
+++ b/app/config.tests/qlibwindowmanager/qlibwindowmanager.pro
@@ -0,0 +1,5 @@
+SOURCES = qlibwindowmanager.cpp
+
+CONFIG += qt
+CONFIG += link_pkgconfig
+PKGCONFIG += qlibwindowmanager
diff --git a/app/hvac.qrc b/app/hvac.qrc
new file mode 100644
index 0000000..6327049
--- /dev/null
+++ b/app/hvac.qrc
@@ -0,0 +1,9 @@
+<RCC>
+ <qresource prefix="/">
+ <file>HVAC.qml</file>
+ <file>SeatHeatButton.qml</file>
+ <file>HeatDegree.qml</file>
+ <file>api/Binding.qml</file>
+ <file>api/MessageId.js</file>
+ </qresource>
+</RCC>
diff --git a/app/images/HMI_HVAC_Active.svg b/app/images/HMI_HVAC_Active.svg
new file mode 100644
index 0000000..71e6aa0
--- /dev/null
+++ b/app/images/HMI_HVAC_Active.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 318 219"
+ style="enable-background:new 0 0 318 219;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#0DF9FF;}
+ .st1{font-family:'Roboto-Light';}
+ .st2{font-size:88.6888px;}
+ .st3{letter-spacing:3;}
+ .st4{letter-spacing:-3;}
+ .st5{fill:none;stroke:url(#SVGID_1_);stroke-miterlimit:10;}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="20.6039" y1="240.7292" x2="297.3961" y2="-21.7292">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <rect x="0.5" y="0.5" class="st5" width="317" height="218"/>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_AirDown_Active.svg b/app/images/HMI_HVAC_AirDown_Active.svg
new file mode 100644
index 0000000..85dd533
--- /dev/null
+++ b/app/images/HMI_HVAC_AirDown_Active.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:url(#SVGID_1_);}
+ .st1{fill:url(#SVGID_2_);}
+ .st2{fill:url(#SVGID_3_);}
+ .st3{fill:url(#SVGID_4_);}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-30.516" y1="171.1865" x2="175.7655" y2="-26.5646" gradientTransform="matrix(1 5.464556e-03 -5.464556e-03 1 -2.5085 -2.852)">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#0DF9FF"/>
+ </linearGradient>
+ <path class="st0" d="M70.1,138.1c-0.1,0-0.3,0-0.4,0C31.9,137.9,1.3,107,1.5,69.2C1.7,31.5,32.4,1,70,1c0.1,0,0.3,0,0.4,0
+ c37.8,0.2,68.4,31.1,68.2,68.9l0,0C138.4,107.6,107.7,138.1,70.1,138.1z M70,3.4C33.7,3.4,4.1,32.8,3.9,69.2
+ c-0.2,36.5,29.3,66.3,65.8,66.5c0.1,0,0.2,0,0.4,0c36.3,0,65.9-29.4,66.1-65.8c0.2-36.5-29.3-66.3-65.8-66.5
+ C70.3,3.4,70.2,3.4,70,3.4z"/>
+ </g>
+ <g>
+ <g>
+ <g>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-101.4773" y1="281.1379" x2="140.6279" y2="12.7169">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st1" d="M96.9,64.7c-3.4-1.7-7.5-0.3-9.2,3.1l-10,19.9l-20.2-5.2c-2-0.5-4,0.2-5.2,1.9l-15.4,20.9
+ c-1.6,2.2-1.2,5.3,1.1,6.9c0.9,0.7,1.9,1,2.9,1c1.5,0,3-0.7,4-2L58.3,93l21.3,5.5c0.1,0.1,0.2,0.1,0.4,0.2
+ c1,0.5,2,0.7,3.1,0.7c2.5,0,5-1.4,6.2-3.8L100,74C101.7,70.6,100.4,66.4,96.9,64.7z"/>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-105.1744" y1="277.8033" x2="136.9309" y2="9.3823">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <circle class="st2" cx="97.3" cy="53.4" r="8.3"/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-131.1376" y1="254.3855" x2="110.9676" y2="-14.0356">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st3" d="M52.2,72.4c-0.4,0-0.7-0.1-0.9-0.4L37.9,57.8c-0.4-0.4-0.7-1.3-0.1-1.9l0.3-0.3h8.9V34.9
+ c0-0.8,0.6-1.4,1.4-1.4h8c0.8,0,1.4,0.6,1.4,1.4v21.6h-0.5v1h-1.5v-22h-6.9v22h-8.5l11.8,12.5l11.9-12.6v-1.9h2l0.3,0.3
+ c0.4,0.4,0.7,1.4,0.1,2L53.2,72C52.9,72.2,52.6,72.4,52.2,72.4z M65.1,56.4C65.1,56.4,65.1,56.4,65.1,56.4L65.1,56.4z
+ M39.4,56.4L39.4,56.4C39.4,56.4,39.4,56.4,39.4,56.4z"/>
+ </g>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_AirDown_Inactive.svg b/app/images/HMI_HVAC_AirDown_Inactive.svg
new file mode 100644
index 0000000..a013f4b
--- /dev/null
+++ b/app/images/HMI_HVAC_AirDown_Inactive.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_HVAC_AirDown_Inactive.svg"><metadata
+ id="metadata27"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs25" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview23"
+ showgrid="false"
+ inkscape:zoom="1.6857143"
+ inkscape:cx="-188.94068"
+ inkscape:cy="70"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#848286;}
+ .st1{fill:none;stroke:#848286;stroke-width:2;stroke-miterlimit:10;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><path
+ class="st0"
+ d="M70,138c-0.1,0-0.3,0-0.4,0c-37.8-0.2-68.3-31.1-68.1-68.9C1.7,31.5,32.4,1,70,1c0.1,0,0.3,0,0.4,0 c37.8,0.2,68.3,31.1,68.1,68.9l0,0C138.3,107.5,107.6,138,70,138z M70,3.4C33.7,3.4,4.1,32.8,3.9,69.1 c-0.2,36.4,29.3,66.3,65.7,66.5c0.1,0,0.2,0,0.4,0c36.3,0,65.9-29.4,66.1-65.7c0.2-36.4-29.3-66.3-65.7-66.5 C70.2,3.4,70.1,3.4,70,3.4z"
+ id="path11" /></g><g
+ id="g13"><g
+ id="g15"><path
+ class="st0"
+ d="M96.9,64.7c-3.4-1.7-7.5-0.3-9.2,3.1l-10,19.9l-20.2-5.2c-2-0.5-4,0.2-5.2,1.9l-15.4,20.9 c-1.6,2.2-1.2,5.3,1.1,6.9c0.9,0.7,1.9,1,2.9,1c1.5,0,3-0.7,4-2l13.4-18.2l21.3,5.5c0.1,0.1,0.2,0.1,0.4,0.2 c1,0.5,2,0.7,3.1,0.7c2.5,0,5-1.4,6.2-3.8L100,73.9C101.7,70.5,100.3,66.4,96.9,64.7z"
+ id="path17" /><circle
+ class="st0"
+ cx="97.2"
+ cy="53.3"
+ r="8.3"
+ id="circle19" /></g></g><path
+ class="st1"
+ d="M57.3,56.5h-0.5V34.9c0-0.2-0.2-0.4-0.4-0.4h-8c-0.2,0-0.4,0.2-0.4,0.4v21.6h-9.4c-0.1,0.1,0,0.4,0.1,0.6 L52,71.3c0.1,0.1,0.3,0.1,0.4,0l13.4-14.2c0.1-0.1,0-0.4-0.1-0.6h-1.6"
+ id="path21" /></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_HVAC_AirRight_Active.svg b/app/images/HMI_HVAC_AirRight_Active.svg
new file mode 100644
index 0000000..cfb9452
--- /dev/null
+++ b/app/images/HMI_HVAC_AirRight_Active.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:url(#SVGID_1_);}
+ .st1{fill:url(#SVGID_2_);}
+ .st2{fill:url(#SVGID_3_);}
+ .st3{fill:url(#SVGID_4_);}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-12.9122" y1="161.8499" x2="136.9379" y2="-4.2002">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st0" d="M70,138.5c-0.1,0-0.3,0-0.4,0c-18.3-0.1-35.5-7.3-48.3-20.3C8.4,105.2,1.4,87.9,1.5,69.6
+ c0.1-18.3,7.3-35.5,20.3-48.3C34.7,8.5,51.8,1.5,70,1.5c0.1,0,0.3,0,0.4,0c18.3,0.1,35.5,7.3,48.3,20.3
+ c12.9,13,19.9,30.2,19.8,48.5l0,0C138.3,108,107.6,138.5,70,138.5z M70,3.9c-17.5,0-34,6.8-46.5,19.1C11,35.4,4,52,3.9,69.6
+ c-0.1,17.7,6.7,34.3,19.1,46.8s29,19.5,46.6,19.6c0.1,0,0.2,0,0.4,0c36.3,0,65.9-29.4,66.1-65.7c0.1-17.7-6.7-34.3-19.1-46.8
+ C104.6,11,88,4,70.4,3.9C70.2,3.9,70.1,3.9,70,3.9z"/>
+ </g>
+ <g>
+ <g>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-2.2981" y1="171.5389" x2="147.6513" y2="5.3788">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st1" d="M96.9,65.2c-3.4-1.7-7.5-0.3-9.2,3.1l-10,19.9L57.5,83c-2-0.5-4,0.2-5.2,1.9l-15.4,20.9
+ c-1.6,2.2-1.2,5.3,1.1,6.9c0.9,0.7,1.9,1,2.9,1c1.5,0,3-0.7,4-2l13.4-18.2l21.3,5.5c0.1,0.1,0.2,0.1,0.4,0.2
+ c1,0.5,2,0.7,3.1,0.7c2.5,0,5-1.4,6.2-3.8L100,74.4C101.7,71,100.3,66.9,96.9,65.2z"/>
+ </g>
+ </g>
+ <g>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-6.0031" y1="168.1953" x2="143.9462" y2="2.0352">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <circle class="st2" cx="97.2" cy="53.8" r="8.3"/>
+ </g>
+ </g>
+ <g>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-32.1525" y1="144.5971" x2="117.7968" y2="-21.563">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st3" d="M55.9,68.3c-0.4,0-0.7-0.1-1-0.4l-0.4-0.4v-8.7H34.1c-0.9,0-1.6-0.7-1.6-1.6v-8c0-0.9,0.7-1.6,1.6-1.6h21.6
+ v0.7h1.2v1.7h-22v6.5h22v8.3l12-11.3L56.3,41.4h-1.8v-2.1l0.4-0.4c0.6-0.5,1.6-0.7,2.2-0.1l14.2,13.4c0.3,0.3,0.5,0.7,0.5,1.1
+ s-0.2,0.8-0.5,1.1L57.1,67.8C56.8,68.1,56.3,68.3,55.9,68.3z M55.5,66.1C55.5,66.1,55.5,66.1,55.5,66.1L55.5,66.1z M55.5,40.6
+ C55.5,40.6,55.5,40.6,55.5,40.6L55.5,40.6z"/>
+ </g>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_AirRight_Inactive.svg b/app/images/HMI_HVAC_AirRight_Inactive.svg
new file mode 100644
index 0000000..991a773
--- /dev/null
+++ b/app/images/HMI_HVAC_AirRight_Inactive.svg
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_HVAC_AirRight_Inactive.svg"><metadata
+ id="metadata35"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs33" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview31"
+ showgrid="false"
+ inkscape:zoom="1.6857143"
+ inkscape:cx="-212.9661"
+ inkscape:cy="70"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#848286;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><g
+ id="g11"><path
+ class="st0"
+ d="M70,138.5c-0.1,0-0.3,0-0.4,0c-18.3-0.1-35.5-7.3-48.3-20.3C8.4,105.2,1.4,87.9,1.5,69.6 c0.1-18.3,7.3-35.5,20.3-48.3C34.7,8.5,51.8,1.5,70,1.5c0.1,0,0.3,0,0.4,0c18.3,0.1,35.5,7.3,48.3,20.3 c12.9,13,19.9,30.2,19.8,48.5l0,0C138.3,108,107.6,138.5,70,138.5z M70,3.9c-17.5,0-34,6.8-46.5,19.1C11,35.4,4,52,3.9,69.6 c-0.1,17.7,6.7,34.3,19.1,46.8s29,19.5,46.6,19.6c0.1,0,0.2,0,0.4,0c36.3,0,65.9-29.4,66.1-65.7c0.1-17.7-6.7-34.3-19.1-46.8 C104.6,11,88,4,70.4,3.9C70.2,3.9,70.1,3.9,70,3.9z"
+ id="path13" /></g><g
+ id="g15"><g
+ id="g17"><path
+ class="st0"
+ d="M96.9,65.2c-3.4-1.7-7.5-0.3-9.2,3.1l-10,19.9L57.5,83c-2-0.5-4,0.2-5.2,1.9l-15.4,20.9 c-1.6,2.2-1.2,5.3,1.1,6.9c0.9,0.7,1.9,1,2.9,1c1.5,0,3-0.7,4-2l13.4-18.2l21.3,5.5c0.1,0.1,0.2,0.1,0.4,0.2 c1,0.5,2,0.7,3.1,0.7c2.5,0,5-1.4,6.2-3.8L100,74.4C101.7,71,100.3,66.9,96.9,65.2z"
+ id="path19" /></g></g><g
+ id="g21"><g
+ id="g23"><circle
+ class="st0"
+ cx="97.2"
+ cy="53.8"
+ r="8.3"
+ id="circle25" /></g></g><g
+ id="g27"><path
+ class="st0"
+ d="M55.9,68.3c-0.4,0-0.7-0.1-1-0.4l-0.4-0.4v-8.7H34.1c-0.9,0-1.6-0.7-1.6-1.6v-8c0-0.9,0.7-1.6,1.6-1.6h21.6 v0.7h1.2v1.7h-22v6.5h22v8.3l12-11.3L56.3,41.4h-1.8v-2.1l0.4-0.4c0.6-0.5,1.6-0.7,2.2-0.1l14.2,13.4c0.3,0.3,0.5,0.7,0.5,1.1 s-0.2,0.8-0.5,1.1L57.1,67.8C56.8,68.1,56.3,68.3,55.9,68.3z M55.5,66.1C55.5,66.1,55.5,66.1,55.5,66.1L55.5,66.1z M55.5,40.6 C55.5,40.6,55.5,40.6,55.5,40.6L55.5,40.6z"
+ id="path29" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_HVAC_AirUp_Active.svg b/app/images/HMI_HVAC_AirUp_Active.svg
new file mode 100644
index 0000000..f168a39
--- /dev/null
+++ b/app/images/HMI_HVAC_AirUp_Active.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:url(#SVGID_1_);}
+ .st1{fill:url(#SVGID_2_);}
+ .st2{fill:url(#SVGID_3_);}
+ .st3{fill:url(#SVGID_4_);}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <g>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="13.3039" y1="158.6924" x2="149.6532" y2="-54.6065">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st0" d="M70,138.5c-0.1,0-0.3,0-0.4,0c-37.8-0.2-68.3-31.1-68.1-68.9C1.7,32,32.4,1.5,70,1.5c0.1,0,0.3,0,0.4,0
+ c37.8,0.2,68.3,31.1,68.1,68.9l0,0C138.3,108,107.6,138.5,70,138.5z M70,3.9C33.7,3.9,4.1,33.3,3.9,69.6
+ c-0.2,36.4,29.3,66.3,65.7,66.5c0.1,0,0.2,0,0.4,0c36.3,0,65.9-29.4,66.1-65.7c0.2-36.4-29.3-66.3-65.7-66.5
+ C70.2,3.9,70.1,3.9,70,3.9z"/>
+ </g>
+ </g>
+ <g>
+ <g>
+ <g>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="22.352" y1="164.5598" x2="158.7924" y2="-48.8816">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st1" d="M96.9,65.2c-3.4-1.7-7.5-0.3-9.2,3.1l-10,19.9L57.5,83c-2-0.5-4,0.2-5.2,1.9l-15.4,20.9
+ c-1.6,2.2-1.2,5.3,1.1,6.9c0.9,0.7,1.9,1,2.9,1c1.5,0,3-0.7,4-2l13.4-18.2l21.3,5.5c0.1,0.1,0.2,0.1,0.4,0.2
+ c1,0.5,2,0.7,3.1,0.7c2.5,0,5-1.4,6.2-3.8L100,74.4C101.7,71,100.3,66.9,96.9,65.2z"/>
+ </g>
+ </g>
+ <g>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="25.2431" y1="166.4079" x2="161.6835" y2="-47.0335">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <circle class="st2" cx="97.2" cy="53.8" r="8.3"/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <g>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7.1392" y1="145.7078" x2="129.3011" y2="-67.7336">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st3" d="M55.9,73h-8c-0.9,0-1.6-0.7-1.6-1.6V49.8h0.7v-1.2h1.7v22h6.5v-22h8.3l-11.3-12L40.2,49.2V51h-2.1
+ l-0.4-0.4c-0.5-0.6-0.7-1.6-0.1-2.2L51,34.2c0.3-0.3,0.7-0.5,1.1-0.5c0,0,0,0,0,0c0.4,0,0.8,0.2,1.1,0.5l13.4,14.2
+ c0.5,0.6,0.7,1.6,0.1,2.2L66.3,51h-8.7v20.4C57.5,72.3,56.8,73,55.9,73z M64.8,50.1C64.8,50.1,64.8,50.1,64.8,50.1L64.8,50.1z
+ M39.4,50L39.4,50C39.4,50.1,39.4,50.1,39.4,50z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_AirUp_Inactive.svg b/app/images/HMI_HVAC_AirUp_Inactive.svg
new file mode 100644
index 0000000..39e1fa1
--- /dev/null
+++ b/app/images/HMI_HVAC_AirUp_Inactive.svg
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_HVAC_AirUp_Inactive.svg"><metadata
+ id="metadata41"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs39" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview37"
+ showgrid="false"
+ inkscape:zoom="1.6857143"
+ inkscape:cx="-186.5678"
+ inkscape:cy="70"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#848286;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><g
+ id="g11"><g
+ id="g13"><path
+ class="st0"
+ d="M70,138.5c-0.1,0-0.3,0-0.4,0c-37.8-0.2-68.3-31.1-68.1-68.9C1.7,32,32.4,1.5,70,1.5c0.1,0,0.3,0,0.4,0 c37.8,0.2,68.3,31.1,68.1,68.9l0,0C138.3,108,107.6,138.5,70,138.5z M70,3.9C33.7,3.9,4.1,33.3,3.9,69.6 c-0.2,36.4,29.3,66.3,65.7,66.5c0.1,0,0.2,0,0.4,0c36.3,0,65.9-29.4,66.1-65.7c0.2-36.4-29.3-66.3-65.7-66.5 C70.2,3.9,70.1,3.9,70,3.9z"
+ id="path15" /></g></g><g
+ id="g17"><g
+ id="g19"><g
+ id="g21"><path
+ class="st0"
+ d="M96.9,65.2c-3.4-1.7-7.5-0.3-9.2,3.1l-10,19.9L57.5,83c-2-0.5-4,0.2-5.2,1.9l-15.4,20.9 c-1.6,2.2-1.2,5.3,1.1,6.9c0.9,0.7,1.9,1,2.9,1c1.5,0,3-0.7,4-2l13.4-18.2l21.3,5.5c0.1,0.1,0.2,0.1,0.4,0.2 c1,0.5,2,0.7,3.1,0.7c2.5,0,5-1.4,6.2-3.8L100,74.4C101.7,71,100.3,66.9,96.9,65.2z"
+ id="path23" /></g></g><g
+ id="g25"><g
+ id="g27"><circle
+ class="st0"
+ cx="97.2"
+ cy="53.8"
+ r="8.3"
+ id="circle29" /></g></g></g><g
+ id="g31"><g
+ id="g33"><path
+ class="st0"
+ d="M55.9,73h-8c-0.9,0-1.6-0.7-1.6-1.6V49.8h0.7v-1.2h1.7v22h6.5v-22h8.3l-11.3-12L40.2,49.2V51h-2.1 l-0.4-0.4c-0.5-0.6-0.7-1.6-0.1-2.2L51,34.2c0.3-0.3,0.7-0.5,1.1-0.5c0,0,0,0,0,0c0.4,0,0.8,0.2,1.1,0.5l13.4,14.2 c0.5,0.6,0.7,1.6,0.1,2.2L66.3,51h-8.7v20.4C57.5,72.3,56.8,73,55.9,73z M64.8,50.1C64.8,50.1,64.8,50.1,64.8,50.1L64.8,50.1z M39.4,50L39.4,50C39.4,50.1,39.4,50.1,39.4,50z"
+ id="path35" /></g></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_HVAC_ChairIndicator_OFF.svg b/app/images/HMI_HVAC_ChairIndicator_OFF.svg
new file mode 100644
index 0000000..1fcd17f
--- /dev/null
+++ b/app/images/HMI_HVAC_ChairIndicator_OFF.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 178 18"
+ style="enable-background:new 0 0 178 18;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_HVAC_ChairIndicator_OFF.svg"><metadata
+ id="metadata21"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs19" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview17"
+ showgrid="false"
+ inkscape:zoom="3.7752809"
+ inkscape:cx="-7.4166667"
+ inkscape:cy="9"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><style
+ type="text/css"
+ id="style3">
+ .st0{opacity:0.8;fill:#1B1A1D;}
+ .st1{fill:none;stroke:#848286;stroke-miterlimit:10;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><rect
+ x="7.2"
+ y="4.2"
+ class="st0"
+ width="78.6"
+ height="9.6"
+ id="rect9" /><rect
+ x="7.2"
+ y="4.2"
+ class="st1"
+ width="78.6"
+ height="9.6"
+ id="rect11" /><rect
+ x="92.2"
+ y="4.2"
+ class="st0"
+ width="78.6"
+ height="9.6"
+ id="rect13" /><rect
+ x="92.2"
+ y="4.2"
+ class="st1"
+ width="78.6"
+ height="9.6"
+ id="rect15" /></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_HVAC_ChairIndicator_One.svg b/app/images/HMI_HVAC_ChairIndicator_One.svg
new file mode 100644
index 0000000..d560c84
--- /dev/null
+++ b/app/images/HMI_HVAC_ChairIndicator_One.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 178 18"
+ style="enable-background:new 0 0 178 18;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#0DF9FF;}
+ .st1{opacity:0.8;fill:#1B1A1D;}
+ .st2{fill:none;stroke:#0DF9FF;stroke-miterlimit:10;}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <rect x="7.2" y="4.2" class="st0" width="78.6" height="9.6"/>
+ <rect x="92.2" y="4.2" class="st1" width="78.6" height="9.6"/>
+ <rect x="92.2" y="4.2" class="st2" width="78.6" height="9.6"/>
+ </g>
+ <rect x="7.2" y="4.2" class="st2" width="78.6" height="9.6"/>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_ChairIndicator_Two.svg b/app/images/HMI_HVAC_ChairIndicator_Two.svg
new file mode 100644
index 0000000..b31cc90
--- /dev/null
+++ b/app/images/HMI_HVAC_ChairIndicator_Two.svg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 178 18"
+ style="enable-background:new 0 0 178 18;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#0DF9FF;}
+ .st1{fill:none;stroke:#0DF9FF;stroke-miterlimit:10;}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <rect x="7.2" y="4.2" class="st0" width="78.6" height="9.6"/>
+ <rect x="92.2" y="4.2" class="st0" width="78.6" height="9.6"/>
+ <rect x="92.2" y="4.2" class="st1" width="78.6" height="9.6"/>
+ </g>
+ <rect x="7.2" y="4.2" class="st1" width="78.6" height="9.6"/>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_Circulation_Active.svg b/app/images/HMI_HVAC_Circulation_Active.svg
new file mode 100644
index 0000000..def92bb
--- /dev/null
+++ b/app/images/HMI_HVAC_Circulation_Active.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 318 219"
+ style="enable-background:new 0 0 318 219;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:url(#SVGID_1_);}
+ .st1{fill:url(#SVGID_2_);}
+ .st2{fill:url(#SVGID_3_);}
+ .st3{fill:url(#SVGID_4_);}
+ .st4{fill:url(#SVGID_5_);}
+ .st5{fill:url(#SVGID_6_);}
+ .st6{fill:url(#SVGID_7_);}
+ .st7{fill:url(#SVGID_8_);}
+ .st8{fill:none;stroke:url(#SVGID_9_);stroke-miterlimit:10;}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="124.8906" y1="222.9002" x2="297.9268" y2="83.4753">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st0" d="M218.2,164.1c-5.7,0-11.1-2.2-15.2-6.3c-4.1-4.1-6.3-9.5-6.3-15.2l2,0c0,5.2,2,10.1,5.7,13.8
+ c3.7,3.7,8.6,5.7,13.8,5.7c0,0,0,0,0,0c10.8,0,19.5-8.8,19.5-19.6l2,0C239.7,154.4,230.1,164.1,218.2,164.1
+ C218.2,164.1,218.2,164.1,218.2,164.1z"/>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="77.6338" y1="164.2511" x2="250.67" y2="24.8262">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st1" d="M97.9,164.3c-5.7,0-11.1-2.2-15.2-6.3c-4.1-4.1-6.3-9.5-6.3-15.2l2,0c0,5.2,2,10.1,5.7,13.8
+ c3.7,3.7,8.6,5.7,13.8,5.7c0,0,0,0,0,0c5.2,0,10.1-2,13.8-5.7c3.7-3.7,5.7-8.6,5.7-13.8l2,0c0,5.7-2.2,11.2-6.3,15.2
+ C109.1,162,103.7,164.3,97.9,164.3C97.9,164.3,97.9,164.3,97.9,164.3z"/>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="93.334" y1="183.7362" x2="266.3703" y2="44.3113">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <polygon class="st2" points="118.1,140.2 118.1,138.2 179.3,138.1 179.3,140.1 "/>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="49.8941" y1="129.8242" x2="222.9303" y2="-9.6007">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st3" d="M63.5,140.2c-8.5,0-14.7-14.3-14.7-21.7l0-0.2l6.2-25.2l1.9,0.5l-6.2,25.1c0,3.7,1.6,8.6,3.9,12.6
+ c2.6,4.5,5.8,7,8.8,7c0,0,0,0,0,0l13.8,0l0,2L63.5,140.2C63.5,140.2,63.5,140.2,63.5,140.2z"/>
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="93.1771" y1="183.5415" x2="266.2133" y2="44.1166">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st4" d="M238.7,140l0-2l15.8,0c2.7,0,5.9-5.8,8.7-15.4c2.2-7.7,3.8-16.7,3.9-20.8l-49-18.5L189.3,49l-35.5,0.1l0-2
+ l36.4-0.1l29.1,34.5l49.8,18.9l0,0.7c0,3.9-1.5,13.5-4,22.1c-3.2,11.2-6.8,16.9-10.6,16.9L238.7,140z"/>
+ <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="40.6173" y1="118.311" x2="213.6535" y2="-21.1139">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st5" d="M56.7,94.1l-1.2-1.6l21.1-15.9l14.2-18.9c0.6-1,6.2-10.6,18.3-10.6l44.7-0.1l0,2l-44.7,0.1
+ c-11.2,0-16.3,9.3-16.5,9.6l-0.1,0.1L77.9,78.1L56.7,94.1z"/>
+ <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="70.8807" y1="155.8701" x2="243.917" y2="16.4452">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st6" d="M126.1,111.9c-5.5,0-10.7-2.1-14.5-6c-3.9-3.9-6-9.1-6.1-14.6c0-5.5,2.1-10.7,6-14.6c3.9-3.9,9.1-6,14.6-6.1
+ l57.1-0.1l0,2l-57.1,0.1c-5,0-9.6,1.9-13.1,5.5c-3.5,3.5-5.4,8.2-5.4,13.2c0,5,1.9,9.6,5.5,13.1c3.5,3.5,8.2,5.4,13.1,5.4
+ c0,0,0,0,0,0l57.1-0.1l0,2L126.1,111.9C126.2,111.9,126.1,111.9,126.1,111.9z"/>
+ <linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="85.2865" y1="173.7487" x2="258.3227" y2="34.3238">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <polygon class="st7" points="153.9,121.7 153.2,119.8 180.1,110.8 153.2,101.9 153.8,100 186.4,110.8 "/>
+ <linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="20.6643" y1="240.7757" x2="297.3357" y2="-21.7757">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <rect x="0.5" y="0.5" class="st8" width="317" height="218"/>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_Circulation_Inactive.svg b/app/images/HMI_HVAC_Circulation_Inactive.svg
new file mode 100644
index 0000000..9c7d43f
--- /dev/null
+++ b/app/images/HMI_HVAC_Circulation_Inactive.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 318 219"
+ style="enable-background:new 0 0 318 219;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_HVAC_Circulation_Inactive.svg"><metadata
+ id="metadata33"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs31" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview29"
+ showgrid="false"
+ inkscape:zoom="1.0776256"
+ inkscape:cx="-290.59958"
+ inkscape:cy="109.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#848286;}
+ .st1{fill:none;stroke:#848286;stroke-miterlimit:10;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><path
+ class="st0"
+ d="M218.2,164.1c-5.7,0-11.1-2.2-15.2-6.3c-4.1-4.1-6.3-9.5-6.3-15.2l2,0c0,5.2,2,10.1,5.7,13.8 c3.7,3.7,8.6,5.7,13.8,5.7c0,0,0,0,0,0c10.8,0,19.5-8.8,19.5-19.6l2,0C239.7,154.4,230.1,164.1,218.2,164.1 C218.2,164.1,218.2,164.1,218.2,164.1z"
+ id="path11" /><path
+ class="st0"
+ d="M97.9,164.3c-5.7,0-11.1-2.2-15.2-6.3c-4.1-4.1-6.3-9.5-6.3-15.2l2,0c0,5.2,2,10.1,5.7,13.8 c3.7,3.7,8.6,5.7,13.8,5.7c0,0,0,0,0,0c5.2,0,10.1-2,13.8-5.7c3.7-3.7,5.7-8.6,5.7-13.8l2,0c0,5.7-2.2,11.2-6.3,15.2 C109.1,162,103.7,164.3,97.9,164.3C97.9,164.3,97.9,164.3,97.9,164.3z"
+ id="path13" /><rect
+ x="118.1"
+ y="138.1"
+ transform="matrix(1 -1.464842e-03 1.464842e-03 1 -0.2036 0.218)"
+ class="st0"
+ width="61.2"
+ height="2"
+ id="rect15" /><path
+ class="st0"
+ d="M63.5,140.2c-8.5,0-14.7-14.3-14.7-21.7l0-0.2l6.2-25.2l1.9,0.5l-6.2,25.1c0,3.7,1.6,8.6,3.9,12.6 c2.6,4.5,5.8,7,8.8,7c0,0,0,0,0,0l13.8,0l0,2L63.5,140.2C63.5,140.2,63.5,140.2,63.5,140.2z"
+ id="path17" /><path
+ class="st0"
+ d="M238.7,140l0-2l15.8,0c2.7,0,5.9-5.8,8.7-15.4c2.2-7.7,3.8-16.7,3.9-20.8l-49-18.5L189.3,49l-35.5,0.1l0-2 l36.4-0.1l29.1,34.5l49.8,18.9l0,0.7c0,3.9-1.5,13.5-4,22.1c-3.2,11.2-6.8,16.9-10.6,16.9L238.7,140z"
+ id="path19" /><path
+ class="st0"
+ d="M56.7,94.1l-1.2-1.6l21.1-15.9l14.2-18.9c0.6-1,6.2-10.6,18.3-10.6l44.7-0.1l0,2l-44.7,0.1 c-11.2,0-16.3,9.3-16.5,9.6l-0.1,0.1L77.9,78.1L56.7,94.1z"
+ id="path21" /><path
+ class="st0"
+ d="M126.1,111.9c-5.5,0-10.7-2.1-14.5-6c-3.9-3.9-6-9.1-6.1-14.6c0-5.5,2.1-10.7,6-14.6c3.9-3.9,9.1-6,14.6-6.1 l57.1-0.1l0,2l-57.1,0.1c-5,0-9.6,1.9-13.1,5.5c-3.5,3.5-5.4,8.2-5.4,13.2c0,5,1.9,9.6,5.5,13.1c3.5,3.5,8.2,5.4,13.1,5.4 c0,0,0,0,0,0l57.1-0.1l0,2L126.1,111.9C126.2,111.9,126.1,111.9,126.1,111.9z"
+ id="path23" /><polygon
+ class="st0"
+ points="153.9,121.7 153.2,119.8 180.1,110.8 153.2,101.9 153.8,100 186.4,110.8 "
+ id="polygon25" /><rect
+ x="0.5"
+ y="0.5"
+ class="st1"
+ width="317"
+ height="218"
+ id="rect27" /></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_HVAC_Fan_Icon.svg b/app/images/HMI_HVAC_Fan_Icon.svg
new file mode 100644
index 0000000..ee583a0
--- /dev/null
+++ b/app/images/HMI_HVAC_Fan_Icon.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 114 114"
+ style="enable-background:new 0 0 114 114;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}
+ .st1{fill:url(#SVGID_1_);}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <g>
+ <ellipse transform="matrix(0.8685 -0.4958 0.4958 0.8685 -21.9603 36.0747)" class="st0" cx="57" cy="59.4" rx="3.7" ry="3.7"/>
+ <path class="st0" d="M58.1,50.7c-1.8-0.2-3.8,0.1-5.5,1.1c-0.6,0.3-1.1,0.7-1.6,1.2c-0.2-0.5-0.3-1-0.5-1.6
+ c-1.4-5.9,4.5-8.1,5.1-14.1c0.9-8.6-10.6-8.8-15.3-3.7c-6.2,6.7-3.6,14-0.4,18.3c2.5,3.2,5.5,5.2,8.3,6.3
+ c-0.2,1.8,0.1,3.8,1.1,5.5c0.3,0.6,0.7,1.1,1.2,1.6c-0.5,0.2-1,0.3-1.6,0.5c-5.9,1.4-8.1-4.5-14.1-5.1
+ c-8.6-0.9-8.8,10.6-3.7,15.3c6.7,6.2,14,3.6,18.3,0.3c3.2-2.5,5.2-5.5,6.3-8.3c1.8,0.2,3.8-0.1,5.5-1.1c0.6-0.3,1.1-0.7,1.6-1.2
+ c0.2,0.5,0.3,1,0.5,1.6c1.4,5.9-4.5,8.1-5.1,14.1c-0.9,8.6,10.6,8.8,15.3,3.7c6.2-6.7,3.6-14,0.3-18.3c-2.5-3.2-5.5-5.2-8.3-6.3
+ c0.2-1.8-0.1-3.8-1.1-5.5c-0.3-0.6-0.7-1.1-1.2-1.6c0.5-0.2,1-0.3,1.6-0.5c5.9-1.4,8.1,4.5,14.1,5.1c8.6,0.9,8.8-10.6,3.7-15.3
+ c-6.7-6.2-14-3.6-18.3-0.4c-1.2,0.9-2.2,1.8-3,2.8"/>
+ </g>
+ <g>
+
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-26.1323" y1="141.6157" x2="145.4036" y2="-22.8267" gradientTransform="matrix(1 5.464556e-03 -5.464556e-03 1 -2.5808 -2.4627)">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st1" d="M57,114c-0.1,0-0.2,0-0.3,0C25.3,113.8-0.2,88.1,0,56.7C0.2,25.4,25.7,0,57,0c0.1,0,0.2,0,0.3,0
+ c31.4,0.2,56.9,25.9,56.7,57.3l0,0C113.8,88.6,88.3,114,57,114z M57,2C26.8,2,2.2,26.5,2,56.7C1.8,87,26.4,111.8,56.7,112
+ c0.1,0,0.2,0,0.3,0c30.2,0,54.8-24.5,55-54.7C112.2,27,87.6,2.2,57.3,2C57.2,2,57.1,2,57,2z"/>
+ </g>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_Front_Active.svg b/app/images/HMI_HVAC_Front_Active.svg
new file mode 100644
index 0000000..146e509
--- /dev/null
+++ b/app/images/HMI_HVAC_Front_Active.svg
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#0DF9FF;}
+ .st1{font-family:'Roboto-Regular';}
+ .st2{font-size:19.2px;}
+ .st3{letter-spacing:3;}
+ .st4{fill:url(#SVGID_1_);}
+ .st5{fill:url(#SVGID_2_);}
+ .st6{fill:url(#SVGID_3_);}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <g>
+ <text transform="matrix(1 0 0 1 30.8062 42.6951)" class="st0 st1 st2 st3">FRONT</text>
+ </g>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="11.6389" y1="158.3479" x2="114.2385" y2="3.0985">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st4" d="M70,138.5c-0.1,0-0.3,0-0.4,0c-37.8-0.2-68.3-31.1-68.1-68.9C1.7,32,32.4,1.5,70,1.5c0.1,0,0.3,0,0.4,0
+ c18.3,0.1,35.5,7.3,48.3,20.3s19.9,30.2,19.8,48.5c-0.1,18.3-7.3,35.5-20.3,48.3C105.3,131.5,88.2,138.5,70,138.5z M70,3.9
+ c-17.5,0-34,6.8-46.5,19.1C11,35.4,4,52,3.9,69.6c-0.2,36.4,29.3,66.3,65.7,66.5c0.1,0,0.2,0,0.4,0c17.5,0,34-6.8,46.5-19.1
+ c12.6-12.4,19.5-29,19.6-46.6l0,0c0.1-17.7-6.7-34.3-19.1-46.8S88,4,70.4,3.9C70.2,3.9,70.1,3.9,70,3.9z"/>
+ </g>
+ <g>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="13.3004" y1="159.5306" x2="115.9684" y2="4.1777">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st5" d="M50.3,107.7L17.4,73.8l0.8-0.8C32,59,50.4,51.4,70,51.3c0,0,0.1,0,0.1,0c19.5,0,37.9,7.6,51.7,21.5l0.8,0.8
+ L97,100.2l-1.7-1.7l24-24.8c-13.2-12.9-30.6-20-49.1-20c0,0-0.1,0-0.1,0c-18.5,0-36,7.2-49.2,20.1l29.6,30.5
+ c5.4-4.9,12.4-7.5,19.7-7.5c0,0,0,0,0,0c7.7,0,15,2.9,20.5,8.3l-1.7,1.7c-5.1-4.9-11.8-7.6-18.9-7.6c0,0,0,0,0,0
+ c-7.1,0-13.8,2.7-18.9,7.7L50.3,107.7z"/>
+ </g>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="16.1835" y1="161.4359" x2="118.8515" y2="6.083">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st6" d="M70.7,89.5c-2,0-3.4-1.4-3.5-1.6l-6.8-5.5c-0.9-1.3-2.2-1.9-3.4-1.8c-1.4,0.1-2.7,1.1-3.6,2.7
+ c-1.5,2.6-3.5,4.2-5.8,4.3c-2.1,0.1-4.1-1.1-5.6-3.3l-1.2-1.7c-0.9-1.3-2.1-2-3.4-2c-1.4,0.1-2.7,1-3.6,2.6l-0.6,1l-2-3.9
+ l0.2-0.3c1.5-2.6,3.6-4.1,5.9-4.2c2.1-0.1,4.1,1.1,5.7,3.3l1.2,1.7c0.9,1.3,2.1,2.1,3.3,2c1.3-0.1,2.6-1,3.5-2.6
+ c1.5-2.6,3.6-4.2,5.9-4.4c2.1-0.2,4.1,0.9,5.6,2.9l6.5,5.2c0.2,0.2,0.8,0.7,1.6,0.7c0,0,0,0,0,0c0.6,0,1.3-0.4,1.9-1l4.2-3.7
+ c1.5-2.6,3.6-4,5.8-4.1c2.2-0.1,4.1,1.1,5.7,3.3l1.2,1.7c0.9,1.3,2.1,2,3.3,2c1.3-0.1,2.6-1,3.5-2.6c1.5-2.6,3.6-4.2,5.9-4.4
+ c2.1-0.1,4.1,0.9,5.6,3l0.2,0.3l-1.7,4.2l-0.6-0.9c-0.9-1.3-2.1-1.9-3.4-1.8c-1.4,0.1-2.7,1.1-3.6,2.7c-1.5,2.6-3.5,4.2-5.8,4.3
+ c-2.1,0.1-4.1-1.1-5.7-3.3l-1.2-1.7c-0.9-1.3-2.1-2-3.4-2c-1.4,0.1-2.7,1-3.6,2.6L79,83.4l-5.1,4.7l0,0
+ C72.9,89,71.8,89.5,70.7,89.5z M61.3,81.7L68,87c0.1,0.1,1.2,1.3,2.7,1.3c1,0,2-0.5,3-1.6l0.6-0.6l0.1,0.1l3.9-3.6
+ c1.1-1.9,2.8-3.1,4.5-3.1c1.6-0.1,3.2,0.8,4.4,2.5l1.2,1.7c1.3,1.9,2.9,2.8,4.6,2.8c1.8-0.1,3.5-1.4,4.8-3.7
+ c1.1-2,2.8-3.2,4.6-3.3c1.4-0.1,2.7,0.4,3.7,1.5l0.7-1.7c-1.3-1.6-2.8-2.4-4.4-2.3c-1.9,0.1-3.7,1.5-4.9,3.8
+ c-1.1,2-2.7,3.2-4.5,3.2c-1.7,0.1-3.2-0.8-4.4-2.5l-1.2-1.7C86,77.9,84.4,77,82.7,77c-1.9,0.1-3.6,1.4-4.9,3.6l-0.1,0.2
+ l-4.3,3.7c-0.8,0.9-1.7,1.3-2.7,1.3c-1.3,0.1-2.2-0.8-2.5-1l-6.7-5.3c-1.3-1.7-2.9-2.6-4.6-2.5c-1.9,0.1-3.7,1.5-4.9,3.8
+ c-1.1,2-2.7,3.2-4.5,3.2c-1.7,0-3.2-0.8-4.4-2.5L42,79.8c-1.3-1.9-2.9-2.8-4.6-2.8c-1.8,0.1-3.4,1.2-4.7,3.3l0.7,1.4
+ c1.1-1.4,2.5-2.3,4-2.3c1.7,0,3.2,0.8,4.4,2.5l1.2,1.7c1.3,1.9,2.9,2.8,4.6,2.8c1.8-0.1,3.5-1.4,4.8-3.7c1.1-2,2.8-3.2,4.6-3.3
+ C58.6,79.3,60.2,80.1,61.3,81.7z"/>
+ </g>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_Front_Inactive.svg b/app/images/HMI_HVAC_Front_Inactive.svg
new file mode 100644
index 0000000..c5d9166
--- /dev/null
+++ b/app/images/HMI_HVAC_Front_Inactive.svg
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_HVAC_Front_Inactive.svg"><metadata
+ id="metadata31"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs29" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview27"
+ showgrid="false"
+ inkscape:zoom="1.6857143"
+ inkscape:cx="-161.94915"
+ inkscape:cy="70"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#848286;}
+ .st1{font-family:'Roboto-Regular';}
+ .st2{font-size:19.2px;}
+ .st3{letter-spacing:3;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><g
+ id="g11"><text
+ transform="matrix(1 0 0 1 30.8062 42.6951)"
+ class="st0 st1 st2 st3"
+ id="text13">FRONT</text>
+</g><g
+ id="g15"><path
+ class="st0"
+ d="M70,138.5c-0.1,0-0.3,0-0.4,0c-37.8-0.2-68.3-31.1-68.1-68.9C1.7,32,32.4,1.5,70,1.5c0.1,0,0.3,0,0.4,0 c18.3,0.1,35.5,7.3,48.3,20.3s19.9,30.2,19.8,48.5c-0.1,18.3-7.3,35.5-20.3,48.3C105.3,131.5,88.2,138.5,70,138.5z M70,3.9 c-17.5,0-34,6.8-46.5,19.1C11,35.4,4,52,3.9,69.6c-0.2,36.4,29.3,66.3,65.7,66.5c0.1,0,0.2,0,0.4,0c17.5,0,34-6.8,46.5-19.1 c12.6-12.4,19.5-29,19.6-46.6l0,0c0.1-17.7-6.7-34.3-19.1-46.8S88,4,70.4,3.9C70.2,3.9,70.1,3.9,70,3.9z"
+ id="path17" /></g><g
+ id="g19"><path
+ class="st0"
+ d="M50.3,107.7L17.4,73.8l0.8-0.8C32,59,50.4,51.4,70,51.3c0,0,0.1,0,0.1,0c19.5,0,37.9,7.6,51.7,21.5l0.8,0.8 L97,100.2l-1.7-1.7l24-24.8c-13.2-12.9-30.6-20-49.1-20c0,0-0.1,0-0.1,0c-18.5,0-36,7.2-49.2,20.1l29.6,30.5 c5.4-4.9,12.4-7.5,19.7-7.5c0,0,0,0,0,0c7.7,0,15,2.9,20.5,8.3l-1.7,1.7c-5.1-4.9-11.8-7.6-18.9-7.6c0,0,0,0,0,0 c-7.1,0-13.8,2.7-18.9,7.7L50.3,107.7z"
+ id="path21" /></g><g
+ id="g23"><path
+ class="st0"
+ d="M70.7,89.5c-2,0-3.4-1.4-3.5-1.6l-6.8-5.5c-0.9-1.3-2.2-1.9-3.4-1.8c-1.4,0.1-2.7,1.1-3.6,2.7 c-1.5,2.6-3.5,4.2-5.8,4.3c-2.1,0.1-4.1-1.1-5.6-3.3l-1.2-1.7c-0.9-1.3-2.1-2-3.4-2c-1.4,0.1-2.7,1-3.6,2.6l-0.6,1l-2-3.9 l0.2-0.3c1.5-2.6,3.6-4.1,5.9-4.2c2.1-0.1,4.1,1.1,5.7,3.3l1.2,1.7c0.9,1.3,2.1,2.1,3.3,2c1.3-0.1,2.6-1,3.5-2.6 c1.5-2.6,3.6-4.2,5.9-4.4c2.1-0.2,4.1,0.9,5.6,2.9l6.5,5.2c0.2,0.2,0.8,0.7,1.6,0.7c0,0,0,0,0,0c0.6,0,1.3-0.4,1.9-1l4.2-3.7 c1.5-2.6,3.6-4,5.8-4.1c2.2-0.1,4.1,1.1,5.7,3.3l1.2,1.7c0.9,1.3,2.1,2,3.3,2c1.3-0.1,2.6-1,3.5-2.6c1.5-2.6,3.6-4.2,5.9-4.4 c2.1-0.1,4.1,0.9,5.6,3l0.2,0.3l-1.7,4.2l-0.6-0.9c-0.9-1.3-2.1-1.9-3.4-1.8c-1.4,0.1-2.7,1.1-3.6,2.7c-1.5,2.6-3.5,4.2-5.8,4.3 c-2.1,0.1-4.1-1.1-5.7-3.3l-1.2-1.7c-0.9-1.3-2.1-2-3.4-2c-1.4,0.1-2.7,1-3.6,2.6L79,83.4l-5.1,4.7l0,0 C72.9,89,71.8,89.5,70.7,89.5z M61.3,81.7L68,87c0.1,0.1,1.2,1.3,2.7,1.3c1,0,2-0.5,3-1.6l0.6-0.6l0.1,0.1l3.9-3.6 c1.1-1.9,2.8-3.1,4.5-3.1c1.6-0.1,3.2,0.8,4.4,2.5l1.2,1.7c1.3,1.9,2.9,2.8,4.6,2.8c1.8-0.1,3.5-1.4,4.8-3.7 c1.1-2,2.8-3.2,4.6-3.3c1.4-0.1,2.7,0.4,3.7,1.5l0.7-1.7c-1.3-1.6-2.8-2.4-4.4-2.3c-1.9,0.1-3.7,1.5-4.9,3.8 c-1.1,2-2.7,3.2-4.5,3.2c-1.7,0.1-3.2-0.8-4.4-2.5l-1.2-1.7C86,77.9,84.4,77,82.7,77c-1.9,0.1-3.6,1.4-4.9,3.6l-0.1,0.2 l-4.3,3.7c-0.8,0.9-1.7,1.3-2.7,1.3c-1.3,0.1-2.2-0.8-2.5-1l-6.7-5.3c-1.3-1.7-2.9-2.6-4.6-2.5c-1.9,0.1-3.7,1.5-4.9,3.8 c-1.1,2-2.7,3.2-4.5,3.2c-1.7,0-3.2-0.8-4.4-2.5L42,79.8c-1.3-1.9-2.9-2.8-4.6-2.8c-1.8,0.1-3.4,1.2-4.7,3.3l0.7,1.4 c1.1-1.4,2.5-2.3,4-2.3c1.7,0,3.2,0.8,4.4,2.5l1.2,1.7c1.3,1.9,2.9,2.8,4.6,2.8c1.8-0.1,3.5-1.4,4.8-3.7c1.1-2,2.8-3.2,4.6-3.3 C58.6,79.3,60.2,80.1,61.3,81.7z"
+ id="path25" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_HVAC_Inactive.svg b/app/images/HMI_HVAC_Inactive.svg
new file mode 100644
index 0000000..2956a26
--- /dev/null
+++ b/app/images/HMI_HVAC_Inactive.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 318 219"
+ style="enable-background:new 0 0 318 219;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#848286;}
+ .st1{font-family:'Roboto-Light';}
+ .st2{font-size:88.6888px;}
+ .st3{letter-spacing:3;}
+ .st4{letter-spacing:-3;}
+ .st5{fill:none;stroke:#848286;stroke-miterlimit:10;}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <rect x="0.5" y="0.5" class="st5" width="317" height="218"/>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_Left_Chair_OFF.svg b/app/images/HMI_HVAC_Left_Chair_OFF.svg
new file mode 100644
index 0000000..1412266
--- /dev/null
+++ b/app/images/HMI_HVAC_Left_Chair_OFF.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 172 172"
+ style="enable-background:new 0 0 172 172;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_HVAC_Left_Chair_OFF.svg"><metadata
+ id="metadata49"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs47" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview45"
+ showgrid="false"
+ inkscape:zoom="1.372093"
+ inkscape:cx="-267.83898"
+ inkscape:cy="86"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:none;stroke:#69676C;stroke-width:4;stroke-miterlimit:10;}
+ .st1{opacity:0.43;fill:#69676C;}
+ .st2{fill:#69676C;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><path
+ class="st0"
+ d="M32.3,135.3h92.4l39.2-114.9c0,0,2.5-10.9-9.1-11.4c-11.6-0.5-19,16.2-19,16.2S123.6,66,111.8,95.6 c0,0-76.7-4.6-89.8-4.6S5.4,96.1,9.5,105.1S32.3,135.3,32.3,135.3z"
+ id="path11" /><path
+ class="st1"
+ d="M32.3,134.7h92.4l39.2-114.9c0,0,2.5-10.9-9.1-11.4s-19,16.2-19,16.2S123.6,65.3,111.8,95 c0,0-76.7-4.6-89.8-4.6S5.4,95.4,9.5,104.5S32.3,134.7,32.3,134.7z"
+ id="path13" /><g
+ id="g15"><g
+ id="g17"><path
+ class="st0"
+ d="M42.4,163.6c0,0,35.8-24,12.9-58.3C37.8,79,29.8,63.5,30.9,48.6"
+ id="path19" /><g
+ id="g21"><polygon
+ class="st2"
+ points="40.4,53.7 34.4,34.7 21,49.4 "
+ id="polygon23" /></g></g></g><g
+ id="g25"><g
+ id="g27"><path
+ class="st0"
+ d="M66.1,163.6c0,0,35.8-24,12.9-58.3C61.4,79,53.5,63.5,54.6,48.6"
+ id="path29" /><g
+ id="g31"><polygon
+ class="st2"
+ points="64.1,53.7 58.1,34.7 44.6,49.4 "
+ id="polygon33" /></g></g></g><g
+ id="g35"><g
+ id="g37"><path
+ class="st0"
+ d="M90.4,163.6c0,0,35.8-24,12.9-58.3C85.7,79,77.8,63.5,78.8,48.6"
+ id="path39" /><g
+ id="g41"><polygon
+ class="st2"
+ points="88.3,53.7 82.4,34.7 68.9,49.4 "
+ id="polygon43" /></g></g></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_HVAC_Left_Chair_ON.svg b/app/images/HMI_HVAC_Left_Chair_ON.svg
new file mode 100644
index 0000000..b27b126
--- /dev/null
+++ b/app/images/HMI_HVAC_Left_Chair_ON.svg
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 172 172"
+ style="enable-background:new 0 0 172 172;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:none;stroke:#0DF9FF;stroke-width:4;stroke-miterlimit:10;}
+ .st1{opacity:0.43;fill:url(#SVGID_1_);}
+ .st2{fill:#0DF9FF;}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <path class="st0" d="M32.3,135h92.4l39.2-114.9c0,0,2.5-10.9-9.1-11.4s-19,16.2-19,16.2s-12.3,40.7-24.1,70.4
+ c0,0-76.7-4.6-89.8-4.6S5.4,95.8,9.5,104.8S32.3,135,32.3,135z"/>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="19.4613" y1="198.7467" x2="133.8248" y2="-3.84">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st1" d="M32.3,135h92.4l39.2-114.9c0,0,2.5-10.9-9.1-11.4s-19,16.2-19,16.2s-12.3,40.7-24.1,70.4
+ c0,0-76.7-4.6-89.8-4.6S5.4,95.8,9.5,104.8S32.3,135,32.3,135z"/>
+ <g>
+ <g>
+ <path class="st0" d="M42.4,163.3c0,0,35.8-24,12.9-58.3C37.8,78.7,29.8,63.2,30.9,48.3"/>
+ <g>
+ <polygon class="st2" points="40.4,53.4 34.4,34.4 21,49.1 "/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <g>
+ <path class="st0" d="M66.1,163.3c0,0,35.8-24,12.9-58.3C61.4,78.7,53.5,63.2,54.6,48.3"/>
+ <g>
+ <polygon class="st2" points="64.1,53.4 58.1,34.4 44.6,49.1 "/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <g>
+ <path class="st0" d="M90.4,163.3c0,0,35.8-24,12.9-58.3C85.7,78.7,77.8,63.2,78.8,48.3"/>
+ <g>
+ <polygon class="st2" points="88.3,53.4 82.4,34.4 68.9,49.1 "/>
+ </g>
+ </g>
+ </g>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_Rear_Active.svg b/app/images/HMI_HVAC_Rear_Active.svg
new file mode 100644
index 0000000..182ccbd
--- /dev/null
+++ b/app/images/HMI_HVAC_Rear_Active.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#0DF9FF;}
+ .st1{font-family:'Roboto-Regular';}
+ .st2{font-size:19.2px;}
+ .st3{letter-spacing:3;}
+ .st4{fill:url(#SVGID_1_);}
+ .st5{fill:url(#SVGID_2_);}
+ .st6{fill:url(#SVGID_3_);}
+ .st7{fill:url(#SVGID_4_);}
+ .st8{fill:url(#SVGID_5_);}
+ .st9{fill:url(#SVGID_6_);}
+ .st10{fill:url(#SVGID_7_);}
+ .st11{fill:url(#SVGID_8_);}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+ <text transform="matrix(1 0 0 1 39.3138 38.5051)" class="st0 st1 st2 st3">REAR</text>
+ <g>
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="10.4889" y1="155.8405" x2="117.1391" y2="1.9402">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st4" d="M70,138.5c-0.1,0-0.3,0-0.4,0c-37.8-0.2-68.3-31.1-68.1-68.9c0.1-18.3,7.3-35.5,20.3-48.3
+ C34.7,8.5,51.8,1.5,70,1.5c0.1,0,0.3,0,0.4,0c18.3,0.1,35.5,7.3,48.3,20.3c12.9,13,19.9,30.2,19.8,48.5
+ C138.3,108,107.6,138.5,70,138.5z M70,3.9c-17.5,0-34,6.8-46.5,19.1C11,35.4,4,52,3.9,69.6c-0.2,36.4,29.3,66.3,65.7,66.5
+ c0.1,0,0.2,0,0.4,0c36.3,0,65.9-29.4,66.1-65.7l0,0c0.1-17.7-6.7-34.3-19.1-46.8C104.6,11,88,4,70.4,3.9
+ C70.2,3.9,70.1,3.9,70,3.9z"/>
+ </g>
+ <g>
+ <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="11.5789" y1="156.6799" x2="118.2996" y2="2.6779">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <polygon class="st5" points="30.5,97.5 30.5,47.4 109.5,47.3 109.5,97.4 60.7,97.4 60.7,95 107.1,95 107.1,49.7 32.9,49.8
+ 32.9,95.1 51.9,95 51.9,97.4 "/>
+ </g>
+ <g>
+ <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="9.0573" y1="154.9325" x2="115.778" y2="0.9304">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st6" d="M57.1,111.6l-2.1-1.2c1.6-2.8,5.4-11.2,4.2-15.7c-0.8-2.8-1.8-4.4-3-6.1c-2.4-3.6-4.9-7.3-4.4-21.7l2.4,0.1
+ c-0.6,13.6,1.6,16.8,3.9,20.2c1.2,1.8,2.5,3.6,3.3,6.9C63.3,100.5,57.4,111.2,57.1,111.6z"/>
+ </g>
+ <g>
+ <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="0.4632" y1="148.9769" x2="107.1839" y2="-5.0251">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <polygon class="st7" points="50,75.1 47.9,74 53.1,64.4 58.4,74 56.3,75.1 53.1,69.4 "/>
+ </g>
+ <g>
+ <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="19.6431" y1="162.2683" x2="126.3638" y2="8.2663">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st8" d="M72.8,111.6l-2.1-1.2c1.6-2.8,5.4-11.2,4.2-15.7c-0.8-2.8-1.8-4.4-3-6.1c-2.4-3.6-4.9-7.3-4.4-21.7l2.4,0.1
+ c-0.6,13.6,1.6,16.8,3.9,20.2c1.2,1.8,2.5,3.6,3.3,6.9C78.9,100.5,73,111.2,72.8,111.6z"/>
+ </g>
+ <g>
+ <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="11.0493" y1="156.3129" x2="117.77" y2="2.3109">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <polygon class="st9" points="72,75.1 68.8,69.4 65.6,75.1 63.5,74 68.8,64.4 74.1,74 "/>
+ </g>
+ <g>
+ <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="30.229" y1="169.6041" x2="136.9497" y2="15.6021">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st10" d="M88.5,111.6l-2.1-1.2c1.6-2.8,5.4-11.2,4.3-15.7c-0.8-2.8-1.8-4.4-3-6.1c-2.4-3.6-4.9-7.3-4.4-21.7
+ l2.4,0.1c-0.6,13.6,1.6,16.8,3.9,20.2c1.2,1.8,2.5,3.6,3.3,6.9C94.6,100.5,88.7,111.2,88.5,111.6z"/>
+ </g>
+ <g>
+ <linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="21.6348" y1="163.6485" x2="128.3555" y2="9.6464">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <polygon class="st11" points="81.3,75.1 79.2,74 84.5,64.4 89.7,74 87.6,75.1 84.5,69.4 "/>
+ </g>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/HMI_HVAC_Rear_Inactive.svg b/app/images/HMI_HVAC_Rear_Inactive.svg
new file mode 100644
index 0000000..574c541
--- /dev/null
+++ b/app/images/HMI_HVAC_Rear_Inactive.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 140 140"
+ style="enable-background:new 0 0 140 140;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_HVAC_Rear_Inactive.svg"><metadata
+ id="metadata49"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs47" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview45"
+ showgrid="false"
+ inkscape:zoom="1.6857143"
+ inkscape:cx="-285.9322"
+ inkscape:cy="70"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#848286;}
+ .st1{font-family:'Roboto-Regular';}
+ .st2{font-size:19.2px;}
+ .st3{letter-spacing:3;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><text
+ transform="matrix(1 0 0 1 39.3138 38.5051)"
+ class="st0 st1 st2 st3"
+ id="text11">REAR</text>
+<g
+ id="g13"><path
+ class="st0"
+ d="M70,138.5c-0.1,0-0.3,0-0.4,0c-37.8-0.2-68.3-31.1-68.1-68.9c0.1-18.3,7.3-35.5,20.3-48.3 C34.7,8.5,51.8,1.5,70,1.5c0.1,0,0.3,0,0.4,0c18.3,0.1,35.5,7.3,48.3,20.3c12.9,13,19.9,30.2,19.8,48.5 C138.3,108,107.6,138.5,70,138.5z M70,3.9c-17.5,0-34,6.8-46.5,19.1C11,35.4,4,52,3.9,69.6c-0.2,36.4,29.3,66.3,65.7,66.5 c0.1,0,0.2,0,0.4,0c36.3,0,65.9-29.4,66.1-65.7l0,0c0.1-17.7-6.7-34.3-19.1-46.8C104.6,11,88,4,70.4,3.9 C70.2,3.9,70.1,3.9,70,3.9z"
+ id="path15" /></g><g
+ id="g17"><polygon
+ class="st0"
+ points="30.5,97.5 30.5,47.4 109.5,47.3 109.5,97.4 60.7,97.4 60.7,95 107.1,95 107.1,49.7 32.9,49.8 32.9,95.1 51.9,95 51.9,97.4 "
+ id="polygon19" /></g><g
+ id="g21"><path
+ class="st0"
+ d="M57.1,111.6l-2.1-1.2c1.6-2.8,5.4-11.2,4.2-15.7c-0.8-2.8-1.8-4.4-3-6.1c-2.4-3.6-4.9-7.3-4.4-21.7l2.4,0.1 c-0.6,13.6,1.6,16.8,3.9,20.2c1.2,1.8,2.5,3.6,3.3,6.9C63.3,100.5,57.4,111.2,57.1,111.6z"
+ id="path23" /></g><g
+ id="g25"><polygon
+ class="st0"
+ points="50,75.1 47.9,74 53.1,64.4 58.4,74 56.3,75.1 53.1,69.4 "
+ id="polygon27" /></g><g
+ id="g29"><path
+ class="st0"
+ d="M72.8,111.6l-2.1-1.2c1.6-2.8,5.4-11.2,4.2-15.7c-0.8-2.8-1.8-4.4-3-6.1c-2.4-3.6-4.9-7.3-4.4-21.7l2.4,0.1 c-0.6,13.6,1.6,16.8,3.9,20.2c1.2,1.8,2.5,3.6,3.3,6.9C78.9,100.5,73,111.2,72.8,111.6z"
+ id="path31" /></g><g
+ id="g33"><polygon
+ class="st0"
+ points="72,75.1 68.8,69.4 65.6,75.1 63.5,74 68.8,64.4 74.1,74 "
+ id="polygon35" /></g><g
+ id="g37"><path
+ class="st0"
+ d="M88.5,111.6l-2.1-1.2c1.6-2.8,5.4-11.2,4.3-15.7c-0.8-2.8-1.8-4.4-3-6.1c-2.4-3.6-4.9-7.3-4.4-21.7l2.4,0.1 c-0.6,13.6,1.6,16.8,3.9,20.2c1.2,1.8,2.5,3.6,3.3,6.9C94.6,100.5,88.7,111.2,88.5,111.6z"
+ id="path39" /></g><g
+ id="g41"><polygon
+ class="st0"
+ points="81.3,75.1 79.2,74 84.5,64.4 89.7,74 87.6,75.1 84.5,69.4 "
+ id="polygon43" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_HVAC_Right_Chair_OFF.svg b/app/images/HMI_HVAC_Right_Chair_OFF.svg
new file mode 100644
index 0000000..711a942
--- /dev/null
+++ b/app/images/HMI_HVAC_Right_Chair_OFF.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:i="&amp;ns_ai;"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_2"
+ x="0px"
+ y="0px"
+ viewBox="0 0 172 172"
+ style="enable-background:new 0 0 172 172;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_HVAC_Right_Chair_OFF.svg"><metadata
+ id="metadata49"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs47" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1464"
+ id="namedview45"
+ showgrid="false"
+ inkscape:zoom="1.372093"
+ inkscape:cx="-273.66949"
+ inkscape:cy="86"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_2" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:none;stroke:#69676C;stroke-width:4;stroke-miterlimit:10;}
+ .st1{opacity:0.43;fill:#69676C;}
+ .st2{fill:#69676C;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><path
+ class="st0"
+ d="M139.7,135H47.3L8.1,20.1c0,0-2.5-10.9,9.1-11.4c11.6-0.5,19,16.2,19,16.2s12.3,40.7,24.1,70.4 c0,0,76.7-4.6,89.8-4.6c13.1,0,16.6,5.1,12.5,14.1S139.7,135,139.7,135z"
+ id="path11" /><path
+ class="st1"
+ d="M139.7,135H47.3L8.1,20.1c0,0-2.5-10.9,9.1-11.4c11.6-0.5,19,16.2,19,16.2s12.3,40.7,24.1,70.4 c0,0,76.7-4.6,89.8-4.6c13.1,0,16.6,5.1,12.5,14.1S139.7,135,139.7,135z"
+ id="path13" /><g
+ id="g15"><g
+ id="g17"><path
+ class="st0"
+ d="M129.6,163.3c0,0-35.8-24-12.9-58.3c17.5-26.3,25.5-41.8,24.4-56.7"
+ id="path19" /><g
+ id="g21"><polygon
+ class="st2"
+ points="151,49.1 137.6,34.4 131.6,53.4 "
+ id="polygon23" /></g></g></g><g
+ id="g25"><g
+ id="g27"><path
+ class="st0"
+ d="M105.9,163.3c0,0-35.8-24-12.9-58.3c17.5-26.3,25.5-41.8,24.4-56.7"
+ id="path29" /><g
+ id="g31"><polygon
+ class="st2"
+ points="127.4,49.1 113.9,34.4 107.9,53.4 "
+ id="polygon33" /></g></g></g><g
+ id="g35"><g
+ id="g37"><path
+ class="st0"
+ d="M81.6,163.3c0,0-35.8-24-12.9-58.3c17.5-26.3,25.5-41.8,24.4-56.7"
+ id="path39" /><g
+ id="g41"><polygon
+ class="st2"
+ points="103.1,49.1 89.6,34.4 83.7,53.4 "
+ id="polygon43" /></g></g></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_HVAC_Right_Chair_ON.svg b/app/images/HMI_HVAC_Right_Chair_ON.svg
new file mode 100644
index 0000000..74b4861
--- /dev/null
+++ b/app/images/HMI_HVAC_Right_Chair_ON.svg
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Layer_2" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 172 172"
+ style="enable-background:new 0 0 172 172;" xml:space="preserve">
+<style type="text/css">
+ .st0{opacity:0.43;fill:url(#SVGID_1_);}
+ .st1{fill:none;stroke:#0DF9FF;stroke-width:4;stroke-miterlimit:10;}
+ .st2{fill:#0DF9FF;}
+</style>
+<switch>
+ <g i:extraneous="self">
+ <g>
+
+ <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-670.8471" y1="198.7467" x2="-556.4836" y2="-3.84" gradientTransform="matrix(-1 0 0 1 -518.3083 0)">
+ <stop offset="0" style="stop-color:#00ADDC"/>
+ <stop offset="1" style="stop-color:#6BFBFF"/>
+ </linearGradient>
+ <path class="st0" d="M139.7,135H47.3L8.1,20.1c0,0-2.5-10.9,9.1-11.4c11.6-0.5,19,16.2,19,16.2s12.3,40.7,24.1,70.4
+ c0,0,76.7-4.6,89.8-4.6c13.1,0,16.6,5.1,12.5,14.1S139.7,135,139.7,135z"/>
+ <g>
+ <g>
+ <path class="st1" d="M129.6,163.3c0,0-35.8-24-12.9-58.3c17.5-26.3,25.5-41.8,24.4-56.7"/>
+ <g>
+ <polygon class="st2" points="151,49.1 137.6,34.4 131.6,53.4 "/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <g>
+ <path class="st1" d="M105.9,163.3c0,0-35.8-24-12.9-58.3c17.5-26.3,25.5-41.8,24.4-56.7"/>
+ <g>
+ <polygon class="st2" points="127.4,49.1 113.9,34.4 107.9,53.4 "/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <g>
+ <path class="st1" d="M81.6,163.3c0,0-35.8-24-12.9-58.3c17.5-26.3,25.5-41.8,24.4-56.7"/>
+ <g>
+ <polygon class="st2" points="103.1,49.1 89.6,34.4 83.7,53.4 "/>
+ </g>
+ </g>
+ </g>
+ <path class="st1" d="M139.7,135H47.3L8.1,20.1c0,0-2.5-10.9,9.1-11.4c11.6-0.5,19,16.2,19,16.2s12.3,40.7,24.1,70.4
+ c0,0,76.7-4.6,89.8-4.6c13.1,0,16.6,5.1,12.5,14.1S139.7,135,139.7,135z"/>
+ </g>
+ </g>
+</switch>
+</svg>
diff --git a/app/images/images.qrc b/app/images/images.qrc
new file mode 100644
index 0000000..036c1f5
--- /dev/null
+++ b/app/images/images.qrc
@@ -0,0 +1,26 @@
+<RCC>
+ <qresource prefix="/images">
+ <file>HMI_HVAC_AirDown_Active.svg</file>
+ <file>HMI_HVAC_AirDown_Inactive.svg</file>
+ <file>HMI_HVAC_AirRight_Active.svg</file>
+ <file>HMI_HVAC_AirRight_Inactive.svg</file>
+ <file>HMI_HVAC_AirUp_Active.svg</file>
+ <file>HMI_HVAC_AirUp_Inactive.svg</file>
+ <file>HMI_HVAC_ChairIndicator_OFF.svg</file>
+ <file>HMI_HVAC_ChairIndicator_One.svg</file>
+ <file>HMI_HVAC_ChairIndicator_Two.svg</file>
+ <file>HMI_HVAC_Circulation_Active.svg</file>
+ <file>HMI_HVAC_Circulation_Inactive.svg</file>
+ <file>HMI_HVAC_Fan_Icon.svg</file>
+ <file>HMI_HVAC_Front_Active.svg</file>
+ <file>HMI_HVAC_Front_Inactive.svg</file>
+ <file>HMI_HVAC_Left_Chair_OFF.svg</file>
+ <file>HMI_HVAC_Left_Chair_ON.svg</file>
+ <file>HMI_HVAC_Rear_Active.svg</file>
+ <file>HMI_HVAC_Rear_Inactive.svg</file>
+ <file>HMI_HVAC_Right_Chair_OFF.svg</file>
+ <file>HMI_HVAC_Right_Chair_ON.svg</file>
+ <file>HMI_HVAC_Active.svg</file>
+ <file>HMI_HVAC_Inactive.svg</file>
+ </qresource>
+</RCC>
diff --git a/app/main.cpp b/app/main.cpp
new file mode 100644
index 0000000..d7c45e0
--- /dev/null
+++ b/app/main.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (c) 2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <QtCore/QDebug>
+#include <QtCore/QCommandLineParser>
+#include <QtCore/QUrlQuery>
+#include <QtGui/QGuiApplication>
+#include <QtQml/QQmlApplicationEngine>
+#include <QtQml/QQmlContext>
+#include <QtQuick/QQuickWindow>
+
+#include "translator.h"
+
+#ifdef HAVE_LIBHOMESCREEN
+#include <libhomescreen.hpp>
+#endif
+#ifdef HAVE_QLIBWINDOWMANAGER
+#include <qlibwindowmanager.h>
+#endif
+
+int main(int argc, char *argv[])
+{
+ QString myname = QString("HVAC");
+
+ QGuiApplication app(argc, argv);
+ app.setApplicationVersion(QStringLiteral("0.1.0"));
+ app.setOrganizationDomain(QStringLiteral("automotivelinux.org"));
+ app.setOrganizationName(QStringLiteral("AutomotiveGradeLinux"));
+
+ QCommandLineParser parser;
+ parser.addPositionalArgument("port", app.translate("main", "port for binding"));
+ parser.addPositionalArgument("secret", app.translate("main", "secret for binding"));
+ parser.addHelpOption();
+ parser.addVersionOption();
+ parser.process(app);
+ QStringList positionalArguments = parser.positionalArguments();
+
+ qmlRegisterType<Translator>("Translator", 1, 0, "Translator");
+
+ QQmlApplicationEngine engine;
+ QQmlContext *context = engine.rootContext();
+ QUrl bindingAddress;
+
+ int port;
+ QString secret;
+ if (positionalArguments.length() == 2) {
+ port = positionalArguments.takeFirst().toInt();
+ secret = positionalArguments.takeFirst();
+ bindingAddress.setScheme(QStringLiteral("ws"));
+ bindingAddress.setHost(QStringLiteral("localhost"));
+ bindingAddress.setPort(port);
+ bindingAddress.setPath(QStringLiteral("/api"));
+ QUrlQuery query;
+ query.addQueryItem(QStringLiteral("token"), secret);
+ bindingAddress.setQuery(query);
+ }
+ context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress);
+#ifdef HAVE_QLIBWINDOWMANAGER
+ QLibWindowmanager* qwm = new QLibWindowmanager();
+
+ // WindowManager
+ if(qwm->init(port,secret) != 0){
+ exit(EXIT_FAILURE);
+ }
+ AGLScreenInfo screenInfo(qwm->get_scale_factor());
+ engine.rootContext()->setContextProperty(QStringLiteral("screenInfo"), &screenInfo);
+ // Request a surface as described in layers.json windowmanager’s file
+ if (qwm->requestSurface(myname) != 0) {
+ exit(EXIT_FAILURE);
+ }
+ // Create an event callbnewack against an event type. Here a lambda is called when SyncDraw event occurs
+ qwm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [qwm, myname](json_object *object) {
+ fprintf(stderr, "Surface got syncDraw!\n");
+ qwm->endDraw(myname);
+ });
+#endif
+
+#ifdef HAVE_LIBHOMESCREEN
+ LibHomeScreen* hs = new LibHomeScreen();
+
+ // HomeScreen
+ std::string token = secret.toStdString();
+ hs->init(port, token.c_str());
+ // Set the event handler for Event_TapShortcut which will activate the surface for windowmanager
+ hs->set_event_handler(LibHomeScreen::Event_TapShortcut, [qwm, myname](json_object *object){
+ qwm->activateSurface(myname);
+ });
+#endif
+
+ engine.load(QUrl(QStringLiteral("qrc:/HVAC.qml")));
+ QObject *root = engine.rootObjects().first();
+ QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
+#ifdef HAVE_QLIBWINDOWMANAGER
+ QObject::connect(window, SIGNAL(frameSwapped()), qwm, SLOT(slotActivateSurface()));
+#else
+ window->resize(1920, 720);
+ window->setVisible(true);
+#endif
+
+ return app.exec();
+}
+
diff --git a/app/translations.pri b/app/translations.pri
new file mode 100644
index 0000000..81bd94b
--- /dev/null
+++ b/app/translations.pri
@@ -0,0 +1,16 @@
+defineReplace(prependAll) {
+ for(a,$$1):result += $$2$${a}$$3
+ return($$result)
+}
+
+qtPrepareTool(QMAKE_LRELEASE, lrelease)
+TRANSLATIONS = $$prependAll(LANGUAGES, $$PWD/translations/$${TARGET}_,.ts)
+
+qm.depends = $${TRANSLATIONS}
+qm.input = TRANSLATIONS
+qm.output = $$OUT_PWD/../package/root/translations/${QMAKE_FILE_BASE}.qm
+qm.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
+qm.name = LRELEASE ${QMAKE_FILE_IN}
+qm.CONFIG += no_link
+QMAKE_EXTRA_COMPILERS += qm
+PRE_TARGETDEPS += compiler_qm_make_all
diff --git a/app/translations/hvac_fr_FR.ts b/app/translations/hvac_fr_FR.ts
new file mode 100644
index 0000000..241a6f9
--- /dev/null
+++ b/app/translations/hvac_fr_FR.ts
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR">
+<context>
+ <name>HVAC</name>
+ <message>
+ <location filename="../HVAC.qml" line="66"/>
+ <source>FAN SPEED</source>
+ <translation>Vitesse de ventilation</translation>
+ </message>
+ <message>
+ <location filename="../HVAC.qml" line="98"/>
+ <source>A/C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../HVAC.qml" line="111"/>
+ <source>AUTO</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>HeatDegree</name>
+ <message>
+ <location filename="../HeatDegree.qml" line="31"/>
+ <source>LO</source>
+ <translation>BAS</translation>
+ </message>
+ <message>
+ <location filename="../HeatDegree.qml" line="33"/>
+ <source>%1°</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../HeatDegree.qml" line="35"/>
+ <source>HI</source>
+ <translation>HAU</translation>
+ </message>
+</context>
+<context>
+ <name>main</name>
+ <message>
+ <location filename="../main.cpp" line="44"/>
+ <source>port for binding</source>
+ <translation>Port du binding</translation>
+ </message>
+ <message>
+ <location filename="../main.cpp" line="45"/>
+ <source>secret for binding</source>
+ <translation>Token de sécurité du binding</translation>
+ </message>
+</context>
+</TS>
diff --git a/app/translations/hvac_ja_JP.ts b/app/translations/hvac_ja_JP.ts
new file mode 100644
index 0000000..a3a78a8
--- /dev/null
+++ b/app/translations/hvac_ja_JP.ts
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ja_JP">
+<context>
+ <name>HVAC</name>
+ <message>
+ <location filename="../HVAC.qml" line="66"/>
+ <source>FAN SPEED</source>
+ <translation>ファンの回転数</translation>
+ </message>
+ <message>
+ <location filename="../HVAC.qml" line="98"/>
+ <source>A/C</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../HVAC.qml" line="111"/>
+ <source>AUTO</source>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>HeatDegree</name>
+ <message>
+ <location filename="../HeatDegree.qml" line="31"/>
+ <source>LO</source>
+ <translation>寒</translation>
+ </message>
+ <message>
+ <location filename="../HeatDegree.qml" line="33"/>
+ <source>%1°</source>
+ <translation></translation>
+ </message>
+ <message>
+ <location filename="../HeatDegree.qml" line="35"/>
+ <source>HI</source>
+ <translation>暖</translation>
+ </message>
+</context>
+<context>
+ <name>main</name>
+ <message>
+ <location filename="../main.cpp" line="44"/>
+ <source>port for binding</source>
+ <translation>binding 用のポート</translation>
+ </message>
+ <message>
+ <location filename="../main.cpp" line="45"/>
+ <source>secret for binding</source>
+ <translation>binding 用の secret</translation>
+ </message>
+</context>
+</TS>
diff --git a/app/translator.cpp b/app/translator.cpp
new file mode 100644
index 0000000..9b67f13
--- /dev/null
+++ b/app/translator.cpp
@@ -0,0 +1,52 @@
+#include "translator.h"
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QLocale>
+#include <QtCore/QTranslator>
+#include <QtCore/QDir>
+#include <QtCore/QDebug>
+
+Translator::Translator(QObject *parent)
+ : QObject(parent)
+ , m_language(QStringLiteral("C"))
+ , m_translator(nullptr)
+{
+}
+
+QString Translator::translate(const QString &string, const QString &language) const
+{
+ Q_UNUSED(language)
+ return string;
+}
+
+QString Translator::language() const
+{
+ return m_language;
+}
+
+void Translator::setLanguage(const QString &language)
+{
+ if (m_language == language) return;
+ m_language = language;
+ setTranslator(language);
+ emit languageChanged(language);
+}
+
+void Translator::setTranslator(const QString &language)
+{
+ if (m_translator) {
+ QCoreApplication::removeTranslator(m_translator);
+ } else {
+ m_translator = new QTranslator(this);
+ }
+ QLocale locale(language);
+ QString fileName = QCoreApplication::instance()->applicationName().toLower();
+ qDebug() << "####" << QDir::currentPath() << QCoreApplication::applicationDirPath();
+ if (m_translator->load(locale, fileName, QStringLiteral("_"), QStringLiteral("%1/../translations").arg(QCoreApplication::applicationDirPath()))) {
+ QCoreApplication::installTranslator(m_translator);
+ } else {
+ delete m_translator;
+ m_translator = nullptr;
+ }
+}
+
diff --git a/app/translator.h b/app/translator.h
new file mode 100644
index 0000000..82c5872
--- /dev/null
+++ b/app/translator.h
@@ -0,0 +1,32 @@
+#ifndef TRANSLATOR_H
+#define TRANSLATOR_H
+
+#include <QtCore/QObject>
+
+class QTranslator;
+
+class Translator : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QString language READ language WRITE setLanguage NOTIFY languageChanged)
+public:
+ explicit Translator(QObject *parent = nullptr);
+
+ QString language() const;
+
+ Q_INVOKABLE QString translate(const QString &string, const QString &language) const;
+public slots:
+ void setLanguage(const QString &language);
+
+signals:
+ void languageChanged(const QString &language);
+
+private slots:
+ void setTranslator(const QString &language);
+
+private:
+ QString m_language;
+ QTranslator *m_translator;
+};
+
+#endif // TRANSLATOR_H