From 311d8f14ceec5b57066228f7ada4483cc4598c80 Mon Sep 17 00:00:00 2001 From: srimaldia Date: Fri, 9 Dec 2016 20:05:35 +0900 Subject: [PATCH] add standalone wifi app Signed-off-by: srimaldia --- AUTHORS.txt | 2 + CMakeLists.txt | 68 +++ LICENSE-2.0.txt | 201 +++++++ README.txt | 34 ++ agent.c | 262 +++++++++ config.xml.in | 9 + doc/AppGrid.qml | 43 ++ doc/AppIcon.qml | 51 ++ doc/BottomBar.qml | 65 +++ doc/GridItem.qml | 45 ++ doc/Key.qml | 85 +++ doc/Keyboard.qml | 137 +++++ doc/Main.qml | 101 ++++ doc/README.md | 23 + doc/Rotated.qml | 17 + doc/Scaled.qml | 17 + doc/Scaled_04.qml | 17 + doc/Scaled_720p.qml | 17 + doc/TopBar.qml | 146 +++++ doc/VolumeControl.qml | 97 ++++ doc/images/AGL-Logo.png | Bin 0 -> 20091 bytes doc/images/AppHex.png | Bin 0 -> 9827 bytes doc/images/Hex-Background.jpg | Bin 0 -> 119534 bytes doc/images/JLR-Logo.png | Bin 0 -> 35509 bytes doc/images/agl_icon.png | Bin 0 -> 25190 bytes doc/images/application_grid.png | Bin 0 -> 5427 bytes doc/images/backspace_icon.png | Bin 0 -> 640 bytes doc/images/blank_hexagon.png | Bin 0 -> 5405 bytes doc/images/browser_app_icon.png | Bin 0 -> 5474 bytes doc/images/browser_app_icon.svg | 100 ++++ doc/images/bt_close.png | Bin 0 -> 1215 bytes doc/images/cameras_app_icon.png | Bin 0 -> 4408 bytes doc/images/cameras_app_icon.svg | 82 +++ doc/images/dashboard_app_icon.png | Bin 0 -> 5530 bytes doc/images/dashboard_app_icon.svg | 130 +++++ doc/images/fingerprint_app_icon.png | Bin 0 -> 5919 bytes doc/images/fmradio_app_icon.png | Bin 0 -> 3732 bytes doc/images/fmradio_app_icon.svg | 110 ++++ doc/images/googlemaps_app_icon.png | Bin 0 -> 3508 bytes doc/images/googlemaps_app_icon.svg | 86 +++ doc/images/homescreen_icon.png | Bin 0 -> 4606 bytes doc/images/hvac_app_icon.png | Bin 0 -> 4236 bytes doc/images/hvac_app_icon.svg | 101 ++++ doc/images/icon_apps_blue.png | Bin 0 -> 6342 bytes doc/images/icongear.png | Bin 0 -> 10833 bytes doc/images/media_player_app_icon.png | Bin 0 -> 4347 bytes doc/images/media_player_app_icon.svg | 97 ++++ doc/images/news_app_icon.png | Bin 0 -> 2428 bytes doc/images/news_app_icon.svg | 57 ++ doc/images/nfc_app_icon.png | Bin 0 -> 3933 bytes doc/images/nfc_app_icon.svg | 94 ++++ doc/images/phone_app_icon.png | Bin 0 -> 4335 bytes doc/images/phone_app_icon.svg | 108 ++++ doc/images/settings_icon.png | Bin 0 -> 6528 bytes doc/images/shift_off_icon.png | Bin 0 -> 825 bytes doc/images/shift_on_icon.png | Bin 0 -> 710 bytes doc/images/space_bar_icon.png | Bin 0 -> 302 bytes doc/images/switchcontrol.png | Bin 0 -> 2269 bytes doc/images/switchplate_off.png | Bin 0 -> 5071 bytes doc/images/switchplate_on.png | Bin 0 -> 4824 bytes doc/images/symbols_icon.png | Bin 0 -> 1373 bytes doc/images/symbols_off_icon.png | Bin 0 -> 1500 bytes doc/images/tizen.png | Bin 0 -> 4391 bytes doc/images/weather_app_icon.png | Bin 0 -> 4615 bytes doc/images/weather_app_icon.svg | 115 ++++ doc/images/white_return.png | Bin 0 -> 728 bytes export.map | 1 + icon_wifi_128.png | Bin 0 -> 18162 bytes imports/components/AwesomeIcon.qml | 26 + imports/components/Box.qml | 49 ++ imports/components/BoxButton.qml | 36 ++ imports/components/BoxHeading.qml | 37 ++ imports/components/Button.qml | 30 + imports/components/DateTime.qml | 35 ++ imports/components/HexGrid.qml | 32 ++ imports/components/HexSwitch.qml | 80 +++ imports/components/InShadow.qml | 33 ++ imports/components/InsetShadow.qml | 40 ++ imports/components/Label.qml | 27 + imports/components/NumberPad.qml | 101 ++++ imports/components/OutShadow.qml | 41 ++ imports/components/Switch.qml | 13 + imports/components/qmldir | 16 + imports/radio/Radio.qml | 6 + imports/radio/qmldir | 2 + imports/system/App.qml | 29 + imports/system/System.qml | 15 + imports/system/qmldir | 8 + imports/utils/Marker.qml | 60 ++ imports/utils/Style.qml | 37 ++ imports/utils/qmldir | 8 + imports/vehicle/ClimateModel.qml | 44 ++ imports/vehicle/FuelModel.qml | 46 ++ imports/vehicle/PositionModel.qml | 33 ++ imports/vehicle/SpeedModel.qml | 38 ++ imports/vehicle/TemperatureModel.qml | 26 + imports/vehicle/qmldir | 11 + oe-sdk_crosscompile.cmake | 20 + qml/wifi-settings/components/images/back.png | Bin 0 -> 1237 bytes qml/wifi-settings/components/images/wifi1-lock.png | Bin 0 -> 6083 bytes qml/wifi-settings/components/images/wifi1.png | Bin 0 -> 4934 bytes qml/wifi-settings/components/images/wifi2-lock.png | Bin 0 -> 6270 bytes qml/wifi-settings/components/images/wifi2.png | Bin 0 -> 5106 bytes qml/wifi-settings/components/images/wifi3-lock.png | Bin 0 -> 6204 bytes qml/wifi-settings/components/images/wifi3.png | Bin 0 -> 5125 bytes qml/wifi-settings/components/images/wifi4-lock.png | Bin 0 -> 5753 bytes qml/wifi-settings/components/images/wifi4.png | Bin 0 -> 4622 bytes qml/wifi-settings/wifi-settings-app.qml | 625 +++++++++++++++++++++ wifi-api.c | 489 ++++++++++++++++ wifi-api.h | 38 ++ wifi-connman.c | 354 ++++++++++++ wifi-connman.h | 126 +++++ 112 files changed, 5129 insertions(+) create mode 100755 AUTHORS.txt create mode 100755 CMakeLists.txt create mode 100755 LICENSE-2.0.txt create mode 100755 README.txt create mode 100755 agent.c create mode 100755 config.xml.in create mode 100755 doc/AppGrid.qml create mode 100755 doc/AppIcon.qml create mode 100755 doc/BottomBar.qml create mode 100755 doc/GridItem.qml create mode 100755 doc/Key.qml create mode 100755 doc/Keyboard.qml create mode 100755 doc/Main.qml create mode 100755 doc/README.md create mode 100755 doc/Rotated.qml create mode 100755 doc/Scaled.qml create mode 100755 doc/Scaled_04.qml create mode 100755 doc/Scaled_720p.qml create mode 100755 doc/TopBar.qml create mode 100755 doc/VolumeControl.qml create mode 100755 doc/images/AGL-Logo.png create mode 100755 doc/images/AppHex.png create mode 100755 doc/images/Hex-Background.jpg create mode 100755 doc/images/JLR-Logo.png create mode 100755 doc/images/agl_icon.png create mode 100755 doc/images/application_grid.png create mode 100755 doc/images/backspace_icon.png create mode 100755 doc/images/blank_hexagon.png create mode 100755 doc/images/browser_app_icon.png create mode 100755 doc/images/browser_app_icon.svg create mode 100755 doc/images/bt_close.png create mode 100755 doc/images/cameras_app_icon.png create mode 100755 doc/images/cameras_app_icon.svg create mode 100755 doc/images/dashboard_app_icon.png create mode 100755 doc/images/dashboard_app_icon.svg create mode 100755 doc/images/fingerprint_app_icon.png create mode 100755 doc/images/fmradio_app_icon.png create mode 100755 doc/images/fmradio_app_icon.svg create mode 100755 doc/images/googlemaps_app_icon.png create mode 100755 doc/images/googlemaps_app_icon.svg create mode 100755 doc/images/homescreen_icon.png create mode 100755 doc/images/hvac_app_icon.png create mode 100755 doc/images/hvac_app_icon.svg create mode 100755 doc/images/icon_apps_blue.png create mode 100755 doc/images/icongear.png create mode 100755 doc/images/media_player_app_icon.png create mode 100755 doc/images/media_player_app_icon.svg create mode 100755 doc/images/news_app_icon.png create mode 100755 doc/images/news_app_icon.svg create mode 100755 doc/images/nfc_app_icon.png create mode 100755 doc/images/nfc_app_icon.svg create mode 100755 doc/images/phone_app_icon.png create mode 100755 doc/images/phone_app_icon.svg create mode 100755 doc/images/settings_icon.png create mode 100755 doc/images/shift_off_icon.png create mode 100755 doc/images/shift_on_icon.png create mode 100755 doc/images/space_bar_icon.png create mode 100755 doc/images/switchcontrol.png create mode 100755 doc/images/switchplate_off.png create mode 100755 doc/images/switchplate_on.png create mode 100755 doc/images/symbols_icon.png create mode 100755 doc/images/symbols_off_icon.png create mode 100755 doc/images/tizen.png create mode 100755 doc/images/weather_app_icon.png create mode 100755 doc/images/weather_app_icon.svg create mode 100755 doc/images/white_return.png create mode 100755 export.map create mode 100755 icon_wifi_128.png create mode 100755 imports/components/AwesomeIcon.qml create mode 100755 imports/components/Box.qml create mode 100755 imports/components/BoxButton.qml create mode 100755 imports/components/BoxHeading.qml create mode 100755 imports/components/Button.qml create mode 100755 imports/components/DateTime.qml create mode 100755 imports/components/HexGrid.qml create mode 100755 imports/components/HexSwitch.qml create mode 100755 imports/components/InShadow.qml create mode 100755 imports/components/InsetShadow.qml create mode 100755 imports/components/Label.qml create mode 100755 imports/components/NumberPad.qml create mode 100755 imports/components/OutShadow.qml create mode 100755 imports/components/Switch.qml create mode 100755 imports/components/qmldir create mode 100755 imports/radio/Radio.qml create mode 100755 imports/radio/qmldir create mode 100755 imports/system/App.qml create mode 100755 imports/system/System.qml create mode 100755 imports/system/qmldir create mode 100755 imports/utils/Marker.qml create mode 100755 imports/utils/Style.qml create mode 100755 imports/utils/qmldir create mode 100755 imports/vehicle/ClimateModel.qml create mode 100755 imports/vehicle/FuelModel.qml create mode 100755 imports/vehicle/PositionModel.qml create mode 100755 imports/vehicle/SpeedModel.qml create mode 100755 imports/vehicle/TemperatureModel.qml create mode 100755 imports/vehicle/qmldir create mode 100755 oe-sdk_crosscompile.cmake create mode 100755 qml/wifi-settings/components/images/back.png create mode 100755 qml/wifi-settings/components/images/wifi1-lock.png create mode 100755 qml/wifi-settings/components/images/wifi1.png create mode 100755 qml/wifi-settings/components/images/wifi2-lock.png create mode 100755 qml/wifi-settings/components/images/wifi2.png create mode 100755 qml/wifi-settings/components/images/wifi3-lock.png create mode 100755 qml/wifi-settings/components/images/wifi3.png create mode 100755 qml/wifi-settings/components/images/wifi4-lock.png create mode 100755 qml/wifi-settings/components/images/wifi4.png create mode 100755 qml/wifi-settings/wifi-settings-app.qml create mode 100755 wifi-api.c create mode 100755 wifi-api.h create mode 100755 wifi-connman.c create mode 100755 wifi-connman.h diff --git a/AUTHORS.txt b/AUTHORS.txt new file mode 100755 index 0000000..cd526f9 --- /dev/null +++ b/AUTHORS.txt @@ -0,0 +1,2 @@ +Milan Srdinko +Sri Maldia Hari Asti \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..bbf3df8 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,68 @@ +project(wifi-settings) + +cmake_minimum_required(VERSION 3.3) + +include(GNUInstallDirs) + +set(PROJECT_VERSION "0.1") +set(PROJECT_ICON "icon_wifi_128.png") +set(PROJECT_LIBDIR "lib") +set(PROJECT_QML "qml") +set(PROJECT_IMPORT "imports") +set(PROJECT_DOC "doc") + +set(CMAKE_BUILD_TYPE Debug) + +########################################################################### +add_compile_options(-Wall -Wextra -Wconversion) +add_compile_options(-Wno-unused-parameter) # frankly not using a parameter does it care? +add_compile_options(-Werror=maybe-uninitialized) +add_compile_options(-Werror=implicit-function-declaration) +add_compile_options(-ffunction-sections -fdata-sections) +add_compile_options(-Wl,--as-needed -Wl,--gc-sections) +add_compile_options(-fPIC) + +set(CMAKE_C_FLAGS_PROFILING "-g -O0 -pg -Wp,-U_FORTIFY_SOURCE") +set(CMAKE_C_FLAGS_DEBUG "-g -O0 -ggdb -Wp,-U_FORTIFY_SOURCE") +set(CMAKE_C_FLAGS_RELEASE "-g -O2") +set(CMAKE_C_FLAGS_CCOV "-g -O2 --coverage") + +########################################################################### + +include(FindPkgConfig) + +pkg_check_modules(EXTRAS REQUIRED json-c afb-daemon glib-2.0 gio-2.0 gobject-2.0 zlib) +add_compile_options(${EXTRAS_CFLAGS}) +include_directories(${EXTRAS_INCLUDE_DIRS}) +link_libraries(${EXTRAS_LIBRARIES}) + +########################################################################### +# the binding for afb + +message(STATUS "Creation of ${PROJECT_NAME} for AFB-DAEMON") + +############################################################### +add_library(${PROJECT_NAME} MODULE wifi-api.c wifi-connman.c agent.c) + +set_target_properties(${PROJECT_NAME} PROPERTIES + PREFIX "" + LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/export.map" +) + +configure_file(config.xml.in config.xml) + +add_custom_command( + OUTPUT ${PROJECT_NAME}.wgt + DEPENDS ${PROJECT_NAME} + COMMAND rm -rf package + COMMAND mkdir -p package/${PROJECT_LIBDIR} package/htdocs + COMMAND cp config.xml package/ + COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_ICON} package/icon.png + COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_QML} package/${PROJECT_QML} + COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_IMPORT} package/${PROJECT_IMPORT} + COMMAND cp -rf ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_DOC} package/${PROJECT_DOC} + COMMAND cp ${PROJECT_NAME}.so package/${PROJECT_LIBDIR} + COMMAND wgtpkg-pack -f -o ${PROJECT_NAME}.wgt package + COMMAND rm -rf package +) +add_custom_target(widget ALL DEPENDS ${PROJECT_NAME}.wgt) diff --git a/LICENSE-2.0.txt b/LICENSE-2.0.txt new file mode 100755 index 0000000..a396b36 --- /dev/null +++ b/LICENSE-2.0.txt @@ -0,0 +1,201 @@ + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. \ No newline at end of file diff --git a/README.txt b/README.txt new file mode 100755 index 0000000..8565b5a --- /dev/null +++ b/README.txt @@ -0,0 +1,34 @@ +##Wifi Manager +This folder include wifi manager binding and GUI. +Only support Station mode. + +##Function +- Wifi ON and OFF +- Wifi scan and display result +- Connect to open and secured AccessPoint +- Disconnect connection + +##Guidance for building Wi-Fi manager Binding +A. Prepare sdk environment + - bitbake below: + $ bitbake agl-demo-platform-crosssdk + - install sdk + $ build/tmp/deploy/sdk/poky-agl-glibc*.sh +B. Build + - Go to folder where WiFi Bindings source code exists + - run below command for setup and make + $ . /opt/poky-agl/xxx/environment-setup-cortexa15hf-vfp-neon-poky-linux-gnueabi + $ mkdir build + $ cmake .. + $ make + +C. Running app + - copy widget to porter board + - do install and start the app + # afm-util install *.wgt + # afm-util start @0.1 + +##TODO +- ADD token security +- ADD event receive + diff --git a/agent.c b/agent.c new file mode 100755 index 0000000..a22dc31 --- /dev/null +++ b/agent.c @@ -0,0 +1,262 @@ +/* Copyright 2016 ALPS ELECTRIC CO., LTD. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include +#include + +#include +#include "wifi-connman.h" + +static GMainLoop *loop = NULL; + +static GDBusNodeInfo *introspection_data = NULL; + +GDBusMethodInvocation *invocation_passkey = NULL; + +/* Introspection data for the agent service */ +static const gchar introspection_xml[] = "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + +callback password_callback; + +static void handle_method_call(GDBusConnection *connection, const gchar *sender, + const gchar *object_path, const gchar *interface_name, + const gchar *method_name, GVariant *parameters, + GDBusMethodInvocation *invocation, gpointer user_data) { + //MyObject *myobj = user_data; + + if (g_strcmp0(method_name, "RequestInput") == 0) { + printf("Input requested\n"); + + invocation_passkey = invocation; + + //TODO: send the name of the network to callback + + (*password_callback)(0); + + GVariantIter *array; + gchar * object_path; + g_variant_get(parameters, "(oa{sv})", &object_path, &array); + //TODO: get only object path for now, complete parameters are + + /* + object path "/net/connman/service/wifi_d85d4c880b1a_4c656e6f766f204b3520506c7573_managed_psk" + array [ + dict entry( + string "Passphrase" + variant array [ + dict entry( + string "Type" + variant string "psk" + ) + dict entry( + string "Requirement" + variant string "mandatory" + ) + ] + ) + ] + */ + printf("Passphrase requested for network : %s\n", object_path); + + } + + if (g_strcmp0(method_name, "ReportError") == 0) { + printf("Error reported\n"); + + gchar *error_string; // = NULL; + + gchar * object_path; + g_variant_get(parameters, "(os)", &object_path, &error_string); + + printf("Error %s for %s\n", error_string, object_path); + + if (g_strcmp0(error_string, "invalid-key") == 0) { + + printf("Passkey is not correct.\n"); + (*password_callback)(1); + + } + + } +} + +GError* sendPasskey(gchar *passkey) { + + GVariantBuilder *builder; + GVariant *value = NULL; + + printf("Passkey to send: %s\n", passkey); + + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); + + g_variant_builder_add(builder, "{sv}", "Passphrase", + g_variant_new_string(passkey)); + + value = g_variant_new("(a{sv})", builder); + + g_dbus_method_invocation_return_value(invocation_passkey, value); + + return NULL; + +} + +static const GDBusInterfaceVTable interface_vtable = { handle_method_call, NULL, + NULL }; + +static void on_bus_acquired(GDBusConnection *connection, const gchar *name, + gpointer user_data) { + //MyObject *myobj = user_data; + guint registration_id; + + registration_id = g_dbus_connection_register_object(connection, + "/net/connman/Agent", introspection_data->interfaces[0], + &interface_vtable, NULL, NULL, /* user_data_free_func */ + NULL); /* GError** */ + //TODO: make some proper error message rather than exiting + //g_assert(registration_id > 0); + + return NULL; +} + +void* register_agent(void *data) { + + //printf("Loop start\n"); + + guint owner_id; + //MyObject *myobj; + + introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); + g_assert(introspection_data != NULL); + + //myobj = g_object_new(my_object_get_type(), NULL); + +// owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, "org.agent", +// G_BUS_NAME_OWNER_FLAGS_NONE, on_bus_acquired, on_name_acquired, +// on_name_lost, myobj, +// NULL); + +//FIXME: ALLOW_REPLACEMENT for now, make proper deinitialization + owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, AGENT_SERVICE, + G_BUS_NAME_OWNER_FLAGS_REPLACE, on_bus_acquired, NULL, NULL, NULL, + NULL); + //G_BUS_NAME_OWNER_FLAGS_NONE G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT + + loop = g_main_loop_new(NULL, FALSE); + + //sleep(10); + g_main_loop_run(loop); + + printf("Loop running\n"); + + g_bus_unown_name(owner_id); + + g_dbus_node_info_unref(introspection_data); + + //g_object_unref(myobj); + + //printf("Loop end\n"); + + return NULL; + +} + +GError* create_agent(GDBusConnection *connection) { + + int err = -1; + pthread_t tid[1]; + + //struct callbackData *threadData; + + err = pthread_create((&tid[0]), NULL, register_agent, NULL); + + if (err != 0) { + printf("\ncan't create thread :[%d]", err); + printf("Fatal error!\n\n"); + return NULL; + } + + GVariant *message = NULL; + GError *error = NULL; + + GVariant *params = NULL; + + char *agent_path = AGENT_PATH; + + params = g_variant_new("(o)", agent_path); + + message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE, + CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, "RegisterAgent", params, + NULL, G_DBUS_CALL_FLAGS_NONE, + DBUS_REPLY_TIMEOUT, NULL, &error); + + if (error) { + printf("error: %d:%s\n", error->code, error->message); + + return error; + + } else { + printf("Agent registered\n"); + return NULL; + } + +} + +GError* stop_agent(GDBusConnection *connection) { + + GVariant *message = NULL; + GError *error = NULL; + + + GVariant *params = NULL; + + char *agent_path = AGENT_PATH; + + + params = g_variant_new("(o)", agent_path); + + message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE, + CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, "UnregisterAgent", params, + NULL, G_DBUS_CALL_FLAGS_NONE, + DBUS_REPLY_TIMEOUT, NULL, &error); + + if (error) { + printf("error: %d:%s\n", error->code, error->message); + return error; + + } else { + printf("Agent unregistered\n"); + return NULL; + } + +} + +void register_callback(callback callback_function) { + + password_callback = callback_function; + +} + diff --git a/config.xml.in b/config.xml.in new file mode 100755 index 0000000..b403953 --- /dev/null +++ b/config.xml.in @@ -0,0 +1,9 @@ + + + Wifi Settings + + + Wifi Settings application + ALPS (Milan Srdinko <msrdinko@alps.cz>, Srimaldia Hariasti <hariasti.srimaldia-1@jp.alps.com>) + APL 2.0 + diff --git a/doc/AppGrid.qml b/doc/AppGrid.qml new file mode 100755 index 0000000..46b7889 --- /dev/null +++ b/doc/AppGrid.qml @@ -0,0 +1,43 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import components 1.0 +import system 1.0 + +App { + id: root + appId: 'appgrid' + + HexGrid { + anchors.centerIn: parent + columns: 5 + spacing: 10 + + Repeater { + model: ListModel { + ListElement { icon: "hvac"; name: "HVAC" } + ListElement { icon: "browser"; name: "DNA Browser" } + ListElement { icon: "dashboard"; name: "Dashboard" } + ListElement { icon: "googlemaps"; name: "Google Maps" } + ListElement { icon: "news"; name: "News" } + ListElement { icon: "nfc"; name: "NFC" } + ListElement { icon: "fmradio"; name: "FM Radio" } + ListElement { icon: "phone"; name: "Phone" } + ListElement { icon: "weather"; name: "Weather" } + ListElement { icon: "media_player"; name: "Media Manager" } + ListElement { icon: "cameras"; name: "Cameras" } + ListElement { icon: "fingerprint"; name: "Fingerprint" } + ListElement { icon: "wayland"; name: "Wayland" } + } + delegate: GridItem { + name: model.name + icon: model.icon + onClicked: System.activeApp = model.icon + } + } + } +} diff --git a/doc/AppIcon.qml b/doc/AppIcon.qml new file mode 100755 index 0000000..b645ed9 --- /dev/null +++ b/doc/AppIcon.qml @@ -0,0 +1,51 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +MouseArea { + id: root + + width: 90 + height: 90 + + property bool active: false + property alias source: icon.source + + function click() { + clicked(undefined) + } + + Image { + id: icon + anchors.centerIn: parent + width: 100 + height: 100 + fillMode: Image.PreserveAspectFit + } + +// states: [ +// State { +// name: "focused" +// when: root.active +// PropertyChanges { +// target: icon +// scale: 2.0 +// anchors.verticalCenterOffset: 20 +// } +// } +// ] + +// transitions: [ +// Transition { +// NumberAnimation { +// properties: 'scale, anchors.verticalCenterOffset' +// easing.type: Easing.OutElastic +// duration: 500 +// } +// } +// ] +} diff --git a/doc/BottomBar.qml b/doc/BottomBar.qml new file mode 100755 index 0000000..0760b71 --- /dev/null +++ b/doc/BottomBar.qml @@ -0,0 +1,65 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import system 1.0 +//import com.pelagicore.qmldevinfo 0.1 + +Item { + height: 120 + + ShaderEffect { + anchors.fill: parent + property color color: "#777" + property real radius: 40 + opacity: 0.24 + + fragmentShader: " +uniform lowp float radius; +uniform lowp float height; +uniform lowp float width; +uniform lowp float qt_Opacity; +uniform lowp vec4 color; +varying highp vec2 qt_TexCoord0; + +void main(void) { + lowp vec2 dist = min(qt_TexCoord0, vec2(1.0) - qt_TexCoord0); + lowp float xval = smoothstep(0.0, radius, dist.x * width); + lowp float yval = smoothstep(0.0, radius, dist.y * height); + gl_FragColor = mix(color, vec4(1.0), sqrt(yval * xval)) * qt_Opacity; +} + " + } + + Image { + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + source: "images/settings_icon.png" + + MouseArea { + anchors.fill: parent + onClicked: System.showSettings = !System.showSettings + } + } + +// DevInfo { +// id: devinfo +// } + + Image { + anchors.centerIn: parent + anchors.horizontalCenterOffset: -15 + source: "images/AGL-Logo.png" + height: 80 + fillMode: Image.PreserveAspectFit + } + + VolumeControl { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: 40 + } +} diff --git a/doc/GridItem.qml b/doc/GridItem.qml new file mode 100755 index 0000000..93d3031 --- /dev/null +++ b/doc/GridItem.qml @@ -0,0 +1,45 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +Item { + id: root + + width: background.width + height: background.height + + property string name + property string icon + + signal clicked() + + Image { + id: background + source: "images/AppHex.png" + } + + Column { + y: 10 + anchors.horizontalCenter: parent.horizontalCenter + spacing: -10 + + AppIcon { + source: "images/%1_app_icon.png".arg(root.icon) + } + + Text { + anchors.horizontalCenter: parent.horizontalCenter + color: "white" + text: root.name + } + } + + MouseArea { + anchors.fill: parent + onClicked: root.clicked() + } +} diff --git a/doc/Key.qml b/doc/Key.qml new file mode 100755 index 0000000..6eb5ae0 --- /dev/null +++ b/doc/Key.qml @@ -0,0 +1,85 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import QtGraphicalEffects 1.0 +import utils 1.0 + +Item { + id: root + + width: 90 + height: 130 + + property color color: Style.orangeViv + property alias text: textItem.text + property alias symbol: symbolItem.text + property real fade: 0.16 + property string icon: "" + + signal clicked() + + Rectangle { + id: keyRect + anchors.fill: parent + radius: 10 + } + + LinearGradient { + anchors.fill: parent + source: keyRect + start: Qt.point(0, 0) + end: Qt.point(0, 130) + gradient: Gradient { + GradientStop { position: 0.0; color: root.color } + GradientStop { position: root.fade; color: Qt.darker(root.color, 2.0) } + GradientStop { position: 0.8; color: "black" } + } + } + + Rectangle { + anchors.fill: parent + color: "transparent" + radius: 10 + border.width: 4 + border.color: Style.orangeLt + + Text { + id: symbolItem + visible: icon === "" + anchors.top: parent.top + anchors.right: parent.right + anchors.topMargin: 15 + anchors.rightMargin: 20 + font.pixelSize: 28 + font.family: "Source Sans Pro" + color: "white" + } + + Text { + id: textItem + visible: icon === "" + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + anchors.bottomMargin: 10 + font.pixelSize: 60 + font.family: "Source Sans Pro" + color: "white" + } + + Image { + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + anchors.bottomMargin: 30 + source: icon === "" ? icon : "images/" + icon + ".png" + } + } + + MouseArea { + anchors.fill: parent + onClicked: root.clicked() + } +} diff --git a/doc/Keyboard.qml b/doc/Keyboard.qml new file mode 100755 index 0000000..be79b75 --- /dev/null +++ b/doc/Keyboard.qml @@ -0,0 +1,137 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import utils 1.0 + +Item { + id: root + height: 620 + + property var currentString: "" + property bool useSymbols: false + property bool useUppercase: false + + property var rows: [ + ["q","w","e","r","t","y","u","i","o","p"], + ["a","s","d","f","g","h","j","k","l"], + ["z","x","c","v","b","n","m"] + ] + property var symbolRows: [ + ["1","2","3","4","5","6","7","8","9","0"], + ["(",")","-","@","*","^",":",";","~"], + ["/","'","\"",".",",","?","!"] + ] + + function keyPressed(text, symbol) { + if (useSymbols) + currentString += symbol + else + currentString += text + } + + Rectangle { + anchors.fill: parent + color: "black" + opacity: 0.7 + } + + Column { + y: 20 + width: parent.width + spacing: 20 + + Row { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 10 + + Repeater { + model: rows[0] + Key { + text: useUppercase ? modelData.toUpperCase() : modelData + symbol: symbolRows[0][index] + onClicked: keyPressed(text, symbol) + } + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 10 + + Repeater { + model: rows[1] + Key { + text: useUppercase ? modelData.toUpperCase() : modelData + symbol: symbolRows[1][index] + onClicked: keyPressed(text, symbol) + } + } + } + + Row { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 45 + + Key { + width: 130 + color: Style.orangeLt + fade: 0.3 + icon: "shift_" + (useUppercase ? "on" : "off") + "_icon" + onClicked: useUppercase = !useUppercase + } + + Row { + spacing: 10 + + Repeater { + model: rows[2] + Key { + text: useUppercase ? modelData.toUpperCase() : modelData + symbol: symbolRows[2][index] + onClicked: keyPressed(text, symbol) + } + } + } + + Key { + width: 130 + color: Style.orangeLt + fade: 0.3 + icon: "backspace_icon" + onClicked: currentString = currentString.slice(0, -1) + } + } + + Row { + spacing: 20 + anchors.horizontalCenter: parent.horizontalCenter + + Key { + width: 150 + color: Style.orangeLt + fade: 0.3 + icon: "symbols" + (useSymbols ? "" : "_off") + "_icon" + onClicked: useSymbols = !useSymbols + } + + Key { + width: 700 + color: Style.orangeLt + fade: 0.3 + icon: "space_bar_icon" + onClicked: keyPressed(" ", " ") + } + + Key { + width: 150 + color: Style.orangeLt + fade: 0.3 + icon: "white_return" + } + } + } +} diff --git a/doc/Main.qml b/doc/Main.qml new file mode 100755 index 0000000..8f92511 --- /dev/null +++ b/doc/Main.qml @@ -0,0 +1,101 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.3 +import "apps/Browser" +import "apps/Cameras" +import "apps/Dashboard" +import "apps/Fingerprint" +import "apps/FMRadio" +import "apps/GoogleMaps" +import "apps/Home" +import "apps/HVAC" +import "apps/MediaPlayer" +import "apps/News" +import "apps/NFC" +import "apps/Phone" +import "apps/Settings" +import "apps/Weather" +import "apps/WaylandView" +import system 1.0 + +Item { + width: 1080 + height: 1920 + + Image { + anchors.centerIn: parent + source: "images/Hex-Background.jpg" + } + + Item { + id: appSurface + + anchors.top: topbar.bottom + anchors.bottom: bottombar.top + anchors.left: parent.left + anchors.right: parent.right + + + Home {} + GoogleMaps {} + Browser {} + Dashboard {} + HVAC {} + Weather {} + FMRadio {} + MediaPlayer {} + NFC {} + News {} + Phone {} + WaylandView {} + Cameras {} + Fingerprint {} + AppGrid {} + } + + TopBar { + id: topbar + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + } + + BottomBar { + id: bottombar + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + } + + Settings { + id: settings + visible: System.showSettings + anchors.fill: parent + anchors.topMargin: 120 + anchors.bottomMargin: 120 + } + + Keyboard { + id: keyboard + y: System.showKeyboard ? parent.height - height : parent.height + width: parent.width + + Behavior on y { YAnimator { duration: 300; easing.type: Easing.OutQuad }} + } + + focus: true + Keys.onLeftPressed: topbar.left() + Keys.onRightPressed: topbar.right() + Keys.onReturnPressed: topbar.click() + Keys.onBackPressed: topbar.home() + Keys.onPressed: { + switch (event.key) { + default: + console.debug('Main.qml', event.key) + } + } +} diff --git a/doc/README.md b/doc/README.md new file mode 100755 index 0000000..b01fc55 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,23 @@ +Open source QML UI + +To run on target: +$ cd /usr/AGL/CES2017 +$ /usr/bin/qt5/qmlscene -I imports Main.qml + +For development it can be nice to use Scaled.qml instead so it fits your screen. + + + +© 2015 Jaguar Land Rover. All Rights Reserved. +Licensed under Creative Commons Attribution 4.0 International +https://creativecommons.org/licenses/by/4.0/legalcode + +(Optional) switch shell for weston to ivi-shell and start demo apps if you want to start demo apps with ivi-shell. +$ cd /usr/AGL/CES2017 +$ ./switch_to_ivi-shell +(Option a) $ ./start_ALS2016_ivi-shell.sh +(Option b) $ ./start_ALS2016_with_navi_ivi-shell.sh + +Option a: start QML UI only. +Option b: start QML + CarNavigation:/home/navi. For the time being, CarNavigation expects to be Wayland native application, which will be showed on top of QML by using LayerManagerControl. + diff --git a/doc/Rotated.qml b/doc/Rotated.qml new file mode 100755 index 0000000..4eef7f3 --- /dev/null +++ b/doc/Rotated.qml @@ -0,0 +1,17 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +Item { + width: 1920 + height: 1080 + + Main { + anchors.centerIn: parent + rotation: 90 + } +} diff --git a/doc/Scaled.qml b/doc/Scaled.qml new file mode 100755 index 0000000..c566735 --- /dev/null +++ b/doc/Scaled.qml @@ -0,0 +1,17 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +Item { + width: 1080*scale + height: 1920*scale + scale: 0.5 + + Main { + anchors.centerIn: parent + } +} diff --git a/doc/Scaled_04.qml b/doc/Scaled_04.qml new file mode 100755 index 0000000..502a663 --- /dev/null +++ b/doc/Scaled_04.qml @@ -0,0 +1,17 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +Item { + width: 1080*scale + height: 1920*scale + scale: 0.4 + + Main { + anchors.centerIn: parent + } +} diff --git a/doc/Scaled_720p.qml b/doc/Scaled_720p.qml new file mode 100755 index 0000000..86cb9b1 --- /dev/null +++ b/doc/Scaled_720p.qml @@ -0,0 +1,17 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +Item { + width: 1080*scale + height: 1920*scale + scale: 0.666666666 + + Main { + anchors.centerIn: parent + } +} diff --git a/doc/TopBar.qml b/doc/TopBar.qml new file mode 100755 index 0000000..5e0a532 --- /dev/null +++ b/doc/TopBar.qml @@ -0,0 +1,146 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import system 1.0 +import execScript 1.0 + +Item { + id: root + + height: 120 + + ShaderEffect { + anchors.fill: parent + property color color: "#777" + property real radius: 40 + opacity: 0.24 + + fragmentShader: " +uniform lowp float radius; +uniform lowp float height; +uniform lowp float width; +uniform lowp float qt_Opacity; +uniform lowp vec4 color; +varying highp vec2 qt_TexCoord0; + +void main(void) { + lowp vec2 dist = min(qt_TexCoord0, vec2(1.0) - qt_TexCoord0); + lowp float xval = smoothstep(0.0, radius, dist.x * width); + lowp float yval = smoothstep(0.0, radius, dist.y * height); + gl_FragColor = mix(color, vec4(1.0), sqrt(yval * xval)) * qt_Opacity; +} + " + } + + property int currentIndex: 0 + property AppIcon currentItem + + Row { + anchors.verticalCenter: parent.verticalCenter + anchors.verticalCenterOffset: 5 + anchors.horizontalCenter: parent.horizontalCenter + spacing: 30 + + AppIcon { + id: homeScreen + active: currentIndex === 0 + onActiveChanged: if (active) root.currentItem = homeScreen + property var mainScreen: root.parent + property bool home: System.activeApp === "home" + source: home ? "images/agl_icon.png" : "images/homescreen_icon.png" + + onClicked: { + if (currentIndex === 1) { + execscript.execute("./switch_off_navi.sh") + } + currentIndex = 0 + System.activeApp = "home" + } + } + + AppIcon { + id: googleMaps + active: currentIndex === 1 + onActiveChanged: if (active) root.currentItem = googleMaps + source: "images/googlemaps_app_icon.png" + + onClicked: { + currentIndex = 1 + System.activeApp = "googlemaps" + execscript.execute("./switch_on_navi.sh") + } + } + + Repeater { + model: ListModel { + id: applicationModel + ListElement { name: "browser" } + ListElement { name: "dashboard" } + ListElement { name: "hvac" } + ListElement { name: "weather" } + ListElement { name: "fmradio" } + ListElement { name: "media_player" } + } + + delegate: AppIcon { + id: app + active: currentIndex === model.index + 2 + onActiveChanged: if (active) root.currentItem = app + source: "images/%1_app_icon.png".arg(model.name) + onClicked: { + if (currentIndex === 1) { + execscript.execute("./switch_off_navi.sh") + } + System.activeApp = model.name + currentIndex = model.index + 2 + } + + Rectangle { + x: -15.5 + y: -15 + height: 123 + width: 1 + color: "black" + } + } + } + + AppIcon { + id: launcher + active: currentIndex === applicationModel.count + 2 + onActiveChanged: if (active) root.currentItem = launcher + source: "images/application_grid.png" + onClicked: { + if (currentIndex === 1) { + execscript.execute("./switch_off_navi.sh") + } + System.activeApp = "appgrid" + currentIndex = applicationModel.count + 2 + } + } + } + + property int __appCount: applicationModel.count + 3 + + function left() { + root.currentIndex = (root.currentIndex + root.__appCount - 1) % root.__appCount + } + + function right() { + root.currentIndex = (root.currentIndex + 1) % root.__appCount + } + + function click() { + currentItem.click() + } + + function home() { + homeScreen.click() + } + + ExecScript { id: execscript } +} diff --git a/doc/VolumeControl.qml b/doc/VolumeControl.qml new file mode 100755 index 0000000..56540a8 --- /dev/null +++ b/doc/VolumeControl.qml @@ -0,0 +1,97 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +Item { + height: 100 + width: childrenRect.width + + property alias value: shader.value + + FontLoader { + source: "fontawesome-webfont.ttf" + } + + Row { + spacing: 28 + + Text { + anchors.verticalCenter: parent.verticalCenter + font.family: "FontAwesome" + font.pixelSize: 30 + color: "white" + text: "\uf068" + + MouseArea { + anchors.fill: parent + onClicked: shader.value = Math.max(shader.value - 0.1, 0.0) + } + } + + ShaderEffect { + id: shader + width: 85 + height: 100 + + property color bgColor: "#333" + property color fgColor: "#b2f0ff" + property real value: 0.5 + + fragmentShader: " +uniform lowp float qt_Opacity; +uniform lowp float value; +uniform lowp vec4 bgColor; +uniform lowp vec4 fgColor; +varying highp vec2 qt_TexCoord0; + +void main(void) { + lowp float x = min(qt_TexCoord0.x, 1.0 - qt_TexCoord0.x); + lowp float y = min(qt_TexCoord0.y, 1.0 - qt_TexCoord0.y); + lowp float c = y - 0.5 * (0.5 - x); + lowp float outside = smoothstep(0.0, 0.01, c); + lowp float rim = smoothstep(0.1, 0.11, c - step(x, 0.101)); + lowp float inside = smoothstep(0.125, 0.135, c - step(x, 0.125)); + + lowp vec4 color = mix(bgColor, fgColor, step(qt_TexCoord0.x, value)); + color = mix(color, bgColor, inside * 0.8); + color = mix(color, vec4(1.0), (rim - inside) * 0.6); + + gl_FragColor = mix(vec4(0.0), color, outside) * qt_Opacity; +} + " + + MouseArea { + anchors.fill: parent + onPositionChanged: { + shader.value = Math.min(Math.max(mouse.x / width, 0.0), 1.0) + } + } + + Text { + anchors.centerIn: parent + font.family: "Source Sans Pro" + font.weight: Font.Bold + font.pixelSize: 30 + color: "white" + text: Math.round(shader.value * 100) + } + } + + Text { + anchors.verticalCenter: parent.verticalCenter + font.family: "FontAwesome" + font.pixelSize: 30 + color: "white" + text: "\uf067" + + MouseArea { + anchors.fill: parent + onClicked: shader.value = Math.min(shader.value + 0.1, 1.0) + } + } + } +} diff --git a/doc/images/AGL-Logo.png b/doc/images/AGL-Logo.png new file mode 100755 index 0000000000000000000000000000000000000000..e869d7f5725081be36aa951d9b3f7aad7cce25d6 GIT binary patch literal 20091 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 JPDHLkV1hc$90>pb literal 0 HcmV?d00001 diff --git a/doc/images/Hex-Background.jpg b/doc/images/Hex-Background.jpg new file mode 100755 index 0000000000000000000000000000000000000000..ac9bae01c7813a58518536b840d2a6f5a47352d8 GIT binary patch literal 119534 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 literal 0 HcmV?d00001 diff --git a/doc/images/JLR-Logo.png b/doc/images/JLR-Logo.png new file mode 100755 index 0000000000000000000000000000000000000000..50887d1a0d28e4af7183408060633cffadd3089f GIT binary patch literal 35509 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 IM6N<$g6HHX5&!@I literal 0 HcmV?d00001 diff --git a/doc/images/agl_icon.png b/doc/images/agl_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..ad36a0dc88caa82c95e8abb3527cb1e013f429af GIT binary patch literal 25190 zcmeFZWmwc-{4GjKDKLOYDLAxrNVg~r5+XBn$I#s&-6Gx6A`D6lNSB1P0)v2rq%een zfb`k?{^y+c_rAI>F3;nmOziKDPp-ALvClP??hw-vV_{+4QBhXZ!NS7PxcNhP3%tU8 zCT{@#!t+p2(IW&ufrM5u;CCWdWtayR774}8AM9@n!53IqOjs(4@_N2`I}0uemM{I6 zPB-%`v~}5LpEjE8_@~Ivw9P)Q!)_`496C_)>D`?-+9xugU|j`a#BVzcCL*Fya6I=l^>HJgN2^Drer={$B_2UE^U97l4>RMzA0In&H&WiF+rRhLQ5J=fP(Le)nnrf-c_IsReo0g zq=dFen`uawMzyO5b!^aPW}RR!guv%!1aH^+w=YHs*yt*XBnsrJR&Ku{D6zi}MTVHIJ2LHk{NQ@^K)9!GP}y-cDqutbdy82Z+vDxzmfp*kFO?qJ8)j*|8jOwE zfg$F@yUmi>^5hN(HRLoCU%hGCY2-(#XnFmlF4H@|*hSAVe^}CXERf0RgBzyTFNBu} zI1c3zXj_gLmrXsuCRQdbA{tB)CsQq9OICuqvuq|Yb5ap29qJ@c?s{XO&=O0tXV_|- zFVe+f#H@1IUzmik#h1l2Eg!skgYsU22UMeEXhsQn=1(2-H7np8R3b`6Lp1f3sKwV8 zx86%a>s~%eKdyT~$iEM!_pD{X*%-0#ngPw>H@}#yxHd>LSx}K(%7e8|(mcU_ZM}C2-pXf^>G1PM!}mm+@&@z~1AgTb zi2c#|C0cNl0;e7-jLqq4>@!cI3ghd%ALkPhP5xR?NaFS^+;CieK1Q-Xi<;+l=oc^- z1$V(JPdlU&SJ~WUaOY^XLa^U3%8O6AEcn6Orm9+%KVr+t6L_C@jF8_@w+jkhH(*KR zYoZLe(MVK@=DvN@9wovFVQp=lDIu~v48~Ju7_jFk^JZBn%b>JWH{?V$)zy95c;YPJ zSD!I&U&wBk(98vGBN^DdyL4p;&tk3`LWiVKoPt`gVYsi|nyw6woZ zQSeb6%!JTBlGSpA8F|DjPgF0_6p^`x$oL&mreKGI$D5~MFe|zHO^G_g7WzcZX=|DjU!5i4cg?iP zb3RTz3(8QmQd%*sd0X#JSc94SIFq5ux>!%Ka>*;4ARy`1#LM3=MUiqVsE>c&7q{oz zfrRhAs=`vumNg}55ogF7cuPHcFMg1e{sI4ooA5^K$Lr5~}wcunq;yj|}#?A9NW&GF(ea&$3w&ztvv}+0TGCl& zVV>wLOn#P^0^2+L9wRs7rb<)?;}bIp+G(CY{Uj_ddiyL;(KScTK}fW=Hi^@`c&S>K|dp_v3Eg`UbE_pr!_m(e$J zMbtL%ofqVE&@FF4vqCq~+^&l<5b?y>ck*vQeF5zN)n%Z0IgwVp8#)&1_Bk$_ZSB>n zSZ<`k!=xwPE*Zn?5@AGHrX?_T#BP9)%#?MR-n?7hGlo?hLXE*Za0;rG(L#G~#T(Ea za@nVwz zTWN^y{aG%sv6n#Rg*4!93}{~jqxZNM%V1^y9xItkopqr8&RUQ4&R)SFX;nB)r&aKr z4YDZ8f7d4GwZwoM$cO}jPt5Ajdnf0YcNYJJu50sV8p1Ie5b?a9=IEzu%t>b5!h{;i z=_eY0ibjq#{@64d)p*<{{uqcxqmwKiQG~S4@9t@DMsQ?pKXYIhn9Z-n?8ge&j~%D}YDL%+S5?TGlAfmH-f=5wDX!;pFBlC8HrHYA5X{?j(|sX`RLLBW&a|B0xL zwnV@yPC(ja3nS{9ym`#oWw5d0-pFr$46yLO9z87J1T5NWI-IhDw=X`!TXn&l|0ELo z^{P{@tW2v1i>>zl;7nId6zdP~1Funh1*xkZj}1gYgj0SO9#ge@^N%`o2fwAz2!bl6 zm#m1W)`Ou!U^T22?51mKk2;oi`tW-APggNrLmcE$Ri8zzhHK9xp+?M$+mow4?@V#{ zDEBcx z41r;Y#$f^rDsw_2hyQwMVxR{Q9wIrro++?p({6c<>Wo>WC^S_duCh_Hk<9NiaSdap znzXam%MCvWHL`}@*_Y`!AcmsFc23TZP$*Q1*Z@9O@CpYxyBLqC0wt6lpDp|9JC64t z_F%$GCYhtKPSwgA&+Hdt86g7i$8z#NwxB1+QU^Y*WfmgAvV5h)Qe~S&V+oV>eBQz#}-BtZe>BHb(9wI_bwTOv`*cC$cyoUr# zAAq%o&AbU+j*yFB!-Mi;8{EQUkC3-hcuR{jNd(SbiZgSV0FHr?p0_`feAV~N?iJs@ z;bcQtC5UVME;oi@WB*Epu>!o)V<5zkC`hdCd3uXK(*ZRn&`q>Tp7Z-Q4rQpdl53Ax z1Y2M%a5n`roX}6NCT-eE6fy`ke0$FIJrQxO6j@l@r8KW}bC(;$2sOwdDb7td?k6@H zghWZ=v0>S_c!gA*jfEridIl4^?TtC7_m2GO|0EH^n1tnl$xp%eH9VF+%@K@?hWPFnOY34IJ7F&S~nDqjx8XT>O6ZMowi@ z`n3iuV%WbQ6RUr4S!@lw?9)OE5o=BgceU*twf8cBs9Ni>&>=*k4!pPleKMZ-Q?Q$; zOKcN&@|P_PuYy)0+O!<;FHjdohBXWFU;rHRvf>kFRE%`Vi=hJYT*>SE{s{)u%)aPN zZ2s$h{PIKRkh7s!?UpOF+Ii*FONpd<@m=or&wn4p{e|RYq=9UrS}9uo36rl=IiVk7UUGt=T#*e_|>PYXta_xsOn z{<_Asjxm_rxb<_6hH?W6utGHs2Q#|t%w?+tKVb$^Q9qYlMygkQDISvR#c`|+f$LnR zl@3UZ?vL~pSFhRdWNW*$bc01IV9zTtcIcH?+fM)bNmD1)_rxinc<|>oqj0>mWYW4mNtpvcP?_E zraYUQo6|O0J(V#>28H!!o<6aI%T3;TT^*uAq}g>~5Y;8T(y|w(E{YisfRBBYYBIBVXW5c+ z)I^uD9lHKeJxpcoOH#|beMDwE1<4v=k$rb{O^pcanP`q=nGWZ@&O9)kS{_3)3P|O& z!@wj}RQ%xM8Lx_FMv9(;A2>G^81m>c1{AJT{AylZE3p19&w`iBL0l^ff>n?E>IpSS zih+B?_pPKTlF&BGSm!R|aVJ@msWUG)`|xcSt%EYkz1c|1PB|uYy&3=K(Qyp?U%v9d z{-=+61l+f9ChtY{n)lKiatsBf=@>RV93%ksN@&x@rS|96g+F5|L+!M-dG6A=x40#6 zChOZy8loZl-o>cJghTG+mXk7#$y1e}6VNUZsdy47Bg`y0YDu z`abun}JTqye<9$U!dlxVGbX1f9!x685IAVabi zEwaJMADhQBEuN%XC@6*m9YoUVnv58XmHva%;=Jm)pRCxYx!^Nf)twClU#Vn9Tf!5? zHA$Vb1F>p7(*Oa+5YfZXE~;u!rvWEKrV(G}(D6*JTQ?mF7MI&6HP^J>N4_Se$*WxO@YFwPcGN!TKT`2O2g5Mn6k zC~!dGJCQc*?(uSfDgu0pB+TAFy!);AQ~FoN@b{(36T-GP*@uSGK6Vs-Zc?c?r{25JFw<=!=6xg zXJS$Guk;pJC)$bRGVVfR(?yiiB-td+;3g8As2*>WmK&W75Wbu%apH0`*X z6wku~f@HlB?GwEJ^e5*-;nA?^>FILCUtiW9*BX6Va5snKg<6qkebcU* zPC}uzGk$64CRyi#2O51C+-UT}=8h(MuFQA?Pmxd^ zb`#Ft{Aw-FjlF#fs$e(Ns-G5*L?v292`t$VYOawOTnq$t=Y)= zsZ?gtY&i`Ww}BugBR4qliaG`thQY&sE2no_<~VEn-B!5g2C1uPl@{-zT>|o<`$h(2DwvFcFHI1t4}XztyX4o&;51N_{Q7v*wxsxT0-VkUIMg*LDv6wDOBanV{n zh-@#&_xuXU(V_kWQhS~Nff)r3<+BE~woNVvVRFnw8gzd!ZTI60y(Roh;;k+y6aUY) z;LatAl+@RmA0~sD=oED0^k2SgVztV}M(lRH{7!&n3Ca51019t5S*H|N*IFzrdk;wZ11c_?D z`ujI+uKYEj250Oy$|r~gRc98g4cagwbH!7JT69zm%Get~p4{P}P2{1D&;K}sKz8=m zh+}Cn^FNGpZVI3(N;zl(fx@I17mhU|T=v$0TLfyPnTw4z&cy%lJx9I9Uq@nqNF+V` zPGT>FwQP^arp`PBF#@Grd!ra3*taauT0$wd6UTtNiQr<5G4q?lZ*Wjm`A;*{1lWWc zUl0-P{1)slu}G4-B4AHp#k#7s@yf5m4KX65=D&o>lL*R=xWf9R|&5kWHW9?!y$ z_aP)eC_hb=)td)P4LqszQ%wNVLs3>3!t|z=A|kWr6_`wW9n(slWsQ@;5Jp6Vc>1X^ zWrAkoK@sOe?YVE0xkLuecx)`lrTwNJli}J&R|W-Ya%pAaA4Dgg^*q6Ot&7K2S_T?R zd!*?d4<0qoRWM#CFkY%q+~N4H2;rxvZQ82Slng^Zpu((7D^oUHm2Oyrd^nWfL}+do z2dcQRJWlfKKQJ0G$id|Yy#y?_PEo03*j8YYN+@Fk3lA(*O}HiRP7$XK_bB%7CuR!h zV(zcBmfJ+6*1WY+_k?D=oU$m59Pxr<)Br%mCY9GL zZxGF*JIA1-w>oG0m_?|bB~;YWrSvb*&^Mx-M)Aj+FWi(LL&3|U+Nw_hA}igT zGC~HvR?Iz0YdQBN5l@a9yr~2n1vnq5&13IaC6VV?kXyGmfuezufjBe`lEwd_xZy#J zp!ml@LJgs95Y){L?|>?VP5J@W)Q`Q3x6XJT~sS7%vUA zAYZ;BdyyhjslT>38z5iB*XUQ>rw8$;Sw!Lf{>{)#J7+a0Z`rL{tQf{HqG70l8iP#^ zdH$-Hwu#u35Vl8DR|G5NwudSrs1o3$EK(W32sJoWL)ZY)=@Ho#VNF?<{8qrm-Zqy| zW0K^uIM$s58tMqNGb&N0mGc)2Sm+RSYw9qMEziIe>RO7-VoT1ja?Hj@Mn zCHV*qWlK#ZDD)^9RCyse&^R4D=LCCp5pt{)@U1VP9{n{zwSMRdpy6T?=}A2fsw4^q zg3#B5>T+Tr$QdYV_86(zDbUcH^I2^&ye8`{-T~ip?J2OTO&F*o&w*NOGVq6V9420F z?1oqQ6fY)&W4bFM3=Syi$4{E{m}(Tgs>a@P7v#DIHQ~>j-uxp|ZgE+SqDVn7v%czm zSPHYiH{RRpW^-7F8=}Yb2bWduL5Hgd^BQ)3o(|e1dYGMRl;#4B(7Z8J;w~58o_(h!!d4&20~HU4NeDfV?t*YvXEspJM}M%b46<{Ju|}*3+E*i(tv!bY2|@3 zMm9Gt?a#C!bGvj}k9v`bKP#Quk9*pYEQOol(JzllxZb<1V$PL{`j4g(fGPY_XquNM zhShsk=skM;=7E+8I1N|hCQhhJbaMvI6S=i~0>j+79B&38HS-@=f72;TJTH-%$4`QE zAKhlcfxa1sWcrml$4TPoDK8H(+2vkx?w1PqB>;#p3#4{7^ zxL=`>?wDvpdKi9rineRZ&AO`lu|}FF3N0aIb%ltCay&)lUtK-41#|itVfJfh@rBi7 z3C20d3Aw!D9jqp_eky}n0a#j$Ys8Rt9W(a9)=Wp|w7P$$5!DT7bAeb|ajmC7z>ijZUG9-ssJJJ^2GsJlkVe*`V16%dOx~zqtiU`hxi?c_enbQtu!y~l_YHEE zcocM%^EGYlO{nDbfDNV$z{*oFe8F`xzM6EfWLyJ9h9fL z^e3bo?WGB0&{jqD8r^GL^nrk=PVFs0X+YJq=kh{nvuS-6lY7EjuSj4<4dy5$&Z9bd zC!Y2HXaS@#0uhh3Eb-l$96yw&g6NX6CU;Q$`UqgTZ1bO^%aR+w$VNIzWl{E%yYG!@ zgN^ID0Q6y2z7DcFn*Xa*0z|F`0v_e~V*OgG$&ZFPG!PJPS+j{B_8AvsKKZj_-2OEO zxgL?Kd0^Q*wZkEgzsoaPJ+RC^Zi&k;dqZ*m=Q4~8M(x>0Vg<+D-P5@sO~v3A5y?3c z2hEO7YPQ_Wg8J;{@UggW0pj}m4`07)gKCExpGmDAa6g}XsrmVRe`4l|xCFi&_syV3 z0KOwA_F~4k#h??LOy(-GSwp{rHGke4b=lcp2=+aihe==WM!)R51ToEC0EbCQxE5g#u+OXP5(YP_-dU>dbV;cUVPRRi0H5*v6x?jCkuD+FS>_UV7`%RaZ zs!7OqxUB9Ui`PTn;{Cr-Ib`2Jq6T>Xn~fe=C{L5%1vRRDGLgXCS-L;^iSpFd62ev* z&+Gx!w_t?*t%-Ax*g3~)HwG>Mqk~!~NOJ_*YUc>1gAd%Ba<$i5$`;)fG;_Db8+|?^} z#SKiSId$cjuvhCs3;L{M2@v}K0cLK>9e{D>VwGWx+R&`@EK1o9#qn%ikVZ~dX>yuEgRtUzA@%sdj_dm*|+c6+ikzE=mSGK z69jy?(ucgi4|ss2A$T<|>H^xN)DzPD4N9)E97^XUcLw$uJ_ZN`ar6vrDdu8iCUM@} zF}3AcaH_vL0Ka=Smj^pBq|1E)_E<7$QlvkyJk6hZtcwL&j0%3id1PK|Amwh{G!2ew zCGg_kcm1>(9qKeesdNfJ9n6h;^)f+pP9akPd|MEbUH2V35DqMO38(;G7qn2 zE7In&UB5U#!u?|4Py|Z8NO(WtpL^ki(2lR`XPF`zB_B&s9fjZM_gZ3%g!%(FTAUx? z4*3Jl(ps8O*0#R%%zff9;FXx?O2&3GV`#ZoLp&UCo;)p(J#RZZgi1sx8nd)Jn?!#_*-W`j|hfV6D_ApXyDZ|n>!UTcjx(DGeS%TP?-yB)gepj{? z1{o(8TeR@@t#G3m$$rlC1&{u$XK9#pokY!wNh@3J79dRlfO*{mCF(X}ka6}jIDZ!KND*~T!|7M!m2--{r`-V0Joz$o!=iSOTaP$K{Z`>(CiC`6# zWCc8z%BSp!fZm@U5ecXFrX5gaX>?J3f%`4vZPyEw5WkCmf7C$t6Jo$Y)$u5`cd|ui zyJ%Hx2}BVj|9E!kS3zTR>sDLO?8LCUYGtCb)?3(ni4UNs7&yIRf>Jc(o?RrBJ=F&I zXbtAUkS>o8z%(*%`Yf#@c>tD7?1HgX0yURzYDv5YJ~pw@<)NsF{p0h?Xn^(LLr%*o zTt+Nc3Y4_ZZ9bn4Z;Or94xP@M40d^HDO!R3%|ALivd@?+aQm~;M*uxo{SjKwKOBxPqQ40EzH!oM2Q3T5Gh2YL>Mi4zw9pHeNE8VcoadkVFuEDZe=w6yh z?6362M`JLUPC*9J>!gTxK{~2IS*aE~>OPZ^vpfWADJNx{pZC21m+Cir`)+ZA%@&&o z#T^ZRGzX#;IwfgtUuDM(4h;>t#18rlEXa-<@(V1r$;k-tU;Z1Ay_$w2GyaWLgM|jj z{-KopvveoAx05fmSC@-S+PH2`BXiMNJSgqL!%PJ~D)F6HmkJTxfFO!ijBhKuJZkCA zw8K#=6nc->=-)|r_i}O&Z|lxX-TkbLnOPA#f1{}0pDtv#!aFy3O3D;C9~+sPUZ;1P z{U)Gb$OGb@fYa}N8CT9NQ{KZcan*IdkDhEO#=$3c#94pIQ`Q}XTum$5MxoK9HgS^k)Air{%~bY#sr?6#aO4$V zzUF3Td%mhACJz{fdtE%w^nz#XUPe4@E7zqUMufm(YPM!Tn0OfJ_^I&1zuFiB=>!}u z^NiPi%(&ypJ1N%Hv%Y6tPHNLO%WW(q-Ip2Y4lZb?+trOk?xba5kI&(9=X0ixLltON zxqIb9l}&05en22gWa-tolgdc_bKt&*(?s2zWyX#h{O^J}kPDu+^<$Ko>zXWYiA?EK zmjVwJ)8#QB1gOYV!6kU z{M+wz-U_?f?tx45fXAAah+L>AB|)HHU%EVF%L&MsA&)U#!a7yci^mz;fwY!79G~?9 z`oFh!&wN)LAC)x3X+SPljoi0%EEjUIjb41;61X3(ZxjCgI>1T0&mU~f88tm~z#?&1 z(b8@SQTWs?&#}_+9}#o6MxF?tM&U!5Q=E#EaMtb4*C%O}ip9K1wU4Qm;p0w`U zDdmp`(bp%F4m*6)mg)WZo2+X3y^GkFI2{LHe}9R}``wz~`o7!N_r8aCChF9!w=8@Q zABF{$s{hjaKv&CmFL2+xUhh#Q$93xd<-$cEZpCZq6JUa`Z;zGadX5>z2>qpo?-YHh zqNSZ5aR;l>p8%{iWBfQpe(CS-(7wm^8DHS%qLXxLdiVHD0{P9eofiU1)TUsgZ-^u$ z)fDxF#$Z4BhuzUb0gm1@PjbD{Pvkh{v2@A?A6{u3@$YN$b@F&hr5p9m-|2@Cd|7JPZ zYLL14s{H8LC^tKigZG!OkFugrSCa2(kLK*=vX6@!u6vQ6io~!z%Bmw>t&<#biW18i*AR zO}IKFRt*4I+Fz0U`xQ8}6=h!Z(FDzbxQM^O4 z=WplTQ?ol5J2;ROT$j}pD!Vteqk|JS8g>XoP55o8bV?gj*UZ>zo}l|gg$Isj^zV!= zR~7S2MjBz0- zP&~wsj9Johq7ndoVwC98q&Pu$32^k| z?1X-&Wk1n<{^z?H|G(9@HW{hvcHXmj$8NP!)kjML*2qhc=3+-9XzLOi`UO^a(och* zkhZGdvw-bcSzDJu{6f3(vOJ|!DC#wCuo{;#

d6t=#7IuC1-Dr1984ODOcM-M`s( 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 JntRV){SWd7tH}TW literal 0 HcmV?d00001 diff --git a/doc/images/application_grid.png b/doc/images/application_grid.png new file mode 100755 index 0000000000000000000000000000000000000000..0cc5b2bf49c62e4b84657b001793cea43dc4dec3 GIT binary patch literal 5427 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 literal 0 HcmV?d00001 diff --git a/doc/images/backspace_icon.png b/doc/images/backspace_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..6bc0f20c7bded087be7b9c9e9d7d2c209a0b4666 GIT binary patch literal 640 zcmV-`0)PF9P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^!8 z5+pDqr;X7700IC>L_t(&-tCyZYZO5khoAAQxF`oU7JflI>@Em4D%hm3N@pP!{ttq^ zjh%(9V4;ToihvO?0!F|H7y+vQ3?URMz&_wEV1;F?EMO>ll1V;(q|`&eW8hp3lM%`| z?Wt;X^%U?FIM%utR4)QAcN*N(fND^$1CM~t2-7uSb4+)?faS^w)k0;6Uq^lDczslR zYG2*RvDs1=)ULXiV?&uz3Q#?&z9|6rQ=Luu_0_c@aPujf8FjreK=q9J+2VSpc2fR5 zbu|YrsJ9!NLG_CI!^t(sK%P)vt7lVnyVZLm`luIBz3Oy&p?1@=m4UlI#=myJO{dpV z8Zv>~TL7*!;3R2cyMj%77C4-#I{@@|LLR&^U`4GZ#<_P!=I1jw4g>b@6=92oo z#L`?Su_VGOK>U2W<5FOG@IyiVz@|LE{=fvs}1!*)iGGfg*UkiJ^_x`c=HMW z{JNBae+!%j2CaQ`3L$(2E&#V$`>GZ~_#HyH23!W-SJ?H3+8>?byJ!TAfDtePM!*R8 a|LG4A&BL#+3kXI40000vTeX26h_w(% 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 Hu0mjf{i8Ay literal 0 HcmV?d00001 diff --git a/doc/images/browser_app_icon.png b/doc/images/browser_app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..9c6ec36f7ca6ef61884b23be377fe2fac17b19ed GIT binary patch literal 5474 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 UxRj|FS2P7^Jl9pJSGJA#KZ}rlHvj+t literal 0 HcmV?d00001 diff --git a/doc/images/browser_app_icon.svg b/doc/images/browser_app_icon.svg new file mode 100755 index 0000000..14d0ae6 --- /dev/null +++ b/doc/images/browser_app_icon.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + diff --git a/doc/images/bt_close.png b/doc/images/bt_close.png new file mode 100755 index 0000000000000000000000000000000000000000..51ace79965b23b99a958adda8bc9c87a2d6c440d GIT binary patch literal 1215 zcmeAS@N?(olHy`uVBq!ia0vp^S|H591|*LjJ{b+9BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFlS_jM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWfo`&anW2K2iJqZ} zfu)J1j)IYap@F`kk-mYsuAzaIskxPbp#l^r0c|TvNwW%aaf8|g1^l#~=$>Fbx5 zm+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH*nV6WA zUs__T1av9H3%LcpzHo!{ilG4o3^M(S!~%UoJp=vRT#&!Os*6j4QW4I;s=7F&vLIDI zD784hv?v)EA8E=k&A_n3ZxKi#&^1>6MVY`zNz8G{PcF?(%`5SAu~h=f=%r+)SQ(i* zTev#9xtbXm8JJlZ8d^A-xwu+dIGPw+I2oEaxx&oArq|fO(%jtA(a^xr(!|iv)yUGo z#Kh9v!ra`@$koZz+y$oBGq1QLF)uk4W^X3YUZ`FJyn3yii&7Iy@{2<9^K)P+ARr^Z zB)>Q#zd*q`*i_F@!8b8EGY=#JiXe!8T~doO%TiO^it=+6z#(jviNytkeGbu^LQbgZ z10ACeN*+kb1ttVcgCHh6@dG*V?30=Y%riy6%we^*kQ11(-g>$?hE&{obKQ~akOL2E zz-{Z2r;J?pHnB_0nCtET&^4xlHGjcr3)X|J$=Q?UJAP#Uw@l#ki-wtHN}GPRzT!}w z65z!7mp>!_jr5%2cCiZ~MOu=*9?}16zI3TnUR#=yb9KGsrrJL{B-&Lg*J?6ZrKcac zHX+hDntN-)T@US$=2ivU3;r7nmWc0au~nGJ@xoe1q_b&VqH&TNf7H?ElainQT${o_ zlc8#H=EEDh(mGFGWS`KMl5RZH$1BDZ`+I&%(&7mPIVwV3y>5p#-20tTrq`i5rBe~pDLLS8S*uf{eoGSqFe+Udj`t^_JlJYD@<);T3K0RR&|m+=4q literal 0 HcmV?d00001 diff --git a/doc/images/cameras_app_icon.png b/doc/images/cameras_app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..2127f8e63e23fd2ac946716a2cf1b2ff3ba1b869 GIT binary patch literal 4408 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 literal 0 HcmV?d00001 diff --git a/doc/images/cameras_app_icon.svg b/doc/images/cameras_app_icon.svg new file mode 100755 index 0000000..d8d1610 --- /dev/null +++ b/doc/images/cameras_app_icon.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + diff --git a/doc/images/dashboard_app_icon.png b/doc/images/dashboard_app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..f7085d680a39320037eb7a7bfe6bb9bc2c93c2f8 GIT binary patch literal 5530 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 c@_zyh0DM_7f~qW;U;qFB07*qoM6N<$g4|bm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/fingerprint_app_icon.png b/doc/images/fingerprint_app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..abea68882adf383ccf97bdc4233d7d21466c5e8d GIT binary patch literal 5919 zcmaKwRalhK7KUfYnW2X6?(Pt2sR1Mer6i=KK^lhc96>-Nr9(;@hek@erBmr{1kRkx zb8{~KwV!9-{p;E5``&NGXlttAL8u@A000lBs`v_ZTK)F}VWFz)Myej_p!85O@X&R! z@$i1~{uPn{Sd;}@ zGAVEhac^X4iRcU(7K%hg9rvWaxSPw-)y#;I`nCBn?AY2E1YrRUPk&vOUACsmf5}i@MW+eGEfvZn^*2;W~$_ww?gf-6b z?WU5ln9*r#UkKBjIYaawMm0CY5P7PD$F)Y`K*ZsW2P~igQHweHl&d7sh2T+(9qg^G zt?~bIhYRmhClm_~4Gjf$1U&^VG&sx!;(rqSF< zIn3kdwA3sp!ogAcB94qV$J^cAFKrpju=?ElXel!=FwhtlPF$J;wvPNVz@5~~?e6Zb z&}ER$IQ%w5dt1xqIF(!fkFB*eFV!=57T;sM1*~ZT5s(N*J^GAxIjv7ZLIPY+S{g3w zqbjp6h>3~WZyw|@o|gAgepxQJc;(fc0?0pKN|EeTIWX|i&ery?sL%N6W`9(8L_~I8 zpPZ*Tu2nz9U^!L3Zi(h7w|-ST+8AZjqRib+!Mbj-#xop#bvboPQr|coM2s}yN*9rL zWpZ-zQ;jgW!qkdRfpS9_yiyJ>w-`!905<&L<>Y8@zqcU!c*C5Ld#d<&w_m+v+~iyY zcnT0h{cK0ivoYO6*yZg+fr^R=(#K6pO>IchXZ5ipH}H%1$y%3wS(6m{!e@6JM!2oo z4U?(wSr@~4OeB<5>SeZM13iT+b79>zSEe=a^ly%Yo5c%N)d2>I3h^1&@s5xygBtTL z11U13yI3}WmvdJVYIb;E!U^poY z*OugpXdAQ(5K4p>fq5tpq?ZMz^4+?f71iyMd8MU0T(XN(laq~Ys2L`_%fh>5W;o_n18>e?Ci_}*q?ih0^5+XBPv2ZP>1Bbt zQ>UFF==_n9k;-!w`uveJ1d*`@NT1UQv%uRTM1`(~Ww)cZ%W8XDCeJS-nv^E%UujZ0 zI5qto5V?>rh^wVhe^NePf`>R9Yvi`eC+;5bu ze)>iwQg6Oiye$o#KM1LWc2nb!^Bu^$h;5CCuhNWAiOR@4nxqkjhJ{5zH>xxumAXj^ z>&+OUrT$k3hCOt`0XHYL6i1+I0nQ82c{1g=@kS9m7lnIszWR|3ZCxXt)Kh%jSe!y6 zh6~xvdJv~uawZ;nvQ|I57u`Vfv!G>PZ+Cb1KC&w$E;+g@iRRgNu&B7Wc!F%=N#9ym z7<;DyI^n1Dzhm^B550>9bWC)S_g6>DKf>L=$Zofg)#q0~N%+E^9WyAZE->xTqGRJb zYPkqqTj#<(0gI2Z% zQ_L*oVpu52kD@|92x79L`Pkq(vtx3=1nhP!+P2=~n7-NsmSJAXldM>2YL5EhzRs5P z^aFA`TZph7UFV89EwId%V(_%eCZk&*ROKJ#kztq-!4bj8hpWXpH~LdKjBp=tnVakC z&FN;;Wcz3OZR8)^bUoib)jucEwoe_ep#-W?}w}@UVXWt**$86H& zU8RQ$4b%}i3RfxTy9N&}l2~!-bytuU%^~KHPuEhE?$!D;rWP)i!5&fgw0>B77#k~- zmBvk)lRggOHp8EbwOtS%uUdUhH{41Ijy4nIcol*_GGvh|D=P;^i-Y?-?oRvZSN-k-%~qRroXQ>1`d=SC;7^l9DE=MGeIoQR`}L7oh0e+z8#dl03Q6-)QpYOw zYsDM0r2md^TIakH!#5Nn34CluS0F&kkBf=fja>xRTlxrRin}~!hJ}R@JM|n}g;;bk zn9FnAl8rv3BC#11fHgT=ZwUwpR!x3*y}Y`(2*^AL)Ak}1iNgez-?TzydW@Q!mm!HR zuPfg0vg_;X^OsKJJqUr^CYfz9#}CQYRu?QB z{vyhqWy6zQE2Y5UFSz-ASI@gD@ z`=P5@movS-I8UTFuUTmSOcaZx&LjOTgO$OmQ1HzwImykJQ{CTWF|7e~>hV!nv_e*@ zsA-|=Eo=(Qm{VINlvTnaONd^ zxs}ejHBL|cYSZP@ll2}Q=nB=kf%Xz@r{G+rF*zAI`L*V9t0ydicex`-_V|2E)(ivO z$qfzN2&t>8fVQsZKK=X4shY96H&M{9z1C5E`eAu_8QbaicWbz!qT&n5Q+qdu6ML=7 zff@Nd8#M6?TF=u3y_e$Ixw*OPs4;yh*`U$L6mW;2>v2i%GHz}M`(;rAF!(mP9nU|2;tDK zUqRQrBZnmo&LfOEFc<|i0I||3OtJzTlGJ{YupgfLWI8{*4o9^yu23L!_@Vh>Z>FN; zWG&q+&`^*K5y19ac@MmX<}HQAbtS^{s2UQTi=JhH2H8txq4ED2OZqtSMRZ@Iu}5(L zO&|^IgVx1C2+--Z0~ZvFftOVHc6gADJ3BiOBp51vFQ$=&ukz-XUUZtjziCB*8|?%K zbZpA)xs~J&tCg4~kp1#-v5B-jvR)+V8C{#=(BNQ;;^S!6vva@^y{P@PT>xI4H>tSJ z#oK5u!eH%Te@HlY6S=9+SNtjx%`6E)OraWSD{T%g>f_Z8*<_#sNh4h;wc`i5MyJK% zUSE*7ldIRk@4Egi@Xj5FTponMX`%kKdk%WfzwWSxUF7M0wA2#!`}c2HiB>M#CIyhk zn+j|2l_OVpx*kwJwJekTD7LxfOx*0+-$&Wc zeM~@bRFsN%G@vT^b}B9Hm3c*X+6a&l?dMlc$7hm~V%D~U8$aV>(g)}RPUIQUAUQ}q)e(Qo+yN;f-p78VxILAr||iu%ZB zvM67$K4>T|Ec_QqiRA%rI8RF}fH6)Hra?P_ z%MV&IVYDyplRjZ$Y|?5Fp)+YFBJ(V?EBN=3k>l!OHSqqB9Z`0RlInMyRyJXn(h~RZ z`zuU2ug{$!g7^w+W?60tE^U`@uuREG;zpMYB!OkWW)2zqP~dDM+`EFok4wabiRkQ< zm+|04|F(5^B7$MY+q-0c=A%&@N1LFjZ}82(y^Nrzy*V2WIgvjp~aSz{AGFm{5dg2;VD>YmxbYqh;&R_ zsA2n8y1(FWt9J9B+D;i8AAO=1$gl9Uy_aBGT4osHhuz^s(!D$T0nyB3yRpuIj=SOT z@9x4!D{cOi_2gtcF&+L@$S6e%Y@c14s{k~t!dBfxI%y-GjG&^IM50V6SfLI78=7u{ z`1TZ;`kL_@mxLmiT41pQ2uKvHGR0yXR&^k;WlI>TuzOScHGT#aHeUE>1Ox;m#qtS> zh`A4 z2~_U>J-$3_{IfSIQCQ&`pR`L0FM6VBYvf{^(@42*4bYbTn=ABXs2Rx*I&7HxvvDc6 zqpodePFyy#re~P;)6+0DGi+KY^I3a*HT(QGjT(15AwCwIvrnA5Of}Fj#5EeYa7C?aU3ez^fw%Q^hLc))w8zK3}KV&EC=SnwN{kkl)!Fsb;_y{3< zXn`I0lV9{;Cm@=Sfx(>O1Sp6!adbS$SXz3kn^fj?xRB6sw^uR8a*n-pAknj1Y4?-c zT<&z9O+w;E8cA0AxXA^0aWS*ES24}YlbW{F?8b~2r(8ABAH{>d&xj(BpHZ}1d?u|J zh_u0>RPLy+U0?I!dS)Mm$E1keZqK%T-(J7Qh+POxB`R)oSzWQ|3a7C`1)h3B(M-?9g8v$UwdbM5QLTl{fHq7a1+y=y*^U$WKZTrmWSDk} z&dh@9s3?p}+L9qHnGKy^6*R*#1L$02*x33~-iL6cis3}7MyDfABEItQ@f}Srp@;x& z9@Aqa|GD1EQ;6e^l5?9vKjqZ7CsF4miFDMKf_G=7?VhZWRMw(5n)6LCqo3r8eQkB9 zE35i;u74_q6Q;FsrBMS3ev9whd`9F4Yz#wE2aSS2{_vt><~g)n?t5$OifMUdvn#YS;koNz_rm$Kq|&Q zuRWcG=beL@5=}liPwP0I9l>tDW)kBIZZAiG)0uBl-JbMU^r*@yejUKtvr)6D`>1%kn_ij_3l+6czS)jjEMcd*yWC*6Z!!K}vuZ|Tc`WqjTNrwPH3HfCj#TRH$#^L2{4x2LT92Lmcw^C5sGx)#--mdbETszK&+$d&;!`nt7cQN{)GBp`W@zuC4&ODCfv~0f;^WY#Aw_5UJmuzJ743}jKd2lwQp7H=sMk78_I&mN)_BG<) z3OgIpz1l!1!2`Fv=x#}$b?SnWQx~iedRzpN`&fAbEwEZ955NtLVU$h`*88-qcVYSO zd&E!rf+1T&H2v=uwS(sGfJ1f;Vbdb!EQ4nql{KGeVO$N-RO7Q=HLRr2_}A~Ezo3R# z%%N)T25MTCcBhtn`INL31MK~>|6PzDAOs?7q#@H=%@M; ruw0sb~>m>%2@9PfSl%S@eLC!CDFSUmyE`^7MBD)rEAs3Kqxvg_^3v&y^ z(7$=RMD|B42KRqx{-0oMX{mA+u12A`u;i))RR0dx-`TCdMb3BGiRz&zgIW#+qYv(2 z0j%)CLnihN|30^One;z+@sz_oxLkJv4 zt_g%u-~WThBqjv6Uj2(o7jksj9{rp~*VNsHvzj?PMlp&+s1_w9i z^hs>Xdx=M3Qt48-Du;XlJ8B@wri83^VzdcArWsB z(|7Q5A^3hC2G0804+9vC5(_6MCowrOD!Q<_x_VosNIUiVZIhwG$%Z-Sz)jR1YY!tx z6AExx8_T`W)Y8IS@9piCw!iR8TNq7AO0ssWv$W{htsWa1s^G`7Cn^)data|mhIY2Lwi{lO)b=0SE)RxFXdz3RrGPbk%B@rB?`MU6s?2)@%lwGv&u4B-OS0W(x=$7;@Y`22 zB-ROVMprupV$37%wuUn9c3gOqkqdk-DJhwKf>Iq75aduHHz3Q6R%NT+}L5j_;Qmhs#`MmGGZWwr}NwBXf@1ANMkTf@pyY{s`{DfV#LL^V_1=Gt&!%= zYm9X@U6J2|@#Aw-@P5-VRMm3!SSe(0nFeJXcNSQlJ+Db=FCIV})aYl{TNnG7A#9eL9H2eD;eRYixWl7Mjli*SCke_WI} zYtWr$(bAls9pRy2>gqi}tYZ)Kif(gfhd#zpY{vETI+T_GKf2lH$W*=;{+!9udjG2L zAr&sgmS-Sg36_~?o)SXYDRRfHaZY~y_-K9Nu8WHcQn;&`+(qZay1pUsw6eBCZ)0O) zmZ&?cUuQe=znU;M;0vx#u%R{St8 z6h1~#C5_GYuLe+O+rFK?}y0iv$wi$1PxA) ztl=+~=1ElQ&XRUZu_7^%-2Wo_21{(M)facEj_`?(2EVAHV4hd!$HUKwU|QNlb=2~e zfW?-QvKa!dRhThSGvm%zFgCM_5DfTxeHGf=+j{qLeD=xfN4Tz)5&4OxpdZe(Oc z1~4<7_x^CXJIdTw|JL&e5~R6YLKoQ>v$p?15J}@FF}!>s_WeV?nWZO`1htf-~B(KqEG|P*OV5ixb_TcTs_SXF_ zG)1K8gap64P`rJ_LeP4>JB9ieNP!k21z{n>WFKmj(-3du6O8-)m=`3VEX%Cw=q#*e)VQ&XV-H` zyIyAMK)EBrzU3)}9v&Vxey^`e=906p=dn#0&bTMH^?AaNBqwgFeMCB_<|hx}YOJA6 zx3ksrwz;|aq~)g_N&+EO#n7hN|Cd#1B5wT%fk1S&A$J!WR(j()bx}RFPd`5b?;(47 zd!6Q|B~r8Z~O+d~}0IE2$|WEL1NjtdFZxX7N5oT_?in*7L#RbyA8JFXn>6j$xjemrG)(>`R# z0-Vs3cGQTYjXE!88_s^o3&z0)ySuy7YsPN8J1~{{35!?icdQFcyLdIs6|^-|7j#E* zZip$XqYR4SOT$)i=j-P_45|V_11xuzNL$JHxc>ww=F`DQy##>Fj@PhUVN38$`H$WP z>FDK@=u%a)4!T-6-$Ofqqa^zy(|=7ASYNpPBlh$F4#tbue>TOc1Cyj3$q32=s7Y%H zaq(+bRdB|<&<69@#|yp8c7k7CrrV%Ay+=s6$*z`VSEkT>d%74Z5p=vU>9(g2syG?r z*G>uB>!Fok9Zx}cc(lq!USH~c-1WTUx{6IltX>nxaw`|VdOf39TLkibBH+L~GMw2t zITLsS;e*9Rvu_8vfV8x9G6ZTDwvUMSyrWpGaA9$_r?K%5&30Rr z^bA0;x&aexqK7gI_r$U_cw4{@wPH$}CF^C?Pm(gdg@whU0PkK;3~g%f=8du*f{BR< z{_x;HoT+*qagF8jX-n6*NG5@*Pfk|$I%c1LCG3nq@-k8O^E6KF$0S?Xy$dMH_S->r z>1s!iK)}KHjp8H!NGU3bQ^wuj%WGQ?cdkp51EbcaCA3vUc`dXA5ukq{l4Jr8?d$-! zTm3C94M|kt=hM%w>!fLHmXwh> zezG%0`}Eo9#cpS0jH913vXT{dJECfz)I=JO$InxqL>veGVNQ#%bJo`%vBY}I{#sqd zp)g_LD?OB^-rhCT^qrnR>n*Vzf*(suxw=PPn(AqK&Y1_2xsaD6Ub}9gCvfWuO(~^H zKn?FXl$uG!r4Yz0Q8jM9Bm81?W@aWCy-I*3JOE%Su_Xz)&L%z%pqCPN$;Nw+wxy1! z1q>Z3eb0aRbY7is33jc1FVGOYDKnC9lbr$KYu7Vxz{N`qg`P2b_7<_7&BoY$i48 zPLh6l(tok4##fcwr{B_!+BgSmLa784Wz~p3&A8=1(>!)7d0BR9J)R_XlNiixVQoE+ zeSl=qv0tXG)FsqeCl4}*QBr&JjBklZHO28`gkBC+m+B0|%P5%GPZN`+-Ufu!XEQvO z?>7XDCj$x$$a(hoau=&``yC)rHR!#h!w|7qxIR)XJ<~5UDd*MbLcJb&iSdk0lPK*< z1(kX8CMy-n<$NqB4FGei(38{22{8O>VpKIgq5u7jg{XaUEU*|vfe~|Jqp*EEoP)ce zToLUmKR%kiDdJDzTY5!StinnyABG(|vU&XP`%2}q82KPuz$=$?ag1|m*gJ2q9SqF_ zg)T0yV3i}ef){Wd9FNeMYk{^cuy+N2E6M0}7|El*T4Ue1e0lfBAd<%&1$V`Q&)4>L{fqn-EX_ ze(W78uGPS(uWrC + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/googlemaps_app_icon.png b/doc/images/googlemaps_app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..3cb3e8de032e5fa08becaaebcdc59b1469588374 GIT binary patch literal 3508 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/homescreen_icon.png b/doc/images/homescreen_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..d736310967d68940daa38b1abfe9592dd9b128dc GIT binary patch literal 4606 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 @YVG|}y_!8J!fYTQR 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 i6j4MGMQr5%0t^8AH~CGN==fp)0000 + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/icon_apps_blue.png b/doc/images/icon_apps_blue.png new file mode 100755 index 0000000000000000000000000000000000000000..95b534b13325d0010e169baca104cb2c2fc5d76d GIT binary patch literal 6342 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 literal 0 HcmV?d00001 diff --git a/doc/images/icongear.png b/doc/images/icongear.png new file mode 100755 index 0000000000000000000000000000000000000000..fa619aa8534ebd914400f163034ce0758fb691ef GIT binary patch literal 10833 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 k`*%$LJNRCwC#T?=qj)fqnf$b*E0ghwC* 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

7i`FpBS&5t zIdbF<8h`N5jLI29m0@>}K3wgJD_`+sN=nKIT)9Nlg#xm*A!3I&avqaKp_=YUyeXR> z>F`MTrAwCz7#KJO4PcZJ?*a{e0xM*mRye#YQMbBBBm`_Pv5RmS8LnI++C^u)En%bD z#;J$95-;kGhHI;}e85Y>i;Igpr=_L+nVl#vFMnCEbJBMtAy}3WYLz7#Y?i=7^@7Wu zUrkR>pNSW7#R3lETfodZkG&9+oEQN(v7AU%!6GxZG8f#fsvHi-VYY^)wzl^DUcGv) z65^u#KDhK4>`6VV1O!mF zlkb*0WAbhw`K}TW(=2SAI94Ebq@T(3yHv`ZN#J{ysMZ>KoCW~n1HLj6T_OX*C^#BXS5C@QOa~&AX0BVe?xzw^SV<`sBlM;(%I`zM1H+CPi)B8t+Fm13 zZ*Y?!g0W%4h636iY!?>CWfR}h*9`hz$@D$Lx`sU*QqrAvcIM}wfBp&&3fPn{^YZdW z3818tds|)b(!!VZ@Wl#Z1-xp3C##%~2Z`;;Z(M+296fq;F>S}g92k#qlAKA~*FBo0 z!=IES(Gib3B=p1dR#8#WWF8be-nDDj0uGcu^!hZao>Dl~q*X4eVh<4b|KQp_<8(T2 zDkOskBb%x!v@L^Z`+L&&Ns4Ca(2|k_I?Ay+y%!bv!K+uVo?@|BzT_+0Au9jZqD71H z=t%5Guje<0N#-Pl2ZaG6avZ$|uT6vqJPTrr&%~`YsLhapF@k<4R_S*l_qN2p`A2%@27Z^tsZyq@I@0%wYUxl(Ni3(jIy0|}dRF+d!%9j@=0JyClx@#c zU0wa#<;$0krX9kzQc9!XFmEeG-4uNG9T9@MK#C#^8hIp_Vw%7q0mH5_j}nr7O=M(h1P=L2$wn+=NH5d<86v+{kdw`aDE;m8E^fzXBI-4L z%>l%rnC;V&h=^3{M?;8j&;Z960Lv=aRdz#Fw&M&?HMt_y8PNhtAX1~Xt}l?SnxgvG z5%k{=(SJWAC}30pp8g9vt<*OCH>lbOIKjH!tqMY01SA~o)_=#amEPxj^V?B6>7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/news_app_icon.png b/doc/images/news_app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..33752f431690b3d8d538377f813f29059f6e93fd GIT binary patch literal 2428 zcmV-?34`{DP)?QM--mf+dIz0{K?=b zDJ;Z~NMj`(U?~bs5~ZU=gd`nBiZqTKp`es$>_kFILy3e$6Gaqs5sDPa$PN+)<4BR5 z&>%3_!m$nJe)caj>zVW0=ULzF?cVL~c|K{h_q(?{-@Ny}_h#k@(a_M)(9qD((9qD( z(9qD((9qD((9qD((9qD((9qD((9nnq+M~bK33%Q35wlC3PjgC)*KLw$2g#u5ah|Qj z14j=L;boZ+8qy2}NqHgzHdjH6mqkMS&R$trIb19j4_lUH)a!N1kG5@7$8jh>dY+dn zLQb4GF)2up%>j=SC&f(KP4)Npe^DqDzUv|3^S0=GTaaOkM#Srq44MQfX3`eox-Mme z^pX;NLl9w!hArGp(q(mokRD47_6UopvsOcK&_mV{+e(s_y;}&W)oKgt>+8>W>=13^ zgOoP>u6UeotycJ zQ}mGm0yri^e&0r9wWYoim%TDZVBd^x$Pz))2Bdf?x+^LMO%W5quK$;?FFtz$lwIoy+Bm|3V1l3559C?&ZWrTA%C7Vp14Ktv6wGD9J$Jxxe!gp{RxjY0^^u}nec zF7ClZe-;#EkStn=?-E|Tcrn8Rr}WjJoB~TL-KeGbKg6!*UqJ|oT8ncWM_QK&$WYDy zWK#C}7kKdC!LL9PMPxz-8YRsqvb+`tKr=#QE6H<4u@LrI1Gy(i2FZhkz|0tCxsVVe zgFMjIPMx|YvwL>F-{YKbX=&-f;NalbBv?96V!-9j zLXt{0lgic&k^$sS_6ikbBvtzoF3M;psOORpAY&7`Q6@G0s%%mgA_y=^x)ta2@{qVE z0TW(6AuONy01#sevWg%tC@2Cv4CXHQjMwuPl5`9K*)g0fQpE#9A)_hTI{%H!<=R5p za9Jg?SY3xxuAU4Fpl?{m_4vBT}Gs7Qn43_!IR zB>#I(@=r+8E)XS}ByH)N=SGEqv9g`d(8PP&sg=a3!kE2c`Na;sb}kH8Pj&(HrhIXQV} zZEbA@Y}m2*rXABX-DaD1gtR4Mp|*dNj~f!sb%~fIY)EJR8Z4Vg`OJS$exFNY+qR8r zwaPBV95{34%=hg5J=@)MtyZhBYae3|U$Mq3#{aRl!VO2f_L>B@?6tJ1)lArD`ae1| zGxNjg)29Q396x^iL*7V_V0L!)A=&zeG_n7_DM^>rxR{ZVkvn{cD(O+M*s*->+__&# za4WQG|9a$jVkBrCfxtU7G<0QZYU*1SBwzLt8PA_Te{%Nh*`FRgdbFyDNj9>U$jU3J z*%%o|O>@%?xGH*Vbc=*W>H?;JRA;H`c8_PvS982Fe9;HDuNgFsn_%+1aH zbN~MRCzmc=dH@t67aQv$hVZr~p1&3X1j_QR6GA~Lq$Eh$ElAldo|ix-4&|?hMpZYH zG`w%6K!UT5uz~>pUPBV{S_JV|fQ%~Hy5&2S9aJ8YpLNBJm?V5pcelwPM7@_BC$PA- zChw1Td_}Y>D&@4bR@hAV#^5w6+~x&G6)gG@l9AOO3QJMtO_-26%9ZMhIFiagIe2Kq z%g&d8H(-WTbQ38(B#@6ao0E5u^;jTbwTSwkDN@^~?x74Ek0`utm?}yeBqNqWh2LGt*5@LyzPIk(6zL=2w|Lu6Ik26C^v)||i3u*QBOcBy+WTYj{H8eCd uG&D3cG&D3cG&D3cG&D3cG;)Lg1sDJvfW{3^*Kw-=0000 + + + + + + + + + + + + + + + diff --git a/doc/images/nfc_app_icon.png b/doc/images/nfc_app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..43c3a8754a2fa69054bb87c58bffbcad1bb504bb GIT binary patch literal 3933 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 literal 0 HcmV?d00001 diff --git a/doc/images/nfc_app_icon.svg b/doc/images/nfc_app_icon.svg new file mode 100755 index 0000000..a104c0f --- /dev/null +++ b/doc/images/nfc_app_icon.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/phone_app_icon.png b/doc/images/phone_app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..3e3c9acaac939a00c74b5521c0708e6c09a36ff0 GIT binary patch literal 4335 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 Y`gBjef(Yz@@Ph$>Yw2sg(XfyI4-yR__y7O^ literal 0 HcmV?d00001 diff --git a/doc/images/phone_app_icon.svg b/doc/images/phone_app_icon.svg new file mode 100755 index 0000000..606dde9 --- /dev/null +++ b/doc/images/phone_app_icon.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/settings_icon.png b/doc/images/settings_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..44fb3d87f08fa233f356c06766335e19ada2cb48 GIT binary patch literal 6528 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 literal 0 HcmV?d00001 diff --git a/doc/images/space_bar_icon.png b/doc/images/space_bar_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..2b5c2fa39b5522b048c1657bb7c2332210092689 GIT binary patch literal 302 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 literal 0 HcmV?d00001 diff --git a/doc/images/switchplate_off.png b/doc/images/switchplate_off.png new file mode 100755 index 0000000000000000000000000000000000000000..16250c5def6b0e2f7a8b160fd228e571d40df01d GIT binary patch literal 5071 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 literal 0 HcmV?d00001 diff --git a/doc/images/switchplate_on.png b/doc/images/switchplate_on.png new file mode 100755 index 0000000000000000000000000000000000000000..43bb5540c9de0fb590f27f585eb71e14aa623334 GIT binary patch literal 4824 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 literal 0 HcmV?d00001 diff --git a/doc/images/symbols_off_icon.png b/doc/images/symbols_off_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..59cd17068fd700cd2aa1af50bf57d2cc236ada38 GIT binary patch literal 1500 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 literal 0 HcmV?d00001 diff --git a/doc/images/weather_app_icon.png b/doc/images/weather_app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..dcb46ee23fcf710c401431b5efeb9a305b5b8b43 GIT binary patch literal 4615 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 literal 0 HcmV?d00001 diff --git a/doc/images/weather_app_icon.svg b/doc/images/weather_app_icon.svg new file mode 100755 index 0000000..d1fb79c --- /dev/null +++ b/doc/images/weather_app_icon.svg @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/white_return.png b/doc/images/white_return.png new file mode 100755 index 0000000000000000000000000000000000000000..0385846f330d3285070402b7348aa26e84141ee1 GIT binary patch literal 728 zcmV;}0w?{6P)00001b5ch_0Itp) z=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^!8 z5+)oYNrSKe00LM^L_t(o!|j+)h!SBK#-EvL%?>Tg2Hwg`m!J@WLMVtJJa&la&?Pz* z;S&8h>@BdOPF?C4Ayjxs2t*1rkT6PHFKs4hG~+>BR4UeCG)KRui@_o@vqt029D0uP zz3(@_`QAU@%Sa^gUmHYnj^sm{l)B*{I~I?t1QId=R`@|r_Xw>cqIRo_qhHMvRW zd_I520jSTD`wAh%G>%VbqISEz2H?;?LaAnZ%bPeY1Gr$e=JWY>0ysR2T$62p&H}h= zwO%TfRsqayWmOy?+nND2e2806Dvt^?E%`)3l$9i;F*GSr!f!`T?_Ikw|_5aL`K^ zwL}ljE;4`>F98jQLqi5|SqL%m3Y4m4a4{)gqV4lbzRq@(dbj@ z&jUqK9tVTLi)O~fV)0`*9DcS%C)(TCGo(hN@z$zW6$*vtZq3ZQI-Sl}E3j-fd*2nX za=E-$)3lBmln_FsQmHGhfK@7$uwfW|Gcdz228l%Cv|A^3UI-z~z;s>j#^doLu7Fjm z)tFU&)oQgb0Os9lW-rX3y4~(NfHQ7YxiSfrPN&}hxa3;vuh;7fwOZ}nXfzu2 z`~6-rnS3S7@(lpTW-=xGg{=?3sqrXmj4$#Jvl?AI_v1r`2lX3cux$mE40lxk0000< KMNUMnLSTYVwlg6B literal 0 HcmV?d00001 diff --git a/export.map b/export.map new file mode 100755 index 0000000..0ef1ac7 --- /dev/null +++ b/export.map @@ -0,0 +1 @@ +{ global: afbBindingV1Register; local: *; }; diff --git a/icon_wifi_128.png b/icon_wifi_128.png new file mode 100755 index 0000000000000000000000000000000000000000..4651b6143afe61ea7222ba795c46f18173934fbd GIT binary patch literal 18162 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 literal 0 HcmV?d00001 diff --git a/imports/components/AwesomeIcon.qml b/imports/components/AwesomeIcon.qml new file mode 100755 index 0000000..542fb0f --- /dev/null +++ b/imports/components/AwesomeIcon.qml @@ -0,0 +1,26 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import system 1.0 +import components 1.0 +import utils 1.0 + +Item { + height: icon.height + width: icon.height + + property alias iconSize: icon.font.pixelSize + property alias ucKey: icon.text + property alias iconColor: icon.color + + Text { + id: icon + font.family: "FontAwesome" + color: "white" + } +} + diff --git a/imports/components/Box.qml b/imports/components/Box.qml new file mode 100755 index 0000000..a2f2ae0 --- /dev/null +++ b/imports/components/Box.qml @@ -0,0 +1,49 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import utils 1.0 + +Item { + id: root + + opacity: 0.8 + property color color: Style.grey + property color border: color + property string shadow: "" + + OutShadow { + color: root.color + visible: root.shadow === "out" + } + + Rectangle { + id: rect + anchors.fill: parent + color: Style.black + border.width: 1 + border.color: root.border + } + + InsetShadow { + color: root.color + visible: root.shadow === "fill" + } + + InShadow { + color: root.color + visible: root.shadow === "in" + } + + Rectangle { + visible: root.shadow === "fill" + anchors.fill: parent + color: "transparent" + border.width: 1 + border.color: root.border + } + +} diff --git a/imports/components/BoxButton.qml b/imports/components/BoxButton.qml new file mode 100755 index 0000000..0969f46 --- /dev/null +++ b/imports/components/BoxButton.qml @@ -0,0 +1,36 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import components 1.0 + +Item { + id: root + + property alias shadow: box.shadow + property alias color: box.color + property alias text: textItem.text + + signal clicked() + + Box { + id: box + anchors.fill: parent + + Text { + id: textItem + anchors.centerIn: parent + horizontalAlignment: Text.AlignHCenter + font.pixelSize: 28 + color: "white" + } + + MouseArea { + anchors.fill: parent + onClicked: root.clicked() + } + } +} diff --git a/imports/components/BoxHeading.qml b/imports/components/BoxHeading.qml new file mode 100755 index 0000000..bb2c62a --- /dev/null +++ b/imports/components/BoxHeading.qml @@ -0,0 +1,37 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import utils 1.0 + +Row { + id: root + + property color color: Style.blueViv + property alias fontSize: headingText.font.pixelSize + property alias text: headingText.text + property alias boxWidth: box.width + property alias boxHeight: box.height + + spacing: 10 + + Rectangle { + id: box + anchors.bottom: headingText.baseline + anchors.bottomMargin: 0 + width: 100 + height: 16 + color: root.color + } + + Text { + id: headingText + font.family: "Source Sans Pro" + font.pixelSize: 22 + font.weight: Font.Bold + color: root.color + } +} diff --git a/imports/components/Button.qml b/imports/components/Button.qml new file mode 100755 index 0000000..9d5c495 --- /dev/null +++ b/imports/components/Button.qml @@ -0,0 +1,30 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +Rectangle { + id: root + border.color: "#cccccc" + color:"#222" + border.width: 2 + height: pairText.height + 20 + width: pairText.width + 20 + + property string buttonText + + + Text { + id: pairText + anchors.centerIn: parent + font.family: "Source Sans Pro" + font.pixelSize: 48 + font.weight: Font.Bold + color: "white" + font.capitalization: Font.AllUppercase + text: buttonText + } +} diff --git a/imports/components/DateTime.qml b/imports/components/DateTime.qml new file mode 100755 index 0000000..6203712 --- /dev/null +++ b/imports/components/DateTime.qml @@ -0,0 +1,35 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import utils 1.0 + +Item { + id: dateTime + anchors.left: parent.left + anchors.right: parent.right + height: 120 + property var timeStamp: new Date() + + Timer { + interval: 1000 + running: true + repeat: true + onTriggered: timeStamp = new Date() + } + + Label { + fontColor: Style.grey + text: Qt.formatDate(timeStamp, "ddd MMM d") + } + + Label { + anchors.right: parent.right + fontColor: Style.grey + text: Qt.formatTime(timeStamp, "h:mm AP") + } +} + diff --git a/imports/components/HexGrid.qml b/imports/components/HexGrid.qml new file mode 100755 index 0000000..b81a09a --- /dev/null +++ b/imports/components/HexGrid.qml @@ -0,0 +1,32 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +Item { + property real spacing: 0 + property int columns: 3 + + width: childrenRect.width + height: childrenRect.height + + Component.onCompleted: { + var sizeX = childrenRect.height + var sizeY = childrenRect.width + var column = 0 + var row = 0 + + for (var n = 0; n < children.length; n++) { + children[n].x = column * (sizeX + spacing) + children[n].y = row * (0.5 * sizeY + spacing) + column += 2 + if (column >= columns) { + row++ + column = row % 2 + } + } + } +} diff --git a/imports/components/HexSwitch.qml b/imports/components/HexSwitch.qml new file mode 100755 index 0000000..cce82b3 --- /dev/null +++ b/imports/components/HexSwitch.qml @@ -0,0 +1,80 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import QtGraphicalEffects 1.0 + +Item { + width: 170 * height / 80 + height: 80 + + property bool value + property bool showLabels: false + + Image { + anchors.fill: parent + source: "../../doc/images/switchplate_" + (value ? "on" : "off") + ".png" + } + + Item { + id: shadowTarget + x: value ? parent.width * 0.375 : -11 + width: parent.width * 0.7 + height: parent.height + + Image { + id: control + anchors.centerIn: parent + width: parent.height * 0.9 + fillMode: Image.PreserveAspectFit + source: "../../doc/images/switchcontrol.png" + } + } + + DropShadow { + anchors.fill: shadowTarget + cached: true + horizontalOffset: parent.height * 0.05 + verticalOffset: parent.height * 0.05 + radius: 16 + samples: 32 + color: Qt.rgba(0, 0, 0, 0.35) + smooth: true + source: shadowTarget + } + + Text { + text: qsTr("OFF") + font.family: "Source Sans Pro" + anchors.right: parent.left + anchors.rightMargin: 30 + anchors.verticalCenter: parent.verticalCenter + font.pointSize: 25 + font.letterSpacing: -0.5 + font.weight: value ? Font.Normal : Font.Bold + color: value ? "#C4C4C4" : "#FE9C00" + visible: showLabels + } + + Text { + id: onText + text: qsTr("ON") + font.family: "Source Sans Pro" + anchors.left: parent.right + anchors.leftMargin: 30 + font.pointSize: 25 + anchors.verticalCenter: parent.verticalCenter + font.letterSpacing: -0.5 + font.weight: value ? Font.Bold : Font.Normal + color: value ? "#59FF00" : "#C4C4C4" + visible: showLabels + } + + MouseArea { + anchors.fill: parent + onClicked: value = !value + } +} diff --git a/imports/components/InShadow.qml b/imports/components/InShadow.qml new file mode 100755 index 0000000..2d64c2a --- /dev/null +++ b/imports/components/InShadow.qml @@ -0,0 +1,33 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +ShaderEffect { + anchors.fill: parent + property color color + property real radius: 16 + + fragmentShader: " +uniform lowp float radius; +uniform lowp float height; +uniform lowp float width; +uniform lowp float qt_Opacity; +uniform lowp vec4 color; +varying highp vec2 qt_TexCoord0; + +void main(void) { + lowp vec2 dist = min(qt_TexCoord0, vec2(1.0) - qt_TexCoord0); + // Border shadow + lowp float xval = smoothstep(0.0, radius, dist.x * width); + lowp float yval = smoothstep(0.0, radius, dist.y * height); + lowp float borderVal = sqrt(yval * xval) * 0.5 + 0.5; + + lowp vec4 borderColor = mix(color, vec4(0.0, 0.0, 0.0, 1.0), borderVal); + gl_FragColor = borderColor * qt_Opacity; +} + " +} diff --git a/imports/components/InsetShadow.qml b/imports/components/InsetShadow.qml new file mode 100755 index 0000000..6ad17cd --- /dev/null +++ b/imports/components/InsetShadow.qml @@ -0,0 +1,40 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +ShaderEffect { + anchors.fill: parent + property color color + property real radius: 100 + property real border: 20 + + fragmentShader: " +uniform lowp float radius; +uniform lowp float border; +uniform lowp float height; +uniform lowp float width; +uniform lowp float qt_Opacity; +uniform lowp vec4 color; +varying highp vec2 qt_TexCoord0; + +void main(void) { + lowp vec2 dist = min(qt_TexCoord0, vec2(1.0) - qt_TexCoord0); + // Border shadow + lowp float xval = smoothstep(0.0, border, dist.x * width); + lowp float yval = smoothstep(0.0, border, dist.y * height); + lowp float borderVal = sqrt(yval * xval) * 0.5 + 0.5; + // Inner shadow + xval = smoothstep(0.0, radius, dist.x * width); + yval = smoothstep(0.0, radius, dist.y * width); + lowp float innerVal = sqrt(yval * xval) * 0.5 + 0.5; + + lowp vec4 innerColor = mix(vec4(0.0, 0.0, 0.0, 0.5), color, innerVal); + lowp vec4 borderColor = mix(vec4(0.0, 0.0, 0.0, 1.0), innerColor, borderVal); + gl_FragColor = borderColor * qt_Opacity; +} + " +} diff --git a/imports/components/Label.qml b/imports/components/Label.qml new file mode 100755 index 0000000..e1e0b30 --- /dev/null +++ b/imports/components/Label.qml @@ -0,0 +1,27 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import utils 1.0 + +Item { + // Tracer {} + width: childrenRect.width + height: childrenRect.height + property alias text: text.text + property alias label: text + property alias fontSize: text.font.pixelSize + property alias fontColor: text.color + + Text { + id: text + color: "#ddd" + font.family: "Source Sans Pro" + font.pixelSize: 40 + font.capitalization: Font.AllUppercase + font.weight: Font.Bold + } +} diff --git a/imports/components/NumberPad.qml b/imports/components/NumberPad.qml new file mode 100755 index 0000000..b7763ca --- /dev/null +++ b/imports/components/NumberPad.qml @@ -0,0 +1,101 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import utils 1.0 + +Item { + id: root + height: childrenRect.height + property var letters: ["","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"] + property var bottomRow: ["*","0","#"] + + signal number(string number) + + Grid { + id: numberGrid + columns: 3 + spacing: 20 + + Repeater { + model: 9 + delegate: Item { + id: numberKey + width: (root.width - ( numberGrid.spacing*(numberGrid.columns-1)))/numberGrid.columns + height: numberKey.width * 0.8 + anchors.margins: 10 + + Rectangle { + id: shadowTarget + anchors.fill: parent + border.width: 1 + border.color: "white" + color: "#6653b5ce" + } + + Item { + height: childrenRect.height + width: parent.width + anchors.centerIn: parent + + Label { + anchors.horizontalCenter: parent.horizontalCenter + id: keypadNumber + text: index + 1 + } + + Label { + anchors.horizontalCenter: parent.horizontalCenter + id: keypadLetters + anchors.top: keypadNumber.bottom + fontSize: 30 + fontColor: "#53b5ce" + text: letters[index] + } + } + + MouseArea { + anchors.fill: parent + onClicked: root.number(keypadNumber.text) + } + } + } + + Repeater { + model: 3 + delegate: Item { + width: (root.width - ( numberGrid.spacing*(numberGrid.columns-1)))/numberGrid.columns + height: width * 0.8 + anchors.margins: 10 + + Rectangle { + id: shadowTarget + anchors.fill: parent + border.width: 1 + border.color: "white" + color: "#6653b5ce" + } + + Item { + height: childrenRect.height + width: parent.width + anchors.centerIn: parent + + Label { + anchors.horizontalCenter: parent.horizontalCenter + id: keypadNumber + text: bottomRow[index] + } + } + + MouseArea { + anchors.fill: parent + onClicked: root.number(keypadNumber.text) + } + } + } + } +} diff --git a/imports/components/OutShadow.qml b/imports/components/OutShadow.qml new file mode 100755 index 0000000..f4d8407 --- /dev/null +++ b/imports/components/OutShadow.qml @@ -0,0 +1,41 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import QtGraphicalEffects 1.0 + +Item { + id: root + + anchors.fill: parent + property alias color: shadow.color + property alias radius: shadow.radius + + Item { + id: shadowTarget + x: -radius + y: -radius + width: parent.width + 2 * radius + height: parent.height + 2 * radius + + Rectangle { + anchors.centerIn: parent + width: root.width + height: root.height + color: "black" + } + } + + DropShadow { + id: shadow + anchors.fill: shadowTarget + horizontalOffset: 0 + verticalOffset: 0 + radius: 16 + samples: 32 + source: shadowTarget + } +} diff --git a/imports/components/Switch.qml b/imports/components/Switch.qml new file mode 100755 index 0000000..6cd50c7 --- /dev/null +++ b/imports/components/Switch.qml @@ -0,0 +1,13 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 + +Switch { + width: 100 + height: 62 +} + diff --git a/imports/components/qmldir b/imports/components/qmldir new file mode 100755 index 0000000..57e4d2d --- /dev/null +++ b/imports/components/qmldir @@ -0,0 +1,16 @@ +#/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. +# * +# * This Source Code Form is subject to the terms of the Mozilla Public +# * License, v. 2.0. If a copy of the MPL was not distributed with this +# * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +AwesomeIcon 1.0 AwesomeIcon.qml +Box 1.0 Box.qml +BoxButton 1.0 BoxButton.qml +BoxHeading 1.0 BoxHeading.qml +DateTime 1.0 DateTime.qml +HexGrid 1.0 HexGrid.qml +HexSwitch 1.0 HexSwitch.qml +Label 1.0 Label.qml +NumberPad 1.0 NumberPad.qml +Button 1.0 Button.qml diff --git a/imports/radio/Radio.qml b/imports/radio/Radio.qml new file mode 100755 index 0000000..cea2e1a --- /dev/null +++ b/imports/radio/Radio.qml @@ -0,0 +1,6 @@ +import QtQuick 2.0 + +Item { + signal stopped + signal playing +} diff --git a/imports/radio/qmldir b/imports/radio/qmldir new file mode 100755 index 0000000..e334188 --- /dev/null +++ b/imports/radio/qmldir @@ -0,0 +1,2 @@ +Radio 1.0 Radio.qml +RadioPropertyItem 1.0 Radio.qml diff --git a/imports/system/App.qml b/imports/system/App.qml new file mode 100755 index 0000000..d7da73c --- /dev/null +++ b/imports/system/App.qml @@ -0,0 +1,29 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import system 1.0 + +FocusScope { + id: root + property string appId + anchors.fill: parent + visible: System.activeApp === appId + property bool hasKeyFocus: false + focus: visible + onFocusChanged: if (focus) hasKeyFocus = true + + Keys.onPressed: { + switch (event.key) { + case Qt.Key_Left: + case Qt.Key_Right: + root.hasKeyFocus = false + break + default: + break + } + } +} diff --git a/imports/system/System.qml b/imports/system/System.qml new file mode 100755 index 0000000..8e155fd --- /dev/null +++ b/imports/system/System.qml @@ -0,0 +1,15 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +pragma Singleton +import QtQuick 2.0 + +Item { + property string activeApp: "home" + property string activeSetting: "settings" + property bool showKeyboard: false + property bool showSettings: false +} diff --git a/imports/system/qmldir b/imports/system/qmldir new file mode 100755 index 0000000..afa0f56 --- /dev/null +++ b/imports/system/qmldir @@ -0,0 +1,8 @@ +#/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. +# * +# * This Source Code Form is subject to the terms of the Mozilla Public +# * License, v. 2.0. If a copy of the MPL was not distributed with this +# * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +singleton System 1.0 System.qml +App 1.0 App.qml diff --git a/imports/utils/Marker.qml b/imports/utils/Marker.qml new file mode 100755 index 0000000..c7a377e --- /dev/null +++ b/imports/utils/Marker.qml @@ -0,0 +1,60 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +import QtQuick 2.0 +import utils 1.0 + +Item { + id: root + width: 120 + height: 120 + property string text + signal clicked() + property alias pressed: area.pressed + property alias color: background.color + property alias fontSize: label.font.pixelSize + property bool fill: false + + Rectangle { + id: background + anchors.fill: parent + color: Style.backgroundColor + opacity: root.fill ? 1.0: 0.2 + } + + Rectangle { + id: frame + anchors.fill: parent + color: 'transparent' + border.color: Qt.darker(background.color, 1.4) + border.width: 2 + opacity: 1.0 + } + + + Rectangle { + anchors.fill: label + anchors.margins: -2 + color: Style.backgroundColor + opacity: root.text ? 1.0 : 0.0 + } + + Text { + id: label + anchors.centerIn: parent + font.pixelSize: 14 + color: Style.greyDarkColor + opacity: 0.75 + text: root.text + } + MouseArea { + id: area + anchors.fill: parent + onClicked: root.clicked() + onPressed: background.color = Qt.darker(background.color, 1.5) + onReleased: background.color = Qt.lighter(background.color, 1.5) + } +} diff --git a/imports/utils/Style.qml b/imports/utils/Style.qml new file mode 100755 index 0000000..ef544a6 --- /dev/null +++ b/imports/utils/Style.qml @@ -0,0 +1,37 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +pragma Singleton +import QtQuick 2.2 + +QtObject { + property bool debugMode: false + property bool debugFill: false + + // Primary colors + property color orangeLt: "#ffd38c" + property color orangeViv: "#fe9c00" + property color blueLt: "#b2f0ff" + property color blueViv: "#53b5ce" + // Secondary colors + property color yellowLt: "#ffffb2" + property color yellowViv: "#ffff00" + property color greenLt: "#cdffb2" + property color greenViv: "#59ff00" + // Neutral colors + property color white: "#ffffff" + property color grey: "#c4c4c4" + property color black: "#000000" + property color overlay: Qt.rgba(0, 0, 0, 0.8) + + function getGfxPath() { + return Qt.resolvedUrl("../assets/") + } + + function gfx(name) { + return Qt.resolvedUrl("../../doc/images/" + name ) + } +} diff --git a/imports/utils/qmldir b/imports/utils/qmldir new file mode 100755 index 0000000..c2df9de --- /dev/null +++ b/imports/utils/qmldir @@ -0,0 +1,8 @@ +#/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. +# * +# * This Source Code Form is subject to the terms of the Mozilla Public +# * License, v. 2.0. If a copy of the MPL was not distributed with this +# * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +singleton Style 1.0 Style.qml +Marker 1.0 Marker.qml diff --git a/imports/vehicle/ClimateModel.qml b/imports/vehicle/ClimateModel.qml new file mode 100755 index 0000000..9633f16 --- /dev/null +++ b/imports/vehicle/ClimateModel.qml @@ -0,0 +1,44 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +pragma Singleton + +import QtQuick 2.0 +import Automotive.ClimateControl 1.0 + +Item { + property real fanStepSize:1/255 //Represents the stepSize for a given Climate control. + property alias fanSpeed: fanControl.fanSpeedLevel + + property real temperatureStepSize:1/15 //0== 15c, 15 == 30c + + property alias leftTemp: leftFront.targetTemperature + property alias rightTemp: rightFront.targetTemperature + + ClimateControlItem { + id:fanControl + } + + ClimateControlItem { + id: leftFront + zone: 9 + } + + ClimateControlItem { + id: rightFront + zone: 5 + } + + function getRangeValue(inputVal,stepSize){ + if(inputVal > 0){ + return Math.ceil(inputVal/stepSize); + }else{ + return 0; + } + } + +} + diff --git a/imports/vehicle/FuelModel.qml b/imports/vehicle/FuelModel.qml new file mode 100755 index 0000000..fa064e2 --- /dev/null +++ b/imports/vehicle/FuelModel.qml @@ -0,0 +1,46 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +pragma Singleton + +import QtQuick 2.0 + +Item { + property bool metric: false + + function galToL(value) { + return (metric ? 3.78541 : 1) * value + } + + function mpgToLp100(value) { + return metric ? 235.214583571 / value : value + } + + property real baseTank: 25 + property real tankSize: galToL(baseTank) + property real level: tankSize * percentage * 0.01 + property real percentage: 100 + property real range: metric ? 100 * level / average : level * average + property real baseAverage: 20.7 + property real average: mpgToLp100(baseAverage + mpgDiff) + property real mpgDiff: 0 + + NumberAnimation on percentage { + from: 100 + to: 0 + duration: 5000 + loops: Animation.Infinite + easing.type: Easing.CosineCurve + } + + NumberAnimation on mpgDiff { + from: -2 + to: 2 + duration: 11200 + loops: Animation.Infinite + easing.type: Easing.CosineCurve + } +} diff --git a/imports/vehicle/PositionModel.qml b/imports/vehicle/PositionModel.qml new file mode 100755 index 0000000..00956aa --- /dev/null +++ b/imports/vehicle/PositionModel.qml @@ -0,0 +1,33 @@ +/* Copyright (C) 2015, Jaguar Land Rover, IoT.bzh. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +pragma Singleton + +import QtQuick 2.0 +import amb 0.1 + +Item { + property string nmeaString: nmea.value + property real satellites: satsUsed.value + + AutomotivePropertyItem { + id: nmea + + objectName: "GpsNmea" + propertyName: "Nmea" + + Component.onCompleted: nmea.connect(); + } + + AutomotivePropertyItem { + id: satsUsed + + objectName: "GpsSatsUsed" + propertyName: "SatsUsed" + + Component.onCompleted: satsUsed.connect(); + } +} diff --git a/imports/vehicle/SpeedModel.qml b/imports/vehicle/SpeedModel.qml new file mode 100755 index 0000000..03422b0 --- /dev/null +++ b/imports/vehicle/SpeedModel.qml @@ -0,0 +1,38 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +pragma Singleton + +import QtQuick 2.0 +import amb 0.1 + +Item { + property bool metric: false + + function mphToKph(value) { + return (metric ? 1.60934 : 1 ) * value + } + + property real max:Math.ceil(mphToKph(baseMaxSpeed)/30)*30 + property real baseMaxSpeed: 255 + property real textSpeed: prop.value + property real percentage: textSpeed / max * 100 + + AutomotivePropertyItem { + id: prop + + objectName: "VehicleSpeed" + propertyName: "Speed" + + Component.onCompleted: prop.connect(); + } + + Behavior on percentage { + SmoothedAnimation { + velocity: 100 + } + } +} diff --git a/imports/vehicle/TemperatureModel.qml b/imports/vehicle/TemperatureModel.qml new file mode 100755 index 0000000..2bfbbf4 --- /dev/null +++ b/imports/vehicle/TemperatureModel.qml @@ -0,0 +1,26 @@ +/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +pragma Singleton + +import QtQuick 2.0 + +Item { + property bool metric: true + + function unit(value) { + return celsiusToFahrenheit(value).toFixed(1) + "\u00b0" + (metric ? "C" : "F") + } + + function celsiusToFahrenheit(value) { + return (metric ? value : 1.8 * value + 32) + } + + property real indoor: 20.4 + property string indoorString: unit(indoor) + property real outdoor: 28.9 + property string outdoorString: unit(outdoor) +} diff --git a/imports/vehicle/qmldir b/imports/vehicle/qmldir new file mode 100755 index 0000000..6538e95 --- /dev/null +++ b/imports/vehicle/qmldir @@ -0,0 +1,11 @@ +#/* Copyright (C) 2015, Jaguar Land Rover. All Rights Reserved. +# * +# * This Source Code Form is subject to the terms of the Mozilla Public +# * License, v. 2.0. If a copy of the MPL was not distributed with this +# * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +singleton FuelModel 1.0 FuelModel.qml +singleton SpeedModel 1.0 SpeedModel.qml +singleton TemperatureModel 1.0 TemperatureModel.qml +singleton PositionModel 1.0 PositionModel.qml +singleton ClimateModel 1.0 ClimateModel.qml diff --git a/oe-sdk_crosscompile.cmake b/oe-sdk_crosscompile.cmake new file mode 100755 index 0000000..9669344 --- /dev/null +++ b/oe-sdk_crosscompile.cmake @@ -0,0 +1,20 @@ +# this toolchain file comes from gnuradio project +# https://raw.githubusercontent.com/intel-iot-devkit/upm/master/cmake/Toolchains/oe-sdk_cross.cmake + +set( CMAKE_SYSTEM_NAME Linux ) +#set( CMAKE_C_COMPILER $ENV{CC} ) +#set( CMAKE_CXX_COMPILER $ENV{CXX} ) +string(REGEX MATCH "sysroots/([a-zA-Z0-9]+)" CMAKE_SYSTEM_PROCESSOR $ENV{SDKTARGETSYSROOT}) +string(REGEX REPLACE "sysroots/" "" CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}) +set( CMAKE_CXX_FLAGS $ENV{CXXFLAGS} CACHE STRING "" FORCE ) +set( CMAKE_C_FLAGS $ENV{CFLAGS} CACHE STRING "" FORCE ) #same flags for C sources +set( CMAKE_LDFLAGS_FLAGS ${CMAKE_CXX_FLAGS} CACHE STRING "" FORCE ) #same flags for C sources +set( CMAKE_LIBRARY_PATH ${OECORE_TARGET_SYSROOT}/usr/lib ) +set( CMAKE_FIND_ROOT_PATH $ENV{OECORE_TARGET_SYSROOT} $ENV{OECORE_NATIVE_SYSROOT} ) +set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER ) +set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY ) +set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ) +set( CMAKE_INSTALL_PREFIX $ENV{OECORE_TARGET_SYSROOT}/usr CACHE STRING "" FORCE) +set( ORC_INCLUDE_DIRS $ENV{OECORE_TARGET_SYSROOT}/usr/include/orc-0.4 ) +set( ORC_LIBRARY_DIRS $ENV{OECORE_TARGET_SYSROOT}/usr/lib ) + diff --git a/qml/wifi-settings/components/images/back.png b/qml/wifi-settings/components/images/back.png new file mode 100755 index 0000000000000000000000000000000000000000..5cbf54c588d56d449ad514dd4c28fdfa9026e1f8 GIT binary patch literal 1237 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 literal 0 HcmV?d00001 diff --git a/qml/wifi-settings/components/images/wifi1.png b/qml/wifi-settings/components/images/wifi1.png new file mode 100755 index 0000000000000000000000000000000000000000..a680f546bf6952ca08fbc030b079c8d24f89d8c6 GIT binary patch literal 4934 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 literal 0 HcmV?d00001 diff --git a/qml/wifi-settings/components/images/wifi2-lock.png b/qml/wifi-settings/components/images/wifi2-lock.png new file mode 100755 index 0000000000000000000000000000000000000000..35573417933467237311fc5ae0829f5ac57cac41 GIT binary patch literal 6270 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 U__Q$8|D^yG1x@)XS@T!_0ju1KJ^%m! literal 0 HcmV?d00001 diff --git a/qml/wifi-settings/components/images/wifi2.png b/qml/wifi-settings/components/images/wifi2.png new file mode 100755 index 0000000000000000000000000000000000000000..82991119aeae283751df78aac6ebb222089b20c4 GIT binary patch literal 5106 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 I^&#TF0LlX$o&W#< literal 0 HcmV?d00001 diff --git a/qml/wifi-settings/components/images/wifi3-lock.png b/qml/wifi-settings/components/images/wifi3-lock.png new file mode 100755 index 0000000000000000000000000000000000000000..eefbc64c42ab7e23ef8590c02164fedb1124ad10 GIT binary patch literal 6204 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 literal 0 HcmV?d00001 diff --git a/qml/wifi-settings/components/images/wifi4-lock.png b/qml/wifi-settings/components/images/wifi4-lock.png new file mode 100755 index 0000000000000000000000000000000000000000..551ec76bc3814f4fb339f9397d855873e45d7a02 GIT binary patch literal 5753 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 Jp#lO6`X9@j5i0-y literal 0 HcmV?d00001 diff --git a/qml/wifi-settings/components/images/wifi4.png b/qml/wifi-settings/components/images/wifi4.png new file mode 100755 index 0000000000000000000000000000000000000000..baced2ef142b1acb1e2e3f816276348d1707fc71 GIT binary patch literal 4622 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 KLYbU-$o~KV?8}7! literal 0 HcmV?d00001 diff --git a/qml/wifi-settings/wifi-settings-app.qml b/qml/wifi-settings/wifi-settings-app.qml new file mode 100755 index 0000000..77990f7 --- /dev/null +++ b/qml/wifi-settings/wifi-settings-app.qml @@ -0,0 +1,625 @@ +/* Copyright 2016 ALPS ELECTRIC CO., LTD. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import QtQuick 2.0 +import QtQuick.Layouts 1.1 +import QtQuick.Dialogs 1.1 +import QtQuick.Controls 1.0 +import QtQuick.Controls.Styles 1.0 +import system 1.0 + +import "../../doc/" +import "../../imports/system/" + +ApplicationWindow { + + visible: true + //width: 768 + //height: 1024 + width: 1080 + height: 1920 + property string protocol: 'http://' + property string ipAddress: '127.0.0.1' + property string portNumber: Qt.application.arguments[1] + property string tokenString: Qt.application.arguments[2] + property string wifiAPI: '/api/wifi-manager/' + + property string wifiAPIpath: protocol + ipAddress + ':' + portNumber + wifiAPI + + function showRequestInfo(text) { + log.text = log.text + "\n" + text + console.log(text) + } + + Text { + id: log + anchors.fill: parent + anchors.margins: 10 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + //text: "log" + } + + GridLayout { + ExclusiveGroup { + id: wifiPowerGroup + } + visible: true + + id: seekDeviceType + //x: 400 + //y: 105 + anchors.top: parent.top + anchors.topMargin: 30 + + //anchors.bottomMargin: -30 //-20 + anchors.horizontalCenter: parent.horizontalCenter + //visible: !tuningMethodManualSwitchButton.checked + + //anchors.top: functionalityCheckBoxGrid.bottom + columns: 13 + rows: 1 + + columnSpacing: 60 + + Text { + text: qsTr("WiFi power") + } + + RadioButton { + id: wifiPowerOFF + exclusiveGroup: wifiPowerGroup + checked: true + onClicked: { + + console.log("OFF") + + request(wifiAPIpath + 'deactivate', function (o) { + + // log the json response + //showRequestInfo(o.responseText) + console.log(o.responseText) + }) + } + Text { + text: qsTr("OFF") + anchors.left: parent.left + anchors.leftMargin: 30 + } + } + + RadioButton { + id: wifiPowerON + exclusiveGroup: wifiPowerGroup + onClicked: { + + console.log("ON") + + request(wifiAPIpath + 'activate', function (o) { + + // log the json response + //showRequestInfo(o.responseText) + console.log(o.responseText) + }) + periodicRefresh.start() + } + + Text { + text: qsTr("ON") + anchors.left: parent.left + anchors.leftMargin: 30 + //color: checkBoxTextStyleBands.fontColor + //font.pixelSize: checkBoxTextStyleBands.fontSize + } + } + } + + + // onTechnologyEnabledChanged: { + // console.log("Wifi set to", technologyEnabled) + + // if (technologyEnabled == true) { + + // //start periodic refresh, only for now + // periodicRefresh.start() + + // request(wifiAPIpath + 'activate', function (o) { + + // // log the json response + // showRequestInfo(o.responseText) + // console.log(o.responseText) + // }) + // } else { + + // //console.log(networkPath) + // networkList.clear() + + // request(wifiAPIpath + 'deactivate', function (o) { + + // // log the json response + // showRequestInfo(o.responseText) + // console.log(o.responseText) + // }) + // } + // } + Text { + anchors.centerIn: parent + font.pixelSize: 40 + color: "white" + visible: false + text: "Wifi TB by ALCZ" + } + + function listWifiNetworks() { + console.log("test #4") + } + + ListModel { + id: networkList + } + + Rectangle { + id: buttonNetworkList + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + + anchors.margins: 10 + width: buttonNetworkListText.width + 10 + height: buttonScanText.height + 10 + border.width: buttonNetworkListMouseArea.pressed ? 2 : 1 + radius: 5 + antialiasing: true + color: "#222" + border.color: "white" + + Text { + color: "white" + id: buttonNetworkListText + anchors.centerIn: parent + text: "GET NETWORK LIST" + font.pixelSize: 40 + } + + ListModel { + id: listModel + } + + MouseArea { + id: buttonNetworkListMouseArea + anchors.fill: parent + + onClicked: { + log.text = "" + console.log("\n") + + networkList.clear() + + request(wifiAPIpath + 'scan_result', function (o) { + + // log the json response + console.log(o.responseText) + + // translate response into object + var jsonObject = eval('(' + o.responseText + ')') + + var jsonObjectNetworks = eval( + '(' + JSON.stringify(jsonObject.response) + ')') + + //console.log(jsonObject.response) + for (var i = 0; i < jsonObjectNetworks.length; i++) { + + networkList.append({ + number: jsonObjectNetworks[i].Number, + name: jsonObjectNetworks[i].ESSID, + strength: jsonObjectNetworks[i].Strength, + serviceState: jsonObjectNetworks[i].State, + security: jsonObjectNetworks[i].Security, + address: jsonObjectNetworks[i].IPAddress + }) + console.log(jsonObjectNetworks[i].Number, + jsonObjectNetworks[i].ESSID, + jsonObjectNetworks[i].Strength, + jsonObjectNetworks[i].State, + jsonObjectNetworks[i].Security, + jsonObjectNetworks[i].IPAddress) + } + }) + } + } + } + + Rectangle { + id: buttonScan + anchors.horizontalCenter: parent.horizontalCenter + anchors.bottom: parent.bottom + anchors.margins: 80 + width: buttonScanText.width + 10 + height: buttonScanText.height + 10 + border.width: mouseArea.pressed ? 2 : 1 + //radius: 5 + //antialiasing: true + //color: "black" + color: "#222" + border.color: "white" + + Text { + id: buttonScanText + anchors.centerIn: parent + text: "SCAN" + color: "white" + font.pixelSize: 40 + } + + MouseArea { + id: mouseArea + anchors.fill: parent + + onClicked: { + log.text = "" + console.log("\n") + + request(wifiAPIpath + 'scan', function (o) { + + // log the json response + //showRequestInfo(o.responseText) + console.log(o.responseText) + }) + } + } + } + + function request(url, callback) { + var xhr = new XMLHttpRequest() + xhr.onreadystatechange = (function (myxhr) { + + return function () { + + if (xhr.readyState == 4 && xhr.status == 200) + callback(myxhr) + } + })(xhr) + xhr.open('GET', url, false) + xhr.send('') + } + + /* function signalStrength(strength) { + if (strength < 30) + return "poor" + else if (strength >= 30 && strength < 50) + return "fair" + else if (strength >= 50 && strength < 70) + return "good" + else + return "excellent" }*/ + function securityType(security) { + + // if ((security === "[ psk ]") || (security === "[ psk wps ]")) + // return "secured" + // else + // return "unsecured" + if (security === "Open") + return "unsecured" + else + return "secured" + } + + Component { + id: wifiDevice + + Rectangle { + height: 150 + width: parent.width + color: "#222" + + Image { + anchors.top: parent.top + anchors.topMargin: 7 + anchors.left: parent.left + width: 70 + height: 50 + id: icon + source: { + if (securityType(security) === "unsecured") { + if (strength < 30) + source = "components/images/wifi1.png" + else if (strength >= 30 && strength < 50) + source = "components/images/wifi2.png" + else if (strength >= 50 && strength < 70) + source = "components/images/wifi3.png" + else + source = "components/images/wifi4.png" + } else { + if (strength < 30) + source = "components/images/wifi1-lock.png" + else if (strength >= 30 && strength < 50) + source = "components/images/wifi2-lock.png" + else if (strength >= 50 && strength < 70) + source = "components/images/wifi3-lock.png" + else + source = "components/images/wifi4-lock.png" + } + } + } + + Column { + anchors.left: icon.right + anchors.leftMargin: 10 + Text { + text: name + font.pointSize: 20 + font.bold: { + if ((serviceState === "ready") + || serviceState === "online") + font.bold = true + else + font.bold = false + } + + color: { + if ((serviceState === "ready") + || serviceState === "online") + color = "#00ff00" + else + color = "#ffffff" + } + } + + Text { + //text: serviceState + ", RSSI: " + strength + security + /* text: { + if ((serviceState === "ready") || serviceState === "online") + text = "signal " + signalStrength(strength) + ", " + "connected" + ", " + address + else + text = "signal " + signalStrength(strength) + ", " + securityType(security) + " network" + ", " + serviceState + }*/ + visible: ((serviceState === "ready") + || serviceState === "online") ? true : false + text: "connected, " + address + font.pointSize: 18 + color: "#ffffff" + font.italic: true + } + } + + Button { + id: connectButton + anchors.top: parent.top + anchors.right: parent.right + anchors.rightMargin: 5 + + width: 250 + + //text: "" + + //anchors.rightMargin: 40 + //buttonText: "Connect" + // style: ButtonStyle { + // label: Text { + // text: control.text + // color: "blue" + // text: control.text + // } + //} + + // buttonText: { + + // if ((serviceState === "ready") || serviceState === "online") + // buttonText = "Forget" + // else + // buttonText = "Connect"} + MouseArea { + anchors.fill: parent + + Text { + anchors.fill: parent + id: buttonTextLabel + font.pixelSize: 15 + font.bold: true + color: "black" + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + text: { + if ((serviceState === "ready") + || serviceState === "online") + text = "Forget" + else + text = "Connect" + } + } + + onClicked: { + + //connectButton.border.color = "steelblue" + if ((serviceState === "ready") + || serviceState === "online") { + + //means we are connected + console.log("Disconnecting from", index, " ,", name) + request(wifiAPIpath + 'disconnect?network=' + index, + function (o) { + + //showRequestInfo(o.responseText) + console.log(o.responseText) + }) + } else { + console.log("Conect to", index, " ,", name) + + //passwordDialog.open() + request(wifiAPIpath + 'connect?network=' + index, + function (o) { + + // log the json response + //showRequestInfo(o.responseText) + console.log(o.responseText) + }) + } + } + } + } + + Button { + id: passwordButton + anchors.top: parent.top + anchors.right: parent.right + width: 40 + visible: (securityType(security) === "unsecured") ? false : true + + //anchors.rightMargin: connectButton.width + 5 + //buttonText: "Connect" + text: { + "Key" //or some icon? + } + + MouseArea { + anchors.fill: parent + + onClicked: { + + //connectButton.border.color = "steelblue" + passwordInputText.visible = true + connectButton.visible = false + passwordValidateButton.visible = true + + System.showKeyboard = visible + + //passwordInputText.o + periodicRefresh.stop() + + var passkey = passwordInputText.text.valueOf() + + //var passkey = 'randompassword' + console.log("Disconnecting from", index, " ,", name) + } + } + } + + Button { + id: passwordValidateButton + anchors.top: parent.top + anchors.right: parent.right + anchors.rightMargin: connectButton.width + 5 + width: 40 + visible: false + + //anchors.rightMargin: connectButton.width + 5 + //buttonText: "Connect" + text: { + "ok" //or some icon? + } + + MouseArea { + anchors.fill: parent + + onClicked: { + //passwordInputText = "" + var passkey = passwordInputText.text.valueOf() + console.log("Validating", passkey) + System.showKeyboard = false + + console.log("Passkey is", passkey) + request(wifiAPIpath + 'security?passkey=' + passkey, + function (o) { + + //showRequestInfo(o.responseText) + console.log(o.responseText) + }) + passwordValidateButton.visible = false + passwordInputText.visible = false + connectButton.visible = true + + keyboard.currentString = "" + + periodicRefresh.start() + } + } + } + + TextInput { + id: passwordInputText + anchors.top: parent.top + anchors.right: parent.right + anchors.rightMargin: 5 + + font.pointSize: 15 + color: "#ffffff" + + width: connectButton.width + visible: false + text: keyboard.currentString + } + } + } + + ListView { + width: parent.width + anchors.top: parent.top + anchors.topMargin: 70 + anchors.bottom: parent.bottom + anchors.bottomMargin: 150 + model: networkList //WifiList {} + delegate: wifiDevice + clip: true + } + + //Timer for periodic refresh; this is BAD solution, need to figure out how to subscribe for events + Timer { + id: periodicRefresh + interval: 5000 // 5seconds + onTriggered: { + + networkList.clear() + + request(wifiAPIpath + 'scan_result', function (o) { + + // log the json response + console.log(o.responseText) + + // translate response into object + var jsonObject = eval('(' + o.responseText + ')') + + var jsonObjectNetworks = eval('(' + JSON.stringify( + jsonObject.response) + ')') + + console.log("WiFi list refreshed") + + //console.log(jsonObject.response) + for (var i = 0; i < jsonObjectNetworks.length; i++) { + + networkList.append({ + number: jsonObjectNetworks[i].Number, + name: jsonObjectNetworks[i].ESSID, + strength: jsonObjectNetworks[i].Strength, + serviceState: jsonObjectNetworks[i].State, + security: jsonObjectNetworks[i].Security, + address: jsonObjectNetworks[i].IPAddress + }) + // console.log(jsonObjectNetworks[i].Number, + // jsonObjectNetworks[i].ESSID, + // jsonObjectNetworks[i].Strength, + // jsonObjectNetworks[i].State, + // jsonObjectNetworks[i].Security) + } + }) + + start() + } + } + + Keyboard { + id: keyboard + y: System.showKeyboard ? parent.height - height : parent.height + width: parent.width + } +} diff --git a/wifi-api.c b/wifi-api.c new file mode 100755 index 0000000..2d9748f --- /dev/null +++ b/wifi-api.c @@ -0,0 +1,489 @@ +/* Copyright 2016 ALPS ELECTRIC CO., 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. +*/ + +/** + * file + * + * \brief Implementation of WiFi Binder for AGL's App Framework + * + * \author ALPS Electric + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +#include "wifi-api.h" +#include "wifi-connman.h" + +/* + * the interface to afb-daemon + */ +const struct afb_binding_interface *afbitf; + +static int need_password_flag = 0; +static int password_not_correct_flag = 0; + +char *passkey; +callback ptr_my_callback; + +GSList *wifi_list = NULL; + +/** + * \brief Read out the passkey from the use and pass it to Agent + * + * \todo Since I do not know how to subscribe for the events from framework, + * it is necessary first to register the password http://IP_ADDRESS:PORT/api/wifi-manager/security?passkey=mypassword. + * Then this function is called automatically. + * + * + * */ +void passkey_inserted(void) { + + printf("Passkey inserted: %s\n", passkey); + + if (passkey != NULL) { + + registerPasskey(passkey); + } else { + printf("Please enter the password first\n"); + + } +} + +/** + * \brief Notify user that password is necessary + * + * This function is called from the registered agent on RequestInput() call. + * \todo Subscribe for this event from GUI. + * + * */ +void ask_for_passkey(int password_rejected_flag) { + //TODO: show network we are asking password for + printf("Insert passkey.\n"); + + if (!password_rejected_flag) { + need_password_flag = 1; + password_not_correct_flag = 0; + //sleep(1); + passkey_inserted(); + + } + + else if (password_rejected_flag) { + need_password_flag = 1; + printf("Password not correct!\n"); + + } + +} + +/** + * \brief Insert passkey that will be used for connections to secured AP. + * + * \TODO Only temporary, user should enter the password on ask_for_passkey() callback + * + * */ +void wifi_insertpasskey(struct afb_req request) { + + const char *passkey_from_user; + + /* retrieves the argument, expects password string */ + passkey_from_user = afb_req_value(request, "passkey"); + + if (passkey_from_user == NULL) { + //TODO:better error message + afb_req_fail(request, "failed", "specify a security key"); + + } else { + + passkey = g_try_malloc0(256); + strcpy(passkey, passkey_from_user); + printf("Passkey is %s\n", passkey); + + } + + afb_req_success(request, NULL, NULL); +} + +/** + * \brief initialize the binder and activates the WiFi HW, should be called first + * + * This will fail if + * - agent for handling password requests cannot be registered + * - some error is returned from connman + * + * + * \return result of the request, either "success" or "failed" with description + */ +static void wifi_activate(struct afb_req request) /*AFB_SESSION_CHECK*/ +{ + json_object *jresp; + GError *error = NULL; + + if (ptr_my_callback == NULL) { + + printf("Registering callback\n"); + + ptr_my_callback = ask_for_passkey; + register_callback(ptr_my_callback); + + } + + jresp = json_object_new_object(); + json_object_object_add(jresp, "activation", json_object_new_string("on")); + + error = do_wifiActivate(); + + if (error == NULL) { + + afb_req_success(request, jresp, "Wi-Fi - Activated"); + + } else + + afb_req_fail(request, "failed", error->message); + +} + +/** + * \brief deinitialize the binder and activates the WiFi HW + * + * This will fail if + * - agent for handling password requests cannot be unregistered + * - some error is returned from connman + * + * + * \return result of the request, either "success" or "failed" with description + */ +static void wifi_deactivate(struct afb_req request) /*AFB_SESSION_CHECK*/ +{ + + json_object *jresp; + GError *error = NULL; + + ptr_my_callback = NULL; + + jresp = json_object_new_object(); + json_object_object_add(jresp, "deactivation", json_object_new_string("on")); + + error = do_wifiDeactivate(); + + if (error == NULL) { + + afb_req_success(request, jresp, "Wi-Fi - Activated"); + + } else + + afb_req_fail(request, "failed", error->message); +} + +/** + * \brief starts scan + * + * \return result of the request, either "success" or "failed" with description + */ +void wifi_scan(struct afb_req request) /*AFB_SESSION_NONE*/ +{ + GError *error = NULL; + + error = do_wifiScan(); + + if (error == NULL) { + + afb_req_success(request, NULL, "Wi-Fi - Scan success"); + + } else + + afb_req_fail(request, "failed", error->message); + +} + +/** + * \brief return network list + * + * + * \return result of the request, either "success" or "failed" with description + */ +void wifi_scanResult(struct afb_req request) /*AFB_SESSION_CHECK*/ +{ + struct wifi_profile_info *wifiProfile = NULL; + GSList *list = NULL; + GSList *holdMe = NULL; + wifi_list = NULL; + char *essid = NULL; + char *address = NULL; + char *security = NULL; + char *state = NULL; + int strength = 0; + int number = 0; + GError *error = NULL; + + error = do_displayScan(&wifi_list); /*Get wifi scan list*/ + if (error == NULL) { + json_object *my_array = json_object_new_array(); + + for (list = wifi_list; list; list = list->next) { /*extract wifi scan result*/ + wifiProfile = (struct wifi_profile_info *) list->data; + security = wifiProfile->Security.sec_type; + strength = wifiProfile->Strength; + //if (essid == NULL || security == NULL) + // continue; + + essid = wifiProfile->ESSID == NULL ? + "HiddenSSID" : wifiProfile->ESSID; + address = + wifiProfile->wifiNetwork.IPaddress == NULL ? + "unsigned" : wifiProfile->wifiNetwork.IPaddress; + state = wifiProfile->state; + //TODO: is there a case when security is NULL? + + json_object *int1 = json_object_new_int(number); + json_object *int2 = json_object_new_int(strength); + json_object *jstring1 = json_object_new_string(essid); + json_object *jstring2 = json_object_new_string(security); + json_object *jstring3 = json_object_new_string(address); + json_object *jstring4 = json_object_new_string(state); + + json_object *jresp = json_object_new_object(); + json_object_object_add(jresp, "Number", int1); + json_object_object_add(jresp, "Strength", int2); + json_object_object_add(jresp, "ESSID", jstring1); + json_object_object_add(jresp, "Security", jstring2); + json_object_object_add(jresp, "IPAddress", jstring3); + json_object_object_add(jresp, "State", jstring4); + + printf("The object json: %s\n", json_object_to_json_string(jresp)); + /*input each scan result into my_array*/ + json_object_array_add(my_array, jresp); + number += 1; + } + while (list != NULL) { + printf("Should be freed"); + holdMe = list->next; + g_free(list); + list = holdMe; + } + afb_req_success(request, my_array, "Wi-Fi - Scan Result is Displayed"); + } else + afb_req_fail(request, "failed", error->message); +} + +/** + * \brief connects to network + * + * \param[in] request number of network to connect to + * + * specify number of network to connect to obtained by scan_result() like this, + * http://IP_ADDRESS:PORT/api/wifi-manager/connect?network=1 + */ +void wifi_connect(struct afb_req request) { + + struct wifi_profile_info *wifiProfileToConnect = NULL; + + const char *network; + int network_index = 0; + GError *error = NULL; + GSList *item = NULL; + + /* retrieves the argument, expects the network number */ + network = afb_req_value(request, "network"); + + if (network == NULL) + //TODO:better error message + afb_req_fail(request, "failed", + "specify a network number to connect to"); + + else { + network_index = atoi(network); + printf("Joining network number %d\n", network_index); + + } + + //get information about desired network + item = g_slist_nth_data(wifi_list, network_index); + + if (item == NULL) { + //Index starts from 1 + printf("Network with number %d not found.\n", network_index + 1); + //TODO:better error message + afb_req_fail(request, "failed", "bad arguments"); + } + + else { + wifiProfileToConnect = (struct wifi_profile_info *) item; + printf("Name: %s, strength: %d, %s\n", wifiProfileToConnect->ESSID, + wifiProfileToConnect->Strength, + wifiProfileToConnect->NetworkPath); + //printf ("Connecting to %s\n", wifiProfileToConnect->NetworkPath); + } + error = do_connectNetwork(wifiProfileToConnect->NetworkPath); + + if (error == NULL) + afb_req_success(request, NULL, NULL); + + else if (password_not_correct_flag) { + need_password_flag = 0; + password_not_correct_flag = 0; + afb_req_fail(request, "password-incorrect", NULL); + } else if (need_password_flag) { + need_password_flag = 0; + afb_req_fail(request, "need-password", NULL); + + } else + afb_req_fail(request, "failed", error->message); +} + +/** + * \brief disconnect from network + * + * \param[in] request number of network to disconnect from + * + * specify number of network to disconnect from obtained by scan_result() like this, + * http://IP_ADDRESS:PORT/api/wifi-manager/discnnect?network=1 + */ +void wifi_disconnect(struct afb_req request) { + + struct wifi_profile_info *wifiProfileToConnect = NULL; + + const char *network; + int network_index = 0; + GError *error = NULL; + GSList *item = NULL; + + /* retrieves the argument, expects the network number */ + network = afb_req_value(request, "network"); + + if (network == NULL) + //TODO:better error message + afb_req_fail(request, "failed", + "specify a network number to disconnect from"); + + else { + network_index = atoi(network); + printf("Joining network number %d\n", network_index); + + } + + //get information about desired network + item = g_slist_nth_data(wifi_list, network_index); + + if (item == NULL) { + //Index starts from 1 + printf("Network with number %d not found.\n", network_index + 1); + //TODO:better error message + afb_req_fail(request, "failed", "bad arguments"); + } + + else { + wifiProfileToConnect = (struct wifi_profile_info *) item; + printf("Name: %s, strength: %d, %s\n", wifiProfileToConnect->ESSID, + wifiProfileToConnect->Strength, + wifiProfileToConnect->NetworkPath); + //printf ("Connecting to %s\n", wifiProfileToConnect->NetworkPath); + } + error = do_disconnectNetwork(wifiProfileToConnect->NetworkPath); + + if (error == NULL) + afb_req_success(request, NULL, NULL); + else + afb_req_fail(request, "failed", error->message); +} + +/** + * \brief return current status of connection + * + * \return result of the request, either "success" or "failed" with description + */ +void wifi_status(struct afb_req request) { + int error = 0; + wifi_list = NULL; + struct wifiStatus *status; + json_object *jresp = json_object_new_object(); + + status = g_try_malloc0(sizeof(struct wifiStatus)); + error = wifi_state(status); /*get current status of power and connection*/ + if (!error) { + if (status->state == 0) {/*Wi-Fi is OFF*/ + json_object_object_add(jresp, "Power", + json_object_new_string("OFF")); + //json_object_object_add(jresp, "Connection", json_object_new_string("Disconnected")); + printf("Wi-Fi OFF\n"); + } else {/*Wi-Fi is ON*/ + json_object_object_add(jresp, "Power", + json_object_new_string("ON")); + if (status->connected == 0) {/*disconnected*/ + json_object_object_add(jresp, "Connection", + json_object_new_string("Disconnected")); + printf("Wi-Fi ON - Disconnected \n"); + } else {/*Connected*/ + json_object_object_add(jresp, "Connection", + json_object_new_string("Connected")); + printf("Wi-Fi ON - Connected \n"); + } + } + afb_req_success(request, jresp, "Wi-Fi - Connection Status Checked"); + } else { + afb_req_fail(request, "failed", "Wi-Fi - Connection Status unknown"); + } +} + +void wifi_reconnect() { + /*TBD*/ +} + + + +/* + * array of the verbs exported to afb-daemon + */ +static const struct afb_verb_desc_v1 binding_verbs[] = { +/* VERB'S NAME SESSION MANAGEMENT FUNCTION TO CALL SHORT DESCRIPTION */ +{ .name = "activate", .session = AFB_SESSION_NONE, .callback = wifi_activate, .info = "Activate Wi-Fi" }, +{ .name = "deactivate", .session = AFB_SESSION_NONE, .callback = wifi_deactivate, .info ="Deactivate Wi-Fi" }, +{ .name = "scan", .session = AFB_SESSION_NONE, .callback = wifi_scan, .info = "Scanning Wi-Fi" }, +{ .name = "scan_result",.session = AFB_SESSION_NONE, .callback = wifi_scanResult, .info = "Get scan result Wi-Fi" }, +{ .name = "connect", .session = AFB_SESSION_NONE, .callback = wifi_connect, .info ="Connecting to Access Point" }, +{ .name = "status", .session = AFB_SESSION_NONE, .callback = wifi_status, .info ="Check connection status" }, +{ .name = "disconnect", .session = AFB_SESSION_NONE, .callback = wifi_disconnect, .info ="Disconnecting connection" }, +{ .name = "reconnect", .session = AFB_SESSION_NONE, .callback = wifi_reconnect, .info ="Reconnecting to Access Point" }, +{ .name = "security", .session = AFB_SESSION_NONE, .callback = wifi_insertpasskey, .info ="Insert passkey" }, + +{ .name = NULL } /* marker for end of the array */ +}; + +/* + * description of the binding for afb-daemon + */ +static const struct afb_binding binding_description = { +/* description conforms to VERSION 1 */ +.type = AFB_BINDING_VERSION_1, .v1 = { /* fills the v1 field of the union when AFB_BINDING_VERSION_1 */ +.prefix = "wifi-manager", /* the API name (or binding name or prefix) */ +.info = "wifi API", /* short description of of the binding */ +.verbs = binding_verbs /* the array describing the verbs of the API */ +} }; + +/* + * activation function for registering the binding called by afb-daemon + */ +const struct afb_binding *afbBindingV1Register( + const struct afb_binding_interface *itf) { + afbitf = itf; // records the interface for accessing afb-daemon + return &binding_description; // returns the description of the binding +} + diff --git a/wifi-api.h b/wifi-api.h new file mode 100755 index 0000000..429211b --- /dev/null +++ b/wifi-api.h @@ -0,0 +1,38 @@ +/* Copyright 2016 ALPS ELECTRIC CO., 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 WIFI_API_H +#define WIFI_API_H + +/* global plugin handle, should store everything we may need */ +typedef struct { + int devCount; +} pluginHandleT; + +/* private client context [will be destroyed when client leaves] */ +typedef struct { + unsigned char activate; + unsigned char connected; +} wifiCtxHandleT; + + +struct scan_list_info { + int number; + char *SSID; + char *Security; + int Strength; +}; + +#endif /* AUDIO_API_H */ diff --git a/wifi-connman.c b/wifi-connman.c new file mode 100755 index 0000000..74d2be7 --- /dev/null +++ b/wifi-connman.c @@ -0,0 +1,354 @@ +/* Copyright 2016 ALPS ELECTRIC CO., LTD. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include +#include +#include +#include +#include +//#include +#include +#include + +#include "wifi-api.h" +#include "wifi-connman.h" + +static __thread struct security_profile Security = { NULL, NULL, NULL, NULL, 0, + 0 }; + +int extract_values(GVariantIter *content, struct wifi_profile_info* wifiProfile) { + GVariant *var = NULL; + GVariant *subvar = NULL; + GVariantIter *array; + const gchar *key = NULL; + const gchar *subkey = NULL; + const gchar *value_char = NULL; + GVariantIter *content_sub; + int value_int; + gsize length; + + while (g_variant_iter_loop(content, "{sv}", &key, &var)) { + if (g_strcmp0(key, "Name") == 0) { + value_char = g_variant_get_string(var, &length); + wifiProfile->ESSID = (char *) value_char; + } else if (g_strcmp0(key, "Security") == 0) { + g_variant_get(var, "as", &content_sub); + while (g_variant_iter_loop(content_sub, "s", &value_char)) { + if (g_strcmp0(value_char, "none") == 0) + wifiProfile->Security.sec_type = "Open"; + else if (g_strcmp0(value_char, "wep") == 0) + wifiProfile->Security.sec_type = "WEP"; + else if (g_strcmp0(value_char, "psk") == 0) + wifiProfile->Security.sec_type = "WPA-PSK"; + else if (g_strcmp0(value_char, "ieee8021x") == 0) + wifiProfile->Security.sec_type = "ieee8021x"; + else if (g_strcmp0(value_char, "wpa") == 0) + wifiProfile->Security.sec_type = "WPA-PSK"; + else if (g_strcmp0(value_char, "rsn") == 0) + wifiProfile->Security.sec_type = "WPA2-PSK"; + else if (g_strcmp0(value_char, "wps") == 0) + wifiProfile->Security.wps_support = 1; + else + Security.sec_type = "Open"; + } + } else if (g_strcmp0(key, "Strength") == 0) { + value_int = (unsigned int) g_variant_get_byte(var); + wifiProfile->Strength = value_int; + } else if (g_strcmp0(key, "State") == 0) { + value_char = g_variant_get_string(var, &length); + wifiProfile->state = (char *) value_char; + } else if (g_strcmp0(key, "IPv4") == 0) { + g_variant_get(var, "a{sv}", &array); + while (g_variant_iter_loop(array, "{sv}", &subkey, &subvar)) { + if (g_strcmp0(subkey, "Method") == 0) { + value_char = g_variant_get_string(subvar, &length); + if (g_strcmp0(value_char, "dhcp") == 0) + wifiProfile->wifiNetwork.method = "dhcp"; + else if (g_strcmp0(value_char, "manual") == 0) + wifiProfile->wifiNetwork.method = "manual"; + else if (g_strcmp0(value_char, "fixed") == 0) + wifiProfile->wifiNetwork.method = "fix"; + else if (g_strcmp0(value_char, "off") == 0) + wifiProfile->wifiNetwork.method = "off"; + } else if (g_strcmp0(subkey, "Address") == 0) { + value_char = g_variant_get_string(subvar, &length); + wifiProfile->wifiNetwork.IPaddress = (char *) value_char; + } else if (g_strcmp0(subkey, "Netmask") == 0) { + value_char = g_variant_get_string(subvar, &length); + wifiProfile->wifiNetwork.netmask = (char *) value_char; + } + } + } + } + //printf ("SSID= %s, security= %s, Strength= %d, wps support= %d\n", wifiProfile->ESSID, wifiProfile->Security.sec_type, wifiProfile->Strength, wifiProfile->Security.wps_support); + return 0; +} + +int wifi_state(struct wifiStatus *status) { + GError *error = NULL; + GVariant *message = NULL; + GVariantIter *array; + GDBusConnection *connection; + GVariant *var = NULL; + const gchar *key = NULL; + gboolean value_bool; + + connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (connection == NULL) { + printf("GDBusconnection is NULL"); + return -1; + } + message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE, + CONNMAN_TECHNOLOGY_PATH, CONNMAN_TECHNOLOGY_INTERFACE, "GetProperties", + NULL, NULL, G_DBUS_CALL_FLAGS_NONE, + DBUS_REPLY_TIMEOUT, NULL, &error); + if (message == NULL) { + printf("message is NULL"); + return -1; + } + g_variant_get(message, "(a{sv})", &array); + while (g_variant_iter_loop(array, "{sv}", &key, &var)) { + if (g_strcmp0(key, "Powered") == 0) { + value_bool = g_variant_get_boolean(var); + if (value_bool) + status->state = 1; + else + status->state = 0; + } else if (g_strcmp0(key, "Connected") == 0) { + value_bool = g_variant_get_boolean(var); + if (value_bool) + status->connected = 1; + else + status->connected = 0; + } + } + g_variant_iter_free(array); + g_variant_unref(message); + + return 0; +} + +GError* do_wifiActivate() { + GVariant *params = NULL; + params = g_variant_new("(sv)", "Powered", g_variant_new_boolean(TRUE)); + GDBusConnection *connection; + GError *error = NULL; + + connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + + if (connection == NULL) { + printf("GDBusconnection is NULL"); + return error; + } + + //create the agent to handle security + error = create_agent(connection); + + if (error) + //This is fatal error, without agent secured networks can not be handled + return error; + + g_dbus_connection_call(connection, CONNMAN_SERVICE, + CONNMAN_WIFI_TECHNOLOGY_PREFIX, CONNMAN_TECHNOLOGY_INTERFACE, "SetProperty", + params, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, &error); + + if (error) { + printf("error: %d:%s\n", error->code, error->message); + + return error; + } + + else { + printf("Power ON succeeded\n"); + return NULL; + } + +} + +GError* do_wifiDeactivate() { + GVariant *params = NULL; + params = g_variant_new("(sv)", "Powered", g_variant_new_boolean(FALSE)); + GDBusConnection *connection; + GError *error = NULL; + + /*connection = gdbus_conn->connection;*/ + connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (connection == NULL) { + printf("GDBusconnection is NULL"); + return error; + } + + //create the agent to handle security + error = stop_agent(connection); + + if (error) { + printf("Error while unregistering the agent, ignoring."); + + } + + g_dbus_connection_call(connection, CONNMAN_SERVICE, + CONNMAN_WIFI_TECHNOLOGY_PREFIX, CONNMAN_TECHNOLOGY_INTERFACE, "SetProperty", + params, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL, &error); + + if (error) { + printf("error: %d:%s\n", error->code, error->message); + + return error; + } + + else { + printf("Power OFF succeeded\n"); + return NULL; + } +} + +GError* do_wifiScan() { + GDBusConnection *connection; + GError *error = NULL; + + /*connection = gdbus_conn->connection;*/ + connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (connection == NULL) { + printf("GDBusconnection is NULL"); + return error; + } + + g_dbus_connection_call(connection, CONNMAN_SERVICE, + CONNMAN_WIFI_TECHNOLOGY_PREFIX, CONNMAN_TECHNOLOGY_INTERFACE, "Scan", NULL, + NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, NULL, &error); + if (error) { + printf("error: %d:%s\n", error->code, error->message); + + return error; + } + + else { + printf("Scan succeeded\n"); + return NULL; + } +} + +GError* do_displayScan(GSList **wifi_list) { + GError *error = NULL; + GVariant *message = NULL; + GVariantIter *array; + gchar *object; + GVariantIter *content = NULL; + GDBusConnection *connection; + struct wifi_profile_info *wifiProfile = NULL; + + /*connection = gdbus_conn->connection;*/ + connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + if (connection == NULL) { + printf("GDBusconnection is NULL"); + return error; + } + message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE, + CONNMAN_MANAGER_PATH, CONNMAN_MANAGER_INTERFACE, "GetServices", NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + DBUS_REPLY_TIMEOUT, NULL, &error); + if (message == NULL) { + printf("message is NULL"); + return error; + } + g_variant_get(message, "(a(oa{sv}))", &array); + while (g_variant_iter_loop(array, "(oa{sv})", &object, &content)) { + if (g_str_has_prefix(object, + CONNMAN_WIFI_SERVICE_PROFILE_PREFIX) == TRUE) { + wifiProfile = g_try_malloc0(sizeof(struct wifi_profile_info)); + + extract_values(content, wifiProfile); + wifiProfile->NetworkPath = g_try_malloc0(strlen(object)); + strcpy(wifiProfile->NetworkPath, object); + printf( + "SSID= %s, security= %s, path= %s, Strength= %d, wps support= %d\n", + wifiProfile->ESSID, wifiProfile->Security.sec_type, + wifiProfile->NetworkPath, wifiProfile->Strength, + wifiProfile->Security.wps_support); + printf("method= %s, ip address= %s, netmask= %s\n", + wifiProfile->wifiNetwork.method, + wifiProfile->wifiNetwork.IPaddress, + wifiProfile->wifiNetwork.netmask); + *wifi_list = g_slist_append(*wifi_list, + (struct wifi_profile_info *) wifiProfile); + } + } + g_variant_iter_free(array); + + return NULL; +} + +GError* do_connectNetwork(gchar *networkPath) { + + printf("Connecting to: %s\n", networkPath); + + GVariant *message = NULL; + GError *error = NULL; + GDBusConnection *connection; + + connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + + message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE, + networkPath, CONNMAN_SERVICE_INTERFACE, "Connect", NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + DBUS_REPLY_TIMEOUT_SHORT, NULL, &error); + + //printf("message error %s\n", message); + //TODO: do we need retunrn value in message + + if (error) { + printf("do_connectNetwork error: %s\n", error->message); + return error; + } else { + printf("Connection succeeded\n"); + return NULL; + } + +} + +GError* do_disconnectNetwork(gchar *networkPath) { + + printf("Connecting to: %s\n", networkPath); + + GVariant *message = NULL; + GError *error = NULL; + GDBusConnection *connection; + + connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error); + + message = g_dbus_connection_call_sync(connection, CONNMAN_SERVICE, + networkPath, CONNMAN_SERVICE_INTERFACE, "Disconnect", NULL, NULL, + G_DBUS_CALL_FLAGS_NONE, + DBUS_REPLY_TIMEOUT, NULL, &error); + + //TODO: do we need return value in message + + if (error) { + printf("error: %s\n", error->message); + return error; + } else { + printf("Disconnected\n"); + return NULL; + } + +} + +void registerPasskey(gchar *passkey) { + + printf("Passkey: %s\n", passkey); + sendPasskey(passkey); + +} + diff --git a/wifi-connman.h b/wifi-connman.h new file mode 100755 index 0000000..bd83821 --- /dev/null +++ b/wifi-connman.h @@ -0,0 +1,126 @@ +/* Copyright 2016 ALPS ELECTRIC CO., LTD. +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +//#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Maximum Profile Count */ +#define CONNMAN_MAX_BUFLEN 512 + +#define CONNMAN_STATE_STRLEN 16 + +#define CONNMAN_SERVICE "net.connman" +#define CONNMAN_MANAGER_INTERFACE CONNMAN_SERVICE ".Manager" +#define CONNMAN_TECHNOLOGY_INTERFACE CONNMAN_SERVICE ".Technology" +#define CONNMAN_SERVICE_INTERFACE CONNMAN_SERVICE ".Service" +#define CONNMAN_PROFILE_INTERFACE CONNMAN_SERVICE ".Profile" +#define CONNMAN_COUNTER_INTERFACE CONNMAN_SERVICE ".Counter" +#define CONNMAN_ERROR_INTERFACE CONNMAN_SERVICE ".Error" +#define CONNMAN_AGENT_INTERFACE CONNMAN_SERVICE ".Agent" + +#define CONNMAN_MANAGER_PATH "/" +#define CONNMAN_PATH "/net/connman" +#define CONNMAN_TECHNOLOGY_PATH "/net/connman/technology/wifi" + +/** ConnMan technology and profile prefixes for ConnMan 0.78 */ + +#define CONNMAN_WIFI_TECHNOLOGY_PREFIX CONNMAN_PATH "/technology/wifi" +#define CONNMAN_WIFI_SERVICE_PROFILE_PREFIX CONNMAN_PATH "/service/wifi_" + +#define WIFI_ESSID_LEN 128 +#define WIFI_MAX_WPSPIN_LEN 8 +#define WIFI_BSSID_LEN 17 +#define WIFI_MAX_PSK_PASSPHRASE_LEN 65 +#define WIFI_MAX_WEP_KEY_LEN 26 + +#define AGENT_PATH "/net/connman/Agent" +#define AGENT_SERVICE "org.agent" + +#define DBUS_REPLY_TIMEOUT (120 * 1000) +#define DBUS_REPLY_TIMEOUT_SHORT (10 * 1000) + + +struct gdbus_connection_data_s{ + GDBusConnection *connection; + int conn_ref_count; + GCancellable *cancellable; + void *handle_libnetwork; +}; + + +struct wifiStatus { + unsigned int state; + unsigned int connected; +}; + +struct security_profile{ + char *sec_type; + char *enc_type; + char *wepKey; + char *pskKey; + unsigned int PassphraseRequired; + unsigned int wps_support; +}; + +struct wifi_net{ + char *method; + char *IPaddress; + char *netmask; +}; + +struct wifi_profile_info{ + char *ESSID; + char *NetworkPath; + char *state; + unsigned int Strength; + struct security_profile Security; + struct wifi_net wifiNetwork; +}; + +//typedef void(*callback)(void); +typedef void(*callback)(int password_rejected_flag); +void register_callback(callback ptr); + + +int extract_values(GVariantIter *content, struct wifi_profile_info* wifiProfile); +int wifi_state(struct wifiStatus *status); +GError* do_wifiActivate(); +GError* do_wifiDeactivate(); +GError* do_wifiScan(); +GError* do_displayScan(GSList **wifi_list); +GError* do_connectNetwork(gchar *object); +GError* do_disconnectNetwork(gchar *object); + +GError* create_agent(GDBusConnection *connection); +GError* stop_agent(GDBusConnection *connection); + + +void registerPasskey(gchar *object); +GError* sendPasskey(gchar *object); + +GError* do_initialize(); +GError* do_initialize(); + + + + + -- 2.16.6