summaryrefslogtreecommitdiffstats
path: root/docs/4_APIs_and_Services/4.7_HMI_Framework/4.7.1_Home_Screen_Developer_Guide.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/4_APIs_and_Services/4.7_HMI_Framework/4.7.1_Home_Screen_Developer_Guide.md')
-rw-r--r--docs/4_APIs_and_Services/4.7_HMI_Framework/4.7.1_Home_Screen_Developer_Guide.md532
1 files changed, 532 insertions, 0 deletions
diff --git a/docs/4_APIs_and_Services/4.7_HMI_Framework/4.7.1_Home_Screen_Developer_Guide.md b/docs/4_APIs_and_Services/4.7_HMI_Framework/4.7.1_Home_Screen_Developer_Guide.md
new file mode 100644
index 0000000..50baf6d
--- /dev/null
+++ b/docs/4_APIs_and_Services/4.7_HMI_Framework/4.7.1_Home_Screen_Developer_Guide.md
@@ -0,0 +1,532 @@
+---
+edit_link: ''
+title: Home Screen Developer Guide
+origin_url: >-
+ https://git.automotivelinux.org/apps/agl-service-homescreen/plain/doc/ApplicationGuide.md?h=master
+---
+
+<!-- WARNING: This file is generated by fetch_docs.js using /home/boron/Documents/AGL/docs-webtemplate/site/_data/tocs/apis_services/master/agl-service-homescreen-developer-guides-api-services-book.yml -->
+
+**HomeScreen GUI Application / HomeScreen Service Guide**
+====
+ Revision: 0.1
+ TOYOTA MOTOR CORPORATION
+ Advanced Driver Information Technology
+ 13th/May/2019
+
+* * *
+
+## Table of content
+- [Target reader of this document](#target-reader-of-this-document)
+- [Overview](#overview)
+- [Getting Start](#getting-start)
+ - [Supported environment](#supported-environment)
+ - [Build](#build)
+ - [Configuring](#configuring)
+ - [How to call HomeScreen APIs from your Application?](#how-to-call-homescreen-apis-from-your-application)
+- [Supported usecase](#supported-usecase)
+- [Software Architecture](#software-architecture)
+- [API reference](#api-reference)
+- [Sequence](#sequence)
+ - [Initialize](#initialize-sequence)
+ - [Tap Shortcut(deprecated)](#tap-shortcut-sequence)
+ - [ShowWindow](#showwindow-sequence)
+ - [On Screen Message / Reply Sequence(deprecated)](#on-screen-message-reply-sequence)
+ - [ShowOnscreen](#showonscreen-sequence)
+ - [ShowNotification](#shownotification-sequence)
+ - [ShowInformation](#showinformation-sequence)
+- [Sample code](#sample-code)
+- [Limitation](#limitation)
+- [Next Plan](#next-plan)
+- [Appendix](#appendix)
+
+* * *
+
+## Target reader of this document
+Application developer whose software uses HomeScreen.
+
+* * *
+
+## Overview
+HomeScreen is built with a GUI application created with Qt(referred as HomeScreenGUI), and a service running on afb-daemon (referred as HomeScreenBinder).
+HomeScreen can start/switch applications run in AGL, also displays information such as onscreen messages.
+
+You can find these projects in AGL gerrit.
+
+- [homescreen(HomeScreenGUI)](https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/homescreen)
+- [launcher(LauncherGUI)](https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/launcher)
+- [agl-service-homescreen(HomeScreenBinder's binding library)](https://gerrit.automotivelinux.org/gerrit/#/admin/projects/apps/agl-service-homescreen)
+- [libhomescreen(library for application to communication with HomeScreenBinder]( https://gerrit.automotivelinux.org/gerrit/#/admin/projects/src/libhomescreen)
+- [libqthomescreen(library for qt application to communication with HomeScreenBinder based on libhomescreen)](https://gerrit.automotivelinux.org/gerrit/#/admin/projects/src/libqthomescreen)
+
+Also HomeScreenGUI is using libwindowmanager.
+
+* * *
+
+## Getting Start
+
+### Supported environment
+
+| Item | Description |
+|:------------|:----------------------------------|
+| AGL version | Grumpy Guppy |
+| Hardware | Renesas R-Car Starter Kit Pro(M3) |
+
+
+### Build
+
+**Download recipe**
+
+```
+$ mkdir WORK
+$ cd WORK
+$ repo init -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo
+$ repo sync
+
+```
+
+Then you can find the following recipes.
+
+* `meta-agl-demo/recipes-demo-hmi/homescreen`
+
+* `meta-agl-devel/meta-hmi-framework/recipes-demo-hmi/launcher`
+
+* `meta-agl-demo/recipes-demo-hmi/agl-service-homescreen`
+
+* `meta-agl-demo/recipes-demo-hmi/libhomescreen`
+
+* `meta-agl-devel/meta-hmi-framework/recipes-demo-hmi/qlibhomescreen`
+
+
+**Bitbake**
+
+```
+$ source meta-agl/scripts/aglsetup.sh -m m3ulcb agl-demo agl-devel agl-appfw-smack agl-hmi-framework
+$ bitbake agl-demo-platform
+```
+
+### Configuring
+To use HomeScreen API, an application shall paste the following configuration definition into "config.xml" of application.
+
+```
+<feature name="urn:AGL:widget:required-api">
+ <param name="homescreen" value="ws" />
+ <param name="windowmanager" value="ws" />
+</feature>
+```
+
+### How to call HomeScreen APIs from your Application?
+HomeScreen provides a library which is called "libhomescreen".
+This library treats "json format" as API calling.
+For example, if an application wants to call "showWIndow()" API, then you should implement as below.
+
+At first the application should create the instance of libhomescreen.
+
+```
+LibHomeScreen* libhs;
+libhs = new LibHomeScreen();
+libhs->init(port, token);
+```
+
+The port and token is provided by Application Framework
+
+Execute the "showWindow()" function.
+
+```
+libhs->showWindow("application_id", "display_area");
+```
+
+Regarding the detail of showWindow() API, please refer [this](#homescreen-specific-api) section.
+The first parameter is the appid of application which want to display,liked "dashboard".
+And the second parameter corresponds to display_area which defined by windowmanager,usually "normal",
+so in this case "showWindow" the two parameters are proper string.
+
+See also our [Sample code](#sample-code).
+
+* * *
+
+## Supported usecase
+1. HomeScreenGUI sending showWindow event to applications
+ - Applications using libhomescreen to subscribe the showWindow event,
+ HomeScreenGUI will send showWindow event to applications.
+2. Display OnScreen messages(deprecated)
+ - Applications sending OnScreen messages to homescreen-service, and OnScreenAPP
+ will get these message and display.
+3. Get OnSreen Reply event(deprecated)
+ - When OnScreen messages is displaying, OnScreenAPP will send a reply event to applications.
+4. Display OnScreen by showWindow
+ - When application who want to show OnScreen,it can call "showWindow",then OnScreenApp will
+ display request OnScreen.
+5. Hide OnScreen by hideWindow
+ - When application who want to hide OnScreen which is displaying,it can call "hideWindow",then OnScreenApp
+ will hide OnScreen.
+6. Send OnScreen Reply by replyShowWindow
+ - When user touch the button of OnScreen, OnScreenApp can call "relplyShowWindow" to send reply information
+ back to application.
+7. Show Notification on HomeScreenGUI
+ - When application who want to display a notification,it can call "showNotification",then HomeScreenGUI will
+ display the notification contents on the screen top area.
+8. Show Information on HomeScreenGUI
+ - When application who want to display a information,it can call "showInformation",then HomeScreenGUI will
+ display the information contents on the screen bottom area.
+
+* * *
+
+## Software Architecture
+The architecture of HomeScreen is shown below.
+HomeScreen is the service designed to be used by multiple applications.
+Therefore HomeScreen framework consists on two binder layers. Please refer the following figure.
+The upper binder is for application side security context for applications. The lower binder is for servide side security context.
+Usually application side binder has some business logic for each application, so the number of binders depend on the number of applications which use HomeScreen.
+On the other hand, regarding lower binder there is only one module in the system. This binder receives all messages from multiple applications (in detail, it comes from upper layer binder).
+
+The communication protocols between libhomescreen and upper binder, upper binder and lower binder(homescreen-binding) are WebSocket.
+
+![software-stack.png](parts/software-stack.png)
+
+* * *
+
+## API reference
+"libhomescreen" and "agl-service-homescreen" provides several kinds of APIs.
+
+### HomeScreen Specific API
+
+- LibHomeScreen::init (const int port, const std::string &token)
+```
+ port [in] : This argument should be specified to the port number to be used for WebSocket
+ token [in] : This argument should be specified to the token to be used for WebSocket
+
+ Create connection to homescreen-service by port and token which provided by
+ application framework. This API must be called before calling other api.
+```
+- LibHomeScreen::tapShortcut(const char *application_id)
+```
+ application_id [in] : Tapped application id (label)
+
+ This api is deprecated, recommend using showWindow.
+```
+- LibHomeScreen::onScreenMessage(const char *display_message)
+```
+ display_message [in] : message for display
+
+ This api is deprecated, recommend using showWindow/hideWindow to call onscreenapp.
+```
+- LibHomeScreen::onScreenReply(const char *reply_message)
+```
+ reply_message [in] : message for reply
+
+ This api is deprecated, recommend using replyShowWindow.
+```
+- LibHomeScreen::registerCallback(void(*event_cb)(const std::string &event, struct json_object *event_contents), void(*reply_cb)(struct json_object *reply_contents), void(*hangup_cb)(void)=nullptr)
+```
+ event_cb [in] : This argument should be specified to the callback for subscribed event
+ reply_cb [in] : This argument should be specified to the reply callback for call function
+ hangup_cb [in] : This argument should be specified to the hangup callback for call function
+
+ This api is deprecated, recommend using set_event_handler.
+```
+- LibHomeScreen::set_event_handler(enum EventType et, handler_func f)
+```
+ et [in] : event name
+ f [in] : event handler
+
+ Setting event handler for Homescreen-Service Event.
+```
+- LibHomeScreen::call(const string& verb, struct json_object* arg)
+- LibHomeScreen::call(const char* verb, struct json_object* arg)
+```
+ verb [in] : This argument should be specified to the API name (e.g. "tap_shortcut")
+ arg [in] : This argument should be specified to the argument of API.
+ And this argument expects JSON object
+
+ Call homescreen-service verb.
+```
+- LibHomeScreen::subscribe(const string& event_name)
+```
+ event_name [in] : This argument should be specified to the event name
+
+ Subscribe homescreen-service event. Deprecated, recommend using set_event_handler.
+```
+- LibHomeScreen::unsubscribe(const string& event_name)
+```
+ event_name [in] : This argument should be specified to the event name
+
+ Unsubscribe homescreen-service event. Deprecated, recommend using set_event_handler.
+```
+- LibHomeScreen::showWindow(const char* application_id, json_object* json)
+```
+ application_id [in] : This argument should be specified to the application's id
+ json [in] : This argument should be specified to the json parameters
+
+ Request to show the window of application_id, and set display area in json liked
+ {"area":"normal.full"}.
+```
+- LibHomeScreen::hideWindow(const char* application_id)
+```
+ application_id [in] : This argument should be specified to the application's id
+
+ Request to hide the window of application_id.
+```
+- LibHomeScreen::replyShowWindow(const char* application_id, json_object* json)
+```
+ application_id [in] : This argument should be specified to the onscreen reply to applilcation id
+ json [in] : This argument should be specified to the json parameters
+
+ Post reply information to who called showWindow.
+```
+- LibHomeScreen::showNotification(json_object* json)
+```
+ json [in] : This argument should be specified to the json parameters.
+
+ Post Notification to Homescreen which will display at top area of Homescreen.
+```
+- LibHomeScreen::showInformation(json_object* json)
+```
+ json [in] : This argument should be specified to the json parameters.
+
+ Post Information to Homescreen which will display at bottom area of Homescreen.
+```
+
+* * *
+
+## Sequence
+
+### Initialize Sequence
+![initialize-set-event-handler](parts/initialize-set-event-handler.svg)
+
+### Tap Shortcut Sequence
+![tap_shortcut.svg](parts/tap_shortcut.svg)
+
+### ShowWindow Sequence
+![showWindow.svg](parts/showWindow.svg)
+
+### On Screen Message / Reply Sequence
+![on_screen_message.svg](parts/on_screen_message.svg)
+
+### ShowOnScreen Sequence
+![showOnScreen.svg](parts/showOnScreen.svg)
+
+### ShowNotification Sequence
+![showNotification.svg](parts/showNotification.svg)
+
+### ShowInformation Sequence
+![showInformation.svg](parts/showInformation.svg)
+
+* * *
+
+## Sample code
+You can find sample implementation of HomeScreen as below.
+
+* `libhomescreen/sample/simple-egl`
+
+* `libhomescreen/sample/template`
+
+* * *
+
+## Limitation
+None.
+
+* * *
+
+## Next Plan
+None.
+
+* * *
+
+## Appendix
+
+```
+@startuml
+
+title Application initialization phase
+
+entity App
+entity HomeScreenBinder
+entity HomeScreenGUI
+
+App->HomeScreenBinder: init(port, token)
+App->HomeScreenBinder: set_event_handler()
+
+note over HomeScreenBinder
+ setup event handler the App wishes to receive
+ ・LibHomeScreen::Event_ShowWindow
+ ・LibHomeScreen::Event_HideWindow
+ ・LibHomeScreen::Event_ReplyShowWindow
+end note
+
+@enduml
+```
+
+```
+@startuml
+title Application Callback Event TapShortcut phase
+entity App
+entity HomeScreenBinder
+entity HomeScreenGUI
+App->HomeScreenBinder: set_event_handler()
+
+note over App
+ LibHomeScreen::Event_TapShortcut
+end note
+
+HomeScreenGUI->HomeScreenBinder: tapShortcut(application_id)
+HomeScreenBinder->App: event_handler(application_id)
+@enduml
+```
+
+```
+@startuml
+
+title Application callback event showWindow phase
+
+actor user
+entity "homescreen-service" as hss
+entity launcher
+entity App
+entity windowmanager as wm
+
+user-->launcher: tap app's icon
+launcher->hss: showWindow()
+note over hss,App
+{"application_id":"tapped application id", "parameter":{"area":"display area", ...}}
+end note
+hss->App: push showWindow event
+App->wm: activateWindow("application_name","display area")
+wm-->App: push syncDraw event
+App->App: display
+
+@enduml
+```
+
+```
+@startuml
+title Application Callback Event On Screen Message / Reply phase
+entity App
+entity HomeScreenBinder
+entity HomeScreenGUI
+
+HomeScreenGUI->HomeScreenBinder: set_event_handler()
+
+note over HomeScreenGUI
+ LibHomeScreen::Event_OnScreenMessage
+end note
+
+
+App->HomeScreenBinder: set_event_handler()
+
+note over App
+ LibHomeScreen::Event_OnScreenReply
+end note
+
+App->HomeScreenBinder: onScreenMessage(display_message)
+HomeScreenBinder->HomeScreenGUI: event_handler(display_message)
+HomeScreenGUI->HomeScreenBinder: onScreenReply(reply_message)
+HomeScreenBinder->App: event_handler(reply_message)
+@enduml
+```
+
+```
+@startuml
+
+title show/hide onscreen phase
+
+actor user
+entity "homescreen-service" as hss
+entity App
+entity onscreenapp
+entity windowmanager as wm
+
+== show onscreen ==
+user->App: the operation request onscreen
+App->hss: showWindow()
+note over App,hss
+{"application_id":"onscreenapp",
+"parameter":{"area":"display area", "file":"qml file path",
+"data":{"the datas to onscreen qml"}}}
+end note
+
+hss->onscreenapp: push showWindow event
+note over hss,onscreenapp
+{"application_id":"onscreenapp",
+"parameter":{"area":"display area", "file":"qml file path",
+"data":{"the datas to onscreen qml"},
+<font color=red >"replyto":"caller application id"
+}}
+end note
+
+onscreenapp->onscreenapp: get and save parameters
+onscreenapp->wm: activateWindow("onscreeapp", "display area")
+alt can show
+wm-->onscreenapp: push syncDraw event
+onscreenapp->wm: endDraw("onscreeapp")
+onscreenapp->onscreenapp: load and display qml file
+else can't show
+note over onscreenapp,wm
+do nothing
+end note
+end
+
+== hide onscreen ==
+
+user->onscreenapp: tap onscreen's button
+onscreenapp->hss: replyShowWindow()
+note over onscreenapp,hss
+{"application_id":"the application id who called onscreenapp",
+"parameter": {"buttonName": "VOLUME_UP", "buttonPressMode": "shortPress", "buttonPressState": "release"}}
+end note
+hss->App: push replyShowWindow event
+App->App: call reply function
+App->hss: hideWindow("onscreenapp")
+hss->onscreenapp: push hideWindow event
+note over hss,onscreenapp
+{"application_id":"request hideWindow application id"}
+end note
+onscreenapp->wm: deactivateWindow("onscreenapp");
+onscreenapp->onscreenapp: hide window
+
+@enduml
+```
+
+```
+@startuml
+
+title show notification on HomeScreen top area
+
+entity "homescreen-service" as hss
+entity homescreen
+entity App
+
+App->hss: showNotification()
+note over App,hss
+{"icon":"display icon", "text":"display text"}
+end note
+hss-> homescreen: push showNotification event
+note over hss,homescreen
+{"application_id":"request application id",
+"parameter":{"icon":"display icon", "text":"display text"}}
+end note
+
+homescreen->homescreen: display notification message 3s
+
+@enduml
+```
+
+```
+@startuml
+
+title show information on HomeScreen bottom area
+
+entity "homescreen-service" as hss
+entity homescreen
+entity App
+
+App->hss: showInformation()
+note over hss
+{"info":"display information"}
+end note
+hss-> homescreen: push showInformation event
+
+homescreen->homescreen: display information message 3s
+
+@enduml
+```