summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/PresetDataObject.cpp63
-rw-r--r--app/PresetDataObject.h57
-rw-r--r--app/Radio.qml230
-rw-r--r--app/app.pri12
-rw-r--r--app/app.pro11
-rw-r--r--app/config.tests/libhomescreen/libhomescreen.cpp8
-rw-r--r--app/config.tests/libhomescreen/libhomescreen.pro5
-rw-r--r--app/images/AGL_MediaPlayer_BackArrow.svg56
-rw-r--r--app/images/AGL_MediaPlayer_ForwardArrow.svg56
-rw-r--r--app/images/AGL_MediaPlayer_Player_Pause.svg67
-rw-r--r--app/images/AGL_MediaPlayer_Player_Play.svg67
-rw-r--r--app/images/FM_Icons_AM.svg71
-rw-r--r--app/images/FM_Icons_FM.svg65
-rw-r--r--app/images/HMI_Radio_Equalizer.svg335
-rw-r--r--app/images/Radio_Active_Icon.svg299
-rw-r--r--app/images/images.qrc12
-rw-r--r--app/main.cpp83
-rw-r--r--app/radio.qrc5
18 files changed, 1502 insertions, 0 deletions
diff --git a/app/PresetDataObject.cpp b/app/PresetDataObject.cpp
new file mode 100644
index 0000000..6e69626
--- /dev/null
+++ b/app/PresetDataObject.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2016 by Scott Murray <scott.murray@konsulko.com>
+ *
+ * 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 "PresetDataObject.h"
+
+PresetDataObject::PresetDataObject(QObject *parent) : QObject(parent)
+{
+}
+
+PresetDataObject::PresetDataObject(const QString &title, const quint32 &frequency, const quint32 &band, QObject *parent)
+ : QObject(parent), m_title(title), m_frequency(frequency), m_band(band)
+{
+}
+
+QString PresetDataObject::title() const
+{
+ return m_title;
+}
+
+void PresetDataObject::setTitle(const QString &title)
+{
+ if (title != m_title) {
+ m_title = title;
+ emit titleChanged();
+ }
+}
+
+quint32 PresetDataObject::frequency() const
+{
+ return m_frequency;
+}
+
+void PresetDataObject::setFrequency(const quint32 &frequency) {
+ if (frequency != m_frequency) {
+ m_frequency = frequency;
+ emit frequencyChanged();
+ }
+}
+
+quint32 PresetDataObject::band() const
+{
+ return m_band;
+}
+
+void PresetDataObject::setBand(const quint32 &band) {
+ if (band != m_band) {
+ m_band = band;
+ emit bandChanged();
+ }
+}
diff --git a/app/PresetDataObject.h b/app/PresetDataObject.h
new file mode 100644
index 0000000..a43b853
--- /dev/null
+++ b/app/PresetDataObject.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 by Scott Murray <scott.murray@konsulko.com>
+ *
+ * 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.
+ */
+
+#ifndef PRESETDATAOBJECT_H
+#define PRESETDATAOBJECT_H
+
+#include <QObject>
+
+class PresetDataObject : public QObject
+{
+ Q_OBJECT
+
+ Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged)
+ Q_PROPERTY(quint32 frequency READ frequency WRITE setFrequency NOTIFY frequencyChanged)
+ Q_PROPERTY(quint32 band READ band WRITE setBand NOTIFY bandChanged)
+
+public:
+ PresetDataObject(QObject *parent = Q_NULLPTR);
+ PresetDataObject(const QString &title, const quint32 &frequency, const quint32 &band, QObject *parent = Q_NULLPTR);
+
+ QString title() const;
+
+ void setTitle(const QString &title);
+
+ quint32 frequency() const;
+
+ void setFrequency(const quint32 &frequency);
+
+ quint32 band() const;
+
+ void setBand(const quint32 &band);
+
+signals:
+ void titleChanged();
+ void frequencyChanged();
+ void bandChanged();
+
+private:
+ QString m_title;
+ quint32 m_frequency;
+ quint32 m_band;
+};
+
+#endif // PRESETDATAOBJECT_H
diff --git a/app/Radio.qml b/app/Radio.qml
new file mode 100644
index 0000000..8bcd56e
--- /dev/null
+++ b/app/Radio.qml
@@ -0,0 +1,230 @@
+/*
+ * 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 QtMultimedia 5.5
+import AGL.Demo.Controls 1.0
+
+ApplicationWindow {
+ id: root
+
+ Radio {
+ id: radio
+ property string title
+ onBandChanged: frequency = minimumFrequency
+ onStationFound: title = stationId
+ onFrequencyChanged: {
+ title = ''
+ slider.value = frequency
+ }
+
+ function freq2str(freq) {
+ if (freq > 5000000) {
+ return '%1 MHz'.arg((freq / 1000000).toFixed(1))
+ } else {
+ return '%1 kHz'.arg((freq / 1000).toFixed(0))
+ }
+ }
+ }
+
+ ColumnLayout {
+ anchors.fill: parent
+ Item {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Layout.preferredHeight: 3
+ clip: true
+ Image {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ fillMode: Image.PreserveAspectFit
+ source: './images/HMI_Radio_Equalizer.svg'
+ }
+ Item {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ height :307
+ Rectangle {
+ anchors.fill: parent
+ color: 'black'
+ opacity: 0.75
+ }
+
+ ColumnLayout {
+ anchors.fill: parent
+ anchors.margins: root.width * 0.02
+ Item {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Row {
+ spacing: 20
+ Image {
+ source: './images/FM_Icons_FM.svg'
+ }
+// ToggleButton {
+// offImage: './images/FM_Icons_FM.svg'
+// onImage: './images/FM_Icons_AM.svg'
+// onCheckedChanged: {
+// radio.band = checked ? Radio.AM : Radio.FM
+// radio.frequency = radio.minimumFrequency
+// }
+// }
+ }
+ ColumnLayout {
+ anchors.fill: parent
+ Label {
+ id: label
+ Layout.alignment: Layout.Center
+ text: radio.freq2str(radio.frequency)
+ horizontalAlignment: Label.AlignHCenter
+ verticalAlignment: Label.AlignVCenter
+ }
+ Label {
+ id: artist
+ Layout.alignment: Layout.Center
+ text: radio.title
+ horizontalAlignment: Label.AlignHCenter
+ verticalAlignment: Label.AlignVCenter
+ font.pixelSize: label.font.pixelSize * 0.6
+ }
+ }
+ }
+ Slider {
+ id: slider
+ Layout.fillWidth: true
+ from: radio.minimumFrequency
+ to: radio.maximumFrequency
+ stepSize: radio.frequencyStep
+ snapMode: Slider.SnapOnRelease
+ onValueChanged: radio.frequency = value
+ Label {
+ anchors.left: parent.left
+ anchors.bottom: parent.top
+ font.pixelSize: 32
+ text: radio.freq2str(radio.minimumFrequency)
+ }
+ Label {
+ anchors.right: parent.right
+ anchors.bottom: parent.top
+ font.pixelSize: 32
+ text: radio.freq2str(radio.maximumFrequency)
+ }
+ }
+ RowLayout {
+ Layout.fillHeight: true
+ Item { Layout.fillWidth: true }
+ ImageButton {
+ offImage: './images/AGL_MediaPlayer_BackArrow.svg'
+ Timer {
+ running: parent.pressed
+ triggeredOnStart: true
+ interval: 100
+ repeat: true
+ onTriggered: radio.tuneDown()
+ }
+ }
+ ImageButton {
+ id: play
+ offImage: './images/AGL_MediaPlayer_Player_Play.svg'
+ onClicked: radio.start()
+ states: [
+ State {
+ when: radio.state === Radio.ActiveState
+ PropertyChanges {
+ target: play
+ offImage: './images/AGL_MediaPlayer_Player_Pause.svg'
+ onClicked: radio.stop()
+ }
+ }
+ ]
+ }
+ ImageButton {
+ offImage: './images/AGL_MediaPlayer_ForwardArrow.svg'
+ Timer {
+ running: parent.pressed
+ triggeredOnStart: true
+ interval: 100
+ repeat: true
+ onTriggered: radio.tuneUp()
+ }
+ }
+
+ Item { Layout.fillWidth: true }
+ }
+ }
+ }
+ }
+ Item {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Layout.preferredHeight: 2
+ ListView {
+ anchors.fill: parent
+ anchors.leftMargin: 50
+ anchors.rightMargin: 50
+ clip: true
+ header: Label { text: 'PRESETS'; opacity: 0.5 }
+ model: presetModel
+
+ delegate: MouseArea {
+ width: ListView.view.width
+ height: ListView.view.height / 4
+
+ onClicked: {
+ radio.band = model.modelData.band
+ radio.frequency = model.modelData.frequency
+ radio.title = model.modelData.title
+ }
+
+ RowLayout {
+ anchors.fill: parent
+ Image {
+ source: './images/Radio_Active_Icon.svg'
+ }
+ ColumnLayout {
+ Layout.fillWidth: true
+ Label {
+ Layout.fillWidth: true
+ text: model.title
+ }
+ Label {
+ Layout.fillWidth: true
+ text: radio.freq2str(model.frequency)
+ color: '#59FF7F'
+ font.pixelSize: 32
+ }
+ }
+ Image {
+ source: {
+ switch (model.modelData.band) {
+ case Radio.FM:
+ return './images/FM_Icons_FM.svg'
+ case Radio.AM:
+ return './images/FM_Icons_AM.svg'
+ }
+ return null
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
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..e0a927e
--- /dev/null
+++ b/app/app.pro
@@ -0,0 +1,11 @@
+TARGET = radio
+QT = quickcontrols2
+
+HEADERS = PresetDataObject.h
+SOURCES = main.cpp PresetDataObject.cpp
+
+RESOURCES += \
+ radio.qrc \
+ images/images.qrc
+
+include(app.pri)
diff --git a/app/config.tests/libhomescreen/libhomescreen.cpp b/app/config.tests/libhomescreen/libhomescreen.cpp
new file mode 100644
index 0000000..d698b05
--- /dev/null
+++ b/app/config.tests/libhomescreen/libhomescreen.cpp
@@ -0,0 +1,8 @@
+#include <libhomescreen.hpp>
+
+int main(int argc,char **argv)
+{
+ LibHomeScreen libHomeScreen;
+ return 0;
+}
+
diff --git a/app/config.tests/libhomescreen/libhomescreen.pro b/app/config.tests/libhomescreen/libhomescreen.pro
new file mode 100644
index 0000000..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/images/AGL_MediaPlayer_BackArrow.svg b/app/images/AGL_MediaPlayer_BackArrow.svg
new file mode 100644
index 0000000..c49b519
--- /dev/null
+++ b/app/images/AGL_MediaPlayer_BackArrow.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 80 80"
+ style="enable-background:new 0 0 80 80;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="AGL_MediaPlayer_BackArrow.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="2.95"
+ inkscape:cx="-116.94915"
+ 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-rule:evenodd;clip-rule:evenodd;fill:#66FF99;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="previous_1_"><g
+ id="g10"><path
+ class="st0"
+ d="M68,38.4H18.3c3.4-3.4,11.1-11,11.1-11c0-0.1-1.6-3.2-1.6-3.2L12,40l15.8,15.8c0,0,1.6-3.2,1.6-3.2 c0,0-7.7-7.7-11-11.1H68V38.4z"
+ id="path12" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/AGL_MediaPlayer_ForwardArrow.svg b/app/images/AGL_MediaPlayer_ForwardArrow.svg
new file mode 100644
index 0000000..56576ac
--- /dev/null
+++ b/app/images/AGL_MediaPlayer_ForwardArrow.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 80 80"
+ style="enable-background:new 0 0 80 80;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="AGL_MediaPlayer_ForwardArrow.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="2.95"
+ inkscape:cx="-118.98305"
+ 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-rule:evenodd;clip-rule:evenodd;fill:#66FF99;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="previous_1_"><g
+ id="g10"><path
+ class="st0"
+ d="M12,38.4h49.7c-3.4-3.4-11.1-11-11.1-11c0-0.1,1.6-3.2,1.6-3.2L68,40L52.2,55.8c0,0-1.6-3.2-1.6-3.2 c0,0,7.7-7.7,11-11.1H12V38.4z"
+ id="path12" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/AGL_MediaPlayer_Player_Pause.svg b/app/images/AGL_MediaPlayer_Player_Pause.svg
new file mode 100644
index 0000000..ee55213
--- /dev/null
+++ b/app/images/AGL_MediaPlayer_Player_Pause.svg
@@ -0,0 +1,67 @@
+<?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="AGL_MediaPlayer_Player_Pause.svg"><metadata
+ id="metadata23"><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="defs21" /><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="namedview19"
+ showgrid="false"
+ inkscape:zoom="2.36"
+ inkscape:cx="-133.05085"
+ 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{opacity:0.851;}
+ .st1{fill:none;stroke:#66FF99;stroke-width:2;stroke-miterlimit:10;}
+ .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="button_2_"
+ class="st0"><g
+ id="g10"><ellipse
+ class="st1"
+ cx="49.3"
+ cy="49.6"
+ rx="46"
+ ry="46"
+ id="ellipse12" /></g></g><g
+ id="pause_2_"><g
+ id="g15"><path
+ class="st2"
+ d="M43.1,29.8h-5.6c-1.6,0-2.8,1.2-2.8,2.8v33.2c0,1.5,1.3,2.8,2.8,2.8h5.6c1.6,0,2.8-1.2,2.8-2.8V32.5 C45.9,31,44.6,29.8,43.1,29.8z M60,29.8h-5.6c-1.6,0-2.8,1.2-2.8,2.8v33.2c0,1.5,1.3,2.8,2.8,2.8H60c1.6,0,2.8-1.2,2.8-2.8V32.5 C62.8,31,61.6,29.8,60,29.8z"
+ id="path17" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/AGL_MediaPlayer_Player_Play.svg b/app/images/AGL_MediaPlayer_Player_Play.svg
new file mode 100644
index 0000000..c296f8a
--- /dev/null
+++ b/app/images/AGL_MediaPlayer_Player_Play.svg
@@ -0,0 +1,67 @@
+<?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="AGL_MediaPlayer_Player_Play.svg"><metadata
+ id="metadata23"><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="defs21" /><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="namedview19"
+ showgrid="false"
+ inkscape:zoom="2.36"
+ inkscape:cx="-159.95763"
+ 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{opacity:0.851;}
+ .st1{fill:none;stroke:#66FF99;stroke-width:2;stroke-miterlimit:10;}
+ .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="button_2_"
+ class="st0"><g
+ id="g10"><ellipse
+ class="st1"
+ cx="49.3"
+ cy="49.6"
+ rx="46"
+ ry="46"
+ id="ellipse12" /></g></g><g
+ id="play_icon_2_"><g
+ id="g15"><path
+ class="st2"
+ d="M65,48L43.3,33.9c-1.3-0.7-2.8-0.6-2.8,1.9v27.7c0,2.3,1.6,2.7,2.8,1.9L65,51.3C65.9,50.4,65.9,48.9,65,48z "
+ id="path17" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/FM_Icons_AM.svg b/app/images/FM_Icons_AM.svg
new file mode 100644
index 0000000..ea6e5e1
--- /dev/null
+++ b/app/images/FM_Icons_AM.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 120 80"
+ style="enable-background:new 0 0 120 80;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="FM_Icons_AM.svg"><metadata
+ id="metadata23"><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="defs21" /><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="namedview19"
+ showgrid="false"
+ inkscape:zoom="2.95"
+ inkscape:cx="-112.0339"
+ 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:#999999;}
+ .st1{font-family:'Roboto-Regular';}
+ .st2{font-size:23.1521px;}
+ .st3{letter-spacing:4;}
+ .st4{fill:#66FF99;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><text
+ transform="matrix(0.9958 0 0 1 74.5477 46.0002)"
+ class="st0 st1 st2 st3"
+ id="text9">FM</text>
+<g
+ id="g11"><text
+ transform="matrix(0.9958 0 0 1 7.0003 46.0002)"
+ id="text13"><tspan
+ x="0"
+ y="0"
+ class="st4 st1 st2 st3"
+ id="tspan15">AM </tspan><tspan
+ x="53.4"
+ y="0"
+ class="st0 st1 st2 st3"
+ id="tspan17">|</tspan></text>
+</g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/FM_Icons_FM.svg b/app/images/FM_Icons_FM.svg
new file mode 100644
index 0000000..0f3ae59
--- /dev/null
+++ b/app/images/FM_Icons_FM.svg
@@ -0,0 +1,65 @@
+<?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 120 80"
+ style="enable-background:new 0 0 120 80;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="FM_Icons_FM.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.95"
+ inkscape:cx="-92.542373"
+ 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:#66FF99;}
+ .st1{font-family:'Roboto-Regular';}
+ .st2{font-size:23.1521px;}
+ .st3{letter-spacing:4;}
+ .st4{fill:#999999;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><text
+ transform="matrix(0.9958 0 0 1 74.5477 46.0002)"
+ class="st0 st1 st2 st3"
+ id="text11">FM</text>
+</g><g
+ id="g13"><text
+ transform="matrix(0.9958 0 0 1 7.0003 46.0002)"
+ class="st4 st1 st2 st3"
+ id="text15">AM |</text>
+</g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/HMI_Radio_Equalizer.svg b/app/images/HMI_Radio_Equalizer.svg
new file mode 100644
index 0000000..6959144
--- /dev/null
+++ b/app/images/HMI_Radio_Equalizer.svg
@@ -0,0 +1,335 @@
+<?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:xlink="http://www.w3.org/1999/xlink"
+ 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 1080 1000"
+ style="enable-background:new 0 0 1080 1000;"
+ xml:space="preserve"
+ inkscape:version="0.91 r13725"
+ sodipodi:docname="HMI_Radio_Equalizer.svg"><metadata
+ id="metadata115"><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="defs113" /><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="namedview111"
+ showgrid="false"
+ inkscape:zoom="0.236"
+ inkscape:cx="-1481.1864"
+ inkscape:cy="500"
+ 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.2;clip-path:url(#SVGID_2_);}
+ .st1{fill:#4DCE9B;}
+ .st2{opacity:0.2;}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><g
+ id="g11"><defs
+ id="defs13"><rect
+ id="SVGID_1_"
+ x="-0.2"
+ y="77.3"
+ width="1080.4"
+ height="458.1" /></defs><clipPath
+ id="SVGID_2_"><use
+ xlink:href="#SVGID_1_"
+ style="overflow:visible;"
+ id="use17" /></clipPath><g
+ class="st0"
+ id="g19"
+ clip-path="url(#SVGID_2_)"><rect
+ x="20.6"
+ y="489.8"
+ class="st1"
+ width="15.7"
+ height="89"
+ id="rect21" /><rect
+ x="118.1"
+ y="236.6"
+ class="st1"
+ width="15.7"
+ height="595.5"
+ id="rect23" /><rect
+ x="166.8"
+ y="281"
+ class="st1"
+ width="15.7"
+ height="506.6"
+ id="rect25" /><rect
+ x="215.6"
+ y="309.1"
+ class="st1"
+ width="15.7"
+ height="450.4"
+ id="rect27" /><rect
+ x="264.3"
+ y="337.6"
+ class="st1"
+ width="15.7"
+ height="393.4"
+ id="rect29" /><rect
+ x="313"
+ y="368.3"
+ class="st1"
+ width="15.7"
+ height="332.1"
+ id="rect31" /><rect
+ x="361.8"
+ y="404.5"
+ class="st1"
+ width="15.7"
+ height="259.6"
+ id="rect33" /><rect
+ x="410.5"
+ y="381.9"
+ class="st1"
+ width="15.7"
+ height="304.8"
+ id="rect35" /><rect
+ x="459.3"
+ y="344.4"
+ class="st1"
+ width="15.7"
+ height="379.9"
+ id="rect37" /><rect
+ x="508"
+ y="267.5"
+ class="st1"
+ width="15.7"
+ height="533.6"
+ id="rect39" /><rect
+ x="605.5"
+ y="253.4"
+ class="st1"
+ width="15.7"
+ height="561.9"
+ id="rect41" /><rect
+ x="654.2"
+ y="309.1"
+ class="st1"
+ width="15.7"
+ height="450.4"
+ id="rect43" /><rect
+ x="703"
+ y="374.7"
+ class="st1"
+ width="15.7"
+ height="319.3"
+ id="rect45" /><rect
+ x="751.7"
+ y="429.3"
+ class="st1"
+ width="15.7"
+ height="210"
+ id="rect47" /><rect
+ x="849.2"
+ y="404.5"
+ class="st1"
+ width="15.7"
+ height="259.6"
+ id="rect49" /><rect
+ x="897.9"
+ y="368.3"
+ class="st1"
+ width="15.7"
+ height="332.1"
+ id="rect51" /><rect
+ x="946.7"
+ y="429.3"
+ class="st1"
+ width="15.7"
+ height="210"
+ id="rect53" /><rect
+ x="995.4"
+ y="488.8"
+ class="st1"
+ width="15.7"
+ height="91"
+ id="rect55" /><rect
+ x="1044.1"
+ y="517.9"
+ class="st1"
+ width="15.7"
+ height="32.9"
+ id="rect57" /><rect
+ x="800.4"
+ y="488.8"
+ class="st1"
+ width="15.7"
+ height="91"
+ id="rect59" /><rect
+ x="556.7"
+ y="145.9"
+ class="st1"
+ width="15.7"
+ height="776.8"
+ id="rect61" /><rect
+ x="69.4"
+ y="404.5"
+ class="st1"
+ width="15.7"
+ height="259.6"
+ id="rect63" /></g></g><g
+ class="st2"
+ id="g65"><rect
+ x="20.6"
+ y="489.8"
+ class="st1"
+ width="15.7"
+ height="89"
+ id="rect67" /><rect
+ x="118.1"
+ y="236.6"
+ class="st1"
+ width="15.7"
+ height="595.5"
+ id="rect69" /><rect
+ x="166.8"
+ y="281"
+ class="st1"
+ width="15.7"
+ height="506.6"
+ id="rect71" /><rect
+ x="215.6"
+ y="309.1"
+ class="st1"
+ width="15.7"
+ height="450.4"
+ id="rect73" /><rect
+ x="264.3"
+ y="337.6"
+ class="st1"
+ width="15.7"
+ height="393.4"
+ id="rect75" /><rect
+ x="313"
+ y="368.3"
+ class="st1"
+ width="15.7"
+ height="332.1"
+ id="rect77" /><rect
+ x="361.8"
+ y="404.5"
+ class="st1"
+ width="15.7"
+ height="259.6"
+ id="rect79" /><rect
+ x="410.5"
+ y="381.9"
+ class="st1"
+ width="15.7"
+ height="304.8"
+ id="rect81" /><rect
+ x="459.3"
+ y="344.4"
+ class="st1"
+ width="15.7"
+ height="379.9"
+ id="rect83" /><rect
+ x="508"
+ y="267.5"
+ class="st1"
+ width="15.7"
+ height="533.6"
+ id="rect85" /><rect
+ x="605.5"
+ y="253.4"
+ class="st1"
+ width="15.7"
+ height="561.9"
+ id="rect87" /><rect
+ x="654.2"
+ y="309.1"
+ class="st1"
+ width="15.7"
+ height="450.4"
+ id="rect89" /><rect
+ x="703"
+ y="374.7"
+ class="st1"
+ width="15.7"
+ height="319.3"
+ id="rect91" /><rect
+ x="751.7"
+ y="429.3"
+ class="st1"
+ width="15.7"
+ height="210"
+ id="rect93" /><rect
+ x="849.2"
+ y="404.5"
+ class="st1"
+ width="15.7"
+ height="259.6"
+ id="rect95" /><rect
+ x="897.9"
+ y="368.3"
+ class="st1"
+ width="15.7"
+ height="332.1"
+ id="rect97" /><rect
+ x="946.7"
+ y="429.3"
+ class="st1"
+ width="15.7"
+ height="210"
+ id="rect99" /><rect
+ x="995.4"
+ y="488.8"
+ class="st1"
+ width="15.7"
+ height="91"
+ id="rect101" /><rect
+ x="1044.1"
+ y="517.9"
+ class="st1"
+ width="15.7"
+ height="32.9"
+ id="rect103" /><rect
+ x="800.4"
+ y="488.8"
+ class="st1"
+ width="15.7"
+ height="91"
+ id="rect105" /><rect
+ x="556.7"
+ y="145.9"
+ class="st1"
+ width="15.7"
+ height="776.8"
+ id="rect107" /><rect
+ x="69.4"
+ y="404.5"
+ class="st1"
+ width="15.7"
+ height="259.6"
+ id="rect109" /></g></g></g></switch></svg> \ No newline at end of file
diff --git a/app/images/Radio_Active_Icon.svg b/app/images/Radio_Active_Icon.svg
new file mode 100644
index 0000000..383f2cd
--- /dev/null
+++ b/app/images/Radio_Active_Icon.svg
@@ -0,0 +1,299 @@
+<?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="Radio_Active_Icon.svg"><metadata
+ id="metadata132"><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="defs130" /><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="namedview128"
+ showgrid="false"
+ inkscape:zoom="2.95"
+ inkscape:cx="-157.79661"
+ 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:url(#SVGID_1_);}
+ .st1{fill:url(#SVGID_2_);}
+ .st2{fill:url(#SVGID_3_);}
+ .st3{fill:url(#SVGID_4_);}
+ .st4{fill:url(#SVGID_5_);}
+ .st5{fill:url(#SVGID_6_);}
+ .st6{fill:url(#SVGID_7_);}
+ .st7{fill:url(#SVGID_8_);}
+ .st8{fill:url(#SVGID_9_);}
+ .st9{fill:url(#SVGID_10_);}
+ .st10{fill:url(#SVGID_11_);}
+ .st11{fill:url(#SVGID_12_);}
+ .st12{fill:url(#SVGID_13_);}
+</style><switch
+ id="switch5"><g
+ i:extraneous="self"
+ id="g7"><g
+ id="g9"><linearGradient
+ id="SVGID_1_"
+ gradientUnits="userSpaceOnUse"
+ x1="3.9276"
+ y1="95.1698"
+ x2="82.4232"
+ y2="-24.8823"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop12" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop14" /></linearGradient><path
+ class="st0"
+ d="M40,80c-0.1,0-0.1,0-0.2,0C17.7,79.9-0.1,61.8,0,39.8C0.1,17.8,18,0,40,0c0.1,0,0.1,0,0.2,0 C62.3,0.1,80.1,18.2,80,40.2l0,0C79.9,62.2,62,80,40,80z M40,1.4C18.8,1.4,1.5,18.6,1.4,39.8C1.3,61.1,18.5,78.5,39.8,78.6 c0.1,0,0.1,0,0.2,0c21.2,0,38.5-17.2,38.6-38.4C78.7,18.9,61.5,1.5,40.2,1.4C40.1,1.4,40.1,1.4,40,1.4z"
+ id="path16" /><g
+ id="g18"><g
+ id="g20"><linearGradient
+ id="SVGID_2_"
+ gradientUnits="userSpaceOnUse"
+ x1="0.6657"
+ y1="93.037"
+ x2="79.1612"
+ y2="-27.015"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop23" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop25" /></linearGradient><path
+ class="st1"
+ d="M43.8,51.7l-0.5-1.6c3.7-1.2,6.1-4.4,6.1-8V23.5c0-4.7-4.2-8.5-9.3-8.5s-9.3,3.8-9.3,8.5v18.6 c0,3.5,2.4,6.7,6.1,8l-0.5,1.6c-4.3-1.5-7.2-5.3-7.2-9.6V23.5c0-5.6,4.9-10.2,11-10.2s11,4.6,11,10.2v18.6 C51,46.4,48.1,50.3,43.8,51.7z"
+ id="path27" /></g><g
+ id="g29"><linearGradient
+ id="SVGID_3_"
+ gradientUnits="userSpaceOnUse"
+ x1="6.4911"
+ y1="96.8461"
+ x2="84.9869"
+ y2="-23.2062"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop32" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop34" /></linearGradient><path
+ class="st2"
+ d="M40,56.6c-8.4,0-15.3-5.6-15.3-12.5h1.7c0,6,6.1,10.9,13.6,10.9S53.6,50,53.6,44h1.7 C55.3,50.9,48.4,56.6,40,56.6z"
+ id="path36" /></g><g
+ id="g38"><linearGradient
+ id="SVGID_4_"
+ gradientUnits="userSpaceOnUse"
+ x1="13.5651"
+ y1="101.4712"
+ x2="92.0607"
+ y2="-18.5808"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop41" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop43" /></linearGradient><rect
+ x="39.2"
+ y="59.2"
+ class="st3"
+ width="1.7"
+ height="3.7"
+ id="rect45" /></g><g
+ id="g47"><linearGradient
+ id="SVGID_5_"
+ gradientUnits="userSpaceOnUse"
+ x1="-6.0323"
+ y1="88.6578"
+ x2="72.4634"
+ y2="-31.3946"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop50" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop52" /></linearGradient><rect
+ x="29.9"
+ y="27.8"
+ class="st4"
+ width="6.6"
+ height="1.7"
+ id="rect54" /></g><g
+ id="g56"><linearGradient
+ id="SVGID_6_"
+ gradientUnits="userSpaceOnUse"
+ x1="-8.3573"
+ y1="87.1376"
+ x2="70.1385"
+ y2="-32.9148"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop59" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop61" /></linearGradient><rect
+ x="29.9"
+ y="22.7"
+ class="st5"
+ width="6.6"
+ height="1.7"
+ id="rect63" /></g><g
+ id="g65"><linearGradient
+ id="SVGID_7_"
+ gradientUnits="userSpaceOnUse"
+ x1="-3.6831"
+ y1="90.1938"
+ x2="74.8127"
+ y2="-29.8586"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop68" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop70" /></linearGradient><rect
+ x="29.9"
+ y="32.9"
+ class="st6"
+ width="6.6"
+ height="1.7"
+ id="rect72" /></g><g
+ id="g74"><linearGradient
+ id="SVGID_8_"
+ gradientUnits="userSpaceOnUse"
+ x1="-1.3579"
+ y1="91.7141"
+ x2="77.1379"
+ y2="-28.3383"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop77" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop79" /></linearGradient><rect
+ x="29.9"
+ y="38"
+ class="st7"
+ width="6.6"
+ height="1.7"
+ id="rect81" /></g><g
+ id="g83"><linearGradient
+ id="SVGID_9_"
+ gradientUnits="userSpaceOnUse"
+ x1="3.4647"
+ y1="94.8674"
+ x2="81.9605"
+ y2="-25.185"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop86" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop88" /></linearGradient><rect
+ x="43.5"
+ y="27.8"
+ class="st8"
+ width="6.6"
+ height="1.7"
+ id="rect90" /></g><g
+ id="g92"><linearGradient
+ id="SVGID_10_"
+ gradientUnits="userSpaceOnUse"
+ x1="1.1397"
+ y1="93.3472"
+ x2="79.6355"
+ y2="-26.7052"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop95" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop97" /></linearGradient><rect
+ x="43.5"
+ y="22.7"
+ class="st9"
+ width="6.6"
+ height="1.7"
+ id="rect99" /></g><g
+ id="g101"><linearGradient
+ id="SVGID_11_"
+ gradientUnits="userSpaceOnUse"
+ x1="5.8139"
+ y1="96.4034"
+ x2="84.3097"
+ y2="-23.649"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop104" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop106" /></linearGradient><rect
+ x="43.5"
+ y="32.9"
+ class="st10"
+ width="6.6"
+ height="1.7"
+ id="rect108" /></g><g
+ id="g110"><linearGradient
+ id="SVGID_12_"
+ gradientUnits="userSpaceOnUse"
+ x1="8.1391"
+ y1="97.9237"
+ x2="86.6349"
+ y2="-22.1287"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop113" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop115" /></linearGradient><rect
+ x="43.5"
+ y="38"
+ class="st11"
+ width="6.6"
+ height="1.7"
+ id="rect117" /></g><g
+ id="g119"><linearGradient
+ id="SVGID_13_"
+ gradientUnits="userSpaceOnUse"
+ x1="15.826"
+ y1="102.9496"
+ x2="94.3218"
+ y2="-17.1028"><stop
+ offset="0"
+ style="stop-color:#59FF7F"
+ id="stop122" /><stop
+ offset="1"
+ style="stop-color:#6BFBFF"
+ id="stop124" /></linearGradient><path
+ class="st12"
+ d="M50.2,66.7h-1.7c0-2.1-1.1-2.5-4.1-2.5h-8.8c-3,0-4.1,0.4-4.1,2.5h-1.7c0-4.2,3.6-4.2,5.8-4.2h8.8 C46.6,62.5,50.2,62.5,50.2,66.7z"
+ id="path126" /></g></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..9161221
--- /dev/null
+++ b/app/images/images.qrc
@@ -0,0 +1,12 @@
+<RCC>
+ <qresource prefix="/images">
+ <file>AGL_MediaPlayer_BackArrow.svg</file>
+ <file>AGL_MediaPlayer_ForwardArrow.svg</file>
+ <file>AGL_MediaPlayer_Player_Pause.svg</file>
+ <file>AGL_MediaPlayer_Player_Play.svg</file>
+ <file>FM_Icons_AM.svg</file>
+ <file>FM_Icons_FM.svg</file>
+ <file>HMI_Radio_Equalizer.svg</file>
+ <file>Radio_Active_Icon.svg</file>
+ </qresource>
+</RCC>
diff --git a/app/main.cpp b/app/main.cpp
new file mode 100644
index 0000000..9d2785e
--- /dev/null
+++ b/app/main.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (C) 2016 Scott Murray <scott.murray@konsulko.com>
+ *
+ * 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/QSettings>
+#include <QtGui/QGuiApplication>
+#include <QtQml/QQmlApplicationEngine>
+#include <QtQml/QQmlContext>
+#include <QtQuickControls2/QQuickStyle>
+#include <QtMultimedia/QRadioTunerControl>
+#include <stdlib.h>
+#include "PresetDataObject.h"
+
+
+#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);
+
+ QQuickStyle::setStyle("AGL");
+
+ // Read presets from configuration file
+ //
+ // If HOME is set, use $HOME/app-data/radio/presets.conf, else fall back
+ // to the QSettings default locations with organization "AGL" and a
+ // file name of radio-presets.conf. See:
+ //
+ // http://doc.qt.io/qt-5/qsettings.html#platform-specific-notes
+ //
+ // for details on the locations and their order of priority.
+ //
+ QSettings *pSettings = NULL;
+ char *p = getenv("HOME");
+ if(p) {
+ QString confPath = p;
+ confPath.append("/app-data/radio/presets.conf");
+ pSettings = new QSettings(confPath, QSettings::NativeFormat);
+ } else {
+ pSettings = new QSettings("AGL", "radio-presets");
+ }
+ QList<QObject*> presetDataList;
+ int size = pSettings->beginReadArray("fmPresets");
+ for (int i = 0; i < size; ++i) {
+ pSettings->setArrayIndex(i);
+ presetDataList.append(new PresetDataObject(pSettings->value("title").toString(),
+ pSettings->value("frequency").toInt(),
+ QRadioTuner::FM));
+ }
+ pSettings->endArray();
+
+ QQmlApplicationEngine engine;
+ QQmlContext *context = engine.rootContext();
+ context->setContextProperty("presetModel", QVariant::fromValue(presetDataList));
+ engine.load(QUrl(QStringLiteral("qrc:/Radio.qml")));
+
+ return app.exec();
+}
diff --git a/app/radio.qrc b/app/radio.qrc
new file mode 100644
index 0000000..347894c
--- /dev/null
+++ b/app/radio.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file>Radio.qml</file>
+ </qresource>
+</RCC>