summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com>2019-06-19 17:33:07 +0800
committerwang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com>2019-06-19 17:33:07 +0800
commit833d0d106df43110e18229c9c654606ebf4b5841 (patch)
treefee603246824de2dd99e5772830536a201246fe6
parent838d62ed32a6cd6d71c72a7b7b272d672bc7e674 (diff)
-rw-r--r--CMakeLists.txt131
-rw-r--r--LICENSE (renamed from homescreen/LICENSE)0
-rw-r--r--README.md58
-rwxr-xr-xautobuild/agl/autobuild58
-rwxr-xr-xautobuild/linux/autobuild62
-rw-r--r--homescreen.pro24
-rw-r--r--homescreen/README.md10
-rw-r--r--homescreen/docs/api-services-book.yml12
-rw-r--r--homescreen/docs/homescreen-book.yml12
-rw-r--r--homescreen/docs/homescreen_api.md186
-rw-r--r--homescreen/docs/index.md31
-rw-r--r--homescreen/docs/pictures/api_getAllSurfacesOfProcess.pngbin10485 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/api_getSurfaceStatus_1.pngbin10168 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/api_getSurfaceStatus_2.pngbin9794 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/api_getSurfaceStatus_3.pngbin19030 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/api_hardKeyPressed.pngbin9241 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/api_renderSurfaceToArea.pngbin9060 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/api_renderSurfaceToAreaAllowed.pngbin14910 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/api_requestSurfaceIdToFullScreen.pngbin10056 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/api_surfaceVisibilityChanged.pngbin8882 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/dashboard.pngbin359145 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/full/dashboard.pngbin1055839 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/full/homescreen_applauncher.pngbin1090490 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/full/hvac.pngbin921864 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/full/phone.pngbin936048 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/full/settings.pngbin863641 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/homescreen_applauncher.pngbin399084 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/hvac.pngbin338097 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/phone.pngbin336318 -> 0 bytes
-rw-r--r--homescreen/docs/pictures/settings.pngbin300437 -> 0 bytes
-rw-r--r--homescreen/homescreen.pro52
-rw-r--r--homescreen/qml/IconItem.qml104
-rw-r--r--homescreen/qml/MediaArea.qml57
-rw-r--r--homescreen/qml/MediaAreaBlank.qml124
-rw-r--r--homescreen/qml/MediaAreaMusic.qml85
-rw-r--r--homescreen/qml/MediaAreaRadio.qml24
-rw-r--r--homescreen/qml/ShortcutArea.qml70
-rw-r--r--homescreen/qml/ShortcutIcon.qml100
-rw-r--r--homescreen/qml/StatusArea.qml148
-rw-r--r--homescreen/qml/TopArea.qml59
-rw-r--r--homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.pngbin949053 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaMusic/AlbumArtwork.pngbin25963 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaMusic/BackArrow.pngbin691 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaMusic/ForwardArrow.pngbin717 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaMusic/ShuffleIcon.pngbin927 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaMusic/Volume_Loud.pngbin579 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaMusic/Volume_Medium.pngbin882 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaMusic/Volume_Off.pngbin740 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaMusic/mediamusic.qrc11
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_AlbumArtwork.pngbin1854532 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_BackArrow.pngbin648 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Bluetooth_Active.pngbin4637 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Bluetooth_Inactive.pngbin2790 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_CD_Active.pngbin5581 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_CD_Inactive.pngbin3223 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_DividingLine.pngbin342 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_ForwardArrow.pngbin675 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Loop_Active.pngbin996 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Loop_Inactive.pngbin1199 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Player_Pause.pngbin3959 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Player_Play.pngbin4078 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_PlaylistToggle_Active.pngbin2061 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_PlaylistToggle_Inactive.pngbin2061 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Playlist_Active.pngbin4251 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Playlist_Inactive.pngbin2547 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Radio_Active.pngbin4673 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Radio_Inactive.pngbin2877 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Shuffle_Active.pngbin1139 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Shuffle_Inactive.pngbin1379 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Albums_Active.pngbin4616 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Albums_Inactive.pngbin2965 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/DividingLine.pngbin419 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/GreenLine.pngbin364 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Music_Active.pngbin2567 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Music_Inactive.pngbin2692 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Podcasts_Active.pngbin3687 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Podcasts_Inactive.pngbin3014 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Popup_Highlight.pngbin780 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Popup_PauseIcon.pngbin1496 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Popup_PlayIcon.pngbin2273 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/Popup_VerticalLine.pngbin364 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/X.pngbin640 -> 0 bytes
-rw-r--r--homescreen/qml/images/MediaPlayer/mediaplayer.qrc37
-rw-r--r--homescreen/qml/images/Shortcut/hvac.svg600
-rw-r--r--homescreen/qml/images/Shortcut/hvac_active.svg614
-rw-r--r--homescreen/qml/images/Shortcut/launcher.svg73
-rw-r--r--homescreen/qml/images/Shortcut/launcher_active.svg82
-rw-r--r--homescreen/qml/images/Shortcut/mediaplayer.svg50
-rw-r--r--homescreen/qml/images/Shortcut/mediaplayer_active.svg63
-rw-r--r--homescreen/qml/images/Shortcut/navigation.svg77
-rw-r--r--homescreen/qml/images/Shortcut/navigation_active.svg90
-rw-r--r--homescreen/qml/images/Shortcut/shortcut.qrc12
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Bluetooth_Inactive-01.pngbin1170 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Bluetooth_On-01.pngbin922 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Signal_1Bars-01.pngbin570 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Signal_2Bars-01.pngbin564 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Signal_3Bars-01.pngbin560 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Signal_4Bars-01.pngbin552 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Signal_Full-01.pngbin544 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Signal_NoBars-01.pngbin575 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Wifi_1Bar-01.pngbin1245 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Wifi_2Bars-01.pngbin1198 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Wifi_3Bars-01.pngbin1120 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Wifi_Full-01.pngbin995 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/HMI_Status_Wifi_NoBars-01.pngbin1278 -> 0 bytes
-rw-r--r--homescreen/qml/images/Status/status.qrc17
-rw-r--r--homescreen/qml/images/TopSection_NoText_NoIcons-01.svg55
-rw-r--r--homescreen/qml/images/Utility_Logo_Background-01.svg53
-rw-r--r--homescreen/qml/images/Utility_Logo_Grey-01.svg84
-rw-r--r--homescreen/qml/images/Utility_Music_Background-01.pngbin711 -> 0 bytes
-rw-r--r--homescreen/qml/images/Utility_Radio_Background-01.pngbin920 -> 0 bytes
-rw-r--r--homescreen/qml/images/Weather/WeatherIcons_ALL-01.pngbin1320 -> 0 bytes
-rw-r--r--homescreen/qml/images/Weather/WeatherIcons_Cloudy-01.pngbin715 -> 0 bytes
-rw-r--r--homescreen/qml/images/Weather/WeatherIcons_Moon-01.pngbin749 -> 0 bytes
-rw-r--r--homescreen/qml/images/Weather/WeatherIcons_PartiallyCloudy-01.pngbin900 -> 0 bytes
-rw-r--r--homescreen/qml/images/Weather/WeatherIcons_Rain-01.pngbin870 -> 0 bytes
-rw-r--r--homescreen/qml/images/Weather/WeatherIcons_Snow-01.pngbin840 -> 0 bytes
-rw-r--r--homescreen/qml/images/Weather/WeatherIcons_Sun-01.pngbin807 -> 0 bytes
-rw-r--r--homescreen/qml/images/Weather/WeatherIcons_Thunderstorm-01.pngbin886 -> 0 bytes
-rw-r--r--homescreen/qml/images/Weather/weather.qrc12
-rw-r--r--homescreen/qml/images/images.qrc10
-rw-r--r--homescreen/qml/main.qml156
-rw-r--r--homescreen/qml/qml.qrc14
-rw-r--r--homescreen/src/applicationlauncher.cpp85
-rw-r--r--homescreen/src/applicationlauncher.h55
-rw-r--r--homescreen/src/hmi-debug.h70
-rw-r--r--homescreen/src/homescreenhandler.cpp121
-rw-r--r--homescreen/src/homescreenhandler.h51
-rw-r--r--homescreen/src/main.cpp155
-rw-r--r--homescreen/src/mastervolume.cpp110
-rw-r--r--homescreen/src/mastervolume.h49
-rw-r--r--homescreen/src/statusbarmodel.cpp150
-rw-r--r--homescreen/src/statusbarmodel.h47
-rw-r--r--homescreen/src/statusbarserver.cpp91
-rw-r--r--homescreen/src/statusbarserver.h52
-rw-r--r--interfaces/LICENSE54
-rw-r--r--interfaces/README.md11
-rw-r--r--interfaces/afm_user_daemon.xml52
-rw-r--r--interfaces/appframework.xml57
-rw-r--r--interfaces/include/afm_user_daemon.hpp21
-rw-r--r--interfaces/include/appframework.hpp66
-rw-r--r--interfaces/include/statusbar.hpp22
-rw-r--r--interfaces/interfaces.pri18
-rw-r--r--interfaces/interfaces.pro61
-rw-r--r--interfaces/src/appframework.cpp167
-rw-r--r--interfaces/statusbar.xml38
-rw-r--r--package/config.xml23
-rw-r--r--package/package.pro22
-rw-r--r--package/root/config.xml18
-rw-r--r--package/root/icon.svg (renamed from package/icon.svg)0
-rw-r--r--package/root/pipeline.ini1
-rw-r--r--src/gst-wayland-demo.cpp1360
-rw-r--r--src/gst-wayland-demo.hpp118
-rw-r--r--src/parson.h234
-rw-r--r--src/sdl-protocol.c5026
155 files changed, 6888 insertions, 5034 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..149444c
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,131 @@
+#
+# Copyright (c) 2019 TOYOTA MOTOR CORPORATION
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+cmake_minimum_required( VERSION 2.8.5 )
+
+project (gstwayland)
+
+set(CMAKE_CXX_FLAGS "-Wall -fpermissive")
+
+find_package(PkgConfig)
+find_package (Threads)
+pkg_check_modules(WAYLAND_CLIENT wayland-client REQUIRED)
+pkg_check_modules(WAYLAND_CURSOR wayland-cursor REQUIRED)
+pkg_check_modules(WALTHAM waltham REQUIRED)
+pkg_check_modules(GLESv2 glesv2 REQUIRED)
+pkg_check_modules(WAYLAND_EGL wayland-egl REQUIRED)
+pkg_check_modules(ILMCONTROL REQUIRED ilmControl)
+pkg_check_modules(ILMINPUT REQUIRED ilmInput)
+
+pkg_search_module(EGL egl required)
+pkg_search_module(GSTREAMER gstreamer-1.0 required)
+pkg_search_module(GSTREAMERAPP gstreamer-app-1.0 required)
+pkg_search_module(DRM libdrm required)
+pkg_search_module(WEBSOCKET libwebsockets required)
+
+find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
+find_library(GST_ALLOCATOR NAMES gstallocators-1.0 PATHs /usr/lib64)
+find_library(GST_VIDEO NAMES gstvideo-1.0 PATHs /usr/lib64)
+find_library(GST_WAYLAND NAMES gstwayland-1.0 PATHs /usr/lib64)
+
+add_custom_command(
+ OUTPUT ivi-application-client-protocol.h
+ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} client-header
+ < ${CMAKE_SOURCE_DIR}/protocol/ivi-application.xml
+ > ${CMAKE_CURRENT_BINARY_DIR}/ivi-application-client-protocol.h
+ DEPENDS ${CMAKE_SOURCE_DIR}/protocol/ivi-application.xml
+)
+
+add_custom_command(
+ OUTPUT ivi-application-protocol.c
+ COMMAND ${WAYLAND_SCANNER_EXECUTABLE} code
+ < ${CMAKE_SOURCE_DIR}/protocol/ivi-application.xml
+ > ${CMAKE_CURRENT_BINARY_DIR}/ivi-application-protocol.c
+ DEPENDS ${CMAKE_SOURCE_DIR}/protocol/ivi-application.xml
+)
+
+include_directories(
+ ${WAYLAND_CLIENT_INCLUDE_DIR}
+ ${WAYLAND_CURSOR_INCLUDE_DIR}
+ ${WALTHAM_INCLUDE_DIRS}
+ ${DRM_INCLUDE_DIRS}
+ ${GSTREAMER_LIBRARY_DIRS}
+ ${GSTREAMER_INCLUDE_DIRS}
+ ${GSTREAMERAPP_INCLUDE_DIRS}
+ ${EGL_INCLUDE_DIRS}
+ ${WAYLAND_EGL_INCLUDE_DIR}
+ ${GLESv2_INCLUDE_DIRS}
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/include/
+ ${CMAKE_SOURCE_DIR}/waltham-renderer
+ "${ILMCONTROL_INCLUDE_DIRS}"
+ "${ILMINPUT_INCLUDE_DIRS}"
+)
+
+link_directories(
+ ${WAYLAND_CLIENT_LIBRARY_DIRS}
+ ${WAYLAND_CURSOR_LIBRARY_DIRS}
+ ${WALTHAM_LIBRARY_DIRS}
+ ${EGL_LIBRARY_DIRS}
+ ${WAYLAND_EGL_LIBRAY_DIRS}
+ ${GLESv2_LIBRARY_DIRS}
+ ${GSTREAMER_LIBRARY_DIRS}
+ ${GSTREAMERAPP_LIBRARY_DIRS}
+)
+
+SET(LIBS
+ ${CMAKE_THREAD_LIBS_INIT}
+ ${WAYLAND_CLIENT_LIBRARIES}
+ ${WAYLAND_CURSOR_LIBRARIES}
+ ${WALTHAM_LIBRARIES}
+ ${EGL_LIBRARIES}
+ ${WAYLAND_EGL_LIBRARIES}
+ ${GLESv2_LIBRARIES}
+ ${GSTREAMER_LIBRARIES}
+ ${GSTREAMERAPP_LIBRARIES}
+ ${GST_ALLOCATOR}
+ ${GST_VIDEO}
+ ${GST_WAYLAND}
+ libwindowmanager.so
+ libjson-c.so
+ libhomescreen.so
+ libafbwsc.so
+ systemd
+ ${ILMCONTROL_LIBRARIES}
+ ${ILMINPUT_LIBRARIES}
+ ${WEBSOCKET_LIBRARIES}
+)
+
+SET(SRC_FILES
+ src/sdl-protocol.c
+ src/gst-wayland-demo.cpp
+)
+
+#add executable file
+add_executable(${PROJECT_NAME} ${SRC_FILES})
+
+#add link library
+add_definitions(${EGL_CFLAGS})
+
+target_link_libraries(${PROJECT_NAME} ${LIBS})
+
+add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
+ COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/package ${PROJECT_BINARY_DIR}
+ COMMAND mkdir -p ${PROJECT_BINARY_DIR}/package/root/bin
+ COMMAND cp -rf ${PROJECT_BINARY_DIR}/${PROJECT_NAME} ${PROJECT_BINARY_DIR}/package/root/bin
+ COMMAND wgtpkg-pack -f -o ${PROJECT_BINARY_DIR}/package/${PROJECT_NAME}.wgt ${PROJECT_BINARY_DIR}/package/root)
+
+
+install (TARGETS ${PROJECT_NAME} DESTINATION bin)
diff --git a/homescreen/LICENSE b/LICENSE
index 31c692a..31c692a 100644
--- a/homescreen/LICENSE
+++ b/LICENSE
diff --git a/README.md b/README.md
deleted file mode 100644
index 2c04a91..0000000
--- a/README.md
+++ /dev/null
@@ -1,58 +0,0 @@
-This project contains:
-
-HomeScreen: AGL Home Screen reference implementation
-
-**AGL repo for source code**
-
-```
-$ mkdir WORK
-$ cd WORK
-$ repo init -b dab -m dab_4.0.0_xml -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo
-$ repo sync
-$ git clone git clone https://gerrit.automotivelinux.org/gerrit/staging/meta-hmi-framework
-
-```
-
-Then you can get the following recipe.
-
-* `meta-agl-demo/recipes-demo-hmi/homescreen`
-
-
-**Bitbake**
-
-```
-$ source meta-agl/scripts/aglsetup.sh -m m3ulcb agl-demo agl-devel agl-appfw-smack agl-hmi-framework
-$ bitbake homescreen
-```
-
-Instructions for building HomeScreen app
-----------------------------------------
-
-The HomeScreen app is part of the
-packagegroup-agl-demo-platform
-packagegroup.
-
-This also includes the following apps:
-- WindowManager
-- HomeScreen Binder
-
-And the library
-- libhomescreen
-- libwindowmanager
-
-
-To build all the above, follow the instrucions on the AGL
-documentation website:
-http://docs.automotivelinux.org/docs/getting_started/en/dev/reference/source-code.html#features-supported-by-aglsetup
-
-Please activate the "agl-demo" feature when running the aglsetup script:
-http://docs.automotivelinux.org/docs/getting_started/en/dev/reference/source-code.html#features-supported-by-aglsetup
-
-
-Launch HomeScreen App:
-
-Usage:
-
-```
-afm-util start homescreen
-```
diff --git a/autobuild/agl/autobuild b/autobuild/agl/autobuild
deleted file mode 100755
index e87a1c3..0000000
--- a/autobuild/agl/autobuild
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/make -f
-# Copyright (C) 2015 - 2018 "IoT.bzh"
-# Author "Romain Forlot" <romain.forlot@iot.bzh>
-#
-# 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.
-
-THISFILE := $(lastword $(MAKEFILE_LIST))
-BUILD_DIR := $(abspath $(dir $(THISFILE))/../../build)
-DEST := ${BUILD_DIR}
-
-.PHONY: all clean distclean configure build package help
-
-all: help
-
-help:
- @echo "List of targets available:"
- @echo ""
- @echo "- all"
- @echo "- clean"
- @echo "- distclean"
- @echo "- configure"
- @echo "- build: compilation, link and prepare files for package into a widget"
- @echo "- package: output a widget file '*.wgt'"
- @echo "- install: install in your INSTALL_ROOT directory"
- @echo ""
- @echo "Usage: ./autobuild/agl/autobuild package DEST=${HOME}/opt"
- @echo "Don't use your build dir as DEST as wgt file is generated at this location"
-
-clean:
- @([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} ${CLEAN_ARGS} clean) || echo Nothing to clean
-
-distclean:
- @([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} distclean) || echo Nothing to distclean
-
-configure:
- @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}
- @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && qmake ${CONFIGURE_ARGS} ..)
-
-build: configure
- @make -C ${BUILD_DIR} ${BUILD_ARGS} all
-
-package: build
- @if [ "${DEST}" != "${BUILD_DIR}/$@" ]; then \
- mkdir -p ${DEST} && cp ${BUILD_DIR}/$@/*.wgt ${DEST}; \
- fi
-
-install: build
- @make -C ${BUILD_DIR} ${INSTALL_ARGS} install
diff --git a/autobuild/linux/autobuild b/autobuild/linux/autobuild
deleted file mode 100755
index 9ec2f6e..0000000
--- a/autobuild/linux/autobuild
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/usr/bin/make -f
-# Copyright (C) 2015 - 2018 "IoT.bzh"
-# Author "Romain Forlot" <romain.forlot@iot.bzh>
-#
-# 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.
-
-THISFILE := $(lastword $(MAKEFILE_LIST))
-BUILD_DIR := $(abspath $(dir $(THISFILE))/../../build)
-DEST := ${BUILD_DIR}
-
-.PHONY: all clean distclean configure build package help
-
-all: help
-
-help:
- @echo "List of targets available:"
- @echo ""
- @echo "- all"
- @echo "- clean"
- @echo "- distclean"
- @echo "- configure"
- @echo "- build: compilation, link and prepare files for package into a widget"
- @echo "- package: output a widget file '*.wgt'"
- @echo "- install: install in your defined DEST directory"
- @echo ""
- @echo "Usage: ./autobuild/agl/autobuild package DEST=${HOME}/opt"
- @echo "Don't use your build dir as DEST as wgt file is generated at this location"
-
-clean:
- @([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} ${CLEAN_ARGS} clean) || echo Nothing to clean
-
-distclean:
- @[ -d ${DEST} ] && find ${DEST} -name "*.wgt" -delete
- @([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} distclean) || echo Nothing to distclean
-
-configure:
- @[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}
- @[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && qmake ${CONFIGURE_ARGS} ..)
-
-build: configure
- @make -C ${BUILD_DIR} ${BUILD_ARGS} all
-
-package: build
- @if [ "${DEST}" != "${BUILD_DIR}/$@" ]; then \
- mkdir -p ${DEST} && cp ${BUILD_DIR}/$@/*.wgt ${DEST}; \
- fi
-
-install: build
- @if [ "${DEST}" != "${BUILD_DIR}" ]; then \
- mkdir -p ${DEST} && cp -rf ${BUILD_DIR}/package/root/* ${DEST}; \
- fi
-
diff --git a/homescreen.pro b/homescreen.pro
deleted file mode 100644
index 7c49383..0000000
--- a/homescreen.pro
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (c) 2017 TOYOTA MOTOR CORPORATION
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-TEMPLATE = subdirs
-
-load(configure)
-
-SUBDIRS = interfaces \
- homescreen \
- package
-
-homescreen.depends = interfaces
-package.depends += homescreen
diff --git a/homescreen/README.md b/homescreen/README.md
deleted file mode 100644
index c52a7f8..0000000
--- a/homescreen/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-AGL Home Screen reference implementation
-
-
-Build with QtCreator 3.5.1
-
-AGL repo for source code:
-https://gerrit.automotivelinux.org/gerrit/#/admin/projects/staging/HomeScreen
-
-AGL repo for bitbake recipe:
-https://gerrit.automotivelinux.org/gerrit/#/admin/projects/AGL/meta-agl-demo/recipes-demo-hmi/homescreen/homescreen_git.bb
diff --git a/homescreen/docs/api-services-book.yml b/homescreen/docs/api-services-book.yml
deleted file mode 100644
index 5a0d43a..0000000
--- a/homescreen/docs/api-services-book.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-type: books
-books:
--
- id: homescreen
- title: HomeScreen (old)
- description: Homescreen documentation
- keywords:
- author: "TOYOTA MOTOR CORPORATION"
- version: master
- chapters:
- - url: homescreen_api.md
- name: HomeScreen API \ No newline at end of file
diff --git a/homescreen/docs/homescreen-book.yml b/homescreen/docs/homescreen-book.yml
deleted file mode 100644
index acc740d..0000000
--- a/homescreen/docs/homescreen-book.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-type: books
-books:
--
- id: homescreen
- title: HomeScreen
- description: HomeScreen documentation
- keywords:
- author:
- version: master
- chapters:
- - url: index.md
- name: Overview
diff --git a/homescreen/docs/homescreen_api.md b/homescreen/docs/homescreen_api.md
deleted file mode 100644
index 8f7b8f4..0000000
--- a/homescreen/docs/homescreen_api.md
+++ /dev/null
@@ -1,186 +0,0 @@
-# HomeScreen API
-The HomeScreen app provides an own interface for some special use cases concerning the surfaces and user inputs.
-
-The interface is implemented as D-Bus interface.
-This is the introspection, describing the interface:
-
-```
-<node>
- <interface name="org.agl.homescreen">
- <method name="hardKeyPressed">
- <arg name="key" type="i" direction="in"/>
- </method>
- <method name="getSurfaceStatus">
- <arg name="surfaceId" type="i" direction="in"/>
- <arg name="status" type="i" direction="out"/>
- </method>
- <method name="requestSurfaceIdToFullScreen">
- <arg name="surfaceId" type="i" direction="in"/>
- </method>
- <method name="getAllSurfacesOfProcess">
- <arg name="pid" type="i" direction="in"/>
- <arg name="surfaceIds" type="ai" direction="out"/>
- <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList&lt;int&gt;"/>
- </method>
- <method name="getLayoutRenderAreaForSurfaceId">
- <arg name="surfaceId" type="i" direction="in"/>
- <arg name="renderArea" type="(iiii)" direction="out"/>
- <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QRect"/>
- </method>
- <method name="renderSurfaceToAreaAllowed">
- <arg name="surfaceId" type="i" direction="in"/>
- <arg name="layoutArea" type="i" direction="in"/>
- <arg name="allowed" type="b" direction="out"/>
- </method>
- <method name="renderSurfaceToArea">
- <arg name="surfaceId" type="i" direction="in"/>
- <arg name="layoutArea" type="i" direction="in"/>
- </method>
- </interface>
-</node>
-```
-
-These interface will change during further development, so check back frequently.
-
-## User Input Events API calls
-
-### hardKeyPressed
-
-Use hardKeyPressed to inject hard key press events into the HomeScreen app.
-This Interface call can be used by applications like the InputEventManager to inject hard keys into the HomeScreen application.
-
-#### Example
-
-if someone presses the Hard Key “NAV” on the target, this key may be injected using this interface to make the HomeScreen launch the navigation application.
-Right now, only a few keys are defined (in inputevent.hpp):
-
-```
-namespace InputEvent {
- typedef enum HardKey
- {
- HARDKEY_UNDEFINED,
- HARDKEY_NAV,
- HARDKEY_MEDIA
- } eHardKey;
-}
-```
-
-This will change in the future.
-
-![hardKeyPressed](pictures/api_hardKeyPressed.png)
-
-A “normal” application would not need to call this API.
-
-## Surface control API calls
-
-The normal use case when starting an application is:
-The user presses a hard key or uses the app launcher to start an app. The app is then started and is shown full screen.
-The org.agl.homescreen API provides some methods to get information about some status and some methods to show surfaces on the screen.
-
-### getSurfaceStatus
-
-A surface can be visible or invisible (please do not confuse “visible” and “visibility”). This function allows to request the current status.
-
-```
-<method name="getSurfaceStatus">
- <arg name="surfaceId" type="i" direction="in"/>
- <arg name="status" type="i" direction="out"/>
-</method>
-```
-
-Right now an application has to pull this information.
-This is not optimal and will change in the future. There are two options:
-
- - The homescreen API will provide a signal that is emitted every time the visible status of surfaces changes. This would be way more efficient, because it would save time and avoid a re-occurring API call. __UPDATE:__ There is a D-Bus signal implemented in this API
- - For Qt, there is already a patch available that provides this information as a base class property. See https://codereview.qt-project.org/#/c/176211/ This would be optimal for Qt widget applications. But not useful for other languages, e.g. Java. __UPDATE:__ This patch got reverted in AGL!
-
-#### Current implementation
-
-![getSurfaceStatus](pictures/api_getSurfaceStatus_1.png)
-
-#### Option 1
-
-![getSurfaceStatus](pictures/api_getSurfaceStatus_2.png)
-
-#### Option 2
-
-![getSurfaceStatus](pictures/api_getSurfaceStatus_3.png)
-
-### requestSurfaceIdToFullScreen
-
-This function will set the given surface to full screen.
-
-```
-<method name="requestSurfaceIdToFullScreen">
- <arg name="surfaceId" type="i" direction="in"/>
-</method>
-```
-
-It will hide all other surfaces.
-
-![requestSurfaceIdToFullScreen](pictures/api_requestSurfaceIdToFullScreen.png)
-
-### getAllSurfacesOfProcess
-
-This returns all surfaces that are created by the given process ID.
-
-```
-<method name="getAllSurfacesOfProcess">
- <arg name="pid" type="i" direction="in"/>
- <arg name="surfaceIds" type="ai" direction="out"/>
- <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList&lt;int&gt;"/>
-</method>
-```
-
-A process can create more than one surface. By default, the surface with the lowest surface ID is shown on the screen. If an application wants to know all surfaces that were created by an application, this method will provide them.
-
-![getAllSurfacesOfProcess](pictures/api_getAllSurfacesOfProcess.png)
-
-### renderSurfaceToAreaAllowed
-
-Before calling renderSurfaceToArea, an application can request, if it is allowed to render the surface to this area. This makes sense for an application that would begin to allocate resources to render. But if it is not allowed to render the surface, the application could avoid allocating the resources.
-
-```
-<method name="renderSurfaceToAreaAllowed">
- <arg name="surfaceId" type="i" direction="in"/>
- <arg name="layoutArea" type="i" direction="in"/>
- <arg name="allowed" type="b" direction="out"/>
-</method>
-```
-
-The call will not affect the current setup, it will only request if it is allowed or not.
-
-![renderSurfaceToAreaAllowed](pictures/api_renderSurfaceToAreaAllowed.png)
-
-### renderSurfaceToArea
-
-By default, the HomeScreen application decides, where to render an applications surface. The concept of Layouts defines this. This API call can override the default behavior. An app can request to render a surface in a specific Layout Area.
-
-```
-<method name="renderSurfaceToArea">
- <arg name="surfaceId" type="i" direction="in"/>
- <arg name="layoutArea" type="i" direction="in"/>
-</method>
-```
-
-The surface that was previously rendered in this Layout are will be hidden.
-
-![renderSurfaceToArea](pictures/api_renderSurfaceToArea.png)
-
-The homescreen interface functionality is not fully implemented, but the API is available. For example using the libhomescreen.so.
-
-### surfaceVisibilityChanged
-
-Whenever the visibility property of a surface changes, this signal is emitted.
-
-```
-<signal name="surfaceVisibilityChanged">
- <arg name="surfaceId" type="i"/>
- <arg name="visible" type="b"/>
-</signal>
-```
-
-Visibility here means visible. The name of the signal is from the Weston surface property “visibility”.
-See here for reference: https://github.com/ntanibata/wayland-ivi-extension/blob/master/ivi-layermanagement-api/ilmCommon/include/ilm_types.h
-
-![surfaceVisibilityChanged](pictures/api_surfaceVisibilityChanged.png)
diff --git a/homescreen/docs/index.md b/homescreen/docs/index.md
deleted file mode 100644
index 4322255..0000000
--- a/homescreen/docs/index.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Welcome to your AGL system!
-When booting up an AGL system, the first thing that your eyes will spot is this:
-
-![AGL HomeScreen Application Launcher](pictures/homescreen_applauncher.png)
-
-**The AGL HomeScreen!**
-
-Intended to be used with touch presses, the reference HMI provides access to all pre-installed AGL demo applications as well as in the future access to user installed apps. The list of demo apps contains some automotive applications like HVAC-control, Navigation or Dashboard, as well as some infotainment apps. Radio, Multimedia, Phone...
-This applications are already available and were presented at CES 2017.
-
-## Here are some screenshots of the pre-installed demo applications:
-
-## HVAC
-
-![AGL HVAC](pictures/hvac.png)
-
-## Phone
-
-![AGL Phone](pictures/phone.png)
-
-## Dashboard
-
-![AGL Dashboard](pictures/dashboard.png)
-
-## Settings
-
-![AGL Settings](pictures/settings.png)
-
-#### Note:
-* All current demos (including HomeScreen) are optimized for landscape full HD resolution (1080x1920).
-
diff --git a/homescreen/docs/pictures/api_getAllSurfacesOfProcess.png b/homescreen/docs/pictures/api_getAllSurfacesOfProcess.png
deleted file mode 100644
index 5c862d7..0000000
--- a/homescreen/docs/pictures/api_getAllSurfacesOfProcess.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/api_getSurfaceStatus_1.png b/homescreen/docs/pictures/api_getSurfaceStatus_1.png
deleted file mode 100644
index 1e18fcf..0000000
--- a/homescreen/docs/pictures/api_getSurfaceStatus_1.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/api_getSurfaceStatus_2.png b/homescreen/docs/pictures/api_getSurfaceStatus_2.png
deleted file mode 100644
index e66d708..0000000
--- a/homescreen/docs/pictures/api_getSurfaceStatus_2.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/api_getSurfaceStatus_3.png b/homescreen/docs/pictures/api_getSurfaceStatus_3.png
deleted file mode 100644
index 50a3b10..0000000
--- a/homescreen/docs/pictures/api_getSurfaceStatus_3.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/api_hardKeyPressed.png b/homescreen/docs/pictures/api_hardKeyPressed.png
deleted file mode 100644
index a8a3660..0000000
--- a/homescreen/docs/pictures/api_hardKeyPressed.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/api_renderSurfaceToArea.png b/homescreen/docs/pictures/api_renderSurfaceToArea.png
deleted file mode 100644
index a61fc2f..0000000
--- a/homescreen/docs/pictures/api_renderSurfaceToArea.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/api_renderSurfaceToAreaAllowed.png b/homescreen/docs/pictures/api_renderSurfaceToAreaAllowed.png
deleted file mode 100644
index 35dbbcf..0000000
--- a/homescreen/docs/pictures/api_renderSurfaceToAreaAllowed.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/api_requestSurfaceIdToFullScreen.png b/homescreen/docs/pictures/api_requestSurfaceIdToFullScreen.png
deleted file mode 100644
index 6d2f712..0000000
--- a/homescreen/docs/pictures/api_requestSurfaceIdToFullScreen.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/api_surfaceVisibilityChanged.png b/homescreen/docs/pictures/api_surfaceVisibilityChanged.png
deleted file mode 100644
index f519757..0000000
--- a/homescreen/docs/pictures/api_surfaceVisibilityChanged.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/dashboard.png b/homescreen/docs/pictures/dashboard.png
deleted file mode 100644
index 527386d..0000000
--- a/homescreen/docs/pictures/dashboard.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/full/dashboard.png b/homescreen/docs/pictures/full/dashboard.png
deleted file mode 100644
index e947734..0000000
--- a/homescreen/docs/pictures/full/dashboard.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/full/homescreen_applauncher.png b/homescreen/docs/pictures/full/homescreen_applauncher.png
deleted file mode 100644
index b61884a..0000000
--- a/homescreen/docs/pictures/full/homescreen_applauncher.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/full/hvac.png b/homescreen/docs/pictures/full/hvac.png
deleted file mode 100644
index 7e0399a..0000000
--- a/homescreen/docs/pictures/full/hvac.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/full/phone.png b/homescreen/docs/pictures/full/phone.png
deleted file mode 100644
index f4cc547..0000000
--- a/homescreen/docs/pictures/full/phone.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/full/settings.png b/homescreen/docs/pictures/full/settings.png
deleted file mode 100644
index a115ef4..0000000
--- a/homescreen/docs/pictures/full/settings.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/homescreen_applauncher.png b/homescreen/docs/pictures/homescreen_applauncher.png
deleted file mode 100644
index e168668..0000000
--- a/homescreen/docs/pictures/homescreen_applauncher.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/hvac.png b/homescreen/docs/pictures/hvac.png
deleted file mode 100644
index f9a6030..0000000
--- a/homescreen/docs/pictures/hvac.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/phone.png b/homescreen/docs/pictures/phone.png
deleted file mode 100644
index e087594..0000000
--- a/homescreen/docs/pictures/phone.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/docs/pictures/settings.png b/homescreen/docs/pictures/settings.png
deleted file mode 100644
index c92d835..0000000
--- a/homescreen/docs/pictures/settings.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/homescreen.pro b/homescreen/homescreen.pro
deleted file mode 100644
index 8baa90d..0000000
--- a/homescreen/homescreen.pro
+++ /dev/null
@@ -1,52 +0,0 @@
-# Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
-# Copyright (c) 2017 TOYOTA MOTOR CORPORATION
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-TEMPLATE = app
-TARGET = HomeScreen
-QT = qml quick dbus websockets
-CONFIG += c++11 link_pkgconfig
-DESTDIR = $${OUT_PWD}/../package/root/bin
-PKGCONFIG += qlibwindowmanager qtappfw afb-helpers-qt
-
-LIBS += -lhomescreen
-
-include(../interfaces/interfaces.pri)
-
-SOURCES += \
- src/main.cpp \
- src/statusbarmodel.cpp \
- src/statusbarserver.cpp \
- src/applicationlauncher.cpp \
- src/mastervolume.cpp \
- src/homescreenhandler.cpp
-
-HEADERS += \
- src/statusbarmodel.h \
- src/statusbarserver.h \
- src/applicationlauncher.h \
- src/mastervolume.h \
- src/homescreenhandler.h
-
-OTHER_FILES += \
- README.md
-
-RESOURCES += \
- qml/images/MediaPlayer/mediaplayer.qrc \
- qml/images/MediaMusic/mediamusic.qrc \
- qml/images/Weather/weather.qrc \
- qml/images/Shortcut/shortcut.qrc \
- qml/images/Status/status.qrc \
- qml/images/images.qrc \
- qml/qml.qrc
diff --git a/homescreen/qml/IconItem.qml b/homescreen/qml/IconItem.qml
deleted file mode 100644
index a5c032e..0000000
--- a/homescreen/qml/IconItem.qml
+++ /dev/null
@@ -1,104 +0,0 @@
-import QtQuick 2.0
-import QtQuick.Controls 2.0
-import QtGraphicalEffects 1.0
-
-Item {
- id: main
- width: 320
- height: 320
- property string icon: model.icon
-
- Item {
- id: container
- parent: loc
- x: main.x
- y: main.y
- width: main.width
- height: main.height
-
- Image {
- id: item
- anchors.top: parent.top
- anchors.topMargin: 20
- anchors.horizontalCenter: parent.horizontalCenter
- width: 220
- height: width
- source: './images/%1_%2.svg'.arg(model.icon).arg(loc.pressed && (loc.index === model.index || loc.currentId === model.id) ? 'active' : 'inactive')
- antialiasing: item.state !== ''
-
- property string initial: model.name.substring(0,1).toUpperCase()
-
- Item {
- id: title
- width: 125
- height: 125
- anchors.centerIn: parent
- Repeater {
- delegate: Label {
- style: Text.Outline
- styleColor: 'red'
- color: 'transparent'
- font.pixelSize: 125
- anchors.centerIn: parent
- anchors.horizontalCenterOffset: model.index / 3 - 1
- anchors.verticalCenterOffset: model.index % 3 - 1
- text: item.initial
- }
- model: main.icon === 'blank' ? 9 : 0
- }
- layer.enabled: true
- layer.effect: LinearGradient {
- gradient: Gradient {
- GradientStop { position: -0.5; color: "#6BFBFF" }
- GradientStop { position: +1.5; color: "#00ADDC" }
- }
- }
- }
- }
- Label {
- id: name
- anchors.top: item.bottom
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.margins: 20
- font.pixelSize: 25
- font.letterSpacing: 5
- wrapMode: Text.WordWrap
- horizontalAlignment: Text.AlignHCenter
- color: "white"
- text: qsTr(model.name.toUpperCase())
- }
-
- Behavior on x { enabled: item.state !== 'active'; NumberAnimation { duration: 400; easing.type: Easing.OutCubic } }
- Behavior on y { enabled: item.state !== 'active'; NumberAnimation { duration: 400; easing.type: Easing.OutCubic } }
- SequentialAnimation on rotation {
- NumberAnimation { to: 5; duration: 100 }
- NumberAnimation { to: -5; duration: 200 }
- NumberAnimation { to: 0; duration: 100 }
- running: loc.currentId !== '' && item.state !== 'active'
- loops: Animation.Infinite; alwaysRunToEnd: true
- }
- states: [
- State {
- name: 'active'
- when: loc.currentId == model.id
- PropertyChanges {
- target: container
- x: loc.mouseX - width/2
- y: loc.mouseY - height/2
- scale: 1.15
- z: 10
- }
- },
- State {
- when: loc.currentId !== ''
- PropertyChanges {
- target: container
- scale: 0.85
- opacity: 0.75
- }
- }
- ]
- transitions: Transition { NumberAnimation { properties: 'scale, opacity, x, y'; duration: 150; easing.type: Easing.OutCubic} }
- }
-}
diff --git a/homescreen/qml/MediaArea.qml b/homescreen/qml/MediaArea.qml
deleted file mode 100644
index 0447589..0000000
--- a/homescreen/qml/MediaArea.qml
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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.2
-import QtQuick.Controls 2.0
-
-StackView {
- id: root
- width: 1080
- height: 215
-
- initialItem: blank
-
- Component {
- id: blank
- MediaAreaBlank {
-// MouseArea {
-// anchors.fill: parent
-// onClicked: root.push(mouse.x < 540 ? music : radio)
-// }
- }
- }
-
- Component {
- id: music
- MediaAreaMusic {
- MouseArea {
- anchors.fill: parent
- onClicked: root.pop()
- }
- }
- }
-
- Component {
- id: radio
- MediaAreaRadio {
- MouseArea {
- anchors.fill: parent
- onClicked: root.pop()
- }
- }
- }
-}
diff --git a/homescreen/qml/MediaAreaBlank.qml b/homescreen/qml/MediaAreaBlank.qml
deleted file mode 100644
index 347c26a..0000000
--- a/homescreen/qml/MediaAreaBlank.qml
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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.2
-import QtQuick.Layouts 1.1
-import QtQuick.Controls 2.0
-import AGL.Demo.Controls 1.0
-import MasterVolume 1.0
-
-Image {
- width: 1080
- height: 215
- source: './images/Utility_Logo_Background-01.svg'
- property bool displayVolume: false;
-
- MouseArea {
- anchors.fill: parent
- function enableVolumeDisplay() {
- if (!displayVolume) {
- displayVolume = true
- master_volume.visible = true
- volume_timer.restart()
- }
- }
- onClicked: enableVolumeDisplay()
- }
-
- Image {
- id: logo_image
- anchors.centerIn: parent
- source: './images/Utility_Logo_Grey-01.svg'
- }
-
- Timer {
- id: volume_timer
- interval: 5000; running: false; repeat: false
- onTriggered: displayVolume = false
- }
-
- states: [
- State { when: displayVolume;
- PropertyChanges { target: master_volume; opacity: 1.0 }
- PropertyChanges { target: slider; enabled: true }
- PropertyChanges { target: logo_image; opacity: 0.0 }
- },
- State { when: !displayVolume;
- PropertyChanges { target: master_volume; opacity: 0.0 }
- PropertyChanges { target: slider; enabled: false }
- PropertyChanges { target: logo_image; opacity: 1.0 }
- }
- ]
-
- transitions: Transition {
- NumberAnimation { property: "opacity"; duration: 500}
- }
-
- MasterVolume {
- id: mv
- objectName: "mv"
- onVolumeChanged: slider.value = volume
- Component.onCompleted: {
- mv.open(bindingAddress);
- }
- }
-
- Item {
- id: master_volume
- anchors.fill: parent
- anchors.centerIn: parent
- visible: false
-
- Label {
- font.pixelSize: 36
- anchors.horizontalCenter: parent.horizontalCenter
- color: "white"
- text: qsTr("Active Volume")
- }
-
- RowLayout {
- anchors.fill: parent
- anchors.centerIn: parent
- anchors.margins: 20
- spacing: 20
- Label {
- font.pixelSize: 36
- color: "white"
- text: "0 %"
- }
- Slider {
- id: slider
- Layout.fillWidth: true
- from: 0
- to: 100
- stepSize: 1
- snapMode: Slider.SnapOnRelease
- onValueChanged: mv.volume = value
- Component.onCompleted: value = mv.volume
- onPressedChanged: {
- if (pressed) {volume_timer.stop()}
- else {volume_timer.restart()}
- }
- }
- Label {
- font.pixelSize: 36
- color: "white"
- text: "100 %"
- }
- }
- }
-}
diff --git a/homescreen/qml/MediaAreaMusic.qml b/homescreen/qml/MediaAreaMusic.qml
deleted file mode 100644
index c0408e6..0000000
--- a/homescreen/qml/MediaAreaMusic.qml
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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.2
-import QtQuick.Layouts 1.1
-import QtQuick.Controls 2.0
-
-Image {
- width: 1080
- height: 215
- source: './images/Utility_Music_Background-01.png'
-
- ColumnLayout {
- anchors.fill: parent
- spacing: 1
- RowLayout {
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.preferredHeight: 107
- spacing: 10
- Image {
- source: './images/MediaMusic/AlbumArtwork.png'
- width: 105.298
- height: 110.179
- fillMode: Image.PreserveAspectFit
- }
- Label {
- text: 'Come Together - The Beatles'
- font.family: 'Roboto'
- font.pixelSize: 32
- color: 'white'
- }
- }
-
- RowLayout {
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.preferredHeight: 107
- Image {
- source: './images/MediaPlayer/AGL_MediaPlayer_BackArrow.png'
- }
- Image {
- source: './images/MediaPlayer/AGL_MediaPlayer_Player_Pause.png'
- }
- Image {
- source: './images/MediaPlayer/AGL_MediaPlayer_ForwardArrow.png'
- }
-
- ProgressBar {
- Layout.fillWidth: true
- Layout.preferredWidth: 2
- }
-
- Label {
- text: '2:12/4:19'
- font.family: 'Roboto'
- font.pixelSize: 20
- }
- Image {
- source: './images/MediaPlayer/AGL_MediaPlayer_Shuffle_Active.png'
- }
- Image {
- source: './images/MediaPlayer/AGL_MediaPlayer_Shuffle_Active.png'
- }
- ProgressBar {
- Layout.fillWidth: true
- Layout.preferredWidth: 1
- }
- }
- }
-}
diff --git a/homescreen/qml/MediaAreaRadio.qml b/homescreen/qml/MediaAreaRadio.qml
deleted file mode 100644
index a49f06d..0000000
--- a/homescreen/qml/MediaAreaRadio.qml
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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.2
-
-Image {
- width: 1080
- height: 215
- source: './images/Utility_Radio_Background-01.png'
-}
diff --git a/homescreen/qml/ShortcutArea.qml b/homescreen/qml/ShortcutArea.qml
deleted file mode 100644
index a8ce127..0000000
--- a/homescreen/qml/ShortcutArea.qml
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- * Copyright (c) 2017, 2018, 2019 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import QtQuick 2.2
-import QtQuick.Layouts 1.1
-
-Item {
- id: root
- width: 785
- height: 218
-
-
- ListModel {
- id: applicationModel
- ListElement {
- appid: 'launcher'
- name: 'launcher'
- application: 'launcher@0.1'
- }
- ListElement {
- appid: 'mediaplayer'
- name: 'MediaPlayer'
- application: 'mediaplayer@0.1'
- }
- ListElement {
- appid: 'hvac'
- name: 'HVAC'
- application: 'hvac@0.1'
- }
- ListElement {
- appid: 'navigation'
- name: 'Navigation'
- application: 'navigation@0.1'
- }
- }
-
- property int pid: -1
-
- RowLayout {
- anchors.fill: parent
- spacing: 2
- Repeater {
- model: applicationModel
- delegate: ShortcutIcon {
- Layout.fillWidth: true
- Layout.fillHeight: true
- name: model.name
- active: model.name === launcher.current
- onClicked: {
- homescreenHandler.tapShortcut(model.appid)
- }
- }
- }
- }
-}
diff --git a/homescreen/qml/ShortcutIcon.qml b/homescreen/qml/ShortcutIcon.qml
deleted file mode 100644
index 1100a7c..0000000
--- a/homescreen/qml/ShortcutIcon.qml
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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.2
-import QtQuick.Controls 2.0
-import QtGraphicalEffects 1.0
-
-MouseArea {
- id: root
- width: 195
- height: 216.8
- property string name: 'Home'
- property bool active: false
- Item {
- id: icon
- property real desaturation: 0
- anchors.fill: parent
- Image {
- id: inactiveIcon
- anchors.fill: parent
- source: './images/Shortcut/%1.svg'.arg(root.name.toLowerCase())
- }
- Image {
- id: activeIcon
- anchors.fill: parent
- source: './images/Shortcut/%1_active.svg'.arg(root.name.toLowerCase())
- opacity: 0.0
- }
- layer.enabled: true
- layer.effect: Desaturate {
- id: desaturate
- desaturation: icon.desaturation
- cached: true
- }
- }
- Label {
- id: name
- y: 160
- width: root.width - 10
- font.pixelSize: 15
- font.letterSpacing: 5
- // wrapMode: Text.WordWrap
- anchors.horizontalCenter: parent.horizontalCenter
- horizontalAlignment: Text.AlignHCenter
- color: "white"
- text: qsTr(model.name.toUpperCase())
- }
- states: [
- State {
- when: launcher.launching
- PropertyChanges {
- target: root
- enabled: false
- }
- PropertyChanges {
- target: icon
- desaturation: 1.0
- }
- },
- State {
- when: root.active
- PropertyChanges {
- target: inactiveIcon
- opacity: 0.0
- }
- PropertyChanges {
- target: activeIcon
- opacity: 1.0
- }
- }
- ]
-
- transitions: [
- Transition {
- NumberAnimation {
- properties: 'opacity'
- duration: 500
- easing.type: Easing.OutExpo
- }
- NumberAnimation {
- properties: 'desaturation'
- duration: 250
- }
- }
- ]
-}
diff --git a/homescreen/qml/StatusArea.qml b/homescreen/qml/StatusArea.qml
deleted file mode 100644
index d2e0930..0000000
--- a/homescreen/qml/StatusArea.qml
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- * Copyright (c) 2017, 2018 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import QtQuick 2.2
-import QtQuick.Layouts 1.1
-import HomeScreen 1.0
-
-Item {
- id: root
- width: 295
- height: 218
-
- property date now: new Date
- Timer {
- interval: 100; running: true; repeat: true;
- onTriggered: root.now = new Date
- }
-
- Connections {
- target: weather
-
- onConditionChanged: {
- var icon = ''
-
- if (condition.indexOf("clouds") != -1) {
- icon = "WeatherIcons_Cloudy-01.png"
- } else if (condition.indexOf("thunderstorm") != -1) {
- icon = "WeatherIcons_Thunderstorm-01.png"
- } else if (condition.indexOf("snow") != -1) {
- icon = "WeatherIcons_Snow-01.png"
- } else if (condition.indexOf("rain") != -1) {
- icon = "WeatherIcons_Rain-01.png"
- }
-
- condition_item.source = icon ? './images/Weather/' + icon : ''
- }
-
- onTemperatureChanged: {
- temperature_item.text = temperature.split(".")[0] + '°F'
- }
- }
-
- RowLayout {
- anchors.fill: parent
- spacing: 0
- Item {
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.preferredWidth: 295 - 76
- ColumnLayout {
- anchors.fill: parent
- anchors.margins: 40
- spacing: 0
- Text {
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: Qt.formatDate(now, 'dddd').toUpperCase()
- font.family: 'Roboto'
- font.pixelSize: 13
- color: 'white'
- verticalAlignment: Text.AlignVCenter
-// Rectangle {
-// anchors.fill: parent
-// anchors.margins: 5
-// color: 'red'
-// border.color: 'blue'
-// border.width: 1
-// z: -1
-// }
- }
- Text {
- Layout.fillWidth: true
- Layout.fillHeight: true
- text: Qt.formatTime(now, 'h:mm ap').toUpperCase()
- font.family: 'Roboto'
- font.pixelSize: 40
- color: 'white'
- horizontalAlignment: Text.AlignHCenter
- verticalAlignment: Text.AlignVCenter
- }
- RowLayout {
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.preferredHeight: 20
- Image {
- id: condition_item
- source: './images/Weather/WeatherIcons_Rain-01.png'
- }
- Text {
- id: temperature_item
- text: '64°F'
- color: 'white'
- font.family: 'Helvetica'
- font.pixelSize: 32
- }
- }
- }
- }
- ColumnLayout {
- id: icons
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.preferredWidth: 76
- spacing: -10
-
- Image {
- id: bt_icon
- Layout.preferredWidth: 77
- Layout.preferredHeight: 73
- source: connStatus ? './images/Status/HMI_Status_Bluetooth_On-01.png' : './images/Status/HMI_Status_Bluetooth_Inactive-01.png'
- fillMode: Image.PreserveAspectFit
- property string deviceName: "none"
- property bool connStatus: false
- Connections {
- target: bluetooth
-
- onPowerChanged: {
- bt_icon.connStatus = state
- }
- }
- }
- Repeater {
- model: StatusBarModel { objectName: "statusBar" }
- delegate: Image {
- Layout.preferredWidth: 77
- Layout.preferredHeight: 73
- source: model.modelData
- fillMode: Image.PreserveAspectFit
- }
- }
- }
- }
-}
diff --git a/homescreen/qml/TopArea.qml b/homescreen/qml/TopArea.qml
deleted file mode 100644
index 2a75cf8..0000000
--- a/homescreen/qml/TopArea.qml
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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.2
-import QtQuick.Layouts 1.1
-import QtQuick.Controls 2.0
-
-Image {
- width: 1920
- height: 218
- source: './images/TopSection_NoText_NoIcons-01.svg'
- fillMode: Image.PreserveAspectCrop
-
- RowLayout {
- anchors.fill: parent
- spacing: 0
- ShortcutArea {
- id: shortcutArea
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.preferredWidth: 785
- }
- StatusArea {
- id: statusArea
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.preferredWidth: 295
- }
- }
-
- Timer {
- id: launching
- interval: 500
- running: launcher.launching
- }
-
- ProgressBar {
- id: progressBar
- anchors.verticalCenter: parent.bottom
- anchors.left: parent.left
- anchors.right: parent.right
- indeterminate: visible
- visible: launcher.launching && !launching.running
- }
-}
diff --git a/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png b/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png
deleted file mode 100644
index 357c204..0000000
--- a/homescreen/qml/images/AGL_HMI_Blue_Background_NoCar-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaMusic/AlbumArtwork.png b/homescreen/qml/images/MediaMusic/AlbumArtwork.png
deleted file mode 100644
index 3716ab3..0000000
--- a/homescreen/qml/images/MediaMusic/AlbumArtwork.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaMusic/BackArrow.png b/homescreen/qml/images/MediaMusic/BackArrow.png
deleted file mode 100644
index 63e38d9..0000000
--- a/homescreen/qml/images/MediaMusic/BackArrow.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaMusic/ForwardArrow.png b/homescreen/qml/images/MediaMusic/ForwardArrow.png
deleted file mode 100644
index a513705..0000000
--- a/homescreen/qml/images/MediaMusic/ForwardArrow.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaMusic/ShuffleIcon.png b/homescreen/qml/images/MediaMusic/ShuffleIcon.png
deleted file mode 100644
index 30f75c5..0000000
--- a/homescreen/qml/images/MediaMusic/ShuffleIcon.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaMusic/Volume_Loud.png b/homescreen/qml/images/MediaMusic/Volume_Loud.png
deleted file mode 100644
index 8ea4402..0000000
--- a/homescreen/qml/images/MediaMusic/Volume_Loud.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaMusic/Volume_Medium.png b/homescreen/qml/images/MediaMusic/Volume_Medium.png
deleted file mode 100644
index ae5c82e..0000000
--- a/homescreen/qml/images/MediaMusic/Volume_Medium.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaMusic/Volume_Off.png b/homescreen/qml/images/MediaMusic/Volume_Off.png
deleted file mode 100644
index 07e3353..0000000
--- a/homescreen/qml/images/MediaMusic/Volume_Off.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaMusic/mediamusic.qrc b/homescreen/qml/images/MediaMusic/mediamusic.qrc
deleted file mode 100644
index b1138c0..0000000
--- a/homescreen/qml/images/MediaMusic/mediamusic.qrc
+++ /dev/null
@@ -1,11 +0,0 @@
-<RCC>
- <qresource prefix="/images/MediaMusic">
- <file>AlbumArtwork.png</file>
- <file>BackArrow.png</file>
- <file>ForwardArrow.png</file>
- <file>ShuffleIcon.png</file>
- <file>Volume_Loud.png</file>
- <file>Volume_Medium.png</file>
- <file>Volume_Off.png</file>
- </qresource>
-</RCC>
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_AlbumArtwork.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_AlbumArtwork.png
deleted file mode 100644
index 14a52b2..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_AlbumArtwork.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_BackArrow.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_BackArrow.png
deleted file mode 100644
index 0ec1f67..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_BackArrow.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Bluetooth_Active.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Bluetooth_Active.png
deleted file mode 100644
index bc2df1d..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Bluetooth_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Bluetooth_Inactive.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Bluetooth_Inactive.png
deleted file mode 100644
index 8d8fc02..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Bluetooth_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_CD_Active.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_CD_Active.png
deleted file mode 100644
index 94fe38f..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_CD_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_CD_Inactive.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_CD_Inactive.png
deleted file mode 100644
index 12609e1..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_CD_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_DividingLine.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_DividingLine.png
deleted file mode 100644
index 299903e..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_DividingLine.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_ForwardArrow.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_ForwardArrow.png
deleted file mode 100644
index 33cc700..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_ForwardArrow.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Loop_Active.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Loop_Active.png
deleted file mode 100644
index 9bdb14d..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Loop_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Loop_Inactive.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Loop_Inactive.png
deleted file mode 100644
index 76b0fc9..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Loop_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Player_Pause.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Player_Pause.png
deleted file mode 100644
index c423005..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Player_Pause.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Player_Play.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Player_Play.png
deleted file mode 100644
index beece66..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Player_Play.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_PlaylistToggle_Active.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_PlaylistToggle_Active.png
deleted file mode 100644
index eec608f..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_PlaylistToggle_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_PlaylistToggle_Inactive.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_PlaylistToggle_Inactive.png
deleted file mode 100644
index d392a90..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_PlaylistToggle_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Playlist_Active.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Playlist_Active.png
deleted file mode 100644
index 22319c9..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Playlist_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Playlist_Inactive.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Playlist_Inactive.png
deleted file mode 100644
index 9fd42e2..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Playlist_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Radio_Active.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Radio_Active.png
deleted file mode 100644
index eb61b39..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Radio_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Radio_Inactive.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Radio_Inactive.png
deleted file mode 100644
index de305f0..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Radio_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Shuffle_Active.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Shuffle_Active.png
deleted file mode 100644
index d97feec..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Shuffle_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Shuffle_Inactive.png b/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Shuffle_Inactive.png
deleted file mode 100644
index 7f6445d..0000000
--- a/homescreen/qml/images/MediaPlayer/AGL_MediaPlayer_Shuffle_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Albums_Active.png b/homescreen/qml/images/MediaPlayer/Albums_Active.png
deleted file mode 100644
index 1f66e23..0000000
--- a/homescreen/qml/images/MediaPlayer/Albums_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Albums_Inactive.png b/homescreen/qml/images/MediaPlayer/Albums_Inactive.png
deleted file mode 100644
index e0e7f00..0000000
--- a/homescreen/qml/images/MediaPlayer/Albums_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/DividingLine.png b/homescreen/qml/images/MediaPlayer/DividingLine.png
deleted file mode 100644
index 87f2122..0000000
--- a/homescreen/qml/images/MediaPlayer/DividingLine.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/GreenLine.png b/homescreen/qml/images/MediaPlayer/GreenLine.png
deleted file mode 100644
index 0210b83..0000000
--- a/homescreen/qml/images/MediaPlayer/GreenLine.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Music_Active.png b/homescreen/qml/images/MediaPlayer/Music_Active.png
deleted file mode 100644
index 36afac7..0000000
--- a/homescreen/qml/images/MediaPlayer/Music_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Music_Inactive.png b/homescreen/qml/images/MediaPlayer/Music_Inactive.png
deleted file mode 100644
index 9dae353..0000000
--- a/homescreen/qml/images/MediaPlayer/Music_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Podcasts_Active.png b/homescreen/qml/images/MediaPlayer/Podcasts_Active.png
deleted file mode 100644
index fd2d2c0..0000000
--- a/homescreen/qml/images/MediaPlayer/Podcasts_Active.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Podcasts_Inactive.png b/homescreen/qml/images/MediaPlayer/Podcasts_Inactive.png
deleted file mode 100644
index b76b04c..0000000
--- a/homescreen/qml/images/MediaPlayer/Podcasts_Inactive.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Popup_Highlight.png b/homescreen/qml/images/MediaPlayer/Popup_Highlight.png
deleted file mode 100644
index ac63673..0000000
--- a/homescreen/qml/images/MediaPlayer/Popup_Highlight.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Popup_PauseIcon.png b/homescreen/qml/images/MediaPlayer/Popup_PauseIcon.png
deleted file mode 100644
index 2627add..0000000
--- a/homescreen/qml/images/MediaPlayer/Popup_PauseIcon.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Popup_PlayIcon.png b/homescreen/qml/images/MediaPlayer/Popup_PlayIcon.png
deleted file mode 100644
index 0483e07..0000000
--- a/homescreen/qml/images/MediaPlayer/Popup_PlayIcon.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/Popup_VerticalLine.png b/homescreen/qml/images/MediaPlayer/Popup_VerticalLine.png
deleted file mode 100644
index 6a9db00..0000000
--- a/homescreen/qml/images/MediaPlayer/Popup_VerticalLine.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/X.png b/homescreen/qml/images/MediaPlayer/X.png
deleted file mode 100644
index ab392cb..0000000
--- a/homescreen/qml/images/MediaPlayer/X.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/MediaPlayer/mediaplayer.qrc b/homescreen/qml/images/MediaPlayer/mediaplayer.qrc
deleted file mode 100644
index 1cb17ab..0000000
--- a/homescreen/qml/images/MediaPlayer/mediaplayer.qrc
+++ /dev/null
@@ -1,37 +0,0 @@
-<RCC>
- <qresource prefix="/images/MediaPlayer">
- <file>AGL_MediaPlayer_AlbumArtwork.png</file>
- <file>AGL_MediaPlayer_BackArrow.png</file>
- <file>AGL_MediaPlayer_Bluetooth_Active.png</file>
- <file>AGL_MediaPlayer_Bluetooth_Inactive.png</file>
- <file>AGL_MediaPlayer_CD_Active.png</file>
- <file>AGL_MediaPlayer_CD_Inactive.png</file>
- <file>AGL_MediaPlayer_DividingLine.png</file>
- <file>AGL_MediaPlayer_ForwardArrow.png</file>
- <file>AGL_MediaPlayer_Loop_Active.png</file>
- <file>AGL_MediaPlayer_Loop_Inactive.png</file>
- <file>AGL_MediaPlayer_Player_Pause.png</file>
- <file>AGL_MediaPlayer_Player_Play.png</file>
- <file>AGL_MediaPlayer_Playlist_Active.png</file>
- <file>AGL_MediaPlayer_Playlist_Inactive.png</file>
- <file>AGL_MediaPlayer_PlaylistToggle_Active.png</file>
- <file>AGL_MediaPlayer_PlaylistToggle_Inactive.png</file>
- <file>AGL_MediaPlayer_Radio_Active.png</file>
- <file>AGL_MediaPlayer_Radio_Inactive.png</file>
- <file>AGL_MediaPlayer_Shuffle_Active.png</file>
- <file>AGL_MediaPlayer_Shuffle_Inactive.png</file>
- <file>Albums_Active.png</file>
- <file>Albums_Inactive.png</file>
- <file>DividingLine.png</file>
- <file>GreenLine.png</file>
- <file>Music_Active.png</file>
- <file>Music_Inactive.png</file>
- <file>Podcasts_Active.png</file>
- <file>Podcasts_Inactive.png</file>
- <file>Popup_Highlight.png</file>
- <file>Popup_PauseIcon.png</file>
- <file>Popup_PlayIcon.png</file>
- <file>Popup_VerticalLine.png</file>
- <file>X.png</file>
- </qresource>
-</RCC>
diff --git a/homescreen/qml/images/Shortcut/hvac.svg b/homescreen/qml/images/Shortcut/hvac.svg
deleted file mode 100644
index 5c76e85..0000000
--- a/homescreen/qml/images/Shortcut/hvac.svg
+++ /dev/null
@@ -1,600 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="HVAC" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8"
- style="enable-background:new 0 0 195 216.8;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#FFFFFF;}
- .st1{font-family:'Roboto-Regular';}
- .st2{font-size:11px;}
- .st3{letter-spacing:2;}
- .st4{fill:url(#SVGID_1_);}
- .st5{fill:url(#SVGID_2_);}
- .st6{fill:url(#SVGID_3_);}
- .st7{fill:url(#SVGID_4_);}
- .st8{fill:url(#SVGID_5_);}
- .st9{fill:url(#SVGID_6_);}
- .st10{fill:url(#SVGID_7_);}
- .st11{fill:url(#SVGID_8_);}
- .st12{fill:url(#SVGID_9_);}
- .st13{fill:url(#SVGID_10_);}
- .st14{fill:url(#SVGID_11_);}
- .st15{fill:url(#SVGID_12_);}
- .st16{fill:url(#SVGID_13_);}
- .st17{fill:url(#SVGID_14_);}
- .st18{fill:url(#SVGID_15_);}
- .st19{fill:url(#SVGID_16_);}
-</style>
-<switch>
- <g i:extraneous="self">
- <g>
- <g id="HVAC_Icon_2_">
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="97.4991" y1="166.6087" x2="97.4991" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st4" d="M106.2,113.4V81.3c0-4.9-3.9-8.8-8.7-8.8c-4.8,0-8.7,4-8.7,8.8v1.2H91v-1.2c0-3.7,2.9-6.6,6.5-6.6
- c3.6,0,6.5,3,6.5,6.6v33.3l0.5,0.3c3.8,2.4,6.1,6.5,6.1,11c0,7.2-5.8,13.1-13,13.1c-7.3,0-13.2-5.9-13.2-13.1
- c0-4.6,2.3-8.8,6-11.1l0.5-0.3V88.3h-2.2v25c-4.1,2.8-6.5,7.5-6.5,12.6c0,8.4,6.9,15.3,15.3,15.3c8.4,0,15.2-6.9,15.2-15.3
- C112.8,120.9,110.3,116.2,106.2,113.4z"/>
- <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="97.4991" y1="166.6087" x2="97.4991" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st5" d="M97.6,98.6c-4,0-4.4,2.4-4.4,3.5v13.7l-1.4,0.9c-3.2,2-5.2,5.5-5.2,9.3c0,6,4.9,10.9,10.9,10.9
- c2,0,4-0.6,5.8-1.6l-1.2-1.9c-1.4,0.9-3,1.3-4.6,1.3c-4.8,0-8.7-3.9-8.7-8.7c0-3,1.5-5.8,4.1-7.4l2.5-1.5v-14.9
- c0-0.4,0-1.3,2.2-1.3c2.1,0,2.1,0.6,2.1,1.2V117l2.5,1.6c2.5,1.6,4,4.4,4,7.3h2.2c0-3.7-1.9-7.2-5-9.2l-1.5-1V102
- C101.9,100.5,101.1,98.6,97.6,98.6z"/>
- <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="82.7742" y1="166.6087" x2="82.7742" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st6" points="80.1,80.1 80.1,80.1 80.2,80.1 80.2,80.1 80.2,80.1 80.2,80.1 80.3,80.1 80.3,80.1 80.3,80.1
- 80.4,80.1 80.4,80.1 80.4,80.1 80.4,80.1 80.5,80.1 80.5,80.1 80.5,80.1 80.6,80.1 80.6,80.1 80.6,80.1 80.6,80.1 80.7,80.1
- 80.7,80.1 80.7,80.1 80.8,80.1 80.8,80.1 80.8,80.1 80.8,80.1 80.9,80.1 80.9,80.1 80.9,80.1 81,80.1 81,80.1 81,80.1 81,80.1
- 81.1,80.1 81.1,80.1 81.1,80.1 81.2,80.1 81.2,80.1 81.2,80.1 81.2,80.1 81.3,80.1 81.3,80.1 81.3,80.1 81.4,80.1 81.4,80.1
- 81.4,80.1 81.4,80.1 81.5,80.1 81.5,80.1 81.5,80.1 81.6,80.1 81.6,80.1 81.6,80.1 81.6,80.1 81.7,80.1 81.7,80.1 81.7,80.1
- 81.8,80.1 81.8,80.1 81.8,80.1 81.8,80.1 81.9,80.1 81.9,80.1 81.9,80.1 82,80.1 82,80.1 82,80.1 82,80.1 82.1,80.1 82.1,80.1
- 82.1,80.1 82.1,80.1 82.2,80.1 82.2,80.1 82.2,80.1 82.3,80.1 82.3,80.1 82.3,80.1 82.3,80.1 82.4,80.1 82.4,80.1 82.4,80.1
- 82.5,80.1 82.5,80.1 82.5,80.1 82.5,80.1 82.6,80.1 82.6,80.1 82.6,80.1 82.7,80.1 82.7,80.1 82.7,80.1 82.7,80.1 82.8,80.1
- 82.8,80.1 82.8,80.1 82.9,80.1 82.9,80.1 82.9,80.1 82.9,80.1 83,80.1 83,80.1 83,80.1 83.1,80.1 83.1,80.1 83.1,80.1
- 83.1,80.1 83.2,80.1 83.2,80.1 83.2,80.1 83.3,80.1 83.3,80.1 83.3,80.1 83.3,80.1 83.4,80.1 83.4,80.1 83.4,80.1 83.5,80.1
- 83.5,80.1 83.5,80.1 83.5,80.1 83.6,80.1 83.6,80.1 83.6,80.1 83.7,80.1 83.7,80.1 83.7,80.1 83.7,80.1 83.8,80.1 83.8,80.1
- 83.8,80.1 83.9,80.1 83.9,80.1 83.9,80.1 83.9,80.1 84,80.1 84,80.1 84,80.1 84.1,80.1 84.1,80.1 84.1,80.1 84.1,80.1
- 84.2,80.1 84.2,80.1 84.2,80.1 84.3,80.1 84.3,80.1 84.3,80.1 84.3,80.1 84.4,80.1 84.4,80.1 84.4,80.1 84.5,80.1 84.5,80.1
- 84.5,80.1 84.5,80.1 84.6,80.1 84.6,80.1 84.6,80.1 84.6,80.1 84.7,80.1 84.7,80.1 84.7,80.1 84.8,80.1 84.8,80.1 84.8,80.1
- 84.8,80.1 84.9,80.1 84.9,80.1 84.9,80.1 85,80.1 85,80.1 85,80.1 85,80.1 85.1,80.1 85.1,80.1 85.1,80.1 85.2,80.1 85.2,80.1
- 85.2,80.1 85.2,80.1 85.3,80.1 85.3,80.1 85.3,80.1 85.4,80.1 85.4,80.1 85.4,80.1 85.4,80.1 85.5,80.1 85.5,80.1 85.5,78
- 85.5,78 85.4,78 85.4,78 85.4,78 85.4,78 85.3,78 85.3,78 85.3,78 85.2,78 85.2,78 85.2,78 85.2,78 85.1,78 85.1,78 85.1,78
- 85,78 85,78 85,78 85,78 84.9,78 84.9,78 84.9,78 84.8,78 84.8,78 84.8,78 84.8,78 84.7,78 84.7,78 84.7,78 84.6,78 84.6,78
- 84.6,78 84.6,78 84.5,78 84.5,78 84.5,78 84.5,78 84.4,78 84.4,78 84.4,78 84.3,78 84.3,78 84.3,78 84.3,78 84.2,78 84.2,78
- 84.2,78 84.1,78 84.1,78 84.1,78 84.1,78 84,78 84,78 84,78 83.9,78 83.9,78 83.9,78 83.9,78 83.8,78 83.8,78 83.8,78 83.7,78
- 83.7,78 83.7,78 83.7,78 83.6,78 83.6,78 83.6,78 83.5,78 83.5,78 83.5,78 83.5,78 83.4,78 83.4,78 83.4,78 83.3,78 83.3,78
- 83.3,78 83.3,78 83.2,78 83.2,78 83.2,78 83.1,78 83.1,78 83.1,78 83.1,78 83,78 83,78 83,78 82.9,78 82.9,78 82.9,78 82.9,78
- 82.8,78 82.8,78 82.8,78 82.7,78 82.7,78 82.7,78 82.7,78 82.6,78 82.6,78 82.6,78 82.5,78 82.5,78 82.5,78 82.5,78 82.4,78
- 82.4,78 82.4,78 82.3,78 82.3,78 82.3,78 82.3,78 82.2,78 82.2,78 82.2,78 82.1,78 82.1,78 82.1,78 82.1,78 82,78 82,78 82,78
- 82,78 81.9,78 81.9,78 81.9,78 81.8,78 81.8,78 81.8,78 81.8,78 81.7,78 81.7,78 81.7,78 81.6,78 81.6,78 81.6,78 81.6,78
- 81.5,78 81.5,78 81.5,78 81.4,78 81.4,78 81.4,78 81.4,78 81.3,78 81.3,78 81.3,78 81.2,78 81.2,78 81.2,78 81.2,78 81.1,78
- 81.1,78 81.1,78 81,78 81,78 81,78 81,78 80.9,78 80.9,78 80.9,78 80.8,78 80.8,78 80.8,78 80.8,78 80.7,78 80.7,78 80.7,78
- 80.6,78 80.6,78 80.6,78 80.6,78 80.5,78 80.5,78 80.5,78 80.4,78 80.4,78 80.4,78 80.4,78 80.3,78 80.3,78 80.3,78 80.2,78
- 80.2,78 80.2,78 80.2,78 80.1,78 80.1,78 80.1,78 80,78 80,80.1 80.1,80.1 "/>
- <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="83.865" y1="166.6087" x2="83.865" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st7" points="85.4,83.5 85.4,83.5 85.4,83.5 85.4,83.5 85.4,83.5 85.4,83.5 85.3,83.5 85.3,83.5 85.3,83.5
- 85.3,83.5 85.3,83.5 85.3,83.5 85.2,83.5 85.2,83.5 85.2,83.5 85.2,83.5 85.2,83.5 85.2,83.5 85.1,83.5 85.1,83.5 85.1,83.5
- 85.1,83.5 85.1,83.5 85.1,83.5 85,83.5 85,83.5 85,83.5 85,83.5 85,83.5 85,83.5 84.9,83.5 84.9,83.5 84.9,83.5 84.9,83.5
- 84.9,83.5 84.9,83.5 84.8,83.5 84.8,83.5 84.8,83.5 84.8,83.5 84.8,83.5 84.8,83.5 84.7,83.5 84.7,83.5 84.7,83.5 84.7,83.5
- 84.7,83.5 84.6,83.5 84.6,83.5 84.6,83.5 84.6,83.5 84.6,83.5 84.6,83.5 84.5,83.5 84.5,83.5 84.5,83.5 84.5,83.5 84.5,83.5
- 84.5,83.5 84.4,83.5 84.4,83.5 84.4,83.5 84.4,83.5 84.4,83.5 84.4,83.5 84.3,83.5 84.3,83.5 84.3,83.5 84.3,83.5 84.3,83.5
- 84.3,83.5 84.2,83.5 84.2,83.5 84.2,83.5 84.2,83.5 84.2,83.5 84.2,83.5 84.1,83.5 84.1,83.5 84.1,83.5 84.1,83.5 84.1,83.5
- 84.1,83.5 84,83.5 84,83.5 84,83.5 84,83.5 84,83.5 84,83.5 83.9,83.5 83.9,83.5 83.9,83.5 83.9,83.5 83.9,83.5 83.8,83.5
- 83.8,83.5 83.8,83.5 83.8,83.5 83.8,83.5 83.8,83.5 83.7,83.5 83.7,83.5 83.7,83.5 83.7,83.5 83.7,83.5 83.7,83.5 83.6,83.5
- 83.6,83.5 83.6,83.5 83.6,83.5 83.6,83.5 83.6,83.5 83.5,83.5 83.5,83.5 83.5,83.5 83.5,83.5 83.5,83.5 83.5,83.5 83.4,83.5
- 83.4,83.5 83.4,83.5 83.4,83.5 83.4,83.5 83.4,83.5 83.3,83.5 83.3,83.5 83.3,83.5 83.3,83.5 83.3,83.5 83.3,83.5 83.2,83.5
- 83.2,83.5 83.2,83.5 83.2,83.5 83.2,83.5 83.1,83.5 83.1,83.5 83.1,83.5 83.1,83.5 83.1,83.5 83.1,83.5 83,83.5 83,83.5
- 83,83.5 83,83.5 83,83.5 83,83.5 82.9,83.5 82.9,83.5 82.9,83.5 82.9,83.5 82.9,83.5 82.9,83.5 82.8,83.5 82.8,83.5 82.8,83.5
- 82.8,83.5 82.8,83.5 82.8,83.5 82.7,83.5 82.7,83.5 82.7,83.5 82.7,83.5 82.7,83.5 82.7,83.5 82.6,83.5 82.6,83.5 82.6,83.5
- 82.6,83.5 82.6,83.5 82.6,83.5 82.5,83.5 82.5,83.5 82.5,83.5 82.5,83.5 82.5,83.5 82.5,83.5 82.4,83.5 82.4,83.5 82.4,83.5
- 82.4,83.5 82.4,83.5 82.3,83.5 82.3,83.5 82.3,83.5 82.3,83.5 82.3,83.5 82.3,83.5 82.2,83.5 82.2,83.5 82.2,85.5 82.2,85.5
- 82.3,85.5 82.3,85.5 82.3,85.5 82.3,85.5 82.3,85.5 82.3,85.5 82.4,85.5 82.4,85.5 82.4,85.5 82.4,85.5 82.4,85.5 82.5,85.5
- 82.5,85.5 82.5,85.5 82.5,85.5 82.5,85.5 82.5,85.5 82.6,85.5 82.6,85.5 82.6,85.5 82.6,85.5 82.6,85.5 82.6,85.5 82.7,85.5
- 82.7,85.5 82.7,85.5 82.7,85.5 82.7,85.5 82.7,85.5 82.8,85.5 82.8,85.5 82.8,85.5 82.8,85.5 82.8,85.5 82.8,85.5 82.9,85.5
- 82.9,85.5 82.9,85.5 82.9,85.5 82.9,85.5 82.9,85.5 83,85.5 83,85.5 83,85.5 83,85.5 83,85.5 83,85.5 83.1,85.5 83.1,85.5
- 83.1,85.5 83.1,85.5 83.1,85.5 83.1,85.5 83.2,85.5 83.2,85.5 83.2,85.5 83.2,85.5 83.2,85.5 83.3,85.5 83.3,85.5 83.3,85.5
- 83.3,85.5 83.3,85.5 83.3,85.5 83.4,85.5 83.4,85.5 83.4,85.5 83.4,85.5 83.4,85.5 83.4,85.5 83.5,85.5 83.5,85.5 83.5,85.5
- 83.5,85.5 83.5,85.5 83.5,85.5 83.6,85.5 83.6,85.5 83.6,85.5 83.6,85.5 83.6,85.5 83.6,85.5 83.7,85.5 83.7,85.5 83.7,85.5
- 83.7,85.5 83.7,85.5 83.7,85.5 83.8,85.5 83.8,85.5 83.8,85.5 83.8,85.5 83.8,85.5 83.8,85.5 83.9,85.5 83.9,85.5 83.9,85.5
- 83.9,85.5 83.9,85.5 84,85.5 84,85.5 84,85.5 84,85.5 84,85.5 84,85.5 84.1,85.5 84.1,85.5 84.1,85.5 84.1,85.5 84.1,85.5
- 84.1,85.5 84.2,85.5 84.2,85.5 84.2,85.5 84.2,85.5 84.2,85.5 84.2,85.5 84.3,85.5 84.3,85.5 84.3,85.5 84.3,85.5 84.3,85.5
- 84.3,85.5 84.4,85.5 84.4,85.5 84.4,85.5 84.4,85.5 84.4,85.5 84.4,85.5 84.5,85.5 84.5,85.5 84.5,85.5 84.5,85.5 84.5,85.5
- 84.5,85.5 84.6,85.5 84.6,85.5 84.6,85.5 84.6,85.5 84.6,85.5 84.6,85.5 84.7,85.5 84.7,85.5 84.7,85.5 84.7,85.5 84.7,85.5
- 84.8,85.5 84.8,85.5 84.8,85.5 84.8,85.5 84.8,85.5 84.8,85.5 84.9,85.5 84.9,85.5 84.9,85.5 84.9,85.5 84.9,85.5 84.9,85.5
- 85,85.5 85,85.5 85,85.5 85,85.5 85,85.5 85,85.5 85.1,85.5 85.1,85.5 85.1,85.5 85.1,85.5 85.1,85.5 85.1,85.5 85.2,85.5
- 85.2,85.5 85.2,85.5 85.2,85.5 85.2,85.5 85.2,85.5 85.3,85.5 85.3,85.5 85.3,85.5 85.3,85.5 85.3,85.5 85.3,85.5 85.4,85.5
- 85.4,85.5 85.4,85.5 85.4,85.5 85.4,85.5 85.4,85.5 85.5,85.5 85.5,85.5 85.5,85.5 85.5,83.5 85.5,83.5 85.5,83.5 "/>
- <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="82.7742" y1="166.6087" x2="82.7742" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st8" points="80.1,91 80.1,91 80.2,91 80.2,91 80.2,91 80.2,91 80.3,91 80.3,91 80.3,91 80.4,91 80.4,91
- 80.4,91 80.4,91 80.5,91 80.5,91 80.5,91 80.6,91 80.6,91 80.6,91 80.6,91 80.7,91 80.7,91 80.7,91 80.8,91 80.8,91 80.8,91
- 80.8,91 80.9,91 80.9,91 80.9,91 81,91 81,91 81,91 81,91 81.1,91 81.1,91 81.1,91 81.2,91 81.2,91 81.2,91 81.2,91 81.3,91
- 81.3,91 81.3,91 81.4,91 81.4,91 81.4,91 81.4,91 81.5,91 81.5,91 81.5,91 81.6,91 81.6,91 81.6,91 81.6,91 81.7,91 81.7,91
- 81.7,91 81.8,91 81.8,91 81.8,91 81.8,91 81.9,91 81.9,91 81.9,91 82,91 82,91 82,91 82,91 82.1,91 82.1,91 82.1,91 82.1,91
- 82.2,91 82.2,91 82.2,91 82.3,91 82.3,91 82.3,91 82.3,91 82.4,91 82.4,91 82.4,91 82.5,91 82.5,91 82.5,91 82.5,91 82.6,91
- 82.6,91 82.6,91 82.7,91 82.7,91 82.7,91 82.7,91 82.8,91 82.8,91 82.8,91 82.9,91 82.9,91 82.9,91 82.9,91 83,91 83,91 83,91
- 83.1,91 83.1,91 83.1,91 83.1,91 83.2,91 83.2,91 83.2,91 83.3,91 83.3,91 83.3,91 83.3,91 83.4,91 83.4,91 83.4,91 83.5,91
- 83.5,91 83.5,91 83.5,91 83.6,91 83.6,91 83.6,91 83.7,91 83.7,91 83.7,91 83.7,91 83.8,91 83.8,91 83.8,91 83.9,91 83.9,91
- 83.9,91 83.9,91 84,91 84,91 84,91 84.1,91 84.1,91 84.1,91 84.1,91 84.2,91 84.2,91 84.2,91 84.3,91 84.3,91 84.3,91 84.3,91
- 84.4,91 84.4,91 84.4,91 84.5,91 84.5,91 84.5,91 84.5,91 84.6,91 84.6,91 84.6,91 84.6,91 84.7,91 84.7,91 84.7,91 84.8,91
- 84.8,91 84.8,91 84.8,91 84.9,91 84.9,91 84.9,91 85,91 85,91 85,91 85,91 85.1,91 85.1,91 85.1,91 85.2,91 85.2,91 85.2,91
- 85.2,91 85.3,91 85.3,91 85.3,91 85.4,91 85.4,91 85.4,91 85.4,91 85.5,91 85.5,91 85.5,88.9 85.5,88.9 85.4,88.9 85.4,88.9
- 85.4,88.9 85.4,88.9 85.3,88.9 85.3,88.9 85.3,88.9 85.2,88.9 85.2,88.9 85.2,88.9 85.2,88.9 85.1,88.9 85.1,88.9 85.1,88.9
- 85,88.9 85,88.9 85,88.9 85,88.9 84.9,88.9 84.9,88.9 84.9,88.9 84.8,88.9 84.8,88.9 84.8,88.9 84.8,88.9 84.7,88.9 84.7,88.9
- 84.7,88.9 84.6,88.9 84.6,88.9 84.6,88.9 84.6,88.9 84.5,88.9 84.5,88.9 84.5,88.9 84.5,88.9 84.4,88.9 84.4,88.9 84.4,88.9
- 84.3,88.9 84.3,88.9 84.3,88.9 84.3,88.9 84.2,88.9 84.2,88.9 84.2,88.9 84.1,88.9 84.1,88.9 84.1,88.9 84.1,88.9 84,88.9
- 84,88.9 84,88.9 83.9,88.9 83.9,88.9 83.9,88.9 83.9,88.9 83.8,88.9 83.8,88.9 83.8,88.9 83.7,88.9 83.7,88.9 83.7,88.9
- 83.7,88.9 83.6,88.9 83.6,88.9 83.6,88.9 83.5,88.9 83.5,88.9 83.5,88.9 83.5,88.9 83.4,88.9 83.4,88.9 83.4,88.9 83.3,88.9
- 83.3,88.9 83.3,88.9 83.3,88.9 83.2,88.9 83.2,88.9 83.2,88.9 83.1,88.9 83.1,88.9 83.1,88.9 83.1,88.9 83,88.9 83,88.9
- 83,88.9 82.9,88.9 82.9,88.9 82.9,88.9 82.9,88.9 82.8,88.9 82.8,88.9 82.8,88.9 82.7,88.9 82.7,88.9 82.7,88.9 82.7,88.9
- 82.6,88.9 82.6,88.9 82.6,88.9 82.5,88.9 82.5,88.9 82.5,88.9 82.5,88.9 82.4,88.9 82.4,88.9 82.4,88.9 82.3,88.9 82.3,88.9
- 82.3,88.9 82.3,88.9 82.2,88.9 82.2,88.9 82.2,88.9 82.1,88.9 82.1,88.9 82.1,88.9 82.1,88.9 82,88.9 82,88.9 82,88.9 82,88.9
- 81.9,88.9 81.9,88.9 81.9,88.9 81.8,88.9 81.8,88.9 81.8,88.9 81.8,88.9 81.7,88.9 81.7,88.9 81.7,88.9 81.6,88.9 81.6,88.9
- 81.6,88.9 81.6,88.9 81.5,88.9 81.5,88.9 81.5,88.9 81.4,88.9 81.4,88.9 81.4,88.9 81.4,88.9 81.3,88.9 81.3,88.9 81.3,88.9
- 81.2,88.9 81.2,88.9 81.2,88.9 81.2,88.9 81.1,88.9 81.1,88.9 81.1,88.9 81,88.9 81,88.9 81,88.9 81,88.9 80.9,88.9 80.9,88.9
- 80.9,88.9 80.8,88.9 80.8,88.9 80.8,88.9 80.8,88.9 80.7,88.9 80.7,88.9 80.7,88.9 80.6,88.9 80.6,88.9 80.6,88.9 80.6,88.9
- 80.5,88.9 80.5,88.9 80.5,88.9 80.4,88.9 80.4,88.9 80.4,88.9 80.4,88.9 80.3,88.9 80.3,88.9 80.3,88.9 80.2,88.9 80.2,88.9
- 80.2,88.9 80.2,88.9 80.1,88.9 80.1,88.9 80.1,88.9 80,88.9 80,91 80.1,91 "/>
- <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="83.865" y1="166.6087" x2="83.865" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st9" points="85.4,94.4 85.4,94.4 85.4,94.4 85.4,94.4 85.4,94.4 85.4,94.4 85.3,94.4 85.3,94.4 85.3,94.4
- 85.3,94.4 85.3,94.4 85.3,94.4 85.2,94.4 85.2,94.4 85.2,94.4 85.2,94.4 85.2,94.4 85.2,94.4 85.1,94.4 85.1,94.4 85.1,94.4
- 85.1,94.4 85.1,94.4 85.1,94.4 85,94.4 85,94.4 85,94.4 85,94.4 85,94.4 85,94.4 84.9,94.4 84.9,94.4 84.9,94.4 84.9,94.4
- 84.9,94.4 84.9,94.4 84.8,94.4 84.8,94.4 84.8,94.4 84.8,94.4 84.8,94.4 84.8,94.4 84.7,94.4 84.7,94.4 84.7,94.4 84.7,94.4
- 84.7,94.4 84.6,94.4 84.6,94.4 84.6,94.4 84.6,94.4 84.6,94.4 84.6,94.4 84.5,94.4 84.5,94.4 84.5,94.4 84.5,94.4 84.5,94.4
- 84.5,94.4 84.4,94.4 84.4,94.4 84.4,94.4 84.4,94.4 84.4,94.4 84.4,94.4 84.3,94.4 84.3,94.4 84.3,94.4 84.3,94.4 84.3,94.4
- 84.3,94.4 84.2,94.4 84.2,94.4 84.2,94.4 84.2,94.4 84.2,94.4 84.2,94.4 84.1,94.4 84.1,94.4 84.1,94.4 84.1,94.4 84.1,94.4
- 84.1,94.4 84,94.4 84,94.4 84,94.4 84,94.4 84,94.4 84,94.4 83.9,94.4 83.9,94.4 83.9,94.4 83.9,94.4 83.9,94.4 83.8,94.4
- 83.8,94.4 83.8,94.4 83.8,94.4 83.8,94.4 83.8,94.4 83.7,94.4 83.7,94.4 83.7,94.4 83.7,94.4 83.7,94.4 83.7,94.4 83.6,94.4
- 83.6,94.4 83.6,94.4 83.6,94.4 83.6,94.4 83.6,94.4 83.5,94.4 83.5,94.4 83.5,94.4 83.5,94.4 83.5,94.4 83.5,94.4 83.4,94.4
- 83.4,94.4 83.4,94.4 83.4,94.4 83.4,94.4 83.4,94.4 83.3,94.4 83.3,94.4 83.3,94.4 83.3,94.4 83.3,94.4 83.3,94.4 83.2,94.4
- 83.2,94.4 83.2,94.4 83.2,94.4 83.2,94.4 83.1,94.4 83.1,94.4 83.1,94.4 83.1,94.4 83.1,94.4 83.1,94.4 83,94.4 83,94.4
- 83,94.4 83,94.4 83,94.4 83,94.4 82.9,94.4 82.9,94.4 82.9,94.4 82.9,94.4 82.9,94.4 82.9,94.4 82.8,94.4 82.8,94.4 82.8,94.4
- 82.8,94.4 82.8,94.4 82.8,94.4 82.7,94.4 82.7,94.4 82.7,94.4 82.7,94.4 82.7,94.4 82.7,94.4 82.6,94.4 82.6,94.4 82.6,94.4
- 82.6,94.4 82.6,94.4 82.6,94.4 82.5,94.4 82.5,94.4 82.5,94.4 82.5,94.4 82.5,94.4 82.5,94.4 82.4,94.4 82.4,94.4 82.4,94.4
- 82.4,94.4 82.4,94.4 82.3,94.4 82.3,94.4 82.3,94.4 82.3,94.4 82.3,94.4 82.3,94.4 82.2,94.4 82.2,94.4 82.2,96.5 82.2,96.5
- 82.3,96.5 82.3,96.5 82.3,96.5 82.3,96.5 82.3,96.5 82.3,96.5 82.4,96.5 82.4,96.5 82.4,96.5 82.4,96.5 82.4,96.5 82.5,96.5
- 82.5,96.5 82.5,96.5 82.5,96.5 82.5,96.5 82.5,96.5 82.6,96.5 82.6,96.5 82.6,96.5 82.6,96.5 82.6,96.5 82.6,96.5 82.7,96.5
- 82.7,96.5 82.7,96.5 82.7,96.5 82.7,96.5 82.7,96.5 82.8,96.5 82.8,96.5 82.8,96.5 82.8,96.5 82.8,96.5 82.8,96.5 82.9,96.5
- 82.9,96.5 82.9,96.5 82.9,96.5 82.9,96.5 82.9,96.5 83,96.5 83,96.5 83,96.5 83,96.5 83,96.5 83,96.5 83.1,96.5 83.1,96.5
- 83.1,96.5 83.1,96.5 83.1,96.5 83.1,96.5 83.2,96.5 83.2,96.5 83.2,96.5 83.2,96.5 83.2,96.5 83.3,96.5 83.3,96.5 83.3,96.5
- 83.3,96.5 83.3,96.5 83.3,96.5 83.4,96.5 83.4,96.5 83.4,96.5 83.4,96.5 83.4,96.5 83.4,96.5 83.5,96.5 83.5,96.5 83.5,96.5
- 83.5,96.5 83.5,96.5 83.5,96.5 83.6,96.5 83.6,96.5 83.6,96.5 83.6,96.5 83.6,96.5 83.6,96.5 83.7,96.5 83.7,96.5 83.7,96.5
- 83.7,96.5 83.7,96.5 83.7,96.5 83.8,96.5 83.8,96.5 83.8,96.5 83.8,96.5 83.8,96.5 83.8,96.5 83.9,96.5 83.9,96.5 83.9,96.5
- 83.9,96.5 83.9,96.5 84,96.5 84,96.5 84,96.5 84,96.5 84,96.5 84,96.5 84.1,96.5 84.1,96.5 84.1,96.5 84.1,96.5 84.1,96.5
- 84.1,96.5 84.2,96.5 84.2,96.5 84.2,96.5 84.2,96.5 84.2,96.5 84.2,96.5 84.3,96.5 84.3,96.5 84.3,96.5 84.3,96.5 84.3,96.5
- 84.3,96.5 84.4,96.5 84.4,96.5 84.4,96.5 84.4,96.5 84.4,96.5 84.4,96.5 84.5,96.5 84.5,96.5 84.5,96.5 84.5,96.5 84.5,96.5
- 84.5,96.5 84.6,96.5 84.6,96.5 84.6,96.5 84.6,96.5 84.6,96.5 84.6,96.5 84.7,96.5 84.7,96.5 84.7,96.5 84.7,96.5 84.7,96.5
- 84.8,96.5 84.8,96.5 84.8,96.5 84.8,96.5 84.8,96.5 84.8,96.5 84.9,96.5 84.9,96.5 84.9,96.5 84.9,96.5 84.9,96.5 84.9,96.5
- 85,96.5 85,96.5 85,96.5 85,96.5 85,96.5 85,96.5 85.1,96.5 85.1,96.5 85.1,96.5 85.1,96.5 85.1,96.5 85.1,96.5 85.2,96.5
- 85.2,96.5 85.2,96.5 85.2,96.5 85.2,96.5 85.2,96.5 85.3,96.5 85.3,96.5 85.3,96.5 85.3,96.5 85.3,96.5 85.3,96.5 85.4,96.5
- 85.4,96.5 85.4,96.5 85.4,96.5 85.4,96.5 85.4,96.5 85.5,96.5 85.5,96.5 85.5,96.5 85.5,94.4 85.5,94.4 85.5,94.4 "/>
- <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="82.7742" y1="166.6087" x2="82.7742" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st10" points="80.1,101.9 80.1,101.9 80.2,101.9 80.2,101.9 80.2,101.9 80.2,101.9 80.3,101.9 80.3,101.9
- 80.3,101.9 80.4,101.9 80.4,101.9 80.4,101.9 80.4,101.9 80.5,101.9 80.5,101.9 80.5,101.9 80.6,101.9 80.6,101.9 80.6,101.9
- 80.6,101.9 80.7,101.9 80.7,101.9 80.7,101.9 80.8,101.9 80.8,101.9 80.8,101.9 80.8,101.9 80.9,101.9 80.9,101.9 80.9,101.9
- 81,101.9 81,101.9 81,101.9 81,101.9 81.1,101.9 81.1,101.9 81.1,101.9 81.2,101.9 81.2,101.9 81.2,101.9 81.2,101.9
- 81.3,101.9 81.3,101.9 81.3,101.9 81.4,101.9 81.4,101.9 81.4,101.9 81.4,101.9 81.5,101.9 81.5,101.9 81.5,101.9 81.6,101.9
- 81.6,101.9 81.6,101.9 81.6,101.9 81.7,101.9 81.7,101.9 81.7,101.9 81.8,101.9 81.8,101.9 81.8,101.9 81.8,101.9 81.9,101.9
- 81.9,101.9 81.9,101.9 82,101.9 82,101.9 82,101.9 82,101.9 82.1,101.9 82.1,101.9 82.1,101.9 82.1,101.9 82.2,101.9
- 82.2,101.9 82.2,101.9 82.3,101.9 82.3,101.9 82.3,101.9 82.3,101.9 82.4,101.9 82.4,101.9 82.4,101.9 82.5,101.9 82.5,101.9
- 82.5,101.9 82.5,101.9 82.6,101.9 82.6,101.9 82.6,101.9 82.7,101.9 82.7,101.9 82.7,101.9 82.7,101.9 82.8,101.9 82.8,101.9
- 82.8,101.9 82.9,101.9 82.9,101.9 82.9,101.9 82.9,101.9 83,101.9 83,101.9 83,101.9 83.1,101.9 83.1,101.9 83.1,101.9
- 83.1,101.9 83.2,101.9 83.2,101.9 83.2,101.9 83.3,101.9 83.3,101.9 83.3,101.9 83.3,101.9 83.4,101.9 83.4,101.9 83.4,101.9
- 83.5,101.9 83.5,101.9 83.5,101.9 83.5,101.9 83.6,101.9 83.6,101.9 83.6,101.9 83.7,101.9 83.7,101.9 83.7,101.9 83.7,101.9
- 83.8,101.9 83.8,101.9 83.8,101.9 83.9,101.9 83.9,101.9 83.9,101.9 83.9,101.9 84,101.9 84,101.9 84,101.9 84.1,101.9
- 84.1,101.9 84.1,101.9 84.1,101.9 84.2,101.9 84.2,101.9 84.2,101.9 84.3,101.9 84.3,101.9 84.3,101.9 84.3,101.9 84.4,101.9
- 84.4,101.9 84.4,101.9 84.5,101.9 84.5,101.9 84.5,101.9 84.5,101.9 84.6,101.9 84.6,101.9 84.6,101.9 84.6,101.9 84.7,101.9
- 84.7,101.9 84.7,101.9 84.8,101.9 84.8,101.9 84.8,101.9 84.8,101.9 84.9,101.9 84.9,101.9 84.9,101.9 85,101.9 85,101.9
- 85,101.9 85,101.9 85.1,101.9 85.1,101.9 85.1,101.9 85.2,101.9 85.2,101.9 85.2,101.9 85.2,101.9 85.3,101.9 85.3,101.9
- 85.3,101.9 85.4,101.9 85.4,101.9 85.4,101.9 85.4,101.9 85.5,101.9 85.5,101.9 85.5,99.8 85.5,99.8 85.4,99.8 85.4,99.8
- 85.4,99.8 85.4,99.8 85.3,99.8 85.3,99.8 85.3,99.8 85.2,99.8 85.2,99.8 85.2,99.8 85.2,99.8 85.1,99.8 85.1,99.8 85.1,99.8
- 85,99.8 85,99.8 85,99.8 85,99.8 84.9,99.8 84.9,99.8 84.9,99.8 84.8,99.8 84.8,99.8 84.8,99.8 84.8,99.8 84.7,99.8 84.7,99.8
- 84.7,99.8 84.6,99.8 84.6,99.8 84.6,99.8 84.6,99.8 84.5,99.8 84.5,99.8 84.5,99.8 84.5,99.8 84.4,99.8 84.4,99.8 84.4,99.8
- 84.3,99.8 84.3,99.8 84.3,99.8 84.3,99.8 84.2,99.8 84.2,99.8 84.2,99.8 84.1,99.8 84.1,99.8 84.1,99.8 84.1,99.8 84,99.8
- 84,99.8 84,99.8 83.9,99.8 83.9,99.8 83.9,99.8 83.9,99.8 83.8,99.8 83.8,99.8 83.8,99.8 83.7,99.8 83.7,99.8 83.7,99.8
- 83.7,99.8 83.6,99.8 83.6,99.8 83.6,99.8 83.5,99.8 83.5,99.8 83.5,99.8 83.5,99.8 83.4,99.8 83.4,99.8 83.4,99.8 83.3,99.8
- 83.3,99.8 83.3,99.8 83.3,99.8 83.2,99.8 83.2,99.8 83.2,99.8 83.1,99.8 83.1,99.8 83.1,99.8 83.1,99.8 83,99.8 83,99.8
- 83,99.8 82.9,99.8 82.9,99.8 82.9,99.8 82.9,99.8 82.8,99.8 82.8,99.8 82.8,99.8 82.7,99.8 82.7,99.8 82.7,99.8 82.7,99.8
- 82.6,99.8 82.6,99.8 82.6,99.8 82.5,99.8 82.5,99.8 82.5,99.8 82.5,99.8 82.4,99.8 82.4,99.8 82.4,99.8 82.3,99.8 82.3,99.8
- 82.3,99.8 82.3,99.8 82.2,99.8 82.2,99.8 82.2,99.8 82.1,99.8 82.1,99.8 82.1,99.8 82.1,99.8 82,99.8 82,99.8 82,99.8 82,99.8
- 81.9,99.8 81.9,99.8 81.9,99.8 81.8,99.8 81.8,99.8 81.8,99.8 81.8,99.8 81.7,99.8 81.7,99.8 81.7,99.8 81.6,99.8 81.6,99.8
- 81.6,99.8 81.6,99.8 81.5,99.8 81.5,99.8 81.5,99.8 81.4,99.8 81.4,99.8 81.4,99.8 81.4,99.8 81.3,99.8 81.3,99.8 81.3,99.8
- 81.2,99.8 81.2,99.8 81.2,99.8 81.2,99.8 81.1,99.8 81.1,99.8 81.1,99.8 81,99.8 81,99.8 81,99.8 81,99.8 80.9,99.8 80.9,99.8
- 80.9,99.8 80.8,99.8 80.8,99.8 80.8,99.8 80.8,99.8 80.7,99.8 80.7,99.8 80.7,99.8 80.6,99.8 80.6,99.8 80.6,99.8 80.6,99.8
- 80.5,99.8 80.5,99.8 80.5,99.8 80.4,99.8 80.4,99.8 80.4,99.8 80.4,99.8 80.3,99.8 80.3,99.8 80.3,99.8 80.2,99.8 80.2,99.8
- 80.2,99.8 80.2,99.8 80.1,99.8 80.1,99.8 80.1,99.8 80,99.8 80,101.9 80.1,101.9 "/>
- <linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="83.865" y1="166.6087" x2="83.865" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st11" points="85.4,105.3 85.4,105.3 85.4,105.3 85.4,105.3 85.4,105.3 85.4,105.3 85.3,105.3 85.3,105.3
- 85.3,105.3 85.3,105.3 85.3,105.3 85.3,105.3 85.2,105.3 85.2,105.3 85.2,105.3 85.2,105.3 85.2,105.3 85.2,105.3 85.1,105.3
- 85.1,105.3 85.1,105.3 85.1,105.3 85.1,105.3 85.1,105.3 85,105.3 85,105.3 85,105.3 85,105.3 85,105.3 85,105.3 84.9,105.3
- 84.9,105.3 84.9,105.3 84.9,105.3 84.9,105.3 84.9,105.3 84.8,105.3 84.8,105.3 84.8,105.3 84.8,105.3 84.8,105.3 84.8,105.3
- 84.7,105.3 84.7,105.3 84.7,105.3 84.7,105.3 84.7,105.3 84.6,105.3 84.6,105.3 84.6,105.3 84.6,105.3 84.6,105.3 84.6,105.3
- 84.5,105.3 84.5,105.3 84.5,105.3 84.5,105.3 84.5,105.3 84.5,105.3 84.4,105.3 84.4,105.3 84.4,105.3 84.4,105.3 84.4,105.3
- 84.4,105.3 84.3,105.3 84.3,105.3 84.3,105.3 84.3,105.3 84.3,105.3 84.3,105.3 84.2,105.3 84.2,105.3 84.2,105.3 84.2,105.3
- 84.2,105.3 84.2,105.3 84.1,105.3 84.1,105.3 84.1,105.3 84.1,105.3 84.1,105.3 84.1,105.3 84,105.3 84,105.3 84,105.3
- 84,105.3 84,105.3 84,105.3 83.9,105.3 83.9,105.3 83.9,105.3 83.9,105.3 83.9,105.3 83.8,105.3 83.8,105.3 83.8,105.3
- 83.8,105.3 83.8,105.3 83.8,105.3 83.7,105.3 83.7,105.3 83.7,105.3 83.7,105.3 83.7,105.3 83.7,105.3 83.6,105.3 83.6,105.3
- 83.6,105.3 83.6,105.3 83.6,105.3 83.6,105.3 83.5,105.3 83.5,105.3 83.5,105.3 83.5,105.3 83.5,105.3 83.5,105.3 83.4,105.3
- 83.4,105.3 83.4,105.3 83.4,105.3 83.4,105.3 83.4,105.3 83.3,105.3 83.3,105.3 83.3,105.3 83.3,105.3 83.3,105.3 83.3,105.3
- 83.2,105.3 83.2,105.3 83.2,105.3 83.2,105.3 83.2,105.3 83.1,105.3 83.1,105.3 83.1,105.3 83.1,105.3 83.1,105.3 83.1,105.3
- 83,105.3 83,105.3 83,105.3 83,105.3 83,105.3 83,105.3 82.9,105.3 82.9,105.3 82.9,105.3 82.9,105.3 82.9,105.3 82.9,105.3
- 82.8,105.3 82.8,105.3 82.8,105.3 82.8,105.3 82.8,105.3 82.8,105.3 82.7,105.3 82.7,105.3 82.7,105.3 82.7,105.3 82.7,105.3
- 82.7,105.3 82.6,105.3 82.6,105.3 82.6,105.3 82.6,105.3 82.6,105.3 82.6,105.3 82.5,105.3 82.5,105.3 82.5,105.3 82.5,105.3
- 82.5,105.3 82.5,105.3 82.4,105.3 82.4,105.3 82.4,105.3 82.4,105.3 82.4,105.3 82.3,105.3 82.3,105.3 82.3,105.3 82.3,105.3
- 82.3,105.3 82.3,105.3 82.2,105.3 82.2,105.3 82.2,107.4 82.2,107.4 82.3,107.4 82.3,107.4 82.3,107.4 82.3,107.4 82.3,107.4
- 82.3,107.4 82.4,107.4 82.4,107.4 82.4,107.4 82.4,107.4 82.4,107.4 82.5,107.4 82.5,107.4 82.5,107.4 82.5,107.4 82.5,107.4
- 82.5,107.4 82.6,107.4 82.6,107.4 82.6,107.4 82.6,107.4 82.6,107.4 82.6,107.4 82.7,107.4 82.7,107.4 82.7,107.4 82.7,107.4
- 82.7,107.4 82.7,107.4 82.8,107.4 82.8,107.4 82.8,107.4 82.8,107.4 82.8,107.4 82.8,107.4 82.9,107.4 82.9,107.4 82.9,107.4
- 82.9,107.4 82.9,107.4 82.9,107.4 83,107.4 83,107.4 83,107.4 83,107.4 83,107.4 83,107.4 83.1,107.4 83.1,107.4 83.1,107.4
- 83.1,107.4 83.1,107.4 83.1,107.4 83.2,107.4 83.2,107.4 83.2,107.4 83.2,107.4 83.2,107.4 83.3,107.4 83.3,107.4 83.3,107.4
- 83.3,107.4 83.3,107.4 83.3,107.4 83.4,107.4 83.4,107.4 83.4,107.4 83.4,107.4 83.4,107.4 83.4,107.4 83.5,107.4 83.5,107.4
- 83.5,107.4 83.5,107.4 83.5,107.4 83.5,107.4 83.6,107.4 83.6,107.4 83.6,107.4 83.6,107.4 83.6,107.4 83.6,107.4 83.7,107.4
- 83.7,107.4 83.7,107.4 83.7,107.4 83.7,107.4 83.7,107.4 83.8,107.4 83.8,107.4 83.8,107.4 83.8,107.4 83.8,107.4 83.8,107.4
- 83.9,107.4 83.9,107.4 83.9,107.4 83.9,107.4 83.9,107.4 84,107.4 84,107.4 84,107.4 84,107.4 84,107.4 84,107.4 84.1,107.4
- 84.1,107.4 84.1,107.4 84.1,107.4 84.1,107.4 84.1,107.4 84.2,107.4 84.2,107.4 84.2,107.4 84.2,107.4 84.2,107.4 84.2,107.4
- 84.3,107.4 84.3,107.4 84.3,107.4 84.3,107.4 84.3,107.4 84.3,107.4 84.4,107.4 84.4,107.4 84.4,107.4 84.4,107.4 84.4,107.4
- 84.4,107.4 84.5,107.4 84.5,107.4 84.5,107.4 84.5,107.4 84.5,107.4 84.5,107.4 84.6,107.4 84.6,107.4 84.6,107.4 84.6,107.4
- 84.6,107.4 84.6,107.4 84.7,107.4 84.7,107.4 84.7,107.4 84.7,107.4 84.7,107.4 84.8,107.4 84.8,107.4 84.8,107.4 84.8,107.4
- 84.8,107.4 84.8,107.4 84.9,107.4 84.9,107.4 84.9,107.4 84.9,107.4 84.9,107.4 84.9,107.4 85,107.4 85,107.4 85,107.4
- 85,107.4 85,107.4 85,107.4 85.1,107.4 85.1,107.4 85.1,107.4 85.1,107.4 85.1,107.4 85.1,107.4 85.2,107.4 85.2,107.4
- 85.2,107.4 85.2,107.4 85.2,107.4 85.2,107.4 85.3,107.4 85.3,107.4 85.3,107.4 85.3,107.4 85.3,107.4 85.3,107.4 85.4,107.4
- 85.4,107.4 85.4,107.4 85.4,107.4 85.4,107.4 85.4,107.4 85.5,107.4 85.5,107.4 85.5,107.4 85.5,105.3 85.5,105.3 85.5,105.3
- "/>
- <linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="82.7742" y1="166.6087" x2="82.7742" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st12" points="82.3,112.8 82.3,112.8 82.3,112.8 82.3,112.8 82.4,112.8 82.4,112.8 82.4,112.8 82.5,112.8
- 82.5,112.8 82.5,112.8 82.5,112.8 82.6,112.8 82.6,112.8 82.6,112.8 82.7,112.8 82.7,112.8 82.7,112.8 82.7,112.8 82.8,112.8
- 82.8,112.8 82.8,112.8 82.9,112.8 82.9,112.8 82.9,112.8 82.9,112.8 83,112.8 83,112.8 83,112.8 83.1,112.8 83.1,112.8
- 83.1,112.8 83.1,112.8 83.2,112.8 83.2,112.8 83.2,112.8 83.3,112.8 83.3,112.8 83.3,112.8 83.3,112.8 83.4,112.8 83.4,112.8
- 83.4,112.8 83.5,112.8 83.5,112.8 83.5,112.8 83.5,112.8 83.6,112.8 83.6,112.8 83.6,112.8 83.7,112.8 83.7,112.8 83.7,112.8
- 83.7,112.8 83.8,112.8 83.8,112.8 83.8,112.8 83.9,112.8 83.9,112.8 83.9,112.8 83.9,112.8 84,112.8 84,112.8 84,112.8
- 84.1,112.8 84.1,112.8 84.1,112.8 84.1,112.8 84.2,112.8 84.2,112.8 84.2,112.8 84.3,112.8 84.3,112.8 84.3,112.8 84.3,112.8
- 84.4,112.8 84.4,112.8 84.4,112.8 84.5,112.8 84.5,112.8 84.5,112.8 84.5,112.8 84.6,112.8 84.6,112.8 84.6,112.8 84.6,112.8
- 84.7,112.8 84.7,112.8 84.7,112.8 84.8,112.8 84.8,112.8 84.8,112.8 84.8,112.8 84.9,112.8 84.9,112.8 84.9,112.8 85,112.8
- 85,112.8 85,112.8 85,112.8 85.1,112.8 85.1,112.8 85.1,112.8 85.2,112.8 85.2,112.8 85.2,112.8 85.2,112.8 85.3,112.8
- 85.3,112.8 85.3,112.8 85.4,112.8 85.4,112.8 85.4,112.8 85.4,112.8 85.5,112.8 85.5,112.8 85.5,110.7 85.5,110.7 85.4,110.7
- 85.4,110.7 85.4,110.7 85.4,110.7 85.3,110.7 85.3,110.7 85.3,110.7 85.2,110.7 85.2,110.7 85.2,110.7 85.2,110.7 85.1,110.7
- 85.1,110.7 85.1,110.7 85,110.7 85,110.7 85,110.7 85,110.7 84.9,110.7 84.9,110.7 84.9,110.7 84.8,110.7 84.8,110.7
- 84.8,110.7 84.8,110.7 84.7,110.7 84.7,110.7 84.7,110.7 84.6,110.7 84.6,110.7 84.6,110.7 84.6,110.7 84.5,110.7 84.5,110.7
- 84.5,110.7 84.5,110.7 84.4,110.7 84.4,110.7 84.4,110.7 84.3,110.7 84.3,110.7 84.3,110.7 84.3,110.7 84.2,110.7 84.2,110.7
- 84.2,110.7 84.1,110.7 84.1,110.7 84.1,110.7 84.1,110.7 84,110.7 84,110.7 84,110.7 83.9,110.7 83.9,110.7 83.9,110.7
- 83.9,110.7 83.8,110.7 83.8,110.7 83.8,110.7 83.7,110.7 83.7,110.7 83.7,110.7 83.7,110.7 83.6,110.7 83.6,110.7 83.6,110.7
- 83.5,110.7 83.5,110.7 83.5,110.7 83.5,110.7 83.4,110.7 83.4,110.7 83.4,110.7 83.3,110.7 83.3,110.7 83.3,110.7 83.3,110.7
- 83.2,110.7 83.2,110.7 83.2,110.7 83.1,110.7 83.1,110.7 83.1,110.7 83.1,110.7 83,110.7 83,110.7 83,110.7 82.9,110.7
- 82.9,110.7 82.9,110.7 82.9,110.7 82.8,110.7 82.8,110.7 82.8,110.7 82.7,110.7 82.7,110.7 82.7,110.7 82.7,110.7 82.6,110.7
- 82.6,110.7 82.6,110.7 82.5,110.7 82.5,110.7 82.5,110.7 82.5,110.7 82.4,110.7 82.4,110.7 82.4,110.7 82.3,110.7 82.3,110.7
- 82.3,110.7 82.3,110.7 82.2,110.7 82.2,110.7 82.2,110.7 82.1,110.7 82.1,110.7 82.1,110.7 82.1,110.7 82,110.7 82,110.7
- 82,110.7 82,110.7 81.9,110.7 81.9,110.7 81.9,110.7 81.8,110.7 81.8,110.7 81.8,110.7 81.8,110.7 81.7,110.7 81.7,110.7
- 81.7,110.7 81.6,110.7 81.6,110.7 81.6,110.7 81.6,110.7 81.5,110.7 81.5,110.7 81.5,110.7 81.4,110.7 81.4,110.7 81.4,110.7
- 81.4,110.7 81.3,110.7 81.3,110.7 81.3,110.7 81.2,110.7 81.2,110.7 81.2,110.7 81.2,110.7 81.1,110.7 81.1,110.7 81.1,110.7
- 81,110.7 81,110.7 81,110.7 81,110.7 80.9,110.7 80.9,110.7 80.9,110.7 80.8,110.7 80.8,110.7 80.8,110.7 80.8,110.7
- 80.7,110.7 80.7,110.7 80.7,110.7 80.6,110.7 80.6,110.7 80.6,110.7 80.6,110.7 80.5,110.7 80.5,110.7 80.5,110.7 80.4,110.7
- 80.4,110.7 80.4,110.7 80.4,110.7 80.3,110.7 80.3,110.7 80.3,110.7 80.2,110.7 80.2,110.7 80.2,110.7 80.2,110.7 80.1,110.7
- 80.1,110.7 80.1,110.7 80,110.7 80,112.8 80.1,112.8 80.1,112.8 80.1,112.8 80.2,112.8 80.2,112.8 80.2,112.8 80.2,112.8
- 80.3,112.8 80.3,112.8 80.3,112.8 80.4,112.8 80.4,112.8 80.4,112.8 80.4,112.8 80.5,112.8 80.5,112.8 80.5,112.8 80.6,112.8
- 80.6,112.8 80.6,112.8 80.6,112.8 80.7,112.8 80.7,112.8 80.7,112.8 80.8,112.8 80.8,112.8 80.8,112.8 80.8,112.8 80.9,112.8
- 80.9,112.8 80.9,112.8 81,112.8 81,112.8 81,112.8 81,112.8 81.1,112.8 81.1,112.8 81.1,112.8 81.2,112.8 81.2,112.8
- 81.2,112.8 81.2,112.8 81.3,112.8 81.3,112.8 81.3,112.8 81.4,112.8 81.4,112.8 81.4,112.8 81.4,112.8 81.5,112.8 81.5,112.8
- 81.5,112.8 81.6,112.8 81.6,112.8 81.6,112.8 81.6,112.8 81.7,112.8 81.7,112.8 81.7,112.8 81.8,112.8 81.8,112.8 81.8,112.8
- 81.8,112.8 81.9,112.8 81.9,112.8 81.9,112.8 82,112.8 82,112.8 82,112.8 82,112.8 82.1,112.8 82.1,112.8 82.1,112.8
- 82.1,112.8 82.2,112.8 82.2,112.8 82.2,112.8 "/>
- <linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="112.2248" y1="166.6087" x2="112.2248" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st13" points="114.9,78 114.9,78 114.9,78 114.8,78 114.8,78 114.8,78 114.8,78 114.7,78 114.7,78 114.7,78
- 114.6,78 114.6,78 114.6,78 114.6,78 114.5,78 114.5,78 114.5,78 114.4,78 114.4,78 114.4,78 114.4,78 114.3,78 114.3,78
- 114.3,78 114.2,78 114.2,78 114.2,78 114.2,78 114.1,78 114.1,78 114.1,78 114,78 114,78 114,78 114,78 113.9,78 113.9,78
- 113.9,78 113.8,78 113.8,78 113.8,78 113.8,78 113.7,78 113.7,78 113.7,78 113.6,78 113.6,78 113.6,78 113.6,78 113.5,78
- 113.5,78 113.5,78 113.4,78 113.4,78 113.4,78 113.4,78 113.3,78 113.3,78 113.3,78 113.2,78 113.2,78 113.2,78 113.2,78
- 113.1,78 113.1,78 113.1,78 113,78 113,78 113,78 113,78 112.9,78 112.9,78 112.9,78 112.8,78 112.8,78 112.8,78 112.8,78
- 112.7,78 112.7,78 112.7,78 112.7,78 112.6,78 112.6,78 112.6,78 112.5,78 112.5,78 112.5,78 112.5,78 112.4,78 112.4,78
- 112.4,78 112.3,78 112.3,78 112.3,78 112.3,78 112.2,78 112.2,78 112.2,78 112.1,78 112.1,78 112.1,78 112.1,78 112,78 112,78
- 112,78 111.9,78 111.9,78 111.9,78 111.9,78 111.8,78 111.8,78 111.8,78 111.7,78 111.7,78 111.7,78 111.7,78 111.6,78
- 111.6,78 111.6,78 111.5,78 111.5,78 111.5,78 111.5,78 111.4,78 111.4,78 111.4,78 111.3,78 111.3,78 111.3,78 111.3,78
- 111.2,78 111.2,78 111.2,78 111.1,78 111.1,78 111.1,78 111.1,78 111,78 111,78 111,78 110.9,78 110.9,78 110.9,78 110.9,78
- 110.8,78 110.8,78 110.8,78 110.7,78 110.7,78 110.7,78 110.7,78 110.6,78 110.6,78 110.6,78 110.5,78 110.5,78 110.5,78
- 110.5,78 110.4,78 110.4,78 110.4,78 110.4,78 110.3,78 110.3,78 110.3,78 110.2,78 110.2,78 110.2,78 110.2,78 110.1,78
- 110.1,78 110.1,78 110,78 110,78 110,78 110,78 109.9,78 109.9,78 109.9,78 109.8,78 109.8,78 109.8,78 109.8,78 109.7,78
- 109.7,78 109.7,78 109.6,78 109.6,78 109.6,78 109.6,78 109.5,78 109.5,78 109.5,80.1 109.5,80.1 109.6,80.1 109.6,80.1
- 109.6,80.1 109.6,80.1 109.7,80.1 109.7,80.1 109.7,80.1 109.8,80.1 109.8,80.1 109.8,80.1 109.8,80.1 109.9,80.1 109.9,80.1
- 109.9,80.1 110,80.1 110,80.1 110,80.1 110,80.1 110.1,80.1 110.1,80.1 110.1,80.1 110.2,80.1 110.2,80.1 110.2,80.1
- 110.2,80.1 110.3,80.1 110.3,80.1 110.3,80.1 110.4,80.1 110.4,80.1 110.4,80.1 110.4,80.1 110.5,80.1 110.5,80.1 110.5,80.1
- 110.5,80.1 110.6,80.1 110.6,80.1 110.6,80.1 110.7,80.1 110.7,80.1 110.7,80.1 110.7,80.1 110.8,80.1 110.8,80.1 110.8,80.1
- 110.9,80.1 110.9,80.1 110.9,80.1 110.9,80.1 111,80.1 111,80.1 111,80.1 111.1,80.1 111.1,80.1 111.1,80.1 111.1,80.1
- 111.2,80.1 111.2,80.1 111.2,80.1 111.3,80.1 111.3,80.1 111.3,80.1 111.3,80.1 111.4,80.1 111.4,80.1 111.4,80.1 111.5,80.1
- 111.5,80.1 111.5,80.1 111.5,80.1 111.6,80.1 111.6,80.1 111.6,80.1 111.7,80.1 111.7,80.1 111.7,80.1 111.7,80.1 111.8,80.1
- 111.8,80.1 111.8,80.1 111.9,80.1 111.9,80.1 111.9,80.1 111.9,80.1 112,80.1 112,80.1 112,80.1 112.1,80.1 112.1,80.1
- 112.1,80.1 112.1,80.1 112.2,80.1 112.2,80.1 112.2,80.1 112.3,80.1 112.3,80.1 112.3,80.1 112.3,80.1 112.4,80.1 112.4,80.1
- 112.4,80.1 112.5,80.1 112.5,80.1 112.5,80.1 112.5,80.1 112.6,80.1 112.6,80.1 112.6,80.1 112.7,80.1 112.7,80.1 112.7,80.1
- 112.7,80.1 112.8,80.1 112.8,80.1 112.8,80.1 112.8,80.1 112.9,80.1 112.9,80.1 112.9,80.1 113,80.1 113,80.1 113,80.1
- 113,80.1 113.1,80.1 113.1,80.1 113.1,80.1 113.2,80.1 113.2,80.1 113.2,80.1 113.2,80.1 113.3,80.1 113.3,80.1 113.3,80.1
- 113.4,80.1 113.4,80.1 113.4,80.1 113.4,80.1 113.5,80.1 113.5,80.1 113.5,80.1 113.6,80.1 113.6,80.1 113.6,80.1 113.6,80.1
- 113.7,80.1 113.7,80.1 113.7,80.1 113.8,80.1 113.8,80.1 113.8,80.1 113.8,80.1 113.9,80.1 113.9,80.1 113.9,80.1 114,80.1
- 114,80.1 114,80.1 114,80.1 114.1,80.1 114.1,80.1 114.1,80.1 114.2,80.1 114.2,80.1 114.2,80.1 114.2,80.1 114.3,80.1
- 114.3,80.1 114.3,80.1 114.4,80.1 114.4,80.1 114.4,80.1 114.4,80.1 114.5,80.1 114.5,80.1 114.5,80.1 114.6,80.1 114.6,80.1
- 114.6,80.1 114.6,80.1 114.7,80.1 114.7,80.1 114.7,80.1 114.8,80.1 114.8,80.1 114.8,80.1 114.8,80.1 114.9,80.1 114.9,80.1
- 114.9,80.1 115,80.1 115,78 "/>
- <linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="111.134" y1="166.6087" x2="111.134" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st14" points="109.5,85.5 109.5,85.5 109.6,85.5 109.6,85.5 109.6,85.5 109.6,85.5 109.6,85.5 109.7,85.5
- 109.7,85.5 109.7,85.5 109.7,85.5 109.7,85.5 109.7,85.5 109.8,85.5 109.8,85.5 109.8,85.5 109.8,85.5 109.8,85.5 109.8,85.5
- 109.9,85.5 109.9,85.5 109.9,85.5 109.9,85.5 109.9,85.5 109.9,85.5 110,85.5 110,85.5 110,85.5 110,85.5 110,85.5 110,85.5
- 110.1,85.5 110.1,85.5 110.1,85.5 110.1,85.5 110.1,85.5 110.1,85.5 110.2,85.5 110.2,85.5 110.2,85.5 110.2,85.5 110.2,85.5
- 110.2,85.5 110.3,85.5 110.3,85.5 110.3,85.5 110.3,85.5 110.3,85.5 110.4,85.5 110.4,85.5 110.4,85.5 110.4,85.5 110.4,85.5
- 110.4,85.5 110.5,85.5 110.5,85.5 110.5,85.5 110.5,85.5 110.5,85.5 110.5,85.5 110.6,85.5 110.6,85.5 110.6,85.5 110.6,85.5
- 110.6,85.5 110.6,85.5 110.7,85.5 110.7,85.5 110.7,85.5 110.7,85.5 110.7,85.5 110.7,85.5 110.8,85.5 110.8,85.5 110.8,85.5
- 110.8,85.5 110.8,85.5 110.8,85.5 110.9,85.5 110.9,85.5 110.9,85.5 110.9,85.5 110.9,85.5 110.9,85.5 111,85.5 111,85.5
- 111,85.5 111,85.5 111,85.5 111,85.5 111.1,85.5 111.1,85.5 111.1,85.5 111.1,85.5 111.1,85.5 111.2,85.5 111.2,85.5
- 111.2,85.5 111.2,85.5 111.2,85.5 111.2,85.5 111.3,85.5 111.3,85.5 111.3,85.5 111.3,85.5 111.3,85.5 111.3,85.5 111.4,85.5
- 111.4,85.5 111.4,85.5 111.4,85.5 111.4,85.5 111.4,85.5 111.5,85.5 111.5,85.5 111.5,85.5 111.5,85.5 111.5,85.5 111.5,85.5
- 111.6,85.5 111.6,85.5 111.6,85.5 111.6,85.5 111.6,85.5 111.6,85.5 111.7,85.5 111.7,85.5 111.7,85.5 111.7,85.5 111.7,85.5
- 111.7,85.5 111.8,85.5 111.8,85.5 111.8,85.5 111.8,85.5 111.8,85.5 111.8,85.5 111.9,85.5 111.9,85.5 111.9,85.5 111.9,85.5
- 111.9,85.5 112,85.5 112,85.5 112,85.5 112,85.5 112,85.5 112,85.5 112.1,85.5 112.1,85.5 112.1,85.5 112.1,85.5 112.1,85.5
- 112.1,85.5 112.2,85.5 112.2,85.5 112.2,85.5 112.2,85.5 112.2,85.5 112.2,85.5 112.3,85.5 112.3,85.5 112.3,85.5 112.3,85.5
- 112.3,85.5 112.3,85.5 112.4,85.5 112.4,85.5 112.4,85.5 112.4,85.5 112.4,85.5 112.4,85.5 112.5,85.5 112.5,85.5 112.5,85.5
- 112.5,85.5 112.5,85.5 112.5,85.5 112.6,85.5 112.6,85.5 112.6,85.5 112.6,85.5 112.6,85.5 112.7,85.5 112.7,85.5 112.7,85.5
- 112.7,85.5 112.7,85.5 112.7,85.5 112.8,85.5 112.8,85.5 112.8,83.5 112.8,83.5 112.7,83.5 112.7,83.5 112.7,83.5 112.7,83.5
- 112.7,83.5 112.7,83.5 112.6,83.5 112.6,83.5 112.6,83.5 112.6,83.5 112.6,83.5 112.5,83.5 112.5,83.5 112.5,83.5 112.5,83.5
- 112.5,83.5 112.5,83.5 112.4,83.5 112.4,83.5 112.4,83.5 112.4,83.5 112.4,83.5 112.4,83.5 112.3,83.5 112.3,83.5 112.3,83.5
- 112.3,83.5 112.3,83.5 112.3,83.5 112.2,83.5 112.2,83.5 112.2,83.5 112.2,83.5 112.2,83.5 112.2,83.5 112.1,83.5 112.1,83.5
- 112.1,83.5 112.1,83.5 112.1,83.5 112.1,83.5 112,83.5 112,83.5 112,83.5 112,83.5 112,83.5 112,83.5 111.9,83.5 111.9,83.5
- 111.9,83.5 111.9,83.5 111.9,83.5 111.8,83.5 111.8,83.5 111.8,83.5 111.8,83.5 111.8,83.5 111.8,83.5 111.7,83.5 111.7,83.5
- 111.7,83.5 111.7,83.5 111.7,83.5 111.7,83.5 111.6,83.5 111.6,83.5 111.6,83.5 111.6,83.5 111.6,83.5 111.6,83.5 111.5,83.5
- 111.5,83.5 111.5,83.5 111.5,83.5 111.5,83.5 111.5,83.5 111.4,83.5 111.4,83.5 111.4,83.5 111.4,83.5 111.4,83.5 111.4,83.5
- 111.3,83.5 111.3,83.5 111.3,83.5 111.3,83.5 111.3,83.5 111.3,83.5 111.2,83.5 111.2,83.5 111.2,83.5 111.2,83.5 111.2,83.5
- 111.2,83.5 111.1,83.5 111.1,83.5 111.1,83.5 111.1,83.5 111.1,83.5 111,83.5 111,83.5 111,83.5 111,83.5 111,83.5 111,83.5
- 110.9,83.5 110.9,83.5 110.9,83.5 110.9,83.5 110.9,83.5 110.9,83.5 110.8,83.5 110.8,83.5 110.8,83.5 110.8,83.5 110.8,83.5
- 110.8,83.5 110.7,83.5 110.7,83.5 110.7,83.5 110.7,83.5 110.7,83.5 110.7,83.5 110.6,83.5 110.6,83.5 110.6,83.5 110.6,83.5
- 110.6,83.5 110.6,83.5 110.5,83.5 110.5,83.5 110.5,83.5 110.5,83.5 110.5,83.5 110.5,83.5 110.4,83.5 110.4,83.5 110.4,83.5
- 110.4,83.5 110.4,83.5 110.4,83.5 110.3,83.5 110.3,83.5 110.3,83.5 110.3,83.5 110.3,83.5 110.2,83.5 110.2,83.5 110.2,83.5
- 110.2,83.5 110.2,83.5 110.2,83.5 110.1,83.5 110.1,83.5 110.1,83.5 110.1,83.5 110.1,83.5 110.1,83.5 110,83.5 110,83.5
- 110,83.5 110,83.5 110,83.5 110,83.5 109.9,83.5 109.9,83.5 109.9,83.5 109.9,83.5 109.9,83.5 109.9,83.5 109.8,83.5
- 109.8,83.5 109.8,83.5 109.8,83.5 109.8,83.5 109.8,83.5 109.7,83.5 109.7,83.5 109.7,83.5 109.7,83.5 109.7,83.5 109.7,83.5
- 109.6,83.5 109.6,83.5 109.6,83.5 109.6,83.5 109.6,83.5 109.5,83.5 109.5,83.5 109.5,83.5 109.5,83.5 109.5,85.5 109.5,85.5
- "/>
- <linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="112.2248" y1="166.6087" x2="112.2248" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st15" points="114.9,88.9 114.9,88.9 114.8,88.9 114.8,88.9 114.8,88.9 114.8,88.9 114.7,88.9 114.7,88.9
- 114.7,88.9 114.6,88.9 114.6,88.9 114.6,88.9 114.6,88.9 114.5,88.9 114.5,88.9 114.5,88.9 114.4,88.9 114.4,88.9 114.4,88.9
- 114.4,88.9 114.3,88.9 114.3,88.9 114.3,88.9 114.2,88.9 114.2,88.9 114.2,88.9 114.2,88.9 114.1,88.9 114.1,88.9 114.1,88.9
- 114,88.9 114,88.9 114,88.9 114,88.9 113.9,88.9 113.9,88.9 113.9,88.9 113.8,88.9 113.8,88.9 113.8,88.9 113.8,88.9
- 113.7,88.9 113.7,88.9 113.7,88.9 113.6,88.9 113.6,88.9 113.6,88.9 113.6,88.9 113.5,88.9 113.5,88.9 113.5,88.9 113.4,88.9
- 113.4,88.9 113.4,88.9 113.4,88.9 113.3,88.9 113.3,88.9 113.3,88.9 113.2,88.9 113.2,88.9 113.2,88.9 113.2,88.9 113.1,88.9
- 113.1,88.9 113.1,88.9 113,88.9 113,88.9 113,88.9 113,88.9 112.9,88.9 112.9,88.9 112.9,88.9 112.8,88.9 112.8,88.9
- 112.8,88.9 112.8,88.9 112.7,88.9 112.7,88.9 112.7,88.9 112.7,88.9 112.6,88.9 112.6,88.9 112.6,88.9 112.5,88.9 112.5,88.9
- 112.5,88.9 112.5,88.9 112.4,88.9 112.4,88.9 112.4,88.9 112.3,88.9 112.3,88.9 112.3,88.9 112.3,88.9 112.2,88.9 112.2,88.9
- 112.2,88.9 112.1,88.9 112.1,88.9 112.1,88.9 112.1,88.9 112,88.9 112,88.9 112,88.9 111.9,88.9 111.9,88.9 111.9,88.9
- 111.9,88.9 111.8,88.9 111.8,88.9 111.8,88.9 111.7,88.9 111.7,88.9 111.7,88.9 111.7,88.9 111.6,88.9 111.6,88.9 111.6,88.9
- 111.5,88.9 111.5,88.9 111.5,88.9 111.5,88.9 111.4,88.9 111.4,88.9 111.4,88.9 111.3,88.9 111.3,88.9 111.3,88.9 111.3,88.9
- 111.2,88.9 111.2,88.9 111.2,88.9 111.1,88.9 111.1,88.9 111.1,88.9 111.1,88.9 111,88.9 111,88.9 111,88.9 110.9,88.9
- 110.9,88.9 110.9,88.9 110.9,88.9 110.8,88.9 110.8,88.9 110.8,88.9 110.7,88.9 110.7,88.9 110.7,88.9 110.7,88.9 110.6,88.9
- 110.6,88.9 110.6,88.9 110.5,88.9 110.5,88.9 110.5,88.9 110.5,88.9 110.4,88.9 110.4,88.9 110.4,88.9 110.4,88.9 110.3,88.9
- 110.3,88.9 110.3,88.9 110.2,88.9 110.2,88.9 110.2,88.9 110.2,88.9 110.1,88.9 110.1,88.9 110.1,88.9 110,88.9 110,88.9
- 110,88.9 110,88.9 109.9,88.9 109.9,88.9 109.9,88.9 109.8,88.9 109.8,88.9 109.8,88.9 109.8,88.9 109.7,88.9 109.7,88.9
- 109.7,88.9 109.6,88.9 109.6,88.9 109.6,88.9 109.6,88.9 109.5,88.9 109.5,88.9 109.5,91 109.5,91 109.6,91 109.6,91 109.6,91
- 109.6,91 109.7,91 109.7,91 109.7,91 109.8,91 109.8,91 109.8,91 109.8,91 109.9,91 109.9,91 109.9,91 110,91 110,91 110,91
- 110,91 110.1,91 110.1,91 110.1,91 110.2,91 110.2,91 110.2,91 110.2,91 110.3,91 110.3,91 110.3,91 110.4,91 110.4,91
- 110.4,91 110.4,91 110.5,91 110.5,91 110.5,91 110.5,91 110.6,91 110.6,91 110.6,91 110.7,91 110.7,91 110.7,91 110.7,91
- 110.8,91 110.8,91 110.8,91 110.9,91 110.9,91 110.9,91 110.9,91 111,91 111,91 111,91 111.1,91 111.1,91 111.1,91 111.1,91
- 111.2,91 111.2,91 111.2,91 111.3,91 111.3,91 111.3,91 111.3,91 111.4,91 111.4,91 111.4,91 111.5,91 111.5,91 111.5,91
- 111.5,91 111.6,91 111.6,91 111.6,91 111.7,91 111.7,91 111.7,91 111.7,91 111.8,91 111.8,91 111.8,91 111.9,91 111.9,91
- 111.9,91 111.9,91 112,91 112,91 112,91 112.1,91 112.1,91 112.1,91 112.1,91 112.2,91 112.2,91 112.2,91 112.3,91 112.3,91
- 112.3,91 112.3,91 112.4,91 112.4,91 112.4,91 112.5,91 112.5,91 112.5,91 112.5,91 112.6,91 112.6,91 112.6,91 112.7,91
- 112.7,91 112.7,91 112.7,91 112.8,91 112.8,91 112.8,91 112.8,91 112.9,91 112.9,91 112.9,91 113,91 113,91 113,91 113,91
- 113.1,91 113.1,91 113.1,91 113.2,91 113.2,91 113.2,91 113.2,91 113.3,91 113.3,91 113.3,91 113.4,91 113.4,91 113.4,91
- 113.4,91 113.5,91 113.5,91 113.5,91 113.6,91 113.6,91 113.6,91 113.6,91 113.7,91 113.7,91 113.7,91 113.8,91 113.8,91
- 113.8,91 113.8,91 113.9,91 113.9,91 113.9,91 114,91 114,91 114,91 114,91 114.1,91 114.1,91 114.1,91 114.2,91 114.2,91
- 114.2,91 114.2,91 114.3,91 114.3,91 114.3,91 114.4,91 114.4,91 114.4,91 114.4,91 114.5,91 114.5,91 114.5,91 114.6,91
- 114.6,91 114.6,91 114.6,91 114.7,91 114.7,91 114.7,91 114.8,91 114.8,91 114.8,91 114.8,91 114.9,91 114.9,91 114.9,91
- 115,91 115,88.9 114.9,88.9 "/>
- <linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="111.134" y1="166.6087" x2="111.134" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st16" points="109.5,96.5 109.5,96.5 109.6,96.5 109.6,96.5 109.6,96.5 109.6,96.5 109.6,96.5 109.7,96.5
- 109.7,96.5 109.7,96.5 109.7,96.5 109.7,96.5 109.7,96.5 109.8,96.5 109.8,96.5 109.8,96.5 109.8,96.5 109.8,96.5 109.8,96.5
- 109.9,96.5 109.9,96.5 109.9,96.5 109.9,96.5 109.9,96.5 109.9,96.5 110,96.5 110,96.5 110,96.5 110,96.5 110,96.5 110,96.5
- 110.1,96.5 110.1,96.5 110.1,96.5 110.1,96.5 110.1,96.5 110.1,96.5 110.2,96.5 110.2,96.5 110.2,96.5 110.2,96.5 110.2,96.5
- 110.2,96.5 110.3,96.5 110.3,96.5 110.3,96.5 110.3,96.5 110.3,96.5 110.4,96.5 110.4,96.5 110.4,96.5 110.4,96.5 110.4,96.5
- 110.4,96.5 110.5,96.5 110.5,96.5 110.5,96.5 110.5,96.5 110.5,96.5 110.5,96.5 110.6,96.5 110.6,96.5 110.6,96.5 110.6,96.5
- 110.6,96.5 110.6,96.5 110.7,96.5 110.7,96.5 110.7,96.5 110.7,96.5 110.7,96.5 110.7,96.5 110.8,96.5 110.8,96.5 110.8,96.5
- 110.8,96.5 110.8,96.5 110.8,96.5 110.9,96.5 110.9,96.5 110.9,96.5 110.9,96.5 110.9,96.5 110.9,96.5 111,96.5 111,96.5
- 111,96.5 111,96.5 111,96.5 111,96.5 111.1,96.5 111.1,96.5 111.1,96.5 111.1,96.5 111.1,96.5 111.2,96.5 111.2,96.5
- 111.2,96.5 111.2,96.5 111.2,96.5 111.2,96.5 111.3,96.5 111.3,96.5 111.3,96.5 111.3,96.5 111.3,96.5 111.3,96.5 111.4,96.5
- 111.4,96.5 111.4,96.5 111.4,96.5 111.4,96.5 111.4,96.5 111.5,96.5 111.5,96.5 111.5,96.5 111.5,96.5 111.5,96.5 111.5,96.5
- 111.6,96.5 111.6,96.5 111.6,96.5 111.6,96.5 111.6,96.5 111.6,96.5 111.7,96.5 111.7,96.5 111.7,96.5 111.7,96.5 111.7,96.5
- 111.7,96.5 111.8,96.5 111.8,96.5 111.8,96.5 111.8,96.5 111.8,96.5 111.8,96.5 111.9,96.5 111.9,96.5 111.9,96.5 111.9,96.5
- 111.9,96.5 112,96.5 112,96.5 112,96.5 112,96.5 112,96.5 112,96.5 112.1,96.5 112.1,96.5 112.1,96.5 112.1,96.5 112.1,96.5
- 112.1,96.5 112.2,96.5 112.2,96.5 112.2,96.5 112.2,96.5 112.2,96.5 112.2,96.5 112.3,96.5 112.3,96.5 112.3,96.5 112.3,96.5
- 112.3,96.5 112.3,96.5 112.4,96.5 112.4,96.5 112.4,96.5 112.4,96.5 112.4,96.5 112.4,96.5 112.5,96.5 112.5,96.5 112.5,96.5
- 112.5,96.5 112.5,96.5 112.5,96.5 112.6,96.5 112.6,96.5 112.6,96.5 112.6,96.5 112.6,96.5 112.7,96.5 112.7,96.5 112.7,96.5
- 112.7,96.5 112.7,96.5 112.7,96.5 112.8,96.5 112.8,96.5 112.8,94.4 112.8,94.4 112.7,94.4 112.7,94.4 112.7,94.4 112.7,94.4
- 112.7,94.4 112.7,94.4 112.6,94.4 112.6,94.4 112.6,94.4 112.6,94.4 112.6,94.4 112.5,94.4 112.5,94.4 112.5,94.4 112.5,94.4
- 112.5,94.4 112.5,94.4 112.4,94.4 112.4,94.4 112.4,94.4 112.4,94.4 112.4,94.4 112.4,94.4 112.3,94.4 112.3,94.4 112.3,94.4
- 112.3,94.4 112.3,94.4 112.3,94.4 112.2,94.4 112.2,94.4 112.2,94.4 112.2,94.4 112.2,94.4 112.2,94.4 112.1,94.4 112.1,94.4
- 112.1,94.4 112.1,94.4 112.1,94.4 112.1,94.4 112,94.4 112,94.4 112,94.4 112,94.4 112,94.4 112,94.4 111.9,94.4 111.9,94.4
- 111.9,94.4 111.9,94.4 111.9,94.4 111.8,94.4 111.8,94.4 111.8,94.4 111.8,94.4 111.8,94.4 111.8,94.4 111.7,94.4 111.7,94.4
- 111.7,94.4 111.7,94.4 111.7,94.4 111.7,94.4 111.6,94.4 111.6,94.4 111.6,94.4 111.6,94.4 111.6,94.4 111.6,94.4 111.5,94.4
- 111.5,94.4 111.5,94.4 111.5,94.4 111.5,94.4 111.5,94.4 111.4,94.4 111.4,94.4 111.4,94.4 111.4,94.4 111.4,94.4 111.4,94.4
- 111.3,94.4 111.3,94.4 111.3,94.4 111.3,94.4 111.3,94.4 111.3,94.4 111.2,94.4 111.2,94.4 111.2,94.4 111.2,94.4 111.2,94.4
- 111.2,94.4 111.1,94.4 111.1,94.4 111.1,94.4 111.1,94.4 111.1,94.4 111,94.4 111,94.4 111,94.4 111,94.4 111,94.4 111,94.4
- 110.9,94.4 110.9,94.4 110.9,94.4 110.9,94.4 110.9,94.4 110.9,94.4 110.8,94.4 110.8,94.4 110.8,94.4 110.8,94.4 110.8,94.4
- 110.8,94.4 110.7,94.4 110.7,94.4 110.7,94.4 110.7,94.4 110.7,94.4 110.7,94.4 110.6,94.4 110.6,94.4 110.6,94.4 110.6,94.4
- 110.6,94.4 110.6,94.4 110.5,94.4 110.5,94.4 110.5,94.4 110.5,94.4 110.5,94.4 110.5,94.4 110.4,94.4 110.4,94.4 110.4,94.4
- 110.4,94.4 110.4,94.4 110.4,94.4 110.3,94.4 110.3,94.4 110.3,94.4 110.3,94.4 110.3,94.4 110.2,94.4 110.2,94.4 110.2,94.4
- 110.2,94.4 110.2,94.4 110.2,94.4 110.1,94.4 110.1,94.4 110.1,94.4 110.1,94.4 110.1,94.4 110.1,94.4 110,94.4 110,94.4
- 110,94.4 110,94.4 110,94.4 110,94.4 109.9,94.4 109.9,94.4 109.9,94.4 109.9,94.4 109.9,94.4 109.9,94.4 109.8,94.4
- 109.8,94.4 109.8,94.4 109.8,94.4 109.8,94.4 109.8,94.4 109.7,94.4 109.7,94.4 109.7,94.4 109.7,94.4 109.7,94.4 109.7,94.4
- 109.6,94.4 109.6,94.4 109.6,94.4 109.6,94.4 109.6,94.4 109.5,94.4 109.5,94.4 109.5,94.4 109.5,94.4 109.5,96.5 109.5,96.5
- "/>
- <linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="112.2248" y1="166.6087" x2="112.2248" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st17" points="114.9,99.8 114.9,99.8 114.8,99.8 114.8,99.8 114.8,99.8 114.8,99.8 114.7,99.8 114.7,99.8
- 114.7,99.8 114.6,99.8 114.6,99.8 114.6,99.8 114.6,99.8 114.5,99.8 114.5,99.8 114.5,99.8 114.4,99.8 114.4,99.8 114.4,99.8
- 114.4,99.8 114.3,99.8 114.3,99.8 114.3,99.8 114.2,99.8 114.2,99.8 114.2,99.8 114.2,99.8 114.1,99.8 114.1,99.8 114.1,99.8
- 114,99.8 114,99.8 114,99.8 114,99.8 113.9,99.8 113.9,99.8 113.9,99.8 113.8,99.8 113.8,99.8 113.8,99.8 113.8,99.8
- 113.7,99.8 113.7,99.8 113.7,99.8 113.6,99.8 113.6,99.8 113.6,99.8 113.6,99.8 113.5,99.8 113.5,99.8 113.5,99.8 113.4,99.8
- 113.4,99.8 113.4,99.8 113.4,99.8 113.3,99.8 113.3,99.8 113.3,99.8 113.2,99.8 113.2,99.8 113.2,99.8 113.2,99.8 113.1,99.8
- 113.1,99.8 113.1,99.8 113,99.8 113,99.8 113,99.8 113,99.8 112.9,99.8 112.9,99.8 112.9,99.8 112.8,99.8 112.8,99.8
- 112.8,99.8 112.8,99.8 112.7,99.8 112.7,99.8 112.7,99.8 112.7,99.8 112.6,99.8 112.6,99.8 112.6,99.8 112.5,99.8 112.5,99.8
- 112.5,99.8 112.5,99.8 112.4,99.8 112.4,99.8 112.4,99.8 112.3,99.8 112.3,99.8 112.3,99.8 112.3,99.8 112.2,99.8 112.2,99.8
- 112.2,99.8 112.1,99.8 112.1,99.8 112.1,99.8 112.1,99.8 112,99.8 112,99.8 112,99.8 111.9,99.8 111.9,99.8 111.9,99.8
- 111.9,99.8 111.8,99.8 111.8,99.8 111.8,99.8 111.7,99.8 111.7,99.8 111.7,99.8 111.7,99.8 111.6,99.8 111.6,99.8 111.6,99.8
- 111.5,99.8 111.5,99.8 111.5,99.8 111.5,99.8 111.4,99.8 111.4,99.8 111.4,99.8 111.3,99.8 111.3,99.8 111.3,99.8 111.3,99.8
- 111.2,99.8 111.2,99.8 111.2,99.8 111.1,99.8 111.1,99.8 111.1,99.8 111.1,99.8 111,99.8 111,99.8 111,99.8 110.9,99.8
- 110.9,99.8 110.9,99.8 110.9,99.8 110.8,99.8 110.8,99.8 110.8,99.8 110.7,99.8 110.7,99.8 110.7,99.8 110.7,99.8 110.6,99.8
- 110.6,99.8 110.6,99.8 110.5,99.8 110.5,99.8 110.5,99.8 110.5,99.8 110.4,99.8 110.4,99.8 110.4,99.8 110.4,99.8 110.3,99.8
- 110.3,99.8 110.3,99.8 110.2,99.8 110.2,99.8 110.2,99.8 110.2,99.8 110.1,99.8 110.1,99.8 110.1,99.8 110,99.8 110,99.8
- 110,99.8 110,99.8 109.9,99.8 109.9,99.8 109.9,99.8 109.8,99.8 109.8,99.8 109.8,99.8 109.8,99.8 109.7,99.8 109.7,99.8
- 109.7,99.8 109.6,99.8 109.6,99.8 109.6,99.8 109.6,99.8 109.5,99.8 109.5,99.8 109.5,101.9 109.5,101.9 109.6,101.9
- 109.6,101.9 109.6,101.9 109.6,101.9 109.7,101.9 109.7,101.9 109.7,101.9 109.8,101.9 109.8,101.9 109.8,101.9 109.8,101.9
- 109.9,101.9 109.9,101.9 109.9,101.9 110,101.9 110,101.9 110,101.9 110,101.9 110.1,101.9 110.1,101.9 110.1,101.9
- 110.2,101.9 110.2,101.9 110.2,101.9 110.2,101.9 110.3,101.9 110.3,101.9 110.3,101.9 110.4,101.9 110.4,101.9 110.4,101.9
- 110.4,101.9 110.5,101.9 110.5,101.9 110.5,101.9 110.5,101.9 110.6,101.9 110.6,101.9 110.6,101.9 110.7,101.9 110.7,101.9
- 110.7,101.9 110.7,101.9 110.8,101.9 110.8,101.9 110.8,101.9 110.9,101.9 110.9,101.9 110.9,101.9 110.9,101.9 111,101.9
- 111,101.9 111,101.9 111.1,101.9 111.1,101.9 111.1,101.9 111.1,101.9 111.2,101.9 111.2,101.9 111.2,101.9 111.3,101.9
- 111.3,101.9 111.3,101.9 111.3,101.9 111.4,101.9 111.4,101.9 111.4,101.9 111.5,101.9 111.5,101.9 111.5,101.9 111.5,101.9
- 111.6,101.9 111.6,101.9 111.6,101.9 111.7,101.9 111.7,101.9 111.7,101.9 111.7,101.9 111.8,101.9 111.8,101.9 111.8,101.9
- 111.9,101.9 111.9,101.9 111.9,101.9 111.9,101.9 112,101.9 112,101.9 112,101.9 112.1,101.9 112.1,101.9 112.1,101.9
- 112.1,101.9 112.2,101.9 112.2,101.9 112.2,101.9 112.3,101.9 112.3,101.9 112.3,101.9 112.3,101.9 112.4,101.9 112.4,101.9
- 112.4,101.9 112.5,101.9 112.5,101.9 112.5,101.9 112.5,101.9 112.6,101.9 112.6,101.9 112.6,101.9 112.7,101.9 112.7,101.9
- 112.7,101.9 112.7,101.9 112.8,101.9 112.8,101.9 112.8,101.9 112.8,101.9 112.9,101.9 112.9,101.9 112.9,101.9 113,101.9
- 113,101.9 113,101.9 113,101.9 113.1,101.9 113.1,101.9 113.1,101.9 113.2,101.9 113.2,101.9 113.2,101.9 113.2,101.9
- 113.3,101.9 113.3,101.9 113.3,101.9 113.4,101.9 113.4,101.9 113.4,101.9 113.4,101.9 113.5,101.9 113.5,101.9 113.5,101.9
- 113.6,101.9 113.6,101.9 113.6,101.9 113.6,101.9 113.7,101.9 113.7,101.9 113.7,101.9 113.8,101.9 113.8,101.9 113.8,101.9
- 113.8,101.9 113.9,101.9 113.9,101.9 113.9,101.9 114,101.9 114,101.9 114,101.9 114,101.9 114.1,101.9 114.1,101.9
- 114.1,101.9 114.2,101.9 114.2,101.9 114.2,101.9 114.2,101.9 114.3,101.9 114.3,101.9 114.3,101.9 114.4,101.9 114.4,101.9
- 114.4,101.9 114.4,101.9 114.5,101.9 114.5,101.9 114.5,101.9 114.6,101.9 114.6,101.9 114.6,101.9 114.6,101.9 114.7,101.9
- 114.7,101.9 114.7,101.9 114.8,101.9 114.8,101.9 114.8,101.9 114.8,101.9 114.9,101.9 114.9,101.9 114.9,101.9 115,101.9
- 115,99.8 114.9,99.8 "/>
- <linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="111.134" y1="166.6087" x2="111.134" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st18" points="109.5,107.4 109.5,107.4 109.6,107.4 109.6,107.4 109.6,107.4 109.6,107.4 109.6,107.4
- 109.7,107.4 109.7,107.4 109.7,107.4 109.7,107.4 109.7,107.4 109.7,107.4 109.8,107.4 109.8,107.4 109.8,107.4 109.8,107.4
- 109.8,107.4 109.8,107.4 109.9,107.4 109.9,107.4 109.9,107.4 109.9,107.4 109.9,107.4 109.9,107.4 110,107.4 110,107.4
- 110,107.4 110,107.4 110,107.4 110,107.4 110.1,107.4 110.1,107.4 110.1,107.4 110.1,107.4 110.1,107.4 110.1,107.4
- 110.2,107.4 110.2,107.4 110.2,107.4 110.2,107.4 110.2,107.4 110.2,107.4 110.3,107.4 110.3,107.4 110.3,107.4 110.3,107.4
- 110.3,107.4 110.4,107.4 110.4,107.4 110.4,107.4 110.4,107.4 110.4,107.4 110.4,107.4 110.5,107.4 110.5,107.4 110.5,107.4
- 110.5,107.4 110.5,107.4 110.5,107.4 110.6,107.4 110.6,107.4 110.6,107.4 110.6,107.4 110.6,107.4 110.6,107.4 110.7,107.4
- 110.7,107.4 110.7,107.4 110.7,107.4 110.7,107.4 110.7,107.4 110.8,107.4 110.8,107.4 110.8,107.4 110.8,107.4 110.8,107.4
- 110.8,107.4 110.9,107.4 110.9,107.4 110.9,107.4 110.9,107.4 110.9,107.4 110.9,107.4 111,107.4 111,107.4 111,107.4
- 111,107.4 111,107.4 111,107.4 111.1,107.4 111.1,107.4 111.1,107.4 111.1,107.4 111.1,107.4 111.2,107.4 111.2,107.4
- 111.2,107.4 111.2,107.4 111.2,107.4 111.2,107.4 111.3,107.4 111.3,107.4 111.3,107.4 111.3,107.4 111.3,107.4 111.3,107.4
- 111.4,107.4 111.4,107.4 111.4,107.4 111.4,107.4 111.4,107.4 111.4,107.4 111.5,107.4 111.5,107.4 111.5,107.4 111.5,107.4
- 111.5,107.4 111.5,107.4 111.6,107.4 111.6,107.4 111.6,107.4 111.6,107.4 111.6,107.4 111.6,107.4 111.7,107.4 111.7,107.4
- 111.7,107.4 111.7,107.4 111.7,107.4 111.7,107.4 111.8,107.4 111.8,107.4 111.8,107.4 111.8,107.4 111.8,107.4 111.8,107.4
- 111.9,107.4 111.9,107.4 111.9,107.4 111.9,107.4 111.9,107.4 112,107.4 112,107.4 112,107.4 112,107.4 112,107.4 112,107.4
- 112.1,107.4 112.1,107.4 112.1,107.4 112.1,107.4 112.1,107.4 112.1,107.4 112.2,107.4 112.2,107.4 112.2,107.4 112.2,107.4
- 112.2,107.4 112.2,107.4 112.3,107.4 112.3,107.4 112.3,107.4 112.3,107.4 112.3,107.4 112.3,107.4 112.4,107.4 112.4,107.4
- 112.4,107.4 112.4,107.4 112.4,107.4 112.4,107.4 112.5,107.4 112.5,107.4 112.5,107.4 112.5,107.4 112.5,107.4 112.5,107.4
- 112.6,107.4 112.6,107.4 112.6,107.4 112.6,107.4 112.6,107.4 112.7,107.4 112.7,107.4 112.7,107.4 112.7,107.4 112.7,107.4
- 112.7,107.4 112.8,107.4 112.8,107.4 112.8,105.3 112.8,105.3 112.7,105.3 112.7,105.3 112.7,105.3 112.7,105.3 112.7,105.3
- 112.7,105.3 112.6,105.3 112.6,105.3 112.6,105.3 112.6,105.3 112.6,105.3 112.5,105.3 112.5,105.3 112.5,105.3 112.5,105.3
- 112.5,105.3 112.5,105.3 112.4,105.3 112.4,105.3 112.4,105.3 112.4,105.3 112.4,105.3 112.4,105.3 112.3,105.3 112.3,105.3
- 112.3,105.3 112.3,105.3 112.3,105.3 112.3,105.3 112.2,105.3 112.2,105.3 112.2,105.3 112.2,105.3 112.2,105.3 112.2,105.3
- 112.1,105.3 112.1,105.3 112.1,105.3 112.1,105.3 112.1,105.3 112.1,105.3 112,105.3 112,105.3 112,105.3 112,105.3 112,105.3
- 112,105.3 111.9,105.3 111.9,105.3 111.9,105.3 111.9,105.3 111.9,105.3 111.8,105.3 111.8,105.3 111.8,105.3 111.8,105.3
- 111.8,105.3 111.8,105.3 111.7,105.3 111.7,105.3 111.7,105.3 111.7,105.3 111.7,105.3 111.7,105.3 111.6,105.3 111.6,105.3
- 111.6,105.3 111.6,105.3 111.6,105.3 111.6,105.3 111.5,105.3 111.5,105.3 111.5,105.3 111.5,105.3 111.5,105.3 111.5,105.3
- 111.4,105.3 111.4,105.3 111.4,105.3 111.4,105.3 111.4,105.3 111.4,105.3 111.3,105.3 111.3,105.3 111.3,105.3 111.3,105.3
- 111.3,105.3 111.3,105.3 111.2,105.3 111.2,105.3 111.2,105.3 111.2,105.3 111.2,105.3 111.2,105.3 111.1,105.3 111.1,105.3
- 111.1,105.3 111.1,105.3 111.1,105.3 111,105.3 111,105.3 111,105.3 111,105.3 111,105.3 111,105.3 110.9,105.3 110.9,105.3
- 110.9,105.3 110.9,105.3 110.9,105.3 110.9,105.3 110.8,105.3 110.8,105.3 110.8,105.3 110.8,105.3 110.8,105.3 110.8,105.3
- 110.7,105.3 110.7,105.3 110.7,105.3 110.7,105.3 110.7,105.3 110.7,105.3 110.6,105.3 110.6,105.3 110.6,105.3 110.6,105.3
- 110.6,105.3 110.6,105.3 110.5,105.3 110.5,105.3 110.5,105.3 110.5,105.3 110.5,105.3 110.5,105.3 110.4,105.3 110.4,105.3
- 110.4,105.3 110.4,105.3 110.4,105.3 110.4,105.3 110.3,105.3 110.3,105.3 110.3,105.3 110.3,105.3 110.3,105.3 110.2,105.3
- 110.2,105.3 110.2,105.3 110.2,105.3 110.2,105.3 110.2,105.3 110.1,105.3 110.1,105.3 110.1,105.3 110.1,105.3 110.1,105.3
- 110.1,105.3 110,105.3 110,105.3 110,105.3 110,105.3 110,105.3 110,105.3 109.9,105.3 109.9,105.3 109.9,105.3 109.9,105.3
- 109.9,105.3 109.9,105.3 109.8,105.3 109.8,105.3 109.8,105.3 109.8,105.3 109.8,105.3 109.8,105.3 109.7,105.3 109.7,105.3
- 109.7,105.3 109.7,105.3 109.7,105.3 109.7,105.3 109.6,105.3 109.6,105.3 109.6,105.3 109.6,105.3 109.6,105.3 109.5,105.3
- 109.5,105.3 109.5,105.3 109.5,105.3 109.5,107.4 109.5,107.4 "/>
- <linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="112.2248" y1="166.6087" x2="112.2248" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st19" points="114.9,110.7 114.9,110.7 114.8,110.7 114.8,110.7 114.8,110.7 114.8,110.7 114.7,110.7
- 114.7,110.7 114.7,110.7 114.6,110.7 114.6,110.7 114.6,110.7 114.6,110.7 114.5,110.7 114.5,110.7 114.5,110.7 114.4,110.7
- 114.4,110.7 114.4,110.7 114.4,110.7 114.3,110.7 114.3,110.7 114.3,110.7 114.2,110.7 114.2,110.7 114.2,110.7 114.2,110.7
- 114.1,110.7 114.1,110.7 114.1,110.7 114,110.7 114,110.7 114,110.7 114,110.7 113.9,110.7 113.9,110.7 113.9,110.7
- 113.8,110.7 113.8,110.7 113.8,110.7 113.8,110.7 113.7,110.7 113.7,110.7 113.7,110.7 113.6,110.7 113.6,110.7 113.6,110.7
- 113.6,110.7 113.5,110.7 113.5,110.7 113.5,110.7 113.4,110.7 113.4,110.7 113.4,110.7 113.4,110.7 113.3,110.7 113.3,110.7
- 113.3,110.7 113.2,110.7 113.2,110.7 113.2,110.7 113.2,110.7 113.1,110.7 113.1,110.7 113.1,110.7 113,110.7 113,110.7
- 113,110.7 113,110.7 112.9,110.7 112.9,110.7 112.9,110.7 112.8,110.7 112.8,110.7 112.8,110.7 112.8,110.7 112.7,110.7
- 112.7,110.7 112.7,110.7 112.7,110.7 112.6,110.7 112.6,110.7 112.6,110.7 112.5,110.7 112.5,110.7 112.5,110.7 112.5,110.7
- 112.4,110.7 112.4,110.7 112.4,110.7 112.3,110.7 112.3,110.7 112.3,110.7 112.3,110.7 112.2,110.7 112.2,110.7 112.2,110.7
- 112.1,110.7 112.1,110.7 112.1,110.7 112.1,110.7 112,110.7 112,110.7 112,110.7 111.9,110.7 111.9,110.7 111.9,110.7
- 111.9,110.7 111.8,110.7 111.8,110.7 111.8,110.7 111.7,110.7 111.7,110.7 111.7,110.7 111.7,110.7 111.6,110.7 111.6,110.7
- 111.6,110.7 111.5,110.7 111.5,110.7 111.5,110.7 111.5,110.7 111.4,110.7 111.4,110.7 111.4,110.7 111.3,110.7 111.3,110.7
- 111.3,110.7 111.3,110.7 111.2,110.7 111.2,110.7 111.2,110.7 111.1,110.7 111.1,110.7 111.1,110.7 111.1,110.7 111,110.7
- 111,110.7 111,110.7 110.9,110.7 110.9,110.7 110.9,110.7 110.9,110.7 110.8,110.7 110.8,110.7 110.8,110.7 110.7,110.7
- 110.7,110.7 110.7,110.7 110.7,110.7 110.6,110.7 110.6,110.7 110.6,110.7 110.5,110.7 110.5,110.7 110.5,110.7 110.5,110.7
- 110.4,110.7 110.4,110.7 110.4,110.7 110.4,110.7 110.3,110.7 110.3,110.7 110.3,110.7 110.2,110.7 110.2,110.7 110.2,110.7
- 110.2,110.7 110.1,110.7 110.1,110.7 110.1,110.7 110,110.7 110,110.7 110,110.7 110,110.7 109.9,110.7 109.9,110.7
- 109.9,110.7 109.8,110.7 109.8,110.7 109.8,110.7 109.8,110.7 109.7,110.7 109.7,110.7 109.7,110.7 109.6,110.7 109.6,110.7
- 109.6,110.7 109.6,110.7 109.5,110.7 109.5,110.7 109.5,112.8 109.5,112.8 109.6,112.8 109.6,112.8 109.6,112.8 109.6,112.8
- 109.7,112.8 109.7,112.8 109.7,112.8 109.8,112.8 109.8,112.8 109.8,112.8 109.8,112.8 109.9,112.8 109.9,112.8 109.9,112.8
- 110,112.8 110,112.8 110,112.8 110,112.8 110.1,112.8 110.1,112.8 110.1,112.8 110.2,112.8 110.2,112.8 110.2,112.8
- 110.2,112.8 110.3,112.8 110.3,112.8 110.3,112.8 110.4,112.8 110.4,112.8 110.4,112.8 110.4,112.8 110.5,112.8 110.5,112.8
- 110.5,112.8 110.5,112.8 110.6,112.8 110.6,112.8 110.6,112.8 110.7,112.8 110.7,112.8 110.7,112.8 110.7,112.8 110.8,112.8
- 110.8,112.8 110.8,112.8 110.9,112.8 110.9,112.8 110.9,112.8 110.9,112.8 111,112.8 111,112.8 111,112.8 111.1,112.8
- 111.1,112.8 111.1,112.8 111.1,112.8 111.2,112.8 111.2,112.8 111.2,112.8 111.3,112.8 111.3,112.8 111.3,112.8 111.3,112.8
- 111.4,112.8 111.4,112.8 111.4,112.8 111.5,112.8 111.5,112.8 111.5,112.8 111.5,112.8 111.6,112.8 111.6,112.8 111.6,112.8
- 111.7,112.8 111.7,112.8 111.7,112.8 111.7,112.8 111.8,112.8 111.8,112.8 111.8,112.8 111.9,112.8 111.9,112.8 111.9,112.8
- 111.9,112.8 112,112.8 112,112.8 112,112.8 112.1,112.8 112.1,112.8 112.1,112.8 112.1,112.8 112.2,112.8 112.2,112.8
- 112.2,112.8 112.3,112.8 112.3,112.8 112.3,112.8 112.3,112.8 112.4,112.8 112.4,112.8 112.4,112.8 112.5,112.8 112.5,112.8
- 112.5,112.8 112.5,112.8 112.6,112.8 112.6,112.8 112.6,112.8 112.7,112.8 112.7,112.8 112.7,112.8 112.7,112.8 112.8,112.8
- 112.8,112.8 112.8,112.8 112.8,112.8 112.9,112.8 112.9,112.8 112.9,112.8 113,112.8 113,112.8 113,112.8 113,112.8
- 113.1,112.8 113.1,112.8 113.1,112.8 113.2,112.8 113.2,112.8 113.2,112.8 113.2,112.8 113.3,112.8 113.3,112.8 113.3,112.8
- 113.4,112.8 113.4,112.8 113.4,112.8 113.4,112.8 113.5,112.8 113.5,112.8 113.5,112.8 113.6,112.8 113.6,112.8 113.6,112.8
- 113.6,112.8 113.7,112.8 113.7,112.8 113.7,112.8 113.8,112.8 113.8,112.8 113.8,112.8 113.8,112.8 113.9,112.8 113.9,112.8
- 113.9,112.8 114,112.8 114,112.8 114,112.8 114,112.8 114.1,112.8 114.1,112.8 114.1,112.8 114.2,112.8 114.2,112.8
- 114.2,112.8 114.2,112.8 114.3,112.8 114.3,112.8 114.3,112.8 114.4,112.8 114.4,112.8 114.4,112.8 114.4,112.8 114.5,112.8
- 114.5,112.8 114.5,112.8 114.6,112.8 114.6,112.8 114.6,112.8 114.6,112.8 114.7,112.8 114.7,112.8 114.7,112.8 114.8,112.8
- 114.8,112.8 114.8,112.8 114.8,112.8 114.9,112.8 114.9,112.8 114.9,112.8 115,112.8 115,110.7 114.9,110.7 "/>
- </g>
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Shortcut/hvac_active.svg b/homescreen/qml/images/Shortcut/hvac_active.svg
deleted file mode 100644
index 46be46b..0000000
--- a/homescreen/qml/images/Shortcut/hvac_active.svg
+++ /dev/null
@@ -1,614 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8"
- style="enable-background:new 0 0 195 216.8;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#0DF9FF;}
- .st1{fill:url(#Active_2_1_);}
- .st2{fill:#FFFFFF;}
- .st3{font-family:'Roboto-Regular';}
- .st4{font-size:11px;}
- .st5{letter-spacing:2;}
- .st6{fill:url(#SVGID_1_);}
- .st7{fill:url(#SVGID_2_);}
- .st8{fill:url(#SVGID_3_);}
- .st9{fill:url(#SVGID_4_);}
- .st10{fill:url(#SVGID_5_);}
- .st11{fill:url(#SVGID_6_);}
- .st12{fill:url(#SVGID_7_);}
- .st13{fill:url(#SVGID_8_);}
- .st14{fill:url(#SVGID_9_);}
- .st15{fill:url(#SVGID_10_);}
- .st16{fill:url(#SVGID_11_);}
- .st17{fill:url(#SVGID_12_);}
- .st18{fill:url(#SVGID_13_);}
- .st19{fill:url(#SVGID_14_);}
- .st20{fill:url(#SVGID_15_);}
- .st21{fill:url(#SVGID_16_);}
-</style>
-<switch>
- <g i:extraneous="self">
- <g id="Layer_6">
-
- <rect id="Active_1" y="214.3" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 195.8833 431.0468)" class="st0" width="195.9" height="2.4"/>
- <linearGradient id="Active_2_1_" gradientUnits="userSpaceOnUse" x1="97.9416" y1="236.9585" x2="97.9416" y2="-68.5304">
- <stop offset="0" style="stop-color:#0DF9FF"/>
- <stop offset="9.208472e-02" style="stop-color:#0DF9FF;stop-opacity:0.853"/>
- <stop offset="0.6264" style="stop-color:#0DF9FF;stop-opacity:0"/>
- </linearGradient>
- <rect id="Active_2" class="st1" width="195.9" height="214.3"/>
- </g>
- <g id="HVAC">
- <g>
- <g id="HVAC_Icon_2_">
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="97.4991" y1="166.6087" x2="97.4991" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st6" d="M106.2,113.4V81.3c0-4.9-3.9-8.8-8.7-8.8c-4.8,0-8.7,4-8.7,8.8v1.2H91v-1.2c0-3.7,2.9-6.6,6.5-6.6
- c3.6,0,6.5,3,6.5,6.6v33.3l0.5,0.3c3.8,2.4,6.1,6.5,6.1,11c0,7.2-5.8,13.1-13,13.1c-7.3,0-13.2-5.9-13.2-13.1
- c0-4.6,2.3-8.8,6-11.1l0.5-0.3V88.3h-2.2v25c-4.1,2.8-6.5,7.5-6.5,12.6c0,8.4,6.9,15.3,15.3,15.3c8.4,0,15.2-6.9,15.2-15.3
- C112.8,120.9,110.3,116.2,106.2,113.4z"/>
- <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="97.4991" y1="166.6087" x2="97.4991" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st7" d="M97.6,98.6c-4,0-4.4,2.4-4.4,3.5v13.7l-1.4,0.9c-3.2,2-5.2,5.5-5.2,9.3c0,6,4.9,10.9,10.9,10.9
- c2,0,4-0.6,5.8-1.6l-1.2-1.9c-1.4,0.9-3,1.3-4.6,1.3c-4.8,0-8.7-3.9-8.7-8.7c0-3,1.5-5.8,4.1-7.4l2.5-1.5v-14.9
- c0-0.4,0-1.3,2.2-1.3c2.1,0,2.1,0.6,2.1,1.2V117l2.5,1.6c2.5,1.6,4,4.4,4,7.3h2.2c0-3.7-1.9-7.2-5-9.2l-1.5-1V102
- C101.9,100.5,101.1,98.6,97.6,98.6z"/>
- <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="82.7742" y1="166.6087" x2="82.7742" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st8" points="80.1,80.1 80.1,80.1 80.2,80.1 80.2,80.1 80.2,80.1 80.2,80.1 80.3,80.1 80.3,80.1 80.3,80.1
- 80.4,80.1 80.4,80.1 80.4,80.1 80.4,80.1 80.5,80.1 80.5,80.1 80.5,80.1 80.6,80.1 80.6,80.1 80.6,80.1 80.6,80.1 80.7,80.1
- 80.7,80.1 80.7,80.1 80.8,80.1 80.8,80.1 80.8,80.1 80.8,80.1 80.9,80.1 80.9,80.1 80.9,80.1 81,80.1 81,80.1 81,80.1 81,80.1
- 81.1,80.1 81.1,80.1 81.1,80.1 81.2,80.1 81.2,80.1 81.2,80.1 81.2,80.1 81.3,80.1 81.3,80.1 81.3,80.1 81.4,80.1 81.4,80.1
- 81.4,80.1 81.4,80.1 81.5,80.1 81.5,80.1 81.5,80.1 81.6,80.1 81.6,80.1 81.6,80.1 81.6,80.1 81.7,80.1 81.7,80.1 81.7,80.1
- 81.8,80.1 81.8,80.1 81.8,80.1 81.8,80.1 81.9,80.1 81.9,80.1 81.9,80.1 82,80.1 82,80.1 82,80.1 82,80.1 82.1,80.1 82.1,80.1
- 82.1,80.1 82.1,80.1 82.2,80.1 82.2,80.1 82.2,80.1 82.3,80.1 82.3,80.1 82.3,80.1 82.3,80.1 82.4,80.1 82.4,80.1 82.4,80.1
- 82.5,80.1 82.5,80.1 82.5,80.1 82.5,80.1 82.6,80.1 82.6,80.1 82.6,80.1 82.7,80.1 82.7,80.1 82.7,80.1 82.7,80.1 82.8,80.1
- 82.8,80.1 82.8,80.1 82.9,80.1 82.9,80.1 82.9,80.1 82.9,80.1 83,80.1 83,80.1 83,80.1 83.1,80.1 83.1,80.1 83.1,80.1
- 83.1,80.1 83.2,80.1 83.2,80.1 83.2,80.1 83.3,80.1 83.3,80.1 83.3,80.1 83.3,80.1 83.4,80.1 83.4,80.1 83.4,80.1 83.5,80.1
- 83.5,80.1 83.5,80.1 83.5,80.1 83.6,80.1 83.6,80.1 83.6,80.1 83.7,80.1 83.7,80.1 83.7,80.1 83.7,80.1 83.8,80.1 83.8,80.1
- 83.8,80.1 83.9,80.1 83.9,80.1 83.9,80.1 83.9,80.1 84,80.1 84,80.1 84,80.1 84.1,80.1 84.1,80.1 84.1,80.1 84.1,80.1
- 84.2,80.1 84.2,80.1 84.2,80.1 84.3,80.1 84.3,80.1 84.3,80.1 84.3,80.1 84.4,80.1 84.4,80.1 84.4,80.1 84.5,80.1 84.5,80.1
- 84.5,80.1 84.5,80.1 84.6,80.1 84.6,80.1 84.6,80.1 84.6,80.1 84.7,80.1 84.7,80.1 84.7,80.1 84.8,80.1 84.8,80.1 84.8,80.1
- 84.8,80.1 84.9,80.1 84.9,80.1 84.9,80.1 85,80.1 85,80.1 85,80.1 85,80.1 85.1,80.1 85.1,80.1 85.1,80.1 85.2,80.1 85.2,80.1
- 85.2,80.1 85.2,80.1 85.3,80.1 85.3,80.1 85.3,80.1 85.4,80.1 85.4,80.1 85.4,80.1 85.4,80.1 85.5,80.1 85.5,80.1 85.5,78
- 85.5,78 85.4,78 85.4,78 85.4,78 85.4,78 85.3,78 85.3,78 85.3,78 85.2,78 85.2,78 85.2,78 85.2,78 85.1,78 85.1,78 85.1,78
- 85,78 85,78 85,78 85,78 84.9,78 84.9,78 84.9,78 84.8,78 84.8,78 84.8,78 84.8,78 84.7,78 84.7,78 84.7,78 84.6,78 84.6,78
- 84.6,78 84.6,78 84.5,78 84.5,78 84.5,78 84.5,78 84.4,78 84.4,78 84.4,78 84.3,78 84.3,78 84.3,78 84.3,78 84.2,78 84.2,78
- 84.2,78 84.1,78 84.1,78 84.1,78 84.1,78 84,78 84,78 84,78 83.9,78 83.9,78 83.9,78 83.9,78 83.8,78 83.8,78 83.8,78 83.7,78
- 83.7,78 83.7,78 83.7,78 83.6,78 83.6,78 83.6,78 83.5,78 83.5,78 83.5,78 83.5,78 83.4,78 83.4,78 83.4,78 83.3,78 83.3,78
- 83.3,78 83.3,78 83.2,78 83.2,78 83.2,78 83.1,78 83.1,78 83.1,78 83.1,78 83,78 83,78 83,78 82.9,78 82.9,78 82.9,78 82.9,78
- 82.8,78 82.8,78 82.8,78 82.7,78 82.7,78 82.7,78 82.7,78 82.6,78 82.6,78 82.6,78 82.5,78 82.5,78 82.5,78 82.5,78 82.4,78
- 82.4,78 82.4,78 82.3,78 82.3,78 82.3,78 82.3,78 82.2,78 82.2,78 82.2,78 82.1,78 82.1,78 82.1,78 82.1,78 82,78 82,78 82,78
- 82,78 81.9,78 81.9,78 81.9,78 81.8,78 81.8,78 81.8,78 81.8,78 81.7,78 81.7,78 81.7,78 81.6,78 81.6,78 81.6,78 81.6,78
- 81.5,78 81.5,78 81.5,78 81.4,78 81.4,78 81.4,78 81.4,78 81.3,78 81.3,78 81.3,78 81.2,78 81.2,78 81.2,78 81.2,78 81.1,78
- 81.1,78 81.1,78 81,78 81,78 81,78 81,78 80.9,78 80.9,78 80.9,78 80.8,78 80.8,78 80.8,78 80.8,78 80.7,78 80.7,78 80.7,78
- 80.6,78 80.6,78 80.6,78 80.6,78 80.5,78 80.5,78 80.5,78 80.4,78 80.4,78 80.4,78 80.4,78 80.3,78 80.3,78 80.3,78 80.2,78
- 80.2,78 80.2,78 80.2,78 80.1,78 80.1,78 80.1,78 80,78 80,80.1 80.1,80.1 "/>
- <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="83.865" y1="166.6087" x2="83.865" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st9" points="85.4,83.5 85.4,83.5 85.4,83.5 85.4,83.5 85.4,83.5 85.4,83.5 85.3,83.5 85.3,83.5 85.3,83.5
- 85.3,83.5 85.3,83.5 85.3,83.5 85.2,83.5 85.2,83.5 85.2,83.5 85.2,83.5 85.2,83.5 85.2,83.5 85.1,83.5 85.1,83.5 85.1,83.5
- 85.1,83.5 85.1,83.5 85.1,83.5 85,83.5 85,83.5 85,83.5 85,83.5 85,83.5 85,83.5 84.9,83.5 84.9,83.5 84.9,83.5 84.9,83.5
- 84.9,83.5 84.9,83.5 84.8,83.5 84.8,83.5 84.8,83.5 84.8,83.5 84.8,83.5 84.8,83.5 84.7,83.5 84.7,83.5 84.7,83.5 84.7,83.5
- 84.7,83.5 84.6,83.5 84.6,83.5 84.6,83.5 84.6,83.5 84.6,83.5 84.6,83.5 84.5,83.5 84.5,83.5 84.5,83.5 84.5,83.5 84.5,83.5
- 84.5,83.5 84.4,83.5 84.4,83.5 84.4,83.5 84.4,83.5 84.4,83.5 84.4,83.5 84.3,83.5 84.3,83.5 84.3,83.5 84.3,83.5 84.3,83.5
- 84.3,83.5 84.2,83.5 84.2,83.5 84.2,83.5 84.2,83.5 84.2,83.5 84.2,83.5 84.1,83.5 84.1,83.5 84.1,83.5 84.1,83.5 84.1,83.5
- 84.1,83.5 84,83.5 84,83.5 84,83.5 84,83.5 84,83.5 84,83.5 83.9,83.5 83.9,83.5 83.9,83.5 83.9,83.5 83.9,83.5 83.8,83.5
- 83.8,83.5 83.8,83.5 83.8,83.5 83.8,83.5 83.8,83.5 83.7,83.5 83.7,83.5 83.7,83.5 83.7,83.5 83.7,83.5 83.7,83.5 83.6,83.5
- 83.6,83.5 83.6,83.5 83.6,83.5 83.6,83.5 83.6,83.5 83.5,83.5 83.5,83.5 83.5,83.5 83.5,83.5 83.5,83.5 83.5,83.5 83.4,83.5
- 83.4,83.5 83.4,83.5 83.4,83.5 83.4,83.5 83.4,83.5 83.3,83.5 83.3,83.5 83.3,83.5 83.3,83.5 83.3,83.5 83.3,83.5 83.2,83.5
- 83.2,83.5 83.2,83.5 83.2,83.5 83.2,83.5 83.1,83.5 83.1,83.5 83.1,83.5 83.1,83.5 83.1,83.5 83.1,83.5 83,83.5 83,83.5
- 83,83.5 83,83.5 83,83.5 83,83.5 82.9,83.5 82.9,83.5 82.9,83.5 82.9,83.5 82.9,83.5 82.9,83.5 82.8,83.5 82.8,83.5 82.8,83.5
- 82.8,83.5 82.8,83.5 82.8,83.5 82.7,83.5 82.7,83.5 82.7,83.5 82.7,83.5 82.7,83.5 82.7,83.5 82.6,83.5 82.6,83.5 82.6,83.5
- 82.6,83.5 82.6,83.5 82.6,83.5 82.5,83.5 82.5,83.5 82.5,83.5 82.5,83.5 82.5,83.5 82.5,83.5 82.4,83.5 82.4,83.5 82.4,83.5
- 82.4,83.5 82.4,83.5 82.3,83.5 82.3,83.5 82.3,83.5 82.3,83.5 82.3,83.5 82.3,83.5 82.2,83.5 82.2,83.5 82.2,85.5 82.2,85.5
- 82.3,85.5 82.3,85.5 82.3,85.5 82.3,85.5 82.3,85.5 82.3,85.5 82.4,85.5 82.4,85.5 82.4,85.5 82.4,85.5 82.4,85.5 82.5,85.5
- 82.5,85.5 82.5,85.5 82.5,85.5 82.5,85.5 82.5,85.5 82.6,85.5 82.6,85.5 82.6,85.5 82.6,85.5 82.6,85.5 82.6,85.5 82.7,85.5
- 82.7,85.5 82.7,85.5 82.7,85.5 82.7,85.5 82.7,85.5 82.8,85.5 82.8,85.5 82.8,85.5 82.8,85.5 82.8,85.5 82.8,85.5 82.9,85.5
- 82.9,85.5 82.9,85.5 82.9,85.5 82.9,85.5 82.9,85.5 83,85.5 83,85.5 83,85.5 83,85.5 83,85.5 83,85.5 83.1,85.5 83.1,85.5
- 83.1,85.5 83.1,85.5 83.1,85.5 83.1,85.5 83.2,85.5 83.2,85.5 83.2,85.5 83.2,85.5 83.2,85.5 83.3,85.5 83.3,85.5 83.3,85.5
- 83.3,85.5 83.3,85.5 83.3,85.5 83.4,85.5 83.4,85.5 83.4,85.5 83.4,85.5 83.4,85.5 83.4,85.5 83.5,85.5 83.5,85.5 83.5,85.5
- 83.5,85.5 83.5,85.5 83.5,85.5 83.6,85.5 83.6,85.5 83.6,85.5 83.6,85.5 83.6,85.5 83.6,85.5 83.7,85.5 83.7,85.5 83.7,85.5
- 83.7,85.5 83.7,85.5 83.7,85.5 83.8,85.5 83.8,85.5 83.8,85.5 83.8,85.5 83.8,85.5 83.8,85.5 83.9,85.5 83.9,85.5 83.9,85.5
- 83.9,85.5 83.9,85.5 84,85.5 84,85.5 84,85.5 84,85.5 84,85.5 84,85.5 84.1,85.5 84.1,85.5 84.1,85.5 84.1,85.5 84.1,85.5
- 84.1,85.5 84.2,85.5 84.2,85.5 84.2,85.5 84.2,85.5 84.2,85.5 84.2,85.5 84.3,85.5 84.3,85.5 84.3,85.5 84.3,85.5 84.3,85.5
- 84.3,85.5 84.4,85.5 84.4,85.5 84.4,85.5 84.4,85.5 84.4,85.5 84.4,85.5 84.5,85.5 84.5,85.5 84.5,85.5 84.5,85.5 84.5,85.5
- 84.5,85.5 84.6,85.5 84.6,85.5 84.6,85.5 84.6,85.5 84.6,85.5 84.6,85.5 84.7,85.5 84.7,85.5 84.7,85.5 84.7,85.5 84.7,85.5
- 84.8,85.5 84.8,85.5 84.8,85.5 84.8,85.5 84.8,85.5 84.8,85.5 84.9,85.5 84.9,85.5 84.9,85.5 84.9,85.5 84.9,85.5 84.9,85.5
- 85,85.5 85,85.5 85,85.5 85,85.5 85,85.5 85,85.5 85.1,85.5 85.1,85.5 85.1,85.5 85.1,85.5 85.1,85.5 85.1,85.5 85.2,85.5
- 85.2,85.5 85.2,85.5 85.2,85.5 85.2,85.5 85.2,85.5 85.3,85.5 85.3,85.5 85.3,85.5 85.3,85.5 85.3,85.5 85.3,85.5 85.4,85.5
- 85.4,85.5 85.4,85.5 85.4,85.5 85.4,85.5 85.4,85.5 85.5,85.5 85.5,85.5 85.5,85.5 85.5,83.5 85.5,83.5 85.5,83.5 "/>
- <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="82.7742" y1="166.6087" x2="82.7742" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st10" points="80.1,91 80.1,91 80.2,91 80.2,91 80.2,91 80.2,91 80.3,91 80.3,91 80.3,91 80.4,91 80.4,91
- 80.4,91 80.4,91 80.5,91 80.5,91 80.5,91 80.6,91 80.6,91 80.6,91 80.6,91 80.7,91 80.7,91 80.7,91 80.8,91 80.8,91 80.8,91
- 80.8,91 80.9,91 80.9,91 80.9,91 81,91 81,91 81,91 81,91 81.1,91 81.1,91 81.1,91 81.2,91 81.2,91 81.2,91 81.2,91 81.3,91
- 81.3,91 81.3,91 81.4,91 81.4,91 81.4,91 81.4,91 81.5,91 81.5,91 81.5,91 81.6,91 81.6,91 81.6,91 81.6,91 81.7,91 81.7,91
- 81.7,91 81.8,91 81.8,91 81.8,91 81.8,91 81.9,91 81.9,91 81.9,91 82,91 82,91 82,91 82,91 82.1,91 82.1,91 82.1,91 82.1,91
- 82.2,91 82.2,91 82.2,91 82.3,91 82.3,91 82.3,91 82.3,91 82.4,91 82.4,91 82.4,91 82.5,91 82.5,91 82.5,91 82.5,91 82.6,91
- 82.6,91 82.6,91 82.7,91 82.7,91 82.7,91 82.7,91 82.8,91 82.8,91 82.8,91 82.9,91 82.9,91 82.9,91 82.9,91 83,91 83,91 83,91
- 83.1,91 83.1,91 83.1,91 83.1,91 83.2,91 83.2,91 83.2,91 83.3,91 83.3,91 83.3,91 83.3,91 83.4,91 83.4,91 83.4,91 83.5,91
- 83.5,91 83.5,91 83.5,91 83.6,91 83.6,91 83.6,91 83.7,91 83.7,91 83.7,91 83.7,91 83.8,91 83.8,91 83.8,91 83.9,91 83.9,91
- 83.9,91 83.9,91 84,91 84,91 84,91 84.1,91 84.1,91 84.1,91 84.1,91 84.2,91 84.2,91 84.2,91 84.3,91 84.3,91 84.3,91 84.3,91
- 84.4,91 84.4,91 84.4,91 84.5,91 84.5,91 84.5,91 84.5,91 84.6,91 84.6,91 84.6,91 84.6,91 84.7,91 84.7,91 84.7,91 84.8,91
- 84.8,91 84.8,91 84.8,91 84.9,91 84.9,91 84.9,91 85,91 85,91 85,91 85,91 85.1,91 85.1,91 85.1,91 85.2,91 85.2,91 85.2,91
- 85.2,91 85.3,91 85.3,91 85.3,91 85.4,91 85.4,91 85.4,91 85.4,91 85.5,91 85.5,91 85.5,88.9 85.5,88.9 85.4,88.9 85.4,88.9
- 85.4,88.9 85.4,88.9 85.3,88.9 85.3,88.9 85.3,88.9 85.2,88.9 85.2,88.9 85.2,88.9 85.2,88.9 85.1,88.9 85.1,88.9 85.1,88.9
- 85,88.9 85,88.9 85,88.9 85,88.9 84.9,88.9 84.9,88.9 84.9,88.9 84.8,88.9 84.8,88.9 84.8,88.9 84.8,88.9 84.7,88.9 84.7,88.9
- 84.7,88.9 84.6,88.9 84.6,88.9 84.6,88.9 84.6,88.9 84.5,88.9 84.5,88.9 84.5,88.9 84.5,88.9 84.4,88.9 84.4,88.9 84.4,88.9
- 84.3,88.9 84.3,88.9 84.3,88.9 84.3,88.9 84.2,88.9 84.2,88.9 84.2,88.9 84.1,88.9 84.1,88.9 84.1,88.9 84.1,88.9 84,88.9
- 84,88.9 84,88.9 83.9,88.9 83.9,88.9 83.9,88.9 83.9,88.9 83.8,88.9 83.8,88.9 83.8,88.9 83.7,88.9 83.7,88.9 83.7,88.9
- 83.7,88.9 83.6,88.9 83.6,88.9 83.6,88.9 83.5,88.9 83.5,88.9 83.5,88.9 83.5,88.9 83.4,88.9 83.4,88.9 83.4,88.9 83.3,88.9
- 83.3,88.9 83.3,88.9 83.3,88.9 83.2,88.9 83.2,88.9 83.2,88.9 83.1,88.9 83.1,88.9 83.1,88.9 83.1,88.9 83,88.9 83,88.9
- 83,88.9 82.9,88.9 82.9,88.9 82.9,88.9 82.9,88.9 82.8,88.9 82.8,88.9 82.8,88.9 82.7,88.9 82.7,88.9 82.7,88.9 82.7,88.9
- 82.6,88.9 82.6,88.9 82.6,88.9 82.5,88.9 82.5,88.9 82.5,88.9 82.5,88.9 82.4,88.9 82.4,88.9 82.4,88.9 82.3,88.9 82.3,88.9
- 82.3,88.9 82.3,88.9 82.2,88.9 82.2,88.9 82.2,88.9 82.1,88.9 82.1,88.9 82.1,88.9 82.1,88.9 82,88.9 82,88.9 82,88.9 82,88.9
- 81.9,88.9 81.9,88.9 81.9,88.9 81.8,88.9 81.8,88.9 81.8,88.9 81.8,88.9 81.7,88.9 81.7,88.9 81.7,88.9 81.6,88.9 81.6,88.9
- 81.6,88.9 81.6,88.9 81.5,88.9 81.5,88.9 81.5,88.9 81.4,88.9 81.4,88.9 81.4,88.9 81.4,88.9 81.3,88.9 81.3,88.9 81.3,88.9
- 81.2,88.9 81.2,88.9 81.2,88.9 81.2,88.9 81.1,88.9 81.1,88.9 81.1,88.9 81,88.9 81,88.9 81,88.9 81,88.9 80.9,88.9 80.9,88.9
- 80.9,88.9 80.8,88.9 80.8,88.9 80.8,88.9 80.8,88.9 80.7,88.9 80.7,88.9 80.7,88.9 80.6,88.9 80.6,88.9 80.6,88.9 80.6,88.9
- 80.5,88.9 80.5,88.9 80.5,88.9 80.4,88.9 80.4,88.9 80.4,88.9 80.4,88.9 80.3,88.9 80.3,88.9 80.3,88.9 80.2,88.9 80.2,88.9
- 80.2,88.9 80.2,88.9 80.1,88.9 80.1,88.9 80.1,88.9 80,88.9 80,91 80.1,91 "/>
- <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="83.865" y1="166.6087" x2="83.865" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st11" points="85.4,94.4 85.4,94.4 85.4,94.4 85.4,94.4 85.4,94.4 85.4,94.4 85.3,94.4 85.3,94.4 85.3,94.4
- 85.3,94.4 85.3,94.4 85.3,94.4 85.2,94.4 85.2,94.4 85.2,94.4 85.2,94.4 85.2,94.4 85.2,94.4 85.1,94.4 85.1,94.4 85.1,94.4
- 85.1,94.4 85.1,94.4 85.1,94.4 85,94.4 85,94.4 85,94.4 85,94.4 85,94.4 85,94.4 84.9,94.4 84.9,94.4 84.9,94.4 84.9,94.4
- 84.9,94.4 84.9,94.4 84.8,94.4 84.8,94.4 84.8,94.4 84.8,94.4 84.8,94.4 84.8,94.4 84.7,94.4 84.7,94.4 84.7,94.4 84.7,94.4
- 84.7,94.4 84.6,94.4 84.6,94.4 84.6,94.4 84.6,94.4 84.6,94.4 84.6,94.4 84.5,94.4 84.5,94.4 84.5,94.4 84.5,94.4 84.5,94.4
- 84.5,94.4 84.4,94.4 84.4,94.4 84.4,94.4 84.4,94.4 84.4,94.4 84.4,94.4 84.3,94.4 84.3,94.4 84.3,94.4 84.3,94.4 84.3,94.4
- 84.3,94.4 84.2,94.4 84.2,94.4 84.2,94.4 84.2,94.4 84.2,94.4 84.2,94.4 84.1,94.4 84.1,94.4 84.1,94.4 84.1,94.4 84.1,94.4
- 84.1,94.4 84,94.4 84,94.4 84,94.4 84,94.4 84,94.4 84,94.4 83.9,94.4 83.9,94.4 83.9,94.4 83.9,94.4 83.9,94.4 83.8,94.4
- 83.8,94.4 83.8,94.4 83.8,94.4 83.8,94.4 83.8,94.4 83.7,94.4 83.7,94.4 83.7,94.4 83.7,94.4 83.7,94.4 83.7,94.4 83.6,94.4
- 83.6,94.4 83.6,94.4 83.6,94.4 83.6,94.4 83.6,94.4 83.5,94.4 83.5,94.4 83.5,94.4 83.5,94.4 83.5,94.4 83.5,94.4 83.4,94.4
- 83.4,94.4 83.4,94.4 83.4,94.4 83.4,94.4 83.4,94.4 83.3,94.4 83.3,94.4 83.3,94.4 83.3,94.4 83.3,94.4 83.3,94.4 83.2,94.4
- 83.2,94.4 83.2,94.4 83.2,94.4 83.2,94.4 83.1,94.4 83.1,94.4 83.1,94.4 83.1,94.4 83.1,94.4 83.1,94.4 83,94.4 83,94.4
- 83,94.4 83,94.4 83,94.4 83,94.4 82.9,94.4 82.9,94.4 82.9,94.4 82.9,94.4 82.9,94.4 82.9,94.4 82.8,94.4 82.8,94.4 82.8,94.4
- 82.8,94.4 82.8,94.4 82.8,94.4 82.7,94.4 82.7,94.4 82.7,94.4 82.7,94.4 82.7,94.4 82.7,94.4 82.6,94.4 82.6,94.4 82.6,94.4
- 82.6,94.4 82.6,94.4 82.6,94.4 82.5,94.4 82.5,94.4 82.5,94.4 82.5,94.4 82.5,94.4 82.5,94.4 82.4,94.4 82.4,94.4 82.4,94.4
- 82.4,94.4 82.4,94.4 82.3,94.4 82.3,94.4 82.3,94.4 82.3,94.4 82.3,94.4 82.3,94.4 82.2,94.4 82.2,94.4 82.2,96.5 82.2,96.5
- 82.3,96.5 82.3,96.5 82.3,96.5 82.3,96.5 82.3,96.5 82.3,96.5 82.4,96.5 82.4,96.5 82.4,96.5 82.4,96.5 82.4,96.5 82.5,96.5
- 82.5,96.5 82.5,96.5 82.5,96.5 82.5,96.5 82.5,96.5 82.6,96.5 82.6,96.5 82.6,96.5 82.6,96.5 82.6,96.5 82.6,96.5 82.7,96.5
- 82.7,96.5 82.7,96.5 82.7,96.5 82.7,96.5 82.7,96.5 82.8,96.5 82.8,96.5 82.8,96.5 82.8,96.5 82.8,96.5 82.8,96.5 82.9,96.5
- 82.9,96.5 82.9,96.5 82.9,96.5 82.9,96.5 82.9,96.5 83,96.5 83,96.5 83,96.5 83,96.5 83,96.5 83,96.5 83.1,96.5 83.1,96.5
- 83.1,96.5 83.1,96.5 83.1,96.5 83.1,96.5 83.2,96.5 83.2,96.5 83.2,96.5 83.2,96.5 83.2,96.5 83.3,96.5 83.3,96.5 83.3,96.5
- 83.3,96.5 83.3,96.5 83.3,96.5 83.4,96.5 83.4,96.5 83.4,96.5 83.4,96.5 83.4,96.5 83.4,96.5 83.5,96.5 83.5,96.5 83.5,96.5
- 83.5,96.5 83.5,96.5 83.5,96.5 83.6,96.5 83.6,96.5 83.6,96.5 83.6,96.5 83.6,96.5 83.6,96.5 83.7,96.5 83.7,96.5 83.7,96.5
- 83.7,96.5 83.7,96.5 83.7,96.5 83.8,96.5 83.8,96.5 83.8,96.5 83.8,96.5 83.8,96.5 83.8,96.5 83.9,96.5 83.9,96.5 83.9,96.5
- 83.9,96.5 83.9,96.5 84,96.5 84,96.5 84,96.5 84,96.5 84,96.5 84,96.5 84.1,96.5 84.1,96.5 84.1,96.5 84.1,96.5 84.1,96.5
- 84.1,96.5 84.2,96.5 84.2,96.5 84.2,96.5 84.2,96.5 84.2,96.5 84.2,96.5 84.3,96.5 84.3,96.5 84.3,96.5 84.3,96.5 84.3,96.5
- 84.3,96.5 84.4,96.5 84.4,96.5 84.4,96.5 84.4,96.5 84.4,96.5 84.4,96.5 84.5,96.5 84.5,96.5 84.5,96.5 84.5,96.5 84.5,96.5
- 84.5,96.5 84.6,96.5 84.6,96.5 84.6,96.5 84.6,96.5 84.6,96.5 84.6,96.5 84.7,96.5 84.7,96.5 84.7,96.5 84.7,96.5 84.7,96.5
- 84.8,96.5 84.8,96.5 84.8,96.5 84.8,96.5 84.8,96.5 84.8,96.5 84.9,96.5 84.9,96.5 84.9,96.5 84.9,96.5 84.9,96.5 84.9,96.5
- 85,96.5 85,96.5 85,96.5 85,96.5 85,96.5 85,96.5 85.1,96.5 85.1,96.5 85.1,96.5 85.1,96.5 85.1,96.5 85.1,96.5 85.2,96.5
- 85.2,96.5 85.2,96.5 85.2,96.5 85.2,96.5 85.2,96.5 85.3,96.5 85.3,96.5 85.3,96.5 85.3,96.5 85.3,96.5 85.3,96.5 85.4,96.5
- 85.4,96.5 85.4,96.5 85.4,96.5 85.4,96.5 85.4,96.5 85.5,96.5 85.5,96.5 85.5,96.5 85.5,94.4 85.5,94.4 85.5,94.4 "/>
- <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="82.7742" y1="166.6087" x2="82.7742" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st12" points="80.1,101.9 80.1,101.9 80.2,101.9 80.2,101.9 80.2,101.9 80.2,101.9 80.3,101.9 80.3,101.9
- 80.3,101.9 80.4,101.9 80.4,101.9 80.4,101.9 80.4,101.9 80.5,101.9 80.5,101.9 80.5,101.9 80.6,101.9 80.6,101.9 80.6,101.9
- 80.6,101.9 80.7,101.9 80.7,101.9 80.7,101.9 80.8,101.9 80.8,101.9 80.8,101.9 80.8,101.9 80.9,101.9 80.9,101.9 80.9,101.9
- 81,101.9 81,101.9 81,101.9 81,101.9 81.1,101.9 81.1,101.9 81.1,101.9 81.2,101.9 81.2,101.9 81.2,101.9 81.2,101.9
- 81.3,101.9 81.3,101.9 81.3,101.9 81.4,101.9 81.4,101.9 81.4,101.9 81.4,101.9 81.5,101.9 81.5,101.9 81.5,101.9 81.6,101.9
- 81.6,101.9 81.6,101.9 81.6,101.9 81.7,101.9 81.7,101.9 81.7,101.9 81.8,101.9 81.8,101.9 81.8,101.9 81.8,101.9 81.9,101.9
- 81.9,101.9 81.9,101.9 82,101.9 82,101.9 82,101.9 82,101.9 82.1,101.9 82.1,101.9 82.1,101.9 82.1,101.9 82.2,101.9
- 82.2,101.9 82.2,101.9 82.3,101.9 82.3,101.9 82.3,101.9 82.3,101.9 82.4,101.9 82.4,101.9 82.4,101.9 82.5,101.9 82.5,101.9
- 82.5,101.9 82.5,101.9 82.6,101.9 82.6,101.9 82.6,101.9 82.7,101.9 82.7,101.9 82.7,101.9 82.7,101.9 82.8,101.9 82.8,101.9
- 82.8,101.9 82.9,101.9 82.9,101.9 82.9,101.9 82.9,101.9 83,101.9 83,101.9 83,101.9 83.1,101.9 83.1,101.9 83.1,101.9
- 83.1,101.9 83.2,101.9 83.2,101.9 83.2,101.9 83.3,101.9 83.3,101.9 83.3,101.9 83.3,101.9 83.4,101.9 83.4,101.9 83.4,101.9
- 83.5,101.9 83.5,101.9 83.5,101.9 83.5,101.9 83.6,101.9 83.6,101.9 83.6,101.9 83.7,101.9 83.7,101.9 83.7,101.9 83.7,101.9
- 83.8,101.9 83.8,101.9 83.8,101.9 83.9,101.9 83.9,101.9 83.9,101.9 83.9,101.9 84,101.9 84,101.9 84,101.9 84.1,101.9
- 84.1,101.9 84.1,101.9 84.1,101.9 84.2,101.9 84.2,101.9 84.2,101.9 84.3,101.9 84.3,101.9 84.3,101.9 84.3,101.9 84.4,101.9
- 84.4,101.9 84.4,101.9 84.5,101.9 84.5,101.9 84.5,101.9 84.5,101.9 84.6,101.9 84.6,101.9 84.6,101.9 84.6,101.9 84.7,101.9
- 84.7,101.9 84.7,101.9 84.8,101.9 84.8,101.9 84.8,101.9 84.8,101.9 84.9,101.9 84.9,101.9 84.9,101.9 85,101.9 85,101.9
- 85,101.9 85,101.9 85.1,101.9 85.1,101.9 85.1,101.9 85.2,101.9 85.2,101.9 85.2,101.9 85.2,101.9 85.3,101.9 85.3,101.9
- 85.3,101.9 85.4,101.9 85.4,101.9 85.4,101.9 85.4,101.9 85.5,101.9 85.5,101.9 85.5,99.8 85.5,99.8 85.4,99.8 85.4,99.8
- 85.4,99.8 85.4,99.8 85.3,99.8 85.3,99.8 85.3,99.8 85.2,99.8 85.2,99.8 85.2,99.8 85.2,99.8 85.1,99.8 85.1,99.8 85.1,99.8
- 85,99.8 85,99.8 85,99.8 85,99.8 84.9,99.8 84.9,99.8 84.9,99.8 84.8,99.8 84.8,99.8 84.8,99.8 84.8,99.8 84.7,99.8 84.7,99.8
- 84.7,99.8 84.6,99.8 84.6,99.8 84.6,99.8 84.6,99.8 84.5,99.8 84.5,99.8 84.5,99.8 84.5,99.8 84.4,99.8 84.4,99.8 84.4,99.8
- 84.3,99.8 84.3,99.8 84.3,99.8 84.3,99.8 84.2,99.8 84.2,99.8 84.2,99.8 84.1,99.8 84.1,99.8 84.1,99.8 84.1,99.8 84,99.8
- 84,99.8 84,99.8 83.9,99.8 83.9,99.8 83.9,99.8 83.9,99.8 83.8,99.8 83.8,99.8 83.8,99.8 83.7,99.8 83.7,99.8 83.7,99.8
- 83.7,99.8 83.6,99.8 83.6,99.8 83.6,99.8 83.5,99.8 83.5,99.8 83.5,99.8 83.5,99.8 83.4,99.8 83.4,99.8 83.4,99.8 83.3,99.8
- 83.3,99.8 83.3,99.8 83.3,99.8 83.2,99.8 83.2,99.8 83.2,99.8 83.1,99.8 83.1,99.8 83.1,99.8 83.1,99.8 83,99.8 83,99.8
- 83,99.8 82.9,99.8 82.9,99.8 82.9,99.8 82.9,99.8 82.8,99.8 82.8,99.8 82.8,99.8 82.7,99.8 82.7,99.8 82.7,99.8 82.7,99.8
- 82.6,99.8 82.6,99.8 82.6,99.8 82.5,99.8 82.5,99.8 82.5,99.8 82.5,99.8 82.4,99.8 82.4,99.8 82.4,99.8 82.3,99.8 82.3,99.8
- 82.3,99.8 82.3,99.8 82.2,99.8 82.2,99.8 82.2,99.8 82.1,99.8 82.1,99.8 82.1,99.8 82.1,99.8 82,99.8 82,99.8 82,99.8 82,99.8
- 81.9,99.8 81.9,99.8 81.9,99.8 81.8,99.8 81.8,99.8 81.8,99.8 81.8,99.8 81.7,99.8 81.7,99.8 81.7,99.8 81.6,99.8 81.6,99.8
- 81.6,99.8 81.6,99.8 81.5,99.8 81.5,99.8 81.5,99.8 81.4,99.8 81.4,99.8 81.4,99.8 81.4,99.8 81.3,99.8 81.3,99.8 81.3,99.8
- 81.2,99.8 81.2,99.8 81.2,99.8 81.2,99.8 81.1,99.8 81.1,99.8 81.1,99.8 81,99.8 81,99.8 81,99.8 81,99.8 80.9,99.8 80.9,99.8
- 80.9,99.8 80.8,99.8 80.8,99.8 80.8,99.8 80.8,99.8 80.7,99.8 80.7,99.8 80.7,99.8 80.6,99.8 80.6,99.8 80.6,99.8 80.6,99.8
- 80.5,99.8 80.5,99.8 80.5,99.8 80.4,99.8 80.4,99.8 80.4,99.8 80.4,99.8 80.3,99.8 80.3,99.8 80.3,99.8 80.2,99.8 80.2,99.8
- 80.2,99.8 80.2,99.8 80.1,99.8 80.1,99.8 80.1,99.8 80,99.8 80,101.9 80.1,101.9 "/>
- <linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="83.865" y1="166.6087" x2="83.865" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st13" points="85.4,105.3 85.4,105.3 85.4,105.3 85.4,105.3 85.4,105.3 85.4,105.3 85.3,105.3 85.3,105.3
- 85.3,105.3 85.3,105.3 85.3,105.3 85.3,105.3 85.2,105.3 85.2,105.3 85.2,105.3 85.2,105.3 85.2,105.3 85.2,105.3 85.1,105.3
- 85.1,105.3 85.1,105.3 85.1,105.3 85.1,105.3 85.1,105.3 85,105.3 85,105.3 85,105.3 85,105.3 85,105.3 85,105.3 84.9,105.3
- 84.9,105.3 84.9,105.3 84.9,105.3 84.9,105.3 84.9,105.3 84.8,105.3 84.8,105.3 84.8,105.3 84.8,105.3 84.8,105.3 84.8,105.3
- 84.7,105.3 84.7,105.3 84.7,105.3 84.7,105.3 84.7,105.3 84.6,105.3 84.6,105.3 84.6,105.3 84.6,105.3 84.6,105.3 84.6,105.3
- 84.5,105.3 84.5,105.3 84.5,105.3 84.5,105.3 84.5,105.3 84.5,105.3 84.4,105.3 84.4,105.3 84.4,105.3 84.4,105.3 84.4,105.3
- 84.4,105.3 84.3,105.3 84.3,105.3 84.3,105.3 84.3,105.3 84.3,105.3 84.3,105.3 84.2,105.3 84.2,105.3 84.2,105.3 84.2,105.3
- 84.2,105.3 84.2,105.3 84.1,105.3 84.1,105.3 84.1,105.3 84.1,105.3 84.1,105.3 84.1,105.3 84,105.3 84,105.3 84,105.3
- 84,105.3 84,105.3 84,105.3 83.9,105.3 83.9,105.3 83.9,105.3 83.9,105.3 83.9,105.3 83.8,105.3 83.8,105.3 83.8,105.3
- 83.8,105.3 83.8,105.3 83.8,105.3 83.7,105.3 83.7,105.3 83.7,105.3 83.7,105.3 83.7,105.3 83.7,105.3 83.6,105.3 83.6,105.3
- 83.6,105.3 83.6,105.3 83.6,105.3 83.6,105.3 83.5,105.3 83.5,105.3 83.5,105.3 83.5,105.3 83.5,105.3 83.5,105.3 83.4,105.3
- 83.4,105.3 83.4,105.3 83.4,105.3 83.4,105.3 83.4,105.3 83.3,105.3 83.3,105.3 83.3,105.3 83.3,105.3 83.3,105.3 83.3,105.3
- 83.2,105.3 83.2,105.3 83.2,105.3 83.2,105.3 83.2,105.3 83.1,105.3 83.1,105.3 83.1,105.3 83.1,105.3 83.1,105.3 83.1,105.3
- 83,105.3 83,105.3 83,105.3 83,105.3 83,105.3 83,105.3 82.9,105.3 82.9,105.3 82.9,105.3 82.9,105.3 82.9,105.3 82.9,105.3
- 82.8,105.3 82.8,105.3 82.8,105.3 82.8,105.3 82.8,105.3 82.8,105.3 82.7,105.3 82.7,105.3 82.7,105.3 82.7,105.3 82.7,105.3
- 82.7,105.3 82.6,105.3 82.6,105.3 82.6,105.3 82.6,105.3 82.6,105.3 82.6,105.3 82.5,105.3 82.5,105.3 82.5,105.3 82.5,105.3
- 82.5,105.3 82.5,105.3 82.4,105.3 82.4,105.3 82.4,105.3 82.4,105.3 82.4,105.3 82.3,105.3 82.3,105.3 82.3,105.3 82.3,105.3
- 82.3,105.3 82.3,105.3 82.2,105.3 82.2,105.3 82.2,107.4 82.2,107.4 82.3,107.4 82.3,107.4 82.3,107.4 82.3,107.4 82.3,107.4
- 82.3,107.4 82.4,107.4 82.4,107.4 82.4,107.4 82.4,107.4 82.4,107.4 82.5,107.4 82.5,107.4 82.5,107.4 82.5,107.4 82.5,107.4
- 82.5,107.4 82.6,107.4 82.6,107.4 82.6,107.4 82.6,107.4 82.6,107.4 82.6,107.4 82.7,107.4 82.7,107.4 82.7,107.4 82.7,107.4
- 82.7,107.4 82.7,107.4 82.8,107.4 82.8,107.4 82.8,107.4 82.8,107.4 82.8,107.4 82.8,107.4 82.9,107.4 82.9,107.4 82.9,107.4
- 82.9,107.4 82.9,107.4 82.9,107.4 83,107.4 83,107.4 83,107.4 83,107.4 83,107.4 83,107.4 83.1,107.4 83.1,107.4 83.1,107.4
- 83.1,107.4 83.1,107.4 83.1,107.4 83.2,107.4 83.2,107.4 83.2,107.4 83.2,107.4 83.2,107.4 83.3,107.4 83.3,107.4 83.3,107.4
- 83.3,107.4 83.3,107.4 83.3,107.4 83.4,107.4 83.4,107.4 83.4,107.4 83.4,107.4 83.4,107.4 83.4,107.4 83.5,107.4 83.5,107.4
- 83.5,107.4 83.5,107.4 83.5,107.4 83.5,107.4 83.6,107.4 83.6,107.4 83.6,107.4 83.6,107.4 83.6,107.4 83.6,107.4 83.7,107.4
- 83.7,107.4 83.7,107.4 83.7,107.4 83.7,107.4 83.7,107.4 83.8,107.4 83.8,107.4 83.8,107.4 83.8,107.4 83.8,107.4 83.8,107.4
- 83.9,107.4 83.9,107.4 83.9,107.4 83.9,107.4 83.9,107.4 84,107.4 84,107.4 84,107.4 84,107.4 84,107.4 84,107.4 84.1,107.4
- 84.1,107.4 84.1,107.4 84.1,107.4 84.1,107.4 84.1,107.4 84.2,107.4 84.2,107.4 84.2,107.4 84.2,107.4 84.2,107.4 84.2,107.4
- 84.3,107.4 84.3,107.4 84.3,107.4 84.3,107.4 84.3,107.4 84.3,107.4 84.4,107.4 84.4,107.4 84.4,107.4 84.4,107.4 84.4,107.4
- 84.4,107.4 84.5,107.4 84.5,107.4 84.5,107.4 84.5,107.4 84.5,107.4 84.5,107.4 84.6,107.4 84.6,107.4 84.6,107.4 84.6,107.4
- 84.6,107.4 84.6,107.4 84.7,107.4 84.7,107.4 84.7,107.4 84.7,107.4 84.7,107.4 84.8,107.4 84.8,107.4 84.8,107.4 84.8,107.4
- 84.8,107.4 84.8,107.4 84.9,107.4 84.9,107.4 84.9,107.4 84.9,107.4 84.9,107.4 84.9,107.4 85,107.4 85,107.4 85,107.4
- 85,107.4 85,107.4 85,107.4 85.1,107.4 85.1,107.4 85.1,107.4 85.1,107.4 85.1,107.4 85.1,107.4 85.2,107.4 85.2,107.4
- 85.2,107.4 85.2,107.4 85.2,107.4 85.2,107.4 85.3,107.4 85.3,107.4 85.3,107.4 85.3,107.4 85.3,107.4 85.3,107.4 85.4,107.4
- 85.4,107.4 85.4,107.4 85.4,107.4 85.4,107.4 85.4,107.4 85.5,107.4 85.5,107.4 85.5,107.4 85.5,105.3 85.5,105.3 85.5,105.3
- "/>
- <linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="82.7742" y1="166.6087" x2="82.7742" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st14" points="82.3,112.8 82.3,112.8 82.3,112.8 82.3,112.8 82.4,112.8 82.4,112.8 82.4,112.8 82.5,112.8
- 82.5,112.8 82.5,112.8 82.5,112.8 82.6,112.8 82.6,112.8 82.6,112.8 82.7,112.8 82.7,112.8 82.7,112.8 82.7,112.8 82.8,112.8
- 82.8,112.8 82.8,112.8 82.9,112.8 82.9,112.8 82.9,112.8 82.9,112.8 83,112.8 83,112.8 83,112.8 83.1,112.8 83.1,112.8
- 83.1,112.8 83.1,112.8 83.2,112.8 83.2,112.8 83.2,112.8 83.3,112.8 83.3,112.8 83.3,112.8 83.3,112.8 83.4,112.8 83.4,112.8
- 83.4,112.8 83.5,112.8 83.5,112.8 83.5,112.8 83.5,112.8 83.6,112.8 83.6,112.8 83.6,112.8 83.7,112.8 83.7,112.8 83.7,112.8
- 83.7,112.8 83.8,112.8 83.8,112.8 83.8,112.8 83.9,112.8 83.9,112.8 83.9,112.8 83.9,112.8 84,112.8 84,112.8 84,112.8
- 84.1,112.8 84.1,112.8 84.1,112.8 84.1,112.8 84.2,112.8 84.2,112.8 84.2,112.8 84.3,112.8 84.3,112.8 84.3,112.8 84.3,112.8
- 84.4,112.8 84.4,112.8 84.4,112.8 84.5,112.8 84.5,112.8 84.5,112.8 84.5,112.8 84.6,112.8 84.6,112.8 84.6,112.8 84.6,112.8
- 84.7,112.8 84.7,112.8 84.7,112.8 84.8,112.8 84.8,112.8 84.8,112.8 84.8,112.8 84.9,112.8 84.9,112.8 84.9,112.8 85,112.8
- 85,112.8 85,112.8 85,112.8 85.1,112.8 85.1,112.8 85.1,112.8 85.2,112.8 85.2,112.8 85.2,112.8 85.2,112.8 85.3,112.8
- 85.3,112.8 85.3,112.8 85.4,112.8 85.4,112.8 85.4,112.8 85.4,112.8 85.5,112.8 85.5,112.8 85.5,110.7 85.5,110.7 85.4,110.7
- 85.4,110.7 85.4,110.7 85.4,110.7 85.3,110.7 85.3,110.7 85.3,110.7 85.2,110.7 85.2,110.7 85.2,110.7 85.2,110.7 85.1,110.7
- 85.1,110.7 85.1,110.7 85,110.7 85,110.7 85,110.7 85,110.7 84.9,110.7 84.9,110.7 84.9,110.7 84.8,110.7 84.8,110.7
- 84.8,110.7 84.8,110.7 84.7,110.7 84.7,110.7 84.7,110.7 84.6,110.7 84.6,110.7 84.6,110.7 84.6,110.7 84.5,110.7 84.5,110.7
- 84.5,110.7 84.5,110.7 84.4,110.7 84.4,110.7 84.4,110.7 84.3,110.7 84.3,110.7 84.3,110.7 84.3,110.7 84.2,110.7 84.2,110.7
- 84.2,110.7 84.1,110.7 84.1,110.7 84.1,110.7 84.1,110.7 84,110.7 84,110.7 84,110.7 83.9,110.7 83.9,110.7 83.9,110.7
- 83.9,110.7 83.8,110.7 83.8,110.7 83.8,110.7 83.7,110.7 83.7,110.7 83.7,110.7 83.7,110.7 83.6,110.7 83.6,110.7 83.6,110.7
- 83.5,110.7 83.5,110.7 83.5,110.7 83.5,110.7 83.4,110.7 83.4,110.7 83.4,110.7 83.3,110.7 83.3,110.7 83.3,110.7 83.3,110.7
- 83.2,110.7 83.2,110.7 83.2,110.7 83.1,110.7 83.1,110.7 83.1,110.7 83.1,110.7 83,110.7 83,110.7 83,110.7 82.9,110.7
- 82.9,110.7 82.9,110.7 82.9,110.7 82.8,110.7 82.8,110.7 82.8,110.7 82.7,110.7 82.7,110.7 82.7,110.7 82.7,110.7 82.6,110.7
- 82.6,110.7 82.6,110.7 82.5,110.7 82.5,110.7 82.5,110.7 82.5,110.7 82.4,110.7 82.4,110.7 82.4,110.7 82.3,110.7 82.3,110.7
- 82.3,110.7 82.3,110.7 82.2,110.7 82.2,110.7 82.2,110.7 82.1,110.7 82.1,110.7 82.1,110.7 82.1,110.7 82,110.7 82,110.7
- 82,110.7 82,110.7 81.9,110.7 81.9,110.7 81.9,110.7 81.8,110.7 81.8,110.7 81.8,110.7 81.8,110.7 81.7,110.7 81.7,110.7
- 81.7,110.7 81.6,110.7 81.6,110.7 81.6,110.7 81.6,110.7 81.5,110.7 81.5,110.7 81.5,110.7 81.4,110.7 81.4,110.7 81.4,110.7
- 81.4,110.7 81.3,110.7 81.3,110.7 81.3,110.7 81.2,110.7 81.2,110.7 81.2,110.7 81.2,110.7 81.1,110.7 81.1,110.7 81.1,110.7
- 81,110.7 81,110.7 81,110.7 81,110.7 80.9,110.7 80.9,110.7 80.9,110.7 80.8,110.7 80.8,110.7 80.8,110.7 80.8,110.7
- 80.7,110.7 80.7,110.7 80.7,110.7 80.6,110.7 80.6,110.7 80.6,110.7 80.6,110.7 80.5,110.7 80.5,110.7 80.5,110.7 80.4,110.7
- 80.4,110.7 80.4,110.7 80.4,110.7 80.3,110.7 80.3,110.7 80.3,110.7 80.2,110.7 80.2,110.7 80.2,110.7 80.2,110.7 80.1,110.7
- 80.1,110.7 80.1,110.7 80,110.7 80,112.8 80.1,112.8 80.1,112.8 80.1,112.8 80.2,112.8 80.2,112.8 80.2,112.8 80.2,112.8
- 80.3,112.8 80.3,112.8 80.3,112.8 80.4,112.8 80.4,112.8 80.4,112.8 80.4,112.8 80.5,112.8 80.5,112.8 80.5,112.8 80.6,112.8
- 80.6,112.8 80.6,112.8 80.6,112.8 80.7,112.8 80.7,112.8 80.7,112.8 80.8,112.8 80.8,112.8 80.8,112.8 80.8,112.8 80.9,112.8
- 80.9,112.8 80.9,112.8 81,112.8 81,112.8 81,112.8 81,112.8 81.1,112.8 81.1,112.8 81.1,112.8 81.2,112.8 81.2,112.8
- 81.2,112.8 81.2,112.8 81.3,112.8 81.3,112.8 81.3,112.8 81.4,112.8 81.4,112.8 81.4,112.8 81.4,112.8 81.5,112.8 81.5,112.8
- 81.5,112.8 81.6,112.8 81.6,112.8 81.6,112.8 81.6,112.8 81.7,112.8 81.7,112.8 81.7,112.8 81.8,112.8 81.8,112.8 81.8,112.8
- 81.8,112.8 81.9,112.8 81.9,112.8 81.9,112.8 82,112.8 82,112.8 82,112.8 82,112.8 82.1,112.8 82.1,112.8 82.1,112.8
- 82.1,112.8 82.2,112.8 82.2,112.8 82.2,112.8 "/>
- <linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="112.2248" y1="166.6087" x2="112.2248" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st15" points="114.9,78 114.9,78 114.9,78 114.8,78 114.8,78 114.8,78 114.8,78 114.7,78 114.7,78 114.7,78
- 114.6,78 114.6,78 114.6,78 114.6,78 114.5,78 114.5,78 114.5,78 114.4,78 114.4,78 114.4,78 114.4,78 114.3,78 114.3,78
- 114.3,78 114.2,78 114.2,78 114.2,78 114.2,78 114.1,78 114.1,78 114.1,78 114,78 114,78 114,78 114,78 113.9,78 113.9,78
- 113.9,78 113.8,78 113.8,78 113.8,78 113.8,78 113.7,78 113.7,78 113.7,78 113.6,78 113.6,78 113.6,78 113.6,78 113.5,78
- 113.5,78 113.5,78 113.4,78 113.4,78 113.4,78 113.4,78 113.3,78 113.3,78 113.3,78 113.2,78 113.2,78 113.2,78 113.2,78
- 113.1,78 113.1,78 113.1,78 113,78 113,78 113,78 113,78 112.9,78 112.9,78 112.9,78 112.8,78 112.8,78 112.8,78 112.8,78
- 112.7,78 112.7,78 112.7,78 112.7,78 112.6,78 112.6,78 112.6,78 112.5,78 112.5,78 112.5,78 112.5,78 112.4,78 112.4,78
- 112.4,78 112.3,78 112.3,78 112.3,78 112.3,78 112.2,78 112.2,78 112.2,78 112.1,78 112.1,78 112.1,78 112.1,78 112,78 112,78
- 112,78 111.9,78 111.9,78 111.9,78 111.9,78 111.8,78 111.8,78 111.8,78 111.7,78 111.7,78 111.7,78 111.7,78 111.6,78
- 111.6,78 111.6,78 111.5,78 111.5,78 111.5,78 111.5,78 111.4,78 111.4,78 111.4,78 111.3,78 111.3,78 111.3,78 111.3,78
- 111.2,78 111.2,78 111.2,78 111.1,78 111.1,78 111.1,78 111.1,78 111,78 111,78 111,78 110.9,78 110.9,78 110.9,78 110.9,78
- 110.8,78 110.8,78 110.8,78 110.7,78 110.7,78 110.7,78 110.7,78 110.6,78 110.6,78 110.6,78 110.5,78 110.5,78 110.5,78
- 110.5,78 110.4,78 110.4,78 110.4,78 110.4,78 110.3,78 110.3,78 110.3,78 110.2,78 110.2,78 110.2,78 110.2,78 110.1,78
- 110.1,78 110.1,78 110,78 110,78 110,78 110,78 109.9,78 109.9,78 109.9,78 109.8,78 109.8,78 109.8,78 109.8,78 109.7,78
- 109.7,78 109.7,78 109.6,78 109.6,78 109.6,78 109.6,78 109.5,78 109.5,78 109.5,80.1 109.5,80.1 109.6,80.1 109.6,80.1
- 109.6,80.1 109.6,80.1 109.7,80.1 109.7,80.1 109.7,80.1 109.8,80.1 109.8,80.1 109.8,80.1 109.8,80.1 109.9,80.1 109.9,80.1
- 109.9,80.1 110,80.1 110,80.1 110,80.1 110,80.1 110.1,80.1 110.1,80.1 110.1,80.1 110.2,80.1 110.2,80.1 110.2,80.1
- 110.2,80.1 110.3,80.1 110.3,80.1 110.3,80.1 110.4,80.1 110.4,80.1 110.4,80.1 110.4,80.1 110.5,80.1 110.5,80.1 110.5,80.1
- 110.5,80.1 110.6,80.1 110.6,80.1 110.6,80.1 110.7,80.1 110.7,80.1 110.7,80.1 110.7,80.1 110.8,80.1 110.8,80.1 110.8,80.1
- 110.9,80.1 110.9,80.1 110.9,80.1 110.9,80.1 111,80.1 111,80.1 111,80.1 111.1,80.1 111.1,80.1 111.1,80.1 111.1,80.1
- 111.2,80.1 111.2,80.1 111.2,80.1 111.3,80.1 111.3,80.1 111.3,80.1 111.3,80.1 111.4,80.1 111.4,80.1 111.4,80.1 111.5,80.1
- 111.5,80.1 111.5,80.1 111.5,80.1 111.6,80.1 111.6,80.1 111.6,80.1 111.7,80.1 111.7,80.1 111.7,80.1 111.7,80.1 111.8,80.1
- 111.8,80.1 111.8,80.1 111.9,80.1 111.9,80.1 111.9,80.1 111.9,80.1 112,80.1 112,80.1 112,80.1 112.1,80.1 112.1,80.1
- 112.1,80.1 112.1,80.1 112.2,80.1 112.2,80.1 112.2,80.1 112.3,80.1 112.3,80.1 112.3,80.1 112.3,80.1 112.4,80.1 112.4,80.1
- 112.4,80.1 112.5,80.1 112.5,80.1 112.5,80.1 112.5,80.1 112.6,80.1 112.6,80.1 112.6,80.1 112.7,80.1 112.7,80.1 112.7,80.1
- 112.7,80.1 112.8,80.1 112.8,80.1 112.8,80.1 112.8,80.1 112.9,80.1 112.9,80.1 112.9,80.1 113,80.1 113,80.1 113,80.1
- 113,80.1 113.1,80.1 113.1,80.1 113.1,80.1 113.2,80.1 113.2,80.1 113.2,80.1 113.2,80.1 113.3,80.1 113.3,80.1 113.3,80.1
- 113.4,80.1 113.4,80.1 113.4,80.1 113.4,80.1 113.5,80.1 113.5,80.1 113.5,80.1 113.6,80.1 113.6,80.1 113.6,80.1 113.6,80.1
- 113.7,80.1 113.7,80.1 113.7,80.1 113.8,80.1 113.8,80.1 113.8,80.1 113.8,80.1 113.9,80.1 113.9,80.1 113.9,80.1 114,80.1
- 114,80.1 114,80.1 114,80.1 114.1,80.1 114.1,80.1 114.1,80.1 114.2,80.1 114.2,80.1 114.2,80.1 114.2,80.1 114.3,80.1
- 114.3,80.1 114.3,80.1 114.4,80.1 114.4,80.1 114.4,80.1 114.4,80.1 114.5,80.1 114.5,80.1 114.5,80.1 114.6,80.1 114.6,80.1
- 114.6,80.1 114.6,80.1 114.7,80.1 114.7,80.1 114.7,80.1 114.8,80.1 114.8,80.1 114.8,80.1 114.8,80.1 114.9,80.1 114.9,80.1
- 114.9,80.1 115,80.1 115,78 "/>
- <linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="111.134" y1="166.6087" x2="111.134" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st16" points="109.5,85.5 109.5,85.5 109.6,85.5 109.6,85.5 109.6,85.5 109.6,85.5 109.6,85.5 109.7,85.5
- 109.7,85.5 109.7,85.5 109.7,85.5 109.7,85.5 109.7,85.5 109.8,85.5 109.8,85.5 109.8,85.5 109.8,85.5 109.8,85.5 109.8,85.5
- 109.9,85.5 109.9,85.5 109.9,85.5 109.9,85.5 109.9,85.5 109.9,85.5 110,85.5 110,85.5 110,85.5 110,85.5 110,85.5 110,85.5
- 110.1,85.5 110.1,85.5 110.1,85.5 110.1,85.5 110.1,85.5 110.1,85.5 110.2,85.5 110.2,85.5 110.2,85.5 110.2,85.5 110.2,85.5
- 110.2,85.5 110.3,85.5 110.3,85.5 110.3,85.5 110.3,85.5 110.3,85.5 110.4,85.5 110.4,85.5 110.4,85.5 110.4,85.5 110.4,85.5
- 110.4,85.5 110.5,85.5 110.5,85.5 110.5,85.5 110.5,85.5 110.5,85.5 110.5,85.5 110.6,85.5 110.6,85.5 110.6,85.5 110.6,85.5
- 110.6,85.5 110.6,85.5 110.7,85.5 110.7,85.5 110.7,85.5 110.7,85.5 110.7,85.5 110.7,85.5 110.8,85.5 110.8,85.5 110.8,85.5
- 110.8,85.5 110.8,85.5 110.8,85.5 110.9,85.5 110.9,85.5 110.9,85.5 110.9,85.5 110.9,85.5 110.9,85.5 111,85.5 111,85.5
- 111,85.5 111,85.5 111,85.5 111,85.5 111.1,85.5 111.1,85.5 111.1,85.5 111.1,85.5 111.1,85.5 111.2,85.5 111.2,85.5
- 111.2,85.5 111.2,85.5 111.2,85.5 111.2,85.5 111.3,85.5 111.3,85.5 111.3,85.5 111.3,85.5 111.3,85.5 111.3,85.5 111.4,85.5
- 111.4,85.5 111.4,85.5 111.4,85.5 111.4,85.5 111.4,85.5 111.5,85.5 111.5,85.5 111.5,85.5 111.5,85.5 111.5,85.5 111.5,85.5
- 111.6,85.5 111.6,85.5 111.6,85.5 111.6,85.5 111.6,85.5 111.6,85.5 111.7,85.5 111.7,85.5 111.7,85.5 111.7,85.5 111.7,85.5
- 111.7,85.5 111.8,85.5 111.8,85.5 111.8,85.5 111.8,85.5 111.8,85.5 111.8,85.5 111.9,85.5 111.9,85.5 111.9,85.5 111.9,85.5
- 111.9,85.5 112,85.5 112,85.5 112,85.5 112,85.5 112,85.5 112,85.5 112.1,85.5 112.1,85.5 112.1,85.5 112.1,85.5 112.1,85.5
- 112.1,85.5 112.2,85.5 112.2,85.5 112.2,85.5 112.2,85.5 112.2,85.5 112.2,85.5 112.3,85.5 112.3,85.5 112.3,85.5 112.3,85.5
- 112.3,85.5 112.3,85.5 112.4,85.5 112.4,85.5 112.4,85.5 112.4,85.5 112.4,85.5 112.4,85.5 112.5,85.5 112.5,85.5 112.5,85.5
- 112.5,85.5 112.5,85.5 112.5,85.5 112.6,85.5 112.6,85.5 112.6,85.5 112.6,85.5 112.6,85.5 112.7,85.5 112.7,85.5 112.7,85.5
- 112.7,85.5 112.7,85.5 112.7,85.5 112.8,85.5 112.8,85.5 112.8,83.5 112.8,83.5 112.7,83.5 112.7,83.5 112.7,83.5 112.7,83.5
- 112.7,83.5 112.7,83.5 112.6,83.5 112.6,83.5 112.6,83.5 112.6,83.5 112.6,83.5 112.5,83.5 112.5,83.5 112.5,83.5 112.5,83.5
- 112.5,83.5 112.5,83.5 112.4,83.5 112.4,83.5 112.4,83.5 112.4,83.5 112.4,83.5 112.4,83.5 112.3,83.5 112.3,83.5 112.3,83.5
- 112.3,83.5 112.3,83.5 112.3,83.5 112.2,83.5 112.2,83.5 112.2,83.5 112.2,83.5 112.2,83.5 112.2,83.5 112.1,83.5 112.1,83.5
- 112.1,83.5 112.1,83.5 112.1,83.5 112.1,83.5 112,83.5 112,83.5 112,83.5 112,83.5 112,83.5 112,83.5 111.9,83.5 111.9,83.5
- 111.9,83.5 111.9,83.5 111.9,83.5 111.8,83.5 111.8,83.5 111.8,83.5 111.8,83.5 111.8,83.5 111.8,83.5 111.7,83.5 111.7,83.5
- 111.7,83.5 111.7,83.5 111.7,83.5 111.7,83.5 111.6,83.5 111.6,83.5 111.6,83.5 111.6,83.5 111.6,83.5 111.6,83.5 111.5,83.5
- 111.5,83.5 111.5,83.5 111.5,83.5 111.5,83.5 111.5,83.5 111.4,83.5 111.4,83.5 111.4,83.5 111.4,83.5 111.4,83.5 111.4,83.5
- 111.3,83.5 111.3,83.5 111.3,83.5 111.3,83.5 111.3,83.5 111.3,83.5 111.2,83.5 111.2,83.5 111.2,83.5 111.2,83.5 111.2,83.5
- 111.2,83.5 111.1,83.5 111.1,83.5 111.1,83.5 111.1,83.5 111.1,83.5 111,83.5 111,83.5 111,83.5 111,83.5 111,83.5 111,83.5
- 110.9,83.5 110.9,83.5 110.9,83.5 110.9,83.5 110.9,83.5 110.9,83.5 110.8,83.5 110.8,83.5 110.8,83.5 110.8,83.5 110.8,83.5
- 110.8,83.5 110.7,83.5 110.7,83.5 110.7,83.5 110.7,83.5 110.7,83.5 110.7,83.5 110.6,83.5 110.6,83.5 110.6,83.5 110.6,83.5
- 110.6,83.5 110.6,83.5 110.5,83.5 110.5,83.5 110.5,83.5 110.5,83.5 110.5,83.5 110.5,83.5 110.4,83.5 110.4,83.5 110.4,83.5
- 110.4,83.5 110.4,83.5 110.4,83.5 110.3,83.5 110.3,83.5 110.3,83.5 110.3,83.5 110.3,83.5 110.2,83.5 110.2,83.5 110.2,83.5
- 110.2,83.5 110.2,83.5 110.2,83.5 110.1,83.5 110.1,83.5 110.1,83.5 110.1,83.5 110.1,83.5 110.1,83.5 110,83.5 110,83.5
- 110,83.5 110,83.5 110,83.5 110,83.5 109.9,83.5 109.9,83.5 109.9,83.5 109.9,83.5 109.9,83.5 109.9,83.5 109.8,83.5
- 109.8,83.5 109.8,83.5 109.8,83.5 109.8,83.5 109.8,83.5 109.7,83.5 109.7,83.5 109.7,83.5 109.7,83.5 109.7,83.5 109.7,83.5
- 109.6,83.5 109.6,83.5 109.6,83.5 109.6,83.5 109.6,83.5 109.5,83.5 109.5,83.5 109.5,83.5 109.5,83.5 109.5,85.5 109.5,85.5
- "/>
- <linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="112.2248" y1="166.6087" x2="112.2248" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st17" points="114.9,88.9 114.9,88.9 114.8,88.9 114.8,88.9 114.8,88.9 114.8,88.9 114.7,88.9 114.7,88.9
- 114.7,88.9 114.6,88.9 114.6,88.9 114.6,88.9 114.6,88.9 114.5,88.9 114.5,88.9 114.5,88.9 114.4,88.9 114.4,88.9 114.4,88.9
- 114.4,88.9 114.3,88.9 114.3,88.9 114.3,88.9 114.2,88.9 114.2,88.9 114.2,88.9 114.2,88.9 114.1,88.9 114.1,88.9 114.1,88.9
- 114,88.9 114,88.9 114,88.9 114,88.9 113.9,88.9 113.9,88.9 113.9,88.9 113.8,88.9 113.8,88.9 113.8,88.9 113.8,88.9
- 113.7,88.9 113.7,88.9 113.7,88.9 113.6,88.9 113.6,88.9 113.6,88.9 113.6,88.9 113.5,88.9 113.5,88.9 113.5,88.9 113.4,88.9
- 113.4,88.9 113.4,88.9 113.4,88.9 113.3,88.9 113.3,88.9 113.3,88.9 113.2,88.9 113.2,88.9 113.2,88.9 113.2,88.9 113.1,88.9
- 113.1,88.9 113.1,88.9 113,88.9 113,88.9 113,88.9 113,88.9 112.9,88.9 112.9,88.9 112.9,88.9 112.8,88.9 112.8,88.9
- 112.8,88.9 112.8,88.9 112.7,88.9 112.7,88.9 112.7,88.9 112.7,88.9 112.6,88.9 112.6,88.9 112.6,88.9 112.5,88.9 112.5,88.9
- 112.5,88.9 112.5,88.9 112.4,88.9 112.4,88.9 112.4,88.9 112.3,88.9 112.3,88.9 112.3,88.9 112.3,88.9 112.2,88.9 112.2,88.9
- 112.2,88.9 112.1,88.9 112.1,88.9 112.1,88.9 112.1,88.9 112,88.9 112,88.9 112,88.9 111.9,88.9 111.9,88.9 111.9,88.9
- 111.9,88.9 111.8,88.9 111.8,88.9 111.8,88.9 111.7,88.9 111.7,88.9 111.7,88.9 111.7,88.9 111.6,88.9 111.6,88.9 111.6,88.9
- 111.5,88.9 111.5,88.9 111.5,88.9 111.5,88.9 111.4,88.9 111.4,88.9 111.4,88.9 111.3,88.9 111.3,88.9 111.3,88.9 111.3,88.9
- 111.2,88.9 111.2,88.9 111.2,88.9 111.1,88.9 111.1,88.9 111.1,88.9 111.1,88.9 111,88.9 111,88.9 111,88.9 110.9,88.9
- 110.9,88.9 110.9,88.9 110.9,88.9 110.8,88.9 110.8,88.9 110.8,88.9 110.7,88.9 110.7,88.9 110.7,88.9 110.7,88.9 110.6,88.9
- 110.6,88.9 110.6,88.9 110.5,88.9 110.5,88.9 110.5,88.9 110.5,88.9 110.4,88.9 110.4,88.9 110.4,88.9 110.4,88.9 110.3,88.9
- 110.3,88.9 110.3,88.9 110.2,88.9 110.2,88.9 110.2,88.9 110.2,88.9 110.1,88.9 110.1,88.9 110.1,88.9 110,88.9 110,88.9
- 110,88.9 110,88.9 109.9,88.9 109.9,88.9 109.9,88.9 109.8,88.9 109.8,88.9 109.8,88.9 109.8,88.9 109.7,88.9 109.7,88.9
- 109.7,88.9 109.6,88.9 109.6,88.9 109.6,88.9 109.6,88.9 109.5,88.9 109.5,88.9 109.5,91 109.5,91 109.6,91 109.6,91 109.6,91
- 109.6,91 109.7,91 109.7,91 109.7,91 109.8,91 109.8,91 109.8,91 109.8,91 109.9,91 109.9,91 109.9,91 110,91 110,91 110,91
- 110,91 110.1,91 110.1,91 110.1,91 110.2,91 110.2,91 110.2,91 110.2,91 110.3,91 110.3,91 110.3,91 110.4,91 110.4,91
- 110.4,91 110.4,91 110.5,91 110.5,91 110.5,91 110.5,91 110.6,91 110.6,91 110.6,91 110.7,91 110.7,91 110.7,91 110.7,91
- 110.8,91 110.8,91 110.8,91 110.9,91 110.9,91 110.9,91 110.9,91 111,91 111,91 111,91 111.1,91 111.1,91 111.1,91 111.1,91
- 111.2,91 111.2,91 111.2,91 111.3,91 111.3,91 111.3,91 111.3,91 111.4,91 111.4,91 111.4,91 111.5,91 111.5,91 111.5,91
- 111.5,91 111.6,91 111.6,91 111.6,91 111.7,91 111.7,91 111.7,91 111.7,91 111.8,91 111.8,91 111.8,91 111.9,91 111.9,91
- 111.9,91 111.9,91 112,91 112,91 112,91 112.1,91 112.1,91 112.1,91 112.1,91 112.2,91 112.2,91 112.2,91 112.3,91 112.3,91
- 112.3,91 112.3,91 112.4,91 112.4,91 112.4,91 112.5,91 112.5,91 112.5,91 112.5,91 112.6,91 112.6,91 112.6,91 112.7,91
- 112.7,91 112.7,91 112.7,91 112.8,91 112.8,91 112.8,91 112.8,91 112.9,91 112.9,91 112.9,91 113,91 113,91 113,91 113,91
- 113.1,91 113.1,91 113.1,91 113.2,91 113.2,91 113.2,91 113.2,91 113.3,91 113.3,91 113.3,91 113.4,91 113.4,91 113.4,91
- 113.4,91 113.5,91 113.5,91 113.5,91 113.6,91 113.6,91 113.6,91 113.6,91 113.7,91 113.7,91 113.7,91 113.8,91 113.8,91
- 113.8,91 113.8,91 113.9,91 113.9,91 113.9,91 114,91 114,91 114,91 114,91 114.1,91 114.1,91 114.1,91 114.2,91 114.2,91
- 114.2,91 114.2,91 114.3,91 114.3,91 114.3,91 114.4,91 114.4,91 114.4,91 114.4,91 114.5,91 114.5,91 114.5,91 114.6,91
- 114.6,91 114.6,91 114.6,91 114.7,91 114.7,91 114.7,91 114.8,91 114.8,91 114.8,91 114.8,91 114.9,91 114.9,91 114.9,91
- 115,91 115,88.9 114.9,88.9 "/>
- <linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="111.134" y1="166.6087" x2="111.134" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st18" points="109.5,96.5 109.5,96.5 109.6,96.5 109.6,96.5 109.6,96.5 109.6,96.5 109.6,96.5 109.7,96.5
- 109.7,96.5 109.7,96.5 109.7,96.5 109.7,96.5 109.7,96.5 109.8,96.5 109.8,96.5 109.8,96.5 109.8,96.5 109.8,96.5 109.8,96.5
- 109.9,96.5 109.9,96.5 109.9,96.5 109.9,96.5 109.9,96.5 109.9,96.5 110,96.5 110,96.5 110,96.5 110,96.5 110,96.5 110,96.5
- 110.1,96.5 110.1,96.5 110.1,96.5 110.1,96.5 110.1,96.5 110.1,96.5 110.2,96.5 110.2,96.5 110.2,96.5 110.2,96.5 110.2,96.5
- 110.2,96.5 110.3,96.5 110.3,96.5 110.3,96.5 110.3,96.5 110.3,96.5 110.4,96.5 110.4,96.5 110.4,96.5 110.4,96.5 110.4,96.5
- 110.4,96.5 110.5,96.5 110.5,96.5 110.5,96.5 110.5,96.5 110.5,96.5 110.5,96.5 110.6,96.5 110.6,96.5 110.6,96.5 110.6,96.5
- 110.6,96.5 110.6,96.5 110.7,96.5 110.7,96.5 110.7,96.5 110.7,96.5 110.7,96.5 110.7,96.5 110.8,96.5 110.8,96.5 110.8,96.5
- 110.8,96.5 110.8,96.5 110.8,96.5 110.9,96.5 110.9,96.5 110.9,96.5 110.9,96.5 110.9,96.5 110.9,96.5 111,96.5 111,96.5
- 111,96.5 111,96.5 111,96.5 111,96.5 111.1,96.5 111.1,96.5 111.1,96.5 111.1,96.5 111.1,96.5 111.2,96.5 111.2,96.5
- 111.2,96.5 111.2,96.5 111.2,96.5 111.2,96.5 111.3,96.5 111.3,96.5 111.3,96.5 111.3,96.5 111.3,96.5 111.3,96.5 111.4,96.5
- 111.4,96.5 111.4,96.5 111.4,96.5 111.4,96.5 111.4,96.5 111.5,96.5 111.5,96.5 111.5,96.5 111.5,96.5 111.5,96.5 111.5,96.5
- 111.6,96.5 111.6,96.5 111.6,96.5 111.6,96.5 111.6,96.5 111.6,96.5 111.7,96.5 111.7,96.5 111.7,96.5 111.7,96.5 111.7,96.5
- 111.7,96.5 111.8,96.5 111.8,96.5 111.8,96.5 111.8,96.5 111.8,96.5 111.8,96.5 111.9,96.5 111.9,96.5 111.9,96.5 111.9,96.5
- 111.9,96.5 112,96.5 112,96.5 112,96.5 112,96.5 112,96.5 112,96.5 112.1,96.5 112.1,96.5 112.1,96.5 112.1,96.5 112.1,96.5
- 112.1,96.5 112.2,96.5 112.2,96.5 112.2,96.5 112.2,96.5 112.2,96.5 112.2,96.5 112.3,96.5 112.3,96.5 112.3,96.5 112.3,96.5
- 112.3,96.5 112.3,96.5 112.4,96.5 112.4,96.5 112.4,96.5 112.4,96.5 112.4,96.5 112.4,96.5 112.5,96.5 112.5,96.5 112.5,96.5
- 112.5,96.5 112.5,96.5 112.5,96.5 112.6,96.5 112.6,96.5 112.6,96.5 112.6,96.5 112.6,96.5 112.7,96.5 112.7,96.5 112.7,96.5
- 112.7,96.5 112.7,96.5 112.7,96.5 112.8,96.5 112.8,96.5 112.8,94.4 112.8,94.4 112.7,94.4 112.7,94.4 112.7,94.4 112.7,94.4
- 112.7,94.4 112.7,94.4 112.6,94.4 112.6,94.4 112.6,94.4 112.6,94.4 112.6,94.4 112.5,94.4 112.5,94.4 112.5,94.4 112.5,94.4
- 112.5,94.4 112.5,94.4 112.4,94.4 112.4,94.4 112.4,94.4 112.4,94.4 112.4,94.4 112.4,94.4 112.3,94.4 112.3,94.4 112.3,94.4
- 112.3,94.4 112.3,94.4 112.3,94.4 112.2,94.4 112.2,94.4 112.2,94.4 112.2,94.4 112.2,94.4 112.2,94.4 112.1,94.4 112.1,94.4
- 112.1,94.4 112.1,94.4 112.1,94.4 112.1,94.4 112,94.4 112,94.4 112,94.4 112,94.4 112,94.4 112,94.4 111.9,94.4 111.9,94.4
- 111.9,94.4 111.9,94.4 111.9,94.4 111.8,94.4 111.8,94.4 111.8,94.4 111.8,94.4 111.8,94.4 111.8,94.4 111.7,94.4 111.7,94.4
- 111.7,94.4 111.7,94.4 111.7,94.4 111.7,94.4 111.6,94.4 111.6,94.4 111.6,94.4 111.6,94.4 111.6,94.4 111.6,94.4 111.5,94.4
- 111.5,94.4 111.5,94.4 111.5,94.4 111.5,94.4 111.5,94.4 111.4,94.4 111.4,94.4 111.4,94.4 111.4,94.4 111.4,94.4 111.4,94.4
- 111.3,94.4 111.3,94.4 111.3,94.4 111.3,94.4 111.3,94.4 111.3,94.4 111.2,94.4 111.2,94.4 111.2,94.4 111.2,94.4 111.2,94.4
- 111.2,94.4 111.1,94.4 111.1,94.4 111.1,94.4 111.1,94.4 111.1,94.4 111,94.4 111,94.4 111,94.4 111,94.4 111,94.4 111,94.4
- 110.9,94.4 110.9,94.4 110.9,94.4 110.9,94.4 110.9,94.4 110.9,94.4 110.8,94.4 110.8,94.4 110.8,94.4 110.8,94.4 110.8,94.4
- 110.8,94.4 110.7,94.4 110.7,94.4 110.7,94.4 110.7,94.4 110.7,94.4 110.7,94.4 110.6,94.4 110.6,94.4 110.6,94.4 110.6,94.4
- 110.6,94.4 110.6,94.4 110.5,94.4 110.5,94.4 110.5,94.4 110.5,94.4 110.5,94.4 110.5,94.4 110.4,94.4 110.4,94.4 110.4,94.4
- 110.4,94.4 110.4,94.4 110.4,94.4 110.3,94.4 110.3,94.4 110.3,94.4 110.3,94.4 110.3,94.4 110.2,94.4 110.2,94.4 110.2,94.4
- 110.2,94.4 110.2,94.4 110.2,94.4 110.1,94.4 110.1,94.4 110.1,94.4 110.1,94.4 110.1,94.4 110.1,94.4 110,94.4 110,94.4
- 110,94.4 110,94.4 110,94.4 110,94.4 109.9,94.4 109.9,94.4 109.9,94.4 109.9,94.4 109.9,94.4 109.9,94.4 109.8,94.4
- 109.8,94.4 109.8,94.4 109.8,94.4 109.8,94.4 109.8,94.4 109.7,94.4 109.7,94.4 109.7,94.4 109.7,94.4 109.7,94.4 109.7,94.4
- 109.6,94.4 109.6,94.4 109.6,94.4 109.6,94.4 109.6,94.4 109.5,94.4 109.5,94.4 109.5,94.4 109.5,94.4 109.5,96.5 109.5,96.5
- "/>
- <linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="112.2248" y1="166.6087" x2="112.2248" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st19" points="114.9,99.8 114.9,99.8 114.8,99.8 114.8,99.8 114.8,99.8 114.8,99.8 114.7,99.8 114.7,99.8
- 114.7,99.8 114.6,99.8 114.6,99.8 114.6,99.8 114.6,99.8 114.5,99.8 114.5,99.8 114.5,99.8 114.4,99.8 114.4,99.8 114.4,99.8
- 114.4,99.8 114.3,99.8 114.3,99.8 114.3,99.8 114.2,99.8 114.2,99.8 114.2,99.8 114.2,99.8 114.1,99.8 114.1,99.8 114.1,99.8
- 114,99.8 114,99.8 114,99.8 114,99.8 113.9,99.8 113.9,99.8 113.9,99.8 113.8,99.8 113.8,99.8 113.8,99.8 113.8,99.8
- 113.7,99.8 113.7,99.8 113.7,99.8 113.6,99.8 113.6,99.8 113.6,99.8 113.6,99.8 113.5,99.8 113.5,99.8 113.5,99.8 113.4,99.8
- 113.4,99.8 113.4,99.8 113.4,99.8 113.3,99.8 113.3,99.8 113.3,99.8 113.2,99.8 113.2,99.8 113.2,99.8 113.2,99.8 113.1,99.8
- 113.1,99.8 113.1,99.8 113,99.8 113,99.8 113,99.8 113,99.8 112.9,99.8 112.9,99.8 112.9,99.8 112.8,99.8 112.8,99.8
- 112.8,99.8 112.8,99.8 112.7,99.8 112.7,99.8 112.7,99.8 112.7,99.8 112.6,99.8 112.6,99.8 112.6,99.8 112.5,99.8 112.5,99.8
- 112.5,99.8 112.5,99.8 112.4,99.8 112.4,99.8 112.4,99.8 112.3,99.8 112.3,99.8 112.3,99.8 112.3,99.8 112.2,99.8 112.2,99.8
- 112.2,99.8 112.1,99.8 112.1,99.8 112.1,99.8 112.1,99.8 112,99.8 112,99.8 112,99.8 111.9,99.8 111.9,99.8 111.9,99.8
- 111.9,99.8 111.8,99.8 111.8,99.8 111.8,99.8 111.7,99.8 111.7,99.8 111.7,99.8 111.7,99.8 111.6,99.8 111.6,99.8 111.6,99.8
- 111.5,99.8 111.5,99.8 111.5,99.8 111.5,99.8 111.4,99.8 111.4,99.8 111.4,99.8 111.3,99.8 111.3,99.8 111.3,99.8 111.3,99.8
- 111.2,99.8 111.2,99.8 111.2,99.8 111.1,99.8 111.1,99.8 111.1,99.8 111.1,99.8 111,99.8 111,99.8 111,99.8 110.9,99.8
- 110.9,99.8 110.9,99.8 110.9,99.8 110.8,99.8 110.8,99.8 110.8,99.8 110.7,99.8 110.7,99.8 110.7,99.8 110.7,99.8 110.6,99.8
- 110.6,99.8 110.6,99.8 110.5,99.8 110.5,99.8 110.5,99.8 110.5,99.8 110.4,99.8 110.4,99.8 110.4,99.8 110.4,99.8 110.3,99.8
- 110.3,99.8 110.3,99.8 110.2,99.8 110.2,99.8 110.2,99.8 110.2,99.8 110.1,99.8 110.1,99.8 110.1,99.8 110,99.8 110,99.8
- 110,99.8 110,99.8 109.9,99.8 109.9,99.8 109.9,99.8 109.8,99.8 109.8,99.8 109.8,99.8 109.8,99.8 109.7,99.8 109.7,99.8
- 109.7,99.8 109.6,99.8 109.6,99.8 109.6,99.8 109.6,99.8 109.5,99.8 109.5,99.8 109.5,101.9 109.5,101.9 109.6,101.9
- 109.6,101.9 109.6,101.9 109.6,101.9 109.7,101.9 109.7,101.9 109.7,101.9 109.8,101.9 109.8,101.9 109.8,101.9 109.8,101.9
- 109.9,101.9 109.9,101.9 109.9,101.9 110,101.9 110,101.9 110,101.9 110,101.9 110.1,101.9 110.1,101.9 110.1,101.9
- 110.2,101.9 110.2,101.9 110.2,101.9 110.2,101.9 110.3,101.9 110.3,101.9 110.3,101.9 110.4,101.9 110.4,101.9 110.4,101.9
- 110.4,101.9 110.5,101.9 110.5,101.9 110.5,101.9 110.5,101.9 110.6,101.9 110.6,101.9 110.6,101.9 110.7,101.9 110.7,101.9
- 110.7,101.9 110.7,101.9 110.8,101.9 110.8,101.9 110.8,101.9 110.9,101.9 110.9,101.9 110.9,101.9 110.9,101.9 111,101.9
- 111,101.9 111,101.9 111.1,101.9 111.1,101.9 111.1,101.9 111.1,101.9 111.2,101.9 111.2,101.9 111.2,101.9 111.3,101.9
- 111.3,101.9 111.3,101.9 111.3,101.9 111.4,101.9 111.4,101.9 111.4,101.9 111.5,101.9 111.5,101.9 111.5,101.9 111.5,101.9
- 111.6,101.9 111.6,101.9 111.6,101.9 111.7,101.9 111.7,101.9 111.7,101.9 111.7,101.9 111.8,101.9 111.8,101.9 111.8,101.9
- 111.9,101.9 111.9,101.9 111.9,101.9 111.9,101.9 112,101.9 112,101.9 112,101.9 112.1,101.9 112.1,101.9 112.1,101.9
- 112.1,101.9 112.2,101.9 112.2,101.9 112.2,101.9 112.3,101.9 112.3,101.9 112.3,101.9 112.3,101.9 112.4,101.9 112.4,101.9
- 112.4,101.9 112.5,101.9 112.5,101.9 112.5,101.9 112.5,101.9 112.6,101.9 112.6,101.9 112.6,101.9 112.7,101.9 112.7,101.9
- 112.7,101.9 112.7,101.9 112.8,101.9 112.8,101.9 112.8,101.9 112.8,101.9 112.9,101.9 112.9,101.9 112.9,101.9 113,101.9
- 113,101.9 113,101.9 113,101.9 113.1,101.9 113.1,101.9 113.1,101.9 113.2,101.9 113.2,101.9 113.2,101.9 113.2,101.9
- 113.3,101.9 113.3,101.9 113.3,101.9 113.4,101.9 113.4,101.9 113.4,101.9 113.4,101.9 113.5,101.9 113.5,101.9 113.5,101.9
- 113.6,101.9 113.6,101.9 113.6,101.9 113.6,101.9 113.7,101.9 113.7,101.9 113.7,101.9 113.8,101.9 113.8,101.9 113.8,101.9
- 113.8,101.9 113.9,101.9 113.9,101.9 113.9,101.9 114,101.9 114,101.9 114,101.9 114,101.9 114.1,101.9 114.1,101.9
- 114.1,101.9 114.2,101.9 114.2,101.9 114.2,101.9 114.2,101.9 114.3,101.9 114.3,101.9 114.3,101.9 114.4,101.9 114.4,101.9
- 114.4,101.9 114.4,101.9 114.5,101.9 114.5,101.9 114.5,101.9 114.6,101.9 114.6,101.9 114.6,101.9 114.6,101.9 114.7,101.9
- 114.7,101.9 114.7,101.9 114.8,101.9 114.8,101.9 114.8,101.9 114.8,101.9 114.9,101.9 114.9,101.9 114.9,101.9 115,101.9
- 115,99.8 114.9,99.8 "/>
- <linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="111.134" y1="166.6087" x2="111.134" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st20" points="109.5,107.4 109.5,107.4 109.6,107.4 109.6,107.4 109.6,107.4 109.6,107.4 109.6,107.4
- 109.7,107.4 109.7,107.4 109.7,107.4 109.7,107.4 109.7,107.4 109.7,107.4 109.8,107.4 109.8,107.4 109.8,107.4 109.8,107.4
- 109.8,107.4 109.8,107.4 109.9,107.4 109.9,107.4 109.9,107.4 109.9,107.4 109.9,107.4 109.9,107.4 110,107.4 110,107.4
- 110,107.4 110,107.4 110,107.4 110,107.4 110.1,107.4 110.1,107.4 110.1,107.4 110.1,107.4 110.1,107.4 110.1,107.4
- 110.2,107.4 110.2,107.4 110.2,107.4 110.2,107.4 110.2,107.4 110.2,107.4 110.3,107.4 110.3,107.4 110.3,107.4 110.3,107.4
- 110.3,107.4 110.4,107.4 110.4,107.4 110.4,107.4 110.4,107.4 110.4,107.4 110.4,107.4 110.5,107.4 110.5,107.4 110.5,107.4
- 110.5,107.4 110.5,107.4 110.5,107.4 110.6,107.4 110.6,107.4 110.6,107.4 110.6,107.4 110.6,107.4 110.6,107.4 110.7,107.4
- 110.7,107.4 110.7,107.4 110.7,107.4 110.7,107.4 110.7,107.4 110.8,107.4 110.8,107.4 110.8,107.4 110.8,107.4 110.8,107.4
- 110.8,107.4 110.9,107.4 110.9,107.4 110.9,107.4 110.9,107.4 110.9,107.4 110.9,107.4 111,107.4 111,107.4 111,107.4
- 111,107.4 111,107.4 111,107.4 111.1,107.4 111.1,107.4 111.1,107.4 111.1,107.4 111.1,107.4 111.2,107.4 111.2,107.4
- 111.2,107.4 111.2,107.4 111.2,107.4 111.2,107.4 111.3,107.4 111.3,107.4 111.3,107.4 111.3,107.4 111.3,107.4 111.3,107.4
- 111.4,107.4 111.4,107.4 111.4,107.4 111.4,107.4 111.4,107.4 111.4,107.4 111.5,107.4 111.5,107.4 111.5,107.4 111.5,107.4
- 111.5,107.4 111.5,107.4 111.6,107.4 111.6,107.4 111.6,107.4 111.6,107.4 111.6,107.4 111.6,107.4 111.7,107.4 111.7,107.4
- 111.7,107.4 111.7,107.4 111.7,107.4 111.7,107.4 111.8,107.4 111.8,107.4 111.8,107.4 111.8,107.4 111.8,107.4 111.8,107.4
- 111.9,107.4 111.9,107.4 111.9,107.4 111.9,107.4 111.9,107.4 112,107.4 112,107.4 112,107.4 112,107.4 112,107.4 112,107.4
- 112.1,107.4 112.1,107.4 112.1,107.4 112.1,107.4 112.1,107.4 112.1,107.4 112.2,107.4 112.2,107.4 112.2,107.4 112.2,107.4
- 112.2,107.4 112.2,107.4 112.3,107.4 112.3,107.4 112.3,107.4 112.3,107.4 112.3,107.4 112.3,107.4 112.4,107.4 112.4,107.4
- 112.4,107.4 112.4,107.4 112.4,107.4 112.4,107.4 112.5,107.4 112.5,107.4 112.5,107.4 112.5,107.4 112.5,107.4 112.5,107.4
- 112.6,107.4 112.6,107.4 112.6,107.4 112.6,107.4 112.6,107.4 112.7,107.4 112.7,107.4 112.7,107.4 112.7,107.4 112.7,107.4
- 112.7,107.4 112.8,107.4 112.8,107.4 112.8,105.3 112.8,105.3 112.7,105.3 112.7,105.3 112.7,105.3 112.7,105.3 112.7,105.3
- 112.7,105.3 112.6,105.3 112.6,105.3 112.6,105.3 112.6,105.3 112.6,105.3 112.5,105.3 112.5,105.3 112.5,105.3 112.5,105.3
- 112.5,105.3 112.5,105.3 112.4,105.3 112.4,105.3 112.4,105.3 112.4,105.3 112.4,105.3 112.4,105.3 112.3,105.3 112.3,105.3
- 112.3,105.3 112.3,105.3 112.3,105.3 112.3,105.3 112.2,105.3 112.2,105.3 112.2,105.3 112.2,105.3 112.2,105.3 112.2,105.3
- 112.1,105.3 112.1,105.3 112.1,105.3 112.1,105.3 112.1,105.3 112.1,105.3 112,105.3 112,105.3 112,105.3 112,105.3 112,105.3
- 112,105.3 111.9,105.3 111.9,105.3 111.9,105.3 111.9,105.3 111.9,105.3 111.8,105.3 111.8,105.3 111.8,105.3 111.8,105.3
- 111.8,105.3 111.8,105.3 111.7,105.3 111.7,105.3 111.7,105.3 111.7,105.3 111.7,105.3 111.7,105.3 111.6,105.3 111.6,105.3
- 111.6,105.3 111.6,105.3 111.6,105.3 111.6,105.3 111.5,105.3 111.5,105.3 111.5,105.3 111.5,105.3 111.5,105.3 111.5,105.3
- 111.4,105.3 111.4,105.3 111.4,105.3 111.4,105.3 111.4,105.3 111.4,105.3 111.3,105.3 111.3,105.3 111.3,105.3 111.3,105.3
- 111.3,105.3 111.3,105.3 111.2,105.3 111.2,105.3 111.2,105.3 111.2,105.3 111.2,105.3 111.2,105.3 111.1,105.3 111.1,105.3
- 111.1,105.3 111.1,105.3 111.1,105.3 111,105.3 111,105.3 111,105.3 111,105.3 111,105.3 111,105.3 110.9,105.3 110.9,105.3
- 110.9,105.3 110.9,105.3 110.9,105.3 110.9,105.3 110.8,105.3 110.8,105.3 110.8,105.3 110.8,105.3 110.8,105.3 110.8,105.3
- 110.7,105.3 110.7,105.3 110.7,105.3 110.7,105.3 110.7,105.3 110.7,105.3 110.6,105.3 110.6,105.3 110.6,105.3 110.6,105.3
- 110.6,105.3 110.6,105.3 110.5,105.3 110.5,105.3 110.5,105.3 110.5,105.3 110.5,105.3 110.5,105.3 110.4,105.3 110.4,105.3
- 110.4,105.3 110.4,105.3 110.4,105.3 110.4,105.3 110.3,105.3 110.3,105.3 110.3,105.3 110.3,105.3 110.3,105.3 110.2,105.3
- 110.2,105.3 110.2,105.3 110.2,105.3 110.2,105.3 110.2,105.3 110.1,105.3 110.1,105.3 110.1,105.3 110.1,105.3 110.1,105.3
- 110.1,105.3 110,105.3 110,105.3 110,105.3 110,105.3 110,105.3 110,105.3 109.9,105.3 109.9,105.3 109.9,105.3 109.9,105.3
- 109.9,105.3 109.9,105.3 109.8,105.3 109.8,105.3 109.8,105.3 109.8,105.3 109.8,105.3 109.8,105.3 109.7,105.3 109.7,105.3
- 109.7,105.3 109.7,105.3 109.7,105.3 109.7,105.3 109.6,105.3 109.6,105.3 109.6,105.3 109.6,105.3 109.6,105.3 109.5,105.3
- 109.5,105.3 109.5,105.3 109.5,105.3 109.5,107.4 109.5,107.4 "/>
- <linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="112.2248" y1="166.6087" x2="112.2248" y2="40.4035">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st21" points="114.9,110.7 114.9,110.7 114.8,110.7 114.8,110.7 114.8,110.7 114.8,110.7 114.7,110.7
- 114.7,110.7 114.7,110.7 114.6,110.7 114.6,110.7 114.6,110.7 114.6,110.7 114.5,110.7 114.5,110.7 114.5,110.7 114.4,110.7
- 114.4,110.7 114.4,110.7 114.4,110.7 114.3,110.7 114.3,110.7 114.3,110.7 114.2,110.7 114.2,110.7 114.2,110.7 114.2,110.7
- 114.1,110.7 114.1,110.7 114.1,110.7 114,110.7 114,110.7 114,110.7 114,110.7 113.9,110.7 113.9,110.7 113.9,110.7
- 113.8,110.7 113.8,110.7 113.8,110.7 113.8,110.7 113.7,110.7 113.7,110.7 113.7,110.7 113.6,110.7 113.6,110.7 113.6,110.7
- 113.6,110.7 113.5,110.7 113.5,110.7 113.5,110.7 113.4,110.7 113.4,110.7 113.4,110.7 113.4,110.7 113.3,110.7 113.3,110.7
- 113.3,110.7 113.2,110.7 113.2,110.7 113.2,110.7 113.2,110.7 113.1,110.7 113.1,110.7 113.1,110.7 113,110.7 113,110.7
- 113,110.7 113,110.7 112.9,110.7 112.9,110.7 112.9,110.7 112.8,110.7 112.8,110.7 112.8,110.7 112.8,110.7 112.7,110.7
- 112.7,110.7 112.7,110.7 112.7,110.7 112.6,110.7 112.6,110.7 112.6,110.7 112.5,110.7 112.5,110.7 112.5,110.7 112.5,110.7
- 112.4,110.7 112.4,110.7 112.4,110.7 112.3,110.7 112.3,110.7 112.3,110.7 112.3,110.7 112.2,110.7 112.2,110.7 112.2,110.7
- 112.1,110.7 112.1,110.7 112.1,110.7 112.1,110.7 112,110.7 112,110.7 112,110.7 111.9,110.7 111.9,110.7 111.9,110.7
- 111.9,110.7 111.8,110.7 111.8,110.7 111.8,110.7 111.7,110.7 111.7,110.7 111.7,110.7 111.7,110.7 111.6,110.7 111.6,110.7
- 111.6,110.7 111.5,110.7 111.5,110.7 111.5,110.7 111.5,110.7 111.4,110.7 111.4,110.7 111.4,110.7 111.3,110.7 111.3,110.7
- 111.3,110.7 111.3,110.7 111.2,110.7 111.2,110.7 111.2,110.7 111.1,110.7 111.1,110.7 111.1,110.7 111.1,110.7 111,110.7
- 111,110.7 111,110.7 110.9,110.7 110.9,110.7 110.9,110.7 110.9,110.7 110.8,110.7 110.8,110.7 110.8,110.7 110.7,110.7
- 110.7,110.7 110.7,110.7 110.7,110.7 110.6,110.7 110.6,110.7 110.6,110.7 110.5,110.7 110.5,110.7 110.5,110.7 110.5,110.7
- 110.4,110.7 110.4,110.7 110.4,110.7 110.4,110.7 110.3,110.7 110.3,110.7 110.3,110.7 110.2,110.7 110.2,110.7 110.2,110.7
- 110.2,110.7 110.1,110.7 110.1,110.7 110.1,110.7 110,110.7 110,110.7 110,110.7 110,110.7 109.9,110.7 109.9,110.7
- 109.9,110.7 109.8,110.7 109.8,110.7 109.8,110.7 109.8,110.7 109.7,110.7 109.7,110.7 109.7,110.7 109.6,110.7 109.6,110.7
- 109.6,110.7 109.6,110.7 109.5,110.7 109.5,110.7 109.5,112.8 109.5,112.8 109.6,112.8 109.6,112.8 109.6,112.8 109.6,112.8
- 109.7,112.8 109.7,112.8 109.7,112.8 109.8,112.8 109.8,112.8 109.8,112.8 109.8,112.8 109.9,112.8 109.9,112.8 109.9,112.8
- 110,112.8 110,112.8 110,112.8 110,112.8 110.1,112.8 110.1,112.8 110.1,112.8 110.2,112.8 110.2,112.8 110.2,112.8
- 110.2,112.8 110.3,112.8 110.3,112.8 110.3,112.8 110.4,112.8 110.4,112.8 110.4,112.8 110.4,112.8 110.5,112.8 110.5,112.8
- 110.5,112.8 110.5,112.8 110.6,112.8 110.6,112.8 110.6,112.8 110.7,112.8 110.7,112.8 110.7,112.8 110.7,112.8 110.8,112.8
- 110.8,112.8 110.8,112.8 110.9,112.8 110.9,112.8 110.9,112.8 110.9,112.8 111,112.8 111,112.8 111,112.8 111.1,112.8
- 111.1,112.8 111.1,112.8 111.1,112.8 111.2,112.8 111.2,112.8 111.2,112.8 111.3,112.8 111.3,112.8 111.3,112.8 111.3,112.8
- 111.4,112.8 111.4,112.8 111.4,112.8 111.5,112.8 111.5,112.8 111.5,112.8 111.5,112.8 111.6,112.8 111.6,112.8 111.6,112.8
- 111.7,112.8 111.7,112.8 111.7,112.8 111.7,112.8 111.8,112.8 111.8,112.8 111.8,112.8 111.9,112.8 111.9,112.8 111.9,112.8
- 111.9,112.8 112,112.8 112,112.8 112,112.8 112.1,112.8 112.1,112.8 112.1,112.8 112.1,112.8 112.2,112.8 112.2,112.8
- 112.2,112.8 112.3,112.8 112.3,112.8 112.3,112.8 112.3,112.8 112.4,112.8 112.4,112.8 112.4,112.8 112.5,112.8 112.5,112.8
- 112.5,112.8 112.5,112.8 112.6,112.8 112.6,112.8 112.6,112.8 112.7,112.8 112.7,112.8 112.7,112.8 112.7,112.8 112.8,112.8
- 112.8,112.8 112.8,112.8 112.8,112.8 112.9,112.8 112.9,112.8 112.9,112.8 113,112.8 113,112.8 113,112.8 113,112.8
- 113.1,112.8 113.1,112.8 113.1,112.8 113.2,112.8 113.2,112.8 113.2,112.8 113.2,112.8 113.3,112.8 113.3,112.8 113.3,112.8
- 113.4,112.8 113.4,112.8 113.4,112.8 113.4,112.8 113.5,112.8 113.5,112.8 113.5,112.8 113.6,112.8 113.6,112.8 113.6,112.8
- 113.6,112.8 113.7,112.8 113.7,112.8 113.7,112.8 113.8,112.8 113.8,112.8 113.8,112.8 113.8,112.8 113.9,112.8 113.9,112.8
- 113.9,112.8 114,112.8 114,112.8 114,112.8 114,112.8 114.1,112.8 114.1,112.8 114.1,112.8 114.2,112.8 114.2,112.8
- 114.2,112.8 114.2,112.8 114.3,112.8 114.3,112.8 114.3,112.8 114.4,112.8 114.4,112.8 114.4,112.8 114.4,112.8 114.5,112.8
- 114.5,112.8 114.5,112.8 114.6,112.8 114.6,112.8 114.6,112.8 114.6,112.8 114.7,112.8 114.7,112.8 114.7,112.8 114.8,112.8
- 114.8,112.8 114.8,112.8 114.8,112.8 114.9,112.8 114.9,112.8 114.9,112.8 115,112.8 115,110.7 114.9,110.7 "/>
- </g>
- </g>
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Shortcut/launcher.svg b/homescreen/qml/images/Shortcut/launcher.svg
deleted file mode 100644
index b6eab24..0000000
--- a/homescreen/qml/images/Shortcut/launcher.svg
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Home" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8"
- style="enable-background:new 0 0 195 216.8;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#FFFFFF;}
- .st1{font-family:'Roboto-Regular';}
- .st2{font-size:11px;}
- .st3{letter-spacing:2;}
- .st4{fill:url(#SVGID_1_);}
- .st5{fill:url(#SVGID_2_);}
- .st6{fill:url(#SVGID_3_);}
- .st7{fill:url(#SVGID_4_);}
- .st8{fill:url(#SVGID_5_);}
-</style>
-<switch>
- <g i:extraneous="self">
- <g>
- <g id="Home_1_">
- <g>
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="99.287" y1="155.911" x2="99.287" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st4" d="M67.3,106.3c-1.2-1.2-1.2-3.2,0-4.4l29.8-28.7c1.1-1.1,3.2-1.2,4.3,0l29.8,28.7c1.2,1.2,1.2,3.2,0,4.4
- l-1.4-1.4c0.4-0.4,0.4-1.1,0-1.5L100,74.6c-0.4-0.4-1.1-0.4-1.5,0l-29.8,28.7c-0.4,0.4-0.4,1.1,0,1.5L67.3,106.3z"/>
- </g>
- <g>
- <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="118.5558" y1="155.911" x2="118.5558" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st5" d="M124.8,90h-2V76.9l-8.4,0l0,4.2h-2v-4.2c0-1.1,0.9-2.1,2.1-2.1h8.4c1.1,0,2.1,0.9,2.1,2.1V90z"/>
- </g>
- <g>
- <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="80.0296" y1="155.911" x2="80.0296" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st6" d="M88.4,138H74.8c-1.7,0-3.1-1.4-3.1-3.1v-14.7h2v14.7c0,0.6,0.5,1.1,1.1,1.1h13.5V138z"/>
- </g>
- <g>
- <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="118.4708" y1="155.911" x2="118.4708" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st7" d="M123.7,138h-13.6v-2h13.6c0.6,0,1.1-0.5,1.1-1.1v-27.2c0-0.6-0.5-1.1-1.1-1.1v-2c1.7,0,3.1,1.4,3.1,3.1
- v27.2C126.8,136.7,125.4,138,123.7,138z"/>
- </g>
- <g>
- <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="98.7235" y1="155.911" x2="98.7235" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st8" d="M105,138.2l0-21l-12.5,0l0,18.9l0,2.1c-1.1,0-2.1-0.9-2.1-2.1v-18.9c0-1.1,0.9-2.1,2.1-2.1H105
- c1.1,0,2.1,0.9,2.1,2.1v18.9C107,137.2,106.1,138.2,105,138.2z"/>
- </g>
- </g>
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Shortcut/launcher_active.svg b/homescreen/qml/images/Shortcut/launcher_active.svg
deleted file mode 100644
index e85c7d8..0000000
--- a/homescreen/qml/images/Shortcut/launcher_active.svg
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Home" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8"
- style="enable-background:new 0 0 195 216.8;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#0DF9FF;}
- .st1{fill:url(#Active_2_1_);}
- .st2{fill:#FFFFFF;}
- .st3{font-family:'Roboto-Regular';}
- .st4{font-size:11px;}
- .st5{letter-spacing:2;}
- .st6{fill:url(#SVGID_1_);}
- .st7{fill:url(#SVGID_2_);}
- .st8{fill:url(#SVGID_3_);}
- .st9{fill:url(#SVGID_4_);}
- .st10{fill:url(#SVGID_5_);}
-</style>
-<switch>
- <g i:extraneous="self">
- <rect id="Active_1" y="214.3" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 195.8833 431.0468)" class="st0" width="195.9" height="2.4"/>
- <linearGradient id="Active_2_1_" gradientUnits="userSpaceOnUse" x1="97.9416" y1="236.9585" x2="97.9416" y2="-68.5304">
- <stop offset="0" style="stop-color:#0DF9FF"/>
- <stop offset="9.208472e-02" style="stop-color:#0DF9FF;stop-opacity:0.853"/>
- <stop offset="0.6264" style="stop-color:#0DF9FF;stop-opacity:0"/>
- </linearGradient>
- <rect id="Active_2" class="st1" width="195.9" height="214.3"/>
- <g>
- <g id="Home_1_">
- <g>
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="99.287" y1="155.911" x2="99.287" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st6" d="M67.3,106.3c-1.2-1.2-1.2-3.2,0-4.4l29.8-28.7c1.1-1.1,3.2-1.2,4.3,0l29.8,28.7c1.2,1.2,1.2,3.2,0,4.4
- l-1.4-1.4c0.4-0.4,0.4-1.1,0-1.5L100,74.6c-0.4-0.4-1.1-0.4-1.5,0l-29.8,28.7c-0.4,0.4-0.4,1.1,0,1.5L67.3,106.3z"/>
- </g>
- <g>
- <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="118.5558" y1="155.911" x2="118.5558" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st7" d="M124.8,90h-2V76.9l-8.4,0l0,4.2h-2v-4.2c0-1.1,0.9-2.1,2.1-2.1h8.4c1.1,0,2.1,0.9,2.1,2.1V90z"/>
- </g>
- <g>
- <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="80.0296" y1="155.911" x2="80.0296" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st8" d="M88.4,138H74.8c-1.7,0-3.1-1.4-3.1-3.1v-14.7h2v14.7c0,0.6,0.5,1.1,1.1,1.1h13.5V138z"/>
- </g>
- <g>
- <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="118.4708" y1="155.911" x2="118.4708" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st9" d="M123.7,138h-13.6v-2h13.6c0.6,0,1.1-0.5,1.1-1.1v-27.2c0-0.6-0.5-1.1-1.1-1.1v-2c1.7,0,3.1,1.4,3.1,3.1
- v27.2C126.8,136.7,125.4,138,123.7,138z"/>
- </g>
- <g>
- <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="98.7235" y1="155.911" x2="98.7235" y2="84.32">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st10" d="M105,138.2l0-21l-12.5,0l0,18.9l0,2.1c-1.1,0-2.1-0.9-2.1-2.1v-18.9c0-1.1,0.9-2.1,2.1-2.1H105
- c1.1,0,2.1,0.9,2.1,2.1v18.9C107,137.2,106.1,138.2,105,138.2z"/>
- </g>
- </g>
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Shortcut/mediaplayer.svg b/homescreen/qml/images/Shortcut/mediaplayer.svg
deleted file mode 100644
index de7448d..0000000
--- a/homescreen/qml/images/Shortcut/mediaplayer.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Multimedia" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8"
- style="enable-background:new 0 0 195 216.8;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#FFFFFF;}
- .st1{font-family:'Roboto-Regular';}
- .st2{font-size:11px;}
- .st3{letter-spacing:2;}
- .st4{fill:url(#SVGID_1_);}
- .st5{fill:url(#SVGID_2_);}
-</style>
-<switch>
- <g i:extraneous="self">
- <g>
- <g id="Multimedia_2_">
- <g>
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="86.8321" y1="146.5267" x2="114.4627" y2="66.8384">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st4" d="M71.3,139.8c-3.8,0-7.2-1.5-8.9-4.5c-1.7-2.9-3.2-8.7,5.7-13.8c2.9-1.7,10.2-2.3,12.4-2.4l0,2.1
- c-2.7,0.1-9.2,0.8-11.4,2.1c-5.6,3.2-7.2,6.9-4.9,10.9c2.3,4,8.7,4.6,14.3,1.3c4-2.3,6.3-6.3,6.4-10.7l-0.1-0.4V82.7l42.9-8.4
- l0.1,42.6c0,4-2,9.8-7.5,13c-6.6,3.8-14.4,2.9-17.2-2.1c-1.7-2.9-3.2-8.7,5.7-13.8c2.6-1.5,8.6-2.3,11.2-2.4l0.1,2.1
- c-2.5,0.1-8,0.8-10.2,2.1c-3.8,2.2-7.8,5.9-4.9,10.9c2.3,4,8.7,4.6,14.3,1.3c4.7-2.7,6.4-7.6,6.4-11.1l-0.1-0.5V76.9l-38.6,7.6
- v39.9l0.1,0.4c0,5.2-2.8,9.9-7.4,12.6C76.9,139,74,139.8,71.3,139.8z"/>
- </g>
- <g>
- <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="89.6871" y1="147.5167" x2="117.3178" y2="67.8283">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st5" points="95.8,99.4 95.3,97.3 119.6,91.6 120.1,93.7 "/>
- </g>
- </g>
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Shortcut/mediaplayer_active.svg b/homescreen/qml/images/Shortcut/mediaplayer_active.svg
deleted file mode 100644
index 16e3af5..0000000
--- a/homescreen/qml/images/Shortcut/mediaplayer_active.svg
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8"
- style="enable-background:new 0 0 195 216.8;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#0DF9FF;}
- .st1{fill:url(#Active_2_1_);}
- .st2{fill:#FFFFFF;}
- .st3{font-family:'Roboto-Regular';}
- .st4{font-size:11px;}
- .st5{letter-spacing:2;}
- .st6{fill:url(#SVGID_1_);}
- .st7{fill:url(#SVGID_2_);}
-</style>
-<switch>
- <g i:extraneous="self">
- <g id="Layer_6">
- <rect id="Active_1" y="214.3" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 195.8833 431.0468)" class="st0" width="195.9" height="2.4"/>
- <linearGradient id="Active_2_1_" gradientUnits="userSpaceOnUse" x1="97.9416" y1="236.9585" x2="97.9416" y2="-68.5304">
- <stop offset="0" style="stop-color:#0DF9FF"/>
- <stop offset="9.208472e-02" style="stop-color:#0DF9FF;stop-opacity:0.853"/>
- <stop offset="0.6264" style="stop-color:#0DF9FF;stop-opacity:0"/>
- </linearGradient>
- <rect id="Active_2" class="st1" width="195.9" height="214.3"/>
- </g>
- <g id="Multimedia">
- <g>
- <g id="Multimedia_2_">
- <g>
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="86.8321" y1="146.5267" x2="114.4627" y2="66.8384">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st6" d="M71.3,139.8c-3.8,0-7.2-1.5-8.9-4.5c-1.7-2.9-3.2-8.7,5.7-13.8c2.9-1.7,10.2-2.3,12.4-2.4l0,2.1
- c-2.7,0.1-9.2,0.8-11.4,2.1c-5.6,3.2-7.2,6.9-4.9,10.9c2.3,4,8.7,4.6,14.3,1.3c4-2.3,6.3-6.3,6.4-10.7l-0.1-0.4V82.7l42.9-8.4
- l0.1,42.6c0,4-2,9.8-7.5,13c-6.6,3.8-14.4,2.9-17.2-2.1c-1.7-2.9-3.2-8.7,5.7-13.8c2.6-1.5,8.6-2.3,11.2-2.4l0.1,2.1
- c-2.5,0.1-8,0.8-10.2,2.1c-3.8,2.2-7.8,5.9-4.9,10.9c2.3,4,8.7,4.6,14.3,1.3c4.7-2.7,6.4-7.6,6.4-11.1l-0.1-0.5V76.9
- l-38.6,7.6v39.9l0.1,0.4c0,5.2-2.8,9.9-7.4,12.6C76.9,139,74,139.8,71.3,139.8z"/>
- </g>
- <g>
- <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="89.6871" y1="147.5167" x2="117.3178" y2="67.8283">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <polygon class="st7" points="95.8,99.4 95.3,97.3 119.6,91.6 120.1,93.7 "/>
- </g>
- </g>
- </g>
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Shortcut/navigation.svg b/homescreen/qml/images/Shortcut/navigation.svg
deleted file mode 100644
index 6f6f1e0..0000000
--- a/homescreen/qml/images/Shortcut/navigation.svg
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Navigation" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8"
- style="enable-background:new 0 0 195 216.8;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#FFFFFF;}
- .st1{font-family:'Roboto-Regular';}
- .st2{font-size:11px;}
- .st3{letter-spacing:2;}
- .st4{fill:url(#SVGID_1_);}
- .st5{fill:url(#SVGID_2_);}
- .st6{fill:url(#SVGID_3_);}
- .st7{fill:url(#SVGID_4_);}
- .st8{fill:url(#SVGID_5_);}
- .st9{fill:url(#SVGID_6_);}
-</style>
-<switch>
- <g i:extraneous="self">
- <g>
- <g>
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="113.767" y1="186.3057" x2="79.8095" y2="21.0462">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st4" d="M103.9,107.1c0-3.5-2.8-6.4-6.4-6.4c-3.5,0-6.4,2.8-6.4,6.4s2.8,6.4,6.4,6.4
- C101,113.5,103.9,110.7,103.9,107.1z M97.5,111.4c-2.3,0-4.2-1.9-4.2-4.2s1.9-4.2,4.2-4.2c2.3,0,4.2,1.9,4.2,4.2
- S99.8,111.4,97.5,111.4z"/>
- <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="126.332" y1="183.7239" x2="92.3746" y2="18.4644">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st5" d="M110.2,105c-1.2,0-2.1,0.9-2.1,2.1c0,4.5-2.8,8.5-7.1,10c-0.8,0.3-1.4,1.1-1.4,2v15.3
- c0,0.6,0.3,1.2,0.7,1.6c0.5,0.4,1.1,0.6,1.7,0.5c14.5-2.3,25.1-14.7,25.1-29.3c0-1.2-0.9-2.1-2.1-2.1H110.2z M101.7,134.3v-15.2
- c4.9-1.8,8.5-6.4,8.5-12H125C125,120.9,114.9,132.3,101.7,134.3z"/>
- <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="115.4429" y1="185.9613" x2="81.4855" y2="20.7018">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st6" d="M97.5,77.5c-12.9,0-24.3,8.3-28.2,20.5c-0.2,0.6-0.1,1.3,0.4,1.9c0.4,0.6,1,0.8,1.7,0.8H88
- c0.6,0,1.1-0.2,1.6-0.7c2-2.3,4.9-3.5,7.9-3.5c3,0,5.9,1.3,7.9,3.5c0.4,0.5,1,0.7,1.6,0.7h16.7c0.7,0,1.3-0.3,1.7-0.8
- c0.4-0.6,0.6-1.3,0.4-1.9C121.8,85.8,110.3,77.5,97.5,77.5z M107,98.7c-2.3-2.6-5.7-4.2-9.5-4.2c-3.7,0-7.1,1.6-9.5,4.2H71.3
- c3.5-11.1,13.9-19.1,26.2-19.1s22.7,8,26.2,19.1H107z"/>
- <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="113.495" y1="186.3616" x2="79.5375" y2="21.1021">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st7" d="M129.3,107.1c0,17.6-14.2,31.8-31.8,31.8s-31.8-14.2-31.8-31.8c0-0.3,0-0.5,0-0.8h-2.1c0,0.3,0,0.5,0,0.8
- c0,18.7,15.2,33.9,33.9,33.9c18.7,0,33.9-15.2,33.9-33.9c0-0.3,0-0.5,0-0.8h-2.1C129.3,106.6,129.3,106.9,129.3,107.1z"/>
- <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="97.0455" y1="189.7416" x2="63.0881" y2="24.4821">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st8" d="M94,117.1c-4.2-1.5-7.1-5.4-7.1-10c0-1.2-0.9-2.1-2.1-2.1H70c-1.2,0-2.1,0.9-2.1,2.1
- c0,14.6,10.7,27,25.1,29.3c0.6,0.1,1.2-0.1,1.7-0.5c0.5-0.4,0.7-1,0.7-1.6v-15.2C95.4,118.2,94.8,117.4,94,117.1z M93.3,134.3
- c-13.2-2-23.3-13.4-23.3-27.2h14.8c0,5.5,3.5,10.2,8.5,12V134.3z"/>
- <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="115.5222" y1="185.9451" x2="81.5647" y2="20.6856">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st9" d="M97.5,75.4c14.5,0,26.7,9.6,30.5,22.9h2.2c-3.9-14.4-17.1-25-32.7-25c-15.6,0-28.8,10.6-32.7,25H67
- C70.8,85,83,75.4,97.5,75.4z"/>
- </g>
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Shortcut/navigation_active.svg b/homescreen/qml/images/Shortcut/navigation_active.svg
deleted file mode 100644
index 9076934..0000000
--- a/homescreen/qml/images/Shortcut/navigation_active.svg
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 195 216.8"
- style="enable-background:new 0 0 195 216.8;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#0DF9FF;}
- .st1{fill:url(#Active_2_1_);}
- .st2{fill:#FFFFFF;}
- .st3{font-family:'Roboto-Regular';}
- .st4{font-size:11px;}
- .st5{letter-spacing:2;}
- .st6{fill:url(#SVGID_1_);}
- .st7{fill:url(#SVGID_2_);}
- .st8{fill:url(#SVGID_3_);}
- .st9{fill:url(#SVGID_4_);}
- .st10{fill:url(#SVGID_5_);}
- .st11{fill:url(#SVGID_6_);}
-</style>
-<switch>
- <g i:extraneous="self">
- <g id="Layer_6">
- <rect id="Active_1" y="214.3" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 195.8833 431.0468)" class="st0" width="195.9" height="2.4"/>
- <linearGradient id="Active_2_1_" gradientUnits="userSpaceOnUse" x1="97.9416" y1="236.9585" x2="97.9416" y2="-68.5304">
- <stop offset="0" style="stop-color:#0DF9FF"/>
- <stop offset="9.208472e-02" style="stop-color:#0DF9FF;stop-opacity:0.853"/>
- <stop offset="0.6264" style="stop-color:#0DF9FF;stop-opacity:0"/>
- </linearGradient>
- <rect id="Active_2" class="st1" width="195.9" height="214.3"/>
- <g>
- <g>
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="113.767" y1="186.3057" x2="79.8095" y2="21.0462">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st6" d="M103.9,107.1c0-3.5-2.8-6.4-6.4-6.4c-3.5,0-6.4,2.8-6.4,6.4s2.8,6.4,6.4,6.4
- C101,113.5,103.9,110.7,103.9,107.1z M97.5,111.4c-2.3,0-4.2-1.9-4.2-4.2s1.9-4.2,4.2-4.2c2.3,0,4.2,1.9,4.2,4.2
- S99.8,111.4,97.5,111.4z"/>
- <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="126.332" y1="183.7239" x2="92.3746" y2="18.4644">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st7" d="M110.2,105c-1.2,0-2.1,0.9-2.1,2.1c0,4.5-2.8,8.5-7.1,10c-0.8,0.3-1.4,1.1-1.4,2v15.3
- c0,0.6,0.3,1.2,0.7,1.6c0.5,0.4,1.1,0.6,1.7,0.5c14.5-2.3,25.1-14.7,25.1-29.3c0-1.2-0.9-2.1-2.1-2.1H110.2z M101.7,134.3
- v-15.2c4.9-1.8,8.5-6.4,8.5-12H125C125,120.9,114.9,132.3,101.7,134.3z"/>
- <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="115.4429" y1="185.9613" x2="81.4855" y2="20.7018">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st8" d="M97.5,77.5c-12.9,0-24.3,8.3-28.2,20.5c-0.2,0.6-0.1,1.3,0.4,1.9c0.4,0.6,1,0.8,1.7,0.8H88
- c0.6,0,1.1-0.2,1.6-0.7c2-2.3,4.9-3.5,7.9-3.5c3,0,5.9,1.3,7.9,3.5c0.4,0.5,1,0.7,1.6,0.7h16.7c0.7,0,1.3-0.3,1.7-0.8
- c0.4-0.6,0.6-1.3,0.4-1.9C121.8,85.8,110.3,77.5,97.5,77.5z M107,98.7c-2.3-2.6-5.7-4.2-9.5-4.2c-3.7,0-7.1,1.6-9.5,4.2H71.3
- c3.5-11.1,13.9-19.1,26.2-19.1s22.7,8,26.2,19.1H107z"/>
- <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="113.495" y1="186.3616" x2="79.5375" y2="21.1021">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st9" d="M129.3,107.1c0,17.6-14.2,31.8-31.8,31.8s-31.8-14.2-31.8-31.8c0-0.3,0-0.5,0-0.8h-2.1c0,0.3,0,0.5,0,0.8
- c0,18.7,15.2,33.9,33.9,33.9c18.7,0,33.9-15.2,33.9-33.9c0-0.3,0-0.5,0-0.8h-2.1C129.3,106.6,129.3,106.9,129.3,107.1z"/>
- <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="97.0455" y1="189.7416" x2="63.0881" y2="24.4821">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st10" d="M94,117.1c-4.2-1.5-7.1-5.4-7.1-10c0-1.2-0.9-2.1-2.1-2.1H70c-1.2,0-2.1,0.9-2.1,2.1
- c0,14.6,10.7,27,25.1,29.3c0.6,0.1,1.2-0.1,1.7-0.5c0.5-0.4,0.7-1,0.7-1.6v-15.2C95.4,118.2,94.8,117.4,94,117.1z M93.3,134.3
- c-13.2-2-23.3-13.4-23.3-27.2h14.8c0,5.5,3.5,10.2,8.5,12V134.3z"/>
- <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="115.5222" y1="185.9451" x2="81.5647" y2="20.6856">
- <stop offset="0" style="stop-color:#00ADDC"/>
- <stop offset="1" style="stop-color:#6BFBFF"/>
- </linearGradient>
- <path class="st11" d="M97.5,75.4c14.5,0,26.7,9.6,30.5,22.9h2.2c-3.9-14.4-17.1-25-32.7-25c-15.6,0-28.8,10.6-32.7,25H67
- C70.8,85,83,75.4,97.5,75.4z"/>
- </g>
- </g>
- </g>
- <g id="Navigation">
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Shortcut/shortcut.qrc b/homescreen/qml/images/Shortcut/shortcut.qrc
deleted file mode 100644
index 5d67341..0000000
--- a/homescreen/qml/images/Shortcut/shortcut.qrc
+++ /dev/null
@@ -1,12 +0,0 @@
-<RCC>
- <qresource prefix="/images/Shortcut">
- <file>launcher.svg</file>
- <file>launcher_active.svg</file>
- <file>hvac.svg</file>
- <file>hvac_active.svg</file>
- <file>mediaplayer.svg</file>
- <file>mediaplayer_active.svg</file>
- <file>navigation.svg</file>
- <file>navigation_active.svg</file>
- </qresource>
-</RCC>
diff --git a/homescreen/qml/images/Status/HMI_Status_Bluetooth_Inactive-01.png b/homescreen/qml/images/Status/HMI_Status_Bluetooth_Inactive-01.png
deleted file mode 100644
index 10bd5a5..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Bluetooth_Inactive-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Bluetooth_On-01.png b/homescreen/qml/images/Status/HMI_Status_Bluetooth_On-01.png
deleted file mode 100644
index 1ff96e1..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Bluetooth_On-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Signal_1Bars-01.png b/homescreen/qml/images/Status/HMI_Status_Signal_1Bars-01.png
deleted file mode 100644
index 44ef700..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Signal_1Bars-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Signal_2Bars-01.png b/homescreen/qml/images/Status/HMI_Status_Signal_2Bars-01.png
deleted file mode 100644
index fe4e776..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Signal_2Bars-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Signal_3Bars-01.png b/homescreen/qml/images/Status/HMI_Status_Signal_3Bars-01.png
deleted file mode 100644
index 892c6ec..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Signal_3Bars-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Signal_4Bars-01.png b/homescreen/qml/images/Status/HMI_Status_Signal_4Bars-01.png
deleted file mode 100644
index f4f033b..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Signal_4Bars-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Signal_Full-01.png b/homescreen/qml/images/Status/HMI_Status_Signal_Full-01.png
deleted file mode 100644
index 18070b9..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Signal_Full-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Signal_NoBars-01.png b/homescreen/qml/images/Status/HMI_Status_Signal_NoBars-01.png
deleted file mode 100644
index 1b77207..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Signal_NoBars-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Wifi_1Bar-01.png b/homescreen/qml/images/Status/HMI_Status_Wifi_1Bar-01.png
deleted file mode 100644
index c72461f..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Wifi_1Bar-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Wifi_2Bars-01.png b/homescreen/qml/images/Status/HMI_Status_Wifi_2Bars-01.png
deleted file mode 100644
index 448dd36..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Wifi_2Bars-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Wifi_3Bars-01.png b/homescreen/qml/images/Status/HMI_Status_Wifi_3Bars-01.png
deleted file mode 100644
index 3e407ad..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Wifi_3Bars-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Wifi_Full-01.png b/homescreen/qml/images/Status/HMI_Status_Wifi_Full-01.png
deleted file mode 100644
index 6f95e97..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Wifi_Full-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/HMI_Status_Wifi_NoBars-01.png b/homescreen/qml/images/Status/HMI_Status_Wifi_NoBars-01.png
deleted file mode 100644
index 07f4f09..0000000
--- a/homescreen/qml/images/Status/HMI_Status_Wifi_NoBars-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Status/status.qrc b/homescreen/qml/images/Status/status.qrc
deleted file mode 100644
index d29c91a..0000000
--- a/homescreen/qml/images/Status/status.qrc
+++ /dev/null
@@ -1,17 +0,0 @@
-<RCC>
- <qresource prefix="/images/Status">
- <file>HMI_Status_Wifi_NoBars-01.png</file>
- <file>HMI_Status_Bluetooth_Inactive-01.png</file>
- <file>HMI_Status_Bluetooth_On-01.png</file>
- <file>HMI_Status_Signal_1Bars-01.png</file>
- <file>HMI_Status_Signal_2Bars-01.png</file>
- <file>HMI_Status_Signal_3Bars-01.png</file>
- <file>HMI_Status_Signal_4Bars-01.png</file>
- <file>HMI_Status_Signal_Full-01.png</file>
- <file>HMI_Status_Signal_NoBars-01.png</file>
- <file>HMI_Status_Wifi_1Bar-01.png</file>
- <file>HMI_Status_Wifi_2Bars-01.png</file>
- <file>HMI_Status_Wifi_3Bars-01.png</file>
- <file>HMI_Status_Wifi_Full-01.png</file>
- </qresource>
-</RCC>
diff --git a/homescreen/qml/images/TopSection_NoText_NoIcons-01.svg b/homescreen/qml/images/TopSection_NoText_NoIcons-01.svg
deleted file mode 100644
index 6841001..0000000
--- a/homescreen/qml/images/TopSection_NoText_NoIcons-01.svg
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1080 217.9"
- style="enable-background:new 0 0 1080 217.9;" xml:space="preserve">
-<style type="text/css">
- .st0{opacity:0.9;fill:#1B1A1D;}
- .st1{opacity:0.9;fill:#27232B;}
- .st2{fill:none;stroke:url(#SVGID_1_);stroke-miterlimit:10;}
- .st3{fill:none;stroke:url(#SVGID_2_);stroke-miterlimit:10;}
- .st4{fill:none;stroke:url(#SVGID_3_);stroke-miterlimit:10;}
- .st5{fill:none;stroke:url(#SVGID_4_);stroke-miterlimit:10;}
- .st6{opacity:0.9;fill:none;stroke:#545157;stroke-miterlimit:10;}
-</style>
-<switch>
- <g i:extraneous="self">
- <rect class="st0" width="784.8" height="214.3"/>
- <rect x="784.8" y="0" class="st1" width="295.2" height="214.3"/>
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="391.5756" y1="107.1501" x2="392.5756" y2="107.1501">
- <stop offset="0.4644" style="stop-color:#000000"/>
- <stop offset="0.4741" style="stop-color:#4D4B51"/>
- </linearGradient>
- <line class="st2" x1="392.1" y1="214.3" x2="392.1" y2="0"/>
- <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="195.6923" y1="107.1501" x2="196.6923" y2="107.1501">
- <stop offset="0.4644" style="stop-color:#000000"/>
- <stop offset="0.4741" style="stop-color:#4D4B51"/>
- </linearGradient>
- <line class="st3" x1="196.2" y1="214.3" x2="196.2" y2="0"/>
- <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="587.4589" y1="107.1501" x2="588.4589" y2="107.1501">
- <stop offset="0.4644" style="stop-color:#000000"/>
- <stop offset="0.4741" style="stop-color:#4D4B51"/>
- </linearGradient>
- <line class="st4" x1="588" y1="214.3" x2="588" y2="0"/>
- <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="783.3421" y1="107.1501" x2="784.3421" y2="107.1501">
- <stop offset="0.4644" style="stop-color:#000000"/>
- <stop offset="0.4741" style="stop-color:#4D4B51"/>
- </linearGradient>
- <line class="st5" x1="783.8" y1="214.3" x2="783.8" y2="0"/>
- <g>
- <line class="st6" x1="815.1" y1="132" x2="983.5" y2="132"/>
- </g>
- <line class="st6" x1="1004.4" y1="-1.1" x2="1004.4" y2="213.2"/>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Utility_Logo_Background-01.svg b/homescreen/qml/images/Utility_Logo_Background-01.svg
deleted file mode 100644
index c289805..0000000
--- a/homescreen/qml/images/Utility_Logo_Background-01.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1080 215"
- style="enable-background:new 0 0 1080 215;" xml:space="preserve">
-<style type="text/css">
- .st0{opacity:0.82;}
- .st1{fill-rule:evenodd;clip-rule:evenodd;fill:url(#SVGID_1_);}
- .st2{opacity:0.9;}
- .st3{fill-rule:evenodd;clip-rule:evenodd;fill:#1B1A1D;}
-</style>
-<switch>
- <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
- <i:pgfRef xlink:href="#adobe_illustrator_pgf">
- </i:pgfRef>
- </foreignObject>
- <g i:extraneous="self">
- <g>
- <g id="box_14_" class="st0">
- <g>
- <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="540" y1="247.5651" x2="540" y2="-6.7541">
- <stop offset="0.2978" style="stop-color:#FFFFFF;stop-opacity:0"/>
- <stop offset="0.3685" style="stop-color:#FAFAFA;stop-opacity:0.1007"/>
- <stop offset="0.4554" style="stop-color:#EBEBEB;stop-opacity:0.2245"/>
- <stop offset="0.5508" style="stop-color:#D2D2D2;stop-opacity:0.3603"/>
- <stop offset="0.6523" style="stop-color:#AFAFAF;stop-opacity:0.5048"/>
- <stop offset="0.7585" style="stop-color:#828282;stop-opacity:0.6562"/>
- <stop offset="0.8689" style="stop-color:#4B4B4B;stop-opacity:0.8133"/>
- <stop offset="0.9806" style="stop-color:#0C0C0C;stop-opacity:0.9724"/>
- <stop offset="1" style="stop-color:#000000"/>
- </linearGradient>
- <rect class="st1" width="1080" height="215"/>
- </g>
- </g>
- <g id="box_17_" class="st2">
- <g>
- <rect class="st3" width="1080" height="215"/>
- </g>
- </g>
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Utility_Logo_Grey-01.svg b/homescreen/qml/images/Utility_Logo_Grey-01.svg
deleted file mode 100644
index 16ac88c..0000000
--- a/homescreen/qml/images/Utility_Logo_Grey-01.svg
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
- <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
- <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
- <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
- <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
- <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
- <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
- <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
- <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
-]>
-<svg version="1.1" id="Layer_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
- xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 215 215"
- style="enable-background:new 0 0 215 215;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#525252;}
-</style>
-<switch>
- <g i:extraneous="self">
- <g>
- <path class="st0" d="M113.8,150.3h4.2v15.3h9.5v3.8h-13.7V150.3z"/>
- <path class="st0" d="M130.9,150.3h4.2v19.1h-4.2V150.3z"/>
- <path class="st0" d="M139.9,150.3h3.9l9,11.8v-11.8h4.2v19.1h-3.6l-9.3-12.2v12.2h-4.2V150.3z"/>
- <path class="st0" d="M169.4,169.7c-2.6,0-4.6-0.7-6.1-2.1c-1.5-1.4-2.2-3.5-2.2-6.4v-10.9h4.2v10.8c0,1.6,0.4,2.7,1.1,3.5
- c0.7,0.8,1.7,1.2,3,1.2c1.3,0,2.3-0.4,3-1.1c0.7-0.8,1.1-1.9,1.1-3.4v-11h4.2v10.8c0,1.5-0.2,2.7-0.6,3.8c-0.4,1.1-1,2-1.7,2.7
- c-0.7,0.7-1.6,1.3-2.7,1.6C171.9,169.5,170.7,169.7,169.4,169.7z"/>
- <path class="st0" d="M187.3,159.7l-6.4-9.4h4.9l4,6.2l4-6.2h4.8l-6.4,9.3l6.7,9.8H194l-4.3-6.6l-4.3,6.6h-4.8L187.3,159.7z"/>
- <path class="st0" d="M24.6,126.9h2l8.4,18.6h-2.2l-2.2-4.9H20.5l-2.2,4.9h-2.1L24.6,126.9z M29.7,138.7l-4.2-9.4l-4.2,9.4H29.7z"
- />
- <path class="st0" d="M37.7,137.7V127h2.1v10.6c0,4,2.1,6.2,5.6,6.2c3.4,0,5.6-2.1,5.6-6.1V127H53v10.6c0,5.4-3.1,8.2-7.7,8.2
- C40.8,145.7,37.7,142.9,37.7,137.7z"/>
- <path class="st0" d="M62.9,128.9h-6.2V127h14.5v1.9H65v16.5h-2.1V128.9z"/>
- <path class="st0" d="M73,136.3L73,136.3c0-5.1,3.8-9.6,9.4-9.6c5.6,0,9.4,4.4,9.4,9.5c0,0,0,0,0,0.1c0,5.1-3.8,9.5-9.4,9.5
- C76.8,145.8,73,141.4,73,136.3z M89.7,136.3L89.7,136.3c0-4.2-3.1-7.7-7.3-7.7c-4.2,0-7.2,3.4-7.2,7.6v0.1c0,4.2,3.1,7.6,7.3,7.6
- C86.6,143.8,89.7,140.5,89.7,136.3z"/>
- <path class="st0" d="M96.2,127h2.1l6.7,10.1l6.7-10.1h2.1v18.5h-2.1v-15l-6.7,9.9H105l-6.7-9.9v14.9h-2V127z"/>
- <path class="st0" d="M145.2,128.9H139V127h14.5v1.9h-6.2v16.5h-2.1V128.9z"/>
- <path class="st0" d="M157.6,127h2.1v18.5h-2.1V127z"/>
- <path class="st0" d="M163.5,127h2.3l6.6,15.9L179,127h2.2l-7.9,18.6h-1.8L163.5,127z"/>
- <path class="st0" d="M184.8,127h13.3v1.9h-11.3v6.3H197v1.9h-10.1v6.5h11.4v1.9h-13.5V127z"/>
- <rect x="105.6" y="55.1" class="st0" width="3.8" height="16.8"/>
-
- <rect x="69.3" y="69.6" transform="matrix(0.707 -0.7072 0.7072 0.707 -34.2747 73.1702)" class="st0" width="3.8" height="16.8"/>
- <rect x="155.1" y="104.5" class="st0" width="16.8" height="3.8"/>
- <rect x="47.4" y="104.5" class="st0" width="16.8" height="3.8"/>
- <path class="st0" d="M43.7,113.9c2.1-34.7,31-62.4,66.2-62.4c35.2,0,64.2,27.6,66.2,62.4h6.4c-2.1-38.3-33.8-68.8-72.6-68.8
- s-70.5,30.5-72.6,68.8H43.7z"/>
- <circle class="st0" cx="107.5" cy="114.9" r="6.7"/>
-
- <rect x="107.1" y="88.5" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -24.9453 120.6025)" class="st0" width="52" height="3.8"/>
- <rect x="86.9" y="78" class="st0" width="9.2" height="9.2"/>
- <rect x="97.6" y="78" class="st0" width="9.2" height="9.2"/>
- <rect x="108.3" y="78" class="st0" width="9.2" height="9.2"/>
- <rect x="118.9" y="78" class="st0" width="9.2" height="9.2"/>
- <g>
- <g>
- <path class="st0" d="M35.1,153.7l-1.5,1.4c-1.1-1-2.2-1.8-3.5-2.4c-1.3-0.5-2.5-0.8-3.7-0.8c-1.5,0-2.9,0.4-4.2,1.1
- c-1.3,0.7-2.4,1.7-3.1,3c-0.7,1.2-1.1,2.6-1.1,4c0,1.4,0.4,2.8,1.1,4.1c0.8,1.3,1.8,2.3,3.2,3c1.3,0.7,2.8,1.1,4.4,1.1
- c1.9,0,3.6-0.5,4.9-1.6c1.3-1.1,2.1-2.5,2.4-4.3h-6v-1.8h8.2c0,2.9-0.9,5.2-2.6,7c-1.7,1.7-4,2.6-6.9,2.6
- c-3.5,0-6.3-1.2-8.3-3.6c-1.6-1.8-2.4-4-2.4-6.4c0-1.8,0.5-3.5,1.4-5c0.9-1.5,2.1-2.8,3.7-3.6c1.6-0.9,3.3-1.3,5.3-1.3
- c1.6,0,3.1,0.3,4.5,0.9C32.4,151.5,33.8,152.4,35.1,153.7z"/>
- <path class="st0" d="M39.9,150.5h3.8c2.1,0,3.5,0.1,4.3,0.3c1.1,0.3,2,0.8,2.7,1.7c0.7,0.8,1.1,1.9,1.1,3.1
- c0,1-0.2,1.9-0.7,2.7c-0.5,0.8-1.2,1.4-2.1,1.8c-0.9,0.4-2.1,0.6-3.7,0.6l6.8,8.8h-2.3l-6.8-8.8h-1.1v8.8h-1.9V150.5z
- M41.8,152.3v6.4l3.3,0c1.3,0,2.2-0.1,2.8-0.4c0.6-0.2,1.1-0.6,1.4-1.2c0.3-0.5,0.5-1.1,0.5-1.8c0-0.6-0.2-1.2-0.5-1.7
- s-0.8-0.9-1.4-1.1c-0.6-0.2-1.5-0.3-2.8-0.3H41.8z"/>
- <path class="st0" d="M63.6,150.5l8.8,18.9h-2l-3-6.2h-8.2l-2.9,6.2h-2.1l8.9-18.9H63.6z M63.3,154.5l-3.2,6.9h6.5L63.3,154.5z"
- />
- <path class="st0" d="M75.3,169.4v-18.9h3.9c2.8,0,4.9,0.2,6.2,0.7c1.8,0.6,3.3,1.8,4.3,3.3c1,1.6,1.6,3.5,1.6,5.7
- c0,1.9-0.4,3.6-1.2,5c-0.8,1.4-1.9,2.5-3.2,3.2c-1.3,0.7-3.1,1-5.5,1H75.3z M77.1,167.6h2.2c2.6,0,4.4-0.2,5.4-0.5
- c1.4-0.5,2.5-1.3,3.4-2.5c0.8-1.2,1.2-2.7,1.2-4.4c0-1.8-0.4-3.4-1.3-4.7c-0.9-1.3-2.1-2.2-3.7-2.7c-1.2-0.4-3.1-0.5-5.9-0.5
- h-1.3V167.6z"/>
- <path class="st0" d="M95,150.5h10.9v1.9h-9v5.9h8.9v1.9h-8.9v7.4h8.9v1.9H95V150.5z"/>
- </g>
- </g>
- <g>
- <polygon class="st0" points="121.4,141.8 121.4,134.4 117.7,134.4 117.7,145.4 128.7,145.4 128.7,141.8 "/>
- <polygon class="st0" points="136.1,127 117.7,127 117.7,132.6 121.4,132.6 121.4,130.7 132.4,130.7 132.4,141.8 130.6,141.8
- 130.6,145.4 136.1,145.4 "/>
- </g>
- </g>
- </g>
-</switch>
-</svg>
diff --git a/homescreen/qml/images/Utility_Music_Background-01.png b/homescreen/qml/images/Utility_Music_Background-01.png
deleted file mode 100644
index c3e9f91..0000000
--- a/homescreen/qml/images/Utility_Music_Background-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Utility_Radio_Background-01.png b/homescreen/qml/images/Utility_Radio_Background-01.png
deleted file mode 100644
index b755843..0000000
--- a/homescreen/qml/images/Utility_Radio_Background-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Weather/WeatherIcons_ALL-01.png b/homescreen/qml/images/Weather/WeatherIcons_ALL-01.png
deleted file mode 100644
index f5f8b19..0000000
--- a/homescreen/qml/images/Weather/WeatherIcons_ALL-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Weather/WeatherIcons_Cloudy-01.png b/homescreen/qml/images/Weather/WeatherIcons_Cloudy-01.png
deleted file mode 100644
index 3603a55..0000000
--- a/homescreen/qml/images/Weather/WeatherIcons_Cloudy-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Weather/WeatherIcons_Moon-01.png b/homescreen/qml/images/Weather/WeatherIcons_Moon-01.png
deleted file mode 100644
index 8fe1e18..0000000
--- a/homescreen/qml/images/Weather/WeatherIcons_Moon-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Weather/WeatherIcons_PartiallyCloudy-01.png b/homescreen/qml/images/Weather/WeatherIcons_PartiallyCloudy-01.png
deleted file mode 100644
index 09cd84f..0000000
--- a/homescreen/qml/images/Weather/WeatherIcons_PartiallyCloudy-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Weather/WeatherIcons_Rain-01.png b/homescreen/qml/images/Weather/WeatherIcons_Rain-01.png
deleted file mode 100644
index 125b413..0000000
--- a/homescreen/qml/images/Weather/WeatherIcons_Rain-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Weather/WeatherIcons_Snow-01.png b/homescreen/qml/images/Weather/WeatherIcons_Snow-01.png
deleted file mode 100644
index d0a9520..0000000
--- a/homescreen/qml/images/Weather/WeatherIcons_Snow-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Weather/WeatherIcons_Sun-01.png b/homescreen/qml/images/Weather/WeatherIcons_Sun-01.png
deleted file mode 100644
index ee3a744..0000000
--- a/homescreen/qml/images/Weather/WeatherIcons_Sun-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Weather/WeatherIcons_Thunderstorm-01.png b/homescreen/qml/images/Weather/WeatherIcons_Thunderstorm-01.png
deleted file mode 100644
index f6959f4..0000000
--- a/homescreen/qml/images/Weather/WeatherIcons_Thunderstorm-01.png
+++ /dev/null
Binary files differ
diff --git a/homescreen/qml/images/Weather/weather.qrc b/homescreen/qml/images/Weather/weather.qrc
deleted file mode 100644
index 2668fec..0000000
--- a/homescreen/qml/images/Weather/weather.qrc
+++ /dev/null
@@ -1,12 +0,0 @@
-<RCC>
- <qresource prefix="/images/Weather">
- <file>WeatherIcons_ALL-01.png</file>
- <file>WeatherIcons_Cloudy-01.png</file>
- <file>WeatherIcons_Moon-01.png</file>
- <file>WeatherIcons_PartiallyCloudy-01.png</file>
- <file>WeatherIcons_Rain-01.png</file>
- <file>WeatherIcons_Snow-01.png</file>
- <file>WeatherIcons_Sun-01.png</file>
- <file>WeatherIcons_Thunderstorm-01.png</file>
- </qresource>
-</RCC>
diff --git a/homescreen/qml/images/images.qrc b/homescreen/qml/images/images.qrc
deleted file mode 100644
index 37ad676..0000000
--- a/homescreen/qml/images/images.qrc
+++ /dev/null
@@ -1,10 +0,0 @@
-<RCC>
- <qresource prefix="/images">
- <file>TopSection_NoText_NoIcons-01.svg</file>
- <file>Utility_Logo_Background-01.svg</file>
- <file>Utility_Logo_Grey-01.svg</file>
- <file>Utility_Music_Background-01.png</file>
- <file>Utility_Radio_Background-01.png</file>
- <file>AGL_HMI_Blue_Background_NoCar-01.png</file>
- </qresource>
-</RCC>
diff --git a/homescreen/qml/main.qml b/homescreen/qml/main.qml
deleted file mode 100644
index 7d40276..0000000
--- a/homescreen/qml/main.qml
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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.2
-import QtQuick.Window 2.1
-import QtQuick.Layouts 1.1
-import HomeScreen 1.0
-
-Window {
- visible: true
- flags: Qt.FramelessWindowHint
- width: container.width * container.scale
- height: container.height * container.scale
- title: 'HomeScreen'
-
- Image {
- id: container
- anchors.centerIn: parent
- width: 1080
- height: 1920
- scale: screenInfo.scale_factor()
- source: './images/AGL_HMI_Blue_Background_NoCar-01.png'
-
- ColumnLayout {
- anchors.fill: parent
- spacing: 0
- TopArea {
- id: topArea
- Layout.fillWidth: true
- Layout.preferredHeight: 218
- }
-
- Item {
- id: applicationArea
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.preferredHeight: 1920 - 218 - 215
-
- visible: true
- }
-
- MediaArea {
- id: mediaArea
- Layout.fillWidth: true
- Layout.fillHeight: true
- Layout.preferredHeight: 215
- }
- }
- }
-
- Timer {
- id:informationTimer
- interval: 3000
- running: false
- repeat: true
- onTriggered: {
- bottomInformation.visible = false
- }
- }
-
- Item {
- id: bottomInformation
- width: parent.width
- height: 215
- anchors.bottom: parent.bottom
- visible: false
- Text {
- id: bottomText
- anchors.centerIn: parent
- font.pixelSize: 25
- font.letterSpacing: 5
- horizontalAlignment: Text.AlignHCenter
- color: "white"
- text: ""
- z:1
- }
- }
-
- Connections {
- target: homescreenHandler
- onShowInformation: {
- bottomText.text = info
- bottomInformation.visible = true
- informationTimer.restart()
- }
- }
-
- Timer {
- id:notificationTimer
- interval: 3000
- running: false
- repeat: true
- onTriggered: notificationItem.visible = false
- }
-
- Item {
- id: notificationItem
- x: 0
- y: 0
- z: 1
- width: 1280
- height: 100
- opacity: 0.8
- visible: false
-
- Rectangle {
- width: parent.width
- height: parent.height
- anchors.fill: parent
- color: "gray"
- Image {
- id: notificationIcon
- width: 70
- height: 70
- anchors.left: parent.left
- anchors.leftMargin: 20
- anchors.verticalCenter: parent.verticalCenter
- source: ""
- }
-
- Text {
- id: notificationtext
- font.pixelSize: 25
- anchors.left: notificationIcon.right
- anchors.leftMargin: 5
- anchors.verticalCenter: parent.verticalCenter
- color: "white"
- text: qsTr("")
- }
- }
- }
-
- Connections {
- target: homescreenHandler
- onShowNotification: {
- notificationIcon.source = icon_path
- notificationtext.text = text
- notificationItem.visible = true
- notificationTimer.restart()
- }
- }
-}
diff --git a/homescreen/qml/qml.qrc b/homescreen/qml/qml.qrc
deleted file mode 100644
index e60ea63..0000000
--- a/homescreen/qml/qml.qrc
+++ /dev/null
@@ -1,14 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>main.qml</file>
- <file>MediaArea.qml</file>
- <file>MediaAreaBlank.qml</file>
- <file>MediaAreaMusic.qml</file>
- <file>MediaAreaRadio.qml</file>
- <file>ShortcutArea.qml</file>
- <file>ShortcutIcon.qml</file>
- <file>StatusArea.qml</file>
- <file>TopArea.qml</file>
- <file>IconItem.qml</file>
- </qresource>
-</RCC>
diff --git a/homescreen/src/applicationlauncher.cpp b/homescreen/src/applicationlauncher.cpp
deleted file mode 100644
index 5a1e2d6..0000000
--- a/homescreen/src/applicationlauncher.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "applicationlauncher.h"
-
-#include "afm_user_daemon_proxy.h"
-
-#include "hmi-debug.h"
-
-extern org::AGL::afm::user *afm_user_daemon_proxy;
-
-ApplicationLauncher::ApplicationLauncher(QObject *parent)
- : QObject(parent)
- , m_launching(false)
- , m_timeout(new QTimer(this))
-{
- m_timeout->setInterval(3000);
- m_timeout->setSingleShot(true);
- connect(m_timeout, &QTimer::timeout, [&]() {
- setLaunching(false);
- });
- connect(this, &ApplicationLauncher::launchingChanged, [&](bool launching) {
- if (launching)
- m_timeout->start();
- else
- m_timeout->stop();
- });
- connect(this, &ApplicationLauncher::currentChanged, [&]() {
- setLaunching(false);
- });
-}
-
-int ApplicationLauncher::launch(const QString &application)
-{
- int result = -1;
- HMI_DEBUG("HomeScreen","ApplicationLauncher launch %s.", application.toStdString().c_str());
-
- result = afm_user_daemon_proxy->start(application).value().toInt();
- HMI_DEBUG("HomeScreen","ApplicationLauncher pid: %d.", result);
-
- if (result > 1) {
- setLaunching(true);
- }
-
- return result;
-}
-
-bool ApplicationLauncher::isLaunching() const
-{
- return m_launching;
-}
-
-void ApplicationLauncher::setLaunching(bool launching)
-{
- if (m_launching == launching) return;
- m_launching = launching;
- launchingChanged(launching);
-}
-
-QString ApplicationLauncher::current() const
-{
- return m_current;
-}
-
-void ApplicationLauncher::setCurrent(const QString &current)
-{
- if (m_current == current) return;
- m_current = current;
- emit currentChanged(current);
-}
diff --git a/homescreen/src/applicationlauncher.h b/homescreen/src/applicationlauncher.h
deleted file mode 100644
index dfa5846..0000000
--- a/homescreen/src/applicationlauncher.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef APPLICATIONLAUNCHER_H
-#define APPLICATIONLAUNCHER_H
-
-#include <QtCore/QObject>
-
-class QTimer;
-
-class ApplicationLauncher : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(bool launching READ isLaunching NOTIFY launchingChanged)
- Q_PROPERTY(QString current READ current WRITE setCurrent NOTIFY currentChanged)
-public:
- explicit ApplicationLauncher(QObject *parent = NULL);
-
- bool isLaunching() const;
- QString current() const;
-
-signals:
- void newAppRequestsToBeVisible(int pid);
- void launchingChanged(bool launching);
- void currentChanged(const QString &current);
-
-public slots:
- int launch(const QString &application);
- void setCurrent(const QString &current);
-
-private:
- void setLaunching(bool launching);
-
-private:
- bool m_launching;
- QString m_current;
- QTimer *m_timeout;
-};
-
-#endif // APPLICATIONLAUNCHER_H
diff --git a/homescreen/src/hmi-debug.h b/homescreen/src/hmi-debug.h
deleted file mode 100644
index 28705f5..0000000
--- a/homescreen/src/hmi-debug.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __HMI_DEBUG_H__
-#define __HMI_DEBUG_H__
-
-#include <time.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <stdlib.h>
-
-enum LOG_LEVEL{
- LOG_LEVEL_NONE = 0,
- LOG_LEVEL_ERROR,
- LOG_LEVEL_WARNING,
- LOG_LEVEL_NOTICE,
- LOG_LEVEL_INFO,
- LOG_LEVEL_DEBUG,
- LOG_LEVEL_MAX = LOG_LEVEL_DEBUG
-};
-
-#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
-
-#define HMI_ERROR(prefix, args,...) _HMI_LOG(LOG_LEVEL_ERROR, __FILENAME__, __FUNCTION__, __LINE__, prefix, args, ##__VA_ARGS__)
-#define HMI_WARNING(prefix, args,...) _HMI_LOG(LOG_LEVEL_WARNING, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__)
-#define HMI_NOTICE(prefix, args,...) _HMI_LOG(LOG_LEVEL_NOTICE, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__)
-#define HMI_INFO(prefix, args,...) _HMI_LOG(LOG_LEVEL_INFO, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__)
-#define HMI_DEBUG(prefix, args,...) _HMI_LOG(LOG_LEVEL_DEBUG, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__)
-
-static char ERROR_FLAG[6][20] = {"NONE", "ERROR", "WARNING", "NOTICE", "INFO", "DEBUG"};
-
-static void _HMI_LOG(enum LOG_LEVEL level, const char* file, const char* func, const int line, const char* prefix, const char* log, ...)
-{
- const int log_level = (getenv("USE_HMI_DEBUG") == NULL)?LOG_LEVEL_ERROR:atoi(getenv("USE_HMI_DEBUG"));
- if(log_level < level)
- {
- return;
- }
-
- char *message;
- struct timespec tp;
- unsigned int time;
-
- clock_gettime(CLOCK_REALTIME, &tp);
- time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000);
-
- va_list args;
- va_start(args, log);
- if (log == NULL || vasprintf(&message, log, args) < 0)
- message = NULL;
- fprintf(stderr, "[%10.3f] [%s %s] [%s, %s(), Line:%d] >>> %s \n", time / 1000.0, prefix, ERROR_FLAG[level], file, func, line, message);
- va_end(args);
- free(message);
-}
-
-#endif //__HMI_DEBUG_H__
diff --git a/homescreen/src/homescreenhandler.cpp b/homescreen/src/homescreenhandler.cpp
deleted file mode 100644
index 4db60fb..0000000
--- a/homescreen/src/homescreenhandler.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2017, 2018, 2019 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <QFileInfo>
-#include "homescreenhandler.h"
-#include <functional>
-#include "hmi-debug.h"
-
-void* HomescreenHandler::myThis = 0;
-
-HomescreenHandler::HomescreenHandler(QObject *parent) :
- QObject(parent),
- mp_hs(NULL)
-{
-
-}
-
-HomescreenHandler::~HomescreenHandler()
-{
- if (mp_hs != NULL) {
- delete mp_hs;
- }
-}
-
-void HomescreenHandler::init(int port, const char *token)
-{
- mp_hs = new LibHomeScreen();
- mp_hs->init(port, token);
-
- myThis = this;
-
- mp_hs->registerCallback(nullptr, HomescreenHandler::onRep_static);
-
- mp_hs->set_event_handler(LibHomeScreen::Event_OnScreenMessage, [this](json_object *object){
- const char *display_message = json_object_get_string(
- json_object_object_get(object, "display_message"));
- HMI_DEBUG("HomeScreen","set_event_handler Event_OnScreenMessage display_message = %s", display_message);
- });
-
- mp_hs->set_event_handler(LibHomeScreen::Event_ShowNotification,[this](json_object *object){
- json_object *p_obj = json_object_object_get(object, "parameter");
- const char *icon = json_object_get_string(
- json_object_object_get(p_obj, "icon"));
- const char *text = json_object_get_string(
- json_object_object_get(p_obj, "text"));
- const char *app_id = json_object_get_string(
- json_object_object_get(p_obj, "caller"));
- HMI_DEBUG("HomeScreen","Event_ShowNotification icon=%s, text=%s, caller=%s", icon, text, app_id);
- QFileInfo icon_file(icon);
- QString icon_path;
- if (icon_file.isFile() && icon_file.exists()) {
- icon_path = QString(QLatin1String(icon));
- } else {
- icon_path = "./images/Utility_Logo_Grey-01.svg";
- }
-
- emit showNotification(QString(QLatin1String(app_id)), icon_path, QString(QLatin1String(text)));
- });
-
- mp_hs->set_event_handler(LibHomeScreen::Event_ShowInformation,[this](json_object *object){
- json_object *p_obj = json_object_object_get(object, "parameter");
- const char *info = json_object_get_string(
- json_object_object_get(p_obj, "info"));
-
- emit showInformation(QString(QLatin1String(info)));
- });
-}
-
-void HomescreenHandler::tapShortcut(QString application_id)
-{
- HMI_DEBUG("HomeScreen","tapShortcut %s", application_id.toStdString().c_str());
- struct json_object* j_json = json_object_new_object();
- struct json_object* value;
- value = json_object_new_string("normal.full");
- json_object_object_add(j_json, "area", value);
-
- mp_hs->showWindow(application_id.toStdString().c_str(), j_json);
-}
-
-void HomescreenHandler::onRep_static(struct json_object* reply_contents)
-{
- static_cast<HomescreenHandler*>(HomescreenHandler::myThis)->onRep(reply_contents);
-}
-
-void HomescreenHandler::onEv_static(const string& event, struct json_object* event_contents)
-{
- static_cast<HomescreenHandler*>(HomescreenHandler::myThis)->onEv(event, event_contents);
-}
-
-void HomescreenHandler::onRep(struct json_object* reply_contents)
-{
- const char* str = json_object_to_json_string(reply_contents);
- HMI_DEBUG("HomeScreen","HomeScreen onReply %s", str);
-}
-
-void HomescreenHandler::onEv(const string& event, struct json_object* event_contents)
-{
- const char* str = json_object_to_json_string(event_contents);
- HMI_DEBUG("HomeScreen","HomeScreen onEv %s, contents: %s", event.c_str(), str);
-
- if (event.compare("homescreen/on_screen_message") == 0) {
- struct json_object *json_data = json_object_object_get(event_contents, "data");
- struct json_object *json_display_message = json_object_object_get(json_data, "display_message");
- const char* display_message = json_object_get_string(json_display_message);
-
- HMI_DEBUG("HomeScreen","display_message = %s", display_message);
- }
-}
diff --git a/homescreen/src/homescreenhandler.h b/homescreen/src/homescreenhandler.h
deleted file mode 100644
index 5dfe041..0000000
--- a/homescreen/src/homescreenhandler.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef HOMESCREENHANDLER_H
-#define HOMESCREENHANDLER_H
-
-#include <QObject>
-#include <libhomescreen.hpp>
-#include <string>
-
-using namespace std;
-
-class HomescreenHandler : public QObject
-{
- Q_OBJECT
-public:
- explicit HomescreenHandler(QObject *parent = 0);
- ~HomescreenHandler();
-
- void init(int port, const char* token);
-
- Q_INVOKABLE void tapShortcut(QString application_id);
-
- void onRep(struct json_object* reply_contents);
- void onEv(const string& event, struct json_object* event_contents);
-
- static void* myThis;
- static void onRep_static(struct json_object* reply_contents);
- static void onEv_static(const string& event, struct json_object* event_contents);
-
-signals:
- void showNotification(QString application_id, QString icon_path, QString text);
- void showInformation(QString info);
-private:
- LibHomeScreen *mp_hs;
-};
-
-#endif // HOMESCREENHANDLER_H
diff --git a/homescreen/src/main.cpp b/homescreen/src/main.cpp
deleted file mode 100644
index 5f283fb..0000000
--- a/homescreen/src/main.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- * Copyright (c) 2017, 2018 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <QGuiApplication>
-#include <QCommandLineParser>
-#include <QtGui/QGuiApplication>
-#include <QtQml/QQmlApplicationEngine>
-#include <QtQml/QQmlContext>
-#include <QtQml/qqml.h>
-#include <QQuickWindow>
-
-#include <qlibwindowmanager.h>
-#include <weather.h>
-#include <bluetooth.h>
-#include "applicationlauncher.h"
-#include "statusbarmodel.h"
-#include "afm_user_daemon_proxy.h"
-#include "mastervolume.h"
-#include "homescreenhandler.h"
-#include "hmi-debug.h"
-
-// XXX: We want this DBus connection to be shared across the different
-// QML objects, is there another way to do this, a nice way, perhaps?
-org::AGL::afm::user *afm_user_daemon_proxy;
-
-namespace {
-
-struct Cleanup {
- static inline void cleanup(org::AGL::afm::user *p) {
- delete p;
- afm_user_daemon_proxy = Q_NULLPTR;
- }
-};
-
-void noOutput(QtMsgType, const QMessageLogContext &, const QString &)
-{
-}
-
-}
-
-int main(int argc, char *argv[])
-{
- QGuiApplication a(argc, argv);
-
- // use launch process
- QScopedPointer<org::AGL::afm::user, Cleanup> afm_user_daemon_proxy(new org::AGL::afm::user("org.AGL.afm.user",
- "/org/AGL/afm/user",
- QDBusConnection::sessionBus(),
- 0));
- ::afm_user_daemon_proxy = afm_user_daemon_proxy.data();
-
- QCoreApplication::setOrganizationDomain("LinuxFoundation");
- QCoreApplication::setOrganizationName("AutomotiveGradeLinux");
- QCoreApplication::setApplicationName("HomeScreen");
- QCoreApplication::setApplicationVersion("0.7.0");
-
- QCommandLineParser parser;
- parser.addPositionalArgument("port", a.translate("main", "port for binding"));
- parser.addPositionalArgument("secret", a.translate("main", "secret for binding"));
- parser.addHelpOption();
- parser.addVersionOption();
- parser.process(a);
- QStringList positionalArguments = parser.positionalArguments();
-
- int port = 1700;
- QString token = "wm";
- QString graphic_role = "homescreen"; // defined in layers.json in Window Manager
-
- if (positionalArguments.length() == 2) {
- port = positionalArguments.takeFirst().toInt();
- token = positionalArguments.takeFirst();
- }
-
- HMI_DEBUG("HomeScreen","port = %d, token = %s", port, token.toStdString().c_str());
-
- // import C++ class to QML
- // qmlRegisterType<ApplicationLauncher>("HomeScreen", 1, 0, "ApplicationLauncher");
- qmlRegisterType<StatusBarModel>("HomeScreen", 1, 0, "StatusBarModel");
- qmlRegisterType<MasterVolume>("MasterVolume", 1, 0, "MasterVolume");
-
- ApplicationLauncher *launcher = new ApplicationLauncher();
- QLibWindowmanager* layoutHandler = new QLibWindowmanager();
- if(layoutHandler->init(port,token) != 0){
- exit(EXIT_FAILURE);
- }
-
- AGLScreenInfo screenInfo(layoutHandler->get_scale_factor());
-
- if (layoutHandler->requestSurface(graphic_role) != 0) {
- exit(EXIT_FAILURE);
- }
-
- layoutHandler->set_event_handler(QLibWindowmanager::Event_SyncDraw, [layoutHandler, &graphic_role](json_object *object) {
- layoutHandler->endDraw(graphic_role);
- });
-
- layoutHandler->set_event_handler(QLibWindowmanager::Event_ScreenUpdated, [layoutHandler, launcher](json_object *object) {
- json_object *jarray = json_object_object_get(object, "ids");
- int arrLen = json_object_array_length(jarray);
- for( int idx = 0; idx < arrLen; idx++)
- {
- QString label = QString(json_object_get_string( json_object_array_get_idx(jarray, idx) ));
- HMI_DEBUG("HomeScreen","Event_ScreenUpdated application: %s.", label.toStdString().c_str());
- QMetaObject::invokeMethod(launcher, "setCurrent", Qt::QueuedConnection, Q_ARG(QString, label));
- }
- });
-
- HomescreenHandler* homescreenHandler = new HomescreenHandler();
- homescreenHandler->init(port, token.toStdString().c_str());
-
- QUrl bindingAddress;
- bindingAddress.setScheme(QStringLiteral("ws"));
- bindingAddress.setHost(QStringLiteral("localhost"));
- bindingAddress.setPort(port);
- bindingAddress.setPath(QStringLiteral("/api"));
-
- QUrlQuery query;
- query.addQueryItem(QStringLiteral("token"), token);
- bindingAddress.setQuery(query);
-
- // mail.qml loading
- QQmlApplicationEngine engine;
- engine.rootContext()->setContextProperty("bindingAddress", bindingAddress);
- engine.rootContext()->setContextProperty("layoutHandler", layoutHandler);
- engine.rootContext()->setContextProperty("homescreenHandler", homescreenHandler);
- engine.rootContext()->setContextProperty("launcher", launcher);
- engine.rootContext()->setContextProperty("weather", new Weather(bindingAddress));
- engine.rootContext()->setContextProperty("bluetooth", new Bluetooth(bindingAddress, engine.rootContext()));
- engine.rootContext()->setContextProperty("screenInfo", &screenInfo);
- engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
-
- QObject *root = engine.rootObjects().first();
- QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
- QObject::connect(window, SIGNAL(frameSwapped()), layoutHandler, SLOT(slotActivateSurface()));
-
- QList<QObject *> sobjs = engine.rootObjects();
- StatusBarModel *statusBar = sobjs.first()->findChild<StatusBarModel *>("statusBar");
- statusBar->init(bindingAddress, engine.rootContext());
-
- return a.exec();
-}
diff --git a/homescreen/src/mastervolume.cpp b/homescreen/src/mastervolume.cpp
deleted file mode 100644
index 5a6dc9a..0000000
--- a/homescreen/src/mastervolume.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2017 Konsulko Group
- *
- * 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 "mastervolume.h"
-#include <QJsonObject>
-#include <QTimer>
-#include <QtDebug>
-
-MasterVolume::MasterVolume(QObject* parent)
- : QObject(parent)
- , m_volume{50}
-{
- connect(&m_client, SIGNAL(connected()), this, SLOT(onClientConnected()));
- connect(&m_client, SIGNAL(disconnected()), this, SLOT(onClientDisconnected()));
- connect(&m_client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onClientError(QAbstractSocket::SocketError)));
- connect(&m_client, SIGNAL(eventReceived(QString, const QJsonValue&)), this, SLOT(onClientEventReceived(QString, const QJsonValue&)));
-}
-
-void MasterVolume::open(const QUrl& url)
-{
- m_url = url;
- TryOpen();
-}
-
-qint32 MasterVolume::getVolume() const
-{
- return m_volume;
-}
-
-void MasterVolume::setVolume(qint32 volume)
-{
- if (m_volume != volume)
- {
- m_volume = volume;
- QJsonObject arg;
- arg.insert("control", "Master");
- arg.insert("value", volume);
- m_client.call("audiomixer", "volume", arg);
- }
-}
-
-void MasterVolume::onClientConnected()
-{
- QJsonObject arg;
- arg.insert("control", "Master");
- m_client.call("audiomixer", "volume", arg, [this](bool r, const QJsonValue& v) {
- if (r && v.isObject()) {
- int volume = v.toObject()["response"].toObject()["volume"].toDouble() * 100;
- volume = qBound(0, volume, 100);
- if (m_volume != volume)
- {
- m_volume = volume;
- emit VolumeChanged();
- }
- }
-
- QJsonObject arg;
- arg.insert("event", "volume_changed");
- m_client.call("audiomixer", "subscribe", arg);
- });
-}
-
-void MasterVolume::onClientDisconnected()
-{
- qDebug() << "MasterVolume::onClientDisconnected!";
- QTimer::singleShot(1000, this, SLOT(TryOpen()));
-}
-
-void MasterVolume::onClientError(QAbstractSocket::SocketError se)
-{
- qDebug() << "MasterVolume::onClientError: " << se;
-}
-
-void MasterVolume::onClientEventReceived(QString name, const QJsonValue& data)
-{
- qDebug() << "MasterVolume::onClientEventReceived[" << name << "]: " << data;
- if (name == "audiomixer/volume_changed")
- {
- QString ctlName = data.toObject()["control"].toString();
-
- if (ctlName != "Master")
- return;
-
- int volume = data.toObject()["value"].toDouble() * 100;
- volume = qBound(0, volume, 100);
- if (m_volume != volume)
- {
- m_volume = volume;
- emit VolumeChanged();
- }
- }
-}
-
-void MasterVolume::TryOpen()
-{
- m_client.open(m_url);
-}
diff --git a/homescreen/src/mastervolume.h b/homescreen/src/mastervolume.h
deleted file mode 100644
index 6ae0aad..0000000
--- a/homescreen/src/mastervolume.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2017 Konsulko Group
- *
- * 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/QObject>
-#include <QQmlEngine>
-#include "../qafbwebsocketclient.h"
-
-class MasterVolume
- : public QObject
-{
- Q_OBJECT
- Q_PROPERTY (uint32_t volume READ getVolume WRITE setVolume NOTIFY VolumeChanged)
-
-private:
- QAfbWebsocketClient m_client;
- QUrl m_url;
- qint32 m_volume;
-
-public:
- MasterVolume(QObject* parent = nullptr);
- ~MasterVolume() = default;
-
- Q_INVOKABLE void open(const QUrl& url);
- Q_INVOKABLE qint32 getVolume() const;
- Q_INVOKABLE void setVolume(qint32 val);
-
-private slots:
- void onClientConnected();
- void onClientDisconnected();
- void onClientError(QAbstractSocket::SocketError se);
- void onClientEventReceived(QString name, const QJsonValue& data);
- void TryOpen();
-
-signals:
- void VolumeChanged();
-};
diff --git a/homescreen/src/statusbarmodel.cpp b/homescreen/src/statusbarmodel.cpp
deleted file mode 100644
index f54a5f4..0000000
--- a/homescreen/src/statusbarmodel.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2017, 2018 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "statusbarmodel.h"
-#include "statusbarserver.h"
-
-#include <QtDBus/QDBusConnection>
-
-#include "network.h"
-
-class StatusBarModel::Private
-{
-public:
- Private(StatusBarModel *parent);
-
-private:
- StatusBarModel *q;
-public:
- StatusBarServer server;
- QString iconList[StatusBarServer::SupportedCount];
- Network *network;
- WifiAdapter *wifi_a;
-};
-
-StatusBarModel::Private::Private(StatusBarModel *parent)
- : q(parent)
-{
- QDBusConnection dbus = QDBusConnection::sessionBus();
- dbus.registerObject("/StatusBar", &server);
- dbus.registerService("org.agl.homescreen");
- connect(&server, &StatusBarServer::statusIconChanged, [&](int placeholderIndex, const QString &icon) {
- if (placeholderIndex < 0 || StatusBarServer::SupportedCount <= placeholderIndex) return;
- if (iconList[placeholderIndex] == icon) return;
- iconList[placeholderIndex] = icon;
- emit q->dataChanged(q->index(placeholderIndex), q->index(placeholderIndex));
- });
- for (int i = 0; i < StatusBarServer::SupportedCount; i++) {
- iconList[i] = server.getStatusIcon(i);
- }
-}
-
-StatusBarModel::StatusBarModel(QObject *parent)
- : QAbstractListModel(parent)
- , d(new Private(this))
-{
-}
-
-StatusBarModel::~StatusBarModel()
-{
- delete d;
-}
-
-void StatusBarModel::init(QUrl &url, QQmlContext *context)
-{
- d->network = new Network(url, context);
- context->setContextProperty("network", d->network);
- d->wifi_a = static_cast<WifiAdapter*>(d->network->findAdapter("wifi"));
- Q_CHECK_PTR(d->wifi_a);
-
- QObject::connect(d->wifi_a, &WifiAdapter::wifiConnectedChanged,
- this, &StatusBarModel::onWifiConnectedChanged);
- QObject::connect(d->wifi_a, &WifiAdapter::wifiEnabledChanged,
- this, &StatusBarModel::onWifiEnabledChanged);
- QObject::connect(d->wifi_a, &WifiAdapter::wifiStrengthChanged,
- this, &StatusBarModel::onWifiStrengthChanged);
-
- setWifiStatus(d->wifi_a->wifiConnected(), d->wifi_a->wifiEnabled(), d->wifi_a->wifiStrength());
-}
-
-void StatusBarModel::setWifiStatus(bool connected, bool enabled, int strength)
-{
- if (enabled && connected)
- if (strength < 30)
- d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_1Bar-01.png"));
- else if (strength < 50)
- d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_2Bars-01.png"));
- else if (strength < 70)
- d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_3Bars-01.png"));
- else
- d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_Full-01.png"));
- else
- d->server.setStatusIcon(0, QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_NoBars-01.png"));
-}
-
-void StatusBarModel::onWifiConnectedChanged(bool connected)
-{
- setWifiStatus(connected, d->wifi_a->wifiEnabled(), d->wifi_a->wifiStrength());
-}
-
-void StatusBarModel::onWifiEnabledChanged(bool enabled)
-{
- setWifiStatus(d->wifi_a->wifiConnected(), enabled, d->wifi_a->wifiStrength());
-}
-
-void StatusBarModel::onWifiStrengthChanged(int strength)
-{
- qInfo() << "Strength changed: " << strength;
- setWifiStatus(d->wifi_a->wifiConnected(), d->wifi_a->wifiEnabled(), strength);
-}
-
-int StatusBarModel::rowCount(const QModelIndex &parent) const
-{
- if (parent.isValid())
- return 0;
-
- // Delete bluetooth because use agl-service-bluetooth.
- return StatusBarServer::SupportedCount - 1;
-}
-
-QVariant StatusBarModel::data(const QModelIndex &index, int role) const
-{
- QVariant ret;
- if (!index.isValid())
- return ret;
-
- switch (role) {
- case Qt::DisplayRole:
- if (index.row() == 0){
- ret = d->iconList[StatusBarServer::StatusWifi];
- }else if (index.row() == 1){
- ret = d->iconList[StatusBarServer::StatusCellular];
- }
- break;
- default:
- break;
- }
-
- return ret;
-}
-
-QHash<int, QByteArray> StatusBarModel::roleNames() const
-{
- QHash<int, QByteArray> roles;
- roles[Qt::DisplayRole] = "icon";
- return roles;
-}
diff --git a/homescreen/src/statusbarmodel.h b/homescreen/src/statusbarmodel.h
deleted file mode 100644
index 4e31f19..0000000
--- a/homescreen/src/statusbarmodel.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.
- */
-
-#ifndef STATUSBARMODEL_H
-#define STATUSBARMODEL_H
-
-#include <QtCore/QAbstractListModel>
-#include <QtQml/QQmlContext>
-
-class StatusBarModel : public QAbstractListModel
-{
- Q_OBJECT
-public:
- explicit StatusBarModel(QObject *parent = NULL);
- ~StatusBarModel();
-
- void init(QUrl &url, QQmlContext *context);
- int rowCount(const QModelIndex &parent = QModelIndex()) const override;
-
- QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
- QHash<int, QByteArray> roleNames() const override;
-
- // slots
- void onWifiConnectedChanged(bool connected);
- void onWifiEnabledChanged(bool enabled);
- void onWifiStrengthChanged(int strength);
-
-private:
- class Private;
- Private *d;
- void setWifiStatus(bool connected, bool enabled, int strength);
-};
-
-#endif // STATUSBARMODEL_H
diff --git a/homescreen/src/statusbarserver.cpp b/homescreen/src/statusbarserver.cpp
deleted file mode 100644
index 805c582..0000000
--- a/homescreen/src/statusbarserver.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2016 The Qt Company Ltd.
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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 "statusbarserver.h"
-#include "statusbar_adaptor.h"
-
-class StatusBarServer::Private
-{
-public:
- Private(StatusBarServer *parent);
- QString texts[SupportedCount];
- QString icons[SupportedCount];
- StatusbarAdaptor adaptor;
-};
-
-StatusBarServer::Private::Private(StatusBarServer *parent)
- : adaptor(parent)
-{
- icons[0] = QStringLiteral("qrc:/images/Status/HMI_Status_Wifi_NoBars-01.png");
- icons[1] = QStringLiteral("qrc:/images/Status/HMI_Status_Bluetooth_Inactive-01.png");
- icons[2] = QStringLiteral("qrc:/images/Status/HMI_Status_Signal_NoBars-01.png");
-}
-
-StatusBarServer::StatusBarServer(QObject *parent)
- : QObject(parent)
- , d(new Private(this))
-{
-}
-
-StatusBarServer::~StatusBarServer()
-{
- delete d;
-}
-
-QList<int> StatusBarServer::getAvailablePlaceholders() const
-{
- QList<int> ret;
- for (int i = 0; i < SupportedCount; ++i) {
- ret.append(i);
- }
- return ret;
-}
-
-QString StatusBarServer::getStatusIcon(int placeholderIndex) const
-{
- QString ret;
- if (-1 < placeholderIndex && placeholderIndex < SupportedCount)
- ret = d->icons[placeholderIndex];
- return ret;
-}
-
-void StatusBarServer::setStatusIcon(int placeholderIndex, const QString &icon)
-{
- if (-1 < placeholderIndex && placeholderIndex < SupportedCount) {
- if (d->icons[placeholderIndex] == icon) return;
- d->icons[placeholderIndex] = icon;
- emit statusIconChanged(placeholderIndex, icon);
- }
-}
-
-QString StatusBarServer::getStatusText(int placeholderIndex) const
-{
- QString ret;
- if (-1 < placeholderIndex && placeholderIndex < SupportedCount) {
- ret = d->texts[placeholderIndex];
- }
- return ret;
-}
-
-void StatusBarServer::setStatusText(int placeholderIndex, const QString &text)
-{
- if (-1 < placeholderIndex && placeholderIndex < SupportedCount) {
- if (d->texts[placeholderIndex] == text) return;
- d->texts[placeholderIndex] = text;
- emit statusTextChanged(placeholderIndex, text);
- }
-}
diff --git a/homescreen/src/statusbarserver.h b/homescreen/src/statusbarserver.h
deleted file mode 100644
index dabf6d3..0000000
--- a/homescreen/src/statusbarserver.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.
- */
-
-#ifndef STATUSBARSERVER_H
-#define STATUSBARSERVER_H
-
-#include <QtCore/QObject>
-
-class StatusBarServer : public QObject
-{
- Q_OBJECT
-public:
- enum {
- StatusWifi = 0,
- StatusBluetooth = 1,
- StatusCellular = 2,
- SupportedCount = 3,
- };
- explicit StatusBarServer(QObject *parent = NULL);
- ~StatusBarServer();
-
- Q_INVOKABLE QList<int> getAvailablePlaceholders() const;
- Q_INVOKABLE QString getStatusIcon(int placeholderIndex) const;
- Q_INVOKABLE QString getStatusText(int placeholderIndex) const;
-
-public slots:
- void setStatusIcon(int placeholderIndex, const QString &icon);
- void setStatusText(int placeholderIndex, const QString &text);
-
-signals:
- void statusIconChanged(int placeholderIndex, const QString &icon);
- void statusTextChanged(int placeholderIndex, const QString &text);
-
-private:
- class Private;
- Private *d;
-};
-
-#endif // STATUSBARSERVER_H
diff --git a/interfaces/LICENSE b/interfaces/LICENSE
deleted file mode 100644
index 31c692a..0000000
--- a/interfaces/LICENSE
+++ /dev/null
@@ -1,54 +0,0 @@
-Apache License
-
-Version 2.0, January 2004
-
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-
- You must give any other recipients of the Work or Derivative Works a copy of this License; and
- You must cause any modified files to carry prominent notices stating that You changed the files; and
- You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
- If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
-
- You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
diff --git a/interfaces/README.md b/interfaces/README.md
deleted file mode 100644
index 15dfaa9..0000000
--- a/interfaces/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-AGL Home Screen reference implementation
-This lib provides the needed D-Bus interfaces
-
-Build with QtCreator 3.0.1
-
-AGL repo for source code:
-https://gerrit.automotivelinux.org/gerrit/#/admin/projects/staging/HomeScreen
-
-AGL repo for bitbake recipe:
-https://gerrit.automotivelinux.org/gerrit/#/admin/projects/AGL/meta-agl-demo/recipes-demo-hmi/HomeScreen/HomeScreen_?.bb
-
diff --git a/interfaces/afm_user_daemon.xml b/interfaces/afm_user_daemon.xml
deleted file mode 100644
index 17b7d63..0000000
--- a/interfaces/afm_user_daemon.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<node path="/org/AGL/afm/user">
- <interface name="org.AGL.afm.user">
- <method name="runnables">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="detail">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="start">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="once">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="terminate">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="pause">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="resume">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="runners">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="state">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="install">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <method name="uninstall">
- <arg name="in" type="s" direction="in"/>
- <arg name="out" type="s" direction="out"/>
- </method>
- <signal name="changed">
- <arg name="out" type="s" direction="out"/>
- </signal>
- </interface>
-</node>
diff --git a/interfaces/appframework.xml b/interfaces/appframework.xml
deleted file mode 100644
index f10b3ae..0000000
--- a/interfaces/appframework.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<!-- Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
-
- 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. -->
-<node>
- <!--
- org.agl.appframework:
- @short_description: The interface of the app framework binder.
-
- The app framework has to provide some basic functionality like
- getting a list of applications and start them. In further versions,
- also pausing or stopping, .
- -->
- <interface name="org.agl.appframework">
- <!--
- getAvailableApps:
- @apps: A list of applications that can be launched.
-
- The application info consists of:
- string id;
- string version;
- int width;
- int height;
- string name;
- string description;
- string shortname;
- string author;
- string iconPath;
- -->
- <method name="getAvailableApps">
- <arg name="apps" type="{ssiisssss}" direction="out"/>
- <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList&lt;AppInfo&gt;"/>
- </method>
- <!--
- launchApp:
- @name: The name of the application that shall be launched.
- @pid: Returns the pid of the process.
-
- Use the id of the application info to launch the app.
- -->
- <method name="launchApp">
- <arg name="name" type="s" direction="in"/>
- <arg name="pid" type="i" direction="out"/>
- </method>
- </interface>
-</node>
-
diff --git a/interfaces/include/afm_user_daemon.hpp b/interfaces/include/afm_user_daemon.hpp
deleted file mode 100644
index b9a5321..0000000
--- a/interfaces/include/afm_user_daemon.hpp
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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 AFM_USER_DAEMON_HPP
-#define AFM_USER_DAEMON_HPP
-
-
-#endif // AFM_USER_DAEMON_HPP
diff --git a/interfaces/include/appframework.hpp b/interfaces/include/appframework.hpp
deleted file mode 100644
index 98ec317..0000000
--- a/interfaces/include/appframework.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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 APPFRAMEWORK_HPP
-#define APPFRAMEWORK_HPP
-
-#include <QtCore/QSharedDataPointer>
-#include <QtDBus/QDBusArgument>
-
-class AppInfo
-{
- Q_GADGET
- Q_PROPERTY(QString id READ id)
- Q_PROPERTY(QString version READ version)
- Q_PROPERTY(int width READ width)
- Q_PROPERTY(int height READ height)
- Q_PROPERTY(QString name READ name)
- Q_PROPERTY(QString description READ description)
- Q_PROPERTY(QString shortname READ shortname)
- Q_PROPERTY(QString author READ author)
- Q_PROPERTY(QString iconPath READ iconPath)
-public:
- AppInfo();
- AppInfo(const AppInfo &other);
- virtual ~AppInfo();
- AppInfo &operator =(const AppInfo &other);
- void swap(AppInfo &other) { qSwap(d, other.d); }
-
- QString id() const;
- QString version() const;
- int width() const;
- int height() const;
- QString name() const;
- QString description() const;
- QString shortname() const;
- QString author() const;
- QString iconPath() const;
-
- void read(const QJsonObject &json);
-
- friend QDBusArgument &operator <<(QDBusArgument &argument, const AppInfo &appInfo);
- friend const QDBusArgument &operator >>(const QDBusArgument &argument, AppInfo &appInfo);
-
-private:
- class Private;
- QSharedDataPointer<Private> d;
-};
-
-Q_DECLARE_SHARED(AppInfo)
-Q_DECLARE_METATYPE(AppInfo)
-Q_DECLARE_METATYPE(QList<AppInfo>)
-
-#endif // APPFRAMEWORK_HPP
diff --git a/interfaces/include/statusbar.hpp b/interfaces/include/statusbar.hpp
deleted file mode 100644
index ecdcede..0000000
--- a/interfaces/include/statusbar.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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 STATUSBAR_H
-#define STATUSBAR_H
-
-
-
-#endif // STATUSBAR_H
diff --git a/interfaces/interfaces.pri b/interfaces/interfaces.pri
deleted file mode 100644
index 07b9e6a..0000000
--- a/interfaces/interfaces.pri
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright (C) 2016 The Qt Company Ltd.
-# Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
-#
-# 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.
-
-INCLUDEPATH += $$PWD $$OUT_PWD/../interfaces/
-
-LIBS += -L$$OUT_PWD/../interfaces/ -linterfaces
diff --git a/interfaces/interfaces.pro b/interfaces/interfaces.pro
deleted file mode 100644
index 1e30bdd..0000000
--- a/interfaces/interfaces.pro
+++ /dev/null
@@ -1,61 +0,0 @@
-# Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
-#
-# 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.
-
-TEMPLATE = lib
-TARGET = interfaces
-QT = dbus
-CONFIG += staticlib
-
-HEADERS += \
- include/appframework.hpp
-
-SOURCES += \
- src/appframework.cpp
-
-XMLSOURCES = \
- afm_user_daemon.xml \
- appframework.xml \
- statusbar.xml
-
-gen_adaptor_cpp.input = XMLSOURCES
-gen_adaptor_cpp.commands = \
- qdbusxml2cpp -i include/${QMAKE_FILE_IN_BASE}.hpp -m -a ${QMAKE_FILE_IN_BASE}_adaptor ${QMAKE_FILE_IN}; \
- moc $$OUT_PWD/${QMAKE_FILE_IN_BASE}_adaptor.h -o $$OUT_PWD/${QMAKE_FILE_IN_BASE}_adaptor.moc
-gen_adaptor_cpp.output = ${QMAKE_FILE_IN_BASE}_adaptor.cpp
-gen_adaptor_cpp.variable_out = SOURCES
-gen_adaptor_cpp.clean = ${QMAKE_FILE_IN_BASE}_adaptor.cpp
-
-gen_proxy_cpp.input = XMLSOURCES
-gen_proxy_cpp.commands = \
- qdbusxml2cpp -i include/${QMAKE_FILE_IN_BASE}.hpp -m -p ${QMAKE_FILE_IN_BASE}_proxy ${QMAKE_FILE_IN}; \
- moc $$OUT_PWD/${QMAKE_FILE_IN_BASE}_proxy.h -o $$OUT_PWD/${QMAKE_FILE_IN_BASE}_proxy.moc
-gen_proxy_cpp.output = ${QMAKE_FILE_IN_BASE}_proxy.cpp
-gen_proxy_cpp.variable_out = SOURCES
-gen_proxy_cpp.clean = ${QMAKE_FILE_IN_BASE}_proxy.cpp
-
-gen_adaptor_h.input = XMLSOURCES
-gen_adaptor_h.commands = @echo Fake making the header for ${QMAKE_FILE_IN}
-gen_adaptor_h.depends = ${QMAKE_FILE_IN_BASE}_adaptor.cpp
-gen_adaptor_h.output = ${QMAKE_FILE_IN_BASE}_adaptor.h
-gen_adaptor_h.clean = ${QMAKE_FILE_IN_BASE}_adaptor.h
-
-gen_proxy_h.input = XMLSOURCES
-gen_proxy_h.commands = @echo Fake making the header for ${QMAKE_FILE_IN}
-gen_proxy_h.depends = ${QMAKE_FILE_IN_BASE}_proxy.cpp
-gen_proxy_h.output = ${QMAKE_FILE_IN_BASE}_proxy.h
-gen_proxy_h.clean = ${QMAKE_FILE_IN_BASE}_proxy.h
-
-QMAKE_EXTRA_COMPILERS += gen_adaptor_cpp gen_proxy_cpp gen_adaptor_h gen_proxy_h
-
-DISTFILES +=
diff --git a/interfaces/src/appframework.cpp b/interfaces/src/appframework.cpp
deleted file mode 100644
index 7420642..0000000
--- a/interfaces/src/appframework.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
- *
- * 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 "include/appframework.hpp"
-
-#include <QtCore/QJsonObject>
-
-class AppInfo::Private : public QSharedData
-{
-public:
- Private();
- Private(const Private &other);
-
- QString id;
- QString version;
- int width;
- int height;
- QString name;
- QString description;
- QString shortname;
- QString author;
- QString iconPath;
-};
-
-AppInfo::Private::Private()
- : width(-1)
- , height(-1)
-{
-}
-
-AppInfo::Private::Private(const Private &other)
- : QSharedData(other)
- , id(other.id)
- , version(other.version)
- , width(other.width)
- , height(other.height)
- , name(other.name)
- , description(other.description)
- , shortname(other.shortname)
- , author(other.author)
- , iconPath(other.iconPath)
-{
-}
-
-AppInfo::AppInfo()
- : d(new Private)
-{
-}
-
-AppInfo::AppInfo(const AppInfo &other)
- : d(other.d)
-{
-}
-
-AppInfo::~AppInfo()
-{
-}
-
-AppInfo &AppInfo::operator =(const AppInfo &other)
-{
- d = other.d;
- return *this;
-}
-
-QString AppInfo::id() const
-{
- return d->id;
-}
-
-QString AppInfo::version() const
-{
- return d->version;
-}
-
-int AppInfo::width() const
-{
- return d->width;
-}
-
-int AppInfo::height() const
-{
- return d->height;
-}
-
-QString AppInfo::name() const
-{
- return d->name;
-}
-
-QString AppInfo::description() const
-{
- return d->description;
-}
-
-QString AppInfo::shortname() const
-{
- return d->shortname;
-}
-
-QString AppInfo::author() const
-{
- return d->author;
-}
-
-QString AppInfo::iconPath() const
-{
- return d->iconPath;
-}
-
-void AppInfo::read(const QJsonObject &json)
-{
- d->id = json["id"].toString();
- d->version = json["version"].toString();
- d->width = json["width"].toInt();
- d->height = json["height"].toInt();
- d->name = json["name"].toString();
- d->description = json["description"].toString();
- d->shortname = json["shortname"].toString();
- d->author = json["author"].toString();
- d->iconPath = json["iconPath"].toString();
-}
-
-QDBusArgument &operator <<(QDBusArgument &argument, const AppInfo &appInfo)
-{
- argument.beginStructure();
- argument << appInfo.d->id;
- argument << appInfo.d->version;
- argument << appInfo.d->width;
- argument << appInfo.d->height;
- argument << appInfo.d->name;
- argument << appInfo.d->description;
- argument << appInfo.d->shortname;
- argument << appInfo.d->author;
- argument << appInfo.d->iconPath;
- argument.endStructure();
-
- return argument;
-}
-
-const QDBusArgument &operator >>(const QDBusArgument &argument, AppInfo &appInfo)
-{
- argument.beginStructure();
- argument >> appInfo.d->id;
- argument >> appInfo.d->version;
- argument >> appInfo.d->width;
- argument >> appInfo.d->height;
- argument >> appInfo.d->name;
- argument >> appInfo.d->description;
- argument >> appInfo.d->shortname;
- argument >> appInfo.d->author;
- argument >> appInfo.d->iconPath;
- argument.endStructure();
- return argument;
-}
diff --git a/interfaces/statusbar.xml b/interfaces/statusbar.xml
deleted file mode 100644
index ec51be2..0000000
--- a/interfaces/statusbar.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<!-- Copyright (C) 2016, 2017 Mentor Graphics Development (Deutschland) GmbH
-
- 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. -->
-<node>
- <interface name="org.agl.statusbar">
- <method name="getAvailablePlaceholders">
- <arg name="placeholderIndexes" type="ai" direction="out"/>
- <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList&lt;int&gt;"/>
- </method>
- <method name="getStatusText">
- <arg name="placeholderIndex" type="i" direction="in"/>
- <arg name="text" type="s" direction="out"/>
- </method>
- <method name="getStatusIcon">
- <arg name="placeholderIndex" type="i" direction="in"/>
- <arg name="iconURI" type="s" direction="out"/>
- </method>
- <method name="setStatusText">
- <arg name="placeholderIndex" type="i" direction="in"/>
- <arg name="text" type="s" direction="in"/>
- </method>
- <method name="setStatusIcon">
- <arg name="placeholderIndex" type="i" direction="in"/>
- <arg name="iconURI" type="s" direction="in"/>
- </method>
- </interface>
-</node>
diff --git a/package/config.xml b/package/config.xml
deleted file mode 100644
index 3ebe39b..0000000
--- a/package/config.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<widget xmlns="http://www.w3.org/ns/widgets" id="homescreen" version="0.1">
- <name>homescreen</name>
- <icon src="icon.svg"/>
- <content src="bin/HomeScreen" type="application/vnd.agl.native"/>
- <description>This is a demo application for homescreen</description>
- <author>TOYOTA</author>
- <license>APL 2.0</license>
- <feature name="urn:AGL:widget:required-api">
- <param name="homescreen" value="ws" />
- <param name="network-manager" value="ws" />
- <param name="weather" value="ws" />
- <param name="Bluetooth-Manager" value="ws" />
- <param name="windowmanager" value="ws" />
- <param name="audiomixer" value="ws" />
- </feature>
- <feature name="urn:AGL:widget:required-permission">
- <param name="urn:AGL:permission::public:no-htdocs" value="required" />
- <param name="urn:AGL:permission::system:run-by-default" value="required" />
- <param name="http://tizen.org/privilege/internal/dbus" value="required" />
- <param name="urn:AGL:permission::public:display" value="required" />
- </feature>
-</widget>
diff --git a/package/package.pro b/package/package.pro
deleted file mode 100644
index 09c7a01..0000000
--- a/package/package.pro
+++ /dev/null
@@ -1,22 +0,0 @@
-DISTFILES = icon.svg config.xml
-
-copy_icon.target = $$OUT_PWD/root/icon.svg
-copy_icon.depends = $$_PRO_FILE_PWD_/icon.svg
-copy_icon.commands = $(COPY_FILE) \"$$replace(copy_icon.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_icon.target, /, $$QMAKE_DIR_SEP)\"
-QMAKE_EXTRA_TARGETS += copy_icon
-PRE_TARGETDEPS += $$copy_icon.target
-
-copy_config.target = $$OUT_PWD/root/config.xml
-copy_config.depends = $$_PRO_FILE_PWD_/config.xml
-copy_config.commands = $(COPY_FILE) \"$$replace(copy_config.depends, /, $$QMAKE_DIR_SEP)\" \"$$replace(copy_config.target, /, $$QMAKE_DIR_SEP)\"
-QMAKE_EXTRA_TARGETS += copy_config
-PRE_TARGETDEPS += $$copy_config.target
-
-wgt.target = package
-wgt.commands = wgtpkg-pack -f -o homescreen.wgt root
-
-QMAKE_EXTRA_TARGETS += wgt
-
-deploy.files = homescreen.wgt
-deploy.path = /usr/AGL/apps/autoinstall
-INSTALLS += deploy
diff --git a/package/root/config.xml b/package/root/config.xml
new file mode 100644
index 0000000..88835cb
--- /dev/null
+++ b/package/root/config.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns="http://www.w3.org/ns/widgets" id="gstwayland" version="0.1">
+ <name>gstwayland</name>
+ <icon src="icon.svg"/>
+ <content src="bin/gstwayland" type="application/vnd.agl.native"/>
+ <description>This is a demo application for simple-egl</description>
+ <author>TOYOA</author>
+ <license>APL 2.0 + MIT</license>
+ <feature name="urn:AGL:widget:required-api">
+ <param name="homescreen" value="ws" />
+ <param name="windowmanager" value="ws" />
+ <param name="carlaclient" value="ws" />
+ <param name="low-can" value="ws" />
+ </feature>
+ <feature name="urn:AGL:widget:required-permission">
+ <param name="urn:AGL:permission::public:no-htdocs" value="required" />
+ </feature>
+</widget>
diff --git a/package/icon.svg b/package/root/icon.svg
index 91661a7..91661a7 100644
--- a/package/icon.svg
+++ b/package/root/icon.svg
diff --git a/package/root/pipeline.ini b/package/root/pipeline.ini
new file mode 100644
index 0000000..1ea4c39
--- /dev/null
+++ b/package/root/pipeline.ini
@@ -0,0 +1 @@
+filesrc location=/storage/video_stream_pipe ! decodebin ! videoconvert ! waylandsink sync=false \ No newline at end of file
diff --git a/src/gst-wayland-demo.cpp b/src/gst-wayland-demo.cpp
new file mode 100644
index 0000000..06bf1e5
--- /dev/null
+++ b/src/gst-wayland-demo.cpp
@@ -0,0 +1,1360 @@
+/*
+ * Copyright (C) 2016 Renesas Electronics Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <gst/gst.h>
+
+#include <gst/video/video.h>
+#include <gst/video/videooverlay.h>
+
+#include <gst/wayland/wayland.h>
+
+#include <glib-unix.h>
+
+#include <wayland-client.h>
+
+#include <linux/input.h>
+
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <string>
+#include <thread>
+
+#define INFINITE_LOOP_PLAYBACK -1
+#define USE_AGL
+#define USE_SDL
+
+#ifdef USE_AGL
+#include "gst-wayland-demo.hpp"
+#endif
+
+#ifdef USE_SDL
+#include <libwebsockets.h>
+#include <pthread.h>
+#include <sys/syscall.h>
+#include <stdbool.h>
+#include <ctype.h>
+
+#include "parson.h"
+
+#include <math.h>
+#include <errno.h>
+
+// Can受信.
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/uio.h>
+#include <net/if.h>
+#include <linux/can.h>
+#include <linux/can/raw.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#include <libgen.h>
+
+extern "C" {
+ void websocket_init();
+ void lws_touch_handle_down(uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w);
+ void lws_touch_handle_up(uint32_t time, int32_t id);
+ void lws_touch_handle_motion(uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w);
+}
+#endif
+
+typedef struct
+{
+ GMainLoop *loop;
+ GSource *source;
+ GstElement *pipeline;
+
+ gint fullscreen;
+ gboolean nloop;
+
+ struct wl_display *display;
+ struct wl_event_queue *queue;
+ struct wl_registry *registry;
+ struct wl_compositor *compositor;
+ struct wl_shell *shell;
+ struct wl_shm *shm;
+ struct wl_seat *seat;
+ struct wl_pointer *pointer;
+ struct wl_touch *touch;
+ GList *surfaces;
+ GList *shell_surfaces;
+ GList *outputs;
+
+ struct wl_surface *focused_surface;
+ gint min_refresh;
+ gint64 frame_cnt;
+
+ guint signal_watch_id;
+} GstWlDemo;
+
+#ifdef USE_AGL
+void fatal(const char* format, ...)
+{
+ va_list va_args;
+ va_start(va_args, format);
+ vfprintf(stderr, format, va_args);
+ va_end(va_args);
+
+ exit(EXIT_FAILURE);
+}
+
+void warn(const char* format, ...)
+{
+ va_list va_args;
+ va_start(va_args, format);
+ vfprintf(stderr, format, va_args);
+ va_end(va_args);
+}
+
+void debug(const char* format, ...)
+{
+ va_list va_args;
+ va_start(va_args, format);
+ vfprintf(stderr, format, va_args);
+ va_end(va_args);
+}
+
+static void event_loop_run(struct sd_event* loop){
+ sd_event_loop(loop);
+ sd_event_unref(loop);
+}
+
+/**
+ * websocket
+ */
+
+static void _on_hangup_static(void *closure, struct afb_wsj1 *wsj)
+{
+}
+
+static void _on_call_static(void *closure, const char *api, const char *verb, struct afb_wsj1_msg *msg)
+{
+}
+
+static void _on_event_static(void* closure, const char* event, struct afb_wsj1_msg *msg)
+{
+ static_cast<RunXDG*>(closure)->on_event(NULL,event,msg);
+}
+
+static void _on_reply_static(void *closure, struct afb_wsj1_msg *msg)
+{
+ AGL_DEBUG("_on_reply_static msg: (%s)", afb_wsj1_msg_object_s(msg));
+}
+
+void RunXDG::notify_ivi_control_cb (ilmObjectType object, t_ilm_uint id,
+ t_ilm_bool created)
+{
+ if (object == ILM_SURFACE) {
+ struct ilmSurfaceProperties surf_props;
+
+ ilm_getPropertiesOfSurface(id, &surf_props);
+ pid_t surf_pid = surf_props.creatorPid;
+ if (!created) {
+ fprintf(stderr, "ivi surface (id=%d, pid=%d) destroyed. \n", id, surf_pid);
+ return;
+ }
+
+ fprintf(stderr, "ivi surface (id=%d, pid=%d) is created. \n", id, surf_pid);
+ if (surf_pid == m_pid)
+ {
+ m_ivi_id = id;
+ setup_ivi_surface();
+ }
+ }
+ else{
+ fprintf(stderr, "ivi surface is not created. \n");
+ }
+}
+
+void RunXDG::notify_ivi_control_cb_static (ilmObjectType object, t_ilm_uint id,
+ t_ilm_bool created, void *user_data)
+{
+ fprintf(stderr, "notify_ivi_control_cb_static called. \n");
+ RunXDG *runxdg = static_cast<RunXDG*>(user_data);
+ runxdg->notify_ivi_control_cb(object, id, created);
+}
+
+int RunXDG::init_wm (void)
+{
+ m_wm = new LibWindowmanager();
+ if (m_wm->init(m_port, m_token.c_str())) {
+ AGL_DEBUG("cannot initialize windowmanager");
+ return -1;
+ }
+
+ std::function< void(json_object*) > h_active = [this](json_object* object) {
+ AGL_DEBUG("Got Event_Active");
+ t_ilm_surface s_ids[1] = { this->m_ivi_id };
+ ilm_setInputFocus(s_ids, 1, ILM_INPUT_DEVICE_KEYBOARD, ILM_TRUE);
+ };
+
+ std::function< void(json_object*) > h_inactive = [this](json_object* object) {
+ AGL_DEBUG("Got Event_Inactive");
+ t_ilm_surface s_ids[1] = { this->m_ivi_id };
+ ilm_setInputFocus(s_ids, 1, ILM_INPUT_DEVICE_KEYBOARD, ILM_FALSE);
+ };
+
+ std::function< void(json_object*) > h_visible = [](json_object* object) {
+ AGL_DEBUG("Got Event_Visible");
+ };
+
+ std::function< void(json_object*) > h_invisible = [](json_object* object) {
+ AGL_DEBUG("Got Event_Invisible");
+ };
+
+ std::function< void(json_object*) > h_syncdraw =
+ [this](json_object* object) {
+ AGL_DEBUG("Got Event_SyncDraw");
+ this->m_wm->endDraw(this->m_role.c_str());
+ };
+
+ std::function< void(json_object*) > h_flushdraw= [](json_object* object) {
+ AGL_DEBUG("Got Event_FlushDraw");
+ };
+
+ m_wm->set_event_handler(LibWindowmanager::Event_Active, h_active);
+ m_wm->set_event_handler(LibWindowmanager::Event_Inactive, h_inactive);
+ m_wm->set_event_handler(LibWindowmanager::Event_Visible, h_visible);
+ m_wm->set_event_handler(LibWindowmanager::Event_Invisible, h_invisible);
+ m_wm->set_event_handler(LibWindowmanager::Event_SyncDraw, h_syncdraw);
+ m_wm->set_event_handler(LibWindowmanager::Event_FlushDraw, h_flushdraw);
+
+ return 0;
+}
+
+int RunXDG::init_hs (void)
+{
+ m_hs = new LibHomeScreen();
+ if (m_hs->init(m_port, m_token.c_str())) {
+ AGL_DEBUG("cannot initialize homescreen");
+ return -1;
+ }
+
+ std::function< void(json_object*) > handler = [this] (json_object* object) {
+ AGL_DEBUG("Activesurface %s ", this->m_role.c_str());
+ this->m_wm->activateWindow(this->m_role.c_str(), "normal.full");
+ };
+ m_hs->set_event_handler(LibHomeScreen::Event_ShowWindow, handler);
+
+ std::function< void(json_object*) > h_default= [](json_object* object) {
+ const char *j_str = json_object_to_json_string(object);
+ AGL_DEBUG("Got event [%s]", j_str);
+ };
+ m_hs->set_event_handler(LibHomeScreen::Event_OnScreenMessage, h_default);
+
+ return 0;
+}
+
+int RunXDG::init_carlaclient(void)
+{
+ memset(&m_carla_info, 0, sizeof(struct Carla_Info));
+ int ret = sd_event_new(&mploop);
+ if(ret < 0)
+ {
+ AGL_DEBUG("Failed to create event loop");
+ return -1;
+ }
+
+ {
+ // enforce context to avoid initialization/goto error
+ std::thread th(event_loop_run, mploop);
+ th.detach();
+ }
+
+ /* Initialize interface from websocket */
+ minterface.on_hangup = _on_hangup_static;
+ minterface.on_call = _on_call_static;
+ minterface.on_event = _on_event_static;
+ muri += "ws://localhost:" + std::to_string(m_port) + "/api?token=" + m_token; /*To be modified*/
+ sp_websock = afb_ws_client_connect_wsj1(mploop, muri.c_str(), &minterface, this);
+ if(sp_websock == NULL) {
+ AGL_DEBUG("Failed to create websocket connection");
+ return -1;
+ }
+
+ struct json_object* j_obj = json_object_new_object();
+ json_object_object_add(j_obj, "event", json_object_new_int(0));
+
+ ret = afb_wsj1_call_j(sp_websock, "carlaclient", "subscribe", j_obj, _on_reply_static, this);
+ if (ret < 0) {
+ AGL_DEBUG("Failed to call carlaclient subscribe verb");
+ }
+
+ struct json_object* speed_obj = json_object_new_object();
+ json_object_object_add(speed_obj, "event", json_object_new_string("vehicle.average.speed"));
+
+ ret = afb_wsj1_call_j(sp_websock, "low-can", "subscribe", speed_obj, _on_reply_static, this);
+ if (ret < 0) {
+ AGL_DEBUG("Failed to call low-can subscribe verb");
+ }
+
+ return 0;
+}
+
+void RunXDG::on_event(void *closure, const char *event, struct afb_wsj1_msg *msg)
+{
+ AGL_DEBUG("event: (%s) msg: (%s).", event, afb_wsj1_msg_object_s(msg));
+ struct json_object* ev_contents = afb_wsj1_msg_object_j(msg);
+ if(!strcasecmp(event, "carlaclient/positionUpdated")) {
+ struct json_object *json_data;
+ if(!json_object_object_get_ex(ev_contents, "data", &json_data)) {
+ AGL_DEBUG("got ev_contents error.");
+ return;
+ }
+
+ struct json_object *longitude_obj, *latitude_obj, *yaw_obj;
+ if(json_object_object_get_ex(json_data, "longitude", &longitude_obj)
+ && json_object_object_get_ex(json_data, "latitude", &latitude_obj)
+ && json_object_object_get_ex(json_data, "yaw", &yaw_obj)) {
+ AGL_DEBUG("got yaw(%s) longitude(%s) latitude(%s).", json_object_get_string(yaw_obj), json_object_get_string(longitude_obj), json_object_get_string(latitude_obj));
+ m_carla_info.yaw = json_object_get_string(yaw_obj);
+ std::string::size_type sz;
+ m_carla_info.longitude = std::stod(json_object_get_string(longitude_obj), &sz);
+ m_carla_info.latitude = std::stod(json_object_get_string(latitude_obj), &sz);
+ // TBD: call sdl interface
+ }
+ }
+ else if(!strcasecmp(event, "low-can/messages.vehicle.average.speed")) {
+ // [5,"low-can/messages.vehicle.average.speed",{"event":"low-can\/messages.vehicle.average.speed","data":{"value":10},"jtype":"afb-event"}]
+
+ if(json_object_get_type(ev_contents) == json_type_array) {
+ int array_len = json_object_array_length(ev_contents);
+ struct json_object *event_obj = json_object_array_get_idx(ev_contents, 2);
+ struct json_object *data_obj, *val_obj;
+ if(json_object_object_get_ex(event_obj, "data", &data_obj)
+ &&json_object_object_get_ex(data_obj, "value", &val_obj)) {
+ m_carla_info.speed = json_object_get_int(val_obj);
+ }
+ }
+ }
+}
+
+RunXDG::RunXDG (int port, const char* token, const char* id)
+{
+ m_id = std::string(id);
+ m_port = port;
+ m_token = std::string(token);
+ m_role = "gstwayland";
+ m_pid = getpid();
+
+ // Setup HomeScreen/WindowManager API
+ if (init_wm())
+ AGL_FATAL("cannot setup wm API");
+
+ if (init_hs())
+ AGL_FATAL("cannot setup hs API");
+
+ if (init_carlaclient())
+ AGL_FATAL("cannot setup carlaclient API");
+
+ // Setup ilmController API
+ m_ic = new ILMControl(notify_ivi_control_cb_static, this);
+
+ fprintf(stderr, "RunXDG created. \n");
+}
+
+void RunXDG::setup_ivi_surface (void)
+{
+ std::string sid = std::to_string(m_ivi_id);
+
+ // This surface is mine, register pair app_name and ivi id.
+ AGL_DEBUG("requestSurfaceXDG(%s,%d)", m_role.c_str(), m_ivi_id);
+ m_wm->requestSurfaceXDG(this->m_role.c_str(), (unsigned int)m_ivi_id);
+
+ if (m_pending_create) {
+ // Recovering 1st time tap_shortcut is dropped because
+ // the application has not been run yet (1st time launch)
+ m_pending_create = false;
+ // m_wm->activateWindow(this->m_role.c_str(), "normal.full");
+ m_hs->publishSubscription();
+ }
+}
+
+void RunXDG::start (void)
+{
+ // take care 1st time launch
+ AGL_DEBUG("waiting for notification: surafce created");
+ m_pending_create = true;
+
+ ilm_commitChanges();
+}
+#endif
+
+static void
+pointer_handle_enter (void *data, struct wl_pointer *pointer,
+ uint32_t serial, struct wl_surface *surface, wl_fixed_t sx, wl_fixed_t sy)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+ // GstWlDemo *priv = data;
+
+ // priv->focused_surface = surface;
+}
+
+static void
+pointer_handle_leave (void *data, struct wl_pointer *pointer,
+ uint32_t serial, struct wl_surface *surface)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+ // GstWlDemo *priv = data;
+
+ // priv->focused_surface = NULL;
+}
+
+static void
+pointer_handle_motion (void *data, struct wl_pointer *pointer,
+ uint32_t time, wl_fixed_t sx, wl_fixed_t sy)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+}
+
+static void
+pointer_handle_button (void *data, struct wl_pointer *wl_pointer,
+ uint32_t serial, uint32_t time, uint32_t button, uint32_t state)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+ // GstWlDemo *priv = data;
+ // struct wl_shell_surface *shell_surface;
+
+ // if (!priv->focused_surface)
+ // return;
+
+ // shell_surface = wl_surface_get_user_data (priv->focused_surface);
+
+ // if (button == BTN_LEFT && state == WL_POINTER_BUTTON_STATE_PRESSED)
+ // wl_shell_surface_move (shell_surface, priv->seat, serial);
+}
+
+static void
+pointer_handle_axis (void *data, struct wl_pointer *wl_pointer,
+ uint32_t time, uint32_t axis, wl_fixed_t value)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+}
+
+static const struct wl_pointer_listener pointer_listener = {
+ pointer_handle_enter,
+ pointer_handle_leave,
+ pointer_handle_motion,
+ pointer_handle_button,
+ pointer_handle_axis,
+};
+
+static void
+touch_handle_down (void *data, struct wl_touch *wl_touch,
+ uint32_t serial, uint32_t time, struct wl_surface *surface,
+ int32_t id, wl_fixed_t x_w, wl_fixed_t y_w)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+ if( data ) {
+ double cx = wl_fixed_to_double(x_w);
+ double cy = wl_fixed_to_double(y_w);
+ fprintf(stderr, "log: %s: cx=%f cy=%f", __func__, cx, cy);
+ }
+ // GstWlDemo *priv = data;
+ // struct wl_shell_surface *shell_surface;
+
+ // shell_surface = wl_surface_get_user_data (surface);
+
+ // wl_shell_surface_move (shell_surface, priv->seat, serial);
+ lws_touch_handle_down(time, id, x_w, y_w);
+}
+
+static void
+touch_handle_up (void *data, struct wl_touch *wl_touch,
+ uint32_t serial, uint32_t time, int32_t id)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+ lws_touch_handle_up(time, id);
+}
+
+static void
+touch_handle_motion (void *data, struct wl_touch *wl_touch,
+ uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+ lws_touch_handle_motion(time, id, x_w, y_w);
+}
+
+static void
+touch_handle_frame (void *data, struct wl_touch *wl_touch)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+}
+
+static void
+touch_handle_cancel (void *data, struct wl_touch *wl_touch)
+{
+ fprintf(stderr, "%s called. \n", __func__);
+}
+
+static const struct wl_touch_listener touch_listener = {
+ touch_handle_down,
+ touch_handle_up,
+ touch_handle_motion,
+ touch_handle_frame,
+ touch_handle_cancel,
+};
+
+static void
+seat_handle_capabilities (void *data, struct wl_seat *seat,
+ enum wl_seat_capability caps)
+{
+ GstWlDemo *priv = data;
+
+ if ((caps & WL_SEAT_CAPABILITY_POINTER) && !priv->pointer) {
+ priv->pointer = wl_seat_get_pointer (seat);
+ wl_proxy_set_queue ((struct wl_proxy *) priv->pointer, priv->queue);
+ wl_pointer_add_listener (priv->pointer, &pointer_listener, priv);
+ } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && priv->pointer) {
+ wl_pointer_destroy (priv->pointer);
+ priv->pointer = NULL;
+ }
+
+ if ((caps & WL_SEAT_CAPABILITY_TOUCH) && !priv->touch) {
+ priv->touch = wl_seat_get_touch (seat);
+ wl_touch_set_user_data (priv->touch, priv);
+ wl_proxy_set_queue ((struct wl_proxy *) priv->touch, priv->queue);
+ wl_touch_add_listener (priv->touch, &touch_listener, priv);
+ } else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && priv->touch) {
+ wl_touch_destroy (priv->touch);
+ priv->touch = NULL;
+ }
+}
+
+static const struct wl_seat_listener seat_listener = {
+ seat_handle_capabilities,
+};
+
+static void
+handle_ping (void *data, struct wl_shell_surface *shell_surface,
+ uint32_t serial)
+{
+ wl_shell_surface_pong (shell_surface, serial);
+}
+
+static void
+handle_configure (void *data, struct wl_shell_surface *shell_surface,
+ uint32_t edges, int32_t width, int32_t height)
+{
+}
+
+static void
+handle_popup_done (void *data, struct wl_shell_surface *shell_surface)
+{
+}
+
+static const struct wl_shell_surface_listener shell_surface_listener = {
+ handle_ping,
+ handle_configure,
+ handle_popup_done
+};
+
+static void
+shm_format (void *data, struct wl_shm *wl_shm, uint32_t format)
+{
+ GST_DEBUG ("supported format=%08x", format);
+}
+
+static const struct wl_shm_listener shm_listener = {
+ shm_format
+};
+
+static void
+display_handle_geometry (void *data, struct wl_output *wl_output, int x, int y,
+ int physical_width, int physical_height, int subpixel, const char *make,
+ const char *model, int transform)
+{
+}
+
+static void
+display_handle_mode (void *data, struct wl_output *wl_output, uint32_t flags,
+ int width, int height, int refresh)
+{
+ GstWlDemo *priv = data;
+
+ if (flags & WL_OUTPUT_MODE_CURRENT && priv->min_refresh > refresh)
+ priv->min_refresh = refresh;
+}
+
+static void
+display_handle_done (void *data, struct wl_output *wl_output)
+{
+}
+
+static void
+display_handle_scale (void *data, struct wl_output *wl_output, int32_t scale)
+{
+}
+
+static const struct wl_output_listener output_listener = {
+ display_handle_geometry,
+ display_handle_mode,
+ display_handle_done,
+ display_handle_scale
+};
+
+static void
+registry_handle_global (void *data, struct wl_registry *registry,
+ uint32_t id, const char *interface, uint32_t version)
+{
+ GstWlDemo *priv = data;
+ struct wl_output *output;
+
+ if (g_strcmp0 (interface, "wl_compositor") == 0) {
+ priv->compositor = wl_registry_bind (registry, id, &wl_compositor_interface,
+ MIN (version, 3));
+ } else if (g_strcmp0 (interface, "wl_shell") == 0) {
+ priv->shell = wl_registry_bind (registry, id, &wl_shell_interface, 1);
+ } else if (g_strcmp0 (interface, "wl_shm") == 0) {
+ priv->shm = wl_registry_bind (registry, id, &wl_shm_interface, 1);
+ } else if (g_strcmp0 (interface, "wl_seat") == 0) {
+ priv->seat = wl_registry_bind (registry, id, &wl_seat_interface, 1);
+ wl_proxy_set_queue ((struct wl_proxy *) priv->seat, priv->queue);
+ wl_seat_add_listener (priv->seat, &seat_listener, priv);
+ } else if (g_strcmp0 (interface, "wl_output") == 0) {
+ output = wl_registry_bind (registry, id, &wl_output_interface, 1);
+ wl_proxy_set_queue ((struct wl_proxy *) output, priv->queue);
+ wl_output_add_listener (output, &output_listener, priv);
+ priv->outputs = g_list_append (priv->outputs, output);
+ }
+}
+
+static const struct wl_registry_listener registry_listener = {
+ registry_handle_global
+};
+
+static gboolean
+setup_surface (GstWlDemo * priv, struct wl_surface *surface,
+ struct wl_shell_surface *shell_surface, gint width, gint height)
+{
+ char filename[1024];
+ static int cnt = 0;
+ int fd;
+ GstVideoInfo vinfo;
+ void *data;
+ struct wl_shm_pool *shm_pool;
+ struct wl_buffer *wlbuffer;
+
+ /*
+ * waylandsink creates a wl_subsurface from an external wl_surface passed by
+ * the application and attaches buffers from the upstream to
+ * the wl_subsurface. A wl_subsurface becomes visible by mapping
+ * its parent wl_surface, so we have to draw the wl_surface that will be passed
+ * to waylandsink.
+ */
+ /* Transparently draw the area of the same size as the video resolution
+ by using a shm buffer. */
+ gst_video_info_set_format (&vinfo, GST_VIDEO_FORMAT_BGRA, width, height);
+
+ snprintf (filename, 1024, "%s/%s-demo-%d-%s", g_get_user_runtime_dir (),
+ "wayland-shm", cnt++, "XXXXXX");
+
+ fd = mkstemp (filename);
+ if (fd < 0) {
+ g_printerr ("temp file %s creation failed: %s\n", filename,
+ strerror (errno));
+ return FALSE;
+ }
+
+ if (ftruncate (fd, vinfo.size) < 0) {
+ g_printerr ("ftruncate failed: %s\n", strerror (errno));
+ close (fd);
+ return FALSE;
+ }
+
+ data = mmap (NULL, vinfo.size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ if (data == MAP_FAILED) {
+ g_printerr ("mmap failed: %s\n", strerror (errno));
+ close (fd);
+ return FALSE;
+ }
+
+ memset (data, 0, vinfo.size);
+
+ munmap (data, vinfo.size);
+
+ shm_pool = wl_shm_create_pool (priv->shm, fd, vinfo.size);
+ wlbuffer =
+ wl_shm_pool_create_buffer (shm_pool, 0, GST_VIDEO_INFO_WIDTH (&vinfo),
+ GST_VIDEO_INFO_HEIGHT (&vinfo),
+ GST_VIDEO_INFO_PLANE_STRIDE (&vinfo, 0), WL_SHM_FORMAT_ARGB8888);
+ wl_shm_pool_destroy (shm_pool);
+ unlink (filename);
+ close (fd);
+
+ wl_proxy_set_queue ((struct wl_proxy *) shell_surface, priv->queue);
+
+ wl_shell_surface_add_listener (shell_surface, &shell_surface_listener, priv);
+ wl_shell_surface_set_toplevel (shell_surface);
+
+ wl_surface_set_user_data (surface, shell_surface);
+
+ if (priv->fullscreen != -1) {
+ struct wl_event_queue *queue;
+ struct wl_region *region;
+ struct wl_output *output;
+
+ region = wl_compositor_create_region (priv->compositor);
+ wl_region_add (region, 0, 0, width, height);
+ wl_surface_set_opaque_region (surface, region);
+ wl_region_destroy (region);
+
+ output = g_list_nth_data (priv->outputs, priv->fullscreen);
+ if (!output) {
+ g_printerr
+ ("failed to get wl_output object, so could not set fullscreen\n");
+ return FALSE;
+ }
+
+ queue = wl_display_create_queue (priv->display);
+
+ wl_shell_surface_set_fullscreen (shell_surface,
+ WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, output);
+ wl_display_roundtrip_queue (priv->display, queue);
+
+ wl_event_queue_destroy (queue);
+ }
+
+ wl_surface_attach (surface, wlbuffer, 0, 0);
+ wl_surface_damage (surface, 0, 0, GST_VIDEO_INFO_WIDTH (&vinfo),
+ GST_VIDEO_INFO_HEIGHT (&vinfo));
+ wl_surface_commit (surface);
+ wl_display_flush (priv->display);
+
+ return TRUE;
+}
+
+static GstBusSyncReply
+bus_sync_handler (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+ GstWlDemo *priv = user_data;
+
+ if (gst_is_wayland_display_handle_need_context_message (message)) {
+ GstContext *context;
+
+ context = gst_wayland_display_handle_context_new (priv->display);
+ gst_element_set_context (GST_ELEMENT (GST_MESSAGE_SRC (message)), context);
+
+ goto drop;
+ } else if (gst_is_video_overlay_prepare_window_handle_message (message)) {
+ GstPad *pad;
+ GstCaps *caps;
+ GstStructure *structure;
+ struct wl_surface *surface;
+ struct wl_shell_surface *shell_surface;
+ gint width, height;
+
+ if (!g_str_has_prefix (GST_MESSAGE_SRC_NAME (message), "waylandsink"))
+ return GST_BUS_PASS;
+
+ pad = gst_element_get_static_pad ((GstElement *) GST_MESSAGE_SRC (message),
+ "sink");
+ caps = gst_pad_get_current_caps (pad);
+ structure = gst_caps_get_structure (caps, 0);
+ gst_structure_get_int (structure, "width", &width);
+ gst_structure_get_int (structure, "height", &height);
+ gst_caps_unref (caps);
+ gst_object_unref (pad);
+
+ surface = wl_compositor_create_surface (priv->compositor);
+ shell_surface = wl_shell_get_shell_surface (priv->shell, surface);
+
+ if (!setup_surface (priv, surface, shell_surface, width, height)) {
+ wl_shell_surface_destroy (shell_surface);
+ wl_surface_destroy (surface);
+ return GST_BUS_PASS;
+ }
+
+ priv->surfaces = g_list_append (priv->surfaces, surface);
+ priv->shell_surfaces = g_list_append (priv->shell_surfaces, shell_surface);
+
+ gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC
+ (message)), (guintptr) surface);
+ gst_video_overlay_set_render_rectangle (GST_VIDEO_OVERLAY (GST_MESSAGE_SRC
+ (message)), 0, 0, width, height);
+
+ goto drop;
+ }
+
+ return GST_BUS_PASS;
+
+drop:
+ gst_message_unref (message);
+ return GST_BUS_DROP;
+}
+
+static gboolean
+bus_async_handler (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+ GstWlDemo *priv = user_data;
+
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_ERROR:{
+ GError *err;
+ gchar *debug;
+
+ gst_message_parse_error (message, &err, &debug);
+ g_print ("Error: %s\n", err->message);
+ g_error_free (err);
+ g_free (debug);
+
+ goto quit;
+ }
+ case GST_MESSAGE_APPLICATION:
+ {
+ const GstStructure *s;
+
+ s = gst_message_get_structure (message);
+
+ if (gst_structure_has_name (s, "GstWaylandDemoInterrupt"))
+ goto quit;
+ }
+ break;
+ case GST_MESSAGE_EOS:
+ if (priv->nloop > 1 || priv->nloop == INFINITE_LOOP_PLAYBACK) {
+ if (!gst_element_seek (priv->pipeline,
+ 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
+ GST_SEEK_TYPE_SET, 0,
+ GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE)) {
+ g_printerr ("seek event sending failed\n");
+ goto quit;
+ }
+
+ if (priv->nloop != INFINITE_LOOP_PLAYBACK)
+ priv->nloop--;
+ break;
+ }
+
+ goto quit;
+ default:
+ break;
+ }
+
+ return TRUE;
+
+quit:
+ g_main_loop_quit (priv->loop);
+ g_source_destroy (priv->source);
+ priv->source = NULL;
+ return TRUE;
+}
+
+typedef struct _GstWaylandEventSource
+{
+ GSource source;
+ GPollFD pfd;
+ struct wl_display *display;
+ struct wl_event_queue *queue;
+ gboolean reading;
+} GstWaylandEventSource;
+
+static gboolean
+event_source_prepare (GSource * source, gint * timeout)
+{
+ GstWaylandEventSource *wl_source = (GstWaylandEventSource *) source;
+
+ *timeout = -1;
+
+ if (wl_source->reading)
+ return FALSE;
+
+ while (wl_display_prepare_read_queue (wl_source->display,
+ wl_source->queue) != 0) {
+ wl_display_dispatch_queue_pending (wl_source->display, wl_source->queue);
+ }
+ wl_display_flush (wl_source->display);
+
+ wl_source->reading = TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+event_source_check (GSource * source)
+{
+ GstWaylandEventSource *wl_source = (GstWaylandEventSource *) source;
+
+ return ! !(wl_source->pfd.revents & G_IO_IN);
+}
+
+static gboolean
+event_source_dispatch (GSource * source, GSourceFunc callback,
+ gpointer user_data)
+{
+ GstWaylandEventSource *wl_source = (GstWaylandEventSource *) source;
+
+ wl_display_read_events (wl_source->display);
+ wl_display_dispatch_queue_pending (wl_source->display, wl_source->queue);
+
+ wl_source->reading = FALSE;
+
+ return TRUE;
+}
+
+static void
+event_source_finalize (GSource * source)
+{
+ GstWaylandEventSource *wl_source = (GstWaylandEventSource *) source;
+
+ if (wl_source->reading) {
+ wl_display_cancel_read (wl_source->display);
+ wl_source->reading = FALSE;
+ }
+}
+
+static GSourceFuncs GstWaylandEventSourceFuncs = {
+ event_source_prepare,
+ event_source_check,
+ event_source_dispatch,
+ event_source_finalize
+};
+
+static void
+setup_framerate_adjustment (const GValue * item, gpointer user_data)
+{
+ GstWlDemo *priv = user_data;
+ GstElement *elem;
+ GstElement *peer_elem;
+ GstPad *pad;
+ GstPad *peer_pad;
+ GstCaps *caps;
+
+ elem = g_value_get_object (item);
+
+ if (g_str_has_prefix (GST_ELEMENT_NAME (elem), "videorate")) {
+ /* Get the element immediately after this videorate */
+ pad = gst_element_get_static_pad (elem, "src");
+ peer_pad = gst_pad_get_peer (pad);
+ peer_elem = gst_pad_get_parent_element (peer_pad);
+ gst_object_unref (pad);
+ gst_object_unref (peer_pad);
+
+ caps = gst_caps_new_simple ("video/x-raw", "framerate",
+ GST_TYPE_FRACTION, priv->min_refresh / 1000, 1, NULL);
+
+ gst_element_unlink (elem, peer_elem);
+ gst_element_link_filtered (elem, peer_elem, caps);
+ gst_object_unref (peer_elem);
+ }
+}
+
+static GstPadProbeReturn
+cb_have_data (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
+{
+ GstWlDemo *priv = user_data;
+ time_t t;
+ struct tm *tm;
+ gint64 cur_time;
+ gint64 framesinsec;
+ static gint64 prev_time = 0;
+ static gint64 prev_cnt = 0;
+
+ priv->frame_cnt++;
+
+ if (prev_time == 0) {
+ prev_time = g_get_monotonic_time ();
+ return GST_PAD_PROBE_OK;
+ }
+
+ cur_time = g_get_monotonic_time ();
+
+ if (cur_time - prev_time >= 1000000) {
+ framesinsec = priv->frame_cnt - prev_cnt;
+ t = time (NULL);
+ tm = localtime (&t);
+
+ g_print ("FPS: %3ld TIME %02d:%02d:%02d\n", framesinsec, tm->tm_hour,
+ tm->tm_min, tm->tm_sec);
+
+ prev_cnt = priv->frame_cnt;
+ prev_time = cur_time;
+ }
+
+ return GST_PAD_PROBE_OK;
+}
+
+static gboolean
+sigint_handler (gpointer user_data)
+{
+ GstWlDemo *priv = user_data;
+
+ gst_element_post_message (GST_ELEMENT (priv->pipeline),
+ gst_message_new_application (GST_OBJECT (priv->pipeline),
+ gst_structure_new ("GstWaylandDemoInterrupt", "message",
+ G_TYPE_STRING, "Pipeline interrupted", NULL)));
+
+ priv->signal_watch_id = 0;
+
+ return FALSE;
+}
+
+static void
+shell_surface_destroy (struct wl_shell_surface *shell_surface)
+{
+ wl_shell_surface_destroy (shell_surface);
+}
+
+static void
+surface_destroy (struct wl_surface *surface)
+{
+ wl_surface_destroy (surface);
+}
+
+static void
+output_destroy (struct wl_output *output)
+{
+ wl_output_destroy (output);
+}
+
+int
+main (int argc, char **argv)
+{
+ GstWaylandEventSource *wl_source;
+ GstWlDemo *priv;
+ GOptionContext *context;
+ GstBus *bus;
+ GstIterator *it;
+ GstElement *elem;
+ GstPad *pad;
+ GstStateChangeReturn state_ret;
+ GTimer *timer = NULL;
+ GError *error = NULL;
+ guint bus_watch_id;
+ gint fullscreen = -1;
+ gint nloop = 0;
+ gchar *measuring_pad = NULL;
+ gchar *elem_name;
+ gchar *pad_name;
+ gdouble elapsed;
+ gchar **argvn;
+ gint i;
+ int ret = EXIT_FAILURE;
+ GOptionEntry options[] = {
+ {"fullscreen", 'f', 0, G_OPTION_ARG_INT, &fullscreen,
+ "Display in fullscreen mode on dest_num output [-f dest_num]", NULL},
+ {"loop", 'l', 0, G_OPTION_ARG_INT, &nloop,
+ "Loop Playback for loop_count [-l loop_count]", NULL},
+ {"fps", 'p', 0, G_OPTION_ARG_STRING, &measuring_pad,
+ "Framerate display (specify a measuring point as regular format [-p element:pad])",
+ NULL},
+ {NULL}
+ };
+
+#ifdef USE_AGL
+
+ //char *static_options[] = { argv[0], "filesrc", "location=/home/0/3.mp4", "!", "decodebin", "!", "videoconvert", "!", "waylandsink", "sync=false", NULL };
+ //char **static_argv = static_options;
+ //int static_argc = 10;
+ char **static_argv = NULL;
+ int static_argc = 0;
+
+ // Parse args
+ int port;
+ const char *token;
+
+ // Get app id
+ const char *afm_id = getenv("AFM_ID");
+ if (afm_id == NULL || !afm_id[0]) {
+ afm_id = argv[0];
+ }
+
+ // Get pipeline information
+ auto path = std::string(getenv("AFM_APP_INSTALL_DIR"));
+ path = path + "/pipeline.ini";
+
+ FILE *pFile;
+ long lSize;
+ size_t res;
+ char * pipe = NULL;
+ // Read pipeline from file
+ pFile = fopen ( path.c_str() , "rb" );
+ if (pFile==NULL){
+ fprintf(stderr, "failed to open file\n");
+ return -1;
+ }
+
+ // obtain file size
+ fseek (pFile , 0 , SEEK_END);
+ lSize = ftell (pFile);
+ rewind (pFile);
+
+ // allocate memory to contain the whole file
+ pipe = (char*) malloc (sizeof(char)*lSize);
+ if (pipe == NULL){
+ fprintf(stderr,"Cannot allocate memory\n");
+ return -1;
+ }
+
+ // copy the file into the buffer
+ res = fread (pipe,1,lSize,pFile);
+ if (res != lSize){
+ fprintf(stderr,"File read error\n");
+ return -1;
+ }
+ //fprintf(stderr,pipe);
+
+ /* close file */
+ fclose (pFile);
+
+ char seg[] = " ";
+ char *charlist[50];
+ static_argv = charlist;
+
+ int memlen = 0;
+ memlen = strlen(argv[0])+1;
+ charlist[0] = (char*) malloc (memlen);
+ memset(charlist[0],0,memlen);
+ strcpy(charlist[0],argv[0]);
+
+ int cnt = 1;
+
+ char *substr= strtok(pipe,seg);
+ while (substr != NULL) {
+ memlen = strlen(substr)+1;
+ charlist[cnt] = (char*) malloc (memlen);
+ memset(charlist[cnt],0,memlen);
+ strcpy(charlist[cnt],substr);
+ cnt++;
+ substr = strtok(NULL,seg);
+ }
+
+ if(pipe != NULL)
+ free(pipe);
+
+ port = std::stol(argv[1]);
+ token = argv[2];
+
+ fprintf(stderr, "port: { %d }, token: { %s}, id: { %s } \n", port, token, afm_id);
+
+ static_argc = cnt;
+ gst_init (&static_argc, &static_argv);
+
+ RunXDG runxdg(port, token, afm_id);
+
+ // @tobi websocket
+ websocket_init();
+ GST_ERROR("[%s] [%s] end", "WebSocket_Debug", __func__);
+
+ runxdg.start();
+#else
+ gst_init (&argc, &argv);
+#endif
+
+ context = g_option_context_new ("PIPELINE-DESCRIPTION");
+ g_option_context_add_main_entries (context, options, NULL);
+ g_option_context_add_group (context, gst_init_get_option_group ());
+#ifdef USE_AGL
+ if (!g_option_context_parse (context, &static_argc, &static_argv, &error)) {
+#else
+ if (!g_option_context_parse (context, &argc, &argv, &error)) {
+#endif
+ g_printerr ("option parsing failed: %s\n",
+ (error) ? error->message : "Unknown error");
+ return EXIT_FAILURE;
+ }
+ g_option_context_free (context);
+
+ priv = g_slice_new0 (GstWlDemo);
+
+ priv->fullscreen = fullscreen;
+ priv->nloop = nloop;
+ priv->min_refresh = G_MAXINT;
+
+ priv->loop = g_main_loop_new (NULL, FALSE);
+
+ /* Construct a pipeline from the result of parsing argv
+ similarly to gst-launch. */
+#ifdef USE_AGL
+ argvn = g_new0 (char *, static_argc);
+ memcpy (argvn, static_argv + 1, sizeof (char *) * (static_argc - 1));
+#else
+ argvn = g_new0 (char *, argc);
+ memcpy (argvn, argv + 1, sizeof (char *) * (argc - 1));
+#endif
+ error = NULL;
+ priv->pipeline = gst_parse_launchv ((const gchar **) argvn, &error);
+ g_free (argvn);
+
+ if (!priv->pipeline) {
+ g_printerr ("pipeline could not be constructed: %s\n",
+ (error) ? error->message : "Unknown error");
+ return EXIT_FAILURE;
+ }
+
+ priv->signal_watch_id =
+ g_unix_signal_add (SIGINT, (GSourceFunc) sigint_handler, priv);
+
+ bus = gst_pipeline_get_bus (GST_PIPELINE (priv->pipeline));
+ gst_bus_set_sync_handler (bus, bus_sync_handler, priv, NULL);
+ bus_watch_id = gst_bus_add_watch (bus, bus_async_handler, priv);
+ gst_object_unref (bus);
+
+ priv->display = wl_display_connect (NULL);
+ if (!priv->display) {
+ g_printerr ("display connection failed\n");
+ goto leave;
+ }
+
+ priv->queue = wl_display_create_queue (priv->display);
+
+ priv->registry = wl_display_get_registry (priv->display);
+ wl_proxy_set_queue ((struct wl_proxy *) priv->registry, priv->queue);
+ wl_registry_add_listener (priv->registry, &registry_listener, priv);
+
+ /* Need 2 roundtrips to do all the global objects processing. */
+ for (i = 0; i < 2; i++)
+ wl_display_roundtrip_queue (priv->display, priv->queue);
+
+ priv->source = g_source_new (&GstWaylandEventSourceFuncs,
+ sizeof (GstWaylandEventSource));
+ wl_source = (GstWaylandEventSource *) priv->source;
+
+ wl_source->pfd.fd = wl_display_get_fd (priv->display);
+ wl_source->pfd.events = G_IO_IN | G_IO_ERR | G_IO_HUP;
+ g_source_add_poll (priv->source, &wl_source->pfd);
+
+ wl_source->display = priv->display;
+ wl_source->queue = priv->queue;
+ wl_source->reading = FALSE;
+ g_source_attach (priv->source, NULL);
+ g_source_unref (priv->source);
+
+ /* Setup the framerate adjustment by videorate. */
+ it = gst_bin_iterate_elements (GST_BIN (priv->pipeline));
+ gst_iterator_foreach (it, setup_framerate_adjustment, priv);
+ gst_iterator_free (it);
+
+ if (measuring_pad) {
+ elem_name = strtok (measuring_pad, ":");
+ pad_name = strtok (NULL, ":");
+ if (!elem_name || !pad_name) {
+ g_printerr ("tokens extraction failed\n");
+ goto leave;
+ }
+
+ elem = gst_bin_get_by_name (GST_BIN (priv->pipeline), elem_name);
+ if (!elem) {
+ g_printerr ("failed to get the element by name\n");
+ goto leave;
+ }
+
+ pad = gst_element_get_static_pad (elem, pad_name);
+ if (!pad) {
+ g_printerr ("failed to get the static pad by name\n");
+ gst_object_unref (elem);
+ goto leave;
+ }
+
+ gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER,
+ (GstPadProbeCallback) cb_have_data, priv, NULL);
+
+ gst_object_unref (pad);
+ gst_object_unref (elem);
+
+ /* To calculate the average framerate throughout the playback. */
+ timer = g_timer_new ();
+ }
+
+ state_ret = gst_element_set_state (priv->pipeline, GST_STATE_PAUSED);
+ while (state_ret == GST_STATE_CHANGE_ASYNC) {
+ state_ret = gst_element_get_state (priv->pipeline, NULL, NULL,
+ GST_CLOCK_TIME_NONE);
+ }
+
+ if (timer)
+ g_timer_start (timer);
+
+ gst_element_set_state (priv->pipeline, GST_STATE_PLAYING);
+
+ g_main_loop_run (priv->loop);
+
+ if (timer) {
+ g_timer_stop (timer);
+ elapsed = g_timer_elapsed (timer, NULL);
+ g_timer_destroy (timer);
+ g_print ("Avg. FPS: %.2lf\n", priv->frame_cnt / elapsed);
+ }
+
+ gst_element_set_state (priv->pipeline, GST_STATE_NULL);
+
+ ret = 0;
+
+leave:
+ GST_ERROR ("log: gst_wl_display_finalize");
+
+ if (priv->source)
+ g_source_destroy (priv->source);
+
+ gst_object_unref (priv->pipeline);
+
+ if (priv->shell_surfaces) {
+ g_list_foreach (priv->shell_surfaces, (GFunc) shell_surface_destroy, NULL);
+ g_list_free (priv->shell_surfaces);
+ }
+
+ if (priv->surfaces) {
+ g_list_foreach (priv->surfaces, (GFunc) surface_destroy, NULL);
+ g_list_free (priv->surfaces);
+ }
+
+ if (priv->outputs) {
+ g_list_foreach (priv->outputs, (GFunc) output_destroy, NULL);
+ g_list_free (priv->outputs);
+ }
+
+ if (priv->shm)
+ wl_shm_destroy (priv->shm);
+ if (priv->shell)
+ wl_shell_destroy (priv->shell);
+ if (priv->registry)
+ wl_registry_destroy (priv->registry);
+ if (priv->compositor)
+ wl_compositor_destroy (priv->compositor);
+ if (priv->queue)
+ wl_event_queue_destroy (priv->queue);
+ if (priv->display)
+ wl_display_disconnect (priv->display);
+
+ g_source_remove (bus_watch_id);
+ if (priv->signal_watch_id > 0)
+ g_source_remove (priv->signal_watch_id);
+ g_main_loop_unref (priv->loop);
+ g_slice_free (GstWlDemo, priv);
+
+ if (measuring_pad)
+ g_free (measuring_pad);
+
+#ifdef USE_AGL
+ for(int i=0;i<cnt;i++)
+ {
+ if(charlist[i]!=NULL)
+ free(charlist[i]);
+ }
+#endif
+
+ return ret;
+}
diff --git a/src/gst-wayland-demo.hpp b/src/gst-wayland-demo.hpp
new file mode 100644
index 0000000..9a5632f
--- /dev/null
+++ b/src/gst-wayland-demo.hpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2017 Panasonic Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef GST_WAYLAND_HPP
+#define GST_WAYLAND_HPP
+
+#include <string>
+#include <vector>
+#include <map>
+#include <algorithm>
+
+#include <gio/gio.h>
+
+#include <ilm/ilm_control.h>
+#include <ilm/ilm_input.h>
+
+#include <libwindowmanager.h>
+#include <libhomescreen.hpp>
+
+#define AGL_FATAL(fmt, ...) fatal("ERROR: " fmt "\n", ##__VA_ARGS__)
+#define AGL_WARN(fmt, ...) warn("WARNING: " fmt "\n", ##__VA_ARGS__)
+#define AGL_DEBUG(fmt, ...) debug("DEBUG: " fmt "\n", ##__VA_ARGS__)
+#define AGL_TRACE(file,line) debug("%s:%d\n", file,line);
+
+void fatal (const char* format, ...);
+void warn (const char* format, ...);
+void debug (const char* format, ...);
+
+struct Carla_Info {
+ std::string yaw;
+ double longitude;
+ double latitude;
+ int speed;
+};
+
+class ILMControl
+{
+ public:
+ ILMControl(notificationFunc callback, void *user_data) {
+ ilm_init();
+ ilm_registerNotification(callback, user_data);
+ }
+
+ ~ILMControl(void) {
+ ilm_unregisterNotification();
+ ilm_destroy();
+ AGL_DEBUG("ilm_destory().\n");
+ }
+};
+
+class RunXDG
+{
+ public:
+ RunXDG(int port, const char* token, const char* id);
+
+ void start(void);
+ void notify_ivi_control_cb(ilmObjectType object, t_ilm_uint id,
+ t_ilm_bool created);
+ static void notify_ivi_control_cb_static (ilmObjectType object,
+ t_ilm_uint id,
+ t_ilm_bool created,
+ void *user_data);
+ void on_event(void *closure, const char *event, struct afb_wsj1_msg *msg);
+
+ private:
+ std::string m_role;
+ std::string m_path;
+
+ std::string m_id;
+ pid_t m_pid;
+
+ int m_port;
+ std::string m_token;
+
+ struct afb_wsj1* sp_websock;
+ struct afb_wsj1_itf minterface;
+ sd_event* mploop;
+ std::string muri;
+ struct Carla_Info m_carla_info;
+
+ LibWindowmanager *m_wm;
+ LibHomeScreen *m_hs;
+ ILMControl *m_ic;
+
+ t_ilm_surface m_ivi_id;
+
+ std::map<int, int> m_surfaces; // pair of <afm:rid, ivi:id>
+
+ bool m_pending_create = false;
+
+ int init_wm(void);
+ int init_hs(void);
+ int init_carlaclient(void);
+
+ int parse_config(const char *file);
+
+ void setup_ivi_surface(void);
+};
+
+#endif // GST_WAYLAND_HPP
diff --git a/src/parson.h b/src/parson.h
new file mode 100644
index 0000000..fc5a4bb
--- /dev/null
+++ b/src/parson.h
@@ -0,0 +1,234 @@
+/*
+ Parson ( http://kgabis.github.com/parson/ )
+ Copyright (c) 2012 - 2017 Krzysztof Gabis
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+*/
+
+#ifndef parson_parson_h
+#define parson_parson_h
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stddef.h> /* size_t */
+
+/* Types and enums */
+typedef struct json_object_t JSON_Object;
+typedef struct json_array_t JSON_Array;
+typedef struct json_value_t JSON_Value;
+
+enum json_value_type {
+ JSONError = -1,
+ JSONNull = 1,
+ JSONString = 2,
+ JSONNumber = 3,
+ JSONObject = 4,
+ JSONArray = 5,
+ JSONBoolean = 6
+};
+typedef int JSON_Value_Type;
+
+enum json_result_t {
+ JSONSuccess = 0,
+ JSONFailure = -1
+};
+typedef int JSON_Status;
+
+typedef void * (*JSON_Malloc_Function)(size_t);
+typedef void (*JSON_Free_Function)(void *);
+
+/* Call only once, before calling any other function from parson API. If not called, malloc and free
+ from stdlib will be used for all allocations */
+void json_set_allocation_functions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun);
+
+/* Parses first JSON value in a file, returns NULL in case of error */
+JSON_Value * json_parse_file(const char *filename);
+
+/* Parses first JSON value in a file and ignores comments (/ * * / and //),
+ returns NULL in case of error */
+JSON_Value * json_parse_file_with_comments(const char *filename);
+
+/* Parses first JSON value in a string, returns NULL in case of error */
+JSON_Value * json_parse_string(const char *string);
+
+/* Parses first JSON value in a string and ignores comments (/ * * / and //),
+ returns NULL in case of error */
+JSON_Value * json_parse_string_with_comments(const char *string);
+
+/* Serialization */
+size_t json_serialization_size(const JSON_Value *value); /* returns 0 on fail */
+JSON_Status json_serialize_to_buffer(const JSON_Value *value, char *buf, size_t buf_size_in_bytes);
+JSON_Status json_serialize_to_file(const JSON_Value *value, const char *filename);
+char * json_serialize_to_string(const JSON_Value *value);
+
+/* Pretty serialization */
+size_t json_serialization_size_pretty(const JSON_Value *value); /* returns 0 on fail */
+JSON_Status json_serialize_to_buffer_pretty(const JSON_Value *value, char *buf, size_t buf_size_in_bytes);
+JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename);
+char * json_serialize_to_string_pretty(const JSON_Value *value);
+
+void json_free_serialized_string(char *string); /* frees string from json_serialize_to_string and json_serialize_to_string_pretty */
+
+/* Comparing */
+int json_value_equals(const JSON_Value *a, const JSON_Value *b);
+
+/* Validation
+ This is *NOT* JSON Schema. It validates json by checking if object have identically
+ named fields with matching types.
+ For example schema {"name":"", "age":0} will validate
+ {"name":"Joe", "age":25} and {"name":"Joe", "age":25, "gender":"m"},
+ but not {"name":"Joe"} or {"name":"Joe", "age":"Cucumber"}.
+ In case of arrays, only first value in schema is checked against all values in tested array.
+ Empty objects ({}) validate all objects, empty arrays ([]) validate all arrays,
+ null validates values of every type.
+ */
+JSON_Status json_validate(const JSON_Value *schema, const JSON_Value *value);
+
+/*
+ * JSON Object
+ */
+JSON_Value * json_object_get_value (const JSON_Object *object, const char *name);
+const char * sdl_json_object_get_string (const JSON_Object *object, const char *name);
+JSON_Object * sdl_json_object_get_object (const JSON_Object *object, const char *name);
+JSON_Array * sdl_json_object_get_array (const JSON_Object *object, const char *name);
+double json_object_get_number (const JSON_Object *object, const char *name); /* returns 0 on fail */
+int sdl_json_object_get_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */
+
+/* dotget functions enable addressing values with dot notation in nested objects,
+ just like in structs or c++/java/c# objects (e.g. objectA.objectB.value).
+ Because valid names in JSON can contain dots, some values may be inaccessible
+ this way. */
+JSON_Value * json_object_dotget_value (const JSON_Object *object, const char *name);
+const char * json_object_dotget_string (const JSON_Object *object, const char *name);
+JSON_Object * json_object_dotget_object (const JSON_Object *object, const char *name);
+JSON_Array * json_object_dotget_array (const JSON_Object *object, const char *name);
+double json_object_dotget_number (const JSON_Object *object, const char *name); /* returns 0 on fail */
+int json_object_dotget_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */
+
+/* Functions to get available names */
+size_t json_object_get_count (const JSON_Object *object);
+const char * json_object_get_name (const JSON_Object *object, size_t index);
+JSON_Value * json_object_get_value_at(const JSON_Object *object, size_t index);
+JSON_Value * json_object_get_wrapping_value(const JSON_Object *object);
+
+/* Functions to check if object has a value with a specific name. Returned value is 1 if object has
+ * a value and 0 if it doesn't. dothas functions behave exactly like dotget functions. */
+int json_object_has_value (const JSON_Object *object, const char *name);
+int json_object_has_value_of_type(const JSON_Object *object, const char *name, JSON_Value_Type type);
+
+int json_object_dothas_value (const JSON_Object *object, const char *name);
+int json_object_dothas_value_of_type(const JSON_Object *object, const char *name, JSON_Value_Type type);
+
+/* Creates new name-value pair or frees and replaces old value with a new one.
+ * json_object_set_value does not copy passed value so it shouldn't be freed afterwards. */
+JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value);
+JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string);
+JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number);
+JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean);
+JSON_Status json_object_set_null(JSON_Object *object, const char *name);
+
+/* Works like dotget functions, but creates whole hierarchy if necessary.
+ * json_object_dotset_value does not copy passed value so it shouldn't be freed afterwards. */
+JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value);
+JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string);
+JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number);
+JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean);
+JSON_Status json_object_dotset_null(JSON_Object *object, const char *name);
+
+/* Frees and removes name-value pair */
+JSON_Status json_object_remove(JSON_Object *object, const char *name);
+
+/* Works like dotget function, but removes name-value pair only on exact match. */
+JSON_Status json_object_dotremove(JSON_Object *object, const char *key);
+
+/* Removes all name-value pairs in object */
+JSON_Status json_object_clear(JSON_Object *object);
+
+/*
+ *JSON Array
+ */
+JSON_Value * json_array_get_value (const JSON_Array *array, size_t index);
+const char * json_array_get_string (const JSON_Array *array, size_t index);
+JSON_Object * json_array_get_object (const JSON_Array *array, size_t index);
+JSON_Array * json_array_get_array (const JSON_Array *array, size_t index);
+double json_array_get_number (const JSON_Array *array, size_t index); /* returns 0 on fail */
+int json_array_get_boolean(const JSON_Array *array, size_t index); /* returns -1 on fail */
+size_t json_array_get_count (const JSON_Array *array);
+JSON_Value * json_array_get_wrapping_value(const JSON_Array *array);
+
+/* Frees and removes value at given index, does nothing and returns JSONFailure if index doesn't exist.
+ * Order of values in array may change during execution. */
+JSON_Status json_array_remove(JSON_Array *array, size_t i);
+
+/* Frees and removes from array value at given index and replaces it with given one.
+ * Does nothing and returns JSONFailure if index doesn't exist.
+ * json_array_replace_value does not copy passed value so it shouldn't be freed afterwards. */
+JSON_Status json_array_replace_value(JSON_Array *array, size_t i, JSON_Value *value);
+JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string);
+JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number);
+JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean);
+JSON_Status json_array_replace_null(JSON_Array *array, size_t i);
+
+/* Frees and removes all values from array */
+JSON_Status json_array_clear(JSON_Array *array);
+
+/* Appends new value at the end of array.
+ * json_array_append_value does not copy passed value so it shouldn't be freed afterwards. */
+JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value);
+JSON_Status json_array_append_string(JSON_Array *array, const char *string);
+JSON_Status json_array_append_number(JSON_Array *array, double number);
+JSON_Status json_array_append_boolean(JSON_Array *array, int boolean);
+JSON_Status json_array_append_null(JSON_Array *array);
+
+/*
+ *JSON Value
+ */
+JSON_Value * json_value_init_object (void);
+JSON_Value * json_value_init_array (void);
+JSON_Value * json_value_init_string (const char *string); /* copies passed string */
+JSON_Value * json_value_init_number (double number);
+JSON_Value * json_value_init_boolean(int boolean);
+JSON_Value * json_value_init_null (void);
+JSON_Value * json_value_deep_copy (const JSON_Value *value);
+void json_value_free (JSON_Value *value);
+
+JSON_Value_Type json_value_get_type (const JSON_Value *value);
+JSON_Object * json_value_get_object (const JSON_Value *value);
+JSON_Array * json_value_get_array (const JSON_Value *value);
+const char * json_value_get_string (const JSON_Value *value);
+double json_value_get_number (const JSON_Value *value);
+int json_value_get_boolean(const JSON_Value *value);
+JSON_Value * json_value_get_parent (const JSON_Value *value);
+
+/* Same as above, but shorter */
+JSON_Value_Type sdl_json_type (const JSON_Value *value);
+JSON_Object * sdl_json_object (const JSON_Value *value);
+JSON_Array * json_array (const JSON_Value *value);
+const char * json_string (const JSON_Value *value);
+double json_number (const JSON_Value *value);
+int json_boolean(const JSON_Value *value);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/sdl-protocol.c b/src/sdl-protocol.c
new file mode 100644
index 0000000..a04dcbd
--- /dev/null
+++ b/src/sdl-protocol.c
@@ -0,0 +1,5026 @@
+#include <libwebsockets.h>
+#include <pthread.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/syscall.h>
+#include <stdbool.h>
+
+#include "parson.h"
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <math.h>
+#include <errno.h>
+
+// Can受信.
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <sys/uio.h>
+#include <net/if.h>
+#include <linux/can.h>
+#include <linux/can/raw.h>
+#include <stdint.h>
+#include <unistd.h>
+
+#include <signal.h>
+#include <libgen.h>
+#include <wayland-util.h>
+
+#define MAX_DATA_SIZE 8192/* 一度にwebsocketに送信できる最大サイズ */
+#define STACK_SIZE 10 /* スタックデータ数の最大値 */
+
+#define DEBUG_LOG_ENABLE (1)
+
+struct lws_context* g_lws_context;
+pthread_t g_pthread_t;
+
+void lws_touch_handle_down(uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w);
+void lws_touch_handle_up(uint32_t time, int32_t id);
+void lws_touch_handle_motion(uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w);
+
+// 前方宣言(Websocket)
+static int getRPCType(char*);
+static char* getMethodStr(char*);
+static void persistence(char*);
+
+static void receive_rpc_vr(struct lws*, unsigned int, char*, int);
+static void receive_rpc_tts(struct lws*, unsigned int, char*, int);
+static void receive_rpc_ui(char* string, struct lws*, unsigned int, char*, int);
+static void receive_rpc_navigation(struct lws*, unsigned int, char*, int);
+static void receive_rpc_vehicleInfo(struct lws*, unsigned int, char*, int);
+static void receive_rpc_rc(struct lws*, unsigned int, char*, int);
+static void receive_rpc_buttons(struct lws*, unsigned int, char*, int);
+static void receive_rpc_basiccommunication(struct lws*, unsigned int, char*, int, char*);
+static void receive_rpc_sdl(struct lws*, unsigned int, char*, int, char*);
+static void receive_persistence(char*, struct lws*);
+static void send_registerComponent(struct lws*, unsigned int, unsigned int);
+static void send_registerComponent_VR(struct lws*);
+static void send_registerComponent_Navigation(struct lws*);
+static void send_registerComponent_TTS(struct lws*);
+static void send_registerComponent_UI(struct lws*);
+static void send_registerComponent_Buttons(struct lws*);
+static void send_registerComponent_VehicleInfo(struct lws*);
+static void send_registerComponent_RC(struct lws*);
+static void send_registerComponent_BasicCommunication(struct lws*);
+
+static void send_subscribeTo_Navigation_OnAudioDataStreaming(struct lws*);
+static void send_subscribeTo_Navigation_OnVideoDataStreaming(struct lws*);
+static void send_subscribeTo_UI_OnRecordStart(struct lws*);
+static void send_subscribeTo_Buttons_OnButtonSubscription(struct lws*);
+static void send_subscribeTo_BasicCommunication_OnPutFile(struct lws*);
+static void send_subscribeTo_BasicCommunication_OnSDLPersistenceComplete(struct lws*);
+static void send_subscribeTo_BasicCommunication_OnFileRemoved(struct lws*);
+static void send_subscribeTo_BasicCommunication_OnAppRegistered(struct lws*);
+static void send_subscribeTo_BasicCommunication_OnAppUnregistered(struct lws*);
+static void send_subscribeTo_BasicCommunication_OnSDLClose(struct lws*);
+static void send_subscribeTo_BasicCommunication_OnResumeAudioSource(struct lws*);
+static void send_subscribeTo_SDL_OnSDLConsentNeeded(struct lws*);
+static void send_subscribeTo_SDL_OnStatusUpdate(struct lws*);
+static void send_subscribeTo_SDL_OnAppPermissionChanged(struct lws*);
+static void send_subscribeTo_Navigation(struct lws*, unsigned int, char*);
+static void send_subscribeTo_UI(struct lws*, unsigned int, char*);
+static void send_subscribeTo_Buttons(struct lws*, unsigned int, char*);
+static void send_subscribeTo_BasicCommunication(struct lws*, unsigned int, char*);
+
+static void send_BasicCommunication_GetSystemInfo(struct lws* wsi, unsigned int id);
+static void send_BasicCommunication_OnReady(struct lws*);
+static void send_rpc_vr_GetCapabilities(struct lws* , unsigned int, int);
+static void send_rpc_ui_GetCapabilities(struct lws* , unsigned int, int);
+static void send_rpc_tts_GetCapabilities(struct lws* , unsigned int, int);
+static void send_rpc_rc_GetCapabilities(struct lws* , unsigned int, int);
+static void send_rpc_buttons_GetCapabilities(struct lws* , unsigned int, int);
+static void do_lws_write(struct lws*, char* , JSON_Value*);
+
+static void send_rpc_isReady(struct lws*, unsigned int, int);
+static void send_rpc_GetLanguage(struct lws* , unsigned int, int );
+static void send_rpc_GetSupportedLanguages(struct lws* , unsigned int, int );
+static void send_BasicCommunication_MixingAudioSupported(struct lws*, unsigned int);
+static void renketu_write(struct lws*, JSON_Value *, JSON_Object *, char* );
+
+static void send_rpc_VehicleInfo_GetVehicleData(wsi, id, rpctype);
+static void send_rpc_VehicleInfo_GetVehicleType(wsi, id, rpctype);
+static void send_rpc_rc_OnRemoteControlSettings(struct lws*, unsigned int, int );
+
+static void send_rpc_VehicleInfo_SubscribeVehicleData(struct lws*, unsigned int, int);
+static void send_rpc_VehicleInfo_UnsubscribeVehicleData(struct lws*, unsigned int, int);
+static void do_lws_write_can(struct lws*, char*);
+static void parse_VehicleData_string(const char *);
+
+static void send_BasicCommunication_OnFindApplications(struct lws*);
+// アプリ起動関連
+static void send_rpc_ChangeRegistration(struct lws*, unsigned int, int);
+static void send_rpc_AddCommand(struct lws*, unsigned int, int );
+static void send_BasicCommunication_UpdateDeviceList(struct lws*, unsigned int, char*);
+static void do_send_BasicCommunication_UpdateDeviceList(struct lws*, unsigned int);
+static void send_rpc_tts_SetGlobalProperties(struct lws*, unsigned int);
+static void send_rpc_ui_SetAppIcon(struct lws*, unsigned int);
+static void saveparam_BasicCommunication_OnAppRegistered(struct lws*, unsigned int, char*);
+static void releaseparam_BasicCommunication_OnAppUnregistered(struct lws*, unsigned int, char*);
+static void send_BasicCommunication_UpdateAppList(struct lws*, unsigned int, char*);
+static void send_BasicCommunication_OnAppDeactivated(struct lws*);
+static void send_BasicCommunication_PolicyUpdate(struct lws*, unsigned int);
+static void send_BasicCommunication_ActivateApp(struct lws*, unsigned int);
+static void send_sdl_OnStatusUpdate(struct lws*, unsigned int, char*);
+static void send_sdl_GetUserFriendlyMessage(struct lws*);
+static void send_sdl_GetURLS(struct lws*);
+static void send_sdl_ActivateApp(struct lws*);
+static void send_BasicCommunication_OnSystemRequest(struct lws*, unsigned int);
+static void send_navigation_SetVideoConfig(struct lws*, unsigned int);
+static void send_navigation_StartStream(struct lws*, unsigned int);
+static void send_navigation_StartAudioStream(struct lws*, unsigned int);
+static void send_navigation_StopAudioStream(struct lws*, unsigned int);
+// タッチイベント関連UI.OnTouchEvent
+static void send_ui_OnTouchEvent(struct lws*, unsigned int, unsigned int, unsigned int, unsigned int, char*);
+
+//PAT
+static void send_rpc_ui_EndAudioPassThru(struct lws*, unsigned int);
+static void send_rpc_ui_EndAudioPassThru_error(struct lws*, unsigned int);
+static void send_rpc_ui_PerformAudioPassThru(struct lws*);
+static void send_rpc_ui_PerformAudioPassThru_error(struct lws*, unsigned int);
+void *PerformAudioPassThru_timerThread(void *wsi);
+
+//CAN
+static void send_OnVehicleData(struct canfd_frame);
+static void send_BasicCommunication_illumi_OnSystemRequest(struct canfd_frame);
+
+//Bluetooth
+static void send_BasicCommunication_OnStartDeviceDiscovery(struct lws*);
+static void start_OnStartDeviceDiscovery_thread();
+//sysmteRequest RequestType
+#define HTTP 0
+#define FILE_RESUME 1
+#define AUTH_REQUEST 2
+#define AUTH_CHALLENGE 3
+#define AUTH_ACK 4
+#define PROPRIETARY 5
+
+#ifdef _MSC_VER
+#ifndef _CRT_SECURE_NO_WARNINGS
+#define _CRT_SECURE_NO_WARNINGS
+#endif /* _CRT_SECURE_NO_WARNINGS */
+#endif /* _MSC_VER */
+
+/* Apparently sscanf is not implemented in some "standard" libraries, so don't use it, if you
+ * don't have to. */
+#define sscanf THINK_TWICE_ABOUT_USING_SSCANF
+
+#define STARTING_CAPACITY 16
+#define MAX_NESTING 8192
+#define FLOAT_FORMAT "%1.17g"
+
+#define SIZEOF_TOKEN(a) (sizeof(a) - 1)
+#define SKIP_CHAR(str) ((*str)++)
+#define SKIP_WHITESPACES(str) while (isspace((unsigned char)(**str))) { SKIP_CHAR(str); }
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+
+#undef malloc
+#undef free
+
+static JSON_Malloc_Function parson_malloc = malloc;
+static JSON_Free_Function parson_free = free;
+
+#define IS_CONT(b) (((unsigned char)(b) & 0xC0) == 0x80) /* is utf-8 continuation byte */
+
+/* Type definitions */
+typedef union json_value_value {
+ char *string;
+ double number;
+ JSON_Object *object;
+ JSON_Array *array;
+ int boolean;
+ int null;
+} JSON_Value_Value;
+
+struct json_value_t {
+ JSON_Value *parent;
+ JSON_Value_Type type;
+ JSON_Value_Value value;
+};
+
+struct json_object_t {
+ JSON_Value *wrapping_value;
+ char **names;
+ JSON_Value **values;
+ size_t count;
+ size_t capacity;
+};
+
+struct json_array_t {
+ JSON_Value *wrapping_value;
+ JSON_Value **items;
+ size_t count;
+ size_t capacity;
+};
+
+/* Various */
+static char * read_file(const char *filename);
+static void remove_comments(char *string, const char *start_token, const char *end_token);
+static char * parson_strndup(const char *string, size_t n);
+static char * parson_strdup(const char *string);
+static int hex_char_to_int(char c);
+static int parse_utf16_hex(const char *string, unsigned int *result);
+static int num_bytes_in_utf8_sequence(unsigned char c);
+static int verify_utf8_sequence(const unsigned char *string, int *len);
+static int is_valid_utf8(const char *string, size_t string_len);
+static int is_decimal(const char *string, size_t length);
+
+/* JSON Object */
+static JSON_Object * json_object_init(JSON_Value *wrapping_value);
+static JSON_Status json_object_add(JSON_Object *object, const char *name, JSON_Value *value);
+static JSON_Status json_object_resize(JSON_Object *object, size_t new_capacity);
+static JSON_Value * json_object_nget_value(const JSON_Object *object, const char *name, size_t n);
+static void json_object_free(JSON_Object *object);
+
+/* JSON Array */
+static JSON_Array * json_array_init(JSON_Value *wrapping_value);
+static JSON_Status json_array_add(JSON_Array *array, JSON_Value *value);
+static JSON_Status json_array_resize(JSON_Array *array, size_t new_capacity);
+static void json_array_free(JSON_Array *array);
+
+/* JSON Value */
+static JSON_Value * json_value_init_string_no_copy(char *string);
+
+/* Parser */
+static JSON_Status skip_quotes(const char **string);
+static int parse_utf16(const char **unprocessed, char **processed);
+static char * process_string(const char *input, size_t len);
+static char * get_quoted_string(const char **string);
+static JSON_Value * parse_object_value(const char **string, size_t nesting);
+static JSON_Value * parse_array_value(const char **string, size_t nesting);
+static JSON_Value * parse_string_value(const char **string);
+static JSON_Value * parse_boolean_value(const char **string);
+static JSON_Value * parse_number_value(const char **string);
+static JSON_Value * parse_null_value(const char **string);
+static JSON_Value * parse_value(const char **string, size_t nesting);
+
+/* Serialization */
+static int json_serialize_to_buffer_r(const JSON_Value *value, char *buf, int level, int is_pretty, char *num_buf);
+static int json_serialize_string(const char *string, char *buf);
+static int append_indent(char *buf, int level);
+static int append_string(char *buf, const char *string);
+
+// touch_event
+int lws_touch_info[10][2] = {{0, 0}, // id:0 (x, y)
+ {0, 0}, // id:1 (x, y)
+ {0, 0}, // id:2 (x, y)
+ {0, 0}, // id:3 (x, y)
+ {0, 0}, // id:4 (x, y)
+ {0, 0}, // id:5 (x, y)
+ {0, 0}, // id:6 (x, y)
+ {0, 0}, // id:7 (x, y)
+ {0, 0}, // id:8 (x, y)
+ {0, 0}}; // id:9 (x, y)
+
+// 車両情報(ダミーデータ)読み取り.
+FILE *fp_can = NULL;
+pthread_mutex_t mutex;
+
+// 車両情報送信スレッド生成状態.
+static int vehicledata_thread = -1;
+
+// 定期通知スレッド未生成時に、GetVehicleDataをコールされると.
+// 次のダミーデータを読みにいくので、抑止するフラグを設置.
+int getvehicledata_init = 0;
+
+// 車両情報 保持変数.
+// 車両情報(GPS).
+double vehicledata_gps_longitudedegrees = 0;
+double vehicledata_gps_latitudedegrees = 0;
+
+int vehicledata_gps_utcyear = 0;
+int vehicledata_gps_utcmonth = 0;
+int vehicledata_gps_utcday = 0;
+int vehicledata_gps_utchours = 0;
+int vehicledata_gps_utcminutes = 0;
+int vehicledata_gps_utcseconds = 0;
+
+char* vehicledata_gps_compassdirection;
+
+double vehicledata_gps_pdop = 0;
+double vehicledata_gps_hdop = 0;
+double vehicledata_gps_vdop = 0;
+
+int vehicledata_gps_actual = 0;
+int vehicledata_gps_satellites = 0;
+char* vehicledata_gps_dimension;
+double vehicledata_gps_altitude = 0;
+double vehicledata_gps_heading = 0;
+double vehicledata_gps_speed = 0;
+
+// 車両情報(Speed).
+double vehicledata_speed = 0;
+
+
+// Can関連
+#define ILLUMI_REQ_ID 1001
+
+// CANID
+#define CANID_VEHICLE_SPPED 0x610
+#define CANID_ILLUMI 0x123
+
+static int running = 1;
+const int canfd_on = 1;
+
+extern int optind, opterr, optopt;
+// Can受信用スレッド
+void sigterm(int signo)
+{
+ // Signalを受け取ったらスレッド停止.
+ running = 0;
+}
+
+void *can_thread(void *p) {
+ fd_set rdfs;
+ int socketid;
+ int rcvbuf_size = 0;
+ int ret;
+ char ctrlmsg[CMSG_SPACE(sizeof(struct timeval)) + CMSG_SPACE(sizeof(__u32))];
+ struct iovec iov;
+ struct msghdr msg;
+ struct cmsghdr *cmsg;
+
+ //signal(SIGTERM, sigterm);
+ //signal(SIGHUP, sigterm);
+ //signal(SIGINT, sigterm);
+
+ // CANソケット生成.
+ socketid = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+ if( socketid < 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN]\n", __func__, __LINE__);
+ exit(1);
+ }
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN] socketid=%d\n", __func__, __LINE__, socketid);
+
+ const char *ifname = "can0";
+ struct ifreq ifr;
+ memset(&ifr.ifr_name, 0, sizeof(ifr.ifr_name));
+ strcpy(ifr.ifr_name, ifname);
+
+ if (ioctl(socketid, SIOCGIFINDEX, &ifr) < 0) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN]\n", __func__, __LINE__);
+ exit(1);
+ }
+
+ setsockopt(socketid, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on, sizeof(canfd_on));
+
+ struct can_filter rfilter[2];
+ rfilter[0].can_id = 0x610;
+ rfilter[0].can_mask = (CAN_EFF_FLAG | CAN_RTR_FLAG | CAN_SFF_MASK);
+ rfilter[1].can_id = 0x123;
+ rfilter[1].can_mask = (CAN_EFF_FLAG | CAN_RTR_FLAG | CAN_SFF_MASK);
+ setsockopt(socketid, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
+
+ struct sockaddr_can addr;
+ addr.can_family = AF_CAN;
+ addr.can_ifindex = ifr.ifr_ifindex;
+
+ if (bind(socketid, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN]\n", __func__, __LINE__);
+ exit(1);
+ }
+
+ /* these settings are static and can be held out of the hot path */
+ struct canfd_frame frame;
+ iov.iov_base = &frame;
+ msg.msg_name = &addr;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = &ctrlmsg;
+
+ /* 待ち合わせ時間3秒 */
+ struct timeval tv;
+ tv.tv_sec = 3;
+ tv.tv_usec = 0;
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN][Start] frame.can_id=%d\n", __func__, __LINE__, frame.can_id);
+
+ while (running) {
+ FD_ZERO(&rdfs);
+ FD_SET(socketid, &rdfs);
+
+ ret = select(socketid+1, &rdfs, NULL, NULL, NULL);
+ if (ret < 0) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN][Start] can socket wait. socketid=%d errno=%d\n", __func__, __LINE__, socketid, errno);
+ return;
+ } else if (ret == 0) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN][Start] can socket wait. socketid=%d\n", __func__, __LINE__, socketid);
+ continue;
+ } else {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN][Start] can socket running. socketid=%d\n", __func__, __LINE__, socketid);
+ }
+
+ if (FD_ISSET(socketid, &rdfs)) {
+ int maxdlen = 0;
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN][Start] can socket running.\n", __func__, __LINE__);
+ /* these settings may be modified by recvmsg() */
+ iov.iov_len = sizeof(frame);
+ msg.msg_namelen = sizeof(addr);
+ msg.msg_controllen = sizeof(ctrlmsg);
+ msg.msg_flags = 0;
+
+ int recvbytes = recvmsg(socketid, &msg, 0);
+
+ if (recvbytes < 0) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN] errno=%d\n", __func__, __LINE__, errno);
+ continue;
+ }
+
+ // コンピュータネットワークでは、Maximum Transmission Unit(MTU;最大伝送ユニット)は
+ // 単一のネットワークレイヤでのトランザクションで通信できる最大のプロトコルデータユニット(PDU)のサイズです
+ if ((size_t)recvbytes == CAN_MTU)
+ maxdlen = CAN_MAX_DLEN;
+ else if ((size_t)recvbytes == CANFD_MTU)
+ // CAN FD(CAN with Flexible Data-Rate)通信とは、従来のCAN通信仕様を拡張した通信仕様です。
+ // CAN FD通信は、CAN通信に比べて、大量のデータを高速で送受信することが可能になります。
+ // データフィールドは最大64バイトに拡張され、通信ボーレートを1Mbps以上に高速化することが可能です。
+ // CAN FDのデータフレームは、従来CANと同等のフィールド構成となっています。
+ maxdlen = CANFD_MAX_DLEN;
+ else {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN]\n", __func__, __LINE__);
+ //return 1;
+ }
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN] maxdlen=%d\n", __func__, __LINE__, maxdlen);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN][Modify] frame.can_id=%d\n", __func__, __LINE__, frame.can_id);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN][Modify] frame.len=%d\n", __func__, __LINE__, frame.len);
+
+ if( frame.can_id == CANID_VEHICLE_SPPED ) {
+ // 本来はlengthを見て、CAN仕様に沿った形でデータを翻訳する必要があるが
+ // Dia2ではテスト用に1バイト固定としているため直で設定.
+ send_OnVehicleData(frame);
+ } else if( frame.can_id == CANID_ILLUMI ){
+ send_BasicCommunication_illumi_OnSystemRequest(frame);
+ }
+ usleep(500000);
+ }
+ }
+
+ close(socketid);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[CAN] can_thread End.\n", __func__, __LINE__);
+ return 0;
+}
+
+
+
+
+/******************************************************************************************************************************/
+/******************************************************************************************************************************/
+/******************************************************************************************************************************/
+/******************************************************************************************************************************/
+/******************************************************************************************************************************/
+
+/* Various */
+static char * parson_strndup(const char *string, size_t n) {
+ char *output_string = (char*)parson_malloc(n + 1);
+ if (!output_string) {
+ return NULL;
+ }
+ output_string[n] = '\0';
+ strncpy(output_string, string, n);
+ return output_string;
+}
+
+static char * parson_strdup(const char *string) {
+ return parson_strndup(string, strlen(string));
+}
+
+static int hex_char_to_int(char c) {
+ if (c >= '0' && c <= '9') {
+ return c - '0';
+ } else if (c >= 'a' && c <= 'f') {
+ return c - 'a' + 10;
+ } else if (c >= 'A' && c <= 'F') {
+ return c - 'A' + 10;
+ }
+ return -1;
+}
+
+static int parse_utf16_hex(const char *s, unsigned int *result) {
+ int x1, x2, x3, x4;
+ if (s[0] == '\0' || s[1] == '\0' || s[2] == '\0' || s[3] == '\0') {
+ return 0;
+ }
+ x1 = hex_char_to_int(s[0]);
+ x2 = hex_char_to_int(s[1]);
+ x3 = hex_char_to_int(s[2]);
+ x4 = hex_char_to_int(s[3]);
+ if (x1 == -1 || x2 == -1 || x3 == -1 || x4 == -1) {
+ return 0;
+ }
+ *result = (unsigned int)((x1 << 12) | (x2 << 8) | (x3 << 4) | x4);
+ return 1;
+}
+
+static int num_bytes_in_utf8_sequence(unsigned char c) {
+ if (c == 0xC0 || c == 0xC1 || c > 0xF4 || IS_CONT(c)) {
+ return 0;
+ } else if ((c & 0x80) == 0) { /* 0xxxxxxx */
+ return 1;
+ } else if ((c & 0xE0) == 0xC0) { /* 110xxxxx */
+ return 2;
+ } else if ((c & 0xF0) == 0xE0) { /* 1110xxxx */
+ return 3;
+ } else if ((c & 0xF8) == 0xF0) { /* 11110xxx */
+ return 4;
+ }
+ return 0; /* won't happen */
+}
+
+static int verify_utf8_sequence(const unsigned char *string, int *len) {
+ unsigned int cp = 0;
+ *len = num_bytes_in_utf8_sequence(string[0]);
+
+ if (*len == 1) {
+ cp = string[0];
+ } else if (*len == 2 && IS_CONT(string[1])) {
+ cp = string[0] & 0x1F;
+ cp = (cp << 6) | (string[1] & 0x3F);
+ } else if (*len == 3 && IS_CONT(string[1]) && IS_CONT(string[2])) {
+ cp = ((unsigned char)string[0]) & 0xF;
+ cp = (cp << 6) | (string[1] & 0x3F);
+ cp = (cp << 6) | (string[2] & 0x3F);
+ } else if (*len == 4 && IS_CONT(string[1]) && IS_CONT(string[2]) && IS_CONT(string[3])) {
+ cp = string[0] & 0x7;
+ cp = (cp << 6) | (string[1] & 0x3F);
+ cp = (cp << 6) | (string[2] & 0x3F);
+ cp = (cp << 6) | (string[3] & 0x3F);
+ } else {
+ return 0;
+ }
+
+ /* overlong encodings */
+ if ((cp < 0x80 && *len > 1) ||
+ (cp < 0x800 && *len > 2) ||
+ (cp < 0x10000 && *len > 3)) {
+ return 0;
+ }
+
+ /* invalid unicode */
+ if (cp > 0x10FFFF) {
+ return 0;
+ }
+
+ /* surrogate halves */
+ if (cp >= 0xD800 && cp <= 0xDFFF) {
+ return 0;
+ }
+
+ return 1;
+}
+
+static int is_valid_utf8(const char *string, size_t string_len) {
+ int len = 0;
+ const char *string_end = string + string_len;
+ while (string < string_end) {
+ if (!verify_utf8_sequence((const unsigned char*)string, &len)) {
+ return 0;
+ }
+ string += len;
+ }
+ return 1;
+}
+
+static int is_decimal(const char *string, size_t length) {
+ if (length > 1 && string[0] == '0' && string[1] != '.') {
+ return 0;
+ }
+ if (length > 2 && !strncmp(string, "-0", 2) && string[2] != '.') {
+ return 0;
+ }
+ while (length--) {
+ if (strchr("xX", string[length])) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
+static char * read_file(const char * filename) {
+ FILE *fp = fopen(filename, "r");
+ size_t size_to_read = 0;
+ size_t size_read = 0;
+ long pos;
+ char *file_contents;
+ if (!fp) {
+ return NULL;
+ }
+ fseek(fp, 0L, SEEK_END);
+ pos = ftell(fp);
+ if (pos < 0) {
+ fclose(fp);
+ return NULL;
+ }
+ size_to_read = pos;
+ rewind(fp);
+ file_contents = (char*)parson_malloc(sizeof(char) * (size_to_read + 1));
+ if (!file_contents) {
+ fclose(fp);
+ return NULL;
+ }
+ size_read = fread(file_contents, 1, size_to_read, fp);
+ if (size_read == 0 || ferror(fp)) {
+ fclose(fp);
+ parson_free(file_contents);
+ return NULL;
+ }
+ fclose(fp);
+ file_contents[size_read] = '\0';
+ return file_contents;
+}
+
+static void remove_comments(char *string, const char *start_token, const char *end_token) {
+ int in_string = 0, escaped = 0;
+ size_t i;
+ char *ptr = NULL, current_char;
+ size_t start_token_len = strlen(start_token);
+ size_t end_token_len = strlen(end_token);
+ if (start_token_len == 0 || end_token_len == 0) {
+ return;
+ }
+ while ((current_char = *string) != '\0') {
+ if (current_char == '\\' && !escaped) {
+ escaped = 1;
+ string++;
+ continue;
+ } else if (current_char == '\"' && !escaped) {
+ in_string = !in_string;
+ } else if (!in_string && strncmp(string, start_token, start_token_len) == 0) {
+ for(i = 0; i < start_token_len; i++) {
+ string[i] = ' ';
+ }
+ string = string + start_token_len;
+ ptr = strstr(string, end_token);
+ if (!ptr) {
+ return;
+ }
+ for (i = 0; i < (ptr - string) + end_token_len; i++) {
+ string[i] = ' ';
+ }
+ string = ptr + end_token_len - 1;
+ }
+ escaped = 0;
+ string++;
+ }
+}
+
+/* JSON Object */
+static JSON_Object * json_object_init(JSON_Value *wrapping_value) {
+ JSON_Object *new_obj = (JSON_Object*)parson_malloc(sizeof(JSON_Object));
+ if (new_obj == NULL) {
+ return NULL;
+ }
+ new_obj->wrapping_value = wrapping_value;
+ new_obj->names = (char**)NULL;
+ new_obj->values = (JSON_Value**)NULL;
+ new_obj->capacity = 0;
+ new_obj->count = 0;
+ return new_obj;
+}
+
+static JSON_Status json_object_add(JSON_Object *object, const char *name, JSON_Value *value) {
+ size_t index = 0;
+ if (object == NULL || name == NULL || value == NULL) {
+ return JSONFailure;
+ }
+ if (json_object_get_value(object, name) != NULL) {
+ return JSONFailure;
+ }
+ if (object->count >= object->capacity) {
+ size_t new_capacity = MAX(object->capacity * 2, STARTING_CAPACITY);
+ if (json_object_resize(object, new_capacity) == JSONFailure) {
+ return JSONFailure;
+ }
+ }
+ index = object->count;
+ object->names[index] = parson_strdup(name);
+ if (object->names[index] == NULL) {
+ return JSONFailure;
+ }
+ value->parent = json_object_get_wrapping_value(object);
+ object->values[index] = value;
+ object->count++;
+ return JSONSuccess;
+}
+
+static JSON_Status json_object_resize(JSON_Object *object, size_t new_capacity) {
+ char **temp_names = NULL;
+ JSON_Value **temp_values = NULL;
+
+ if ((object->names == NULL && object->values != NULL) ||
+ (object->names != NULL && object->values == NULL) ||
+ new_capacity == 0) {
+ return JSONFailure; /* Shouldn't happen */
+ }
+ temp_names = (char**)parson_malloc(new_capacity * sizeof(char*));
+ if (temp_names == NULL) {
+ return JSONFailure;
+ }
+ temp_values = (JSON_Value**)parson_malloc(new_capacity * sizeof(JSON_Value*));
+ if (temp_values == NULL) {
+ parson_free(temp_names);
+ return JSONFailure;
+ }
+ if (object->names != NULL && object->values != NULL && object->count > 0) {
+ memcpy(temp_names, object->names, object->count * sizeof(char*));
+ memcpy(temp_values, object->values, object->count * sizeof(JSON_Value*));
+ }
+ parson_free(object->names);
+ parson_free(object->values);
+ object->names = temp_names;
+ object->values = temp_values;
+ object->capacity = new_capacity;
+ return JSONSuccess;
+}
+
+static JSON_Value * json_object_nget_value(const JSON_Object *object, const char *name, size_t n) {
+ size_t i, name_length;
+ for (i = 0; i < json_object_get_count(object); i++) {
+ name_length = strlen(object->names[i]);
+ if (name_length != n) {
+ continue;
+ }
+ if (strncmp(object->names[i], name, n) == 0) {
+ return object->values[i];
+ }
+ }
+ return NULL;
+}
+
+static void json_object_free(JSON_Object *object) {
+ size_t i;
+ for (i = 0; i < object->count; i++) {
+ parson_free(object->names[i]);
+ json_value_free(object->values[i]);
+ }
+ parson_free(object->names);
+ parson_free(object->values);
+ parson_free(object);
+}
+
+/* JSON Array */
+static JSON_Array * json_array_init(JSON_Value *wrapping_value) {
+ JSON_Array *new_array = (JSON_Array*)parson_malloc(sizeof(JSON_Array));
+ if (new_array == NULL) {
+ return NULL;
+ }
+ new_array->wrapping_value = wrapping_value;
+ new_array->items = (JSON_Value**)NULL;
+ new_array->capacity = 0;
+ new_array->count = 0;
+ return new_array;
+}
+
+static JSON_Status json_array_add(JSON_Array *array, JSON_Value *value) {
+ if (array->count >= array->capacity) {
+ size_t new_capacity = MAX(array->capacity * 2, STARTING_CAPACITY);
+ if (json_array_resize(array, new_capacity) == JSONFailure) {
+ return JSONFailure;
+ }
+ }
+ value->parent = json_array_get_wrapping_value(array);
+ array->items[array->count] = value;
+ array->count++;
+ return JSONSuccess;
+}
+
+static JSON_Status json_array_resize(JSON_Array *array, size_t new_capacity) {
+ JSON_Value **new_items = NULL;
+ if (new_capacity == 0) {
+ return JSONFailure;
+ }
+ new_items = (JSON_Value**)parson_malloc(new_capacity * sizeof(JSON_Value*));
+ if (new_items == NULL) {
+ return JSONFailure;
+ }
+ if (array->items != NULL && array->count > 0) {
+ memcpy(new_items, array->items, array->count * sizeof(JSON_Value*));
+ }
+ parson_free(array->items);
+ array->items = new_items;
+ array->capacity = new_capacity;
+ return JSONSuccess;
+}
+
+static void json_array_free(JSON_Array *array) {
+ size_t i;
+ for (i = 0; i < array->count; i++) {
+ json_value_free(array->items[i]);
+ }
+ parson_free(array->items);
+ parson_free(array);
+}
+
+/* JSON Value */
+static JSON_Value * json_value_init_string_no_copy(char *string) {
+ JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value));
+ if (!new_value) {
+ return NULL;
+ }
+ new_value->parent = NULL;
+ new_value->type = JSONString;
+ new_value->value.string = string;
+ return new_value;
+}
+
+/* Parser */
+static JSON_Status skip_quotes(const char **string) {
+ if (**string != '\"') {
+ return JSONFailure;
+ }
+ SKIP_CHAR(string);
+ while (**string != '\"') {
+ if (**string == '\0') {
+ return JSONFailure;
+ } else if (**string == '\\') {
+ SKIP_CHAR(string);
+ if (**string == '\0') {
+ return JSONFailure;
+ }
+ }
+ SKIP_CHAR(string);
+ }
+ SKIP_CHAR(string);
+ return JSONSuccess;
+}
+
+static int parse_utf16(const char **unprocessed, char **processed) {
+ unsigned int cp, lead, trail;
+ int parse_succeeded = 0;
+ char *processed_ptr = *processed;
+ const char *unprocessed_ptr = *unprocessed;
+ unprocessed_ptr++; /* skips u */
+ parse_succeeded = parse_utf16_hex(unprocessed_ptr, &cp);
+ if (!parse_succeeded) {
+ return JSONFailure;
+ }
+ if (cp < 0x80) {
+ processed_ptr[0] = (char)cp; /* 0xxxxxxx */
+ } else if (cp < 0x800) {
+ processed_ptr[0] = ((cp >> 6) & 0x1F) | 0xC0; /* 110xxxxx */
+ processed_ptr[1] = ((cp) & 0x3F) | 0x80; /* 10xxxxxx */
+ processed_ptr += 1;
+ } else if (cp < 0xD800 || cp > 0xDFFF) {
+ processed_ptr[0] = ((cp >> 12) & 0x0F) | 0xE0; /* 1110xxxx */
+ processed_ptr[1] = ((cp >> 6) & 0x3F) | 0x80; /* 10xxxxxx */
+ processed_ptr[2] = ((cp) & 0x3F) | 0x80; /* 10xxxxxx */
+ processed_ptr += 2;
+ } else if (cp >= 0xD800 && cp <= 0xDBFF) { /* lead surrogate (0xD800..0xDBFF) */
+ lead = cp;
+ unprocessed_ptr += 4; /* should always be within the buffer, otherwise previous sscanf would fail */
+ if (*unprocessed_ptr++ != '\\' || *unprocessed_ptr++ != 'u') {
+ return JSONFailure;
+ }
+ parse_succeeded = parse_utf16_hex(unprocessed_ptr, &trail);
+ if (!parse_succeeded || trail < 0xDC00 || trail > 0xDFFF) { /* valid trail surrogate? (0xDC00..0xDFFF) */
+ return JSONFailure;
+ }
+ cp = ((((lead - 0xD800) & 0x3FF) << 10) | ((trail - 0xDC00) & 0x3FF)) + 0x010000;
+ processed_ptr[0] = (((cp >> 18) & 0x07) | 0xF0); /* 11110xxx */
+ processed_ptr[1] = (((cp >> 12) & 0x3F) | 0x80); /* 10xxxxxx */
+ processed_ptr[2] = (((cp >> 6) & 0x3F) | 0x80); /* 10xxxxxx */
+ processed_ptr[3] = (((cp) & 0x3F) | 0x80); /* 10xxxxxx */
+ processed_ptr += 3;
+ } else { /* trail surrogate before lead surrogate */
+ return JSONFailure;
+ }
+ unprocessed_ptr += 3;
+ *processed = processed_ptr;
+ *unprocessed = unprocessed_ptr;
+ return JSONSuccess;
+}
+
+
+/* Copies and processes passed string up to supplied length.
+Example: "\u006Corem ipsum" -> lorem ipsum */
+static char* process_string(const char *input, size_t len) {
+ const char *input_ptr = input;
+ size_t initial_size = (len + 1) * sizeof(char);
+ size_t final_size = 0;
+ char *output = NULL, *output_ptr = NULL, *resized_output = NULL;
+ output = (char*)parson_malloc(initial_size);
+ if (output == NULL) {
+ goto error;
+ }
+ output_ptr = output;
+ while ((*input_ptr != '\0') && (size_t)(input_ptr - input) < len) {
+ if (*input_ptr == '\\') {
+ input_ptr++;
+ switch (*input_ptr) {
+ case '\"': *output_ptr = '\"'; break;
+ case '\\': *output_ptr = '\\'; break;
+ case '/': *output_ptr = '/'; break;
+ case 'b': *output_ptr = '\b'; break;
+ case 'f': *output_ptr = '\f'; break;
+ case 'n': *output_ptr = '\n'; break;
+ case 'r': *output_ptr = '\r'; break;
+ case 't': *output_ptr = '\t'; break;
+ case 'u':
+ if (parse_utf16(&input_ptr, &output_ptr) == JSONFailure) {
+ goto error;
+ }
+ break;
+ default:
+ goto error;
+ }
+ } else if ((unsigned char)*input_ptr < 0x20) {
+ goto error; /* 0x00-0x19 are invalid characters for json string (http://www.ietf.org/rfc/rfc4627.txt) */
+ } else {
+ *output_ptr = *input_ptr;
+ }
+ output_ptr++;
+ input_ptr++;
+ }
+ *output_ptr = '\0';
+ /* resize to new length */
+ final_size = (size_t)(output_ptr-output) + 1;
+ /* todo: don't resize if final_size == initial_size */
+ resized_output = (char*)parson_malloc(final_size);
+ if (resized_output == NULL) {
+ goto error;
+ }
+ memcpy(resized_output, output, final_size);
+ parson_free(output);
+ return resized_output;
+error:
+ parson_free(output);
+ return NULL;
+}
+
+/* Return processed contents of a string between quotes and
+ skips passed argument to a matching quote. */
+static char * get_quoted_string(const char **string) {
+ const char *string_start = *string;
+ size_t string_len = 0;
+ JSON_Status status = skip_quotes(string);
+ if (status != JSONSuccess) {
+ return NULL;
+ }
+ string_len = *string - string_start - 2; /* length without quotes */
+ return process_string(string_start + 1, string_len);
+}
+
+static JSON_Value * parse_value(const char **string, size_t nesting) {
+ if (nesting > MAX_NESTING) {
+ return NULL;
+ }
+ SKIP_WHITESPACES(string);
+ switch (**string) {
+ case '{':
+ return parse_object_value(string, nesting + 1);
+ case '[':
+ return parse_array_value(string, nesting + 1);
+ case '\"':
+ return parse_string_value(string);
+ case 'f': case 't':
+ return parse_boolean_value(string);
+ case '-':
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ return parse_number_value(string);
+ case 'n':
+ return parse_null_value(string);
+ default:
+ return NULL;
+ }
+}
+
+static JSON_Value * parse_object_value(const char **string, size_t nesting) {
+ JSON_Value *output_value = json_value_init_object(), *new_value = NULL;
+ JSON_Object *output_object = json_value_get_object(output_value);
+ char *new_key = NULL;
+ if (output_value == NULL || **string != '{') {
+ return NULL;
+ }
+ SKIP_CHAR(string);
+ SKIP_WHITESPACES(string);
+ if (**string == '}') { /* empty object */
+ SKIP_CHAR(string);
+ return output_value;
+ }
+ while (**string != '\0') {
+ new_key = get_quoted_string(string);
+ if (new_key == NULL) {
+ json_value_free(output_value);
+ return NULL;
+ }
+ SKIP_WHITESPACES(string);
+ if (**string != ':') {
+ parson_free(new_key);
+ json_value_free(output_value);
+ return NULL;
+ }
+ SKIP_CHAR(string);
+ new_value = parse_value(string, nesting);
+ if (new_value == NULL) {
+ parson_free(new_key);
+ json_value_free(output_value);
+ return NULL;
+ }
+ if (json_object_add(output_object, new_key, new_value) == JSONFailure) {
+ parson_free(new_key);
+ json_value_free(new_value);
+ json_value_free(output_value);
+ return NULL;
+ }
+ parson_free(new_key);
+ SKIP_WHITESPACES(string);
+ if (**string != ',') {
+ break;
+ }
+ SKIP_CHAR(string);
+ SKIP_WHITESPACES(string);
+ }
+ SKIP_WHITESPACES(string);
+ if (**string != '}' || /* Trim object after parsing is over */
+ json_object_resize(output_object, json_object_get_count(output_object)) == JSONFailure) {
+ json_value_free(output_value);
+ return NULL;
+ }
+ SKIP_CHAR(string);
+ return output_value;
+}
+
+static JSON_Value * parse_array_value(const char **string, size_t nesting) {
+ JSON_Value *output_value = json_value_init_array(), *new_array_value = NULL;
+ JSON_Array *output_array = json_value_get_array(output_value);
+ if (!output_value || **string != '[') {
+ return NULL;
+ }
+ SKIP_CHAR(string);
+ SKIP_WHITESPACES(string);
+ if (**string == ']') { /* empty array */
+ SKIP_CHAR(string);
+ return output_value;
+ }
+ while (**string != '\0') {
+ new_array_value = parse_value(string, nesting);
+ if (new_array_value == NULL) {
+ json_value_free(output_value);
+ return NULL;
+ }
+ if (json_array_add(output_array, new_array_value) == JSONFailure) {
+ json_value_free(new_array_value);
+ json_value_free(output_value);
+ return NULL;
+ }
+ SKIP_WHITESPACES(string);
+ if (**string != ',') {
+ break;
+ }
+ SKIP_CHAR(string);
+ SKIP_WHITESPACES(string);
+ }
+ SKIP_WHITESPACES(string);
+ if (**string != ']' || /* Trim array after parsing is over */
+ json_array_resize(output_array, json_array_get_count(output_array)) == JSONFailure) {
+ json_value_free(output_value);
+ return NULL;
+ }
+ SKIP_CHAR(string);
+ return output_value;
+}
+
+static JSON_Value * parse_string_value(const char **string) {
+ JSON_Value *value = NULL;
+ char *new_string = get_quoted_string(string);
+ if (new_string == NULL) {
+ return NULL;
+ }
+ value = json_value_init_string_no_copy(new_string);
+ if (value == NULL) {
+ parson_free(new_string);
+ return NULL;
+ }
+ return value;
+}
+
+static JSON_Value * parse_boolean_value(const char **string) {
+ size_t true_token_size = SIZEOF_TOKEN("true");
+ size_t false_token_size = SIZEOF_TOKEN("false");
+ if (strncmp("true", *string, true_token_size) == 0) {
+ *string += true_token_size;
+ return json_value_init_boolean(1);
+ } else if (strncmp("false", *string, false_token_size) == 0) {
+ *string += false_token_size;
+ return json_value_init_boolean(0);
+ }
+ return NULL;
+}
+
+static JSON_Value * parse_number_value(const char **string) {
+ char *end;
+ double number = 0;
+ errno = 0;
+ number = strtod(*string, &end);
+ if (errno || !is_decimal(*string, end - *string)) {
+ return NULL;
+ }
+ *string = end;
+ return json_value_init_number(number);
+}
+
+static JSON_Value * parse_null_value(const char **string) {
+ size_t token_size = SIZEOF_TOKEN("null");
+ if (strncmp("null", *string, token_size) == 0) {
+ *string += token_size;
+ return json_value_init_null();
+ }
+ return NULL;
+}
+
+/* Serialization */
+#define APPEND_STRING(str) do { written = append_string(buf, (str));\
+ if (written < 0) { return -1; }\
+ if (buf != NULL) { buf += written; }\
+ written_total += written; } while(0)
+
+#define APPEND_INDENT(level) do { written = append_indent(buf, (level));\
+ if (written < 0) { return -1; }\
+ if (buf != NULL) { buf += written; }\
+ written_total += written; } while(0)
+
+static int json_serialize_to_buffer_r(const JSON_Value *value, char *buf, int level, int is_pretty, char *num_buf)
+{
+ const char *key = NULL, *string = NULL;
+ JSON_Value *temp_value = NULL;
+ JSON_Array *array = NULL;
+ JSON_Object *object = NULL;
+ size_t i = 0, count = 0;
+ double num = 0.0;
+ int written = -1, written_total = 0;
+
+ switch (json_value_get_type(value)) {
+ case JSONArray:
+ array = json_value_get_array(value);
+ count = json_array_get_count(array);
+ APPEND_STRING("[");
+ if (count > 0 && is_pretty) {
+ APPEND_STRING("\n");
+ }
+ for (i = 0; i < count; i++) {
+ if (is_pretty) {
+ APPEND_INDENT(level+1);
+ }
+ temp_value = json_array_get_value(array, i);
+ written = json_serialize_to_buffer_r(temp_value, buf, level+1, is_pretty, num_buf);
+ if (written < 0) {
+ return -1;
+ }
+ if (buf != NULL) {
+ buf += written;
+ }
+ written_total += written;
+ if (i < (count - 1)) {
+ APPEND_STRING(",");
+ }
+ if (is_pretty) {
+ APPEND_STRING("\n");
+ }
+ }
+ if (count > 0 && is_pretty) {
+ APPEND_INDENT(level);
+ }
+ APPEND_STRING("]");
+ return written_total;
+ case JSONObject:
+ object = json_value_get_object(value);
+ count = json_object_get_count(object);
+ APPEND_STRING("{");
+ if (count > 0 && is_pretty) {
+ APPEND_STRING("\n");
+ }
+ for (i = 0; i < count; i++) {
+ key = json_object_get_name(object, i);
+ if (key == NULL) {
+ return -1;
+ }
+ if (is_pretty) {
+ APPEND_INDENT(level+1);
+ }
+ written = json_serialize_string(key, buf);
+ if (written < 0) {
+ return -1;
+ }
+ if (buf != NULL) {
+ buf += written;
+ }
+ written_total += written;
+ APPEND_STRING(":");
+ if (is_pretty) {
+ APPEND_STRING(" ");
+ }
+ temp_value = json_object_get_value(object, key);
+ written = json_serialize_to_buffer_r(temp_value, buf, level+1, is_pretty, num_buf);
+ if (written < 0) {
+ return -1;
+ }
+ if (buf != NULL) {
+ buf += written;
+ }
+ written_total += written;
+ if (i < (count - 1)) {
+ APPEND_STRING(",");
+ }
+ if (is_pretty) {
+ APPEND_STRING("\n");
+ }
+ }
+ if (count > 0 && is_pretty) {
+ APPEND_INDENT(level);
+ }
+ APPEND_STRING("}");
+ return written_total;
+ case JSONString:
+ string = json_value_get_string(value);
+ if (string == NULL) {
+ return -1;
+ }
+ written = json_serialize_string(string, buf);
+ if (written < 0) {
+ return -1;
+ }
+ if (buf != NULL) {
+ buf += written;
+ }
+ written_total += written;
+ return written_total;
+ case JSONBoolean:
+ if (json_value_get_boolean(value)) {
+ APPEND_STRING("true");
+ } else {
+ APPEND_STRING("false");
+ }
+ return written_total;
+ case JSONNumber:
+ num = json_value_get_number(value);
+ if (buf != NULL) {
+ num_buf = buf;
+ }
+ written = sprintf(num_buf, FLOAT_FORMAT, num);
+ if (written < 0) {
+ return -1;
+ }
+ if (buf != NULL) {
+ buf += written;
+ }
+ written_total += written;
+ return written_total;
+ case JSONNull:
+ APPEND_STRING("null");
+ return written_total;
+ case JSONError:
+ return -1;
+ default:
+ return -1;
+ }
+}
+
+static int json_serialize_string(const char *string, char *buf) {
+ size_t i = 0, len = strlen(string);
+ char c = '\0';
+ int written = -1, written_total = 0;
+ APPEND_STRING("\"");
+ for (i = 0; i < len; i++) {
+ c = string[i];
+ switch (c) {
+ case '\"': APPEND_STRING("\\\""); break;
+ case '\\': APPEND_STRING("\\\\"); break;
+ case '/': APPEND_STRING("\\/"); break; /* to make json embeddable in xml\/html */
+ case '\b': APPEND_STRING("\\b"); break;
+ case '\f': APPEND_STRING("\\f"); break;
+ case '\n': APPEND_STRING("\\n"); break;
+ case '\r': APPEND_STRING("\\r"); break;
+ case '\t': APPEND_STRING("\\t"); break;
+ case '\x00': APPEND_STRING("\\u0000"); break;
+ case '\x01': APPEND_STRING("\\u0001"); break;
+ case '\x02': APPEND_STRING("\\u0002"); break;
+ case '\x03': APPEND_STRING("\\u0003"); break;
+ case '\x04': APPEND_STRING("\\u0004"); break;
+ case '\x05': APPEND_STRING("\\u0005"); break;
+ case '\x06': APPEND_STRING("\\u0006"); break;
+ case '\x07': APPEND_STRING("\\u0007"); break;
+ /* '\x08' duplicate: '\b' */
+ /* '\x09' duplicate: '\t' */
+ /* '\x0a' duplicate: '\n' */
+ case '\x0b': APPEND_STRING("\\u000b"); break;
+ /* '\x0c' duplicate: '\f' */
+ /* '\x0d' duplicate: '\r' */
+ case '\x0e': APPEND_STRING("\\u000e"); break;
+ case '\x0f': APPEND_STRING("\\u000f"); break;
+ case '\x10': APPEND_STRING("\\u0010"); break;
+ case '\x11': APPEND_STRING("\\u0011"); break;
+ case '\x12': APPEND_STRING("\\u0012"); break;
+ case '\x13': APPEND_STRING("\\u0013"); break;
+ case '\x14': APPEND_STRING("\\u0014"); break;
+ case '\x15': APPEND_STRING("\\u0015"); break;
+ case '\x16': APPEND_STRING("\\u0016"); break;
+ case '\x17': APPEND_STRING("\\u0017"); break;
+ case '\x18': APPEND_STRING("\\u0018"); break;
+ case '\x19': APPEND_STRING("\\u0019"); break;
+ case '\x1a': APPEND_STRING("\\u001a"); break;
+ case '\x1b': APPEND_STRING("\\u001b"); break;
+ case '\x1c': APPEND_STRING("\\u001c"); break;
+ case '\x1d': APPEND_STRING("\\u001d"); break;
+ case '\x1e': APPEND_STRING("\\u001e"); break;
+ case '\x1f': APPEND_STRING("\\u001f"); break;
+ default:
+ if (buf != NULL) {
+ buf[0] = c;
+ buf += 1;
+ }
+ written_total += 1;
+ break;
+ }
+ }
+ APPEND_STRING("\"");
+ return written_total;
+}
+
+static int append_indent(char *buf, int level) {
+ int i;
+ int written = -1, written_total = 0;
+ for (i = 0; i < level; i++) {
+ APPEND_STRING(" ");
+ }
+ return written_total;
+}
+
+static int append_string(char *buf, const char *string) {
+ if (buf == NULL) {
+ return (int)strlen(string);
+ }
+ return sprintf(buf, "%s", string);
+}
+
+#undef APPEND_STRING
+#undef APPEND_INDENT
+
+/* Parser API */
+JSON_Value * json_parse_file(const char *filename) {
+ char *file_contents = read_file(filename);
+ JSON_Value *output_value = NULL;
+ if (file_contents == NULL) {
+ return NULL;
+ }
+ output_value = json_parse_string(file_contents);
+ parson_free(file_contents);
+ return output_value;
+}
+
+JSON_Value * json_parse_file_with_comments(const char *filename) {
+ char *file_contents = read_file(filename);
+ JSON_Value *output_value = NULL;
+ if (file_contents == NULL) {
+ return NULL;
+ }
+ output_value = json_parse_string_with_comments(file_contents);
+ parson_free(file_contents);
+ return output_value;
+}
+
+JSON_Value * json_parse_string(const char *string) {
+ if (string == NULL) {
+ return NULL;
+ }
+ if (string[0] == '\xEF' && string[1] == '\xBB' && string[2] == '\xBF') {
+ string = string + 3; /* Support for UTF-8 BOM */
+ }
+ return parse_value((const char**)&string, 0);
+}
+
+JSON_Value * json_parse_string_with_comments(const char *string) {
+ JSON_Value *result = NULL;
+ char *string_mutable_copy = NULL, *string_mutable_copy_ptr = NULL;
+ string_mutable_copy = parson_strdup(string);
+ if (string_mutable_copy == NULL) {
+ return NULL;
+ }
+ remove_comments(string_mutable_copy, "/*", "*/");
+ remove_comments(string_mutable_copy, "//", "\n");
+ string_mutable_copy_ptr = string_mutable_copy;
+ result = parse_value((const char**)&string_mutable_copy_ptr, 0);
+ parson_free(string_mutable_copy);
+ return result;
+}
+
+/* JSON Object API */
+
+JSON_Value * json_object_get_value(const JSON_Object *object, const char *name) {
+ if (object == NULL || name == NULL) {
+ return NULL;
+ }
+ return json_object_nget_value(object, name, strlen(name));
+}
+
+const char * sdl_json_object_get_string(const JSON_Object *object, const char *name) {
+ return json_value_get_string(json_object_get_value(object, name));
+}
+
+double json_object_get_number(const JSON_Object *object, const char *name) {
+ return json_value_get_number(json_object_get_value(object, name));
+}
+
+JSON_Object * sdl_json_object_get_object(const JSON_Object *object, const char *name) {
+ return json_value_get_object(json_object_get_value(object, name));
+}
+
+JSON_Array * sdl_json_object_get_array(const JSON_Object *object, const char *name) {
+ return json_value_get_array(json_object_get_value(object, name));
+}
+
+int sdl_json_object_get_boolean(const JSON_Object *object, const char *name) {
+ return json_value_get_boolean(json_object_get_value(object, name));
+}
+
+JSON_Value * json_object_dotget_value(const JSON_Object *object, const char *name) {
+ const char *dot_position = strchr(name, '.');
+ if (!dot_position) {
+ return json_object_get_value(object, name);
+ }
+ object = json_value_get_object(json_object_nget_value(object, name, dot_position - name));
+ return json_object_dotget_value(object, dot_position + 1);
+}
+
+const char * json_object_dotget_string(const JSON_Object *object, const char *name) {
+ return json_value_get_string(json_object_dotget_value(object, name));
+}
+
+double json_object_dotget_number(const JSON_Object *object, const char *name) {
+ return json_value_get_number(json_object_dotget_value(object, name));
+}
+
+JSON_Object * json_object_dotget_object(const JSON_Object *object, const char *name) {
+ return json_value_get_object(json_object_dotget_value(object, name));
+}
+
+JSON_Array * json_object_dotget_array(const JSON_Object *object, const char *name) {
+ return json_value_get_array(json_object_dotget_value(object, name));
+}
+
+int json_object_dotget_boolean(const JSON_Object *object, const char *name) {
+ return json_value_get_boolean(json_object_dotget_value(object, name));
+}
+
+size_t json_object_get_count(const JSON_Object *object) {
+ return object ? object->count : 0;
+}
+
+const char * json_object_get_name(const JSON_Object *object, size_t index) {
+ if (object == NULL || index >= json_object_get_count(object)) {
+ return NULL;
+ }
+ return object->names[index];
+}
+
+JSON_Value * json_object_get_value_at(const JSON_Object *object, size_t index) {
+ if (object == NULL || index >= json_object_get_count(object)) {
+ return NULL;
+ }
+ return object->values[index];
+}
+
+JSON_Value *json_object_get_wrapping_value(const JSON_Object *object) {
+ return object->wrapping_value;
+}
+
+int json_object_has_value (const JSON_Object *object, const char *name) {
+ return json_object_get_value(object, name) != NULL;
+}
+
+int json_object_has_value_of_type(const JSON_Object *object, const char *name, JSON_Value_Type type) {
+ JSON_Value *val = json_object_get_value(object, name);
+ return val != NULL && json_value_get_type(val) == type;
+}
+
+int json_object_dothas_value (const JSON_Object *object, const char *name) {
+ return json_object_dotget_value(object, name) != NULL;
+}
+
+int json_object_dothas_value_of_type(const JSON_Object *object, const char *name, JSON_Value_Type type) {
+ JSON_Value *val = json_object_dotget_value(object, name);
+ return val != NULL && json_value_get_type(val) == type;
+}
+
+/* JSON Array API */
+JSON_Value * json_array_get_value(const JSON_Array *array, size_t index) {
+ if (array == NULL || index >= json_array_get_count(array)) {
+ return NULL;
+ }
+ return array->items[index];
+}
+
+const char * json_array_get_string(const JSON_Array *array, size_t index) {
+ return json_value_get_string(json_array_get_value(array, index));
+}
+
+double json_array_get_number(const JSON_Array *array, size_t index) {
+ return json_value_get_number(json_array_get_value(array, index));
+}
+
+JSON_Object * json_array_get_object(const JSON_Array *array, size_t index) {
+ return json_value_get_object(json_array_get_value(array, index));
+}
+
+JSON_Array * json_array_get_array(const JSON_Array *array, size_t index) {
+ return json_value_get_array(json_array_get_value(array, index));
+}
+
+int json_array_get_boolean(const JSON_Array *array, size_t index) {
+ return json_value_get_boolean(json_array_get_value(array, index));
+}
+
+size_t json_array_get_count(const JSON_Array *array) {
+ return array ? array->count : 0;
+}
+
+JSON_Value * json_array_get_wrapping_value(const JSON_Array *array) {
+ return array->wrapping_value;
+}
+
+/* JSON Value API */
+JSON_Value_Type json_value_get_type(const JSON_Value *value) {
+ return value ? value->type : JSONError;
+}
+
+JSON_Object * json_value_get_object(const JSON_Value *value) {
+ return json_value_get_type(value) == JSONObject ? value->value.object : NULL;
+}
+
+JSON_Array * json_value_get_array(const JSON_Value *value) {
+ return json_value_get_type(value) == JSONArray ? value->value.array : NULL;
+}
+
+const char * json_value_get_string(const JSON_Value *value) {
+ return json_value_get_type(value) == JSONString ? value->value.string : NULL;
+}
+
+double json_value_get_number(const JSON_Value *value) {
+ return json_value_get_type(value) == JSONNumber ? value->value.number : 0;
+}
+
+int json_value_get_boolean(const JSON_Value *value) {
+ return json_value_get_type(value) == JSONBoolean ? value->value.boolean : -1;
+}
+
+JSON_Value * json_value_get_parent (const JSON_Value *value) {
+ return value ? value->parent : NULL;
+}
+
+void json_value_free(JSON_Value *value) {
+ switch (json_value_get_type(value)) {
+ case JSONObject:
+ json_object_free(value->value.object);
+ break;
+ case JSONString:
+ parson_free(value->value.string);
+ break;
+ case JSONArray:
+ json_array_free(value->value.array);
+ break;
+ default:
+ break;
+ }
+ parson_free(value);
+}
+
+JSON_Value * json_value_init_object(void) {
+ JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value));
+ if (!new_value) {
+ return NULL;
+ }
+ new_value->parent = NULL;
+ new_value->type = JSONObject;
+ new_value->value.object = json_object_init(new_value);
+ if (!new_value->value.object) {
+ parson_free(new_value);
+ return NULL;
+ }
+ return new_value;
+}
+
+JSON_Value * json_value_init_array(void) {
+ JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value));
+ if (!new_value) {
+ return NULL;
+ }
+ new_value->parent = NULL;
+ new_value->type = JSONArray;
+ new_value->value.array = json_array_init(new_value);
+ if (!new_value->value.array) {
+ parson_free(new_value);
+ return NULL;
+ }
+ return new_value;
+}
+
+JSON_Value * json_value_init_string(const char *string) {
+ char *copy = NULL;
+ JSON_Value *value;
+ size_t string_len = 0;
+ if (string == NULL) {
+ return NULL;
+ }
+ string_len = strlen(string);
+ if (!is_valid_utf8(string, string_len)) {
+ return NULL;
+ }
+ copy = parson_strndup(string, string_len);
+ if (copy == NULL) {
+ return NULL;
+ }
+ value = json_value_init_string_no_copy(copy);
+ if (value == NULL) {
+ parson_free(copy);
+ }
+ return value;
+}
+
+JSON_Value * json_value_init_number(double number) {
+ JSON_Value *new_value = NULL;
+ if ((number * 0.0) != 0.0) { /* nan and inf test */
+ return NULL;
+ }
+ new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value));
+ if (new_value == NULL) {
+ return NULL;
+ }
+ new_value->parent = NULL;
+ new_value->type = JSONNumber;
+ new_value->value.number = number;
+ return new_value;
+}
+
+JSON_Value * json_value_init_boolean(int boolean) {
+ JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value));
+ if (!new_value) {
+ return NULL;
+ }
+ new_value->parent = NULL;
+ new_value->type = JSONBoolean;
+ new_value->value.boolean = boolean ? 1 : 0;
+ return new_value;
+}
+
+JSON_Value * json_value_init_null(void) {
+ JSON_Value *new_value = (JSON_Value*)parson_malloc(sizeof(JSON_Value));
+ if (!new_value) {
+ return NULL;
+ }
+ new_value->parent = NULL;
+ new_value->type = JSONNull;
+ return new_value;
+}
+
+JSON_Value * json_value_deep_copy(const JSON_Value *value) {
+ size_t i = 0;
+ JSON_Value *return_value = NULL, *temp_value_copy = NULL, *temp_value = NULL;
+ const char *temp_string = NULL, *temp_key = NULL;
+ char *temp_string_copy = NULL;
+ JSON_Array *temp_array = NULL, *temp_array_copy = NULL;
+ JSON_Object *temp_object = NULL, *temp_object_copy = NULL;
+
+ switch (json_value_get_type(value)) {
+ case JSONArray:
+ temp_array = json_value_get_array(value);
+ return_value = json_value_init_array();
+ if (return_value == NULL) {
+ return NULL;
+ }
+ temp_array_copy = json_value_get_array(return_value);
+ for (i = 0; i < json_array_get_count(temp_array); i++) {
+ temp_value = json_array_get_value(temp_array, i);
+ temp_value_copy = json_value_deep_copy(temp_value);
+ if (temp_value_copy == NULL) {
+ json_value_free(return_value);
+ return NULL;
+ }
+ if (json_array_add(temp_array_copy, temp_value_copy) == JSONFailure) {
+ json_value_free(return_value);
+ json_value_free(temp_value_copy);
+ return NULL;
+ }
+ }
+ return return_value;
+ case JSONObject:
+ temp_object = json_value_get_object(value);
+ return_value = json_value_init_object();
+ if (return_value == NULL) {
+ return NULL;
+ }
+ temp_object_copy = json_value_get_object(return_value);
+ for (i = 0; i < json_object_get_count(temp_object); i++) {
+ temp_key = json_object_get_name(temp_object, i);
+ temp_value = json_object_get_value(temp_object, temp_key);
+ temp_value_copy = json_value_deep_copy(temp_value);
+ if (temp_value_copy == NULL) {
+ json_value_free(return_value);
+ return NULL;
+ }
+ if (json_object_add(temp_object_copy, temp_key, temp_value_copy) == JSONFailure) {
+ json_value_free(return_value);
+ json_value_free(temp_value_copy);
+ return NULL;
+ }
+ }
+ return return_value;
+ case JSONBoolean:
+ return json_value_init_boolean(json_value_get_boolean(value));
+ case JSONNumber:
+ return json_value_init_number(json_value_get_number(value));
+ case JSONString:
+ temp_string = json_value_get_string(value);
+ if (temp_string == NULL) {
+ return NULL;
+ }
+ temp_string_copy = parson_strdup(temp_string);
+ if (temp_string_copy == NULL) {
+ return NULL;
+ }
+ return_value = json_value_init_string_no_copy(temp_string_copy);
+ if (return_value == NULL) {
+ parson_free(temp_string_copy);
+ }
+ return return_value;
+ case JSONNull:
+ return json_value_init_null();
+ case JSONError:
+ return NULL;
+ default:
+ return NULL;
+ }
+}
+
+size_t json_serialization_size(const JSON_Value *value) {
+ char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */
+ int res = json_serialize_to_buffer_r(value, NULL, 0, 0, num_buf);
+ return res < 0 ? 0 : (size_t)(res + 1);
+}
+
+JSON_Status json_serialize_to_buffer(const JSON_Value *value, char *buf, size_t buf_size_in_bytes) {
+ int written = -1;
+ size_t needed_size_in_bytes = json_serialization_size(value);
+ if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) {
+ return JSONFailure;
+ }
+ written = json_serialize_to_buffer_r(value, buf, 0, 0, NULL);
+ if (written < 0) {
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_serialize_to_file(const JSON_Value *value, const char *filename) {
+ JSON_Status return_code = JSONSuccess;
+ FILE *fp = NULL;
+ char *serialized_string = json_serialize_to_string(value);
+ if (serialized_string == NULL) {
+ return JSONFailure;
+ }
+ fp = fopen(filename, "w");
+ if (fp == NULL) {
+ json_free_serialized_string(serialized_string);
+ return JSONFailure;
+ }
+ if (fputs(serialized_string, fp) == EOF) {
+ return_code = JSONFailure;
+ }
+ if (fclose(fp) == EOF) {
+ return_code = JSONFailure;
+ }
+ json_free_serialized_string(serialized_string);
+ return return_code;
+}
+
+char * json_serialize_to_string(const JSON_Value *value) {
+ JSON_Status serialization_result = JSONFailure;
+ size_t buf_size_bytes = json_serialization_size(value);
+ char *buf = NULL;
+ if (buf_size_bytes == 0) {
+ return NULL;
+ }
+ buf = (char*)parson_malloc(buf_size_bytes);
+ if (buf == NULL) {
+ return NULL;
+ }
+ serialization_result = json_serialize_to_buffer(value, buf, buf_size_bytes);
+ if (serialization_result == JSONFailure) {
+ json_free_serialized_string(buf);
+ return NULL;
+ }
+ return buf;
+}
+
+size_t json_serialization_size_pretty(const JSON_Value *value) {
+ char num_buf[1100]; /* recursively allocating buffer on stack is a bad idea, so let's do it only once */
+ int res = json_serialize_to_buffer_r(value, NULL, 0, 1, num_buf);
+ return res < 0 ? 0 : (size_t)(res + 1);
+}
+
+JSON_Status json_serialize_to_buffer_pretty(const JSON_Value *value, char *buf, size_t buf_size_in_bytes) {
+ int written = -1;
+ size_t needed_size_in_bytes = json_serialization_size_pretty(value);
+ if (needed_size_in_bytes == 0 || buf_size_in_bytes < needed_size_in_bytes) {
+ return JSONFailure;
+ }
+ written = json_serialize_to_buffer_r(value, buf, 0, 1, NULL);
+ if (written < 0) {
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename) {
+ JSON_Status return_code = JSONSuccess;
+ FILE *fp = NULL;
+ char *serialized_string = json_serialize_to_string_pretty(value);
+ if (serialized_string == NULL) {
+ return JSONFailure;
+ }
+ fp = fopen(filename, "w");
+ if (fp == NULL) {
+ json_free_serialized_string(serialized_string);
+ return JSONFailure;
+ }
+ if (fputs(serialized_string, fp) == EOF) {
+ return_code = JSONFailure;
+ }
+ if (fclose(fp) == EOF) {
+ return_code = JSONFailure;
+ }
+ json_free_serialized_string(serialized_string);
+ return return_code;
+}
+
+char * json_serialize_to_string_pretty(const JSON_Value *value) {
+ JSON_Status serialization_result = JSONFailure;
+ size_t buf_size_bytes = json_serialization_size_pretty(value);
+ char *buf = NULL;
+ if (buf_size_bytes == 0) {
+ return NULL;
+ }
+ buf = (char*)parson_malloc(buf_size_bytes);
+ if (buf == NULL) {
+ return NULL;
+ }
+ serialization_result = json_serialize_to_buffer_pretty(value, buf, buf_size_bytes);
+ if (serialization_result == JSONFailure) {
+ json_free_serialized_string(buf);
+ return NULL;
+ }
+ return buf;
+}
+
+void json_free_serialized_string(char *string) {
+ parson_free(string);
+}
+
+JSON_Status json_array_remove(JSON_Array *array, size_t ix) {
+ size_t to_move_bytes = 0;
+ if (array == NULL || ix >= json_array_get_count(array)) {
+ return JSONFailure;
+ }
+ json_value_free(json_array_get_value(array, ix));
+ to_move_bytes = (json_array_get_count(array) - 1 - ix) * sizeof(JSON_Value*);
+ memmove(array->items + ix, array->items + ix + 1, to_move_bytes);
+ array->count -= 1;
+ return JSONSuccess;
+}
+
+JSON_Status json_array_replace_value(JSON_Array *array, size_t ix, JSON_Value *value) {
+ if (array == NULL || value == NULL || value->parent != NULL || ix >= json_array_get_count(array)) {
+ return JSONFailure;
+ }
+ json_value_free(json_array_get_value(array, ix));
+ value->parent = json_array_get_wrapping_value(array);
+ array->items[ix] = value;
+ return JSONSuccess;
+}
+
+JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string) {
+ JSON_Value *value = json_value_init_string(string);
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_array_replace_value(array, i, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number) {
+ JSON_Value *value = json_value_init_number(number);
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_array_replace_value(array, i, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean) {
+ JSON_Value *value = json_value_init_boolean(boolean);
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_array_replace_value(array, i, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_array_replace_null(JSON_Array *array, size_t i) {
+ JSON_Value *value = json_value_init_null();
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_array_replace_value(array, i, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_array_clear(JSON_Array *array) {
+ size_t i = 0;
+ if (array == NULL) {
+ return JSONFailure;
+ }
+ for (i = 0; i < json_array_get_count(array); i++) {
+ json_value_free(json_array_get_value(array, i));
+ }
+ array->count = 0;
+ return JSONSuccess;
+}
+
+JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value) {
+ if (array == NULL || value == NULL || value->parent != NULL) {
+ return JSONFailure;
+ }
+ return json_array_add(array, value);
+}
+
+JSON_Status json_array_append_string(JSON_Array *array, const char *string) {
+ JSON_Value *value = json_value_init_string(string);
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_array_append_value(array, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_array_append_number(JSON_Array *array, double number) {
+ JSON_Value *value = json_value_init_number(number);
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_array_append_value(array, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_array_append_boolean(JSON_Array *array, int boolean) {
+ JSON_Value *value = json_value_init_boolean(boolean);
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_array_append_value(array, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_array_append_null(JSON_Array *array) {
+ JSON_Value *value = json_value_init_null();
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_array_append_value(array, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value) {
+ size_t i = 0;
+ JSON_Value *old_value;
+ if (object == NULL || name == NULL || value == NULL || value->parent != NULL) {
+ return JSONFailure;
+ }
+ old_value = json_object_get_value(object, name);
+ if (old_value != NULL) { /* free and overwrite old value */
+ json_value_free(old_value);
+ for (i = 0; i < json_object_get_count(object); i++) {
+ if (strcmp(object->names[i], name) == 0) {
+ value->parent = json_object_get_wrapping_value(object);
+ object->values[i] = value;
+ return JSONSuccess;
+ }
+ }
+ }
+ /* add new key value pair */
+ return json_object_add(object, name, value);
+}
+
+JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string) {
+ return json_object_set_value(object, name, json_value_init_string(string));
+}
+
+JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number) {
+ return json_object_set_value(object, name, json_value_init_number(number));
+}
+
+JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean) {
+ return json_object_set_value(object, name, json_value_init_boolean(boolean));
+}
+
+JSON_Status json_object_set_null(JSON_Object *object, const char *name) {
+ return json_object_set_value(object, name, json_value_init_null());
+}
+
+JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value) {
+ const char *dot_pos = NULL;
+ char *current_name = NULL;
+ JSON_Object *temp_obj = NULL;
+ JSON_Value *new_value = NULL;
+ if (object == NULL || name == NULL || value == NULL) {
+ return JSONFailure;
+ }
+ dot_pos = strchr(name, '.');
+ if (dot_pos == NULL) {
+ return json_object_set_value(object, name, value);
+ } else {
+ current_name = parson_strndup(name, dot_pos - name);
+ temp_obj = sdl_json_object_get_object(object, current_name);
+ if (temp_obj == NULL) {
+ new_value = json_value_init_object();
+ if (new_value == NULL) {
+ parson_free(current_name);
+ return JSONFailure;
+ }
+ if (json_object_add(object, current_name, new_value) == JSONFailure) {
+ json_value_free(new_value);
+ parson_free(current_name);
+ return JSONFailure;
+ }
+ temp_obj = sdl_json_object_get_object(object, current_name);
+ }
+ parson_free(current_name);
+ return json_object_dotset_value(temp_obj, dot_pos + 1, value);
+ }
+}
+
+JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string) {
+ JSON_Value *value = json_value_init_string(string);
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_object_dotset_value(object, name, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number) {
+ JSON_Value *value = json_value_init_number(number);
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_object_dotset_value(object, name, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean) {
+ JSON_Value *value = json_value_init_boolean(boolean);
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_object_dotset_value(object, name, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_object_dotset_null(JSON_Object *object, const char *name) {
+ JSON_Value *value = json_value_init_null();
+ if (value == NULL) {
+ return JSONFailure;
+ }
+ if (json_object_dotset_value(object, name, value) == JSONFailure) {
+ json_value_free(value);
+ return JSONFailure;
+ }
+ return JSONSuccess;
+}
+
+JSON_Status json_object_remove(JSON_Object *object, const char *name) {
+ size_t i = 0, last_item_index = 0;
+ if (object == NULL || json_object_get_value(object, name) == NULL) {
+ return JSONFailure;
+ }
+ last_item_index = json_object_get_count(object) - 1;
+ for (i = 0; i < json_object_get_count(object); i++) {
+ if (strcmp(object->names[i], name) == 0) {
+ parson_free(object->names[i]);
+ json_value_free(object->values[i]);
+ if (i != last_item_index) { /* Replace key value pair with one from the end */
+ object->names[i] = object->names[last_item_index];
+ object->values[i] = object->values[last_item_index];
+ }
+ object->count -= 1;
+ return JSONSuccess;
+ }
+ }
+ return JSONFailure; /* No execution path should end here */
+}
+
+JSON_Status json_object_dotremove(JSON_Object *object, const char *name) {
+ const char *dot_pos = strchr(name, '.');
+ char *current_name = NULL;
+ JSON_Object *temp_obj = NULL;
+ if (dot_pos == NULL) {
+ return json_object_remove(object, name);
+ } else {
+ current_name = parson_strndup(name, dot_pos - name);
+ temp_obj = sdl_json_object_get_object(object, current_name);
+ parson_free(current_name);
+ if (temp_obj == NULL) {
+ return JSONFailure;
+ }
+ return json_object_dotremove(temp_obj, dot_pos + 1);
+ }
+}
+
+JSON_Status json_object_clear(JSON_Object *object) {
+ size_t i = 0;
+ if (object == NULL) {
+ return JSONFailure;
+ }
+ for (i = 0; i < json_object_get_count(object); i++) {
+ parson_free(object->names[i]);
+ json_value_free(object->values[i]);
+ }
+ object->count = 0;
+ return JSONSuccess;
+}
+
+JSON_Status json_validate(const JSON_Value *schema, const JSON_Value *value) {
+ JSON_Value *temp_schema_value = NULL, *temp_value = NULL;
+ JSON_Array *schema_array = NULL, *value_array = NULL;
+ JSON_Object *schema_object = NULL, *value_object = NULL;
+ JSON_Value_Type schema_type = JSONError, value_type = JSONError;
+ const char *key = NULL;
+ size_t i = 0, count = 0;
+ if (schema == NULL || value == NULL) {
+ return JSONFailure;
+ }
+ schema_type = json_value_get_type(schema);
+ value_type = json_value_get_type(value);
+ if (schema_type != value_type && schema_type != JSONNull) { /* null represents all values */
+ return JSONFailure;
+ }
+ switch (schema_type) {
+ case JSONArray:
+ schema_array = json_value_get_array(schema);
+ value_array = json_value_get_array(value);
+ count = json_array_get_count(schema_array);
+ if (count == 0) {
+ return JSONSuccess; /* Empty array allows all types */
+ }
+ /* Get first value from array, rest is ignored */
+ temp_schema_value = json_array_get_value(schema_array, 0);
+ for (i = 0; i < json_array_get_count(value_array); i++) {
+ temp_value = json_array_get_value(value_array, i);
+ if (json_validate(temp_schema_value, temp_value) == JSONFailure) {
+ return JSONFailure;
+ }
+ }
+ return JSONSuccess;
+ case JSONObject:
+ schema_object = json_value_get_object(schema);
+ value_object = json_value_get_object(value);
+ count = json_object_get_count(schema_object);
+ if (count == 0) {
+ return JSONSuccess; /* Empty object allows all objects */
+ } else if (json_object_get_count(value_object) < count) {
+ return JSONFailure; /* Tested object mustn't have less name-value pairs than schema */
+ }
+ for (i = 0; i < count; i++) {
+ key = json_object_get_name(schema_object, i);
+ temp_schema_value = json_object_get_value(schema_object, key);
+ temp_value = json_object_get_value(value_object, key);
+ if (temp_value == NULL) {
+ return JSONFailure;
+ }
+ if (json_validate(temp_schema_value, temp_value) == JSONFailure) {
+ return JSONFailure;
+ }
+ }
+ return JSONSuccess;
+ case JSONString: case JSONNumber: case JSONBoolean: case JSONNull:
+ return JSONSuccess; /* equality already tested before switch */
+ case JSONError: default:
+ return JSONFailure;
+ }
+}
+
+int json_value_equals(const JSON_Value *a, const JSON_Value *b) {
+ JSON_Object *a_object = NULL, *b_object = NULL;
+ JSON_Array *a_array = NULL, *b_array = NULL;
+ const char *a_string = NULL, *b_string = NULL;
+ const char *key = NULL;
+ size_t a_count = 0, b_count = 0, i = 0;
+ JSON_Value_Type a_type, b_type;
+ a_type = json_value_get_type(a);
+ b_type = json_value_get_type(b);
+ if (a_type != b_type) {
+ return 0;
+ }
+ switch (a_type) {
+ case JSONArray:
+ a_array = json_value_get_array(a);
+ b_array = json_value_get_array(b);
+ a_count = json_array_get_count(a_array);
+ b_count = json_array_get_count(b_array);
+ if (a_count != b_count) {
+ return 0;
+ }
+ for (i = 0; i < a_count; i++) {
+ if (!json_value_equals(json_array_get_value(a_array, i),
+ json_array_get_value(b_array, i))) {
+ return 0;
+ }
+ }
+ return 1;
+ case JSONObject:
+ a_object = json_value_get_object(a);
+ b_object = json_value_get_object(b);
+ a_count = json_object_get_count(a_object);
+ b_count = json_object_get_count(b_object);
+ if (a_count != b_count) {
+ return 0;
+ }
+ for (i = 0; i < a_count; i++) {
+ key = json_object_get_name(a_object, i);
+ if (!json_value_equals(json_object_get_value(a_object, key),
+ json_object_get_value(b_object, key))) {
+ return 0;
+ }
+ }
+ return 1;
+ case JSONString:
+ a_string = json_value_get_string(a);
+ b_string = json_value_get_string(b);
+ if (a_string == NULL || b_string == NULL) {
+ return 0; /* shouldn't happen */
+ }
+ return strcmp(a_string, b_string) == 0;
+ case JSONBoolean:
+ return json_value_get_boolean(a) == json_value_get_boolean(b);
+ case JSONNumber:
+ return fabs(json_value_get_number(a) - json_value_get_number(b)) < 0.000001; /* EPSILON */
+ case JSONError:
+ return 1;
+ case JSONNull:
+ return 1;
+ default:
+ return 1;
+ }
+}
+
+JSON_Value_Type sdl_json_type(const JSON_Value *value) {
+ return json_value_get_type(value);
+}
+
+JSON_Object * sdl_json_object (const JSON_Value *value) {
+ return json_value_get_object(value);
+}
+
+JSON_Array * json_array (const JSON_Value *value) {
+ return json_value_get_array(value);
+}
+
+const char * json_string (const JSON_Value *value) {
+ return json_value_get_string(value);
+}
+
+double json_number (const JSON_Value *value) {
+ return json_value_get_number(value);
+}
+
+int json_boolean(const JSON_Value *value) {
+ return json_value_get_boolean(value);
+}
+
+void json_set_allocation_functions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun) {
+ parson_malloc = malloc_fun;
+ parson_free = free_fun;
+}
+
+// 前方宣言
+static void stack_print(void);
+
+/* スタックデータの定義 */
+struct stackdata{
+ char data[MAX_DATA_SIZE]; /* 要素の格納先 */
+};
+typedef struct stackdata stackdata_t;
+
+static int current_stacksize = 0;
+static stackdata_t stack_list[10]; // 10個までしか持たないという意味
+
+/*
+ * @brief スタックにデータを挿入する
+ * @param[in/out] stk スタック
+ * @param[in] push_data 挿入するデータ
+ * @return 0 success
+ * @return -1 failure
+ */
+int stack_push(char* push_data)
+{
+ if( current_stacksize >= 10 ){
+ printf("stack is max\n");
+ return 0;
+ }
+ memset( stack_list[current_stacksize].data, 0x00, MAX_DATA_SIZE);
+ memcpy( stack_list[current_stacksize].data, push_data, strlen(push_data) );
+ current_stacksize++;
+
+ //stack_print();
+ return(0);
+}
+
+/*
+ * @brief スタックからデータを取得する
+ * @param[in/out] stk スタック
+ * @param[out] pop_data 挿入するデータ
+ * @return 0 success
+ * @return -1 failure
+ */
+int stack_pop(char** pop_data)
+{
+ /* スタックが空でないかチェックする */
+ if(current_stacksize < 1) {
+ printf("stack is empty\n");
+ return(-1);
+ }
+
+ current_stacksize--;
+ *pop_data = stack_list[current_stacksize].data;
+ return(0);
+}
+
+/*
+ * @brief スタック内にある要素を一覧表示する
+ * @param[in] stk スタック
+ */
+static void stack_print()
+{
+ int i;
+ for(i = 0; i < current_stacksize; i++){
+ printf("stack_list[%d] : %s\n", i, stack_list[i].data);
+ }
+
+}
+
+void stack_init()
+{
+ memset(stack_list, 0x00, sizeof(stack_list));
+ current_stacksize = 0;
+}
+
+int get_stack_size()
+{
+ return current_stacksize;
+}
+
+/****************************************************************************************************************/
+/****************************************************************************************************************/
+/****************************************************************************************************************/
+/****************************************************************************************************************/
+/****************************************************************************************************************/
+/****************************************************************************************************************/
+
+
+static struct lws *web_socket = NULL;
+
+//
+
+// 単体デバッグ用.
+// WebSocketに必要の無いJson文字列を加えたり、閲覧したりするので
+// 単体デバッグ用以外の用途では利用しないこと.
+// #define DEBUG_MODE
+//#define DEBUG_BUILD_MACHINE
+
+#ifdef DEBUG_MODE
+static FILE *fp_sended_datafile = NULL;
+static FILE *fp_received_datafile = NULL;
+
+#ifdef DEBUG_BUILD_MACHINE
+#define SENDED_FILEPATH_LOGFILE "./log_sended.txt"
+#define RECEIVED_FILEPATH_LOGFILE "./log_received.txt"
+#else
+#define SENDED_FILEPATH_LOGFILE "/storage/log_sended.txt"
+#define RECEIVED_FILEPATH_LOGFILE "/storage/log_received.txt"
+#endif // DEBUG_BUILD_MACHINE
+
+#endif // DEBUG_MODE
+
+// 受信用RPC種別
+#define RPC_VR 0
+#define RPC_TTS 1
+#define RPC_UI 2
+#define RPC_Navigation 3
+#define RPC_VehicleInfo 4
+#define RPC_RC 5
+#define RPC_Buttons 6
+#define RPC_BasicCommunication 7
+#define RPC_SDL 8
+#define RPC_TERMINATE 9 // これより下に追加してはならない
+
+// 受信用RPC種別(method文字列)
+#define RPC_VR_METHOD "VR."
+#define RPC_TTS_METHOD "TTS."
+#define RPC_UI_METHOD "UI."
+#define RPC_Navigation_METHOD "Navigation."
+#define RPC_VehicleInfo_METHOD "VehicleInfo."
+#define RPC_RC_METHOD "RC."
+#define RPC_Buttons_METHOD "Buttons."
+#define RPC_BasicCommunication_METHOD "BasicCommunication."
+#define RPC_SDL_METHOD "SDL."
+#define RPC_TERMINATE_METHOD ""// これより下に追加してはならない
+
+/* 受信用Method名定義(共通)[Start] */
+#define RPC_RECEIVE_IsReady "IsReady"
+#define RPC_RECEIVE_GetCapabilities "GetCapabilities"
+#define RPC_RECEIVE_GetLanguage "GetLanguage"
+#define RPC_RECEIVE_GetSupportedLanguages "GetSupportedLanguages"
+#define RPC_RECEIVE_ChangeRegistration "ChangeRegistration"
+#define RPC_RECEIVE_AddCommand "AddCommand"
+/* 受信用Method名定義(共通)[End] */
+
+/* 受信用Method名定義(BasicCommunication)[Start] */
+#define RPC_RECEIVE_BasicCommunication_GetSystemInfo "GetSystemInfo"
+#define RPC_RECEIVE_BasicCommunication_MixingAudioSupported "MixingAudioSupported"
+#define RPC_RECEIVE_BasicCommunication_UpdateDeviceList "UpdateDeviceList"
+#define RPC_RECEIVE_BasicCommunication_OnAppRegistered "OnAppRegistered"
+#define RPC_RECEIVE_BasicCommunication_UpdateAppList "UpdateAppList"
+#define RPC_RECEIVE_BasicCommunication_PolicyUpdate "PolicyUpdate"
+#define RPC_RECEIVE_BasicCommunication_OnAppUnregistered "OnAppUnregistered"
+#define RPC_RECEIVE_BasicCommunication_ActivateApp "ActivateApp"
+/* 受信用Method名定義(BasicCommunication)[End] */
+
+/* 受信用Method名定義(VehicleInfo)[Start] */
+#define RPC_RECEIVE_VehicleInfo_GetVehicleData "GetVehicleData"
+#define RPC_RECEIVE_VehicleInfo_GetVehicleType "GetVehicleType"
+#define RPC_RECEIVE_VehicleInfo_SubscribeVehicleData "SubscribeVehicleData"
+#define RPC_RECEIVE_VehicleInfo_UnsubscribeVehicleData "UnsubscribeVehicleData"
+/* 受信用Method名定義(VehicleInfo)[End] */
+
+/* 受信用Method名定義(TTS)[Start] */
+#define RPC_RECEIVE_TTS_SetGlobalProperties "SetGlobalProperties"
+/* 受信用Method名定義(TTS)[End] */
+
+/* 受信用Method名定義(Navigation)[Start] */
+#define RPC_RECEIVE_Navigation_SetVideoConfig "SetVideoConfig"
+#define RPC_RECEIVE_Navigation_StartStream "StartStream"
+#define RPC_RECEIVE_Navigation_StartAudioStream "StartAudioStream"
+#define RPC_RECEIVE_Navigation_StopAudioStream "StopAudioStream"
+#define RPC_RECEIVE_Navigation_OnVideoDataStreaming "OnVideoDataStreaming"
+#define RPC_RECEIVE_Navigation_OnAudioDataStreaming "OnAudioDataStreaming"
+/* 受信用Method名定義(Navigation)[End] */
+
+/* 受信用Method名定義(SDL)[Start] */
+#define RPC_RECEIVE_SDL_OnStatusUpdate "OnStatusUpdate"
+#define RPC_RECEIVE_SDL_GetUserFriendlyMessage "GetUserFriendlyMessage"
+#define RPC_RECEIVE_SDL_GetURLS "GetURLS"
+#define RPC_RECEIVE_SDL_ActivateApp "ActivateApp"
+/* 受信用Method名定義(SDL)[End] */
+
+/* 受信用Method名定義(Buttons)[Start] */
+#define RPC_RECEIVE_Buttons_OnButtonSubscription "OnButtonSubscription"
+/* 受信用Method名定義(Buttons)[End] */
+
+/* 受信用Method名定義(UI)[Start] */
+#define RPC_RECEIVE_UI_SetAppIcon "SetAppIcon"
+/* 受信用Method名定義(UI)[End] */
+
+#define RPC_RECEIVE_UI_PerformAudioPassThru "PerformAudioPassThru"
+#define RPC_RECEIVE_UI_EndAudioPassThru "EndAudioPassThru"
+static unsigned int g_PerformAudioPassThru_request_id = 0;
+static unsigned int g_PerformAudioPassThru_maxDuration = 0; //msec
+static bool g_PerformAudioPassThru_running = false;
+
+/* 受信用RPC種別と受信用RPC種別(method文字列)のペアテーブル[Start] */
+typedef struct _RPC_PAIR {
+ int rpc_type;
+ char* rpc_method_str;
+} RPC_PAIR;
+const RPC_PAIR rpc_table[RPC_TERMINATE] =
+{
+ { RPC_VR, RPC_VR_METHOD},
+ { RPC_TTS, RPC_TTS_METHOD},
+ { RPC_UI, RPC_UI_METHOD},
+ { RPC_Navigation, RPC_Navigation_METHOD},
+ { RPC_VehicleInfo, RPC_VehicleInfo_METHOD},
+ { RPC_RC, RPC_RC_METHOD},
+ { RPC_Buttons, RPC_Buttons_METHOD},
+ { RPC_BasicCommunication, RPC_BasicCommunication_METHOD},
+ { RPC_SDL, RPC_SDL_METHOD},
+ { RPC_TERMINATE, RPC_TERMINATE_METHOD}
+};
+/* RPC種別とMethod文字列のペアテーブル[End] */
+
+// 送信用ID定義
+#define SEND_registerComponent_VR_ID 500
+#define SEND_registerComponent_Navigation_ID 800
+#define SEND_registerComponent_TTS_ID 300
+#define SEND_registerComponent_UI_ID 400
+#define SEND_registerComponent_Buttons_ID 200
+#define SEND_registerComponent_VehicleInfo_ID 100
+#define SEND_registerComponent_RC_ID 900
+#define SEND_registerComponent_BasicCommunication_ID 600
+
+// 送信用ファイルパス
+#ifdef DEBUG_BUILD_MACHINE
+#define SEND_PATH_BUTTONS_GetCapabilities "./Buttons.GetCapabilities.txt"
+#define SEND_PATH_UI_GetCapabilities "./UI.GetCapabilities.txt"
+#define SEND_PATH_RC_GetCapabilities "./RC.GetCapabilities.txt"
+#else
+#define SEND_PATH_BUTTONS_GetCapabilities "/storage/Buttons.GetCapabilities.txt"
+#define SEND_PATH_UI_GetCapabilities "/storage//UI.GetCapabilities.txt"
+#define SEND_PATH_RC_GetCapabilities "./RC.GetCapabilities.txt"
+#endif
+
+// ***********************************************
+// グローバル変数定義[Start]
+// ***********************************************
+static unsigned int g_Navigation_result_ID = 0;
+static unsigned int g_Navigation_result_increment = 0;
+
+static unsigned int g_UI_result_ID = 0;
+static unsigned int g_UI_result_increment = 0;
+
+static unsigned int g_Buttons_result_ID = 0;
+static unsigned int g_Buttons_result_increment = 0;
+
+static unsigned int g_BasicCommunication_result_ID = 0;
+static unsigned int g_BasicCommunication_result_increment = 0;
+
+static unsigned char g_buf[MAX_DATA_SIZE];
+static unsigned int g_len = 0;
+static enum lws_write_protocol g_protocol = 0;
+
+/* アプリ起動関連[Start] */
+static char g_deviceid[128];
+static char g_name[24];
+static char g_transportType[12];
+static bool g_isSDLAllowed = true;
+
+static int g_appID = 0;
+static char g_status[64];
+/* アプリ起動関連[End] */
+
+// ***********************************************
+// グローバル変数定義[End]
+// ***********************************************
+
+
+// ***********************************************
+// Receive関数郡[Start]
+// ***********************************************
+
+// method文字列 (ex."VR.IsReady") からmethod名 (ex."IsReady") 部分だけを返却する
+static char* getMethodStr(char* method){
+ char* result_strstr = strstr(method, ".");
+ result_strstr++;
+ return result_strstr;
+}
+
+// method文字列からRPC種別を取得する
+static int getRPCType(char* method){
+ for(int i=0; i < RPC_TERMINATE; i++){
+ char* result_strstr = strstr(method, rpc_table[i].rpc_method_str);
+ if( result_strstr != NULL ){
+ return rpc_table[i].rpc_type;
+ }
+ }
+ return RPC_TERMINATE;
+}
+
+static void receive_rpc_vr(struct lws* wsi, unsigned int id, char* method, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ char* method_str = getMethodStr(method);
+ if( strncmp(method_str, RPC_RECEIVE_IsReady, sizeof(RPC_RECEIVE_IsReady)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_isReady(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetCapabilities, sizeof(RPC_RECEIVE_GetCapabilities)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_vr_GetCapabilities(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetLanguage, sizeof(RPC_RECEIVE_GetLanguage)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_GetLanguage(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetSupportedLanguages, sizeof(RPC_RECEIVE_GetSupportedLanguages)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_GetSupportedLanguages(wsi, id, rpctype);
+ }
+ // アプリ起動関連
+ else if( strncmp(method_str, RPC_RECEIVE_ChangeRegistration, sizeof(RPC_RECEIVE_ChangeRegistration)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_ChangeRegistration(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_AddCommand, sizeof(RPC_RECEIVE_AddCommand)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_AddCommand(wsi, id, rpctype);
+ }
+}
+
+static void receive_rpc_tts(struct lws* wsi, unsigned int id, char* method, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ char* method_str = getMethodStr(method);
+ if( strncmp(method_str, RPC_RECEIVE_IsReady, sizeof(RPC_RECEIVE_IsReady)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_isReady(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetLanguage, sizeof(RPC_RECEIVE_GetLanguage)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_GetLanguage(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetSupportedLanguages, sizeof(RPC_RECEIVE_GetSupportedLanguages)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_GetSupportedLanguages(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetCapabilities, sizeof(RPC_RECEIVE_GetCapabilities)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_tts_GetCapabilities(wsi, id, rpctype);
+ }
+ // アプリ起動関連
+ else if( strncmp(method_str, RPC_RECEIVE_ChangeRegistration, sizeof(RPC_RECEIVE_ChangeRegistration)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_ChangeRegistration(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_TTS_SetGlobalProperties, sizeof(RPC_RECEIVE_TTS_SetGlobalProperties)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_tts_SetGlobalProperties(wsi, id);
+ }
+}
+
+static void receive_rpc_ui(char* string, struct lws* wsi, unsigned int id, char* method, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ char* method_str = getMethodStr(method);
+ if( strncmp(method_str, RPC_RECEIVE_IsReady, sizeof(RPC_RECEIVE_IsReady)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_isReady(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetLanguage, sizeof(RPC_RECEIVE_GetLanguage)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_GetLanguage(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetSupportedLanguages, sizeof(RPC_RECEIVE_GetSupportedLanguages)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_GetSupportedLanguages(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetCapabilities, sizeof(RPC_RECEIVE_GetCapabilities)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_ui_GetCapabilities(wsi, id, rpctype);
+ }
+ // アプリ起動関連
+ else if( strncmp(method_str, RPC_RECEIVE_ChangeRegistration, sizeof(RPC_RECEIVE_ChangeRegistration)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_ChangeRegistration(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_AddCommand, sizeof(RPC_RECEIVE_AddCommand)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_AddCommand(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_UI_SetAppIcon, sizeof(RPC_RECEIVE_UI_SetAppIcon)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_ui_SetAppIcon(wsi, id);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_UI_PerformAudioPassThru, sizeof(RPC_RECEIVE_UI_PerformAudioPassThru)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ //エラーケース以外では、PerformAudioPassThruはRequestに対するResponseをここで返してはいけない。
+ //EndAudioPassThruに応答した後、またはタイムアウト時にResponseを返す。
+ if (g_PerformAudioPassThru_running){
+ //既に処理中のエラーレスポンスを用意する必要がある。
+ send_rpc_ui_PerformAudioPassThru_error(wsi, id);
+ return;
+ }
+ g_PerformAudioPassThru_request_id = id;
+ g_PerformAudioPassThru_running = true;
+
+ // 録音時間タイマ
+ JSON_Value *schema = json_parse_string(string);
+ g_PerformAudioPassThru_maxDuration = (unsigned int)json_object_dotget_number(sdl_json_object(schema), "params.maxDuration");
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s,duration:%d.\n", __func__, __LINE__, id, method,g_PerformAudioPassThru_maxDuration);
+ json_value_free(schema);
+ pthread_t pthread;
+ pthread_create( &pthread, NULL, &PerformAudioPassThru_timerThread, wsi);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_UI_EndAudioPassThru, sizeof(RPC_RECEIVE_UI_EndAudioPassThru)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ //先に終了要求に応答し、続いてPerformAudioPassThruの結果を返す。
+ if (g_PerformAudioPassThru_running){
+ send_rpc_ui_EndAudioPassThru(wsi, id);
+ sleep(1);
+ send_rpc_ui_PerformAudioPassThru(wsi);
+ } else {
+ //PATが起動していない場合はエラー応答
+ send_rpc_ui_EndAudioPassThru_error(wsi, id);
+ }
+ }
+}
+
+static void receive_rpc_navigation(struct lws* wsi, unsigned int id, char* method, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ char* method_str = getMethodStr(method);
+ if( strncmp(method_str, RPC_RECEIVE_IsReady, sizeof(RPC_RECEIVE_IsReady)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_isReady(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetLanguage, sizeof(RPC_RECEIVE_GetLanguage)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_GetLanguage(wsi, id, rpctype);
+ }
+ // 映像転送関連
+ else if( strncmp(method_str, RPC_RECEIVE_Navigation_SetVideoConfig, sizeof(RPC_RECEIVE_Navigation_SetVideoConfig)) == 0){
+ send_navigation_SetVideoConfig(wsi, id);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_Navigation_StartStream, sizeof(RPC_RECEIVE_Navigation_StartStream)) == 0){
+ send_navigation_StartStream(wsi, id);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_Navigation_OnVideoDataStreaming, sizeof(RPC_RECEIVE_Navigation_OnVideoDataStreaming)) == 0){
+ // 応答を受けて何かをするタイプのものではないため、なにもしない.
+ }
+ // 音声転送関連
+ else if( strncmp(method_str, RPC_RECEIVE_Navigation_StartAudioStream, sizeof(RPC_RECEIVE_Navigation_StartAudioStream)) == 0){
+ send_navigation_StartAudioStream(wsi, id);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_Navigation_StopAudioStream, sizeof(RPC_RECEIVE_Navigation_StopAudioStream)) == 0){
+ send_navigation_StopAudioStream(wsi, id);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_Navigation_OnAudioDataStreaming, sizeof(RPC_RECEIVE_Navigation_OnAudioDataStreaming)) == 0){
+ // 応答を受けて何かをするタイプのものではないため、なにもしない.
+ }
+}
+
+static void receive_rpc_vehicleInfo(struct lws* wsi, unsigned int id, char* method, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ char* method_str = getMethodStr(method);
+ if( strncmp(method_str, RPC_RECEIVE_IsReady, sizeof(RPC_RECEIVE_IsReady)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_isReady(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetLanguage, sizeof(RPC_RECEIVE_GetLanguage)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_GetLanguage(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_VehicleInfo_GetVehicleData, sizeof(RPC_RECEIVE_VehicleInfo_GetVehicleData)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_VehicleInfo_GetVehicleData(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_VehicleInfo_GetVehicleType, sizeof(RPC_RECEIVE_VehicleInfo_GetVehicleType)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_VehicleInfo_GetVehicleType(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_VehicleInfo_SubscribeVehicleData, sizeof(RPC_RECEIVE_VehicleInfo_SubscribeVehicleData)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_VehicleInfo_SubscribeVehicleData(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_VehicleInfo_UnsubscribeVehicleData, sizeof(RPC_RECEIVE_VehicleInfo_UnsubscribeVehicleData)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_VehicleInfo_UnsubscribeVehicleData(wsi, id, rpctype);
+ }
+}
+
+static void receive_rpc_rc(struct lws* wsi, unsigned int id, char* method, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ char* method_str = getMethodStr(method);
+ if( strncmp(method_str, RPC_RECEIVE_IsReady, sizeof(RPC_RECEIVE_IsReady)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_isReady(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetLanguage, sizeof(RPC_RECEIVE_GetLanguage)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_GetLanguage(wsi, id, rpctype);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_GetCapabilities, sizeof(RPC_RECEIVE_GetCapabilities)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_rc_GetCapabilities(wsi, id, rpctype);
+ // システム起動後ならいつでもよいようなので、このタイミングでOnRemoteControlSettingsを送る.
+ send_rpc_rc_OnRemoteControlSettings(wsi, id, rpctype);
+ }
+}
+
+static void receive_rpc_buttons(struct lws* wsi, unsigned int id, char* method, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ char* method_str = getMethodStr(method);
+ if( strncmp(method_str, RPC_RECEIVE_GetCapabilities, strlen(RPC_RECEIVE_GetCapabilities)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_rpc_buttons_GetCapabilities(wsi, id, rpctype);
+ }
+}
+
+static void receive_rpc_basiccommunication(struct lws* wsi, unsigned int id, char* method, int rpctype, char* string){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ char* method_str = getMethodStr(method);
+ if( strncmp(method_str, RPC_RECEIVE_BasicCommunication_GetSystemInfo, sizeof(RPC_RECEIVE_BasicCommunication_GetSystemInfo)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_BasicCommunication_GetSystemInfo(wsi, id);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_BasicCommunication_MixingAudioSupported, sizeof(RPC_RECEIVE_BasicCommunication_MixingAudioSupported)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_BasicCommunication_MixingAudioSupported(wsi, id);
+ send_BasicCommunication_OnFindApplications(wsi);
+ }
+ // アプリ起動関連
+ else if( strncmp(method_str, RPC_RECEIVE_BasicCommunication_UpdateDeviceList, sizeof(RPC_RECEIVE_BasicCommunication_UpdateDeviceList)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_BasicCommunication_UpdateDeviceList(wsi, id, string);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_BasicCommunication_OnAppRegistered, sizeof(RPC_RECEIVE_BasicCommunication_OnAppRegistered)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ // OnAppRegisteredに伴う応答はないが、パラメータを保持する必要がある.
+ saveparam_BasicCommunication_OnAppRegistered(wsi, id, string);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_BasicCommunication_UpdateAppList, sizeof(RPC_RECEIVE_BasicCommunication_UpdateAppList)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_BasicCommunication_UpdateAppList(wsi, id, string);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_BasicCommunication_PolicyUpdate, sizeof(RPC_RECEIVE_BasicCommunication_PolicyUpdate)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_BasicCommunication_PolicyUpdate(wsi, id);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_BasicCommunication_OnAppUnregistered, sizeof(RPC_RECEIVE_BasicCommunication_OnAppUnregistered)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ // OnAppRegisteredに伴う応答はないが、パラメータを保持する必要がある.
+ releaseparam_BasicCommunication_OnAppUnregistered(wsi, id, string);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_BasicCommunication_ActivateApp, sizeof(RPC_RECEIVE_BasicCommunication_ActivateApp)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ // OnAppRegisteredに伴う応答はないが、パラメータを保持する必要がある.
+ send_BasicCommunication_ActivateApp(wsi, id);
+ }
+}
+
+static void receive_rpc_sdl(struct lws* wsi, unsigned int id, char* method, int rpctype, char* string){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ char* method_str = getMethodStr(method);
+ if( strncmp(method_str, RPC_RECEIVE_SDL_OnStatusUpdate, sizeof(RPC_RECEIVE_SDL_OnStatusUpdate)) == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ send_sdl_OnStatusUpdate(wsi, id, string);
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_SDL_GetUserFriendlyMessage, sizeof(RPC_RECEIVE_SDL_GetUserFriendlyMessage)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ //応答を受けて何かをするタイプのものではないため、なにもしない.
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_SDL_GetURLS, sizeof(RPC_RECEIVE_SDL_GetURLS)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ //応答を受けて何かをするタイプのものではないため、なにもしない.
+ }
+ else if( strncmp(method_str, RPC_RECEIVE_SDL_ActivateApp, sizeof(RPC_RECEIVE_SDL_ActivateApp)) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d id:%d method:%s\n", __func__, __LINE__, id, method);
+ //応答を受けて何かをするタイプのものではないため、なにもしない.
+ }
+}
+
+// receive処理.
+// personを使ってjson文字列を解読する関数.
+static void receive_persistence(char* string, struct lws* wsi) {
+ JSON_Value *schema = json_parse_string(string);
+ char buf[256];
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d schema: %s.\n", __func__, __LINE__, string);
+
+ char* jsonrpc = sdl_json_object_get_string(sdl_json_object(schema), "jsonrpc");
+ if( jsonrpc != NULL ) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d %s\n", __func__, __LINE__, jsonrpc);
+ }
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ unsigned int id = (unsigned int)json_object_get_number(sdl_json_object(schema), "id");
+ if( id != 0 ) {
+ // json_object_get_number は存在しなければ0を返すので、上記のエラーチェックは必要
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d %d\n", __func__, __LINE__, id);
+ }
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ unsigned int result_numbar = (unsigned int)json_object_get_number(sdl_json_object(schema), "result");
+ if( result_numbar != 0 ) { // "result":3000 などのパターン
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d %d\n", __func__, __LINE__, result_numbar);
+ }
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ char* result_ret = sdl_json_object_get_string(sdl_json_object(schema), "result");
+ if( result_ret != NULL ) { // "result":"OK" などのパターン
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d %s\n", __func__, __LINE__, result_ret);
+ }
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ char* method = sdl_json_object_get_string(sdl_json_object(schema), "method");
+ if( method != NULL ) { // "method":"VR.IsReady" などのパターン
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d %s\n", __func__, __LINE__, result_ret);
+ int rpctype = getRPCType(method);
+ switch(rpctype){
+ case RPC_VR:
+ receive_rpc_vr(wsi, id, method, rpctype);
+ break;
+ case RPC_TTS:
+ receive_rpc_tts(wsi, id, method, rpctype);
+ break;
+ case RPC_UI:
+ receive_rpc_ui(string, wsi, id, method, rpctype);
+ break;
+ case RPC_Navigation:
+ receive_rpc_navigation(wsi, id, method, rpctype);
+ break;
+ case RPC_VehicleInfo:
+ receive_rpc_vehicleInfo(wsi, id, method, rpctype);
+ break;
+ case RPC_RC:
+ receive_rpc_rc(wsi, id, method, rpctype);
+ break;
+ case RPC_Buttons:
+ receive_rpc_buttons(wsi, id, method, rpctype);
+ break;
+ case RPC_BasicCommunication:
+ receive_rpc_basiccommunication(wsi, id, method, rpctype, string);
+ break;
+ case RPC_SDL:
+ receive_rpc_sdl(wsi, id, method, rpctype, string);
+ break;
+ case RPC_TERMINATE:
+ default:
+ exit(0);
+ break;
+ }
+ }
+ else if(result_numbar != 0) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ /* registerComponentの応答[Start] */
+ // IDの値を見て、なんの応答か判断する.
+ // その後、次の要求を投げる.
+ send_registerComponent(wsi,id, result_numbar);
+ /* registerComponentの応答[End] */
+ }
+ else if(result_ret != NULL) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ /* subscribeToの応答[Start] */
+ if( g_Navigation_result_increment != 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d g_Navigation_result_ID=%d, g_Navigation_result_increment=%d\n",
+ __func__, __LINE__, g_Navigation_result_ID, g_Navigation_result_increment);
+ send_subscribeTo_Navigation(wsi, id, result_ret);
+ }
+ else if( g_UI_result_increment != 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d g_Navigation_result_ID=%d, g_Navigation_result_increment=%d\n",
+ __func__, __LINE__, g_Navigation_result_ID, g_Navigation_result_increment);
+ send_subscribeTo_UI(wsi, id, result_ret);
+ }
+ else if( g_Buttons_result_increment != 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d g_UI_result_ID=%d, g_UI_result_increment=%d\n",
+ __func__, __LINE__, g_UI_result_ID, g_UI_result_increment);
+ send_subscribeTo_Buttons(wsi, id, result_ret);
+ }
+ else if( g_BasicCommunication_result_increment != 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d g_Buttons_result_ID=%d, g_Buttons_result_increment=%d\n",
+ __func__, __LINE__, g_UI_result_ID, g_UI_result_increment);
+ send_subscribeTo_BasicCommunication(wsi, id, result_ret);
+ }
+ /* subscribeToの応答[End] */
+ }
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ json_value_free(schema);
+ return;
+}
+
+static void send_registerComponent(struct lws* wsi, unsigned int id, unsigned int result_numbar){
+ if( id == SEND_registerComponent_VR_ID ){
+ send_registerComponent_Navigation(wsi);
+ }
+ else if(id == SEND_registerComponent_TTS_ID){
+ send_registerComponent_UI(wsi);
+ }
+ if(id == SEND_registerComponent_Navigation_ID){
+ send_registerComponent_TTS(wsi);
+ // subscribeTo用に保持.
+ g_Navigation_result_ID = result_numbar;
+ }
+ else if(id == SEND_registerComponent_UI_ID){
+ send_registerComponent_Buttons(wsi);
+ // subscribeTo用に保持.
+ g_UI_result_ID = result_numbar;
+ }
+ else if(id == SEND_registerComponent_Buttons_ID){
+ send_registerComponent_VehicleInfo(wsi);
+ g_Buttons_result_ID = result_numbar;
+ }
+ else if(id == SEND_registerComponent_VehicleInfo_ID){
+ send_registerComponent_RC(wsi);
+ }
+ else if(id == SEND_registerComponent_RC_ID){
+ send_registerComponent_BasicCommunication(wsi);
+ }
+ else if(id == SEND_registerComponent_BasicCommunication_ID){
+ g_BasicCommunication_result_ID = result_numbar;
+
+ // registerCompnentが終わったのでsubscribeToを流す.
+ // インクリメントして送信.
+ g_Navigation_result_increment++;
+ send_subscribeTo_Navigation(wsi, 0, NULL);
+ }
+}
+
+static void send_subscribeTo_Navigation(struct lws* wsi, unsigned int id, char* result_ret){
+ void (*func[2])(struct lws*) = {
+ send_subscribeTo_Navigation_OnAudioDataStreaming,
+ send_subscribeTo_Navigation_OnVideoDataStreaming,
+ };
+
+ // 関数呼び出し
+ func[g_Navigation_result_increment-1](wsi);
+ g_Navigation_result_increment++;
+ if( 2 <= g_Navigation_result_increment ){
+ g_Navigation_result_increment = 0;
+ // 次のシーケンスを進めるためにインクリメントしておく.
+ g_UI_result_increment++;
+ }
+}
+
+static void send_subscribeTo_UI(struct lws* wsi, unsigned int id, char* result_ret){
+ void (*func[1])(struct lws*) = {
+ send_subscribeTo_UI_OnRecordStart,
+ };
+
+ // 関数呼び出し
+ func[g_UI_result_increment-1](wsi);
+ g_UI_result_increment++;
+ if( 1 <= g_UI_result_increment ){
+ g_UI_result_increment = 0;
+ // 次のシーケンスを進めるためにインクリメントしておく.
+ g_Buttons_result_increment++;
+ }
+}
+
+static void send_subscribeTo_Buttons(struct lws* wsi, unsigned int id, char* result_ret){
+ void (*func[1])(struct lws*) = {
+ send_subscribeTo_Buttons_OnButtonSubscription,
+ };
+
+ // 関数呼び出し
+ func[g_Buttons_result_increment-1](wsi);
+ g_Buttons_result_increment++;
+ if( 1 <= g_Buttons_result_increment ){
+ g_Buttons_result_increment = 0;
+ // 次のシーケンスを進めるためにインクリメントしておく.
+ g_BasicCommunication_result_increment++;
+ }
+}
+
+
+static void send_subscribeTo_BasicCommunication(struct lws* wsi, unsigned int id, char* result_ret){
+ if( 11 <= g_BasicCommunication_result_increment ){
+ return;
+ }
+
+ // 関数ポインタの配列
+ void (*func[10])(struct lws*) = {
+ send_subscribeTo_BasicCommunication_OnPutFile,
+ send_subscribeTo_SDL_OnStatusUpdate,
+ send_subscribeTo_SDL_OnAppPermissionChanged,
+ send_subscribeTo_BasicCommunication_OnSDLPersistenceComplete,
+ send_subscribeTo_BasicCommunication_OnFileRemoved,
+ send_subscribeTo_BasicCommunication_OnAppRegistered,
+ send_subscribeTo_BasicCommunication_OnAppUnregistered,
+ send_subscribeTo_BasicCommunication_OnSDLClose,
+ send_subscribeTo_SDL_OnSDLConsentNeeded,
+ send_subscribeTo_BasicCommunication_OnResumeAudioSource
+ };
+
+ // 関数呼び出し
+ func[g_BasicCommunication_result_increment-1](wsi);
+ g_BasicCommunication_result_increment++;
+ if( 11 <= g_BasicCommunication_result_increment ){
+
+ // registerComponentが終わったのでOnReadyを通知するが
+ // OnReadyはSDLコアから応答が無いので、応答を待ってシーケンスを流すことが出来ない。
+ // libWebSocketsは同期で連続してwrite出来ないようなので、usleep(1000000)を行う.
+ send_BasicCommunication_OnReady(wsi);
+ //usleep(1000000);
+ }
+}
+
+// ***********************************************
+// Receive関数郡[End]
+// ***********************************************
+
+// ***********************************************
+// Send関数郡[Start]
+// ***********************************************
+
+// @todo 適切な名前が浮かばなかった...
+// write処理をまとめた関数.
+static void do_lws_write(struct lws* wsi, char* serialized_string, JSON_Value *root_value){
+ unsigned char buf[MAX_DATA_SIZE];
+ memset(buf,'\0',MAX_DATA_SIZE);
+ strncpy(buf, serialized_string, strlen(serialized_string));
+ json_free_serialized_string(serialized_string);
+ json_value_free(root_value);
+
+ g_len = strlen(buf);
+ g_protocol = LWS_WRITE_TEXT;
+ memset(g_buf, '\0', MAX_DATA_SIZE);
+ memcpy(g_buf, buf, g_len);
+
+ stack_push(g_buf);
+
+ lws_callback_on_writable( wsi );
+}
+
+/* 共通利用[Start] */
+static void send_rpc_isReady(struct lws* wsi, unsigned int id, int rpctype) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_number(root_object, "id", id);
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+
+ json_object_dotset_boolean(root_object, "result.available", 1);
+ json_object_dotset_number(root_object, "result.code", 0);
+
+ switch(rpctype){
+ case RPC_VR:
+ json_object_dotset_string(root_object, "result.method", "VR.IsReady");
+ break;
+ case RPC_TTS:
+ json_object_dotset_string(root_object, "result.method", "TTS.IsReady");
+ break;
+ case RPC_UI:
+ json_object_dotset_string(root_object, "result.method", "UI.IsReady");
+ break;
+ case RPC_Navigation:
+ json_object_dotset_string(root_object, "result.method", "Navigation.IsReady");
+ break;
+ case RPC_VehicleInfo:
+ json_object_dotset_string(root_object, "result.method", "VehicleInfo.IsReady");
+ break;
+ case RPC_RC:
+ json_object_dotset_string(root_object, "result.method", "RC.IsReady");
+ break;
+ default:
+ exit(0);
+ break;
+ }
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+
+ const char *isBluetooth;
+ isBluetooth = getenv("IS_BLUETOOTH");
+ if( isBluetooth != NULL ){
+ // BT対応
+ if(rpctype == RPC_Navigation){
+ start_OnStartDeviceDiscovery_thread();
+ }
+ }
+}
+static void send_rpc_GetSupportedLanguages(struct lws* wsi, unsigned int id, int rpctype) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+
+ json_object_dotset_number(root_object, "result.code", 0);
+
+ switch(rpctype){
+ case RPC_VR:
+ json_object_dotset_string(root_object, "result.method", "VR.GetSupportedLanguages");
+ break;
+ case RPC_TTS:
+ json_object_dotset_string(root_object, "result.method", "TTS.GetSupportedLanguages");
+ break;
+ case RPC_UI:
+ json_object_dotset_string(root_object, "result.method", "UI.GetSupportedLanguages");
+ break;
+ default:
+ exit(0);
+ break;
+ }
+ json_object_dotset_string(root_object, "result.language", "EN-US");
+
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_rpc_GetLanguage(struct lws* wsi, unsigned int id, int rpctype) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+
+ json_object_dotset_number(root_object, "result.code", 0);
+
+ switch(rpctype){
+ case RPC_VR:
+ json_object_dotset_string(root_object, "result.method", "VR.GetLanguage");
+ break;
+ case RPC_TTS:
+ json_object_dotset_string(root_object, "result.method", "TTS.GetLanguage");
+ break;
+ case RPC_UI:
+ json_object_dotset_string(root_object, "result.method", "UI.GetLanguage");
+ break;
+ case RPC_Navigation:
+ json_object_dotset_string(root_object, "result.method", "Navigation.GetLanguage");
+ break;
+ case RPC_VehicleInfo:
+ json_object_dotset_string(root_object, "result.method", "VehicleInfo.GetLanguage");
+ break;
+ case RPC_RC:
+ json_object_dotset_string(root_object, "result.method", "RC.GetLanguage");
+ break;
+ default:
+ exit(0);
+ break;
+ }
+ json_object_dotset_string(root_object, "result.language", "EN-US");
+
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_rpc_ChangeRegistration(struct lws* wsi, unsigned int id, int rpctype) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+
+ json_object_dotset_number(root_object, "result.code", 0);
+
+ switch(rpctype){
+ case RPC_VR:
+ json_object_dotset_string(root_object, "result.method", "VR.ChangeRegistration");
+ break;
+ case RPC_TTS:
+ json_object_dotset_string(root_object, "result.method", "TTS.ChangeRegistration");
+ break;
+ case RPC_UI:
+ json_object_dotset_string(root_object, "result.method", "UI.ChangeRegistration");
+ break;
+ default:
+ exit(0);
+ break;
+ }
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_rpc_AddCommand(struct lws* wsi, unsigned int id, int rpctype) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+
+ json_object_dotset_number(root_object, "result.code", 0);
+
+ switch(rpctype){
+ case RPC_VR:
+ json_object_dotset_string(root_object, "result.method", "VR.AddCommand");
+ break;
+ case RPC_UI:
+ json_object_dotset_string(root_object, "result.method", "UI.AddCommand");
+ break;
+ default:
+ exit(0);
+ break;
+ }
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+
+/* 共通利用[End] */
+static void send_ui_OnTouchEvent(struct lws* wsi, unsigned int val_x, unsigned int val_y, unsigned int id, unsigned int ts, char* type){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld wsi=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), wsi);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_string(root_object, "method", "UI.OnTouchEvent");
+ json_object_dotset_value(root_object, "params.event", "Navigation.SetVideoConfig");
+
+
+#if 0
+ /* devicelistのidを取得[Start] */
+ JSON_Value *schema = json_parse_string(string);
+ JSON_Array* devicelist = json_object_dotget_array(sdl_json_object(schema), "params.deviceList");
+ for (int l = 0; l < json_array_get_count(devicelist); l++) {
+ JSON_Object *link = json_array_get_object(devicelist, l);
+ // deviceidの文字列を保持.
+ char* ideviceid = sdl_json_object_get_string(link, "id");
+ memset(g_deviceid, 0x00, sizeof(g_deviceid));
+ memcpy(g_deviceid, ideviceid, strlen(ideviceid));
+
+ char* iname = sdl_json_object_get_string(link, "name");
+ memset(g_name, 0x00, sizeof(g_name));
+ memcpy(g_name, iname, strlen(iname));
+
+ char* itransportType = sdl_json_object_get_string(link, "transportType");
+ memset(g_transportType, 0x00, sizeof(g_transportType));
+ memcpy(g_transportType, itransportType, strlen(itransportType));
+
+ g_isSDLAllowed = sdl_json_object_get_boolean(link, "isSDLAllowed");
+ }
+#endif
+}
+
+static void send_navigation_SetVideoConfig(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld wsi=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), wsi);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "Navigation.SetVideoConfig");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(web_socket, serialized_string, root_value);
+}
+
+static void send_navigation_StartAudioStream(struct lws* wsi, unsigned int id){
+ lwsl_notice("%s:%d pid=%d, tid=%ld wsi=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), wsi);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "Navigation.StartAudioStream");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(web_socket, serialized_string, root_value);
+}
+static void send_navigation_StopAudioStream(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld wsi=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), wsi);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "Navigation.StopAudioStream");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(web_socket, serialized_string, root_value);
+}
+
+static void send_navigation_StartStream(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld wsi=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), wsi);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "Navigation.StartStream");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(web_socket, serialized_string, root_value);
+}
+
+void *OnFindApplications_thread(void *p) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld web_socket=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), web_socket);
+
+ while( 1 ) {
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_string(root_object, "method", "BasicCommunication.OnFindApplications");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(web_socket, serialized_string, root_value);
+
+ sleep(30);
+ }
+}
+
+void *OnStartDeviceDiscovery_thread(void *p) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld web_socket=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), web_socket);
+
+ while( 1 ) {
+ // export
+ const char *bt_found_execute;
+ bt_found_execute = getenv("BT_FOUND_EXECUTE");
+ if( bt_found_execute != NULL ){
+ send_BasicCommunication_OnStartDeviceDiscovery(web_socket);
+ sleep(30);
+ } else {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d BTfound is oneshot", __func__, __LINE__, getpid(), syscall(SYS_gettid), web_socket);
+ send_BasicCommunication_OnStartDeviceDiscovery(web_socket);
+ return;
+ }
+ }
+}
+
+static void start_OnStartDeviceDiscovery_thread(){
+ pthread_t pthread;
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld \n", __func__, __LINE__, getpid(), syscall(SYS_gettid));
+ pthread_create( &pthread, NULL, &OnStartDeviceDiscovery_thread, NULL);
+}
+
+static void send_BasicCommunication_OnFindApplications(struct lws* wsi){
+ pthread_t pthread;
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld wsi=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), wsi);
+ pthread_create( &pthread, NULL, &OnFindApplications_thread, NULL);
+}
+
+static void send_BasicCommunication_UpdateDeviceList(struct lws* wsi, unsigned int id, char* string){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld wsi=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), wsi);
+ // {"id":43,"jsonrpc":"2.0","method":"BasicCommunication.UpdateDeviceList",
+ // "params":{"deviceList":[{"id":"c8624d25341699e297408b608797e42c342a62a97db8c7eb8bed2dd21468dd07","isSDLAllowed":true,"name":"192.168.1.53","transportType":"WIFI"}]}}
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ // UpdateDeviceList がきたら、OnDeviceRankChangedをまずは呼ぶ
+ json_object_set_string(root_object, "method", "BasicCommunication.OnDeviceRankChanged");
+
+ /* devicelistのidを取得[Start] */
+ JSON_Value *schema = json_parse_string(string);
+ JSON_Array* devicelist = json_object_dotget_array(sdl_json_object(schema), "params.deviceList");
+ for (int l = 0; l < json_array_get_count(devicelist); l++) {
+ JSON_Object *link = json_array_get_object(devicelist, l);
+ // deviceidの文字列を保持.
+ char* ideviceid = sdl_json_object_get_string(link, "id");
+ memset(g_deviceid, 0x00, sizeof(g_deviceid));
+ memcpy(g_deviceid, ideviceid, strlen(ideviceid));
+
+ char* iname = sdl_json_object_get_string(link, "name");
+ memset(g_name, 0x00, sizeof(g_name));
+ memcpy(g_name, iname, strlen(iname));
+
+ char* itransportType = sdl_json_object_get_string(link, "transportType");
+ memset(g_transportType, 0x00, sizeof(g_transportType));
+ memcpy(g_transportType, itransportType, strlen(itransportType));
+
+ g_isSDLAllowed = sdl_json_object_get_boolean(link, "isSDLAllowed");
+ }
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d g_deviceid:%s\n", __func__, __LINE__, g_deviceid);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d iname:%s\n", __func__, __LINE__, g_name);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d g_transportType:%s\n", __func__, __LINE__, g_transportType);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d g_isSDLAllowed:%d\n", __func__, __LINE__, g_isSDLAllowed);
+ json_value_free(schema);
+ /* devicelistのidを取得[End] */
+
+ json_object_dotset_string(root_object, "params.device.id", g_deviceid);
+ json_object_dotset_boolean(root_object, "params.device.isSDLAllowed", g_isSDLAllowed);
+ json_object_dotset_string(root_object, "params.device.name", g_name);
+ json_object_dotset_string(root_object, "params.device.transportType", g_transportType);
+ json_object_dotset_string(root_object, "params.deviceRank", "DRIVER");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+ do_lws_write(wsi, serialized_string, root_value);
+
+ // 続けてupdateDeviceListをsendする.
+ do_send_BasicCommunication_UpdateDeviceList(wsi, id);
+}
+
+static void do_send_BasicCommunication_UpdateDeviceList(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld wsi=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), wsi);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_string(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "BasicCommunication.UpdateDeviceList");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_rpc_rc_OnRemoteControlSettings(struct lws*wsi, unsigned int id, int rpctype){
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_string(root_object, "method", "RC.OnRemoteControlSettings");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_rpc_VehicleInfo_GetVehicleData(struct lws*wsi, unsigned int id, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ // 定期通知用のスレッドが動いていない場合は、初期値を取得.
+ // getvehicledata_init == 1 の場合、初期値取得済み.
+ if ((vehicledata_thread != 0) && (getvehicledata_init == 0)) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d GetVehicleData : vehicledata_thread1 = %d \n", __func__, __LINE__, vehicledata_thread);
+ // GetVehicleData向け初期値取得.
+ char line_string[MAX_DATA_SIZE];
+ memset(line_string,'\0',MAX_DATA_SIZE);
+ // JSON形式 : sendstrings.
+ char sendstrings[MAX_DATA_SIZE];
+ memset(sendstrings,'\0',MAX_DATA_SIZE);
+
+ // 車両情報(ダミーデータ)を読み込み.
+ if( fp_can == NULL ) {
+ fp_can = fopen("/storage/vehicledata.txt", "r");
+ if (fp_can == NULL) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("fp_can == NULL : vehicledata.txt open error.");
+ return;
+ }
+ }
+
+ while (true) {
+ // fp_canから1行文字列を読み込み、line_stringに格納('\n'有).
+ if (fgets(line_string, MAX_DATA_SIZE, fp_can) == EOF) {
+ parse_VehicleData_string(sendstrings);
+ memset(sendstrings,'\0',MAX_DATA_SIZE);
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("GetVehicleData : vehicledata.txt : read end.");
+ break;
+ } else {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d test line_string : %s\n", __func__, __LINE__, line_string);
+ if( strncmp("<End>", line_string, 5) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d sendstrings===>%s\n", __func__, __LINE__, sendstrings);
+ // 初期値を保持する.
+ parse_VehicleData_string(sendstrings);
+ memset(sendstrings,'\0',MAX_DATA_SIZE);
+
+ // 定期通知のスレッドが動いていない場合.
+ // ダミーデータを読み進めないため、フラグ管理する.
+ getvehicledata_init = 1;
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("GetVehicleData : vehicledata.txt : send read.");
+ break;
+ } else if ( strncmp("FINISH_VEHICLE_DATA", line_string, 19) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d sendstrings===>%s\n", __func__, __LINE__, sendstrings);
+ // 初期値を保持する.
+ parse_VehicleData_string(sendstrings);
+ memset(sendstrings,'\0',MAX_DATA_SIZE);
+
+ // 定期通知のスレッドが動いていない場合.
+ // ダミーデータを読み進めないため、フラグ管理する.
+ getvehicledata_init = 1;
+
+ // 最終行のため、閉じる.
+ fclose(fp_can);
+ fp_can = NULL;
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("GetVehicleData : vehicledata.txt : finish read.");
+ break;
+ }else if ( strncmp("<Start>", line_string, 7) == 0 ){
+ // なにもしない.
+ if(DEBUG_LOG_ENABLE)lwsl_notice("start tag read.\n");
+ } else {
+ //if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d %s\n", __func__, __LINE__, line_string);
+ // JSON形式に文字列を変更するため、sendstringsに文字列連結.
+ strncat(sendstrings, line_string, strlen(line_string));
+ }
+ }
+ }
+ }
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "VehicleInfo.GetVehicleData");
+
+ // 車両情報(GSP).
+ json_object_dotset_number(root_object, "result.gps.longitudeDegrees", vehicledata_gps_longitudedegrees);
+ json_object_dotset_number(root_object, "result.gps.latitudeDegrees", vehicledata_gps_latitudedegrees);
+
+ json_object_dotset_number(root_object, "result.gps.utcYear", vehicledata_gps_utcyear);
+ json_object_dotset_number(root_object, "result.gps.utcMonth", vehicledata_gps_utcmonth);
+ json_object_dotset_number(root_object, "result.gps.utcDay", vehicledata_gps_utcday);
+ json_object_dotset_number(root_object, "result.gps.utcHours", vehicledata_gps_utchours);
+ json_object_dotset_number(root_object, "result.gps.utcMinutes", vehicledata_gps_utcminutes);
+ json_object_dotset_number(root_object, "result.gps.utcSeconds", vehicledata_gps_utcseconds);
+
+ json_object_dotset_string(root_object, "result.gps.compassDirection", vehicledata_gps_compassdirection);
+ json_object_dotset_number(root_object, "result.gps.pdop", vehicledata_gps_pdop);
+ json_object_dotset_number(root_object, "result.gps.hdop", vehicledata_gps_hdop);
+ json_object_dotset_number(root_object, "result.gps.vdop", vehicledata_gps_vdop);
+
+ json_object_dotset_boolean(root_object, "result.gps.actual", vehicledata_gps_actual);
+ json_object_dotset_number(root_object, "result.gps.satellites", vehicledata_gps_satellites);
+ json_object_dotset_string(root_object, "result.gps.dimension", vehicledata_gps_dimension);
+
+ json_object_dotset_number(root_object, "result.gps.altitude", vehicledata_gps_altitude);
+ json_object_dotset_number(root_object, "result.gps.heading", vehicledata_gps_heading);
+ json_object_dotset_number(root_object, "result.gps.speed", vehicledata_gps_speed);
+
+ // 車両情報(Speed).
+ json_object_dotset_number(root_object, "result.speed", vehicledata_speed);
+
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_rpc_VehicleInfo_GetVehicleType(struct lws* wsi, unsigned int id, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "VehicleInfo.GetVehicleType");
+ json_object_dotset_string(root_object, "result.vehicleType.make", "Ford");
+ json_object_dotset_string(root_object, "result.vehicleType.model", "Fiesta");
+ json_object_dotset_string(root_object, "result.vehicleType.modelYear", "2013");
+ json_object_dotset_string(root_object, "result.vehicleType.trim", "SE");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+void *OnVehicleData_thread(void *p) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld web_socket=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), web_socket);
+
+ if( web_socket == NULL ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("web_socket == NULL");
+ return;
+ }
+
+ // 指定文字数分メモリ確保.
+ // 1行読み込み : line_string.
+ char line_string[MAX_DATA_SIZE];
+ memset(line_string,'\0',MAX_DATA_SIZE);
+ // JSON形式 : sendstrings.
+ char sendstrings[MAX_DATA_SIZE];
+ memset(sendstrings,'\0',MAX_DATA_SIZE);
+
+ // 車両情報(ダミーデータ)を読み込み.
+ if( fp_can == NULL ) {
+ fp_can = fopen("/storage/vehicledata.txt", "r");
+ if (fp_can == NULL) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("fp_can == NULL : vehicledata.txt open error.");
+ return;
+ }
+ }
+
+ while (true) {
+ if (vehicledata_thread != 0) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d vehicledata_thread cancel = %d \n", __func__, __LINE__, vehicledata_thread);
+ break;
+ }
+ // fp_canから1行文字列を読み込み、line_stringに格納('\n'有).
+ if (fgets(line_string, MAX_DATA_SIZE, fp_can) == NULL) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("vehicledata.txt : fgets == NULL.");
+ // 読み取り終わったので、再度読み直し.
+ fclose(fp_can);
+ fp_can = NULL;
+ fp_can = fopen("/storage/vehicledata.txt", "r");
+ continue;
+ } else {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d fgets != NULL : %s\n", __func__, __LINE__, line_string);
+ if( strncmp("<End>", line_string, 5) == 0 ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d sendstrings===>%s\n", __func__, __LINE__, sendstrings);
+ // SDLコアに送信.
+ do_lws_write_can(web_socket, sendstrings);
+ usleep(100000);
+ memset(sendstrings,'\0',MAX_DATA_SIZE);
+ continue;
+ } else if ( strncmp("<Start>", line_string, 7) == 0 ){
+ // なにもしない.
+ if(DEBUG_LOG_ENABLE)lwsl_notice("start tag read.\n");
+ } else {
+ //if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d %s\n", __func__, __LINE__, line_string);
+ // JSON形式に文字列を変更するため、sendstringsに文字列連結.
+ strncat(sendstrings, line_string, strlen(line_string));
+ }
+ }
+ }
+}
+
+static void send_rpc_VehicleInfo_SubscribeVehicleData(struct lws* wsi, unsigned int id, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ // FFW.VehicleInfo.SubscribeVehicleDataResponse -- From line 263 of file:///android_asset/sdl_hmi/ffw/VehicleInfoRPC.js
+ // {"jsonrpc":"2.0","id":49,"result":{"accPedalPosition":{"dataType":"VEHICLEDATA_ACCPEDAL","resultCode":"SUCCESS"},"airbagStatus":{"dataType":"VEHICLEDATA_AIRBAGSTATUS","resultCode":"SUCCESS"},"beltStatus":{"dataType":"VEHICLEDATA_BELTSTATUS","resultCode":"SUCCESS"},"bodyInformation":{"dataType":"VEHICLEDATA_BODYINFO","resultCode":"SUCCESS"},"clusterModes":{"dataType":"VEHICLEDATA_CLUSTERMODESTATUS","resultCode":"SUCCESS"},"deviceStatus":{"dataType":"VEHICLEDATA_DEVICESTATUS","resultCode":"SUCCESS"},"driverBraking":{"dataType":"VEHICLEDATA_BRAKING","resultCode":"SUCCESS"},"eCallInfo":{"dataType":"VEHICLEDATA_ECALLINFO","resultCode":"SUCCESS"},"emergencyEvent":{"dataType":"VEHICLEDATA_EMERGENCYEVENT","resultCode":"SUCCESS"},"engineTorque":{"dataType":"VEHICLEDATA_ENGINETORQUE","resultCode":"SUCCESS"},"extendData1":{"dataType":"VEHICLEDATA_EXTENDDATA1","resultCode":"SUCCESS"},"extendData2":{"dataType":"VEHICLEDATA_EXTENDDATA2","resultCode":"SUCCESS"},"extendData3":{"dataType":"VEHICLEDATA_EXTENDDATA3","resultCode":"SUCCESS"},"extendData4":{"dataType":"VEHICLEDATA_EXTENDDATA4","resultCode":"SUCCESS"},"extendData5":{"dataType":"VEHICLEDATA_EXTENDDATA5","resultCode":"SUCCESS"},"externalTemperature":{"dataType":"VEHICLEDATA_EXTERNTEMP","resultCode":"VEHICLE_DATA_NOT_AVAILABLE"},"fuelLevel":{"dataType":"VEHICLEDATA_FUELLEVEL","resultCode":"SUCCESS"},"fuelLevel_State":{"dataType":"VEHICLEDATA_FUELLEVEL_STATE","resultCode":"SUCCESS"},"gps":{"dataType":"VEHICLEDATA_GPS","resultCode":"SUCCESS"},"headLampStatus":{"dataType":"VEHICLEDATA_HEADLAMPSTATUS","resultCode":"SUCCESS"},"instantFuelConsumption":{"dataType":"VEHICLEDATA_FUELCONSUMPTION","resultCode":"SUCCESS"},"myKey":{"dataType":"VEHICLEDATA_MYKEY","resultCode":"SUCCESS"},"odometer":{"dataType":"VEHICLEDATA_ODOMETER","resultCode":"SUCCESS"},"prndl":{"dataType":"VEHICLEDATA_PRNDL","resultCode":"SUCCESS"},"rpm":{"dataType":"VEHICLEDATA_RPM","resultCode":"SUCCESS"},"speed":{"dataType":"VEHICLEDATA_SPEED","resultCode":"SUCCESS"},"steeringWheelAngle":{"dataType":"VEHICLEDATA_STEERINGWHEEL","resultCode":"SUCCESS"},"tirePressure":{"dataType":"VEHICLEDATA_TIREPRESSURE","resultCode":"SUCCESS"},"wiperStatus":{"dataType":"VEHICLEDATA_WIPERSTATUS","resultCode":"SUCCESS"},"code":0,"method":"VehicleInfo.SubscribeVehicleData"}} -- From line 247 of file:///android_asset/sdl_hmi/ffw/RPCClient.js
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "VehicleInfo.SubscribeVehicleData");
+ json_object_dotset_string(root_object, "result.gps.dataType", "VEHICLEDATA_GPS");
+ json_object_dotset_string(root_object, "result.gps.resultCode", "SUCCESS");
+ json_object_dotset_string(root_object, "result.speed.dataType", "VEHICLEDATA_SPEED");
+ json_object_dotset_string(root_object, "result.speed.resultCode", "SUCCESS");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+
+ // 車両情報(ダミーデータ)送信スレッド生成.
+ if (vehicledata_thread != 0) {
+ pthread_t pthread;
+ //if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld wsi=%p\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), wsi);
+ vehicledata_thread = pthread_create( &pthread, NULL, &OnVehicleData_thread, NULL);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d vehicledata_thread = %d \n", __func__, __LINE__, vehicledata_thread);
+ }
+}
+
+static void send_rpc_VehicleInfo_UnsubscribeVehicleData(struct lws* wsi, unsigned int id, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ // FFW.VehicleInfo.SubscribeVehicleDataResponse -- From line 263 of file:///android_asset/sdl_hmi/ffw/VehicleInfoRPC.js
+ // {"jsonrpc":"2.0","id":49,"result":{"accPedalPosition":{"dataType":"VEHICLEDATA_ACCPEDAL","resultCode":"SUCCESS"},"airbagStatus":{"dataType":"VEHICLEDATA_AIRBAGSTATUS","resultCode":"SUCCESS"},"beltStatus":{"dataType":"VEHICLEDATA_BELTSTATUS","resultCode":"SUCCESS"},"bodyInformation":{"dataType":"VEHICLEDATA_BODYINFO","resultCode":"SUCCESS"},"clusterModes":{"dataType":"VEHICLEDATA_CLUSTERMODESTATUS","resultCode":"SUCCESS"},"deviceStatus":{"dataType":"VEHICLEDATA_DEVICESTATUS","resultCode":"SUCCESS"},"driverBraking":{"dataType":"VEHICLEDATA_BRAKING","resultCode":"SUCCESS"},"eCallInfo":{"dataType":"VEHICLEDATA_ECALLINFO","resultCode":"SUCCESS"},"emergencyEvent":{"dataType":"VEHICLEDATA_EMERGENCYEVENT","resultCode":"SUCCESS"},"engineTorque":{"dataType":"VEHICLEDATA_ENGINETORQUE","resultCode":"SUCCESS"},"extendData1":{"dataType":"VEHICLEDATA_EXTENDDATA1","resultCode":"SUCCESS"},"extendData2":{"dataType":"VEHICLEDATA_EXTENDDATA2","resultCode":"SUCCESS"},"extendData3":{"dataType":"VEHICLEDATA_EXTENDDATA3","resultCode":"SUCCESS"},"extendData4":{"dataType":"VEHICLEDATA_EXTENDDATA4","resultCode":"SUCCESS"},"extendData5":{"dataType":"VEHICLEDATA_EXTENDDATA5","resultCode":"SUCCESS"},"externalTemperature":{"dataType":"VEHICLEDATA_EXTERNTEMP","resultCode":"VEHICLE_DATA_NOT_AVAILABLE"},"fuelLevel":{"dataType":"VEHICLEDATA_FUELLEVEL","resultCode":"SUCCESS"},"fuelLevel_State":{"dataType":"VEHICLEDATA_FUELLEVEL_STATE","resultCode":"SUCCESS"},"gps":{"dataType":"VEHICLEDATA_GPS","resultCode":"SUCCESS"},"headLampStatus":{"dataType":"VEHICLEDATA_HEADLAMPSTATUS","resultCode":"SUCCESS"},"instantFuelConsumption":{"dataType":"VEHICLEDATA_FUELCONSUMPTION","resultCode":"SUCCESS"},"myKey":{"dataType":"VEHICLEDATA_MYKEY","resultCode":"SUCCESS"},"odometer":{"dataType":"VEHICLEDATA_ODOMETER","resultCode":"SUCCESS"},"prndl":{"dataType":"VEHICLEDATA_PRNDL","resultCode":"SUCCESS"},"rpm":{"dataType":"VEHICLEDATA_RPM","resultCode":"SUCCESS"},"speed":{"dataType":"VEHICLEDATA_SPEED","resultCode":"SUCCESS"},"steeringWheelAngle":{"dataType":"VEHICLEDATA_STEERINGWHEEL","resultCode":"SUCCESS"},"tirePressure":{"dataType":"VEHICLEDATA_TIREPRESSURE","resultCode":"SUCCESS"},"wiperStatus":{"dataType":"VEHICLEDATA_WIPERSTATUS","resultCode":"SUCCESS"},"code":0,"method":"VehicleInfo.SubscribeVehicleData"}} -- From line 247 of file:///android_asset/sdl_hmi/ffw/RPCClient.js
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "VehicleInfo.UnsubscribeVehicleData");
+ json_object_dotset_string(root_object, "result.gps.dataType", "VEHICLEDATA_GPS");
+ json_object_dotset_string(root_object, "result.gps.resultCode", "SUCCESS");
+ json_object_dotset_string(root_object, "result.speed.dataType", "VEHICLEDATA_SPEED");
+ json_object_dotset_string(root_object, "result.speed.resultCode", "SUCCESS");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ if (vehicledata_thread == 0) {
+ vehicledata_thread = -1;
+ pthread_cancel(&OnVehicleData_thread);
+ if (fp_can != NULL) {
+ fclose(fp_can);
+ fp_can = NULL;
+ getvehicledata_init = 0;
+ }
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pthread_cancel \n", __func__, __LINE__);
+ }
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void parse_VehicleData_string(const char *string) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ //if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d test string : %s\n", __func__, __LINE__, string);
+
+ // JSONオブジェクト生成.
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ JSON_Value *schema = json_parse_string(string);
+
+ // 車両情報(GPS).
+ vehicledata_gps_longitudedegrees = json_object_dotget_number(sdl_json_object(schema), "params.gps.longitudeDegrees");
+ vehicledata_gps_latitudedegrees = json_object_dotget_number(sdl_json_object(schema), "params.gps.latitudeDegrees");
+
+ vehicledata_gps_utcyear = json_object_dotget_number(sdl_json_object(schema), "params.gps.utcYear");
+ vehicledata_gps_utcmonth = json_object_dotget_number(sdl_json_object(schema), "params.gps.utcMonth");
+ vehicledata_gps_utcday = json_object_dotget_number(sdl_json_object(schema), "params.gps.utcDay");
+ vehicledata_gps_utchours = json_object_dotget_number(sdl_json_object(schema), "params.gps.utcHours");
+ vehicledata_gps_utcminutes = json_object_dotget_number(sdl_json_object(schema), "params.gps.utcMinutes");
+ vehicledata_gps_utcseconds = json_object_dotget_number(sdl_json_object(schema), "params.gps.utcSeconds");
+
+ vehicledata_gps_compassdirection = json_object_dotget_string(sdl_json_object(schema), "params.gps.compassDirection");
+
+ vehicledata_gps_pdop = json_object_dotget_number(sdl_json_object(schema), "params.gps.pdop");
+ vehicledata_gps_hdop = json_object_dotget_number(sdl_json_object(schema), "params.gps.hdop");
+ vehicledata_gps_vdop = json_object_dotget_number(sdl_json_object(schema), "params.gps.vdop");
+
+ vehicledata_gps_actual = json_object_dotget_boolean(sdl_json_object(schema), "params.gps.actual");
+ vehicledata_gps_satellites = json_object_dotget_number(sdl_json_object(schema), "params.gps.satellites");
+ vehicledata_gps_dimension = json_object_dotget_string(sdl_json_object(schema), "params.gps.dimension");
+
+ vehicledata_gps_altitude = json_object_dotget_number(sdl_json_object(schema), "params.gps.altitude");
+ vehicledata_gps_heading = json_object_dotget_number(sdl_json_object(schema), "params.gps.heading");
+ vehicledata_gps_speed = json_object_dotget_number(sdl_json_object(schema), "params.gps.speed");
+
+ // 車両情報(Speed).
+ vehicledata_speed = json_object_dotget_number(sdl_json_object(schema), "params.speed");
+}
+
+static void do_lws_write_can(struct lws* wsi, char* serialized_string){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d : start \n", __func__, __LINE__);
+ unsigned char buf[MAX_DATA_SIZE];
+ memset(buf,'\0',MAX_DATA_SIZE);
+ strncpy(buf, serialized_string, strlen(serialized_string));
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_string(root_object, "method", "BasicCommunication.OnSystemRequest");
+ // 設定必須項目.
+ json_object_dotset_string(root_object, "params.requestType", "NAVIGATION");
+ json_object_dotset_string(root_object, "params.fileName", "/storage/NAVIGATION");
+ // 以下は任意.
+ json_object_dotset_string(root_object, "params.fileType", "JSON");
+ json_object_dotset_number(root_object, "params.appID", g_appID);
+ json_object_dotset_string(root_object, "params.url", (const char*)buf);
+
+ char *iSerialized_string = NULL;
+ iSerialized_string = json_serialize_to_string_pretty(root_value);
+
+ char buf2[MAX_DATA_SIZE];
+ memset(buf2,'\0',MAX_DATA_SIZE);
+ strncpy(buf2, iSerialized_string, strlen(iSerialized_string));
+ stack_push(buf2);
+
+ lws_callback_on_writable( wsi );
+}
+
+static void send_rpc_vr_GetCapabilities(struct lws* wsi, unsigned int id, int rpctype) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ // {"jsonrpc":"2.0","id":21,"result":{"code":0,"method":"VR.GetCapabilities","vrCapabilities":["TEXT"]}}
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "VR.GetCapabilities");
+ json_object_dotset_value(root_object, "result.vrCapabilities", json_parse_string("[\"TEXT\"]"));
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_rpc_buttons_GetCapabilities(struct lws* wsi, unsigned int id, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_set_number(root_object, "code", 0);
+ json_object_set_string(root_object, "method", "Buttons.GetCapabilities");
+
+ renketu_write(wsi, root_value, root_object, SEND_PATH_BUTTONS_GetCapabilities);
+
+}
+
+static void send_rpc_ui_GetCapabilities(struct lws* wsi, unsigned int id, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_set_number(root_object, "code", 0);
+ json_object_set_string(root_object, "method", "UI.GetCapabilities");
+
+ renketu_write(wsi, root_value, root_object, SEND_PATH_UI_GetCapabilities);
+}
+
+static void send_rpc_rc_GetCapabilities(struct lws* wsi, unsigned int id, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_set_number(root_object, "code", 0);
+ json_object_set_string(root_object, "method", "RC.GetCapabilities");
+
+ renketu_write(wsi, root_value, root_object, SEND_PATH_RC_GetCapabilities);
+
+}
+
+static void renketu_write(struct lws* wsi, JSON_Value *root_value, JSON_Object *root_object, char* filepath){
+ char *serialized_string = NULL;
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ // ここは力技で文字列を作成する.
+ unsigned char tmpbuf[MAX_DATA_SIZE];
+ memset(tmpbuf, '\0', MAX_DATA_SIZE);
+ //ファイルを読み込みモードで開く
+ FILE* fp_send = fopen(filepath,"r");
+ if( fp_send == NULL ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("fp_send open error");
+ return 0;
+ }
+ fgets(tmpbuf, MAX_DATA_SIZE, fp_send);
+ fclose(fp_send);
+
+ char renketu[MAX_DATA_SIZE];
+ memset(renketu, '\0', MAX_DATA_SIZE);
+
+ // 末尾の文字"}"を終端文字に変更したバッファを別に容易.
+ // そのままserialized_stringに余計なことすると、メモリ解放時に落ちる.
+ char tmpbuf2[MAX_DATA_SIZE];
+ memset(tmpbuf2, '\0', MAX_DATA_SIZE);
+ memcpy(tmpbuf2, serialized_string, strlen(serialized_string) - 1);
+
+ // Parsonで組み立てた文字列とファイルから読み出した文字列を連結して"}"で閉じる.
+ snprintf(renketu, MAX_DATA_SIZE, "%s%s", tmpbuf2, tmpbuf);
+
+ json_free_serialized_string(serialized_string);
+ json_value_free(root_value);
+
+ // write処理
+ // 書き出し対象とメモリ解放処理が異なることからdo_lws_writeを利用できないため.
+ g_len = strlen(renketu);
+ g_protocol = LWS_WRITE_TEXT;
+ memset(g_buf, '\0', MAX_DATA_SIZE);
+ memcpy(g_buf, renketu, g_len);
+
+ stack_push(g_buf);
+ lws_callback_on_writable( wsi );
+}
+
+static void send_rpc_tts_GetCapabilities(struct lws* wsi, unsigned int id, int rpctype){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "TTS.GetCapabilities");
+ json_object_dotset_value(root_object, "result.speechCapabilities",
+ json_parse_string("[\"TEXT\",\"PRE_RECORDED\"]"));
+ json_object_dotset_value(root_object, "result.prerecordedSpeechCapabilities",
+ json_parse_string("[\"HELP_JINGLE\",\"INITIAL_JINGLE\",\"LISTEN_JINGLE\",\"POSITIVE_JINGLE\",\"NEGATIVE_JINGLE\"]"));
+
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_BasicCommunication_MixingAudioSupported(struct lws* wsi, unsigned int id) {
+ // {"id":18,"jsonrpc":"2.0","result":{"code":0,"attenuatedSupported":true,"method":"BasicCommunication.MixingAudioSupported"}}
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_boolean(root_object, "result.attenuatedSupported", 1);
+ json_object_dotset_string(root_object, "result.method", "BasicCommunication.MixingAudioSupported");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_BasicCommunication_GetSystemInfo(struct lws* wsi, unsigned int id) {
+ // {"jsonrpc":"2.0","id":1,"result":{"code":0,"method":"BasicCommunication.GetSystemInfo","ccpu_version":"ccpu_version","language":"EN-US","wersCountryCode":"wersCountryCode"}}
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "BasicCommunication.GetSystemInfo");
+ json_object_dotset_string(root_object, "result.ccpu_version", "ccpu_version");
+ json_object_dotset_string(root_object, "result.language", "EN-US");
+ json_object_dotset_string(root_object, "result.wersCountryCode", "wersCountryCode");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+
+}
+
+/* BasicCommunication.OnReady の送信関数定義[Start] */
+static void send_BasicCommunication_OnReady(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_string(root_object, "method", "BasicCommunication.OnReady");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+
+}
+/* BasicCommunication.OnReady の送信関数定義[End] */
+
+/* subscribeTo Navigation関連の定義[Start] */
+static void send_subscribeTo_Navigation_OnAudioDataStreaming(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_Navigation_result_ID + g_Navigation_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "Navigation.OnAudioDataStreaming");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_subscribeTo_Navigation_OnVideoDataStreaming(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_Navigation_result_ID + g_Navigation_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "Navigation.OnVideoDataStreaming");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+/* subscribeTo Navigation関連の定義[End] */
+
+/* subscribeTo UI関連の定義[Start] */
+static void send_subscribeTo_UI_OnRecordStart(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_UI_result_ID + g_UI_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "UI.OnRecordStart");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+/* subscribeTo UI関連の定義[End] */
+
+
+/* subscribeTo Buttons関連の定義[Start] */
+static void send_subscribeTo_Buttons_OnButtonSubscription(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_Buttons_result_ID + g_Buttons_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "Buttons.OnButtonSubscription");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+/* subscribeTo Buttons関連の定義[Start] */
+
+/* subscribeTo BasicCommunication関連の定義[Start] */
+static void send_subscribeTo_BasicCommunication_OnPutFile(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "BasicCommunication.OnPutFile");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_subscribeTo_BasicCommunication_OnSDLPersistenceComplete(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "BasicCommunication.OnSDLPersistenceComplete");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_subscribeTo_BasicCommunication_OnFileRemoved(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "BasicCommunication.OnFileRemoved");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_subscribeTo_BasicCommunication_OnAppRegistered(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "BasicCommunication.OnAppRegistered");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_subscribeTo_BasicCommunication_OnAppUnregistered(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "BasicCommunication.OnAppUnregistered");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_subscribeTo_BasicCommunication_OnSDLClose(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "BasicCommunication.OnSDLClose");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_subscribeTo_BasicCommunication_OnResumeAudioSource(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "BasicCommunication.OnResumeAudioSource");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+/* subscribeTo BasicCommunication関連の定義[End] */
+
+/* subscribeTo SDL関連の定義[Start] */
+static void send_subscribeTo_SDL_OnSDLConsentNeeded(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ // SDLの場合もBasicCommunicationと同様のID定義で行う。インクリメントして送信.
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "SDL.OnSDLConsentNeeded");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_subscribeTo_SDL_OnStatusUpdate(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ // SDLの場合もBasicCommunicationと同様のID定義で行う。インクリメントして送信.
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "SDL.OnStatusUpdate");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_subscribeTo_SDL_OnAppPermissionChanged(struct lws* wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ // SDLの場合もBasicCommunicationと同様のID定義で行う。インクリメントして送信.
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ json_object_set_string(root_object, "method", "MB.subscribeTo");
+ json_object_dotset_string(root_object, "params.propertyName", "SDL.OnAppPermissionChanged");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+/* subscribeTo SDL関連の定義[End] */
+
+/* registerComponent の送信関数定義[Start] */
+static void send_registerComponent_VR(struct lws *wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", SEND_registerComponent_VR_ID);
+ json_object_set_string(root_object, "method", "MB.registerComponent");
+ json_object_dotset_string(root_object, "params.componentName", "VR");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_registerComponent_Navigation(struct lws *wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", SEND_registerComponent_Navigation_ID);
+ json_object_set_string(root_object, "method", "MB.registerComponent");
+ json_object_dotset_string(root_object, "params.componentName", "Navigation");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_registerComponent_TTS(struct lws *wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", SEND_registerComponent_TTS_ID);
+ json_object_set_string(root_object, "method", "MB.registerComponent");
+ json_object_dotset_string(root_object, "params.componentName", "TTS");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_registerComponent_UI(struct lws *wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", SEND_registerComponent_UI_ID);
+ json_object_set_string(root_object, "method", "MB.registerComponent");
+ json_object_dotset_string(root_object, "params.componentName", "UI");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_registerComponent_Buttons(struct lws *wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", SEND_registerComponent_Buttons_ID);
+ json_object_set_string(root_object, "method", "MB.registerComponent");
+ json_object_dotset_string(root_object, "params.componentName", "Buttons");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_registerComponent_VehicleInfo(struct lws *wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", SEND_registerComponent_VehicleInfo_ID);
+ json_object_set_string(root_object, "method", "MB.registerComponent");
+ json_object_dotset_string(root_object, "params.componentName", "VehicleInfo");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_registerComponent_RC(struct lws *wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", SEND_registerComponent_RC_ID);
+ json_object_set_string(root_object, "method", "MB.registerComponent");
+ json_object_dotset_string(root_object, "params.componentName", "RC");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_registerComponent_BasicCommunication(struct lws *wsi) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", SEND_registerComponent_BasicCommunication_ID);
+ json_object_set_string(root_object, "method", "MB.registerComponent");
+ json_object_dotset_string(root_object, "params.componentName", "BasicCommunication");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+//@tobi
+static void send_rpc_tts_SetGlobalProperties(struct lws* wsi, unsigned int id) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "TTS.SetGlobalProperties");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_rpc_ui_SetAppIcon(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "UI.SetAppIcon");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_rpc_ui_EndAudioPassThru(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "UI.EndAudioPassThru");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+void *PerformAudioPassThru_timerThread(void *wsi) {
+ //1000ms 未満は切り上げとする
+ int sleepSec = (g_PerformAudioPassThru_maxDuration + 999) / 1000;
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld web_socket=%p,id=%d, sleepSec=%d, duration=%d.\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), web_socket, g_PerformAudioPassThru_request_id, sleepSec,g_PerformAudioPassThru_maxDuration);
+
+ while( g_PerformAudioPassThru_running && sleepSec > 0 ) {
+ sleep(1);
+ sleepSec -= 1;
+ if (sleepSec == 0){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d pid=%d, tid=%ld web_socket=%p, %s\n", __func__, __LINE__, getpid(), syscall(SYS_gettid), web_socket, "PAT is Timeout.");
+ //sleep中にEndを受けている可能性があるため再チェックして通知する。
+ if (g_PerformAudioPassThru_running) {
+ send_rpc_ui_PerformAudioPassThru((struct lws*)wsi);
+ }
+ }
+ }
+}
+
+static void send_rpc_ui_EndAudioPassThru_error(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "error.code", 4);
+ json_object_dotset_string(root_object, "error.message", "Rejected: no PerformAudioPassThru is now active");
+ json_object_dotset_string(root_object, "error.data.method", "UI.EndAudioPassThru");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+static void send_rpc_ui_PerformAudioPassThru(struct lws* wsi){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_PerformAudioPassThru_request_id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "UI.PerformAudioPassThru");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+ //応答を返したら初期化する。
+ g_PerformAudioPassThru_request_id = 0;
+ g_PerformAudioPassThru_running = false;
+}
+static void send_rpc_ui_PerformAudioPassThru_error(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "error.code", 4);
+ json_object_dotset_string(root_object, "error.message", "already running PAT.");
+ json_object_dotset_string(root_object, "error.data.method", "UI.PerformAudioPassThru");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void saveparam_BasicCommunication_OnAppRegistered(struct lws* wsi, unsigned int id, char* string){
+ lwsl_notice("%s:%d \n", __func__, __LINE__);
+ /*
+ {
+ "jsonrpc":"2.0",
+ "method":"BasicCommunication.OnAppRegistered",
+ "params":{
+ "application":{
+ "appID":545095898,
+ "appName":"Hello Sdl",
+ "appType":["NAVIGATION"],
+ "deviceInfo":{
+ "id":"c8624d25341699e297408b608797e42c342a62a97db8c7eb8bed2dd21468dd07",
+ "isSDLAllowed":true,
+ "name":"192.168.1.53",
+ "transportType":"WIFI"
+ },
+ "hmiDisplayLanguageDesired":"EN-US",
+ "icon":"",
+ "isMediaApplication":false,
+ "ngnMediaScreenAppName":"Hello Sdl",
+ "policyAppID":"8675309",
+ "requestType":[]
+ },
+ "priority":"NONE",
+ "resumeVrGrammars":false,
+ "vrSynonyms":["Hello Sdl"]
+ }
+ }
+ */
+ JSON_Value *schema = json_parse_string(string);
+ // @todo 一つのアプリしかないからこのやり方でいいが、複数アプリへの対応となる場合、以下の管理では問題となる
+ g_appID = json_object_dotget_number(sdl_json_object(schema), "params.application.appID");
+ json_value_free(schema);
+
+ sleep(1);
+ send_sdl_ActivateApp(wsi);
+}
+
+static void releaseparam_BasicCommunication_OnAppUnregistered(struct lws* wsi, unsigned int id, char* string){
+ lwsl_notice("%s:%d \n", __func__, __LINE__);
+ // @todo 一つのアプリしかないからこのやり方でいいが、複数アプリへの対応となる場合、以下の管理では問題となる
+ g_appID = 0;
+}
+
+static void send_BasicCommunication_UpdateAppList(struct lws* wsi, unsigned int id, char* string){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "BasicCommunication.UpdateAppList");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+ // アプリ終了時関連
+ JSON_Value *schema = json_parse_string(string);
+ JSON_Array* devicelist = json_object_dotget_array(sdl_json_object(schema), "params.applications");
+ int count = json_array_get_count(devicelist);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d count=%d\n", __func__, __LINE__, count);
+ if( count == 0 ){
+ send_BasicCommunication_OnAppDeactivated(wsi);
+ }
+}
+
+static void send_BasicCommunication_OnAppDeactivated(struct lws* wsi){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ // "jsonrpc":"2.0","method":"BasicCommunication.OnAppDeactivated","params":{"appID":545095898}}
+ if( g_appID != 0 ){
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_string(root_object, "method", "BasicCommunication.OnAppDeactivated");
+ json_object_dotset_number(root_object, "params.appID", g_appID);
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+ }
+}
+
+
+static void send_BasicCommunication_PolicyUpdate(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "BasicCommunication.PolicyUpdate");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+
+ // PolicyUpdateのタイミングで送信する.
+ send_sdl_GetURLS(wsi);
+}
+
+static void send_BasicCommunication_ActivateApp(struct lws* wsi, unsigned int id){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", id);
+ json_object_dotset_number(root_object, "result.code", 0);
+ json_object_dotset_string(root_object, "result.method", "BasicCommunication.ActivateApp");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+
+ // PolicyUpdateのタイミングで送信する.
+ send_sdl_GetURLS(wsi);
+}
+
+static void send_sdl_OnStatusUpdate(struct lws* wsi, unsigned int id, char* string){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ JSON_Value *schema = json_parse_string(string);
+ // OnStatusUpdate そのものを返すわけではないが、パラメータを見て
+ // {"jsonrpc":"2.0","method":"SDL.OnStatusUpdate","params":{"status":"UPDATE_NEEDED"}}
+
+ char* istatus = json_object_dotget_string(sdl_json_object(schema), "params.status");
+ memset(g_status, 0x00, sizeof(g_status));
+ memcpy(g_status, istatus, strlen(istatus));
+
+ send_sdl_GetUserFriendlyMessage(wsi);
+ json_value_free(schema);
+}
+
+static void send_sdl_GetUserFriendlyMessage(struct lws* wsi){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ g_BasicCommunication_result_increment++;
+ json_object_set_string(root_object, "method", "SDL.GetUserFriendlyMessage");
+ json_object_dotset_string(root_object, "params.language", "EN-US");
+ if(strncmp(g_status, "UPDATE_NEEDED", sizeof("UPDATE_NEEDED")) == 0 ) {
+ json_object_dotset_value(root_object, "params.messageCodes", json_parse_string("[\"StatusNeeded\"]"));
+ }
+ else if(strncmp(g_status, "UPDATING", sizeof("UPDATING")) == 0){
+ json_object_dotset_value(root_object, "params.messageCodes", json_parse_string("[\"StatusPending\"]"));
+ //send_sdl_ActivateApp(wsi);
+ }
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+static void send_sdl_GetURLS(struct lws* wsi){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ g_BasicCommunication_result_increment++;
+ json_object_set_string(root_object, "method", "SDL.GetURLS");
+ json_object_dotset_number(root_object, "params.service", 7);
+ serialized_string = json_serialize_to_string_pretty(root_value);
+}
+
+static void send_sdl_ActivateApp(struct lws* wsi){
+ //{"jsonrpc":"2.0","id":6014,"method":"SDL.ActivateApp","params":{"appID":545095898}}
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_number(root_object, "id", g_BasicCommunication_result_ID + g_BasicCommunication_result_increment);
+ g_BasicCommunication_result_increment++;
+ json_object_set_string(root_object, "method", "SDL.ActivateApp");
+ json_object_dotset_number(root_object, "params.appID", g_appID);
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+// CAN受信対応(HMIからSDLコアへの通知)
+static void send_OnVehicleData(struct canfd_frame frame){
+ if( web_socket == NULL ){
+ return;
+ }
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_string(root_object, "method", "VehicleInfo.OnVehicleData");
+ json_object_dotset_number(root_object, "params.speed", frame.data[0]);
+
+ serialized_string = json_serialize_to_string_pretty(root_value);
+ do_lws_write(web_socket, serialized_string, root_value);
+}
+
+static void send_BasicCommunication_illumi_OnSystemRequest(struct canfd_frame frame){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ if( web_socket == NULL ){
+ return;
+ }
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+/*
+ "requestType":"HTTP",
+ "fileType":"JSON",
+ "offset":1000,
+ "length":10000,
+ "timeout":500,
+ "fileName":"/home/tobinai/DIA/sdl_hmi/IVSU/PROPRIETARY_REQUEST",
+ "url":"/home/tobinai/DIA/sdl_hmi/IVSU/PROPRIETARY_REQUEST",
+ "appID":545095898
+*/
+
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_string(root_object, "method", "BasicCommunication.OnSystemRequest");
+ // 設定必須項目.
+ json_object_dotset_string(root_object, "params.requestType", "NAVIGATION");
+ json_object_dotset_string(root_object, "params.fileName", "/storage/NAVIGATION");
+ // 以下は任意.
+ json_object_dotset_string(root_object, "params.fileType", "JSON");
+ json_object_dotset_number(root_object, "params.appID", g_appID);
+ if( frame.data[0] == 0x00 ){
+ json_object_dotset_string(root_object, "params.url", "Day");
+ } else {
+ json_object_dotset_string(root_object, "params.url", "Night");
+ }
+
+ serialized_string = json_serialize_to_string_pretty(root_value);
+ do_lws_write(web_socket, serialized_string, root_value);
+}
+
+/* registerComponent の送信関数定義[End] */
+
+static void send_BasicCommunication_OnStartDeviceDiscovery(struct lws* wsi){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d \n", __func__, __LINE__);
+ JSON_Value *root_value = json_value_init_object();
+ JSON_Object *root_object = json_value_get_object(root_value);
+ char *serialized_string = NULL;
+ json_object_set_string(root_object, "jsonrpc", "2.0");
+ json_object_set_string(root_object, "method", "BasicCommunication.OnStartDeviceDiscovery");
+ serialized_string = json_serialize_to_string_pretty(root_value);
+
+ do_lws_write(wsi, serialized_string, root_value);
+}
+
+/********************************************************************************************************************/
+/********************************************************************************************************************/
+/********************************************************************************************************************/
+/********************************************************************************************************************/
+// @tobi Websocket実装
+#define EXAMPLE_RX_BUFFER_BYTES (MAX_DATA_SIZE)
+
+static int callback_example( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len )
+{
+ //if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d reason=%d\n", __func__, __LINE__, reason);
+ switch( reason )
+ {
+ case LWS_CALLBACK_CLIENT_ESTABLISHED:
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_CLIENT_ESTABLISHED wsi=%p user=%p in=%p len=%ld\n", wsi, user, in, len);
+ send_registerComponent_VR(wsi);
+ break;
+
+ case LWS_CALLBACK_CLIENT_RECEIVE:
+ /* Handle incomming messages here. */
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_CLIENT_RECEIVE wsi=%p user=%p in=%p len=%ld \n", wsi, user, in, len);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_CLIENT_RECEIVE in=%s \n", in);
+#ifdef DEBUG_MODE
+ fp_received_datafile = fopen(RECEIVED_FILEPATH_LOGFILE,"a");
+ if( fp_received_datafile == NULL ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("fp_received_datafile open error");
+ return 0;
+ }
+ fwrite(in, len, 1, fp_received_datafile);
+ fclose(fp_received_datafile);
+#endif
+ receive_persistence(in, wsi);
+ break;
+
+ case LWS_CALLBACK_CLIENT_RECEIVE_PONG:
+ /* Handle incomming messages here. */
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_CLIENT_RECEIVE wsi=%p user=%p in=%p len=%ld\n", wsi, user, in, len);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_CLIENT_RECEIVE_PONG in=%s \n", in);
+ break;
+
+ case LWS_CALLBACK_RECEIVE:
+ /* Handle incomming messages here. */
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_RECEIVE wsi=%p user=%p in=%p len=%ld\n", wsi, user, in, len);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_RECEIVE in=%s \n", (char*)in);
+ break;
+
+ case LWS_CALLBACK_RECEIVE_CLIENT_HTTP:
+ /* Handle incomming messages here. */
+ break;
+
+ case LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ:
+ /* Handle incomming messages here. */
+ break;
+
+ case LWS_CALLBACK_CLIENT_WRITEABLE:
+ // @tobi
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_CLIENT_WRITEABLE wsi=%p user=%p in=%p len=%ld\n", wsi, user, in, len);
+ char* buf = NULL;
+ stack_pop(&buf);
+ if( buf == NULL ){
+ break;
+ }
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_CLIENT_WRITEABLE buf=%s \n", buf);
+#ifdef DEBUG_MODE
+ //ファイルを読み込みモードで開く
+ fp_sended_datafile = fopen(SENDED_FILEPATH_LOGFILE,"a");
+ if( fp_sended_datafile == NULL ){
+ if(DEBUG_LOG_ENABLE)lwsl_notice("fp_sended_datafile open error");
+ return 0;
+ }
+ fwrite(buf, strlen(buf), 1, fp_sended_datafile);
+ fputs("\n", fp_sended_datafile);
+ fclose(fp_sended_datafile);
+#endif
+ lws_write(wsi, buf, strlen(buf), g_protocol);
+ if( get_stack_size() != 0 ){
+ lws_callback_on_writable( wsi );
+ }
+
+ break;
+
+ case LWS_CALLBACK_CLOSED:
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_CLOSED wsi=%p user=%p in=%p len=%ld\n", wsi, user, in, len);
+ web_socket = NULL;
+ g_Navigation_result_ID = 0;
+ g_Navigation_result_increment = 0;
+ g_UI_result_ID = 0;
+ g_UI_result_increment = 0;
+ g_Buttons_result_ID = 0;
+ g_Buttons_result_increment = 0;
+ g_BasicCommunication_result_ID = 0;
+ g_BasicCommunication_result_increment = 0;
+ break;
+
+ case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
+ if(DEBUG_LOG_ENABLE)lwsl_notice("LWS_CALLBACK_CLIENT_CONNECTION_ERROR wsi=%p user=%p in=%p len=%ld\n", wsi, user, in, len);
+ web_socket = NULL;
+ g_Navigation_result_ID = 0;
+ g_Navigation_result_increment = 0;
+ g_UI_result_ID = 0;
+ g_UI_result_increment = 0;
+ g_Buttons_result_ID = 0;
+ g_Buttons_result_increment = 0;
+ g_BasicCommunication_result_ID = 0;
+ g_BasicCommunication_result_increment = 0;
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+enum protocols
+{
+ PROTOCOL_EXAMPLE = 0,
+ PROTOCOL_COUNT
+};
+
+static struct lws_protocols protocols[] =
+{
+ {
+ "example-protocol",
+ callback_example,
+ 0,
+ EXAMPLE_RX_BUFFER_BYTES,
+ },
+ { NULL, NULL, 0, 0 } /* terminator */
+};
+
+void *func_thread(void *p) {
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[Websocket][Start] pid=%d, tid=%ld [end] \n", __func__, __LINE__, getpid(), syscall(SYS_gettid));
+ struct lws_context_creation_info info;
+ memset( &info, 0, sizeof(info) );
+
+ info.port = CONTEXT_PORT_NO_LISTEN;
+ info.protocols = protocols;
+ info.gid = -1;
+ info.uid = -1;
+
+ struct lws_context *context = lws_create_context( &info );
+
+ while (running)
+ {
+ /* Connect if we are not connected to the server. */
+ if( !web_socket )
+ {
+ struct lws_client_connect_info ccinfo = {0};
+ ccinfo.context = context;
+ ccinfo.address = "localhost";
+ ccinfo.port = 8087;
+ ccinfo.path = "/";
+ ccinfo.host = lws_canonical_hostname( context );
+ ccinfo.origin = "origin";
+ ccinfo.protocol = protocols[PROTOCOL_EXAMPLE].name;
+ web_socket = lws_client_connect_via_info(&ccinfo);
+ }
+
+ /* Send a random number to the server every second. */
+ //lws_callback_on_writable( web_socket );
+ usleep(50000);
+ lws_service( context, /* timeout_ms = */ 1 );
+ }
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d[Websocket][End] pid=%d, tid=%ld [end] \n", __func__, __LINE__, getpid(), syscall(SYS_gettid));
+ lws_context_destroy( context );
+}
+
+void websocket_init()
+{
+ pthread_t pthread;
+ pthread_t pthread_can;
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d\n",__func__, __LINE__);
+
+ stack_init();
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d\n",__func__, __LINE__);
+#ifdef DEBUG_MODE
+ if( remove( SENDED_FILEPATH_LOGFILE ) == 0 ){
+ printf( "%sファイルを削除しました\n", SENDED_FILEPATH_LOGFILE );
+ }
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d\n",__func__, __LINE__);
+ if( remove( RECEIVED_FILEPATH_LOGFILE ) == 0 ){
+ printf( "%sファイルを削除しました\n", RECEIVED_FILEPATH_LOGFILE );
+ }
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d\n",__func__, __LINE__);
+#endif
+// 車両情報(ダミーデータ)には、不必要であるため.
+// pthread_create( &pthread_can, NULL, &can_thread, NULL);
+// printf("%s:%d\n",__func__, __LINE__);
+
+#if 1
+ pthread_create( &pthread, NULL, &func_thread, NULL);
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s:%d\n",__func__, __LINE__);
+#endif
+ if(DEBUG_LOG_ENABLE)lwsl_notice("%s main pid=%d, tid=%ld [end] \n", __func__, getpid(), syscall(SYS_gettid));
+
+
+ //while( 1 ){}
+}
+
+// touch_event
+void lws_touch_handle_down(uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w)
+{
+ if (id != 0) {
+ return;
+ }
+ //if(DEBUG_LOG_ENABLE)lwsl_notice("%s main pid=%d, tid=%ld [start] \n", __func__, getpid(), syscall(SYS_gettid));
+
+ // Message to convert: protocol 0; json {"jsonrpc":"2.0","method":"UI.OnTouchEvent","params":{"event":[{"c":[{"x":208,"y":139}],"id":0,"ts":[24022]}],"type":"BEGIN"}}
+ // {"jsonrpc":"2.0","method":"UI.OnTouchEvent","params":{"event":[{"c":[{"x":208,"y":139}],"id":0,"ts":[24022]}],"type":"BEGIN"}}
+ double cx = wl_fixed_to_double(x_w);
+ double cy = wl_fixed_to_double(y_w);
+// GST_ERROR ("tobi: %s: cx=%f cy=%f", __func__, cx, cy);
+
+ char buf[MAX_DATA_SIZE];
+ memset(buf, 0x00, sizeof(buf));
+
+ char* json_word_00 = "{\"jsonrpc\":\"2.0\",\"method\":\"UI.OnTouchEvent\",\"params\":{\"event\":[{\"c\":[{\"x\":";
+ char* json_word_01 = ",\"y\":";
+ char* json_word_02 = "}],\"id\":";
+ char* json_word_03 = ",\"ts\":[";
+ char* json_word_04 = "]}],\"type\":\"BEGIN\"";
+ snprintf(buf,MAX_DATA_SIZE,"%s%d%s%d%s%d%s%d%s}}\n", json_word_00, (int)cx, json_word_01, (int)cy, json_word_02, id, json_word_03, time, json_word_04);
+
+ lws_touch_info[id][0] = (int)cx;
+ lws_touch_info[id][1] = (int)cy;
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("lws_touch_handle_down buf=%s \n", buf);
+ lws_write( web_socket, buf, strlen(buf), LWS_WRITE_TEXT );
+
+// if(DEBUG_LOG_ENABLE)lwsl_notice("lws_touch_handle_down Complete \n");
+}
+
+void lws_touch_handle_up(uint32_t time, int32_t id)
+{
+ if (id != 0) {
+ return;
+ }
+ //if(DEBUG_LOG_ENABLE)lwsl_notice("%s main pid=%d, tid=%ld [start] \n", __func__, getpid(), syscall(SYS_gettid));
+
+ // Message to convert: protocol 0; json {"jsonrpc":"2.0","method":"UI.OnTouchEvent","params":{"event":[{"c":[{"x":208,"y":139}],"id":0,"ts":[24093]}],"type":"END"}}
+ // {"jsonrpc":"2.0","method":"UI.OnTouchEvent","params":{"event":[{"c":[{"x":208,"y":139}],"id":0,"ts":[24093]}],"type":"END"}}
+ char buf[MAX_DATA_SIZE];
+ memset(buf, 0x00, sizeof(buf));
+
+ char* json_word_00 = "{\"jsonrpc\":\"2.0\",\"method\":\"UI.OnTouchEvent\",\"params\":{\"event\":[{\"c\":[{\"x\":";
+ char* json_word_01 = ",\"y\":";
+ char* json_word_02 = "}],\"id\":";
+ char* json_word_03 = ",\"ts\":[";
+ char* json_word_04 = "]}],\"type\":\"END\"";
+ snprintf(buf,MAX_DATA_SIZE,"%s%d%s%d%s%d%s%d%s}}\n", json_word_00, lws_touch_info[id][0], json_word_01, lws_touch_info[id][1], json_word_02, id, json_word_03, time, json_word_04);
+
+ lws_touch_info[id][0] = 0;
+ lws_touch_info[id][1] = 0;
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("lws_touch_handle_up buf=%s \n", buf);
+ lws_write( web_socket, buf, strlen(buf), LWS_WRITE_TEXT );
+
+// if(DEBUG_LOG_ENABLE)lwsl_notice("lws_touch_handle_up Complete \n");
+}
+
+void lws_touch_handle_motion(uint32_t time, int32_t id, wl_fixed_t x_w, wl_fixed_t y_w)
+{
+ if (id != 0) {
+ return;
+ }
+ //if(DEBUG_LOG_ENABLE)lwsl_notice("%s main pid=%d, tid=%ld [start] \n", __func__, getpid(), syscall(SYS_gettid));
+
+ // Message to convert: protocol 0; json {"jsonrpc":"2.0","method":"UI.OnTouchEvent","params":{"event":[{"c":[{"x":208,"y":139}],"id":0,"ts":[24053]}],"type":"MOVE"}}
+ // {"jsonrpc":"2.0","method":"UI.OnTouchEvent","params":{"event":[{"c":[{"x":208,"y":139}],"id":0,"ts":[24053]}],"type":"MOVE"}}
+ double cx = wl_fixed_to_double(x_w);
+ double cy = wl_fixed_to_double(y_w);
+// GST_ERROR ("tobi: %s: cx=%f cy=%f", __func__, cx, cy);
+
+ char buf[MAX_DATA_SIZE];
+ memset(buf, 0x00, sizeof(buf));
+
+ char* json_word_00 = "{\"jsonrpc\":\"2.0\",\"method\":\"UI.OnTouchEvent\",\"params\":{\"event\":[{\"c\":[{\"x\":";
+ char* json_word_01 = ",\"y\":";
+ char* json_word_02 = "}],\"id\":";
+ char* json_word_03 = ",\"ts\":[";
+ char* json_word_04 = "]}],\"type\":\"MOVE\"";
+ snprintf(buf,MAX_DATA_SIZE,"%s%d%s%d%s%d%s%d%s}}\n", json_word_00, (int)cx, json_word_01, (int)cy, json_word_02, id, json_word_03, time, json_word_04);
+
+ lws_touch_info[id][0] = (int)cx;
+ lws_touch_info[id][1] = (int)cy;
+
+ if(DEBUG_LOG_ENABLE)lwsl_notice("lws_touch_handle_motion buf=%s \n", buf);
+ lws_write( web_socket, buf, strlen(buf), LWS_WRITE_TEXT );
+
+// if(DEBUG_LOG_ENABLE)lwsl_notice("lws_touch_handle_motion Complete \n");
+}