summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/SettingPage.qml60
-rw-r--r--app/Settings.qml60
-rw-r--r--app/SettingsLauncher.qml77
-rw-r--r--app/api/Binding.qml62
-rw-r--r--app/api/MessageId.js22
-rw-r--r--app/app.pri12
-rw-r--r--app/app.pro15
-rw-r--r--app/bluetooth/Bluetooth.qml341
-rw-r--r--app/bluetooth/bluetooth.qrc8
-rw-r--r--app/bluetooth/images/HMI_Pair_Button.svg98
-rw-r--r--app/bluetooth/images/HMI_Paired_Button.svg98
-rw-r--r--app/bluetooth/images/HMI_Settings_BluetoothIcon.svg55
-rw-r--r--app/config.tests/libhomescreen/.qmake.stash14
-rw-r--r--app/config.tests/libhomescreen/libhomescreen.cpp8
-rw-r--r--app/config.tests/libhomescreen/libhomescreen.pro5
-rw-r--r--app/datetime/DateEdit.qml122
-rw-r--r--app/datetime/DateTime.qml50
-rw-r--r--app/datetime/EditSeparator.qml40
-rw-r--r--app/datetime/TimeEdit.qml86
-rw-r--r--app/datetime/datetime.qrc14
-rw-r--r--app/datetime/images/HMI_Settings_TimeDate_Arrow_DividingLine.svg57
-rw-r--r--app/datetime/images/HMI_Settings_TimeDate_Arrow_Down.svg56
-rw-r--r--app/datetime/images/HMI_Settings_TimeDate_Arrow_Up.svg56
-rw-r--r--app/datetime/images/HMI_Settings_TimeDate_Button_Cancel.svg98
-rw-r--r--app/datetime/images/HMI_Settings_TimeDate_Button_Set.svg98
-rw-r--r--app/datetime/images/HMI_Settings_TimeIcon.svg59
-rw-r--r--app/example/Example.qml96
-rw-r--r--app/example/example.qrc6
-rw-r--r--app/example/images/HMI_Settings_Example.svg72
-rw-r--r--app/images/HMI_Settings_DividingLine.svg58
-rw-r--r--app/images/HMI_Settings_X.svg72
-rw-r--r--app/images/images.qrc6
-rw-r--r--app/main.cpp76
-rw-r--r--app/settings.qrc7
-rw-r--r--app/wifi/Wifi.qml435
-rw-r--r--app/wifi/images/HMI_Settings_WifiIcon.svg61
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_1Bar.svg71
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_2Bars.svg71
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_3Bars.svg71
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_Full.svg70
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_Locked_1Bar.svg78
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_Locked_2Bars.svg78
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_Locked_3Bars.svg78
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_Locked_Full.svg77
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_Locked_NoBars.svg79
-rw-r--r--app/wifi/images/HMI_Settings_Wifi_NoBars.svg70
-rw-r--r--app/wifi/wifi.qrc16
47 files changed, 3319 insertions, 0 deletions
diff --git a/app/SettingPage.qml b/app/SettingPage.qml
new file mode 100644
index 0000000..10aea21
--- /dev/null
+++ b/app/SettingPage.qml
@@ -0,0 +1,60 @@
+/*
+ * 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
+
+Page {
+ id: root
+ readonly property bool isSetting: true
+ property string icon
+ property bool checkable: false
+ property bool checked: false
+ function done() {
+ parent.pop()
+ }
+
+ Connections {
+ target: root
+ onCheckedChanged: {
+ checkedSwitch.checked = checked
+ }
+ }
+
+ Row {
+ anchors.right: parent.right
+ anchors.rightMargin: 100
+ anchors.bottom: parent.top
+ anchors.bottomMargin: 10
+ spacing: 20
+
+ Switch {
+ id: checkedSwitch
+ visible: root.checkable
+ onCheckedChanged: root.checked = checked
+ }
+
+ ImageButton {
+ id: back
+ anchors.bottom: parent.bottom
+ offImage: '../images/HMI_Settings_X.svg'
+ onClicked: root.done()
+ }
+ }
+
+}
diff --git a/app/Settings.qml b/app/Settings.qml
new file mode 100644
index 0000000..42fed66
--- /dev/null
+++ b/app/Settings.qml
@@ -0,0 +1,60 @@
+/*
+ * 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 'datetime'
+import 'bluetooth'
+import 'wifi'
+import 'example'
+
+ApplicationWindow {
+ id: root
+
+ StackView {
+ id: stack
+ anchors.fill: parent
+ initialItem: settings
+
+ SettingsLauncher {
+ id: settings
+ onLaunch: {
+ stack.push(app)
+ }
+
+ Component.onCompleted: {
+ for (var a in stack.children) {
+ var app = stack.children[a]
+ if (!app.isSetting) continue
+ settingsModel.append({'icon': app.icon, 'title': app.title, 'checkable': app.checkable, 'app': app})
+ app.visible = false
+ }
+ }
+
+ model: ListModel { id: settingsModel }
+ }
+
+ DateTime {}
+
+ Bluetooth {}
+
+ Wifi {}
+
+ Example {}
+ }
+}
diff --git a/app/SettingsLauncher.qml b/app/SettingsLauncher.qml
new file mode 100644
index 0000000..c627324
--- /dev/null
+++ b/app/SettingsLauncher.qml
@@ -0,0 +1,77 @@
+/*
+ * 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
+
+Page {
+ id: root
+ title: 'Settings'
+ property alias model: view.model
+ signal launch(var app)
+ signal toggled(var app, bool on)
+ ListView {
+ id: view
+ anchors.fill: parent
+ anchors.margins: root.width * 0.075
+ clip: true
+
+ delegate: MouseArea {
+ id: delegate
+ width: ListView.view.width
+ height: width / 6
+ RowLayout {
+ anchors.fill: parent
+ Item {
+ Layout.preferredWidth: 100
+ Layout.preferredHeight: 100
+ Image {
+ anchors.centerIn: parent
+ source: model.icon
+ }
+ }
+ Label {
+ Layout.fillWidth: true
+ text: model.title.toUpperCase()
+ color: '#59FF7F'
+ }
+ Switch {
+ id: checkedSwitch
+ visible: model.checkable
+ onCheckedChanged: model.app.checked = checked
+ }
+ Connections {
+ target: model.app
+ onCheckableChanged: {
+ checkedSwitch.visible = model.app.checkable
+ }
+ onCheckedChanged: {
+ checkedSwitch.checked = model.app.checked
+ }
+ }
+ }
+ Image {
+ source: '../images/HMI_Settings_DividingLine.svg'
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ visible: model.index > 0
+ }
+
+ onClicked: launch(model.app)
+ }
+ }
+}
diff --git a/app/api/Binding.qml b/app/api/Binding.qml
new file mode 100644
index 0000000..834bdf8
--- /dev/null
+++ b/app/api/Binding.qml
@@ -0,0 +1,62 @@
+/*
+ * 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 Connections c : Connections {
+ target: root
+ onFanSpeedChanged: {
+ var json = [MessageId.call, '9999', 'hvac/set', {'FanSpeed': fanSpeed}]
+ 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
+ switch (json[0]) {
+ case MessageId.call:
+ break
+ case MessageId.retok:
+ root.statusString = request.info
+ break
+ case MessageId.reterr:
+ root.statusString = "Bad return value, binding probably not installed"
+ break
+ case MessageId.event:
+ 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..014646f
--- /dev/null
+++ b/app/app.pri
@@ -0,0 +1,12 @@
+TEMPLATE = app
+
+load(configure)
+qtCompileTest(libhomescreen)
+
+config_libhomescreen {
+ CONFIG += link_pkgconfig
+ PKGCONFIG += homescreen
+ DEFINES += HAVE_LIBHOMESCREEN
+}
+
+DESTDIR = $${OUT_PWD}/../package/root/bin
diff --git a/app/app.pro b/app/app.pro
new file mode 100644
index 0000000..b35e40e
--- /dev/null
+++ b/app/app.pro
@@ -0,0 +1,15 @@
+TARGET = settings
+QT = quickcontrols2
+
+SOURCES = main.cpp
+
+RESOURCES += \
+ settings.qrc \
+ images/images.qrc \
+ datetime/datetime.qrc \
+ wifi/wifi.qrc \
+ bluetooth/bluetooth.qrc \
+ example/example.qrc
+
+
+include(app.pri)
diff --git a/app/bluetooth/Bluetooth.qml b/app/bluetooth/Bluetooth.qml
new file mode 100644
index 0000000..ded2c36
--- /dev/null
+++ b/app/bluetooth/Bluetooth.qml
@@ -0,0 +1,341 @@
+/*
+ * 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 '..'
+
+SettingPage {
+ id: root
+ icon: '/bluetooth/images/HMI_Settings_BluetoothIcon.svg'
+ title: 'Bluetooth'
+ checkable: true
+
+ property string protocol: 'http://'
+ property string ipAddress: '127.0.0.1'
+ property string portNumber: Qt.application.arguments[1]
+ property string tokenString: Qt.application.arguments[2]
+ property string btAPI: '/api/Bluetooth-manager/'
+ property string btAPIpath: protocol + ipAddress + ':' + portNumber + btAPI
+ property var jsonObjectBT
+ property string currentState: 'idle'
+
+ Text {
+ id: log
+ anchors.fill: parent
+ anchors.margins: 10
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ //text: "log"
+ }
+
+ onCheckedChanged: {
+ console.log("Bluetooth set to", checked)
+ if (checked == true) {
+ request(btAPIpath + 'power?value=1', function (o) {
+ // log the json response
+ console.log(o.responseText)
+ })
+ request(btAPIpath + 'start_discovery', function (o) {
+ console.log(o.responseText)
+ })
+ currentState = 'discovering'
+ //search_device()
+ periodicRefresh.start()
+
+ } else {
+ //console.log(networkPath)
+ btDeviceList.clear()
+ periodicRefresh.stop()
+ request(btAPIpath + 'stop_discovery', function (o) {
+ // log the json response
+ console.log(o.responseText)
+ })
+ request(btAPIpath + 'power?value=0', function (o) {
+ // log the json response
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ currentState = 'idle'
+ }
+ }
+
+ ListModel {
+ id: btDeviceList
+ }
+
+ Rectangle {
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ anchors.margins: 80
+ width: buttonScan.width + 10
+ height: buttonScan.height + 10
+ color: "#222"
+ border.color: "white"
+
+ Button {
+ id: buttonScan
+ anchors.centerIn: parent
+ width: 100
+ text: "SEARCH"
+
+ MouseArea {
+ //id: mouseArea
+ anchors.fill: parent
+
+ onClicked: {
+ if (buttonScan.text == "SEARCH"){
+ request(btAPIpath + 'start_discovery', function (o) {
+
+ // log the json response
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ buttonScan.text = "CANCEL"
+ currentState = 'discovering'
+ periodicRefresh.start()
+ }else{
+ request(btAPIpath + 'stop_discovery', function (o) {
+
+ // log the json response
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ buttonScan.text = "SEARCH"
+ currentState = 'idle'
+ //periodicRefresh.stop() //in order to update the content from bluez
+ }
+ }
+ }
+ }
+ }
+
+ function request(url, callback) {
+ var xhr = new XMLHttpRequest()
+ xhr.onreadystatechange = (function (myxhr) {
+ return function () {
+ if (xhr.readyState == 4 && xhr.status == 200){
+ callback(myxhr)
+ }
+ }
+ })(xhr)
+ xhr.open('GET', url, false)
+ xhr.send('')
+ }
+
+ Component {
+ id:blueToothDevice
+ Rectangle {
+ height: 150
+ width: parent.width
+ color: "#222"
+
+ Column {
+ Text {
+ id: btName
+ text: deviceName
+ font.pointSize: 36
+ color: "#ffffff"
+ }
+ Text {
+ id: btAddr
+ text: deviceAddress
+ visible: false
+ }
+ Text {
+ text: {
+ if ((devicePairable === "True")
+ && (deviceConnect === "False"))
+ text = "paired"
+ else if ((devicePairable === "True")
+ && (deviceConnect === "True")
+ && (connectAVP) === "True")
+ text = "AV Connection"
+ else if ((devicePairable === "True")
+ && (deviceConnect === "True")
+ && (connectHFP) === "True")
+ text = "Handsfree Connection"
+ else
+ text = ""
+ }
+ font.pointSize: 18
+ color: "#ffffff"
+ font.italic: true
+ }
+ Text {
+ id: btPairable
+ text: devicePairable
+ visible: false
+ }
+ Text {
+ id: btConnectstatus
+ text: deviceConnect
+ visible: false
+ }
+
+ }
+ Button {
+ id: connectButton
+ anchors.top:parent.top
+ anchors.topMargin: 15
+ anchors.right: parent.right
+ anchors.rightMargin: 10
+
+ text:(btConnectstatus.text == "True")? "Disconnect":((btPairable.text == "True")? "Connect":"Pair")
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ if (currentState == 'discovering'){
+ request(btAPIpath + 'stop_discovery', function (o) {
+ currentState = "idle"
+ console.log(o.responseText)
+ })
+ }
+ if (connectButton.text == "Pair"){
+ connectButton.text = "Connect"
+ request(btAPIpath + 'pair?value=' + btAddr.text, function (o) {
+ btPairable.text = "True"
+ console.log(o.responseText)
+ })
+ request(btAPIpath + 'set_property?Address=' + btAddr.text + '\&Property=Trusted\&value=true', function (o) {
+ console.log(o.responseText)
+ })
+ }
+ else if (connectButton.text == "Connect"){
+ connectButton.text = "Disconnect"
+ request(btAPIpath + 'connect?value=' + btAddr.text, function (o) {
+ console.log(o.responseText)
+ })
+ }
+ else if (connectButton.text == "Disconnect"){
+ request(btAPIpath + 'disconnect?value=' + btAddr.text, function (o) {
+ console.log(o.responseText)
+ })
+ connectButton.text = "Connect"
+ btDeviceList.remove(findDevice(btAddr.text))
+ }
+ }
+ }
+ }
+ /*Image{
+ id: removeDevice
+ anchors.top:parent.top
+ anchors.topMargin: 15
+ anchors.right: parent.right
+ anchors.rightMargin: 5
+ width: 25
+ height: 25
+ source: "component/images/trash.png"
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ request(btAPIpath + 'remove_device?value=' + btAddr.text, function (o) {
+ console.log(o.responseText)
+ })
+ btDeviceList.remove(findDevice(btAddr.text))
+ }
+ }
+ }*/
+ }
+ }
+
+ ListView {
+ width: parent.width
+ anchors.top: parent.top
+ anchors.topMargin: 200
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: 150
+ model: btDeviceList
+ delegate: blueToothDevice
+ clip: true
+ }
+
+ function findDevice(address){
+ for (var i = 0; i < jsonObjectBT.length; i++) {
+ if (address === jsonObjectBT[i].Address){
+ return i
+ }
+ }
+ }
+ function search_device(){
+ btDeviceList.clear()
+ request(btAPIpath + 'discovery_result', function (o) {
+
+ // log the json response
+ console.log(o.responseText)
+
+ // translate response into object
+ var jsonObject = eval('(' + o.responseText + ')')
+
+ jsonObjectBT = eval('(' + JSON.stbtPairableringify(
+ jsonObject.response) + ')')
+
+ console.log("BT list refreshed")
+
+ //console.log(jsonObject.response)
+ for (var i = 0; i < jsonObjectBT.length; i++) {
+ btDeviceList.append({
+ deviceAddress: jsonObjectBT[i].Address,
+ deviceName: jsonObjectBT[i].Name,
+ devicePairable:jsonObjectBT[i].Paired,
+ deviceConnect: jsonObjectBT[i].Connected,
+ connectAVP: jsonObjectBT[i].AVPConnected,
+ connectHFP: jsonObjectBT[i].HFPConnected
+ })
+ }
+ })
+ }
+
+ //Timer for periodic refresh; this is BAD solution, need to figure out how to subscribe for events
+ Timer {
+ id: periodicRefresh
+ interval: (currentState == "idle")? 10000:5000 // 5seconds
+ onTriggered: {
+
+ btDeviceList.clear()
+
+ request(btAPIpath + 'discovery_result', function (o) {
+
+ // log the json response
+ console.log(o.responseText)
+
+ // translate response into object
+ var jsonObject = eval('(' + o.responseText + ')')
+
+ jsonObjectBT = eval('(' + JSON.stringify(
+ jsonObject.response) + ')')
+
+ console.log("BT list refreshed")
+
+ //console.log(jsonObject.response)
+ for (var i = 0; i < jsonObjectBT.length; i++) {
+ btDeviceList.append({
+ deviceAddress: jsonObjectBT[i].Address,
+ deviceName: jsonObjectBT[i].Name,
+ devicePairable:jsonObjectBT[i].Paired,
+ deviceConnect: jsonObjectBT[i].Connected,
+ connectAVP: jsonObjectBT[i].AVPConnected,
+ connectHFP: jsonObjectBT[i].HFPConnected
+ })
+ }
+ })
+ start()
+ }
+ }
+ }
+
diff --git a/app/bluetooth/bluetooth.qrc b/app/bluetooth/bluetooth.qrc
new file mode 100644
index 0000000..bc8b70a
--- /dev/null
+++ b/app/bluetooth/bluetooth.qrc
@@ -0,0 +1,8 @@
+<RCC>
+ <qresource prefix="/bluetooth">
+ <file>Bluetooth.qml</file>
+ <file>images/HMI_Pair_Button.svg</file>
+ <file>images/HMI_Paired_Button.svg</file>
+ <file>images/HMI_Settings_BluetoothIcon.svg</file>
+ </qresource>
+</RCC>
diff --git a/app/bluetooth/images/HMI_Pair_Button.svg b/app/bluetooth/images/HMI_Pair_Button.svg
new file mode 100644
index 0000000..930a75b
--- /dev/null
+++ b/app/bluetooth/images/HMI_Pair_Button.svg
@@ -0,0 +1,98 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 151 51"
+ style="enable-background:new 0 0 151 51;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Pair_Button.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="4.4503311"
+ inkscape:cx="-17.97619"
+ inkscape:cy="25.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:none;stroke:url(#SVGID_1_);stroke-miterlimit:10;}
+ .st1{opacity:0.3;fill:url(#SVGID_2_);}
+ .st2{fill:#FFFFFF;}
+ .st3{font-family:'Roboto-Regular';}
+ .st4{font-size:19.7348px;}
+ .st5{letter-spacing:3;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><linearGradient
+ id="SVGID_1_"
+ gradientUnits="userSpaceOnUse"
+ x1="24.7258"
+ y1="75.9063"
+ x2="126.2742"
+ y2="-24.9063"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop12" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop14" /></linearGradient><rect
+ x="0.5"
+ y="0.5"
+ class="st0"
+ width="150"
+ height="50"
+ id="rect16" /><linearGradient
+ id="SVGID_2_"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.8746"
+ y1="126.14"
+ x2="190.2191"
+ y2="-88.3878"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop19" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop21" /></linearGradient><rect
+ x="0.5"
+ y="0.5"
+ class="st1"
+ width="150"
+ height="50"
+ id="rect23" /><g
+ id="g25"><text
+ transform="matrix(1 0 0 1 46.5699 33.9046)"
+ class="st2 st3 st4 st5"
+ id="text27">Pair</text>
+</g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/bluetooth/images/HMI_Paired_Button.svg b/app/bluetooth/images/HMI_Paired_Button.svg
new file mode 100644
index 0000000..17419d4
--- /dev/null
+++ b/app/bluetooth/images/HMI_Paired_Button.svg
@@ -0,0 +1,98 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 151 51"
+ style="enable-background:new 0 0 151 51;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Paired_Button.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="4.4503311"
+ inkscape:cx="-11.909226"
+ inkscape:cy="25.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:none;stroke:url(#SVGID_1_);stroke-miterlimit:10;}
+ .st1{opacity:0.84;fill:url(#SVGID_2_);}
+ .st2{fill:#27232B;}
+ .st3{font-family:'Roboto-Regular';}
+ .st4{font-size:19.7348px;}
+ .st5{letter-spacing:2.9;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><linearGradient
+ id="SVGID_1_"
+ gradientUnits="userSpaceOnUse"
+ x1="24.7258"
+ y1="75.9063"
+ x2="126.2742"
+ y2="-24.9063"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop12" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop14" /></linearGradient><rect
+ x="0.5"
+ y="0.5"
+ class="st0"
+ width="150"
+ height="50"
+ id="rect16" /><linearGradient
+ id="SVGID_2_"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.8746"
+ y1="126.14"
+ x2="190.2191"
+ y2="-88.3878"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop19" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop21" /></linearGradient><rect
+ x="0.5"
+ y="0.5"
+ class="st1"
+ width="150"
+ height="50"
+ id="rect23" /><g
+ id="g25"><text
+ transform="matrix(1.0253 0 0 1 33.1099 33.9038)"
+ class="st2 st3 st4 st5"
+ id="text27">PairED</text>
+</g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/bluetooth/images/HMI_Settings_BluetoothIcon.svg b/app/bluetooth/images/HMI_Settings_BluetoothIcon.svg
new file mode 100644
index 0000000..d41de2a
--- /dev/null
+++ b/app/bluetooth/images/HMI_Settings_BluetoothIcon.svg
@@ -0,0 +1,55 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_BluetoothIcon.svg"><metadata
+ id="metadata16"><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="defs14" /><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="namedview12"
+ showgrid="false"
+ inkscape:zoom="2.36"
+ inkscape:cx="-130.29661"
+ inkscape:cy="50"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="Bluetooth_Icon"><path
+ class="st0"
+ d="M48.3,86.9V53.4L30.9,69.7l-1.4-1.5l18.8-17.6v-0.2L27.9,36.4l1.1-1.6L48.3,48v-35l23.6,18.2l-20.3,19 l20.5,14.1L48.3,86.9z M50.3,51.8v30.5l18.6-17.6L50.3,51.8z M50.3,17.1v31.6l18.5-17.3L50.3,17.1z"
+ id="path10" /></g></g></switch></svg> \ No newline at end of file
diff --git a/app/config.tests/libhomescreen/.qmake.stash b/app/config.tests/libhomescreen/.qmake.stash
new file mode 100644
index 0000000..d1c4687
--- /dev/null
+++ b/app/config.tests/libhomescreen/.qmake.stash
@@ -0,0 +1,14 @@
+QMAKE_DEFAULT_INCDIRS = \
+ /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5 \
+ /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/x86_64-pc-linux-gnu \
+ /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include/g++-v5/backward \
+ /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include \
+ /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/include-fixed \
+ /usr/include
+QMAKE_DEFAULT_LIBDIRS = \
+ /usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0 \
+ /usr/lib64 \
+ /lib64 \
+ /usr/x86_64-pc-linux-gnu/lib \
+ /usr/lib \
+ /lib
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..eb4e8f3
--- /dev/null
+++ b/app/config.tests/libhomescreen/libhomescreen.pro
@@ -0,0 +1,5 @@
+SOURCES = libhomescreen.cpp
+
+CONFIG -= qt
+CONFIG += link_pkgconfig
+PKGCONFIG += homescreen
diff --git a/app/datetime/DateEdit.qml b/app/datetime/DateEdit.qml
new file mode 100644
index 0000000..f9f75fd
--- /dev/null
+++ b/app/datetime/DateEdit.qml
@@ -0,0 +1,122 @@
+/*
+ * 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
+
+GridLayout {
+ id: root
+ flow: GridLayout.TopToBottom
+ rows: 3
+
+ property int year: yearControl.model[yearControl.currentIndex]
+ property int month: monthControl.currentIndex + 1
+ property int day: dayControl.currentIndex + 1
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Up.svg'
+ onClicked: monthControl.currentIndex++
+ }
+ Tumbler {
+ id: monthControl
+ implicitWidth: 200
+ model: ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
+ onCurrentIndexChanged: dayControl.regenerateModel()
+
+ EditSeparator { anchors.fill: parent }
+ }
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Down.svg'
+ onClicked: monthControl.currentIndex--
+ }
+
+ Item { width: 10; height: 10 }
+ Label { text: ':' }
+ Item { width: 10; height: 10 }
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Up.svg'
+ onClicked: dayControl.currentIndex++
+ }
+
+ Tumbler {
+ id: dayControl
+ model: ListModel{
+ id: monthModel
+ }
+ Component.onCompleted: regenerateModel()
+ function regenerateModel() {
+ var eom = 0
+ var y = yearControl.model[yearControl.currentIndex]
+ var m = monthControl.currentIndex + 1
+ switch (m) {
+ case 2:
+ eom = 28 + parseInt(1 / (y % 4 + 1)) - parseInt(1 - 1 / (y % 100 + 1)) + parseInt(1 / (y % 400 + 1))
+ break
+ case 4:
+ case 6:
+ case 9:
+ case 11:
+ eom = 30
+ break
+ default:
+ eom = 31
+ break
+ }
+ while (monthModel.count < eom)
+ monthModel.append({modelData: monthModel.count + 1})
+ while (monthModel.count > eom)
+ monthModel.remove(monthModel.count - 1, 1)
+ }
+ EditSeparator { anchors.fill: parent }
+ }
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Down.svg'
+ onClicked: dayControl.currentIndex--
+ }
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Up.svg'
+ onClicked: yearControl.currentIndex++
+ }
+
+ Tumbler {
+ id: yearControl
+ Component.onCompleted: {
+ var arr = new Array
+ for (var i = 2010; i < 2050; i++) {
+ arr.push(i)
+ }
+ yearControl.model = arr
+ }
+ onCurrentIndexChanged: dayControl.regenerateModel()
+ EditSeparator { anchors.fill: parent }
+ }
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Down.svg'
+ onClicked: yearControl.currentIndex--
+ }
+}
diff --git a/app/datetime/DateTime.qml b/app/datetime/DateTime.qml
new file mode 100644
index 0000000..5030b1e
--- /dev/null
+++ b/app/datetime/DateTime.qml
@@ -0,0 +1,50 @@
+/*
+ * 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
+import '..'
+
+SettingPage {
+ id: root
+ icon: '/datetime/images/HMI_Settings_TimeIcon.svg'
+ title: 'Date & Time'
+
+ ColumnLayout {
+ anchors.fill: parent
+ anchors.margins: 100
+ Label { text: 'Date'}
+ DateEdit {}
+ Image {
+ source: '../images/HMI_Settings_DividingLine.svg'
+ }
+ Label { text: 'Time'}
+ TimeEdit {}
+ RowLayout {
+ anchors.right: parent.right
+ Button {
+ text: 'OK'
+ highlighted: true
+ onClicked: root.done()
+ }
+ }
+ Item {
+ Layout.fillHeight: true
+ }
+ }
+}
diff --git a/app/datetime/EditSeparator.qml b/app/datetime/EditSeparator.qml
new file mode 100644
index 0000000..e833b52
--- /dev/null
+++ b/app/datetime/EditSeparator.qml
@@ -0,0 +1,40 @@
+/*
+ * 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
+
+ColumnLayout {
+ anchors.fill: parent
+ z: -1
+ Item {
+ Layout.fillHeight: true
+ Layout.preferredHeight: 1
+ }
+ Repeater {
+ model: 2
+ Image {
+ Layout.fillHeight: true
+ Layout.preferredHeight: 2
+ Layout.alignment: Layout.Center
+ source: './images/HMI_Settings_TimeDate_Arrow_DividingLine.svg'
+ }
+ }
+ Item {
+ Layout.fillHeight: true
+ Layout.preferredHeight: 1
+ }
+}
diff --git a/app/datetime/TimeEdit.qml b/app/datetime/TimeEdit.qml
new file mode 100644
index 0000000..69a049b
--- /dev/null
+++ b/app/datetime/TimeEdit.qml
@@ -0,0 +1,86 @@
+/*
+ * 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
+
+GridLayout {
+ id: root
+ flow: GridLayout.TopToBottom
+ rows: 3
+
+ property int hour: hourControl.currentIndex
+ property int minutes: minutesControl.currentIndex
+ property string ampm: ampmControl.model[ampmControl.currentIndex]
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Up.svg'
+ onClicked: hourControl.currentIndex++
+ }
+ Tumbler {
+ id: hourControl
+ model: 12
+ EditSeparator { anchors.fill: parent }
+ }
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Down.svg'
+ onClicked: hourControl.currentIndex--
+ }
+
+ Item { width: 10; height: 10 }
+ Label { text: ':' }
+ Item { width: 10; height: 10 }
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Up.svg'
+ onClicked: minutesControl.currentIndex++
+ }
+
+ Tumbler {
+ id: minutesControl
+ model: 60
+ EditSeparator { anchors.fill: parent }
+ }
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Down.svg'
+ onClicked: minutesControl.currentIndex--
+ }
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Up.svg'
+ onClicked: ampmControl.currentIndex++
+ }
+
+ Tumbler {
+ id: ampmControl
+ model: ['AM', 'PM', 'AM', 'PM']
+ EditSeparator { anchors.fill: parent }
+ }
+
+ ImageButton {
+ Layout.alignment: Layout.Center
+ offImage: './images/HMI_Settings_TimeDate_Arrow_Down.svg'
+ onClicked: ampmControl.currentIndex--
+ }
+}
diff --git a/app/datetime/datetime.qrc b/app/datetime/datetime.qrc
new file mode 100644
index 0000000..c60c626
--- /dev/null
+++ b/app/datetime/datetime.qrc
@@ -0,0 +1,14 @@
+<RCC>
+ <qresource prefix="/datetime">
+ <file>DateEdit.qml</file>
+ <file>DateTime.qml</file>
+ <file>TimeEdit.qml</file>
+ <file>EditSeparator.qml</file>
+ <file>images/HMI_Settings_TimeDate_Arrow_DividingLine.svg</file>
+ <file>images/HMI_Settings_TimeDate_Arrow_Down.svg</file>
+ <file>images/HMI_Settings_TimeDate_Arrow_Up.svg</file>
+ <file>images/HMI_Settings_TimeDate_Button_Cancel.svg</file>
+ <file>images/HMI_Settings_TimeDate_Button_Set.svg</file>
+ <file>images/HMI_Settings_TimeIcon.svg</file>
+ </qresource>
+</RCC>
diff --git a/app/datetime/images/HMI_Settings_TimeDate_Arrow_DividingLine.svg b/app/datetime/images/HMI_Settings_TimeDate_Arrow_DividingLine.svg
new file mode 100644
index 0000000..5a7fa7f
--- /dev/null
+++ b/app/datetime/images/HMI_Settings_TimeDate_Arrow_DividingLine.svg
@@ -0,0 +1,57 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 93 20"
+ style="enable-background:new 0 0 93 20;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_TimeDate_Arrow_DividingLine.svg"><metadata
+ id="metadata15"><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="defs13" /><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="namedview11"
+ showgrid="false"
+ inkscape:zoom="7.2258065"
+ inkscape:cx="-15.569196"
+ inkscape:cy="10"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:none;stroke:#66FF99;stroke-miterlimit:10;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><line
+ class="st0"
+ x1="0.3"
+ y1="10"
+ x2="92.7"
+ y2="10"
+ id="line9" /></g></switch></svg> \ No newline at end of file
diff --git a/app/datetime/images/HMI_Settings_TimeDate_Arrow_Down.svg b/app/datetime/images/HMI_Settings_TimeDate_Arrow_Down.svg
new file mode 100644
index 0000000..a4fad6b
--- /dev/null
+++ b/app/datetime/images/HMI_Settings_TimeDate_Arrow_Down.svg
@@ -0,0 +1,56 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 90 70"
+ style="enable-background:new 0 0 90 70;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_TimeDate_Arrow_Down.svg"><metadata
+ id="metadata18"><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="defs16" /><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="namedview14"
+ showgrid="false"
+ inkscape:zoom="3.3714286"
+ inkscape:cx="-85.95339"
+ inkscape:cy="35"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#66FF99;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="previous_11_"><g
+ id="g10"><path
+ class="st0"
+ d="M45,46.4L23.9,25.7c0,0,4.2-2.1,4.3-2.1c0,0,16.8,16.5,16.8,16.5c0,0,16.9-16.5,16.9-16.5 c0,0,4.2,2.1,4.2,2.1L45,46.4z"
+ id="path12" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/datetime/images/HMI_Settings_TimeDate_Arrow_Up.svg b/app/datetime/images/HMI_Settings_TimeDate_Arrow_Up.svg
new file mode 100644
index 0000000..49b0c88
--- /dev/null
+++ b/app/datetime/images/HMI_Settings_TimeDate_Arrow_Up.svg
@@ -0,0 +1,56 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 90 70"
+ style="enable-background:new 0 0 90 70;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_TimeDate_Arrow_Up.svg"><metadata
+ id="metadata18"><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="defs16" /><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="namedview14"
+ showgrid="false"
+ inkscape:zoom="3.3714286"
+ inkscape:cx="-118.4322"
+ inkscape:cy="35"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#66FF99;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="previous_11_"><g
+ id="g10"><path
+ class="st0"
+ d="M45,23.6L23.9,44.3c0,0,4.2,2.1,4.3,2.1c0,0,16.8-16.5,16.8-16.5c0,0,16.9,16.5,16.9,16.5 c0,0,4.2-2.1,4.2-2.1L45,23.6z"
+ id="path12" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/datetime/images/HMI_Settings_TimeDate_Button_Cancel.svg b/app/datetime/images/HMI_Settings_TimeDate_Button_Cancel.svg
new file mode 100644
index 0000000..c04e11e
--- /dev/null
+++ b/app/datetime/images/HMI_Settings_TimeDate_Button_Cancel.svg
@@ -0,0 +1,98 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 151 51"
+ style="enable-background:new 0 0 151 51;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_TimeDate_Button_Cancel.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="4.4503311"
+ inkscape:cx="-33.143601"
+ inkscape:cy="25.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:none;stroke:url(#SVGID_1_);stroke-miterlimit:10;}
+ .st1{opacity:0.3;fill:url(#SVGID_2_);}
+ .st2{fill:#FFFFFF;}
+ .st3{font-family:'Roboto-Regular';}
+ .st4{font-size:20px;}
+ .st5{letter-spacing:3;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><linearGradient
+ id="SVGID_1_"
+ gradientUnits="userSpaceOnUse"
+ x1="24.7258"
+ y1="75.9063"
+ x2="126.2742"
+ y2="-24.9063"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop12" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop14" /></linearGradient><rect
+ x="0.5"
+ y="0.5"
+ class="st0"
+ width="150"
+ height="50"
+ id="rect16" /><linearGradient
+ id="SVGID_2_"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.8746"
+ y1="126.14"
+ x2="190.2191"
+ y2="-88.3878"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop19" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop21" /></linearGradient><rect
+ x="0.5"
+ y="0.5"
+ class="st1"
+ width="150"
+ height="50"
+ id="rect23" /><g
+ id="g25"><text
+ transform="matrix(1 0 0 1 29.5984 34.017)"
+ class="st2 st3 st4 st5"
+ id="text27">CANCEL</text>
+</g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/datetime/images/HMI_Settings_TimeDate_Button_Set.svg b/app/datetime/images/HMI_Settings_TimeDate_Button_Set.svg
new file mode 100644
index 0000000..4b103cc
--- /dev/null
+++ b/app/datetime/images/HMI_Settings_TimeDate_Button_Set.svg
@@ -0,0 +1,98 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 151 51"
+ style="enable-background:new 0 0 151 51;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_TimeDate_Button_Set.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="4.4503311"
+ inkscape:cx="-24.941964"
+ inkscape:cy="25.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:none;stroke:url(#SVGID_1_);stroke-miterlimit:10;}
+ .st1{opacity:0.84;fill:url(#SVGID_2_);}
+ .st2{fill:#27232B;}
+ .st3{font-family:'Roboto-Regular';}
+ .st4{font-size:20px;}
+ .st5{letter-spacing:3;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><linearGradient
+ id="SVGID_1_"
+ gradientUnits="userSpaceOnUse"
+ x1="24.7258"
+ y1="75.9063"
+ x2="126.2742"
+ y2="-24.9063"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop12" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop14" /></linearGradient><rect
+ x="0.5"
+ y="0.5"
+ class="st0"
+ width="150"
+ height="50"
+ id="rect16" /><linearGradient
+ id="SVGID_2_"
+ gradientUnits="userSpaceOnUse"
+ x1="-25.8746"
+ y1="126.14"
+ x2="190.2191"
+ y2="-88.3878"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop19" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop21" /></linearGradient><rect
+ x="0.5"
+ y="0.5"
+ class="st1"
+ width="150"
+ height="50"
+ id="rect23" /><g
+ id="g25"><text
+ transform="matrix(1 0 0 1 53.2699 34.0168)"
+ class="st2 st3 st4 st5"
+ id="text27">SET</text>
+</g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/datetime/images/HMI_Settings_TimeIcon.svg b/app/datetime/images/HMI_Settings_TimeIcon.svg
new file mode 100644
index 0000000..d4b2ef6
--- /dev/null
+++ b/app/datetime/images/HMI_Settings_TimeIcon.svg
@@ -0,0 +1,59 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_TimeIcon.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="2.36"
+ inkscape:cx="-145.55085"
+ inkscape:cy="50"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><g
+ id="g11"><path
+ class="st0"
+ d="M50,81.2c-17.3,0-31.4-14-31.4-31.2c0-1.3,0.1-2.7,0.3-4l1.9,0.2c-0.2,1.3-0.2,2.5-0.2,3.8 c0,16.2,13.2,29.3,29.5,29.3S79.5,66.2,79.5,50c0-16.2-13.2-29.3-29.5-29.3c-7.2,0-14.1,2.6-19.5,7.3l-1.2-1.4 c5.7-5,13.1-7.8,20.7-7.8c17.3,0,31.4,14,31.4,31.2C81.4,67.2,67.3,81.2,50,81.2z"
+ id="path13" /></g><polygon
+ class="st0"
+ points="51,49.8 51,33.7 49,33.7 49,51.7 50,51.7 51,51.7 60,51.7 60,49.8 "
+ id="polygon15" /></g></g></switch></svg> \ No newline at end of file
diff --git a/app/example/Example.qml b/app/example/Example.qml
new file mode 100644
index 0000000..18e3efc
--- /dev/null
+++ b/app/example/Example.qml
@@ -0,0 +1,96 @@
+/*
+ * 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
+import '..'
+
+SettingPage {
+ id: root
+ icon: '/example/images/HMI_Settings_Example.svg'
+ title: 'Example'
+ checkable: true
+
+ ColumnLayout {
+ anchors.fill: parent
+ anchors.margins: 100
+ RowLayout {
+ spacing: 20
+ Button {
+ text: 'Sushi'
+ highlighted: true
+ }
+ Button {
+ text: 'Sashimi'
+ }
+ Button {
+ text: 'Ramen'
+ }
+ }
+
+ Image {
+ source: '../images/HMI_Settings_DividingLine.svg'
+ }
+
+ ListView {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ clip: true
+ model: 10
+ delegate: MouseArea {
+ width: ListView.view.width
+ height: 110
+ RowLayout {
+ anchors.fill: parent
+ anchors.margins: 5
+ spacing: 30
+ Image {
+ source: './images/HMI_Settings_Example.svg'
+ }
+
+ ColumnLayout {
+ Label {
+ id: title
+ Layout.fillWidth: true
+ text: 'Title'
+ font.pixelSize: 48
+ }
+ Label {
+ id: subtitle
+ Layout.fillWidth: true
+ text: 'Subtitle'
+ color: '#66FF99'
+ font.pixelSize: 24
+ }
+ }
+
+ Button {
+ text: 'Go'
+ }
+ }
+
+ Image {
+ source: '../images/HMI_Settings_DividingLine.svg'
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ visible: model.index > 0
+ }
+ }
+ }
+ }
+}
diff --git a/app/example/example.qrc b/app/example/example.qrc
new file mode 100644
index 0000000..5739f8e
--- /dev/null
+++ b/app/example/example.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/example">
+ <file>Example.qml</file>
+ <file>images/HMI_Settings_Example.svg</file>
+ </qresource>
+</RCC>
diff --git a/app/example/images/HMI_Settings_Example.svg b/app/example/images/HMI_Settings_Example.svg
new file mode 100644
index 0000000..5ad9479
--- /dev/null
+++ b/app/example/images/HMI_Settings_Example.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;#38;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"
+ x="0px"
+ y="0px"
+ viewBox="0 0 45 45"
+ style="enable-background:new 0 0 45 45;"
+ xml:space="preserve"
+ id="svg2"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_ContactScreen_X-01.svg"><metadata
+ id="metadata66"><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="defs64" /><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="namedview62"
+ showgrid="false"
+ inkscape:zoom="5.2444444"
+ inkscape:cx="-132.61653"
+ inkscape:cy="22.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" /><style
+ type="text/css"
+ id="style4">
+ .st0{fill:none;stroke:#FFFFFF;stroke-miterlimit:10;}
+ .st1{display:none;}
+ .st2{display:inline;opacity:0.15;fill:url(#SVGID_1_);}
+ .st3{display:inline;opacity:0.35;fill:url(#SVGID_2_);}
+ .st4{display:inline;}
+ .st5{opacity:0.15;fill:url(#SVGID_3_);}
+ .st6{opacity:0.15;fill:url(#SVGID_4_);stroke:url(#SVGID_5_);stroke-miterlimit:10;}
+ .st7{fill:url(#SVGID_6_);}
+</style><switch
+ id="switch6"><g
+ i:extraneous="self"
+ id="g8"><g
+ id="Inactive"><g
+ id="g11"><line
+ class="st0"
+ x1="44.8"
+ y1="44.8"
+ x2="0.2"
+ y2="0.2"
+ id="line13" /><line
+ class="st0"
+ x1="45"
+ y1="0"
+ x2="0"
+ y2="45"
+ id="line15" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_Settings_DividingLine.svg b/app/images/HMI_Settings_DividingLine.svg
new file mode 100644
index 0000000..d63589c
--- /dev/null
+++ b/app/images/HMI_Settings_DividingLine.svg
@@ -0,0 +1,58 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 932.8 1"
+ style="enable-background:new 0 0 932.8 1;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_DividingLine.svg"><metadata
+ id="metadata18"><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="defs16" /><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="namedview14"
+ showgrid="false"
+ inkscape:zoom="0.72041167"
+ inkscape:cx="-116.6"
+ inkscape:cy="0.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{opacity:0.302;}
+ .st1{fill-rule:evenodd;clip-rule:evenodd;fill:#A8A8A8;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="Divider_2_"
+ class="st0"><g
+ id="g10"><polygon
+ class="st1"
+ points="719.7,0 0,0 0,1 932.8,1 "
+ id="polygon12" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_Settings_X.svg b/app/images/HMI_Settings_X.svg
new file mode 100644
index 0000000..5ad9479
--- /dev/null
+++ b/app/images/HMI_Settings_X.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;#38;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"
+ x="0px"
+ y="0px"
+ viewBox="0 0 45 45"
+ style="enable-background:new 0 0 45 45;"
+ xml:space="preserve"
+ id="svg2"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_ContactScreen_X-01.svg"><metadata
+ id="metadata66"><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="defs64" /><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="namedview62"
+ showgrid="false"
+ inkscape:zoom="5.2444444"
+ inkscape:cx="-132.61653"
+ inkscape:cy="22.5"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" /><style
+ type="text/css"
+ id="style4">
+ .st0{fill:none;stroke:#FFFFFF;stroke-miterlimit:10;}
+ .st1{display:none;}
+ .st2{display:inline;opacity:0.15;fill:url(#SVGID_1_);}
+ .st3{display:inline;opacity:0.35;fill:url(#SVGID_2_);}
+ .st4{display:inline;}
+ .st5{opacity:0.15;fill:url(#SVGID_3_);}
+ .st6{opacity:0.15;fill:url(#SVGID_4_);stroke:url(#SVGID_5_);stroke-miterlimit:10;}
+ .st7{fill:url(#SVGID_6_);}
+</style><switch
+ id="switch6"><g
+ i:extraneous="self"
+ id="g8"><g
+ id="Inactive"><g
+ id="g11"><line
+ class="st0"
+ x1="44.8"
+ y1="44.8"
+ x2="0.2"
+ y2="0.2"
+ id="line13" /><line
+ class="st0"
+ x1="45"
+ y1="0"
+ x2="0"
+ y2="45"
+ id="line15" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/images.qrc b/app/images/images.qrc
new file mode 100644
index 0000000..0bb2c0d
--- /dev/null
+++ b/app/images/images.qrc
@@ -0,0 +1,6 @@
+<RCC>
+ <qresource prefix="/images">
+ <file>HMI_Settings_DividingLine.svg</file>
+ <file>HMI_Settings_X.svg</file>
+ </qresource>
+</RCC>
diff --git a/app/main.cpp b/app/main.cpp
new file mode 100644
index 0000000..ff3ca1e
--- /dev/null
+++ b/app/main.cpp
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ */
+
+#include <QtCore/QDebug>
+#include <QtCore/QCommandLineParser>
+#include <QtCore/QUrlQuery>
+#include <QtGui/QGuiApplication>
+#include <QtQml/QQmlApplicationEngine>
+#include <QtQml/QQmlContext>
+#include <QtQuickControls2/QQuickStyle>
+
+#ifdef HAVE_LIBHOMESCREEN
+#include <libhomescreen.hpp>
+#endif
+
+int main(int argc, char *argv[])
+{
+#ifdef HAVE_LIBHOMESCREEN
+ LibHomeScreen libHomeScreen;
+
+ if (!libHomeScreen.renderAppToAreaAllowed(0, 1)) {
+ qWarning() << "renderAppToAreaAllowed is denied";
+ return -1;
+ }
+#endif
+
+ QGuiApplication app(argc, argv);
+ app.setApplicationName(QStringLiteral("HVAC"));
+ app.setApplicationVersion(QStringLiteral("0.1.0"));
+ app.setOrganizationDomain(QStringLiteral("automotivelinux.org"));
+ app.setOrganizationName(QStringLiteral("AutomotiveGradeLinux"));
+
+ QQuickStyle::setStyle("AGL");
+
+ 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();
+
+
+ QQmlApplicationEngine engine;
+ if (positionalArguments.length() == 2) {
+ int port = positionalArguments.takeFirst().toInt();
+ QString secret = positionalArguments.takeFirst();
+ QUrl bindingAddress;
+ 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);
+ QQmlContext *context = engine.rootContext();
+ context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress);
+ }
+ engine.load(QUrl(QStringLiteral("qrc:/Settings.qml")));
+
+ return app.exec();
+}
+
diff --git a/app/settings.qrc b/app/settings.qrc
new file mode 100644
index 0000000..189f441
--- /dev/null
+++ b/app/settings.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>Settings.qml</file>
+ <file>SettingsLauncher.qml</file>
+ <file>SettingPage.qml</file>
+ </qresource>
+</RCC>
diff --git a/app/wifi/Wifi.qml b/app/wifi/Wifi.qml
new file mode 100644
index 0000000..7851967
--- /dev/null
+++ b/app/wifi/Wifi.qml
@@ -0,0 +1,435 @@
+/*
+ * 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 '..'
+
+SettingPage {
+ id: root
+ icon: '/wifi/images/HMI_Settings_WifiIcon.svg'
+ title: 'Wifi'
+ checkable: true
+
+ property string protocol: 'http://'
+ property string ipAddress: '127.0.0.1'
+ property string portNumber: Qt.application.arguments[1]
+ property string tokenString: Qt.application.arguments[2]
+ property string wifiAPI: '/api/wifi-manager/'
+ property string wifiAPIpath: protocol + ipAddress + ':' + portNumber + wifiAPI
+
+ Text {
+ id: log
+ anchors.fill: parent
+ anchors.margins: 10
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ //text: "log"
+ }
+
+ onCheckedChanged: {
+ console.log("Wifi set to", checked)
+ if (checked == true) {
+ periodicRefresh.start()
+ request(wifiAPIpath + 'activate', function (o) {
+ // log the json response
+ console.log(o.responseText)
+ })
+
+ } else {
+ //console.log(networkPath)
+ networkList.clear()
+ request(wifiAPIpath + 'deactivate', function (o) {
+ // log the json response
+ console.log(o.responseText)
+ })
+ }
+ }
+ function listWifiNetworks() {
+ console.log("test #4")
+ }
+ ListModel {
+ id: networkList
+ }
+
+ Rectangle {
+ id: buttonNetworkList
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ anchors.margins: 10
+ width: buttonNetworkListText.width + 10
+ height: buttonScanText.height + 10
+ border.width: buttonNetworkListMouseArea.pressed ? 2 : 1
+ radius: 5
+ antialiasing: true
+ color: "#222"
+ border.color: "white"
+ Text {
+ color: "white"
+ id: buttonNetworkListText
+ anchors.centerIn: parent
+ text: "GET NETWORK LIST"
+ font.pixelSize: 40
+ }
+ ListModel {
+ id: listModel
+ }
+ MouseArea {
+ id: buttonNetworkListMouseArea
+ anchors.fill: parent
+ onClicked: {
+ log.text = ""
+ console.log("\n")
+ networkList.clear()
+ request(wifiAPIpath + 'scan_result', function (o) {
+ // log the json response
+ console.log(o.responseText)
+ // translate response into object
+ var jsonObject = eval('(' + o.responseText + ')')
+ var jsonObjectNetworks = eval(
+ '(' + JSON.stringify(jsonObject.response) + ')')
+ //console.log(jsonObject.response)
+ for (var i = 0; i < jsonObjectNetworks.length; i++) {
+ networkList.append({
+ number: jsonObjectNetworks[i].Number,
+ name: jsonObjectNetworks[i].ESSID,
+ strength: jsonObjectNetworks[i].Strength,
+ serviceState: jsonObjectNetworks[i].State,
+ security: jsonObjectNetworks[i].Security,
+ address: jsonObjectNetworks[i].IPAddress
+ })
+ console.log(jsonObjectNetworks[i].Number,
+ jsonObjectNetworks[i].ESSID,
+ jsonObjectNetworks[i].Strength,
+ jsonObjectNetworks[i].State,
+ jsonObjectNetworks[i].Security,
+ jsonObjectNetworks[i].IPAddress)
+ }
+ })
+ }
+ }
+ }
+ Rectangle {
+ id: buttonScan
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ anchors.margins: 80
+ width: buttonScanText.width + 10
+ height: buttonScanText.height + 10
+ border.width: mouseArea.pressed ? 2 : 1
+ //radius: 5
+ //antialiasing: true
+ //color: "black"
+ color: "#222"
+ border.color: "white"
+ Text {
+ id: buttonScanText
+ anchors.centerIn: parent
+ text: "SCAN"
+ color: "white"
+ font.pixelSize: 40
+ }
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ onClicked: {
+ log.text = ""
+ console.log("\n")
+ request(wifiAPIpath + 'scan', function (o) {
+ // log the json response
+ console.log(o.responseText)
+ })
+ }
+ }
+ }
+ function request(url, callback) {
+ var xhr = new XMLHttpRequest()
+ xhr.onreadystatechange = (function (myxhr) {
+ return function () {
+ if (xhr.readyState == 4 && xhr.status == 200)
+ callback(myxhr)
+ }
+ })
+ (xhr)
+ xhr.open('GET', url, false)
+ xhr.send('')
+ }
+
+ function securityType(security) {
+ if (security === "Open")
+ return "unsecured"
+ else
+ return "secured"
+ }
+
+ Component {
+ id: wifiDevice
+ Rectangle {
+ height: 150
+ width: parent.width
+ color: "#222"
+ Image {
+ anchors.top: parent.top
+ anchors.topMargin: 7
+ anchors.left: parent.left
+ width: 70
+ height: 50
+ id: icon
+ source: {
+ if (securityType(security) === "unsecured") {
+ if (strength < 30)
+ source = "images/HMI_Settings_Wifi_1Bar.svg"
+ else if (strength >= 30 && strength < 50)
+ source = "images/HMI_Settings_Wifi_2Bars.svg"
+ else if (strength >= 50 && strength < 70)
+ source = "images/HMI_Settings_Wifi_3Bars.svg"
+ else
+ source = "images/HMI_Settings_Wifi_Full.svg"
+ } else {
+ if (strength < 30)
+ source = "images/HMI_Settings_Wifi_Locked_1Bar.svg"
+ else if (strength >= 30 && strength < 50)
+ source = "images/HMI_Settings_Wifi_Locked_2Bars.svg"
+ else if (strength >= 50 && strength < 70)
+ source = "images/HMI_Settings_Wifi_Locked_3Bars.svg"
+ else
+ source = "images/HMI_Settings_Wifi_Locked_Full.svg"
+ }
+ }
+ }
+ Column {
+ anchors.left: icon.right
+ anchors.leftMargin: 10
+ Text {
+ text: name
+ font.pointSize: 30
+ font.bold: {
+ if ((serviceState === "ready")
+ || serviceState === "online")
+ font.bold = true
+ else
+ font.bold = false
+ }
+ color: {
+ if ((serviceState === "ready")
+ || serviceState === "online")
+ color = "#00ff00"
+ else
+ color = "#ffffff"
+ }
+ }
+ Text {
+ visible: ((serviceState === "ready")
+ || serviceState === "online") ? true : false
+ text: "connected, " + address
+ font.pointSize: 18
+ color: "#ffffff"
+ font.italic: true
+ }
+ }
+ Button {
+ id: connectButton
+ anchors.top: parent.top
+ anchors.right: parent.right
+ anchors.rightMargin: 5
+ width: 250
+
+ MouseArea {
+ anchors.fill: parent
+
+ Text {
+ anchors.fill: parent
+ id: buttonTextLabel
+ font.pixelSize: 15
+ font.bold: true
+ color: "black"
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ text: {
+ if ((serviceState === "ready")
+ || serviceState === "online")
+ text = "Forget"
+ else
+ text = "Connect"
+ }
+ }
+
+ onClicked: {
+
+ //connectButton.border.color = "steelblue"
+ if ((serviceState === "ready")
+ || serviceState === "online") {
+
+ //means we are connected
+ console.log("Disconnecting from", index, " ,", name)
+ request(wifiAPIpath + 'disconnect?network=' + index,
+ function (o) {
+
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ } else {
+ console.log("Conect to", index, " ,", name)
+
+ //passwordDialog.open()
+ request(wifiAPIpath + 'connect?network=' + index,
+ function (o) {
+
+ // log the json response
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ }
+ }
+ }
+ }
+
+ Button {
+ id: passwordButton
+ anchors.top: parent.top
+ anchors.right: parent.right
+ width: 40
+ visible: (securityType(security) === "unsecured") ? false : true
+
+ //anchors.rightMargin: connectButton.width + 5
+ //buttonText: "Connect"
+ text: {
+ "Key" //or some icon?
+ }
+
+ MouseArea {
+ anchors.fill: parent
+
+ onClicked: {
+
+ //connectButton.border.color = "steelblue"
+ passwordInputText.visible = true
+ connectButton.visible = false
+ passwordValidateButton.visible = true
+
+ System.showKeyboard = visible
+
+ //passwordInputText.o
+ periodicRefresh.stop()
+
+ var passkey = passwordInputText.text.valueOf()
+
+ //var passkey = 'randompassword'
+ console.log("Disconnecting from", index, " ,", name)
+ }
+ }
+ }
+
+ Button {
+ id: passwordValidateButton
+ anchors.top: parent.top
+ anchors.right: parent.right
+ anchors.rightMargin: connectButton.width + 5
+ width: 40
+ visible: false
+
+ //anchors.rightMargin: connectButton.width + 5
+ //buttonText: "Connect"
+ text: {
+ "ok" //or some icon?
+ }
+
+ MouseArea {
+ anchors.fill: parent
+
+ onClicked: {
+ //passwordInputText = ""
+ var passkey = passwordInputText.text.valueOf()
+ console.log("Validating", passkey)
+ System.showKeyboard = false
+
+ console.log("Passkey is", passkey)
+ request(wifiAPIpath + 'security?passkey=' + passkey,
+ function (o) {
+
+ //showRequestInfo(o.responseText)
+ console.log(o.responseText)
+ })
+ passwordValidateButton.visible = false
+ passwordInputText.visible = false
+ connectButton.visible = true
+
+ keyboard.currentString = ""
+
+ periodicRefresh.start()
+ }
+ }
+ }
+
+ TextInput {
+ id: passwordInputText
+ anchors.top: parent.top
+ anchors.right: parent.right
+ anchors.rightMargin: 5
+
+ font.pointSize: 15
+ color: "#ffffff"
+
+ width: connectButton.width
+ visible: false
+ text: keyboard.currentString
+ }
+ }
+ }
+ ListView {
+ width: parent.width
+ anchors.top: parent.top
+ anchors.topMargin: 70
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: 150
+ model: networkList //WifiList {}
+ delegate: wifiDevice
+ clip: true
+ }
+
+ //Timer for periodic refresh; this is BAD solution, need to figure out how to subscribe for events
+ Timer {
+ id: periodicRefresh
+ interval: 5000 // 5seconds
+ onTriggered: {
+
+ networkList.clear()
+ request(wifiAPIpath + 'scan_result', function (o) {
+ // log the json response
+ console.log(o.responseText)
+
+ // translate response into object
+ var jsonObject = eval('(' + o.responseText + ')')
+ var jsonObjectNetworks = eval('(' + JSON.stringify(
+ jsonObject.response) + ')')
+ console.log("WiFi list refreshed")
+ //console.log(jsonObject.response)
+ for (var i = 0; i < jsonObjectNetworks.length; i++) {
+ networkList.append({
+ number: jsonObjectNetworks[i].Number,
+ name: jsonObjectNetworks[i].ESSID,
+ strength: jsonObjectNetworks[i].Strength,
+ serviceState: jsonObjectNetworks[i].State,
+ security: jsonObjectNetworks[i].Security,
+ address: jsonObjectNetworks[i].IPAddress
+ })
+ }
+ })
+ start()
+ }
+ }
+}
diff --git a/app/wifi/images/HMI_Settings_WifiIcon.svg b/app/wifi/images/HMI_Settings_WifiIcon.svg
new file mode 100644
index 0000000..4314729
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_WifiIcon.svg
@@ -0,0 +1,61 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_WifiIcon.svg"><metadata
+ id="metadata20"><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="defs18" /><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="namedview16"
+ showgrid="false"
+ inkscape:zoom="2.36"
+ inkscape:cx="-191.52542"
+ inkscape:cy="50"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="Wifi_Icon"><path
+ class="st0"
+ d="M49.6,32.8c10.8-0.2,21.2,4.3,31,13.4l1.6-1.6C72,35,61,30.2,49.6,30.5c-15.2,0.4-26.9,9.4-31.8,13.9 l1.6,1.6C24.1,41.7,35.4,33.1,49.6,32.8z"
+ id="path10" /><path
+ class="st0"
+ d="M29,55.8l1.6,1.6c2.9-2.7,10.1-8.2,19.1-8.4c6.9-0.2,13.4,2.7,19.6,8.5L71,56c-6.7-6.3-13.9-9.4-21.3-9.2 C39.7,47,32.1,52.9,29,55.8z"
+ id="path12" /><path
+ class="st0"
+ d="M49.8,63.5c-4.7,0.1-8.2,3.3-9,4.2l1.6,1.6c0.7-0.7,3.6-3.4,7.5-3.5c2.6,0,5.3,1.2,7.7,3.7l1.6-1.6 C56.3,64.9,53.2,63.5,49.8,63.5z"
+ id="path14" /></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_1Bar.svg b/app/wifi/images/HMI_Settings_Wifi_1Bar.svg
new file mode 100644
index 0000000..e692c69
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_1Bar.svg
@@ -0,0 +1,71 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 80 80"
+ style="enable-background:new 0 0 80 80;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_1Bar.svg"><metadata
+ id="metadata29"><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="defs27" /><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="namedview25"
+ showgrid="false"
+ inkscape:zoom="2.95"
+ inkscape:cx="-129.15254"
+ inkscape:cy="40"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#545157;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="64.2"
+ rx="5.2"
+ ry="5"
+ id="ellipse11" /><g
+ id="g13"><path
+ class="st1"
+ d="M7.9,39.8c7.7-8.3,18.9-13.6,31.4-13.6c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8c-9.1-11.2-23.1-18.3-38.9-18.3 C25,19.1,12,25.1,3,34.6L7.9,39.8z"
+ id="path15" /></g><g
+ id="g17"><path
+ class="st1"
+ d="M17.1,49.3c5.3-6.2,13.3-10.2,22.2-10.2c9.8,0,18.4,4.8,23.7,12l5.3-4.8c-6.6-8.6-17.1-14.2-29-14.2 c-10.9,0-20.6,4.7-27.2,12L17.1,49.3z"
+ id="path19" /></g><g
+ id="g21"><path
+ class="st1"
+ d="M27.1,59.8c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9c-3.8-5.9-10.6-9.8-18.3-9.8 c-7.1,0-13.3,3.3-17.3,8.4L27.1,59.8z"
+ id="path23" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_2Bars.svg b/app/wifi/images/HMI_Settings_Wifi_2Bars.svg
new file mode 100644
index 0000000..f7cf642
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_2Bars.svg
@@ -0,0 +1,71 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 80 80"
+ style="enable-background:new 0 0 80 80;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_2Bars.svg"><metadata
+ id="metadata29"><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="defs27" /><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="namedview25"
+ showgrid="false"
+ inkscape:zoom="2.95"
+ inkscape:cx="-131.86441"
+ inkscape:cy="40"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#545157;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="64.2"
+ rx="5.2"
+ ry="5"
+ id="ellipse11" /><g
+ id="g13"><path
+ class="st1"
+ d="M7.9,39.8c7.7-8.3,18.9-13.6,31.4-13.6c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8c-9.1-11.2-23.1-18.3-38.9-18.3 C25,19.1,12,25.1,3,34.6L7.9,39.8z"
+ id="path15" /></g><g
+ id="g17"><path
+ class="st1"
+ d="M17.1,49.3c5.3-6.2,13.3-10.2,22.2-10.2c9.8,0,18.4,4.8,23.7,12l5.3-4.8c-6.6-8.6-17.1-14.2-29-14.2 c-10.9,0-20.6,4.7-27.2,12L17.1,49.3z"
+ id="path19" /></g><g
+ id="g21"><path
+ class="st0"
+ d="M27.1,59.8c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9c-3.8-5.9-10.6-9.8-18.3-9.8 c-7.1,0-13.3,3.3-17.3,8.4L27.1,59.8z"
+ id="path23" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_3Bars.svg b/app/wifi/images/HMI_Settings_Wifi_3Bars.svg
new file mode 100644
index 0000000..8a26f3f
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_3Bars.svg
@@ -0,0 +1,71 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 80 80"
+ style="enable-background:new 0 0 80 80;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_3Bars.svg"><metadata
+ id="metadata29"><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="defs27" /><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="namedview25"
+ showgrid="false"
+ inkscape:zoom="2.95"
+ inkscape:cx="-135.76271"
+ inkscape:cy="40"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#545157;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="64.2"
+ rx="5.2"
+ ry="5"
+ id="ellipse11" /><g
+ id="g13"><path
+ class="st1"
+ d="M7.9,39.8c7.7-8.3,18.9-13.6,31.4-13.6c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8c-9.1-11.2-23.1-18.3-38.9-18.3 C25,19.1,12,25.1,3,34.6L7.9,39.8z"
+ id="path15" /></g><g
+ id="g17"><path
+ class="st0"
+ d="M17.1,49.3c5.3-6.2,13.3-10.2,22.2-10.2c9.8,0,18.4,4.8,23.7,12l5.3-4.8c-6.6-8.6-17.1-14.2-29-14.2 c-10.9,0-20.6,4.7-27.2,12L17.1,49.3z"
+ id="path19" /></g><g
+ id="g21"><path
+ class="st0"
+ d="M27.1,59.8c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9c-3.8-5.9-10.6-9.8-18.3-9.8 c-7.1,0-13.3,3.3-17.3,8.4L27.1,59.8z"
+ id="path23" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_Full.svg b/app/wifi/images/HMI_Settings_Wifi_Full.svg
new file mode 100644
index 0000000..9ad1869
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_Full.svg
@@ -0,0 +1,70 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 80 80"
+ style="enable-background:new 0 0 80 80;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_Full.svg"><metadata
+ id="metadata29"><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="defs27" /><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="namedview25"
+ showgrid="false"
+ inkscape:zoom="2.95"
+ inkscape:cx="-164.40678"
+ inkscape:cy="40"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="64.2"
+ rx="5.2"
+ ry="5"
+ id="ellipse11" /><g
+ id="g13"><path
+ class="st0"
+ d="M7.9,39.8c7.7-8.3,18.9-13.6,31.4-13.6c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8c-9.1-11.2-23.1-18.3-38.9-18.3 C25,19.1,12,25.1,3,34.6L7.9,39.8z"
+ id="path15" /></g><g
+ id="g17"><path
+ class="st0"
+ d="M17.1,49.3c5.3-6.2,13.3-10.2,22.2-10.2c9.8,0,18.4,4.8,23.7,12l5.3-4.8c-6.6-8.6-17.1-14.2-29-14.2 c-10.9,0-20.6,4.7-27.2,12L17.1,49.3z"
+ id="path19" /></g><g
+ id="g21"><path
+ class="st0"
+ d="M27.1,59.8c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9c-3.8-5.9-10.6-9.8-18.3-9.8 c-7.1,0-13.3,3.3-17.3,8.4L27.1,59.8z"
+ id="path23" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_Locked_1Bar.svg b/app/wifi/images/HMI_Settings_Wifi_Locked_1Bar.svg
new file mode 100644
index 0000000..5da957f
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_Locked_1Bar.svg
@@ -0,0 +1,78 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 90 90"
+ style="enable-background:new 0 0 90 90;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_Locked_1Bar.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="2.6222222"
+ inkscape:cx="-164.74576"
+ inkscape:cy="45"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#545157;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="69"
+ rx="5.2"
+ ry="5"
+ id="ellipse9" /><g
+ id="g11"><path
+ class="st1"
+ d="M7.9,44.6C15.7,36.3,26.9,31,39.3,31c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8C69.1,31.2,55.1,24,39.3,24 C25,24,12,29.9,3,39.4L7.9,44.6z"
+ id="path13" /></g><g
+ id="g15"><path
+ class="st1"
+ d="M17.1,54.2C22.4,48,30.4,44,39.3,44c9.8,0,18.4,4.8,23.7,12l5.3-4.8C61.8,42.6,51.2,37,39.3,37 c-10.9,0-20.6,4.7-27.2,12L17.1,54.2z"
+ id="path17" /></g><g
+ id="g19"><path
+ class="st1"
+ d="M27.1,64.7c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9C53.8,54.9,47,51,39.3,51 c-7.1,0-13.3,3.3-17.3,8.4L27.1,64.7z"
+ id="path21" /></g><g
+ id="g23"><path
+ class="st0"
+ d="M87.9,74H75.4c-0.7,0-1.2-0.6-1.2-1.2v-6.6h2V72h10.9v-9H75.4c0.1,0,0.1,0,0.2,0h-1.4v-0.7 c0-0.7,0.6-1.2,1.2-1.2h12.4c0.7,0,1.2,0.6,1.2,1.2v10.5C89.1,73.4,88.5,74,87.9,74z"
+ id="path25" /></g><g
+ id="g27"><path
+ class="st0"
+ d="M87.2,60h-2v-3.5c0-1.9-1.6-3.5-3.5-3.5s-3.5,1.6-3.5,3.5V60h-2v-3.5c0-3,2.5-5.5,5.5-5.5s5.5,2.5,5.5,5.5 V60z"
+ id="path29" /></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_Locked_2Bars.svg b/app/wifi/images/HMI_Settings_Wifi_Locked_2Bars.svg
new file mode 100644
index 0000000..7f180aa
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_Locked_2Bars.svg
@@ -0,0 +1,78 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 90 90"
+ style="enable-background:new 0 0 90 90;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_Locked_2Bars.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="2.6222222"
+ inkscape:cx="-135.38136"
+ inkscape:cy="45"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#545157;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="69"
+ rx="5.2"
+ ry="5"
+ id="ellipse9" /><g
+ id="g11"><path
+ class="st1"
+ d="M7.9,44.6C15.7,36.3,26.9,31,39.3,31c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8C69.1,31.2,55.1,24,39.3,24 C25,24,12,29.9,3,39.4L7.9,44.6z"
+ id="path13" /></g><g
+ id="g15"><path
+ class="st1"
+ d="M17.1,54.2C22.4,48,30.4,44,39.3,44c9.8,0,18.4,4.8,23.7,12l5.3-4.8C61.8,42.6,51.2,37,39.3,37 c-10.9,0-20.6,4.7-27.2,12L17.1,54.2z"
+ id="path17" /></g><g
+ id="g19"><path
+ class="st0"
+ d="M27.1,64.7c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9C53.8,54.9,47,51,39.3,51 c-7.1,0-13.3,3.3-17.3,8.4L27.1,64.7z"
+ id="path21" /></g><g
+ id="g23"><path
+ class="st0"
+ d="M87.9,74H75.4c-0.7,0-1.2-0.6-1.2-1.2v-6.6h2V72h10.9v-9H75.4c0.1,0,0.1,0,0.2,0h-1.4v-0.7 c0-0.7,0.6-1.2,1.2-1.2h12.4c0.7,0,1.2,0.6,1.2,1.2v10.5C89.1,73.4,88.5,74,87.9,74z"
+ id="path25" /></g><g
+ id="g27"><path
+ class="st0"
+ d="M87.2,60h-2v-3.5c0-1.9-1.6-3.5-3.5-3.5s-3.5,1.6-3.5,3.5V60h-2v-3.5c0-3,2.5-5.5,5.5-5.5s5.5,2.5,5.5,5.5 V60z"
+ id="path29" /></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_Locked_3Bars.svg b/app/wifi/images/HMI_Settings_Wifi_Locked_3Bars.svg
new file mode 100644
index 0000000..276c758
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_Locked_3Bars.svg
@@ -0,0 +1,78 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 90 90"
+ style="enable-background:new 0 0 90 90;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_Locked_3Bars.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="2.6222222"
+ inkscape:cx="-125.65678"
+ inkscape:cy="45"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+ .st1{fill:#545157;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="69"
+ rx="5.2"
+ ry="5"
+ id="ellipse9" /><g
+ id="g11"><path
+ class="st1"
+ d="M7.9,44.6C15.7,36.3,26.9,31,39.3,31c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8C69.1,31.2,55.1,24,39.3,24 C25,24,12,29.9,3,39.4L7.9,44.6z"
+ id="path13" /></g><g
+ id="g15"><path
+ class="st0"
+ d="M17.1,54.2C22.4,48,30.4,44,39.3,44c9.8,0,18.4,4.8,23.7,12l5.3-4.8C61.8,42.6,51.2,37,39.3,37 c-10.9,0-20.6,4.7-27.2,12L17.1,54.2z"
+ id="path17" /></g><g
+ id="g19"><path
+ class="st0"
+ d="M27.1,64.7c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9C53.8,54.9,47,51,39.3,51 c-7.1,0-13.3,3.3-17.3,8.4L27.1,64.7z"
+ id="path21" /></g><g
+ id="g23"><path
+ class="st0"
+ d="M87.9,74H75.4c-0.7,0-1.2-0.6-1.2-1.2v-6.6h2V72h10.9v-9H75.4c0.1,0,0.1,0,0.2,0h-1.4v-0.7 c0-0.7,0.6-1.2,1.2-1.2h12.4c0.7,0,1.2,0.6,1.2,1.2v10.5C89.1,73.4,88.5,74,87.9,74z"
+ id="path25" /></g><g
+ id="g27"><path
+ class="st0"
+ d="M87.2,60h-2v-3.5c0-1.9-1.6-3.5-3.5-3.5s-3.5,1.6-3.5,3.5V60h-2v-3.5c0-3,2.5-5.5,5.5-5.5s5.5,2.5,5.5,5.5 V60z"
+ id="path29" /></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_Locked_Full.svg b/app/wifi/images/HMI_Settings_Wifi_Locked_Full.svg
new file mode 100644
index 0000000..9058511
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_Locked_Full.svg
@@ -0,0 +1,77 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 90 90"
+ style="enable-background:new 0 0 90 90;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_Locked_Full.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="2.6222222"
+ inkscape:cx="-130.80508"
+ inkscape:cy="45"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#FFFFFF;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="69"
+ rx="5.2"
+ ry="5"
+ id="ellipse9" /><g
+ id="g11"><path
+ class="st0"
+ d="M7.9,44.6C15.7,36.3,26.9,31,39.3,31c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8C69.1,31.2,55.1,24,39.3,24 C25,24,12,29.9,3,39.4L7.9,44.6z"
+ id="path13" /></g><g
+ id="g15"><path
+ class="st0"
+ d="M17.1,54.2C22.4,48,30.4,44,39.3,44c9.8,0,18.4,4.8,23.7,12l5.3-4.8C61.8,42.6,51.2,37,39.3,37 c-10.9,0-20.6,4.7-27.2,12L17.1,54.2z"
+ id="path17" /></g><g
+ id="g19"><path
+ class="st0"
+ d="M27.1,64.7c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9C53.8,54.9,47,51,39.3,51 c-7.1,0-13.3,3.3-17.3,8.4L27.1,64.7z"
+ id="path21" /></g><g
+ id="g23"><path
+ class="st0"
+ d="M87.9,74H75.4c-0.7,0-1.2-0.6-1.2-1.2v-6.6h2V72h10.9v-9H75.4c0.1,0,0.1,0,0.2,0h-1.4v-0.7 c0-0.7,0.6-1.2,1.2-1.2h12.4c0.7,0,1.2,0.6,1.2,1.2v10.5C89.1,73.4,88.5,74,87.9,74z"
+ id="path25" /></g><g
+ id="g27"><path
+ class="st0"
+ d="M87.2,60h-2v-3.5c0-1.9-1.6-3.5-3.5-3.5s-3.5,1.6-3.5,3.5V60h-2v-3.5c0-3,2.5-5.5,5.5-5.5s5.5,2.5,5.5,5.5 V60z"
+ id="path29" /></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_Locked_NoBars.svg b/app/wifi/images/HMI_Settings_Wifi_Locked_NoBars.svg
new file mode 100644
index 0000000..6f389c6
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_Locked_NoBars.svg
@@ -0,0 +1,79 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 90 90"
+ style="enable-background:new 0 0 90 90;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_Locked_NoBars.svg"><metadata
+ id="metadata39"><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="defs37" /><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="namedview35"
+ showgrid="false"
+ inkscape:zoom="2.6222222"
+ inkscape:cx="-110.21186"
+ inkscape:cy="45"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#545157;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="69"
+ rx="5.2"
+ ry="5"
+ id="ellipse11" /><g
+ id="g13"><path
+ class="st0"
+ d="M7.9,44.6C15.7,36.3,26.9,31,39.3,31c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8C69.1,31.2,55.1,24,39.3,24 C25,24,12,29.9,3,39.4L7.9,44.6z"
+ id="path15" /></g><g
+ id="g17"><path
+ class="st0"
+ d="M17.1,54.2C22.4,48,30.4,44,39.3,44c9.8,0,18.4,4.8,23.7,12l5.3-4.8C61.8,42.6,51.2,37,39.3,37 c-10.9,0-20.6,4.7-27.2,12L17.1,54.2z"
+ id="path19" /></g><g
+ id="g21"><path
+ class="st0"
+ d="M27.1,64.7c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9C53.8,54.9,47,51,39.3,51 c-7.1,0-13.3,3.3-17.3,8.4L27.1,64.7z"
+ id="path23" /></g></g><g
+ id="g25"><g
+ id="g27"><path
+ class="st0"
+ d="M87.9,74H75.4c-0.7,0-1.2-0.6-1.2-1.2v-6.6h2V72h10.9v-9H75.4c0.1,0,0.1,0,0.2,0h-1.4v-0.7 c0-0.7,0.6-1.2,1.2-1.2h12.4c0.7,0,1.2,0.6,1.2,1.2v10.5C89.1,73.4,88.5,74,87.9,74z"
+ id="path29" /></g><g
+ id="g31"><path
+ class="st0"
+ d="M87.2,60h-2v-3.5c0-1.9-1.6-3.5-3.5-3.5s-3.5,1.6-3.5,3.5V60h-2v-3.5c0-3,2.5-5.5,5.5-5.5s5.5,2.5,5.5,5.5 V60z"
+ id="path33" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/images/HMI_Settings_Wifi_NoBars.svg b/app/wifi/images/HMI_Settings_Wifi_NoBars.svg
new file mode 100644
index 0000000..e23fc1d
--- /dev/null
+++ b/app/wifi/images/HMI_Settings_Wifi_NoBars.svg
@@ -0,0 +1,70 @@
+<?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_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 80 80"
+ style="enable-background:new 0 0 80 80;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Settings_Wifi_NoBars.svg"><metadata
+ id="metadata29"><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="defs27" /><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="namedview25"
+ showgrid="false"
+ inkscape:zoom="2.95"
+ inkscape:cx="-152.20339"
+ inkscape:cy="40"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><style
+ type="text/css"
+ id="style3">
+ .st0{fill:#545157;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><ellipse
+ class="st0"
+ cx="39.3"
+ cy="64.2"
+ rx="5.2"
+ ry="5"
+ id="ellipse11" /><g
+ id="g13"><path
+ class="st0"
+ d="M7.9,39.8c7.7-8.3,18.9-13.6,31.4-13.6c13.7,0,25.8,6.3,33.5,16.1l5.3-4.8c-9.1-11.2-23.1-18.3-38.9-18.3 C25,19.1,12,25.1,3,34.6L7.9,39.8z"
+ id="path15" /></g><g
+ id="g17"><path
+ class="st0"
+ d="M17.1,49.3c5.3-6.2,13.3-10.2,22.2-10.2c9.8,0,18.4,4.8,23.7,12l5.3-4.8c-6.6-8.6-17.1-14.2-29-14.2 c-10.9,0-20.6,4.7-27.2,12L17.1,49.3z"
+ id="path19" /></g><g
+ id="g21"><path
+ class="st0"
+ d="M27.1,59.8c2.6-4,7.1-6.6,12.2-6.6c5.6,0,10.5,3.1,12.9,7.7l5.4-4.9c-3.8-5.9-10.6-9.8-18.3-9.8 c-7.1,0-13.3,3.3-17.3,8.4L27.1,59.8z"
+ id="path23" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/wifi/wifi.qrc b/app/wifi/wifi.qrc
new file mode 100644
index 0000000..063088a
--- /dev/null
+++ b/app/wifi/wifi.qrc
@@ -0,0 +1,16 @@
+<RCC>
+ <qresource prefix="/wifi">
+ <file>Wifi.qml</file>
+ <file>images/HMI_Settings_Wifi_1Bar.svg</file>
+ <file>images/HMI_Settings_Wifi_2Bars.svg</file>
+ <file>images/HMI_Settings_Wifi_3Bars.svg</file>
+ <file>images/HMI_Settings_Wifi_Full.svg</file>
+ <file>images/HMI_Settings_Wifi_Locked_1Bar.svg</file>
+ <file>images/HMI_Settings_Wifi_Locked_2Bars.svg</file>
+ <file>images/HMI_Settings_Wifi_Locked_3Bars.svg</file>
+ <file>images/HMI_Settings_Wifi_Locked_Full.svg</file>
+ <file>images/HMI_Settings_Wifi_Locked_NoBars.svg</file>
+ <file>images/HMI_Settings_Wifi_NoBars.svg</file>
+ <file>images/HMI_Settings_WifiIcon.svg</file>
+ </qresource>
+</RCC>