aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzheng_wenlong <wenlong_zheng@nexty-ele.com>2018-11-20 15:46:47 +0900
committerzheng_wenlong <wenlong_zheng@nexty-ele.com>2018-11-20 15:46:47 +0900
commitc1d5b18cd9d3318c5dcc2a071a7250f8ab74745c (patch)
tree8997a62935427d006b401d4663a769ed522d0413
parent9b4dec590ffb9ac99c7ce847b32e9663334d6f57 (diff)
add ces2019 source
-rw-r--r--CMakeLists.txt31
-rw-r--r--LICENSE.MIT20
-rw-r--r--README.md10
-rwxr-xr-xchange_to_slave_mode.sh5
-rw-r--r--client/README39
-rw-r--r--client/communication.cpp86
-rw-r--r--client/communication.h64
-rw-r--r--client/extra/WindowManagerSampleApp.qml47
-rw-r--r--client/extra/WindowManagerSampleApp.qml.sample252
-rw-r--r--client/main.cpp99
-rw-r--r--client/main.cpp.sample292
-rw-r--r--client/qlibwindowmanager.cpp56
-rw-r--r--client/qlibwindowmanager.h69
-rw-r--r--client/qmlWindowManagerSampleApp.pro20
-rw-r--r--client/sample.qrc5
-rw-r--r--conf/areas.json85
-rwxr-xr-xdeploy.sh11
-rw-r--r--doc/ApplicationGuide.md1187
-rw-r--r--doc/parts/deactivate_window.pngbin44618 -> 0 bytes
-rw-r--r--doc/parts/example_split.pngbin223071 -> 0 bytes
-rw-r--r--doc/parts/hmi_framework_designed_seq_toyota.pngbin54198 -> 0 bytes
-rw-r--r--doc/parts/request_role.pngbin26503 -> 0 bytes
-rw-r--r--doc/parts/software-stack.pngbin28935 -> 0 bytes
-rw-r--r--doc/parts/state_change_example.pngbin182038 -> 0 bytes
-rw-r--r--doc/parts/wm_area.pngbin12427 -> 0 bytes
-rw-r--r--doc/parts/wm_layer_stack.pngbin33482 -> 0 bytes
-rw-r--r--layers.json (renamed from conf/layers.json)33
-rw-r--r--package/root/config.xml5
-rw-r--r--policy_manager/CMakeLists.txt18
-rw-r--r--policy_manager/config/layouts.json371
-rw-r--r--policy_manager/config/roles.json (renamed from policy_manager/db/roles.db)14
-rw-r--r--policy_manager/config/roles.json.zipc (renamed from policy_manager/db/roles.db.zipc)2
-rw-r--r--policy_manager/config/roles.json.zipc.split151
-rw-r--r--policy_manager/db/roles.db.zipc.split60
-rw-r--r--policy_manager/db/states.db174
-rw-r--r--policy_manager/policy_manager.cpp450
-rw-r--r--policy_manager/policy_manager.hpp45
-rw-r--r--policy_manager/stm/stm.c74
-rw-r--r--policy_manager/stm/stm.h88
-rw-r--r--policy_manager/stm/stub/stm_inner.c34
-rw-r--r--policy_manager/stm/zipc/CMakeLists.txt22
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedal.c117
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedal.h41
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedalState_func.c45
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedalState_func.h14
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_AppsLayer.c76
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.c8
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.h2
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState.c154
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState.h45
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState_func.c45
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState_func.h14
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/HomeScreenLayer/ZHSL_HomeScreen.c40
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrake.c117
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrake.h41
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrakeStatus_func.c45
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrakeStatus_func.h14
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomeScreen_func.c6
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomescreen.c46
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.c8
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.h2
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OslMain.c104
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_RelMain.c619
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.c8
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.h2
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.c77
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.h7
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.c32
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.h3
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_func.c130
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.c16
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.h8
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/ZST_include.h10
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_apps_main.c1456
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_apps_main.h111
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_master_apps_def.h15
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_master_remote_def.h15
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_remote.c206
-rw-r--r--policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_remote.h45
-rw-r--r--policy_manager/stm/zipc/stm_master_apps.c63
-rw-r--r--policy_manager/stm/zipc/stm_master_apps.h11
-rw-r--r--policy_manager/stm/zipc/stm_master_remote.c29
-rw-r--r--policy_manager/stm/zipc/stm_master_remote.h4
-rw-r--r--src/CMakeLists.txt11
-rw-r--r--src/applist.cpp24
-rw-r--r--src/config/areas.json204
-rw-r--r--src/config/connection.json5
-rw-r--r--src/config/old_roles.json (renamed from conf/old_roles.json)2
-rw-r--r--src/json_helper.cpp12
-rw-r--r--src/json_helper.hpp2
-rw-r--r--src/low_can_client.cpp187
-rw-r--r--src/low_can_client.hpp113
-rw-r--r--src/main.cpp265
-rw-r--r--src/pm_wrapper.cpp193
-rw-r--r--src/pm_wrapper.hpp3
-rw-r--r--src/request.cpp9
-rw-r--r--src/request.hpp35
-rw-r--r--src/util.cpp32
-rw-r--r--src/util.hpp7
-rw-r--r--src/window_manager.cpp1374
-rw-r--r--src/window_manager.hpp96
-rw-r--r--src/wm_client.cpp104
-rw-r--r--src/wm_client.hpp14
-rw-r--r--src/wm_connection.cpp457
-rw-r--r--src/wm_connection.hpp64
-rw-r--r--src/wm_layer.cpp25
-rw-r--r--src/wm_layer.hpp3
-rw-r--r--src/wm_layer_control.cpp321
-rw-r--r--src/wm_layer_control.hpp15
109 files changed, 8390 insertions, 2557 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8a69a43..7cf640f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,6 +26,37 @@ set(PACKAGE_VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE
find_package(PkgConfig REQUIRED)
include(GNUInstallDirs)
+macro(wlproto var_basename proto_xml_basename)
+ if("${WLSCAN}" STREQUAL "")
+ find_program(WLSCAN NAMES wayland-scanner)
+ endif()
+
+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/protocol)
+ set(proto_dir "${CMAKE_CURRENT_SOURCE_DIR}/protocol")
+ elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/../protocol)
+ set(proto_dir "${CMAKE_CURRENT_SOURCE_DIR}/../protocol")
+ else()
+ message(FATAL_ERROR "Could not find ${CMAKE_CURRENT_SOURCE_DIR}/protocol or ${CMAKE_CURRENT_SOURCE_DIR}/../protocol")
+ endif()
+
+ add_custom_command(
+ OUTPUT
+ ${proto_xml_basename}-protocol.c
+ #${proto_xml_basename}-server-protocol.h
+ ${proto_xml_basename}-client-protocol.h
+ MAIN_DEPENDENCY ${proto_dir}/${proto_xml_basename}.xml
+ COMMAND ${WLSCAN} code < ${proto_dir}/${proto_xml_basename}.xml > ${proto_xml_basename}-protocol.c
+ #COMMAND ${WLSCAN} server-header < ${proto_dir}/${proto_xml_basename}.xml > ${proto_xml_basename}-server-protocol.h
+ COMMAND ${WLSCAN} client-header < ${proto_dir}/${proto_xml_basename}.xml > ${proto_xml_basename}-client-protocol.h
+ )
+
+ set(${var_basename}_PROTO ${CMAKE_CURRENT_BINARY_DIR}/${proto_xml_basename}-protocol.c)
+ set(${var_basename}_CLIENT ${CMAKE_CURRENT_BINARY_DIR}/${proto_xml_basename}-client-protocol.h)
+ #set(${var_basename}_SERVER ${CMAKE_CURRENT_BINARY_DIR}/${proto_xml_basename}-server-protocol.h)
+
+ include_directories(${CMAKE_CURRENT_BINARY_DIR})
+endmacro()
+
set(SANITIZER_MODE "none" CACHE STRING "Build using a specific sanitizer (e.g. 'address', 'thread', 'leak', 'undefined'), depends on compiler; default none")
set(LINK_LIBCXX OFF CACHE BOOL "Link against LLVMs libc++")
diff --git a/LICENSE.MIT b/LICENSE.MIT
new file mode 100644
index 0000000..0f2dc0f
--- /dev/null
+++ b/LICENSE.MIT
@@ -0,0 +1,20 @@
+Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
index a52e791..17389a8 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,13 @@ This is a WindowManager implementation for the AGL Project.
===========================================================
See http://docs.automotivelinux.org/docs/apis_services/en/dev/
+
+**NOTE**
+This Window Manager is master (meter cluster) mode by default.
+If use slave (IVI) mode, please execute sclipt `change_to_slave_mode.sh` on target as follows:
+```
+$ scp ./change_to_slave_mode.sh root@<target_ip_addr>:~
+$ ssh root@<target_ip_addr>
+# sync
+# ./change_to_slave_mode.sh
+```
diff --git a/change_to_slave_mode.sh b/change_to_slave_mode.sh
new file mode 100755
index 0000000..32a70ee
--- /dev/null
+++ b/change_to_slave_mode.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+sed -i.orig -e 's/\"mode\": \"master\"/\"mode\": \"slave\"/' /var/local/lib/afm/applications/windowmanager-service-2017/0.1/etc/connection.json
+
+
diff --git a/client/README b/client/README
deleted file mode 100644
index 95ab875..0000000
--- a/client/README
+++ /dev/null
@@ -1,39 +0,0 @@
-= Example Application for TMC AGL WindowManager Client Lib
-This is a example QML application that uses clients of the TMC WindowManager.
-
-== Dependencies
-* Qt5 + QtQuick (QML) with ivi-shell support
-
-== Build instructions
-Inside of an SDK environment run:
-
-----------------
-qmake
-make
-----------------
-
-* The binary should be installed somewhere in $PATH
-
-== Usage
-Run this application like follows:
-
-----------------
-qmlWindowManagerSampleApp $width $height $appLabel $colorName
-----------------
-
-.Note
-****************
-Depending on your environment you will need to set the following
-environment variable to instruct Qt to use the ivi-shell integration:
-`QT_WAYLAND_SHELL_INTEGRATION=ivi-shell`
-****************
-
-Starts the application with a surface the size $width x $height
-the Surface will request the label "$appLabel" and set its surface
-color "$colorName" e.g. red.
-
-Note, that although the application sets an initial window size, the
-window manager will send events to the application that instruct it to
-set the proper, requested size for the layout.
-
-// vim:set tw=72 ft=asciidoc:
diff --git a/client/communication.cpp b/client/communication.cpp
deleted file mode 100644
index 1acfdca..0000000
--- a/client/communication.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "communication.h"
-
-#include <QGuiApplication>
-#include <QDebug>
-
-communication::communication(QObject *parent) : QObject(parent)
-{
- this->quit = false;
-}
-
-communication::~communication()
-{
-}
-
-void communication::setWidth(const unsigned int &w)
-{
- this->width = w;
- emit widthChanged();
-}
-
-void communication::setHeight(const unsigned int &h)
-{
- this->height = h;
- emit heightChanged();
-}
-
-void communication::setColor(const QString &c)
-{
- this->color = c;
- emit colorChanged();
-}
-
-void communication::setAppName(const QString &a)
-{
- this->appName = a;
- emit appNameChanged();
-}
-
-void communication::setQuit(const bool &q)
-{
- this->quit = q;
- emit quitChanged();
- if(q)
- exit(EXIT_SUCCESS);
-}
-
-unsigned int communication::getWidth() const
-{
- return this->width;
-}
-
-unsigned int communication::getHeight() const
-{
- return this->height;
-}
-
-QString communication::getColor() const
-{
- return this->color;
-}
-
-QString communication::getAppName() const
-{
- return this->appName;
-}
-
-bool communication::getQuit() const
-{
- return this->quit;
-}
diff --git a/client/communication.h b/client/communication.h
deleted file mode 100644
index fd3072f..0000000
--- a/client/communication.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef COMMUNICATION_H
-#define COMMUNICATION_H
-
-#include <QObject>
-
-class communication : public QObject
-{
- Q_OBJECT
-
- Q_PROPERTY(unsigned int width WRITE setWidth READ getWidth NOTIFY widthChanged)
- Q_PROPERTY(unsigned int height WRITE setHeight READ getHeight NOTIFY heightChanged)
- Q_PROPERTY(QString color READ getColor WRITE setColor NOTIFY colorChanged)
- Q_PROPERTY(QString appName READ getAppName WRITE setAppName NOTIFY appNameChanged)
- Q_PROPERTY(bool quit READ getQuit WRITE setQuit NOTIFY quitChanged)
-
-public:
- explicit communication(QObject *parent = 0);
- virtual ~communication();
-
-public slots:
- void setWidth(const unsigned int &);
- void setHeight(const unsigned int &);
- void setColor(const QString&);
- void setAppName(const QString&);
- void setQuit(const bool&);
-
- unsigned int getWidth() const;
- unsigned int getHeight() const;
- QString getColor() const;
- QString getAppName() const;
- bool getQuit() const;
-
-signals:
- void widthChanged();
- void heightChanged();
- void colorChanged();
- void appNameChanged();
- void quitChanged();
-
-private:
- unsigned int width;
- unsigned int height;
- QString color;
- QString appName;
- bool quit;
-};
-
-#endif // COMMUNICATION_H
diff --git a/client/extra/WindowManagerSampleApp.qml b/client/extra/WindowManagerSampleApp.qml
deleted file mode 100644
index 0945af9..0000000
--- a/client/extra/WindowManagerSampleApp.qml
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import QtQuick 2.2
-import QtQuick.Window 2.1
-import QtQuick.Layouts 1.1
-
-Window {
- id: screen
- width: COMM.width
- height: COMM.height
- color: COMM.color
- flags: Qt.FramelessWindowHint
- title: COMM.appName
- opacity: 0.99
- visible: true
-
- Timer {
- id: quitTimer
- interval: 2000
- repeat: false
- triggeredOnStart: false
- onTriggered: COMM.quit = true
- }
-
- Text {
- id: textArea
- color: "black"
- font.bold: true
- font.pointSize: 90
- anchors.centerIn: parent
- text: COMM.appName
- }
-}
diff --git a/client/extra/WindowManagerSampleApp.qml.sample2 b/client/extra/WindowManagerSampleApp.qml.sample2
deleted file mode 100644
index 1ffc071..0000000
--- a/client/extra/WindowManagerSampleApp.qml.sample2
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import QtQuick 2.2
-import QtQuick.Window 2.1
-import QtQuick.Layouts 1.1
-
-Window {
- id: screen
- width: COMM.width
- height: COMM.height
- color: COMM.color
- flags: Qt.FramelessWindowHint
- title: COMM.appName
- opacity: 0.99
- visible: true
- signal created
-
- Timer {
- id: quitTimer
- interval: 2000
- repeat: false
- triggeredOnStart: false
- onTriggered: COMM.quit = true
- }
-
- Text {
- id: textArea
- color: "black"
- font.bold: true
- font.pointSize: 90
- anchors.centerIn: parent
- text: COMM.appName
- }
- onFrameSwapped: {
- created()
- }
-
-}
diff --git a/client/main.cpp b/client/main.cpp
deleted file mode 100644
index 3dc2e42..0000000
--- a/client/main.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <QDebug>
-#include <QDir>
-#include <QGuiApplication>
-#include <QQmlApplicationEngine>
-#include <QQmlContext>
-#include <QQuickView>
-#include <QQuickWindow>
-#include "communication.h"
-
-#include "qlibwindowmanager.h"
-
-int main(int argc, char *argv[]) {
- QGuiApplication app(argc, argv);
-
- qDebug() << QCoreApplication::arguments();
-
- if (QCoreApplication::arguments().count() < 5) {
- qWarning() << "Wrong parameters specified for the application. "
- "Please restart with correct parameters:"
- "width, height, name, color [port] [token]:\n\n"
- "/usr/bin/WindowManagerSampleApp/"
- "qmlWindowManagerSampleApp width height name color\n";
- exit(EXIT_FAILURE);
- }
-
- QString label = QCoreApplication::arguments().at(3);
-
- QLibWindowmanager* qwm = new QLibWindowmanager();
-
- QString token = "wm";
- int port = 1700;
- if(QCoreApplication::arguments().count() == 7){
- bool ok;
- port = QCoreApplication::arguments().at(5).toInt(&ok);
- if(ok == false){
- port = 1700;
- }
- else{
- token = QCoreApplication::arguments().at(6);
- }
- }
- const char* ctoken = token.toLatin1().data();
- if (qwm->init(port, ctoken) != 0) {
- exit(EXIT_FAILURE);
- }
-
- if (qwm->requestSurface(
- QCoreApplication::arguments().at(3).toLatin1().data()) != 0) {
- exit(EXIT_FAILURE);
- }
-
- qwm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [qwm](char const *label) {
- fprintf(stderr, "Surface %s got syncDraw!\n", label);
- qwm->endDraw(label);
- });
- qwm->set_event_handler(QLibWindowmanager::Event_Active, [](char const *label) {
- fprintf(stderr, "Surface %s got activated!\n", label);
- });
- qwm->set_event_handler(QLibWindowmanager::Event_Visible, [](char const *label) {
- fprintf(stderr, "Surface %s got visible!\n", label);
- });
- qwm->set_event_handler(QLibWindowmanager::Event_FlushDraw, [](char const *label) {
- fprintf(stderr, "Surface %s got flushDraw!\n", label);
- });
-
- communication comm;
- comm.setWidth(QCoreApplication::arguments().at(1).toUInt());
- comm.setHeight(QCoreApplication::arguments().at(2).toUInt());
- comm.setAppName(label);
- comm.setColor(QCoreApplication::arguments().at(4));
-
- QQmlApplicationEngine engine;
- engine.rootContext()->setContextProperty("COMM", &comm);
-
- engine.load(
- QUrl(QStringLiteral("qrc:/extra/WindowManagerSampleApp.qml")));
- QObject *root = engine.rootObjects().first();
- QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
- QObject::connect(root, SIGNAL(frameSwapped()), qwm, SLOT(slotActivateSurface()));
-
- return app.exec();
-}
diff --git a/client/main.cpp.sample2 b/client/main.cpp.sample2
deleted file mode 100644
index 5d9cc44..0000000
--- a/client/main.cpp.sample2
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <QDebug>
-#include <QDir>
-#include <QGuiApplication>
-#include <QQmlApplicationEngine>
-#include <QQmlContext>
-#include <QQuickView>
-#include <QQuickWindow>
-#include "communication.h"
-
-#include "qlibwindowmanager.h"
-
-int main(int argc, char *argv[]) {
- QGuiApplication app(argc, argv);
-
- qDebug() << QCoreApplication::arguments();
-
- if (QCoreApplication::arguments().count() < 5) {
- qWarning() << "Wrong parameters specified for the application. "
- "Please restart with correct parameters:"
- "width, height, name, color [port] [token]:\n\n"
- "/usr/bin/WindowManagerSampleApp/"
- "qmlWindowManagerSampleApp width height name color\n";
- exit(EXIT_FAILURE);
- }
-
- QString label = QCoreApplication::arguments().at(3);
-
- QLibWindowmanager* qwm = new QLibWindowmanager();
-
- QString token = "wm";
- int port = 1700;
- if(QCoreApplication::arguments().count() == 7){
- bool ok;
- port = QCoreApplication::arguments().at(5).toInt(&ok);
- if(ok == false){
- port = 1700;
- }
- else{
- token = QCoreApplication::arguments().at(6);
- }
- }
- const char* ctoken = token.toLatin1().data();
- if (qwm->init(port, ctoken) != 0) {
- exit(EXIT_FAILURE);
- }
-
- if (qwm->requestSurface(
- QCoreApplication::arguments().at(3).toLatin1().data()) != 0) {
- exit(EXIT_FAILURE);
- }
-
- qwm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [qwm](char const *label) {
- //qwm->endDraw(label);
- fprintf(stderr, "Surface %s got syncDraw!\n", label);
- });
- qwm->set_event_handler(QLibWindowmanager::Event_Active, [](char const *label) {
- fprintf(stderr, "Surface %s got activated!\n", label);
- });
-
- communication comm;
- comm.setWidth(QCoreApplication::arguments().at(1).toUInt());
- comm.setHeight(QCoreApplication::arguments().at(2).toUInt());
- comm.setAppName(label);
- comm.setColor(QCoreApplication::arguments().at(4));
-
- QQmlApplicationEngine engine;
- engine.rootContext()->setContextProperty("COMM", &comm);
-
- engine.load(
- QUrl(QStringLiteral("qrc:/extra/WindowManagerSampleApp.qml")));
- QObject *root = engine.rootObjects().first();
- QObject::connect(root, SIGNAL(created()), qwm, SLOT(slotActivateSurface()));
-
- return app.exec();
-}
diff --git a/client/qlibwindowmanager.cpp b/client/qlibwindowmanager.cpp
deleted file mode 100644
index e69f0ac..0000000
--- a/client/qlibwindowmanager.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "qlibwindowmanager.h"
-#include <unistd.h>
-
-int QLibWindowmanager::init(int port, char const *token) {
- return this->wm->init(port, token);
-}
-
-int QLibWindowmanager::requestSurface(const char *label) {
- applabel = label;
- return this->wm->requestSurface(label);
-}
-
-int QLibWindowmanager::activateSurface(const char *label) {
- return this->wm->activateSurface(label);
-}
-
-int QLibWindowmanager::deactivateSurface(const char *label) {
- return this->wm->deactivateSurface(label);
-}
-
-int QLibWindowmanager::endDraw(const char *label) { return this->wm->endDraw(label); }
-
-void QLibWindowmanager::set_event_handler(enum QEventType et,
- std::function<void(char const *label)> f) {
- LibWindowmanager::EventType wet = (LibWindowmanager::EventType)et;
- return this->wm->set_event_handler(wet, std::move(f));
-}
-
-void QLibWindowmanager::slotActivateSurface(){
- qDebug("%s",__FUNCTION__);
- this->activateSurface(applabel.c_str());
-}
-
-QLibWindowmanager::QLibWindowmanager(QObject *parent)
- :QObject(parent)
-{
- wm = new LibWindowmanager();
-}
-
-QLibWindowmanager::~QLibWindowmanager() { }
diff --git a/client/qlibwindowmanager.h b/client/qlibwindowmanager.h
deleted file mode 100644
index ed86a65..0000000
--- a/client/qlibwindowmanager.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef QLIBWINDOWMANAGER_H
-#define QLIBWINDOWMANAGER_H
-#include <libwindowmanager.h>
-#include <functional>
- #include <QObject>
- #include <QUrl>
- #include <QVariant>
- #include <string>
- #include <vector>
-
-class QLibWindowmanager : public QObject{
-Q_OBJECT
-public:
- explicit QLibWindowmanager(QObject *parent = nullptr);
- ~QLibWindowmanager();
-
- QLibWindowmanager(const QLibWindowmanager &) = delete;
- QLibWindowmanager &operator=(const QLibWindowmanager &) = delete;
-
-public:
- using handler_fun = std::function<void(const char *)>;
-
- enum QEventType {
- Event_Active = 1,
- Event_Inactive,
-
- Event_Visible,
- Event_Invisible,
-
- Event_SyncDraw,
- Event_FlushDraw,
- };
-
- static QLibWindowmanager &instance();
-
- int init(int port, char const *token);
-
- // WM API
- int requestSurface(const char *label);
- int activateSurface(const char *label);
- int deactivateSurface(const char *label);
- int endDraw(const char *label);
- void set_event_handler(enum QEventType et, handler_fun f);
-
-public slots:
- void slotActivateSurface();
-
-private:
- LibWindowmanager* wm;
- std::string applabel;
- std::vector<int> surfaceIDs;
-};
-#endif // LIBWINDOWMANAGER_H
diff --git a/client/qmlWindowManagerSampleApp.pro b/client/qmlWindowManagerSampleApp.pro
deleted file mode 100644
index 3064d57..0000000
--- a/client/qmlWindowManagerSampleApp.pro
+++ /dev/null
@@ -1,20 +0,0 @@
-TEMPLATE = app
-QT += qml quick
-CONFIG += c++11
-
-HEADERS += communication.h qlibwindowmanager.h
-
-SOURCES += main.cpp \
- communication.cpp qlibwindowmanager.cpp
-RESOURCES += sample.qrc
-
-INCLUDEPATH += $$[QT_SYSROOT]/usr/include/afb
-
-LIBS += -lwindowmanager
-#LIBS += -lsystemd
-LIBS += -lafbwsc
-#LIBS += -ljson-c
-
-target.path = /usr/bin/WindowManagerSampleApp
-
-INSTALLS += target
diff --git a/client/sample.qrc b/client/sample.qrc
deleted file mode 100644
index be79eb6..0000000
--- a/client/sample.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>extra/WindowManagerSampleApp.qml</file>
- </qresource>
-</RCC>
diff --git a/conf/areas.json b/conf/areas.json
deleted file mode 100644
index 03ddfe4..0000000
--- a/conf/areas.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
- "areas": [
- {
- "name": "fullscreen",
- "rect": {
- "x": 0,
- "y": 0,
- "w": 1080,
- "h": 1920
- }
- },
- {
- "name": "normal.full",
- "rect": {
- "x": 0,
- "y": 218,
- "w": 1080,
- "h": 1488
- }
- },
- {
- "name": "split.main",
- "rect": {
- "x": 0,
- "y": 218,
- "w": 1080,
- "h": 744
- }
- },
- {
- "name": "split.sub",
- "rect": {
- "x": 0,
- "y": 962,
- "w": 1080,
- "h": 744
- }
- },
- {
- "name": "software_keyboard",
- "rect": {
- "x": 0,
- "y": 962,
- "w": 1080,
- "h": 744
- }
- },
- {
- "name": "restriction.normal",
- "rect": {
- "x": 0,
- "y": 218,
- "w": 1080,
- "h": 1488
- }
- },
- {
- "name": "restriction.split.main",
- "rect": {
- "x": 0,
- "y": 218,
- "w": 1080,
- "h": 744
- }
- },
- {
- "name": "restriction.split.sub",
- "rect": {
- "x": 0,
- "y": 962,
- "w": 1080,
- "h": 744
- }
- },
- {
- "name": "on_screen",
- "rect": {
- "x": 0,
- "y": 218,
- "w": 1080,
- "h": 1488
- }
- }
- ]
-}
diff --git a/deploy.sh b/deploy.sh
new file mode 100755
index 0000000..173be29
--- /dev/null
+++ b/deploy.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+cd build
+source /opt/agl-sdk/6.0.0_toyota-special/environment-setup-aarch64-agl-linux
+make package
+if [ $? -eq 0 ]; then
+ scp package/windowmanager-service-2017.wgt root@${1}:~
+ ssh root@${1} afm-util remove windowmanager-service-2017@0.1
+ ssh root@${1} afm-util install windowmanager-service-2017.wgt
+ ssh root@${1} sync
+ ssh root@${1} reboot
+fi \ No newline at end of file
diff --git a/doc/ApplicationGuide.md b/doc/ApplicationGuide.md
index 2b17c8f..2240bb1 100644
--- a/doc/ApplicationGuide.md
+++ b/doc/ApplicationGuide.md
@@ -1,902 +1,757 @@
-# **Window Manager Application Guide**
-
-<div align="right">Revision: 0.7</div>
+**Window Manager Application Guide**
+====
+<div align="right">Revision: 0.5</div>
<div align="right">TOYOTA MOTOR CORPORATION</div>
-<div align="right">12th/Oct/2018</div>
+<div align="right">20th/Mar/2018</div>
* * *
-
<div id="Table\ of\ content"></div>
-# Table of content
-
-- [Target reader of this document](#Target\ reader\ of\ this\ document)
-- [Overview](#Overview)
- - [Supported usecase](#Supported\ usecase)
-- [Getting Started](#Getting\ Started)
- - [Build](#Build)
- - [Install](#Install)
- - [Bitbake](#Bitbake)
- - [Enable to call Window Manager](#Enable\ to\ call\ Window\ Manager)
-- [Software Architecture](#Software\ Architecture)
+Table of content
+============
+- [Introduction](#Introduction)
+ - [Intended audience](#Intended\ audience)
+ - [Scope of this Document](#Scope\ of\ this\ Document)
+ - [Known Issues](#Known\ Issues)
+ - [External libraries](#External\ libraries)
+ - [Client Library](#Client\ Library)
+- [Concepts](#Concepts)
+ - [Layers](#Layers)
+ - [Surfaces](#Surfaces)
+- [Configuration](#Configuration)
+ - [Configuration Items](#Configuration\ Items)
+- [Building and Running](#Building\ and\ Running)
+ - [Dependencies](#Dependencies)
+ - [Build Configuration](#Build\ Configuration)
+- [Implementation Notes](#Implementation\ Notes)
+ - [Structure](#Structure)
- [Sequence](#Sequence)
-- [API reference](#API\ reference)
- - [Request to Window Manager](#Request\ to\ Window\ Manager)
- - [Event from Window Manager](#Event\ from\ Window\ Manager)
- - [Client Library](#Client\ library)
-- [Sample code](#Sample\ code)
-- [Policy Manager](#Policy\ Manager)
- - [Enabling split](#Enabling\ split)
-- [Release Note](#Release\ Note)
+- [Binding API](#Binding\ API)
+ - [LibWindowmanager](#LibWindowmanager)
+ - [Methods](#Methods)
+ - [Errors](#Errors)
+ - [Usage](#Usage)
+ - [Events](#Events)
+- [Sample](#Sample)
-* * *
-<div id="Target\ reader\ of\ this\ document"></div>
+<div id="Introduction"></div>
+
+Introduction
+============
+
+This window manager implements simple layout switching of applications on
+multiple layers and with different layer layouts.
+
+<div id="Intended\ audience"></div>
-## Target reader of this document
+Intended audience
+-----------------
This document is intended for developers and system integrators who
-need to know, how Window manager works and how it is to be used.
+need to know, how the window manager works and how it is to be used.
-### Scope of this Document
+<div id="Scope\ of\ this\ Document"></div>
-This document covers Window manager that was implemented for TMC and
+Scope of this Document
+----------------------
+
+This document covers the window manager that was implemented for TMC and
delivered to the Automotive Grade Linux (AGL) project. It includes its
implementation details, concepts of operation, configuration and usage.
It does not include
-- document of the underlying architecture, see
- [HMI-Framework](https://wiki.automotivelinux.org/hmiframework).
+- document of the underlying architecture, see
+ [HMI-Framework](https://wiki.automotivelinux.org/hmiframework).
-- document of the AGL application framework and its technologies,
- see [AGL Application
+- document of the AGL application framework and its technologies,
+ see [AGL Application
Framework](https://wiki.automotivelinux.org/agl-distro/app-framework).
-- document of HomeScreen, see
- [HomeScreen](http://docs.automotivelinux.org/docs/apis_services/en/dev/reference/hmi-framework/3_1-HomeScreen-Guide.html).
-
It is highly recommended to have a good understanding of these documents
-and projects before using Window manager.
-
-* * *
-
-<div id="Overview"></div>
-
-# Overview
-
-Window Manager is the service process which provides **window management based on policy**.
-And implements a layout switching of applications on
-multiple layers and with different layer layouts.
-Window Manager is based on ivi layer management from GENIVI and AGL application framework.
-
-Window Manager consists of
-
-- afb-binder
-- service binding library
-- shared library for policy management
-- configuration files
-
-In order to understand Window Manager, the below figure shows the one of typical usecases.
-In this example, there are two mode for window management.
-
-1. Window Management in `Car Stops`
-1. Window Management in `Car Runs`
-
-![Figure: Typical usecase](parts/state_change_example.png)
-
-The important points are:
-
-- **Window transition should be done by Window Manager**
- Window Manager switch application displayed on top layer by user operation(touch shortcut button).
- In this example, when an user touches `navigation` shortcut button, Window Manager displays `navigation` and hide `launcher`. Next, when an user touches `videoplayer` shortcut button, Window Manager divides a screen into two parts and display two applications.
-
-- **There is a priority `role` for each application.**
- Window Manager realizes state transition change based on the policy which consists of `role`.
- According to the state transition table, it controls the visibility of application window, layout change, and so on.
- The reasons why this is necessary are
-
- - to support user driving
- - not to disturb a driver concerns on driving for safety
-
- In this example, for safety, when the car starts running, Window Manager set up the role `videoplayer`
- to be masked and uncontrollable by user not to disturb driver concerns.
- And, for supporting driving, set up `navigation` role to be displayed 3 seconds after the car ran.
- In `Car Run` state, the user can't switch to other application from Navigation application until car stops.
-
-<div id="Supported\ usecase"></div>
+and projects before using the window manager.
-## Supported usecase
+<div id="Known\ Issues"></div>
-1. Window Management
-- When an user chooses a different application, Window Manager changes the layout and then displays the application.
-- When an user chooses a different application, Window Manager changes the layout and then hides the displayed application.
-2. Policy Management
-- Window Manager changes layout according to policy table based on `role`.
-3. Define Layout by `area` configuration
-- Window Manager realizes the abstracted `area` and can resize the window by using it. User can easily edit this configuration.
+Known Issues
+------------
-* * *
-
-<div id="Getting\ Started"></div>
-
-# Getting Started
-
-<div id="Build"></div>
-
-## Build
-
-```bash
-git clone https://gerrit.automotivelinux.org/gerrit/apps/agl-service-windowmanager
-cd agl-service-windowmanager
-mkdir build
-cd build
-source <your SDK path> // normally this is /opt/agl-sdk/environment
-cmake ..
-make
-make package
-```
-
-The widget package is populated in the 'package' directory.
-
-```bash
-ls package/
-root windowmanager-service.wgt
-```
-
-<div id="Install"></div>
-
-## Install
-
-Copy windowmanager-service.wgt to the file system then execute the following command.
+Currently there is a one known issues:
-```bash
-afm-util install windowmanager-service.wgt
-```
-
-<div id="Bitbake"></div>
+- Only single-surface Qt applications are support through the
+ libwindowmanager library. This is a limitation of how Qt creates surface
+ IDs for the ivi-application interface.
-## Bitbake
+<div id="External\ libraries"></div>
-You can make Window Manager object files with the following two stage operations.
+External libraries
+------------------
-### Download recipe
-
-```bash
-mkdir WORK
-cd WORK
-repo init -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo
-repo sync
-```
+This project includes a copy of version 2.1.1 the excellent [C++11 JSON
+library by Niels Lohmann](https://github.com/nlohmann/json).
-### Execute Bitbake
+<div id="Client\ Library"></div>
-```bash
-source meta-agl/scripts/aglsetup.sh -m m3ulcb agl-demo hmi-framework
-bitbake agl-demo-platform
-```
-
-* * *
+Client Library
+--------------
-<div id="Enable\ to\ call\ Window\ Manager"></div>
+A client library implementation that internally uses the *libafbwsc*, is
+provided in the `libwindowmanager`.
-## Enable to call Window Manager
+<div id="Concepts"></div>
-To call Window Manager, it is important to enable the permission from security framework.
-To use Window Manager API, an application or a service shall add the following configuration definition into "config.xml" of your application.
+Concepts
+========
-```xml
-<feature name="urn:AGL:widget:required-api">
- <param name="windowmanager" value="ws" />
-</feature>
-```
+The window manager implements a couple of concepts in order to allow
+efficient implementation.
-To call Window Manager function easily, Window Manager provides a library which is called "libwindowmanager".
-This library provides a function style API calling interface.
-So you can include the libwindowmanager.hpp header file, and can link against this library.
-Please also refer to the sample application.
+<div id="Layers"></div>
-See also our [Sample code](#Sample\ code).
+Layers
+------
-* * *
+Layers are entities that are stacked on top of each other. Each layer
+has an ID which is used for the ivi-controller interface, but this ID
+also implicitly specifies its stacking order, from lowest to highest.
-<div id="Software\ Architecture"></div>
+Layers are always full-screen. We do not use layer dimensions as a way
+to setup the scene, rather - each layer has a layout attached to it,
+which specifies an area that is used by surfaces to draw on.
-# Software Architecture
+Additionally, layers will generally leave surfaces on below layers
+activated, and only disable surfaces on layers the are above the
+currently used layer.
-The static relationship with other components is shown below.
-The actual logic of Window Manager is the binding in Binder(afb-daemon).
-Window Manager is based on AGL application framework,
-so the IPC via websocket is protected by AGL application framework.
+It is possible to deactivate these surfaces on lower layers explicitly
+using the `DeactivateSurface` API call.
-The upper binder is for the application side security context.
-The lower binder is the Window Manager for the server side security context.
-Usually an application side binder has some business logic for each application, so the number of binders depend on the number of applications which use Window Manager.
-On the other hand, regarding lower binder there is only one module in the system. This binder receives messages from multiple applications.
+<div id="Surfaces"></div>
-An application can use libwindowmanager.so to call Window Manager API simply.
+Surfaces
+--------
-Window Manager is based on the GENIVI layer management system.
+Surfaces are *placed* on layers according to their name. The surface
+will then be resized to dimensions, according to the layer's layout
+configuration.
-![software-stack.png](parts/software-stack.png)
-## Layers
+<div id="Configuration"></div>
-Layers are entities that means the application stack group defined in `layers.json`.
-This doesn't mean layer ID defined in GENIVI ivi layer.
-The layer ID is used for application itself in Window Manager.
-Currently, application can't have multiple surfaces in Window Manager.
+Configuration
+=============
-<div id="Layers"></div>
+The window manager is configured with the *layers.json* configuration
+file, by default it is searched in `${AFM_APP_INSTALL_DIR}/etc/layers.json`.
+Note, that the window manager will use default configuration unless this configuration is found.
-## Surfaces
+A sample configuration is provided with the window manager
+implementation, this sample is installed to ${AFM_APP_INSTALL_DIR}/etc/layers.json.
-Surfaces are *placed* on layers . The surface
-will then be resized to dimensions, according to the name of `areas.db`
-application requests by `activateWindow` or policy management.
-As default, `normal.full` is set by libwindowmanager for native application.
+Note:
+Currently, window manager doesn't block the application displaying because "Fallback" is set by default. If the "Fallback" is not set in layers.json, window manager blocks the application displaying. In such a situation, you have to add your role(application name) at "role" in layers.json.
-<div id="Configuration"></div>
+<div id="Configuration\ Items"></div>
-## Configuration
+Configuration Items
+-------------------
-The window manager is configured with the *layers.json*, *areas.db*, *roles.db* configuration
-files. By default they are searched in `${AFM_APP_INSTALL_DIR}/etc/`.
+This section describes configuration items available through
+`layers.json`. It will do this, by first providing an example, and then
+going into its components.
-Sample configurations are provided with the window manager
-implementation, these samples are installed to ${AFM_APP_INSTALL_DIR}/etc/ .
+### main\_surface
-This configuration is supposed to be configured by policy designer which means OEM or Tier1.
+ "main_surface": {
+ "surface_role": "HomeScreen",
+ },
-### layers.json
+The `main_surface` object describes a surface that will internally be
+treated as the main surface - usually this mean *HomeScreen*. The only
+special handling this surface receives, is that it is not allowed to
+deactivate it. Placement of this surface on an layer is done by the
+other configuration described below.
-`layers.json` has three roles.
-First, to create application containers `Layer`.
-Second, to set id range for applications.
-Third, to attach application to `Layer` according to the role application requests.
+- `surface_role` this configuration item specifies the name of the
+ main surface. Set this to e.g. `HomeScreen`.
-The sample configuration is here
+### mappings
-```json
-{
- "comment": "Surface ID to Layer ID mapping",
+This configuration item is a list of surface-name to layer mappings.
- "main_surface": {
- "surface_role": "HomeScreen",
- "comment": "This surface should never be made invisible (The HomeScreen)"
- },
+#### surface to layer mapping
- "mappings": [
- {
- "role": "BackGroundLayer",
- "name": "BackGroundLayer",
- "layer_id": 999,
- "comment": "Single BackGround layer map for the map, radio, music and video"
- },
+ "mappings": [
{
- "role": "homescreen",
- "name": "FarHomeScreen",
+ "role": "^HomeScreen$",
+ "name": "HomeScreen",
"layer_id": 1000,
- "comment": "FarHomeScreen is the part of HomeScreen. The z order of this layer is lower than NearHomeScreen"
+ "area": { "type": "full" },
+ "comment": "Single layer map for the HomeScreen"
},
{
- "role": "music|video|browser|radio|phone|map|hvac|settings|dashboard|poi|mixer|sdl|launcher|fallback",
- "name": "Apps",
+ "role": "MediaPlayer|Radio|Phone|Navigation|HVAC|Settings|Dashboard|POI|Mixer",
+ "name": "apps",
"layer_id": 1001,
- "comment": "Range of IDs that will always be placed on layer 1001"
+ "area": { "type": "rect", "rect": { "x": 0, "y": 218, "width": -1, "height": -433 } },
+ "comment": "Range of IDs that will always be placed on layer 1001, negative rect values are interpreted as output_size.dimension - $value",
+
+ "split_layouts": [
+ {
+ "name": "Navigation",
+ "main_match": "Navigation",
+ "sub_match": "HVAC|MediaPlayer",
+ "priority": 1000
+ }
+ ]
},
{
- "role": "^on_screen.*",
- "name": "OnScreen",
+ "role": "^OnScreen.*",
+ "name": "popups",
"layer_id": 9999,
- "comment": "Range of IDs that will always be placed on the OnScreen layer, that gets a very high 'dummy' id of 9999"
+ "area": { "type": "rect", "rect": { "x": 0, "y": 760, "width": -1, "height": 400 } },
+ "comment": "Range of IDs that will always be placed on the popup layer, that gets a very high 'dummy' id of 9999"
}
- ]
-}
-```
+ ]
Each mapping defines the following items to map corresponding surfaces
to a layer.
-- `role` defines what kind of ability the application has. And the application will be attached to `Layer` according to the `role`.
- A regular expression that application drawing names
+- `role` defines a regular expression that application drawing names
are matched against. If applications match this regular expression,
the surface will be visible on this layer.
-- `name` is just a name definition for `Layer`, it has no
+- `name` is just a name definition for this layer, it has no
functional use apart from identifying a layer with a name.
-- `layer_id` is the id used in GENIVI IVI layer management control.
-`Layer` stacks from beginning to end.
-The above `Layer` example image is below.
+- `layer_id` specifies which ID this layer will use.
-![wm_layer_stack.png](parts/wm_layer_stack.png)
+- `area` is an object that defines the area assigned to surfaces.
-Note:
-"fallback" role is the special role. This role is set if the role application requests doesn't exist
-in `layers.json`. Then, Window Manager will accept any applications.
-If the "fallback" is not set in layers.json, window manager blocks the application displaying in such case.
-In such a situation, you have to add your role(application name) at "role" in layers.json.
-
-Note:
-`BackGroundLayer` name of `Layer` is exception for work around. This layer is fallback layer not to stop event loop of application when it becomes invisible.
-The problem is issued in <https://jira.automotivelinux.org/browse/SPEC-1484>.
+- `split_layouts` is an optional item, that - if present - defines a
+ number of possible split-screen layouts for this layer.
-<div id="Configuration\ Items"></div>
+#### Area
-### areas.db
-
-Area means abstract expressions of 2-dimensional size and position.
-areas.db defines the area which an application is set.
-
-```json
-{
- "areas": [
- {
- "name": "fullscreen",
- "rect": {
- "x": 0,
- "y": 0,
- "w": 1080,
- "h": 1920
- }
- },
- {
- "name": "normal.full",
- "rect": {
- "x": 0,
- "y": 218,
- "w": 1080,
- "h": 1488
- }
- },
- {
- "name": "split.main",
- "rect": {
- "x": 0,
- "y": 218,
- "w": 1080,
- "h": 744
- }
- },
- {
- "name": "split.sub",
- "rect": {
- "x": 0,
- "y": 962,
- "w": 1080,
- "h": 744
- }
- }
- ]
-}
-```
+Areas can be either `full` or `rect`, whereas `full` means a full-screen
+layer, this is mostly useful for the main\_surface or HomeScreen layer.
+`rect` declares a layer drawing area specified as a rectangle with start
+coordinates `x` and `y` as well as its dimensions `width` and `height`.
-The image of the above setting is described below.
-![wm_area.png](parts/wm_area.png)
+The dimensions can be specified relative to the screen dimensions. For
+this negative values for width and height must be used.
-- `name` is an abstract data of rectangle.
+For example, a full-screen surface can have the following `rect`
+definition:
-- `rect` has 4 arguments. `x`, `y` means the offset from (0, 0) of screen.`w` means the width of the area, and `h` means the height of the area. The dimensions can be specified relative to the screen dimensions.
+ "rect": { "x": 0,
+ "y": 0,
+ "width": -1,
+ "height": -1 }
-The dimensions can be specified absolute to the screen dimensions. But if `fullscreen` is not suitable to screen dimensions, Window Manager scales the area automatically.
+A surface that leaves a 200pixel margin on the top and bottom can use
+the following `rect` definition:
-Note:
-`fullscreen` must be set because this is the base size of scaling in Window Manger.
+ "rect": { "x": 0,
+ "y": 200,
+ "width": -1,
+ "height": -401 }
-Note:
-The direction of the coordinates depends on `transform` in weston.ini.
-Currently, agl-demo-platform set `transform=270`.
-This suppose to use screen vertically.
+So the expression for the actual surface dimensions when using
+screen-size-relative values will be:
-### roles.db
+ actual_width = screen_width + 1 + width
+ actual_height = screen_height + 1 + height
-* * *
+Or in other words, to leave an `N` wide border around a surface, the
+actual value in the dimension configuration needs to be `-N - 1`, and
+appropriate offsets need to be set for `x` and `y`.
-<div id="Sequence"></div>
+#### split\_layouts
-# Sequence
+This configuration item allows the specification of split-screen layouts
+on layers for certain surfaces.
-To understand the sequence between application and window manager, refer to the [spec document](https://wiki.automotivelinux.org/hmiframework).
+A split screen layout always has a *main* surface and a *sub* surface.
+In order to enter a split screen layout, first the *main* surface of the
+layout must be activated, and then the *sub* surface. In order to
+disable the split layout, one of the two participating surface must be
+deactivated (or a surface on a layer below the current one must be
+activated).
-The typical sequence to render your application, follow the sequence below.
+ "split_layouts": [
+ {
+ "name": "Navigation",
+ "main_match": "Navigation",
+ "sub_match": "HVAC|MediaPlayer",
+ }
+ ]
-1. Register your role (and request surfaceID)
+A split layout object has the following attributes:
-![request_role.png](parts/request_role.png)
+- `name` defines its name, it has no actual function other then a way
+ to identify this split layout.
-The above sequence is the initialization phase of your application to use Window Manager.
-An Application has to register your `role` to Window Manager. For ivi-shell application, Window Manager generates surfaceID to input it into the function
-to create surface.
-And also it is important for synchronization to get `syncDraw` event for receiving the request for resize and redraw, and notifying Window Manager of `endDraw`, so register callback function with setEventHandler for `syncDraw`.
+- `main_match` is a regular expression that matches for the *main*
+ surface of this split layout.
-[requestSurface](#requestSurface)
-[setEventHandler](#wm_subscribe)
+- `sub_match` is a regular expression that matches for the *sub*
+ surface of this layout.
-setEventHandler is API of libwindowmanager. This calls wm_subscribe internally.
+In the above example only the surface with drawing name
+`Navigation` will be used as the *main* surface, and the surfaces
+with drawing name `HVAC` or `MediaPlayer` can be used as a *sub* surface for
+this layout.
-2. Display your window
+The names must still match the layer's role match!
-![hmi_framework_designed_seq_toyota.png](parts/hmi_framework_designed_seq_toyota.png)
+<div id="Building\ and\ Running"></div>
-To display your window, your application has to request `activateWindow` with `role` and `area` to Window Manager.
-Window Manager checks the app should be visible on the `area` according to the policy table using `role` .
-If it is accepted, afb_req_success will be returned, and next Window Manager
-will push the event `syncDraw` to applications which will be displayed.
-If it is denied, afb_req_fail will be returned.
-In this sample sequence, `syncDraw` is emitted to the apps who requested only,
-but this shall be emitted to other applications whose size shall be changed.
+Building and Running
+====================
-[activateWindow](#activateWindow)
-[syncDraw](#syncDraw)
-[endDraw](#endDraw)
-[flushDraw](#flushDraw)
+<div id="Dependencies"></div>
-3. Activate OnScreen Window
+Dependencies
+------------
-![deactivate_window.png](parts/deactivate_window.png)
+Build dependencies are as follows:
-[deactivateWindow](#deactivateWindow)
-[See sample code for more detail about OnScreen Window.](https://gerrit.automotivelinux.org/gerrit/gitweb?p=apps%2Fonscreenapp.git;a=summary)
+- afb-daemon &gt;= 1.0
-The above sequence shows the sample of OnScreen Window.
-If the role is high priority than NormapApp, Window Manager rejects NormalApp
-request when OnScreenApp is displayed.
+- libsystemd &gt;= 222
-Note : Above repository is currently empty, so please refer to the sandbox branch.
+- wayland-client &gt;= 1.11
-* * *
+- wayland-ivi-extension &gt;= 2.0.2 (until eel, wayland-ivi-extension &gt;= 1.13)
-<div id="API\ reference"></div>
+- cmake &gt;= 2.8
-# API reference
+<div id="Supported environment"></div>
-## Request to Window Manager
+Supported environment
+-------------------
-| Use | verb | version |
-|:-:|:-:|:-:|
-| Initialize | requestSurface | from 0.7 |
-| | wm_subscribe | from 0.7 |
-| | requestSurfaceXDG | from 0.7 |
-|Activate/Deactivate| activateWindow | from 0.7 |
-| | deactivateWindow | from 0.7 |
-| | endDraw | from 0.7 |
-| Get Infomation | getDisplayInfo | from 0.7 |
+| Item | Description |
+|:------------|:----------------------------------|
+| AGL version | Electric Eel |
+| Hardware | Renesas R-Car Starter Kit Pro(M3) |
-Note: We created this table from 0.7
-The data of IPC via websocket consists of JSON.
-This section describes the verb of API and key.
-Normally, the body of requesting API will be here.
+<div id="Build\ Configuration"></div>
-<div id="Request\ to\ Widnow \Manager"></div>
+Build Configuration
+-------------------
-## Initialize
+**Download recipe**
+If repo is already done, please start with git clone
-<div id="requestSurface"></div>
+```
+$ mkdir WORK
+$ cd WORK
+$ repo init -u https://gerrit.automotivelinux.org/gerrit/AGL/AGL-repo
+$ repo sync
-### *requestSurface*
+```
-Register your role to Window Manager and get surfaceID for ivi-shell.
-The role is used for policy management.
-SurfaceID is supposed to be set to the API `ivi_application_surface_create` of ivi-application protocol or set it to environment variable `QT_IVI_SURFACE_ID` if your app is Qt and integrate ivi-shell.
+Then you can get the following recipe.
-- verb : "requestSurface"
-- argument : {"drawing_name":"your role"}
+* `meta-agl-devel/meta-hmi-framework/recipes-graphics/agl-service-windowmanager-2017`
-the value must be selected in layers.json.
+* `meta-agl-devel/meta-hmi-framework/recipes-graphics/libwindowmanager`
-argument example :
+**Bitbake**
-```json
-{
- "drawing_name" : "navigation"
-}
+```
+$ source meta-agl/scripts/aglsetup.sh -m m3ulcb agl-demo
+$ bitbake agl-demo-platform
```
-### *requestSurfaceXDG*
+<div id="Implementation\ Notes"></div>
-This API is for XDGLauncher, so it is not necessary for normal application.
-XDGLauncher is created for XDG application for desktop app without editing for HMI-Framework.
-Please see the repository in detail.
-<https://gerrit.automotivelinux.org/gerrit/gitweb?p=staging%2Fxdg-launcher.git;a=summary>
+Implementation Notes
+====================
-<div id="wm_subscribe"></div>
+The window manager is implemented as a app-framework-binder binding.
+That means, the build produces one shared object that exports a binding
+interface.
-### *wm_subscribe*
+<div id="Structure"></div>
-Subscribe the Window Manager's event.
-Application must subscribe `syncDraw` event.
+Structure
+---------
-- verb : "wm_subscribe"
-- argument : {"event" : *event number*}
+The implementation is loosely split across the following source files:
-argument example :
+- `main.cpp`: The program entry point as used by the afb-daemon. This
+ file defines the afbBindingV2 symbol that is used by the afb-daemon
+ in order to load a binding. It also defines the wayland fd event
+ dispatcher and some globals to be used (as context for the afb calls
+ we receive).
-```json
-{
- "event" : 5
-}
-```
+- `app.cpp` / `app.hpp`: This is the main window manager
+ logic implementation.
-The event is abstracted with a number (enumeration).
+- `config.cpp` / `config.hpp`: Very simple configuration
+ item interface.
-| Number | Event |
-|:-:|:-:|
-| 0 | "active" |
-| 1 | "inactive" |
-| 2 | "visible" |
-| 3 | "invisible" |
-| 4 | "syncDraw" |
-| 5 | "flushDraw" |
-| 6 | "screenUpdated" |
+- `controller_hooks.hpp`: hook functions called by the wayland
+ controller to call into the window manager instance. Only a very limited number
+ of events are passed to the window manager, which allowed the usage of
+ such a simple interface.
-## Activate/Deactivate
+- `json_helper.cpp` / `json_helper.hpp`: Smaller json related
+ helper functions.
-<div id="activateWindow"></div>
+- `layers.cpp` / `layers.hpp`: Actually hold all the data from
+ layers.json configuration, do some transformations and service the
+ window manager implementation.
-### *activateWindow*
+- `layout.cpp` / `layout.hpp`: Very simple layout state for the
+ implementation of split layouts and tracking of the
+ surfaces involved.
-Request to display your application with `role` on the `area` to Window Manager.
-Window Manager checks the app should be visible on the `area` and change layout according to the policy table using `role` .
-If it is accepted, afb_req_success will be returned, and next Window Manager
-will push the event `syncDraw` to applications which will be displayed.
-If it is denied, afb_req_fail will be returned.
+- `policy.hpp`: PolicyManager implementation stub. Gets passed the
+ current and new layout on layout switch and can decide upon it being
+ valid or not.
-- verb : "activateWindow"
-- argument : {"drawing_name" : "your role", "drawing_area" : "your area"}
+- `result.hpp`: Simple result class around
+ `std::experimental::optional` that additionally can hold a
+ `char const *` to describe the error.
-the value must be selected among layers.json.
+- `util.cpp` / `util.hpp`: general utility functions and structs - and
+ preprocessor definitions (e.g. `log*()` to AFB logging functions.
-argument example :
+- `wayland_ivi_wm.cpp` / `wayland_ivi_wm.hpp`: A C++ object-oriented
+ libwayland-client wrapper. It is instanced in `main.cpp` and handles
+ all our wayland needs. These files are in master. In eel, the name
+ of these files are `wayland.cpp` / `wayland.hpp`
-```json
-{
- "drawing_name" : "navigation",
- "drawing_area" : "normal.full"
-}
-```
+<div id="Sequence"></div>
-<div id="deactivateWindow"></div>
+Sequence
+===============
-### *deactivateWindow*
+To understand the sequence between application and window manager, refer to the [spec document](https://wiki.automotivelinux.org/windowmanager).
-Request to hide your application to Window Manager.
-This verb is supposed to be used by high priority application which
-are for example popup application or system UI application such like alert.
-If Window Manager set the priority of popup high in the policy, Window Manager may not hide the popup even if normal applications
-send `activateWindow` until popup application send `deactivateWindow` . This behavior depends on the policy table.
-After this request, Window Manager checks which app should be visible
-and change layout according to the policy table.
-- verb : "deactivateWindow"
-- argument : None
+<div id="Binding\ API"></div>
-<div id="endDraw"></div>
+Binding API
+===============
-### *endDraw*
+Each function returns a reply containing at least a failed or successful
+result of the call, additionally, when calls return something, it is
+noted.
-Notify Window Manager of application finishes drawing.
-This function must be sent in event `syncDraw`.
-Otherwise, Window Manager will roll back to previous state and reject your request `activateWindow` .
+<div id="LibWindowmanager"></div>
-- verb : "endDraw"
-- argument : {"drawing_name" : "your role"}
+LibWindowmanager
+------
-argument example :
+This is the public interface of the class `LibWindowmanager`.
-```json
-{
- "drawing_name" : "navigation",
-}
-```
+ class LibWindowmanager
+ {
+ public:
+ LibWindowmanager();
+ ~LibWindowmanager();
-## Get Information
+ enum EventType {
+ Event_Active = 0,
+ Event_Inactive,
-### *getDisplayInfo*
+ Event_Visible,
+ Event_Invisible,
-Get screen information such as resolution.
+ Event_SyncDraw,
+ Event_FlushDraw,
+ };
-- verb : "getDisplayInfo"
-- argument : None
+ int init(int port, char const *token);
-Return : The screen information will return.
-Return example :
+ // Window manager API
+ int requestSurface(json_object *object);
+ int requestSurfaceXDG(json_object *object);
+ int activateSurface(json_object *object);
+ int deactivateSurface(json_object *object);
+ int endDraw(json_object *object);
+ int getDisplayInfo(json_object *object);
+ int getAreaInfo(json_object *in_obj, json_object *out_obj);
-```json
-{
- "response":{
- "width_pixel":1080,
- "height_pixel":1920,
- "width_mm":320,
- "height_mm":520,
- "scale":1
- },
- "jtype" : "afb-reply",
- "request":{
- "status":"success",
- "info":"success",
- "uuid":"05ae219a-0e56-4f46-af9f-3186a18cb110"
- }
-}
-```
+ int getAreaInfo(const char *label, json_object *out_obj);
-Note :
-"width_mm", "height_mm" is from output which is one of the wayland object.
-These items lack reliability, so recommend not to use.
+ void set_event_handler(enum EventType et, handler_fun f);
-<div id="Event\ from\ Window \Manager"></div>
+ };
-## Event from Window Manager
+<div id="Methods"></div>
-| Number | Event | version |
-|:-:|:-:|:-:|
-| 0 | "active" | from 0.7|
-| 1 | "inactive" | from 0.7 |
-| 2 | "visible" | from 0.7 |
-| 3 | "invisible" | from 0.7 |
-| 4 | "syncDraw" | from 0.7 |
-| 5 | "flushDraw" | from 0.7 |
-| 6 | "screenUpdated" | from 0.7 |
+Methods
+-------
-Events also consists of JSON.
-The data of event is contained in `data` such like
+### init(int port, char const *token)
-```json
-{
- "event":"windowmanager\/active",
- "date":{
- "drawing_name":"navigation"
- },
- "jtype":"afb-event"
-}
-```
+Initialize the Binding communication.
-"event" is the event name.
-"data" is the data object from Window Manager and contains
-the message of event.
-This section describes "event" and the contents of "data".
+The `token` parameter is a string consisting of only alphanumeric characters.
+If these conditions are not met, the LibWindowmanager instance will not initialize,
+i.e. this call will return `-EINVAL`.
-### active
+The `port` parameter is the port the afb daemon is listening on, an
+invalid port will lead to a failure of the call and return `-EINVAL`.
-This event means when the application becomes active state.
+### requestSurface(json_object *object)
-example :
+**args: `{ 'kKeyDrawingName': 'application name' }`**
+This method requests a surface with the label given from the *Window Manager*.
+It will return `surface id` a client application can use, and
+`-errno` on failure. Additionally, on the standard error, messages are
+logged to help debugging the issue.
-```json
-{
- "event":"windowmanager\/active",
- "data":{
- "drawing_name":"launcher"
- }
- },
- "jtype":"afb-event"
-}
-```
+### requestSurfaceXDG(json_object *object)
-### inactive
+**args: `{ 'kKeyDrawingName': 'application name', 'kKeyIviId': 'ivi id' }`**
+This method is mainly intended for *xdglauncher* that controls xdg application such as chromium.
+It will return `surface id` xdglauncher uses, and
+`-errno` on failure. Additionally, on the standard error, messages are
+logged to help debugging the issue.
-This event means when the application becomes inactive state.
+### activateSurface(json_object *object)
-example :
+**args: `{ 'kKeyDrawingName': 'application name', 'kKeyDrawingArea': 'layout' }`**
+This method is mainly intended for *manager* applications that control
+other applications (think an application manager or the *HomeScreen*).
+It instructs the window manager to activate the surface with the given
+*label*.
-```json
-{
- "event":"windowmanager\/inactive",
- "data":{
- "drawing_name":"launcher"
- }
- },
- "jtype":"afb-event"
-}
-```
+This method only is effective after the actual window or surface was
+created by the application.
-### visible
+### deactivateSurface(json_object *object)
-This event is issued when the application is visible state.
+**args: `{ 'kKeyDrawingName': 'application name' }`**
+This method is mainly intended for *manager* applications that control other applications.
+In adition, this is for applications that overrides other applications such like popup message.
+In this case, popup surface requests to be hidden. It instructs the window manager to deactivate the surface associated with the given label. Note, that deactivating a surface also means to implicitly activate another (the last active or if not available *main surface* or *HomeScreen*.)
-example :
+This method only is effective after the actual window or surface was
+created by the application.
-```json
-{
- "event":"windowmanager\/visible",
- "data":{
- "drawing_name":"launcher"
- }
- },
- "jtype":"afb-event"
-}
-```
+### endDraw(json_object *object)
-### invisible
+**args: `{ 'kKeyDrawingName': 'application name' }`**
+This function is called from a client application when it is done
+drawing its surface content.
-This event is issued when the application is invisible state.
+It is not crucial to make this call at every time a drawing is finished
+- it is mainly intended to allow the window manager to synchronize
+drawing in case of layout switch. The exact semantics are explained in
+the next [Events](#_events) Section.
-example :
+### getDisplayInfo(json_object *object)
-```json
-{
- "event":"windowmanager\/invisible",
- "data":{
- "drawing_name":"launcher"
- }
- },
- "jtype":"afb-event"
-}
-```
+**args: `{ }`**
+This function gets the display information as follows:
+ - width[pixel]
+ - height[pixel]
+ - width[mm]
+ - height[mm]
-<div id="syncDraw"></div>
+It outputs the display information for json_object in the argument as follows:
+ `{"width_pixel": int value of width[pixel], "height_pixel": int value of height[pixel],
+ "width_mm": int value of width[mm], "height_mm": int value of height[mm]}`
-### syncDraw
+It should be called after calling init().
+It should not be called in the event handler because it occurs hang-up.
-This event is issued by Window Manager state change operation in policy to the following cases.
+#### NOTE
+It uses wl_output::geometry() for getting physical width[mm] and height[mm] of the display,
+but the value is different with measured value.
-- Your app requested `activateWindow` then your application will be resized or visible.
-- Other app requested `activateWindow` then your application will be resized or visible.
-- Window Manager change layout due to vehicle condition.
+ - value from wl_output::geometry(): width:320 height:520
+ - measured value : width:193 height:343
-This event is the requests from Window Manager to
+### getAreaInfo(json_object *in_obj, json_object *out_obj)
-- request your app to callback `endDraw` to Window Manager.
-- request your app to resize and redraw according to "drawing_area".
+**args1: `{ 'kKeyDrawingName': 'application name' }`**
+**args2: `{ }`**
+This function gets the information of area drawn by the application as follows:
+ - x-coordinate
+ - y-coordinate
+ - width
+ - height
-This is the abstract word then the real size is given in "drawing_rect".
+It outputs the area information for json_object in the 2nd argument as follows:
+ `{"x": int value of x-coordinate, "y": int value of y-coordinate,
+ "width": int value of width, "height": int value of height}`
-example :
+It should be called after calling activateSurface().
+It should not be called in the event handler because it occurs hang-up.
-```json
-{
- "event":"windowmanager\/syncDraw",
- "data":{
- "drawing_name":"radio",
- "drawing_area":"normal.full",
- "drawing_rect":{
- "x":0,
- "y":218,
- "width":1080,
- "height":1488
- }
- },
- "jtype":"afb-event"
-}
-```
+#### NOTE
+The same information can given by SyncDraw event.
-An application which gets this event must send `endDraw`.
-For details, please see the sequence.
+### getAreaInfo(const char *label, json_object *out_obj)
-<div id="flushDraw"></div>
+**args1: String of application name**
+**args2: `{ }`**
+This function is same with `getAreaInfo(json_object *in_obj, json_object *out_obj)`,
+but only has difference of 1st argument.
-### flushDraw
+### set\_event\_handler(enum EventType et, handler_fun f)
-This event is issued after Window Manager receives all `endDraw` from applications who recieved `syncDraw` .
-After this event, Window Manager expects applications to update its surface.
+This method needs to be used to register event handlers for the WM
+events described in the EventType enum. Only one hendler for each
+EventType is possible, i.e. if it is called multiple times with the same
+EventType the previous handler will be replaced.
-example :
+The `func` handler functions will receive the label of the surface this
+event is targeted at.
-```json
-{
- "event":"windowmanager\/flushDraw",
- "data":{
- "drawing_name":"launcher"
- }
- },
- "jtype":"afb-event"
-}
-```
+See Section [Events](#_events) for more detailed information about event
+delivery to client applications.
-### screenUpdated
+<div id="Errors"></div>
-This event is issued after the visible application changes as a state transition change. This contains resized applications and visible applications. This event is issued to all subscriber.
-Typical usecase is only for HomeScreen. If HomeScreen has an animation until the started application is visible such as progress bar, this signal may become a switch to stop the animation.
+Errors
+------
-```json
-{
- "event":"windowmanager\/screenUpdated",
- "data":{
- "ids":[
- "mediaplayer",
- "navi"
- ]
- },
- "jtype":"afb-event"
-}
-```
+Methods returning an `int` signal successful operation when returning
+`0`. In case of an error, an error value is returned as a negative errno
+value. E.g. `-EINVAL` to signal that some input value was invalid.
-"ids" is the application_id described in config.xml of application.
+Additionally, logging of error messages is done on the standard error
+file descriptor to help debugging the issue.
-<div id="Client library"></div>
+<div id="Usage"></div>
-## Client library
+Usage
+-----
-A client library implementation that internally uses the *libafbwsc*, is
-provided in the `libwindowmanager`.
-This library is for C++ native application.
+### Initialization of LibWindowmanager
-Regarding more detail, please refer to <https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Flibwindowmanager.git;a=summary>
+Before usage of the LibWindowmanager, the method `init()` must be
+called once, it will return `-errno` in case of an error and log
+diagnostic messages to stderr.
-* * *
+### Request a surface
-<div id="Sample\ Code"></div>
+When creating a surface with *Qt* - it is necessary to request a surface
+from the WM, internally this will communicate with the window manager
+binding. Only after `requestSurface()` was successful, a surface should
+be created.
-# Sample code
+This is also true for *QML* applications, where only after the
+`requestSurface()` should the load of the resource be done. The method
+returns `surface id` a client application can use
+after the surface was requested successfully.
-In order to enable application to activate application(render on layer),
-above described steps need to be implemented.
+#### Workings of requestSurface()
-As a minimal example the usage and initialization can look like the
-following.
+`LibWindowmanager::requestSurface()` calls the AFB binding verb
+`requestsurface` of the `windowmanager` API. This API call will return a
+numeric ID to be used when creating the surface. This ID is never
+explicitly returned to the client application, instead, it is set in the
+application environment in order for *Qt* to then use it when creating
+the surface.
-Repo: `git clone https://gerrit.automotivelinux.org/gerrit/src/libhomescreen`
-Path: `sample/simple-egl/main.c`
-Typical implementation of C++ application.
+With the current *Qt* implementation this means, that only one surface
+will be available to client applications, as subsequent windows will
+increment this numeric ID internally - which then will lead to IDs that
+cannot be known by the window manager as there is no direct
+communication from *Qt* to the WM.
-Repo: `git clone https://gerrit.automotivelinux.org/gerrit/apps/radio`
-Typical implementation of Qt application.
+<div id="Events"></div>
-Repo: `git clone https://gerrit.automotivelinux.org/gerrit/apps/videoplayer`
-This is the good example to write more simply for Qt application using QtAGLExtra.
+Events
+------
-<div id="Policy Manager"></div>
+Events are a way for the *Window Manager* to propagate information to
+client applications. It was vital for the project to implement a number
+of events, that mirror functionality that is already present in the
+wayland protocol.
-# Policy Manager
+All events have the surface label as argument - a way to enable future
+multi-surface applications.
-## Concepts
+As already stated above, this is currently not possible with the way
+*Qt* implements its surface ID setting.
-Policy Manager decides next layout by using input event data and current state
-based on the policy table.
+### Active and Inactive Events
-And PolicyManager is plugin for WindowManager.
-Therefore the OEMs can replace it.
+These events signal an application that it was activated or deactivated
+respectively. Usually this means it was switched visible - which means
+the surface will now be on the screen and therefor continue to render.
-<div id="Enabling\ split"></div>
+- `Active(json_object *object)`
+ args: { 'kKeyDrawingName': 'application name' }
+ Signal that the surface with the name
+ `kKeyDrawingName` is now active.
-## Enabling split
+- `Inactive(json_object *object)`
+ args: { 'kKeyDrawingName': 'application name' }
+ Signal that the surface with the
+ name `kKeyDrawingName` is now inactive. This usually means, the layout
+ got changed, and the surface is now considered inactive
+ (or sleeping).
-Window Manager supports split layout to change policy and `areas.db`.
-This section describes how to play split layout.
-The sample image is here.
+### Visible and Invisible
-![example_split.png](parts/example_split.png)
+These events signal an application that it was switched to be visible or
+invisible respectively. These events also are handled implicitly through
+the wayland protocol by means of `wl_surface::enter` and
+`wl_surface::leave` events to the client.
-To play the split layout,
+- `Visible(json_object *object)`
+ args: { 'kKeyDrawingName': 'application name' }
+ Signal applications, that the
+ surface with name `kKeyDrawingName` is now visible.
-1. Edit in `policy_manager/CMakeLists.txt` as follows:
- #set(STM_DIR stub)
- set(STM_DIR zipc)
- This results in using source code generated by ZIPC.
-1. Set bool value "ON" to TRY_SPLIT_LAYOUT at line 28 in policy_manager/CMakeLists.txt as follows:
- set(TRY_SPLIT_LAYOUT ON CACHE BOOL "Enable to show split layout")
-1. compile
-1. copy window manager to your board
-1. re-install windowmanager and reboot
+- `Invisible(json_object *object)`
+ args: { 'kKeyDrawingName': 'application name' }
+ Signal applications that the
+ surface with name `kKeyDrawingName` is now invisible.
-As a result, if application requests `navi` with `activateWindow` when current layout is `video` or `mediaplayer`, Window Manager change layout to split window. The reverse is true.
+### SyncDraw and FlushDraw
-Note:
-Currently, the policy manager force application change the size even if the application which has the role doesn't have the split design.
-In that case, the view of application may be ugly.
-Window Manager supposes that applications may have multi designs according to system design by OEM.
-For example, if OEM sets 2 pattern layout for `navi`, the application which requests `navi` should have 2 pattern designs.
+These events instruct applications that they should redraw their surface
+contents - again, this is handled implicitly by the wayland protocol.
-* * *
+`SyncDraw` is sent to the application when it has to redraw its surface.
-<div id="Release\ Note"></div>
+`FlushDraw` is sent to the application when it should swap its buffers,
+that is *signal* the compositor that its surface contains new content.
-# Release Note
+- `SyncDraw(json_object *object)`
+ args: { 'kKeyDrawingName': 'application name', 'kKeyDrawingArea': 'layout',
+ 'kKeyDrawingRect': { "x": int value of x-coordinate, "y": int value of y-coordinate,
+ "width": int value of width, "height": int value of height } }
+ Signal applications, that the
+ surface with name `kKeyDrawingArea` needs to redraw its content
+ in the layout with name `kKeyDrawingArea` - this
+ usually is sent when the surface geometry changed.
+ And the area position and size are included with name `kKeyDrawingRect`.
-## version: 0.7
+- `FlushDraw(json_object *object)`
+ args: { 'kKeyDrawingName': 'application name' }
+ Signal applications, that the
+ surface with name `kKeyDrawingArea` can now be swapped to its newly
+ drawn content as the window manager is ready to activate a new
+ layout (i.e. a new surface geometry).
-### New Feature
+<div id="Sample"></div>
-- Add Policy Manager
+Sample
+============
-### Limitation
+In order to enable application to use the `WM` surface registration
+function the above described steps need to be implemented.
+
+As a minimal example the usage and initialization can look like the
+following.
-- Only single-surface Qt applications are support through the
- libwindowmanager library. This is a limitation of how Qt creates surface
- IDs for the ivi-application interface.
+Repo: `apps/agl-service-homescreen-2017`
+Path: `sample/template/main.c`
-- Currenly, Window Manager supports only one screen. Dual display is not supported.
-- As implemented in sample code, Qt application has to wait requesting `activateWindow` until `frameSwapped` is emitted.
-- Qt application conceals, wayland and openGL processes, so it is difficult to call `swapBuffer` after `flushDraw` event described in the architecture document. But no problem if you use toolkit such as Qt, because it is automatically processed between applications and compositor(weston).
-- Editing ZIPC is difficult for open source developer due to licence. \ No newline at end of file
diff --git a/doc/parts/deactivate_window.png b/doc/parts/deactivate_window.png
deleted file mode 100644
index cd0d48c..0000000
--- a/doc/parts/deactivate_window.png
+++ /dev/null
Binary files differ
diff --git a/doc/parts/example_split.png b/doc/parts/example_split.png
deleted file mode 100644
index e9fd476..0000000
--- a/doc/parts/example_split.png
+++ /dev/null
Binary files differ
diff --git a/doc/parts/hmi_framework_designed_seq_toyota.png b/doc/parts/hmi_framework_designed_seq_toyota.png
deleted file mode 100644
index 2dedabf..0000000
--- a/doc/parts/hmi_framework_designed_seq_toyota.png
+++ /dev/null
Binary files differ
diff --git a/doc/parts/request_role.png b/doc/parts/request_role.png
deleted file mode 100644
index ca20678..0000000
--- a/doc/parts/request_role.png
+++ /dev/null
Binary files differ
diff --git a/doc/parts/software-stack.png b/doc/parts/software-stack.png
deleted file mode 100644
index aa66636..0000000
--- a/doc/parts/software-stack.png
+++ /dev/null
Binary files differ
diff --git a/doc/parts/state_change_example.png b/doc/parts/state_change_example.png
deleted file mode 100644
index 23dada4..0000000
--- a/doc/parts/state_change_example.png
+++ /dev/null
Binary files differ
diff --git a/doc/parts/wm_area.png b/doc/parts/wm_area.png
deleted file mode 100644
index e713782..0000000
--- a/doc/parts/wm_area.png
+++ /dev/null
Binary files differ
diff --git a/doc/parts/wm_layer_stack.png b/doc/parts/wm_layer_stack.png
deleted file mode 100644
index 9c99731..0000000
--- a/doc/parts/wm_layer_stack.png
+++ /dev/null
Binary files differ
diff --git a/conf/layers.json b/layers.json
index 539846a..539b7dc 100644
--- a/conf/layers.json
+++ b/layers.json
@@ -3,52 +3,59 @@
"mappings": [
{
"name": "BackGroundLayer",
- "role" : "navigation|radio|music|video",
+ "role" : "map|radio|music|video",
"id_range_begin": 0,
"id_range_end": 0,
- "comment": "Work Around: This is a special fallback layer that not stopping wayland event loop."
+ "comment": "Work Around: This is evacuation layer that not stopping event loop"
},
{
"name": "FarHomeScreen",
- "role": "homescreen",
+ "role": "",
"id_range_begin": 100,
"id_range_end": 199,
"comment": "FarHomeScreen is the part of HomeScreen. The z order of this layer is lower than NearHomeScreen"
},
{
"name": "Apps",
- "role": "music|video|browser|radio|phone|navigation|map|hvac|settings|dashboard|poi|mixer|sdl|launcher|fallback",
+ "role": "music|video|browser|radio|phone|map|navigation|hvac|settings|dashboard|poi|mixer|sdl|launcher|receiver|tachometer|fallback",
"id_range_begin": 1000,
"id_range_end": 2999,
- "comment": "Application layer"
+ "comment": "Range of IDs that will always be placed on layer 1001"
},
{
"name": "NearHomeScreen",
- "role": "software_keyboard",
+ "role": "homescreen",
"id_range_begin": 3000,
- "id_range_end": 3999,
- "comment": "NearHomeScreen is the part of HomeScreen. The usecase is used by software_keyboard etc"
+ "id_range_end": 3000,
+ "comment": "TOYOTA special software keyboard"
},
{
- "name": "Popup",
+ "name": "Application Popup Layer",
"role": "popup*",
"id_range_begin": 4000,
"id_range_end": 4999,
- "comment": "This layer is for popup application layer"
+ "comment": "[T.B.D]This layer is for application popup layer"
},
{
"name": "Restriction",
"role": "restriction",
"id_range_begin": 5000,
"id_range_end": 5999,
- "comment": "This layer is for restriction notification on driving. This is used by restriction role"
+ "comment": "This layer is for restriction notification. This is used by restriction role"
},
{
"name": "OnScreen",
- "role": "^on_screen.*",
+ "role": "^on_screen*",
"id_range_begin": 6000,
"id_range_end": 6999,
- "comment": "System notification layer. For example, on_screen_low_battery_alert to notify user"
+ "comment": "Range of IDs that will always be placed on the OnScreen layer, that gets a very high 'dummy' id of 9999"
+ },
+ {
+ "name": "Remote",
+ "role": "tbtnavi",
+ "id_range_begin": 9000,
+ "id_range_end": 9999,
+ "comment": "Range of IDs that will always be placed on the OnScreen layer, that gets a very high 'dummy' id of 9999"
}
]
}
diff --git a/package/root/config.xml b/package/root/config.xml
index a053f31..e11ef63 100644
--- a/package/root/config.xml
+++ b/package/root/config.xml
@@ -8,11 +8,14 @@
<feature name="urn:AGL:widget:required-permission">
<param name="urn:AGL:permission::public:hidden" value="required" />
<param name="urn:AGL:permission::system:run-by-default" value="required" />
+ <param name="urn:AGL:permission:afm:system:runner" value="required" />
</feature>
<feature name="urn:AGL:widget:provided-api">
<param name="windowmanager" value="ws" />
</feature>
- <feature name="urn:AGL:widget:required-binding">
+ <feature name="urn:AGL:widget:required-api">
+ <param name="low-can" value="ws" />
<param name="lib/windowmanager-service.so" value="local" />
+ <param name="afm-main" value="ws" />
</feature>
</widget>
diff --git a/policy_manager/CMakeLists.txt b/policy_manager/CMakeLists.txt
index 3ec4c39..5903340 100644
--- a/policy_manager/CMakeLists.txt
+++ b/policy_manager/CMakeLists.txt
@@ -19,21 +19,21 @@ pkg_check_modules(AFB REQUIRED afb-daemon)
pkg_check_modules(SD REQUIRED libsystemd>=222)
# Set name of STM
-set(STM_DIR stub)
-#set(STM_DIR zipc)
+#set(STM_DIR stub)
+set(STM_DIR zipc)
-# Select roles.db
+# Select roles.json
if(zipc MATCHES ${STM_DIR})
# if trying to show split layout, change from OFF to ON
- set(TRY_SPLIT_LAYOUT OFF CACHE BOOL "Enable to show split layout")
+ set(TRY_SPLIT_LAYOUT ON CACHE BOOL "Enable to show split layout")
if(${TRY_SPLIT_LAYOUT})
- set(ROLES_DB_NAME roles.db.zipc.split)
+ set(ROLES_CONFIG_FILE_NAME roles.json.zipc.split)
else()
- set(ROLES_DB_NAME roles.db.zipc)
+ set(ROLES_CONFIG_FILE_NAME roles.json.zipc)
endif()
else()
- set(ROLES_DB_NAME roles.db)
+ set(ROLES_CONFIG_FILE_NAME roles.json)
endif()
# Add STM directory
@@ -99,6 +99,6 @@ add_custom_command(TARGET ${TARGETS_PM} POST_BUILD
COMMAND mkdir -p ${PROJECT_BINARY_DIR}/package/root/lib
COMMAND cp -f ${PROJECT_BINARY_DIR}/${PLUGIN_PM}/lib${PLUGIN_PM}.so ${PROJECT_BINARY_DIR}/package/root/lib
COMMAND mkdir -p ${PROJECT_BINARY_DIR}/package/root/etc
- COMMAND cp -f ${PROJECT_SOURCE_DIR}/${PLUGIN_PM}/db/states.db ${PROJECT_BINARY_DIR}/package/root/etc
- COMMAND cp -f ${PROJECT_SOURCE_DIR}/${PLUGIN_PM}/db/${ROLES_DB_NAME} ${PROJECT_BINARY_DIR}/package/root/etc/roles.db
+ COMMAND cp -f ${PROJECT_SOURCE_DIR}/${PLUGIN_PM}/config/layouts.json ${PROJECT_BINARY_DIR}/package/root/etc
+ COMMAND cp -f ${PROJECT_SOURCE_DIR}/${PLUGIN_PM}/config/${ROLES_CONFIG_FILE_NAME} ${PROJECT_BINARY_DIR}/package/root/etc/roles.json
)
diff --git a/policy_manager/config/layouts.json b/policy_manager/config/layouts.json
new file mode 100644
index 0000000..b12bce1
--- /dev/null
+++ b/policy_manager/config/layouts.json
@@ -0,0 +1,371 @@
+{
+ "ecus": [
+ {
+ "name": "master",
+ "layouts": [
+ {
+ "name": "homescreen",
+ "areas": [
+ {
+ "name": "fullscreen",
+ "category": "homescreen"
+ }
+ ]
+ },
+ {
+ "name": "splitable.split",
+ "areas": [
+ {
+ "name": "split.main",
+ "category": "splitable_main"
+ },
+ {
+ "name": "split.sub",
+ "category": "splitable_sub"
+ }
+ ]
+ },
+ {
+ "name": "general.normal",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "general"
+ }
+ ]
+ },
+ {
+ "name": "software_keyboard",
+ "areas": [
+ {
+ "name": "software_keyboard",
+ "category": "software_keyboard"
+ }
+ ]
+ },
+ {
+ "name": "pop_up",
+ "areas": [
+ {
+ "name": "on_screen",
+ "category": "pop_up"
+ }
+ ]
+ },
+ {
+ "name": "system_alert",
+ "areas": [
+ {
+ "name": "on_screen",
+ "category": "system_alert"
+ }
+ ]
+ },
+ {
+ "name": "tbt",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "tbt"
+ }
+ ]
+ },
+ {
+ "name": "remote_tbt",
+ "areas": [
+ {
+ "name": "master.split.sub",
+ "category": "tbt"
+ }
+ ]
+ },
+ {
+ "name": "meter.normal",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "meter"
+ }
+ ]
+ },
+ {
+ "name": "meter_receiver",
+ "areas": [
+ {
+ "name": "split.main",
+ "category": "meter"
+ },
+ {
+ "name": "split.sub",
+ "category": "receiver"
+ }
+ ]
+ },
+ {
+ "name": "meter_splitable",
+ "areas": [
+ {
+ "name": "split.main",
+ "category": "meter"
+ },
+ {
+ "name": "split.sub",
+ "category": "splitable_sub"
+ }
+ ]
+ },
+ {
+ "name": "splitable_receiver",
+ "areas": [
+ {
+ "name": "split.main",
+ "category": "splitable_main"
+ },
+ {
+ "name": "split.sub",
+ "category": "receiver"
+ }
+ ]
+ },
+ {
+ "name": "receiver.split",
+ "areas": [
+ {
+ "name": "split.sub",
+ "category": "receiver"
+ }
+ ]
+ },
+ {
+ "name": "debug.normal",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "debug"
+ }
+ ]
+ },
+ {
+ "name": "debug.split.main",
+ "areas": [
+ {
+ "name": "split.main",
+ "category": "debug"
+ }
+ ]
+ },
+ {
+ "name": "debug.split.sub",
+ "areas": [
+ {
+ "name": "split.sub",
+ "category": "debug"
+ }
+ ]
+ },
+ {
+ "name": "debug.fullscreen",
+ "areas": [
+ {
+ "name": "fullscreen",
+ "category": "debug"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "slave",
+ "layouts": [
+ {
+ "name": "homescreen",
+ "areas": [
+ {
+ "name": "fullscreen",
+ "category": "homescreen"
+ }
+ ]
+ },
+ {
+ "name": "map.normal",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "map"
+ }
+ ]
+ },
+ {
+ "name": "map.split",
+ "areas": [
+ {
+ "name": "split.main",
+ "category": "map"
+ },
+ {
+ "name": "split.sub",
+ "category": "splitable"
+ }
+ ]
+ },
+ {
+ "name": "map.fullscreen",
+ "areas": [
+ {
+ "name": "fullscreen",
+ "category": "map"
+ }
+ ]
+ },
+ {
+ "name": "splitable.normal",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "splitable"
+ }
+ ]
+ },
+ {
+ "name": "splitable.split",
+ "areas": [
+ {
+ "name": "split.main",
+ "category": "splitable"
+ },
+ {
+ "name": "split.sub",
+ "category": "splitable"
+ }
+ ]
+ },
+ {
+ "name": "general.normal",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "general"
+ }
+ ]
+ },
+ {
+ "name": "system.normal",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "system"
+ }
+ ]
+ },
+ {
+ "name": "software_keyboard",
+ "areas": [
+ {
+ "name": "software_keyboard",
+ "category": "software_keyboard"
+ }
+ ]
+ },
+ {
+ "name": "restriction.normal",
+ "areas": [
+ {
+ "name": "restriction.normal",
+ "category": "restriction"
+ }
+ ]
+ },
+ {
+ "name": "restriction.split.main",
+ "areas": [
+ {
+ "name": "restriction.split.main",
+ "category": "restriction"
+ }
+ ]
+ },
+ {
+ "name": "restriction.split.sub",
+ "areas": [
+ {
+ "name": "restriction.split.sub",
+ "category": "restriction"
+ }
+ ]
+ },
+ {
+ "name": "pop_up",
+ "areas": [
+ {
+ "name": "on_screen",
+ "category": "pop_up"
+ }
+ ]
+ },
+ {
+ "name": "system_alert",
+ "areas": [
+ {
+ "name": "on_screen",
+ "category": "system_alert"
+ }
+ ]
+ },
+ {
+ "name": "tbt",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "tbt"
+ }
+ ]
+ },
+ {
+ "name": "remote_tbt",
+ "areas": [
+ {
+ "name": "master.split.sub",
+ "category": "tbt"
+ }
+ ]
+ },
+ {
+ "name": "debug.normal",
+ "areas": [
+ {
+ "name": "normal.full",
+ "category": "debug"
+ }
+ ]
+ },
+ {
+ "name": "debug.split.main",
+ "areas": [
+ {
+ "name": "split.main",
+ "category": "debug"
+ }
+ ]
+ },
+ {
+ "name": "debug.split.sub",
+ "areas": [
+ {
+ "name": "split.sub",
+ "category": "debug"
+ }
+ ]
+ },
+ {
+ "name": "debug.fullscreen",
+ "areas": [
+ {
+ "name": "fullscreen",
+ "category": "debug"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/policy_manager/db/roles.db b/policy_manager/config/roles.json
index 184e602..c657fec 100644
--- a/policy_manager/db/roles.db
+++ b/policy_manager/config/roles.json
@@ -8,7 +8,7 @@
},
{
"category": "debug",
- "role": "launcher | navigation | map | poi | browser | sdl | mixer | radio | hvac | debug | phone | video | music | settings | dashboard | fallback",
+ "role": "launcher | map | poi | browser | sdl | mixer | radio | hvac | debug | phone | video | music | settings | dashboard | fallback",
"area": "normal.full | split.main | split.sub | fullscreen",
"layer": "apps",
},
@@ -35,6 +35,18 @@
"role": "system_alert",
"area": "on_screen",
"layer": "on_screen",
+ },
+ {
+ "category": "tbt",
+ "role": "tbt",
+ "area": "normal.full | master.split.sub",
+ "layer": "remote",
+ },
+ {
+ "category": "receiver",
+ "role": "receiver",
+ "area": "normal.full | split.main | split.sub",
+ "layer": "apps",
}
]
}
diff --git a/policy_manager/db/roles.db.zipc b/policy_manager/config/roles.json.zipc
index 13ada24..facb1d8 100644
--- a/policy_manager/db/roles.db.zipc
+++ b/policy_manager/config/roles.json.zipc
@@ -8,7 +8,7 @@
},
{
"category": "map",
- "role": "navigation",
+ "role": "map",
"area": "normal.full | split.main",
"layer": "apps",
},
diff --git a/policy_manager/config/roles.json.zipc.split b/policy_manager/config/roles.json.zipc.split
new file mode 100644
index 0000000..e21e961
--- /dev/null
+++ b/policy_manager/config/roles.json.zipc.split
@@ -0,0 +1,151 @@
+{
+ "ecus": [
+ {
+ "name": "master",
+ "roles":[
+ {
+ "category": "homescreen",
+ "role": "homescreen",
+ "area": "fullscreen",
+ "layer": "homescreen",
+ },
+ {
+ "category": "general",
+ "role": "launcher | browser | debug | settings | hvac | dashboard | fallback",
+ "area": "normal.full",
+ "description": "For split test, video and music are moved to category:splitable",
+ "layer": "apps",
+ },
+ {
+ "category": "splitable_main",
+ "role": "mixer | video | phone",
+ "area": "split.main",
+ "description": "For split test, video and music are included here",
+ "layer": "apps",
+ },
+ {
+ "category": "splitable_sub",
+ "role": "music | radio | poi",
+ "area": "split.sub",
+ "description": "For split test, video and music are included here",
+ "layer": "apps",
+ },
+ {
+ "category": "software_keyboard",
+ "role": "software_keyboard",
+ "area": "software_keyboard",
+ "layer": "near_homescreen",
+ },
+ {
+ "category": "pop_up",
+ "role": "on_screen | on_screen_phone | onscreen",
+ "area": "on_screen",
+ "layer": "on_screen",
+ },
+ {
+ "category": "system_alert",
+ "role": "system_alert",
+ "area": "on_screen",
+ "layer": "on_screen",
+ },
+ {
+ "category": "tbt",
+ "role": "tbtnavi",
+ "area": "master.split.sub",
+ "layer": "remote",
+ },
+ {
+ "category": "meter",
+ "role": "tachometer",
+ "area": "split.main | normal.full",
+ "layer": "apps",
+ },
+ {
+ "category": "receiver",
+ "role": "receiver",
+ "area": "split.sub | normal.full",
+ "layer": "apps",
+ }
+ ]
+ },
+ {
+ "name": "slave",
+ "roles":[
+ {
+ "category": "homescreen",
+ "role": "homescreen",
+ "area": "fullscreen",
+ "layer": "homescreen",
+ },
+ {
+ "category": "map",
+ "role": "navigation",
+ "area": "normal.full | split.main | fullscreen",
+ "layer": "apps",
+ },
+ {
+ "category": "general",
+ "role": "launcher | poi | browser | mixer | radio | hvac | debug | phone | fallback",
+ "area": "normal.full",
+ "description": "For split test, video and music are moved to category:splitable",
+ "layer": "apps",
+ },
+ {
+ "category": "system",
+ "role": "settings | dashboard",
+ "area": "normal.full",
+ "layer": "apps",
+ },
+ {
+ "category": "splitable",
+ "role": "video | music | sdl | webbrowser | eb",
+ "area": "normal.full | split.main | split.sub",
+ "description": "For split test, video and music are included here",
+ "layer": "apps",
+ },
+ {
+ "category": "software_keyboard",
+ "role": "software_keyboard",
+ "area": "software_keyboard",
+ "layer": "near_homescreen",
+ },
+ {
+ "category": "restriction",
+ "role": "restriction",
+ "area": "restriction.normal | restriction.split.main | restriction.split.sub",
+ "layer": "restriction",
+ },
+ {
+ "category": "pop_up",
+ "role": "on_screen | on_screen_phone | onscreen",
+ "area": "on_screen",
+ "layer": "on_screen",
+ },
+ {
+ "category": "system_alert",
+ "role": "system_alert",
+ "area": "on_screen",
+ "layer": "on_screen",
+ },
+ {
+ "category": "tbt",
+ "role": "tbtnavi",
+ "area": "master.split.sub",
+ "layer": "remote",
+ },
+ {
+ "category": "meter",
+ "role": "tachometer",
+ "area": "split.main | normal.full",
+ "layer": "apps",
+ },
+ {
+ "category": "receiver",
+ "role": "receiver",
+ "area": "split.sub | normal.full",
+ "layer": "apps",
+ }
+ ]
+ }
+ ]
+}
diff --git a/policy_manager/db/roles.db.zipc.split b/policy_manager/db/roles.db.zipc.split
deleted file mode 100644
index cef2631..0000000
--- a/policy_manager/db/roles.db.zipc.split
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- "roles":[
- {
- "category": "homescreen",
- "role": "homescreen",
- "area": "fullscreen",
- "layer": "homescreen",
- },
- {
- "category": "map",
- "role": "navigation",
- "area": "normal.full | split.main",
- "layer": "apps",
- },
- {
- "category": "general",
- "role": "launcher | poi | browser | sdl | mixer | radio | hvac | debug | phone | fallback",
- "area": "normal.full",
- "description": "For split test, video and music are moved to category:splitable",
- "layer": "apps",
- },
- {
- "category": "system",
- "role": "settings | dashboard",
- "area": "normal.full",
- "layer": "apps",
- },
- {
- "category": "splitable",
- "role": "video | music",
- "area": "normal.full | split.main | split.sub",
- "description": "For split test, video and music are included here",
- "layer": "apps",
- },
- {
- "category": "software_keyboard",
- "role": "software_keyboard",
- "area": "software_keyboard",
- "layer": "near_homescreen",
- },
- {
- "category": "restriction",
- "role": "restriction",
- "area": "restriction.normal | restriction.split.main | restriction.split.sub",
- "layer": "restriction",
- },
- {
- "category": "pop_up",
- "role": "on_screen | on_screen_phone",
- "area": "on_screen",
- "layer": "on_screen",
- },
- {
- "category": "system_alert",
- "role": "system_alert",
- "area": "on_screen",
- "layer": "on_screen",
- }
- ]
-}
diff --git a/policy_manager/db/states.db b/policy_manager/db/states.db
deleted file mode 100644
index 371be3b..0000000
--- a/policy_manager/db/states.db
+++ /dev/null
@@ -1,174 +0,0 @@
-{
- "states": [
- {
- "name": "homescreen",
- "areas": [
- {
- "name": "fullscreen",
- "category": "homescreen"
- }
- ]
- },
- {
- "name": "map.normal",
- "areas": [
- {
- "name": "normal.full",
- "category": "map"
- }
- ]
- },
- {
- "name": "map.split",
- "areas": [
- {
- "name": "split.main",
- "category": "map"
- },
- {
- "name": "split.sub",
- "category": "splitable"
- }
- ]
- },
- {
- "name": "map.fullscreen",
- "areas": [
- {
- "name": "fullscreen",
- "category": "map"
- }
- ]
- },
- {
- "name": "splitable.normal",
- "areas": [
- {
- "name": "normal.full",
- "category": "splitable"
- }
- ]
- },
- {
- "name": "splitable.split",
- "areas": [
- {
- "name": "split.main",
- "category": "splitable"
- },
- {
- "name": "split.sub",
- "category": "splitable"
- }
- ]
- },
- {
- "name": "general.normal",
- "areas": [
- {
- "name": "normal.full",
- "category": "general"
- }
- ]
- },
- {
- "name": "system.normal",
- "areas": [
- {
- "name": "normal.full",
- "category": "system"
- }
- ]
- },
- {
- "name": "software_keyboard",
- "areas": [
- {
- "name": "software_keyboard",
- "category": "software_keyboard"
- }
- ]
- },
- {
- "name": "restriction.normal",
- "areas": [
- {
- "name": "restriction.normal",
- "category": "restriction"
- }
- ]
- },
- {
- "name": "restriction.split.main",
- "areas": [
- {
- "name": "restriction.split.main",
- "category": "restriction"
- }
- ]
- },
- {
- "name": "restriction.split.sub",
- "areas": [
- {
- "name": "restriction.split.sub",
- "category": "restriction"
- }
- ]
- },
- {
- "name": "pop_up",
- "areas": [
- {
- "name": "on_screen",
- "category": "pop_up"
- }
- ]
- },
- {
- "name": "system_alert",
- "areas": [
- {
- "name": "on_screen",
- "category": "system_alert"
- }
- ]
- },
- {
- "name": "debug.normal",
- "areas": [
- {
- "name": "normal.full",
- "category": "debug"
- }
- ]
- },
- {
- "name": "debug.split.main",
- "areas": [
- {
- "name": "split.main",
- "category": "debug"
- }
- ]
- },
- {
- "name": "debug.split.sub",
- "areas": [
- {
- "name": "split.sub",
- "category": "debug"
- }
- ]
- },
- {
- "name": "debug.fullscreen",
- "areas": [
- {
- "name": "fullscreen",
- "category": "debug"
- }
- ]
- }
- ]
-}
diff --git a/policy_manager/policy_manager.cpp b/policy_manager/policy_manager.cpp
index 999bc87..05f2ccb 100644
--- a/policy_manager/policy_manager.cpp
+++ b/policy_manager/policy_manager.cpp
@@ -34,6 +34,9 @@ extern "C"
namespace pm
{
+static const char kPathRolesConfigFile[] = "/etc/roles.json";
+static const char kPathLayoutsConfigFile[] = "/etc/layouts.json";
+
static const int kInvisibleRoleHistoryNum = 5;
static PolicyManager *g_context;
@@ -59,12 +62,24 @@ PolicyManager::PolicyManager()
role2category(),
category2role(),
category2areas()
-{}
+{
+ this->p_crr_state = new (StmState);
+ this->p_prv_state = new (StmState);
+}
+
+PolicyManager::~PolicyManager()
+{
+ delete this->p_crr_state;
+ delete this->p_prv_state;
+}
-int PolicyManager::initialize()
+int PolicyManager::initialize(std::string ecu_name)
{
int ret = 0;
+ // Set ECU name
+ this->ecu_name = ecu_name;
+
// Create convert map
for (int i = StmEvtNoMin; i <= StmEvtNoMax; i++)
{
@@ -84,19 +99,19 @@ int PolicyManager::initialize()
this->areaname2no[kStmAreaName[i]] = i;
}
- // Load roles.db
- ret = this->loadRoleDb();
+ // Load roles config
+ ret = this->loadRolesConfigFile();
if (0 > ret)
{
- HMI_ERROR("Load roles.db Error!!");
+ HMI_ERROR("Load roles config file Error!!");
return ret;
}
- // Load states.db
- ret = this->loadStateDb();
+ // Load layouts config
+ ret = this->loadLayoutsConfigFile();
if (0 > ret)
{
- HMI_ERROR("Load states.db Error!!");
+ HMI_ERROR("Load layouts config file Error!!");
return ret;
}
@@ -104,7 +119,7 @@ int PolicyManager::initialize()
this->initializeState();
// Initialize StateTransitioner
- stmInitialize();
+ stmInitialize(ecu_name.c_str());
// Store instance
pm::g_context = this;
@@ -170,7 +185,7 @@ int PolicyManager::setInputEventData(json_object *json_in)
itr = this->role2category.find("fallback");
if (this->role2category.end() != itr)
{
- HMI_DEBUG("Role:%s is not registered in roles.db, fallback as normal app", role);
+ HMI_DEBUG("Role:%s is not registered in roles config file, fallback as normal app", role);
category = this->role2category["fallback"];
}
}
@@ -246,6 +261,7 @@ void PolicyManager::undoState()
this->dumpLayerState(this->crr_layers);
this->crr_layers = this->prv_layers;
+ this->crr_invisible_role_history = this->prv_invisible_role_history;
HMI_DEBUG(">>>>>>>>>> AFTER UNDO");
this->dumpLayerState(this->crr_layers);
@@ -253,9 +269,25 @@ void PolicyManager::undoState()
void PolicyManager::initializeState()
{
+ this->initializeModeState();
this->initializeLayerState();
}
+void PolicyManager::initializeModeState()
+{
+ Mode init_car_ele;
+ init_car_ele.state = "none";
+ init_car_ele.changed = false;
+
+ for (int i = StmCarElementNoMin; i <= StmCarElementNoMax; i++)
+ {
+ const char *car_ele_name = kStmCarElementName[i];
+ this->crr_car_elements[car_ele_name] = init_car_ele;
+ }
+
+ this->prv_car_elements = this->crr_car_elements;
+}
+
void PolicyManager::initializeLayerState()
{
AreaState init_area;
@@ -315,47 +347,108 @@ void PolicyManager::addStateToJson(const char *layer_name, bool changed,
json_object_object_add(*json_out, "areas", json_areas);
}
-void PolicyManager::updateState(int event_id, StmState crr_state)
+void PolicyManager::updateState(int event_id)
{
- this->updateLayer(event_id, crr_state);
+ this->updateModeState();
+ this->updateLayer(event_id);
+}
+
+void PolicyManager::updateModeState()
+{
+ int car_state_no;
+ std::string car_state;
+ bool changed;
+
+ // Store previous layers
+ this->prv_car_elements = this->crr_car_elements;
+
+ // Update car elements
+ HMI_DEBUG(">>> CAR ELEMENTS");
+ for (int car_ele_no = StmCarElementNoMin;
+ car_ele_no <= StmCarElementNoMax; car_ele_no++)
+ {
+ const char *car_ele_name = kStmCarElementName[car_ele_no];
+
+ car_state_no = this->p_crr_state->car_element[car_ele_no].state;
+ car_state = kStmCarElementStateNameList[car_ele_no][car_state_no];
+ changed = (this->p_crr_state->car_element[car_ele_no].changed) ? true : false;
+
+ this->crr_car_elements[car_ele_name].state = car_state;
+ this->crr_car_elements[car_ele_name].changed = changed;
+
+ HMI_DEBUG(">>> >>> NAME: %s", car_ele_name);
+ HMI_DEBUG(">>> >>> >>> STATE:%s", car_state.c_str());
+ HMI_DEBUG(">>> >>> >>> CHANGED:%s", (changed) ? "true" : "false");
+ }
}
-void PolicyManager::updateLayer(int event_id, StmState crr_state)
+void PolicyManager::updateLayer(int event_id)
{
for (int layer_no = StmLayerNoMin;
layer_no <= StmLayerNoMax; layer_no++)
{
HMI_DEBUG(">>> LAYER:%s CHANGED:%d LAYOUT:%s",
- kStmLayerName[layer_no], crr_state.layer[layer_no].changed,
- kStmLayoutName[crr_state.layer[layer_no].state]);
+ kStmLayerName[layer_no], this->p_crr_state->layer[layer_no].changed,
+ kStmLayoutName[this->p_crr_state->layer[layer_no].state]);
}
// Store previous layers
this->prv_layers = this->crr_layers;
+ // Store previous role history
+ this->prv_invisible_role_history = this->crr_invisible_role_history;
+
// Update layers
for (int layer_no = StmLayerNoMin;
layer_no <= StmLayerNoMax; layer_no++)
{
const char *layer_name = kStmLayerName[layer_no];
+ // If restriction mode is changed to mode2 on,
+ // store current state for state of restriction mode off
+ if (this->changedRestrictionModeTo2On() ||
+ this->changedLightstatusBrakeOnToOff())
+ {
+ HMI_DEBUG("Store current state for state of restriction mode off");
+ this->prv_layers_car_stop[layer_name] = this->crr_layers[layer_name];
+ }
+
// This layer is changed?
- int changed = crr_state.layer[layer_no].changed;
+ int changed = this->p_crr_state->layer[layer_no].changed;
if (changed)
{
HMI_DEBUG(">>>>>>>>>> Update layout of layer:%s", layer_name);
// Get current layout name of this layer
- int crr_layout_state_no = crr_state.layer[layer_no].state;
+ int crr_layout_state_no = this->p_crr_state->layer[layer_no].state;
std::string crr_layout_name = std::string(kStmLayoutName[crr_layout_state_no]);
LayoutState crr_layout_state;
- this->updateLayout(event_id, layer_no,
- crr_layout_name, crr_layout_state);
+ changed = this->updateLayout(event_id, layer_no,
+ crr_layout_name, crr_layout_state);
// Update current layout of this layer
this->crr_layers[layer_name].layout_state = crr_layout_state;
}
+ else
+ {
+ int category_no = STM_GET_CATEGORY_FROM_ID(event_id);
+ std::string req_ctg = kStmCategoryName[category_no];
+ std::string req_role = this->req_role_list[event_id];
+ for (const auto &ctg : this->layer2categories[layer_name])
+ {
+ if (ctg == req_ctg)
+ {
+ // If layer is not changed and requested role is in this layer,
+ // push requested role to history stack
+ // because the application which has this role have been started
+ HMI_DEBUG("Add requested role to history "
+ "because the application which has this role have been started");
+ this->pushInvisibleRoleHistory(req_ctg, req_role);
+ }
+ }
+ }
+
// Update changed flag
this->crr_layers[layer_name].changed = (changed) ? true : false;
}
@@ -375,7 +468,7 @@ void PolicyManager::updateLayer(int event_id, StmState crr_state)
int PolicyManager::updateLayout(int event_id, int layer_no,
std::string crr_layout_name, LayoutState &crr_layout_state)
{
- int changed;
+ int changed = 1;
int event_no = STM_GET_EVENT_FROM_ID(event_id);
int category_no = STM_GET_CATEGORY_FROM_ID(event_id);
@@ -392,7 +485,36 @@ int PolicyManager::updateLayout(int event_id, int layer_no,
LayoutState prv_layout_state = this->prv_layers[layer_name].layout_state;
std::string prv_layout_name = prv_layout_state.name;
- if ((prv_layout_name == crr_layout_name) &&
+ if (this->changedRestrictionMode2OnToOther() ||
+ this->changedLightstatusBrakeOffToOn())
+ {
+ // If restriction mode is changed from mode2 -> mode1,
+ // restore state of restriction mode off
+ HMI_DEBUG("Restriction mode is changed from mode2 -> mode1, so restore state of restriction mode off");
+ crr_layout_state = this->prv_layers_car_stop[layer_name].layout_state;
+ crr_layout_name = crr_layout_state.name;
+ if ((prv_layout_name == crr_layout_name) &&
+ (kStmAreaName[StmAreaNoNone] == crr_layout_name))
+ {
+ changed = 0;
+ }
+ else
+ {
+ // If the roles which is exist in previous layout is not in current,
+ // push to role history
+ for (const auto &prv_as : prv_layout_state.area_list)
+ {
+ for (const auto &crr_as : crr_layout_state.area_list)
+ {
+ if (prv_as.role == crr_as.role)
+ break;
+ }
+
+ this->pushInvisibleRoleHistory(prv_as.category, prv_as.role);
+ }
+ }
+ }
+ else if ((prv_layout_name == crr_layout_name) &&
(kStmLayoutName[StmLayoutNoNone] == crr_layout_name))
{
// If previous and current layout are none
@@ -572,10 +694,35 @@ int PolicyManager::updateLayout(int event_id, int layer_no,
return changed;
}
-void PolicyManager::createOutputInformation(StmState crr_state, json_object **json_out)
+void PolicyManager::createOutputInformation(json_object **json_out)
{
json_object *json_tmp;
+ // Create car element information
+ // {
+ // "car_elements": [
+ // {
+ // "parking_brake": {
+ // "changed": <bool>,
+ // "state": <const char*>
+ // },
+ // ...
+ // },
+ json_object *json_car_ele = json_object_new_array();
+ const char *car_ele_name;
+ for (int car_ele_no = StmCarElementNoMin;
+ car_ele_no <= StmCarElementNoMax; car_ele_no++)
+ {
+ car_ele_name = kStmCarElementName[car_ele_no];
+ json_tmp = json_object_new_object();
+ this->addStateToJson(car_ele_name,
+ this->crr_car_elements[car_ele_name].changed,
+ this->crr_car_elements[car_ele_name].state,
+ &json_tmp);
+ json_object_array_add(json_car_ele, json_tmp);
+ }
+ json_object_object_add(*json_out, "car_elements", json_car_ele);
+
// Create layout information
//
// "layers": [
@@ -608,6 +755,38 @@ void PolicyManager::createOutputInformation(StmState crr_state, json_object **js
json_object_object_add(*json_out, "layers", json_layer);
}
+void PolicyManager::controlTimerEvent()
+{
+ if (this->p_crr_state->car_element[StmCarElementNoRunning].changed)
+ {
+ if (StmRunningNoRun == this->p_crr_state->car_element[StmCarElementNoRunning].state)
+ {
+ // Set delay event(restriction mode on)
+ this->setStateTransitionProcessToSystemd(StmEvtNoRestrictionModeOn,
+ 3000, "");
+ }
+ else if (StmRunningNoStop ==
+ this->p_crr_state->car_element[StmCarElementNoRunning].state)
+ {
+ // Stop timer for restriction on event
+ if (this->event_source_list.find(StmEvtNoRestrictionModeOn) !=
+ this->event_source_list.end())
+ {
+ HMI_DEBUG("Stop timer for restriction on");
+ sd_event_source *event_source = this->event_source_list[StmEvtNoRestrictionModeOn];
+ int ret = sd_event_source_set_enabled(event_source, SD_EVENT_OFF);
+ if (0 > ret)
+ {
+ HMI_ERROR("Failed to stop timer");
+ }
+ }
+
+ // Set event(restriction mode off)
+ this->setStateTransitionProcessToSystemd(StmEvtNoRestrictionModeOff, 0, "");
+ }
+ }
+}
+
int PolicyManager::transitionState(sd_event_source *source, void *data)
{
HMI_DEBUG(">>>>>>>>>> START STATE TRANSITION");
@@ -623,9 +802,11 @@ int PolicyManager::transitionState(sd_event_source *source, void *data)
kStmCategoryName[category_no],
kStmAreaName[area_no]);
+ // Store current state
+ *(this->p_prv_state) = *(this->p_crr_state);
+
// Transition state
- StmState crr_state;
- int ret = stmTransitionState(event_id, &crr_state);
+ int ret = stmTransitionState(event_id, this->p_crr_state);
if (0 > ret)
{
HMI_ERROR("Failed transition state");
@@ -647,11 +828,11 @@ int PolicyManager::transitionState(sd_event_source *source, void *data)
}
// Update state which is managed by PolicyManager
- this->updateState(event_id, crr_state);
+ this->updateState(event_id);
// Create output information for ResourceManager
json_object *json_out = json_object_new_object();
- this->createOutputInformation(crr_state, &json_out);
+ this->createOutputInformation(&json_out);
// Notify changed state
if (nullptr != this->callback.onStateTransitioned)
@@ -659,6 +840,9 @@ int PolicyManager::transitionState(sd_event_source *source, void *data)
this->callback.onStateTransitioned(json_out);
}
+ // Start/Stop timer events
+ this->controlTimerEvent();
+
// Release json_object
json_object_put(json_out);
@@ -689,7 +873,7 @@ int PolicyManager::timerEvent(sd_event_source *source, uint64_t usec, void *data
int PolicyManager::setStateTransitionProcessToSystemd(int event_id, uint64_t delay_ms, std::string role)
{
struct sd_event_source *event_source;
- HMI_DEBUG("wm:pm", "event_id:0x%x delay:%d role:%s", event_id, delay_ms, role.c_str());
+ HMI_DEBUG("event_id:0x%x delay:%d role:%s", event_id, delay_ms, role.c_str());
if (0 == delay_ms)
{
@@ -697,7 +881,7 @@ int PolicyManager::setStateTransitionProcessToSystemd(int event_id, uint64_t del
&pm::transitionStateWrapper, new int(event_id));
if (0 > ret)
{
- HMI_ERROR("wm:pm", "Faild to sd_event_add_defer: errno:%d", ret);
+ HMI_ERROR("Faild to sd_event_add_defer: errno:%d", ret);
return -1;
}
}
@@ -716,7 +900,7 @@ int PolicyManager::setStateTransitionProcessToSystemd(int event_id, uint64_t del
&pm::timerEventWrapper, new int(event_id));
if (0 > ret)
{
- HMI_ERROR("wm:pm", "Faild to sd_event_add_time: errno:%d", ret);
+ HMI_ERROR("Faild to sd_event_add_time: errno:%d", ret);
return -1;
}
}
@@ -727,7 +911,59 @@ int PolicyManager::setStateTransitionProcessToSystemd(int event_id, uint64_t del
return 0;
}
-int PolicyManager::loadRoleDb()
+bool PolicyManager::changedRestrictionModeTo2On()
+{
+ // TODO: If possible thie process should be include in zipc stm in the future
+ if (this->p_crr_state->car_element[StmCarElementNoRestrictionMode].changed &&
+ (StmRestrictionModeSttNoOn != this->p_prv_state->car_element[StmCarElementNoRestrictionMode].state) &&
+ (StmRestrictionModeSttNoOn == this->p_crr_state->car_element[StmCarElementNoRestrictionMode].state))
+ {
+ return true;
+ }
+ return false;
+}
+
+bool PolicyManager::changedRestrictionMode2OnToOther()
+{
+ // TODO: If possible thie process should be include in zipc stm in the future
+ if (this->p_crr_state->car_element[StmCarElementNoRestrictionMode].changed &&
+ (StmRestrictionModeSttNoOn == this->p_prv_state->car_element[StmCarElementNoRestrictionMode].state) &&
+ (StmRestrictionModeSttNoOn != this->p_crr_state->car_element[StmCarElementNoRestrictionMode].state))
+ {
+ return true;
+ }
+ return false;
+}
+
+bool PolicyManager::changedLightstatusBrakeOffToOn()
+{
+ // TODO: For master
+ // If possible thie process should be include in zipc stm in the future
+ if (("master" == this->ecu_name) &&
+ this->p_crr_state->car_element[StmCarElementNoLightstatusBrake].changed &&
+ (StmLightstatusBrakeSttNoOff == this->p_prv_state->car_element[StmCarElementNoLightstatusBrake].state) &&
+ (StmLightstatusBrakeSttNoOn == this->p_crr_state->car_element[StmCarElementNoLightstatusBrake].state))
+ {
+ return true;
+ }
+ return false;
+}
+
+bool PolicyManager::changedLightstatusBrakeOnToOff()
+{
+ // TODO: For master
+ // If possible thie process should be include in zipc stm in the future
+ if (("master" == this->ecu_name) &&
+ this->p_crr_state->car_element[StmCarElementNoLightstatusBrake].changed &&
+ (StmLightstatusBrakeSttNoOn == this->p_prv_state->car_element[StmCarElementNoLightstatusBrake].state) &&
+ (StmLightstatusBrakeSttNoOff == this->p_crr_state->car_element[StmCarElementNoLightstatusBrake].state))
+ {
+ return true;
+ }
+ return false;
+}
+
+int PolicyManager::loadRolesConfigFile()
{
std::string file_name;
@@ -741,21 +977,62 @@ int PolicyManager::loadRoleDb()
}
else
{
- file_name = std::string(afm_app_install_dir) + std::string("/etc/roles.db");
+ file_name = std::string(afm_app_install_dir) + std::string(pm::kPathRolesConfigFile);
}
- // Load roles.db
+ // Load roles config file
json_object *json_obj;
int ret = this->inputJsonFilie(file_name.c_str(), &json_obj);
if (0 > ret)
{
- HMI_ERROR("Could not open roles.db, so use default role information");
- json_obj = json_tokener_parse(kDefaultRoleDb);
+ HMI_ERROR("Could not open %s, so use default role information", pm::kPathRolesConfigFile);
+ json_obj = json_tokener_parse(kDefaultRolesConfig);
}
HMI_DEBUG("json_obj dump:%s", json_object_get_string(json_obj));
+ // Parse ecus
+ json_object *json_cfg;
+ if (!json_object_object_get_ex(json_obj, "ecus", &json_cfg))
+ {
+ HMI_ERROR("Parse Error!!");
+ return -1;
+ }
+
+ int num_ecu = json_object_array_length(json_cfg);
+ HMI_DEBUG("json_cfg(ecus) len:%d", num_ecu);
+
+ const char* c_ecu_name;
+ json_object *json_ecu;
+ for (int i = 0; i < num_ecu; i++)
+ {
+ json_ecu= json_object_array_get_idx(json_cfg, i);
+
+ c_ecu_name = this->getStringFromJson(json_ecu, "name");
+ if (nullptr == c_ecu_name)
+ {
+ HMI_ERROR("Parse Error!!");
+ return -1;
+ }
+
+ if (std::string(c_ecu_name) == this->ecu_name)
+ {
+ break;
+ }
+ else
+ {
+ json_ecu = nullptr;
+ }
+ }
+
+ if (!json_ecu)
+ {
+ HMI_ERROR("Areas for ecu:%s is NOT exist!!", this->ecu_name.c_str());
+ return -1;
+ }
+
+ // Parse roles
json_object *json_roles;
- if (!json_object_object_get_ex(json_obj, "roles", &json_roles))
+ if (!json_object_object_get_ex(json_ecu, "roles", &json_roles))
{
HMI_ERROR("Parse Error!!");
return -1;
@@ -825,10 +1102,19 @@ int PolicyManager::loadRoleDb()
HMI_DEBUG("key:%s, val:%s", x.first.c_str(), y.c_str());
}
}
+
+ HMI_DEBUG("Check layer2categories");
+ for (const auto &x : this->layer2categories)
+ {
+ for (const auto &y : x.second)
+ {
+ HMI_DEBUG("key:%s, val:%s", x.first.c_str(), y.c_str());
+ }
+ }
return 0;
}
-int PolicyManager::loadStateDb()
+int PolicyManager::loadLayoutsConfigFile()
{
HMI_DEBUG("Call");
@@ -843,38 +1129,78 @@ int PolicyManager::loadStateDb()
}
else
{
- file_name = std::string(afm_app_install_dir) + std::string("/etc/states.db");
+ file_name = std::string(afm_app_install_dir) + std::string(pm::kPathLayoutsConfigFile);
}
- // Load states.db
+ // Load states config file
json_object *json_obj;
int ret = this->inputJsonFilie(file_name.c_str(), &json_obj);
if (0 > ret)
{
- HMI_DEBUG("Could not open states.db, so use default layout information");
- json_obj = json_tokener_parse(kDefaultStateDb);
+ HMI_DEBUG("Could not open %s, so use default layout information", pm::kPathLayoutsConfigFile);
+ json_obj = json_tokener_parse(kDefaultLayoutsConfig);
}
HMI_DEBUG("json_obj dump:%s", json_object_get_string(json_obj));
- // Perse states
- HMI_DEBUG("Perse states");
+ // Parse ecus
json_object *json_cfg;
- if (!json_object_object_get_ex(json_obj, "states", &json_cfg))
+ if (!json_object_object_get_ex(json_obj, "ecus", &json_cfg))
{
HMI_ERROR("Parse Error!!");
return -1;
}
- int len = json_object_array_length(json_cfg);
- HMI_DEBUG("json_cfg len:%d", len);
- HMI_DEBUG("json_cfg dump:%s", json_object_get_string(json_cfg));
+ int num_ecu = json_object_array_length(json_cfg);
+ HMI_DEBUG("json_cfg(ecus) len:%d", num_ecu);
+
+ const char* c_ecu_name;
+ json_object *json_ecu;
+ for (int i = 0; i < num_ecu; i++)
+ {
+ json_ecu= json_object_array_get_idx(json_cfg, i);
+
+ c_ecu_name = this->getStringFromJson(json_ecu, "name");
+ if (nullptr == c_ecu_name)
+ {
+ HMI_ERROR("Parse Error!!");
+ return -1;
+ }
+
+ if (std::string(c_ecu_name) == this->ecu_name)
+ {
+ break;
+ }
+ else
+ {
+ json_ecu = nullptr;
+ }
+ }
+
+ if (!json_ecu)
+ {
+ HMI_ERROR("Areas for ecu:%s is NOT exist!!", this->ecu_name.c_str());
+ return -1;
+ }
+
+ // Perse layouts
+ HMI_DEBUG("Perse layouts");
+ json_object *json_layouts;
+ if (!json_object_object_get_ex(json_ecu, "layouts", &json_layouts))
+ {
+ HMI_ERROR("Parse Error!!");
+ return -1;
+ }
+
+ int len = json_object_array_length(json_layouts);
+ HMI_DEBUG("json_layouts len:%d", len);
+ HMI_DEBUG("json_layouts dump:%s", json_object_get_string(json_layouts));
const char *layout;
const char *role;
const char *category;
for (int i = 0; i < len; i++)
{
- json_object *json_tmp = json_object_array_get_idx(json_cfg, i);
+ json_object *json_tmp = json_object_array_get_idx(json_layouts, i);
layout = this->getStringFromJson(json_tmp, "name");
if (nullptr == layout)
@@ -979,35 +1305,35 @@ int PolicyManager::loadStateDb()
void PolicyManager::pushInvisibleRoleHistory(std::string category, std::string role)
{
- auto i = std::remove_if(this->invisible_role_history[category].begin(),
- this->invisible_role_history[category].end(),
+ auto i = std::remove_if(this->crr_invisible_role_history[category].begin(),
+ this->crr_invisible_role_history[category].end(),
[role](std::string x) { return (role == x); });
- if (this->invisible_role_history[category].end() != i)
+ if (this->crr_invisible_role_history[category].end() != i)
{
- this->invisible_role_history[category].erase(i);
+ this->crr_invisible_role_history[category].erase(i);
}
- this->invisible_role_history[category].push_back(role);
+ this->crr_invisible_role_history[category].push_back(role);
- if (pm::kInvisibleRoleHistoryNum < invisible_role_history[category].size())
+ if (pm::kInvisibleRoleHistoryNum < crr_invisible_role_history[category].size())
{
- this->invisible_role_history[category].erase(
- this->invisible_role_history[category].begin());
+ this->crr_invisible_role_history[category].erase(
+ this->crr_invisible_role_history[category].begin());
}
}
std::string PolicyManager::popInvisibleRoleHistory(std::string category)
{
std::string role;
- if (invisible_role_history[category].empty())
+ if (crr_invisible_role_history[category].empty())
{
role = "";
}
else
{
- role = this->invisible_role_history[category].back();
- this->invisible_role_history[category].pop_back();
+ role = this->crr_invisible_role_history[category].back();
+ this->crr_invisible_role_history[category].pop_back();
}
return role;
}
@@ -1116,7 +1442,7 @@ void PolicyManager::dumpInvisibleRoleHistory()
std::string category = std::string(kStmCategoryName[ctg_no]);
std::string str = category + " [ ";
- for (const auto &i : this->invisible_role_history[category])
+ for (const auto &i : this->crr_invisible_role_history[category])
str += (i + " > ");
str += "]";
@@ -1152,7 +1478,7 @@ std::string PolicyManager::deleteSpace(std::string str)
return ret;
}
-const char *PolicyManager::kDefaultRoleDb = "{ \
+const char *PolicyManager::kDefaultRolesConfig = "{ \
\"roles\":[ \
{ \
\"category\": \"homescreen\", \
@@ -1197,8 +1523,8 @@ const char *PolicyManager::kDefaultRoleDb = "{ \
] \
}";
-const char *PolicyManager::kDefaultStateDb = "{ \
- \"states\": [ \
+const char *PolicyManager::kDefaultLayoutsConfig = "{ \
+ \"layouts\": [ \
{ \
\"name\": \"homescreen\", \
\"layer\": \"far_homescreen\", \
diff --git a/policy_manager/policy_manager.hpp b/policy_manager/policy_manager.hpp
index 798b706..61fbf06 100644
--- a/policy_manager/policy_manager.hpp
+++ b/policy_manager/policy_manager.hpp
@@ -31,7 +31,7 @@ class PolicyManager
{
public:
explicit PolicyManager();
- ~PolicyManager() = default;
+ ~PolicyManager();
using Handler = std::function<void(json_object *)>;
@@ -41,7 +41,7 @@ class PolicyManager
Handler onError;
} CallbackTable;
- int initialize();
+ int initialize(std::string ecu_name);
void registerCallback(CallbackTable callback_table);
int setInputEventData(json_object *json_in);
int executeStateTransition();
@@ -87,10 +87,19 @@ class PolicyManager
bool changed;
} LayerState;
+ typedef struct Mode
+ {
+ std::string state;
+ bool changed;
+ } Mode;
+
typedef std::vector<std::string> Areas;
typedef std::vector<std::string> Categories;
typedef std::vector<std::string> Roles;
+ StmState *p_crr_state;
+ StmState *p_prv_state;
+
// Convert map
std::unordered_map<std::string, int> eventname2no;
std::unordered_map<std::string, int> categoryname2no;
@@ -107,27 +116,43 @@ class PolicyManager
CallbackTable callback;
+ std::unordered_map<std::string, Mode> prv_car_elements;
+ std::unordered_map<std::string, Mode> crr_car_elements;
+
std::unordered_map<std::string, LayerState> prv_layers;
std::unordered_map<std::string, LayerState> crr_layers;
+ std::unordered_map<std::string, LayerState> prv_layers_car_stop;
+
std::unordered_map<std::string, LayoutState> default_layouts;
- std::map<std::string, Roles> invisible_role_history;
+ std::map<std::string, Roles> crr_invisible_role_history;
+ std::map<std::string, Roles> prv_invisible_role_history;
+
+ std::string ecu_name;
void initializeState();
+ void initializeModeState();
void initializeLayerState();
- void updateState(int event_id, StmState crr_state);
- void updateLayer(int event_id, StmState crr_state);
+ void updateState(int event_id);
+ void updateModeState();
+ void updateLayer(int event_id);
int updateLayout(int event_id, int layer_no,
std::string crr_layout_name, LayoutState &crr_layout_state);
- void createOutputInformation(StmState crr_state, json_object **json_out);
+ void createOutputInformation(json_object **json_out);
+ void controlTimerEvent();
int setStateTransitionProcessToSystemd(int event, uint64_t delay_ms, std::string role);
void pushInvisibleRoleHistory(std::string category, std::string role);
std::string popInvisibleRoleHistory(std::string category);
- int loadRoleDb();
- int loadStateDb();
+ bool changedRestrictionModeTo2On();
+ bool changedRestrictionMode2OnToOther();
+ bool changedLightstatusBrakeOffToOn();
+ bool changedLightstatusBrakeOnToOff();
+
+ int loadRolesConfigFile();
+ int loadLayoutsConfigFile();
void dumpLayerState(std::unordered_map<std::string, LayerState> &layers);
void dumpInvisibleRoleHistory();
@@ -142,8 +167,8 @@ class PolicyManager
std::vector<std::string> parseString(std::string str, char delimiter);
std::string deleteSpace(std::string str);
- static const char *kDefaultRoleDb;
- static const char *kDefaultStateDb;
+ static const char *kDefaultRolesConfig;
+ static const char *kDefaultLayoutsConfig;
};
#endif // TMCAGLWM_POLICY_MANAGER_HPP
diff --git a/policy_manager/stm/stm.c b/policy_manager/stm/stm.c
index c63a599..1c4170d 100644
--- a/policy_manager/stm/stm.c
+++ b/policy_manager/stm/stm.c
@@ -22,9 +22,18 @@ const char* kStmEventName[] = {
"none",
"activate",
"deactivate",
+ "trans_gear_neutral",
+ "trans_gear_not_neutral",
+ "parking_brake_off",
+ "parking_brake_on",
+ "accel_pedal_off",
+ "accel_pedal_on",
+ "lamp_off",
+ "lamp_on",
+ "lightstatus_brake_off",
+ "lightstatus_brake_on",
"restriction_mode_off",
- "restriction_mode_1_on",
- "restriction_mode_2_on",
+ "restriction_mode_on",
"undo",
};
@@ -34,11 +43,16 @@ const char* kStmCategoryName[] = {
"map",
"general",
"splitable",
+ "splitable_main",
+ "splitable_sub",
"pop_up",
"system_alert",
"restriction",
"system",
"software_keyboard",
+ "tbt",
+ "meter",
+ "receiver",
"debug",
};
@@ -53,6 +67,7 @@ const char* kStmAreaName[] = {
"restriction.split.main",
"restriction.split.sub",
"software_keyboard",
+ "master.split.sub",
};
const char* kStmLayoutName[] = {
@@ -71,6 +86,13 @@ const char* kStmLayoutName[] = {
"restriction.split.sub",
"system.normal",
"software_keyboard",
+ "tbt",
+ "remote_tbt",
+ "meter.normal",
+ "meter_receiver",
+ "meter_splitable",
+ "splitable_receiver",
+ "receiver.split",
"debug.normal",
"debug.split.main",
"debug.split.sub",
@@ -83,9 +105,10 @@ const char* kStmLayerName[] = {
"near_homescreen",
"restriction",
"on_screen",
+ "remote",
};
-const char* kStmModeName[] = {
+const char* kStmCarElementName[] = {
"trans_gear",
"parking_brake",
"accel_pedal",
@@ -95,18 +118,53 @@ const char* kStmModeName[] = {
"restriction_mode",
};
+const char* kStmTransGearStateName[] = {
+ "neutral",
+ "not_neutral"
+};
+
+const char* kStmParkingBrakeStateName[] = {
+ "off",
+ "on"
+};
+
+const char* kStmAccelPedalStateName[] = {
+ "off",
+ "on"
+};
+
+const char* kStmRunningSttNo2Name[] = {
+ "stop",
+ "run"
+};
+
+const char* kStmLampStateName[] = {
+ "off",
+ "on"
+};
+
+const char* kStmLightstatusBrakeStateName[] = {
+ "off",
+ "on"
+};
+
const char* kStmRestrictionModeStateName[] = {
"off",
- "1on",
- "2on",
+ "on",
};
-const char** kStmModeStateNameList[] = {
+const char** kStmCarElementStateNameList[] = {
+ kStmTransGearStateName,
+ kStmParkingBrakeStateName,
+ kStmAccelPedalStateName,
+ kStmRunningSttNo2Name,
+ kStmLampStateName,
+ kStmLightstatusBrakeStateName,
kStmRestrictionModeStateName,
};
-void stmInitialize() {
- stmInitializeInner();
+void stmInitialize(const char *ecu_name) {
+ stmInitializeInner(ecu_name);
}
int stmTransitionState(int event, StmState* state) {
diff --git a/policy_manager/stm/stm.h b/policy_manager/stm/stm.h
index deebf9c..685a43b 100644
--- a/policy_manager/stm/stm.h
+++ b/policy_manager/stm/stm.h
@@ -37,9 +37,18 @@ enum StmEvtNo {
StmEvtNoNone = 0,
StmEvtNoActivate,
StmEvtNoDeactivate,
+ StmEvtNoTransGearN,
+ StmEvtNoTransGearNotN,
+ StmEvtNoParkingBrakeOff,
+ StmEvtNoParkingBrakeOn,
+ StmEvtNoAccelPedalOff,
+ StmEvtNoAccelPedalOn,
+ StmEvtNoLampOff,
+ StmEvtNoLampOn,
+ StmEvtNoLightstatusBrakeOff,
+ StmEvtNoLightstatusBrakeOn,
StmEvtNoRestrictionModeOff,
- StmEvtNoRestrictionMode1On,
- StmEvtNoRestrictionMode2On,
+ StmEvtNoRestrictionModeOn,
StmEvtNoUndo,
StmEvtNoNum,
@@ -55,11 +64,16 @@ enum StmCtgNo {
StmCtgNoMap,
StmCtgNoGeneral,
StmCtgNoSplitable,
+ StmCtgNoSplitableMain,
+ StmCtgNoSplitableSub,
StmCtgNoPopUp,
StmCtgNoSystemAlert,
StmCtgNoRestriction,
StmCtgNoSystem,
StmCtgNoSoftwareKeyboard,
+ StmCtgNoTbt,
+ StmCtgNoMeter,
+ StmCtgNoReceiver,
StmCtgNoDebug,
StmCtgNoNum,
@@ -80,6 +94,7 @@ enum StmAreaNo {
StmAreaNoRestrictionSplitMain,
StmAreaNoRestrictionSplitSub,
StmAreaNoSoftwareKyeboard,
+ StmAreaNoMasterSplitSub,
StmAreaNoNum,
@@ -94,6 +109,7 @@ enum StmLayerNo {
StmLayerNoNearHomescreen,
StmLayerNoRestriction,
StmLayerNoOnScreen,
+ StmLayerNoRemote,
StmLayerNoNum,
@@ -118,6 +134,13 @@ enum StmLayoutNo {
StmLayoutNoRstSplSub,
StmLayoutNoSysNml,
StmLayoutNoSftKbd,
+ StmLayoutNoTbt,
+ StmLayoutNoRmtTbt,
+ StmLayoutNoMtrNml,
+ StmLayoutNoMtrRcv,
+ StmLayoutNoMtrSpl,
+ StmLayoutNoSplRcv,
+ StmLayoutNoRcvSpl,
StmLayoutNoDbgNml,
StmLayoutNoDbgSplMain,
StmLayoutNoDbgSplSub,
@@ -129,21 +152,56 @@ enum StmLayoutNo {
StmLayoutNoMax = StmLayoutNoNum - 1,
};
-// Mode kind number
-enum StmModeNo {
- StmModeNoRestrictionMode = 0,
+// Enum for mode state
+enum StmTransGearStt {
+ StmTransGearSttNoN = 0,
+ StmTransGearSttNoNotN
+};
- StmModeNoNum,
+enum StmParkingBrakeStt {
+ StmParkingBrakeSttNoOff = 0,
+ StmParkingBrakeSttNoOn
+};
- StmModeNoMin = StmModeNoRestrictionMode,
- StmModeNoMax = StmModeNoNum - 1,
+enum StmAccelPedalStt {
+ StmAccelPedalSttNoOff = 0,
+ StmAccelPedalSttNoOn
+};
+
+enum StmCarStt {
+ StmRunningNoStop = 0,
+ StmRunningNoRun
+};
+
+enum StmLampStt {
+ StmLampSttNoOff = 0,
+ StmLampSttNoOn
+};
+
+enum StmLightstatusBrakeStt {
+ StmLightstatusBrakeSttNoOff = 0,
+ StmLightstatusBrakeSttNoOn
};
-// Enum for mode state
enum StmRestrictionModeSttNo {
StmRestrictionModeSttNoOff = 0,
- StmRestrictionModeSttNo1On,
- StmRestrictionModeSttNo2On,
+ StmRestrictionModeSttNoOn,
+};
+
+// Mode kind number
+enum StmCarElementNo {
+ StmCarElementNoTransGear = 0,
+ StmCarElementNoParkingBrake,
+ StmCarElementNoAccelPedal,
+ StmCarElementNoRunning,
+ StmCarElementNoLamp,
+ StmCarElementNoLightstatusBrake,
+ StmCarElementNoRestrictionMode,
+
+ StmCarElementNoNum,
+
+ StmCarElementNoMin = StmCarElementNoTransGear,
+ StmCarElementNoMax = StmCarElementNoNum - 1,
};
// String for state
@@ -152,8 +210,8 @@ extern const char* kStmCategoryName[];
extern const char* kStmAreaName[];
extern const char* kStmLayoutName[];
extern const char* kStmLayerName[];
-extern const char* kStmModeName[];
-extern const char** kStmModeStateNameList[];
+extern const char* kStmCarElementName[];
+extern const char** kStmCarElementStateNameList[];
// Struct for state
typedef struct StmBaseState {
@@ -162,12 +220,12 @@ typedef struct StmBaseState {
} StmBaseState;
typedef struct StmState {
- StmBaseState mode[StmModeNoNum];
+ StmBaseState car_element[StmCarElementNoNum];
StmBaseState layer[StmLayerNoNum];
} StmState;
// API
-void stmInitialize();
+void stmInitialize(const char *ecu_name);
int stmTransitionState(int event_no, StmState* state);
void stmUndoState();
diff --git a/policy_manager/stm/stub/stm_inner.c b/policy_manager/stm/stub/stm_inner.c
index bd1b319..2ae2cf0 100644
--- a/policy_manager/stm/stub/stm_inner.c
+++ b/policy_manager/stm/stub/stm_inner.c
@@ -95,6 +95,32 @@ int stmTransitionStateInner(int event, StmState* state) {
g_stm_crr_state.layer[StmLayerNoOnScreen].state = StmLayoutNoSysAlt;
g_stm_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
}
+ else if (StmCtgNoTbt == category_no)
+ {
+ if (StmAreaNoMasterSplitSub == area_no)
+ {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoRcvSpl;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+
+ g_stm_crr_state.layer[StmLayerNoRemote].state = StmLayoutNoRmtTbt;
+ g_stm_crr_state.layer[StmLayerNoRemote].changed = STM_TRUE;
+ }
+ else if (StmAreaNoNormal == area_no)
+ {
+ g_stm_crr_state.layer[StmLayerNoRemote].state = StmLayoutNoTbt;
+ g_stm_crr_state.layer[StmLayerNoRemote].changed = STM_TRUE;
+ }
+ }
+ else if (StmCtgNoReceiver == category_no)
+ {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoRcvSpl;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+ }
+ else if (StmCtgNoMeter == category_no)
+ {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMtrNml;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+ }
}
else if (StmEvtNoDeactivate == event_no)
{
@@ -138,6 +164,14 @@ int stmTransitionStateInner(int event, StmState* state) {
g_stm_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
}
}
+ else if (StmCtgNoTbt == category_no)
+ {
+ if (StmLayoutNoRmtTbt == g_stm_prv_state.layer[StmLayerNoRemote].state)
+ {
+ g_stm_crr_state.layer[StmLayerNoRemote].state = StmLayoutNoNone;
+ g_stm_crr_state.layer[StmLayerNoRemote].changed = STM_TRUE;
+ }
+ }
}
// Copy current state for return
diff --git a/policy_manager/stm/zipc/CMakeLists.txt b/policy_manager/stm/zipc/CMakeLists.txt
index de286a7..abbdc41 100644
--- a/policy_manager/stm/zipc/CMakeLists.txt
+++ b/policy_manager/stm/zipc/CMakeLists.txt
@@ -24,6 +24,13 @@ set(ST_DIR_NHS ${ST_DIR}/NearHomeScreen)
set(ST_DIR_OS ${ST_DIR}/OnScreenlayer)
set(ST_DIR_RL ${ST_DIR}/RestrictionLayer)
set(ST_DIR_RM ${ST_DIR}/RestrictionMode)
+set(ST_DIR_AP ${ST_DIR}/AccelPedal)
+set(ST_DIR_CS ${ST_DIR}/CarState)
+set(ST_DIR_LSB ${ST_DIR}/LightStatusBrake)
+
+set(ST_DIR_MST_AL ${ST_DIR}/master/layer/apps)
+set(ST_DIR_MST_RMT ${ST_DIR}/master/layer/remote)
+
add_library(${TARGETS_STM}
STATIC
@@ -41,6 +48,16 @@ add_library(${TARGETS_STM}
${ST_DIR_RL}/ZREL_Restriction_func.c
${ST_DIR_RM}/ZREM_RestrictionMode.c
${ST_DIR_RM}/ZREM_RestrictionMode_func.c
+ ${ST_DIR_AP}/ZACCEL_AccelPedal.c
+ ${ST_DIR_AP}/ZACCEL_AccelPedalState_func.c
+ ${ST_DIR_CS}/ZCAR_CarState.c
+ ${ST_DIR_CS}/ZCAR_CarState_func.c
+ ${ST_DIR_LSB}/ZLIGHT_LightstatusBrake.c
+ ${ST_DIR_LSB}/ZLIGHT_LightstatusBrakeStatus_func.c
+ ./stm_master_apps.c
+ ./stm_master_remote.c
+ ${ST_DIR_MST_AL}/Zmaster_apps_apps_main.c
+ ${ST_DIR_MST_RMT}/Zmaster_remote_remote.c
)
target_include_directories(${TARGETS_STM}
@@ -53,6 +70,11 @@ target_include_directories(${TARGETS_STM}
./${ST_DIR_OS}
./${ST_DIR_RL}
./${ST_DIR_RM}
+ ./${ST_DIR_AP}
+ ./${ST_DIR_CS}
+ ./${ST_DIR_LSB}
+ ./${ST_DIR_MST_AL}
+ ./${ST_DIR_MST_RMT}
./${ST_DIR_CMN}
)
diff --git a/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedal.c b/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedal.c
new file mode 100644
index 0000000..fa692ee
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedal.c
@@ -0,0 +1,117 @@
+/************************************************************/
+/* ZACCEL_AccelPedal.c */
+/* AccelPedal State transition model source file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#include "../ZST_include.h"
+
+/* State management variable */
+static uint8_t ZACCEL_AccelPedalState[ZACCEL_ACCELPEDALSTATENOMAX];
+
+static void ZACCEL_AccelPedals0e1( void );
+static void ZACCEL_AccelPedals1e0( void );
+static void ZACCEL_AccelPedals0Event( void );
+static void ZACCEL_AccelPedals1Event( void );
+
+/****************************************/
+/* Action function */
+/* STM : AccelPedal */
+/* State : accel_pedal_off( No 0 ) */
+/* Event : evt_accel_pedal_on( No 1 ) */
+/****************************************/
+static void ZACCEL_AccelPedals0e1( void )
+{
+ ZACCEL_AccelPedalState[ZACCEL_ACCELPEDAL] = ( uint8_t )ZACCEL_ACCELPEDALS1;
+ stm_aps_start_activity_accel_pedal_on();
+}
+
+/****************************************/
+/* Action function */
+/* STM : AccelPedal */
+/* State : accel_pedal_on( No 1 ) */
+/* Event : evt_accel_pedal_off( No 0 )*/
+/****************************************/
+static void ZACCEL_AccelPedals1e0( void )
+{
+ ZACCEL_AccelPedalState[ZACCEL_ACCELPEDAL] = ( uint8_t )ZACCEL_ACCELPEDALS0;
+ stm_aps_start_activity_accel_pedal_off();
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : AccelPedal */
+/* State : accel_pedal_off( No 0 ) */
+/****************************************/
+static void ZACCEL_AccelPedals0Event( void )
+{
+ /*evt_accel_pedal_on*/
+ if( g_stm_event == StmEvtNoAccelPedalOn )
+ {
+ ZACCEL_AccelPedals0e1();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : AccelPedal */
+/* State : accel_pedal_on( No 1 ) */
+/****************************************/
+static void ZACCEL_AccelPedals1Event( void )
+{
+ /*evt_accel_pedal_off*/
+ if( g_stm_event == StmEvtNoAccelPedalOff )
+ {
+ ZACCEL_AccelPedals1e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event call function */
+/* STM : AccelPedal */
+/****************************************/
+void stm_aps_event_call( void )
+{
+ stm_aps_start_stm();
+ switch( ZACCEL_AccelPedalState[ZACCEL_ACCELPEDAL] )
+ {
+ case ZACCEL_ACCELPEDALS0:
+ ZACCEL_AccelPedals0Event();
+ break;
+ case ZACCEL_ACCELPEDALS1:
+ ZACCEL_AccelPedals1Event();
+ break;
+ default:
+ /*Not accessible to this else (default).*/
+ break;
+ }
+}
+
+/****************************************/
+/* Initial function */
+/* STM : AccelPedal */
+/****************************************/
+void stm_aps_initialize( void )
+{
+ ZACCEL_AccelPedalState[ZACCEL_ACCELPEDAL] = ( uint8_t )ZACCEL_ACCELPEDALS0;
+ stm_aps_start_activity_accel_pedal_off();
+}
+
+/****************************************/
+/* Terminate function */
+/* STM : AccelPedal */
+/****************************************/
+void ZACCEL_AccelPedalTerminate( void )
+{
+ ZACCEL_AccelPedalState[ZACCEL_ACCELPEDAL] = ( uint8_t )ZACCEL_ACCELPEDALTERMINATE;
+}
+
diff --git a/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedal.h b/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedal.h
new file mode 100644
index 0000000..40da956
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedal.h
@@ -0,0 +1,41 @@
+/************************************************************/
+/* ZACCEL_AccelPedal.h */
+/* AccelPedal State transition model header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZACCEL_ACCELPEDAL_H
+#define ZHEADER_ZACCEL_ACCELPEDAL_H
+
+/*State management variable access define*/
+#define ZACCEL_ACCELPEDAL ( 0U )
+#define ZACCEL_ACCELPEDALS0 ( 0U )
+#define ZACCEL_ACCELPEDALS1 ( 1U )
+#define ZACCEL_ACCELPEDALSTATENOMAX ( 1U )
+
+/*End state define*/
+#define ZACCEL_ACCELPEDALEND ( 2U )
+/*Terminate state define*/
+#define ZACCEL_ACCELPEDALTERMINATE ( ZACCEL_ACCELPEDALEND + 1U )
+
+/*State no define*/
+#define ZACCEL_ACCELPEDALS0STATENO ( 0U )
+#define ZACCEL_ACCELPEDALS1STATENO ( 1U )
+
+/*State serial no define*/
+#define ZACCEL_ACCELPEDALS0STATESERIALNO ( 0U )
+#define ZACCEL_ACCELPEDALS1STATESERIALNO ( 1U )
+
+/*Event no define*/
+#define ZACCEL_ACCELPEDALE0EVENTNO ( 0U )
+#define ZACCEL_ACCELPEDALE1EVENTNO ( 1U )
+
+/*Event serial no define*/
+#define ZACCEL_ACCELPEDALE0EVENTSERIALNO ( 0U )
+#define ZACCEL_ACCELPEDALE1EVENTSERIALNO ( 1U )
+
+/*Extern function*/
+extern void stm_aps_event_call( void );
+extern void stm_aps_initialize( void );
+extern void ZACCEL_AccelPedalTerminate( void );
+
+#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedalState_func.c b/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedalState_func.c
new file mode 100644
index 0000000..1fd9c2a
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedalState_func.c
@@ -0,0 +1,45 @@
+/************************************************************/
+/* ZACCEL_AccelPedalState_func.c */
+/* Function and variable source file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#include "../ZST_include.h"
+
+/*************************************************************
+ Function definition
+*************************************************************/
+
+/*
+ * @name stm_aps_start_activity_accel_pedal_off
+ */
+void stm_aps_start_activity_accel_pedal_off() {
+ g_stm_crr_state.car_element[StmCarElementNoAccelPedal].state = StmAccelPedalSttNoOff;
+ g_stm_crr_state.car_element[StmCarElementNoAccelPedal].changed = STM_TRUE;
+}
+
+/*
+ * @name stm_aps_start_activity_accel_pedal_on
+ */
+void stm_aps_start_activity_accel_pedal_on() {
+ g_stm_crr_state.car_element[StmCarElementNoAccelPedal].state = StmAccelPedalSttNoOn;
+ g_stm_crr_state.car_element[StmCarElementNoAccelPedal].changed = STM_TRUE;
+}
+
+/*
+ * @name stm_aps_initialize_variable
+ */
+void stm_aps_initialize_variable() {
+ g_stm_prv_state.car_element[StmCarElementNoAccelPedal].state = StmAccelPedalSttNoOff;
+ g_stm_prv_state.car_element[StmCarElementNoAccelPedal].changed = STM_FALSE;
+
+ g_stm_crr_state.car_element[StmCarElementNoAccelPedal].state = StmAccelPedalSttNoOff;
+ g_stm_crr_state.car_element[StmCarElementNoAccelPedal].changed = STM_FALSE;
+}
+
+/*
+ * @name stm_aps_start_stm
+ */
+void stm_aps_start_stm() {
+ g_stm_prv_state.car_element[StmCarElementNoAccelPedal].state = g_stm_crr_state.car_element[StmCarElementNoAccelPedal].state;
+ g_stm_crr_state.car_element[StmCarElementNoAccelPedal].changed = STM_FALSE;
+}
diff --git a/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedalState_func.h b/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedalState_func.h
new file mode 100644
index 0000000..7d36cd0
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/AccelPedal/ZACCEL_AccelPedalState_func.h
@@ -0,0 +1,14 @@
+/************************************************************/
+/* ZACCEL_AccelPedalState_func.h */
+/* Function and variable header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZACCEL_ACCELPEDALSTATE_FUNC_H
+#define ZHEADER_ZACCEL_ACCELPEDALSTATE_FUNC_H
+
+extern void stm_aps_start_activity_accel_pedal_off();
+extern void stm_aps_start_activity_accel_pedal_on();
+extern void stm_aps_initialize_variable();
+extern void stm_aps_start_stm();
+
+#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_AppsLayer.c b/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_AppsLayer.c
index b6891e8..3a0865b 100644
--- a/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_AppsLayer.c
+++ b/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_AppsLayer.c
@@ -20,10 +20,10 @@ static void ZAPL_RestrictionModeOffs0e7( void );
static void ZAPL_RestrictionModeOffs0e13( void );
static void ZAPL_RestrictionModeOffs0e15( void );
static void ZAPL_RestrictionModeOffs0e18( void );
-static void ZAPL_RestrictionModeOffs1e0( void );
static void ZAPL_RestrictionModeOffs1e8( void );
+static void ZAPL_RestrictionModeOffs1e14( void );
static void ZAPL_RestrictionModeOffs2e3( void );
-static void ZAPL_RestrictionModeOffs3e2( void );
+static void ZAPL_RestrictionModeOffs3e16( void );
static void ZAPL_RestrictionModeOffs4e3( void );
static void ZAPL_RestrictionModeOffs5e3( void );
static void ZAPL_RestrictionModeOffs6e6( void );
@@ -87,7 +87,7 @@ static void ZAPL_AppsLayers0StateEntry( void )
/****************************************/
/* State start activity function */
/* STM : AppsLayer */
-/* State : restriction_mode_2_on( No 1 ) */
+/* State : restriction_mode_on( No 1 )*/
/****************************************/
static void ZAPL_AppsLayers1StateEntry( void )
{
@@ -121,7 +121,7 @@ static void ZAPL_AppsLayers0e1( void )
/****************************************/
/* Action function */
/* STM : AppsLayer */
-/* State : restriction_mode_2_on( No 1 ) */
+/* State : restriction_mode_on( No 1 )*/
/* Event : stt_restriction_mode_off( No 0 ) */
/****************************************/
static void ZAPL_AppsLayers1e0( void )
@@ -229,23 +229,23 @@ static void ZAPL_RestrictionModeOffs0e18( void )
/* Action function */
/* STM : RestrictionModeOff */
/* State : map( No 1 ) */
-/* Event : ara_normal( No 0 ) */
+/* Event : ara_fullscreen( No 8 ) */
/****************************************/
-static void ZAPL_RestrictionModeOffs1e0( void )
+static void ZAPL_RestrictionModeOffs1e8( void )
{
- stm_apl_start_activity_map();
+ ZAPL_AppsLayerState[ZAPL_APPSLAYERS0F] = ( uint8_t )ZAPL_RESTRICTIONMODEOFFS0;
+ stm_apl_start_activity_none();
}
/****************************************/
/* Action function */
/* STM : RestrictionModeOff */
/* State : map( No 1 ) */
-/* Event : ara_fullscreen( No 8 ) */
+/* Event : stt_prv_layer_apps_map_nml( No 14 ) */
/****************************************/
-static void ZAPL_RestrictionModeOffs1e8( void )
+static void ZAPL_RestrictionModeOffs1e14( void )
{
- ZAPL_AppsLayerState[ZAPL_APPSLAYERS0F] = ( uint8_t )ZAPL_RESTRICTIONMODEOFFS0;
- stm_apl_start_activity_none();
+ stm_apl_start_activity_map();
}
/****************************************/
@@ -263,9 +263,9 @@ static void ZAPL_RestrictionModeOffs2e3( void )
/* Action function */
/* STM : RestrictionModeOff */
/* State : map_fullscreen( No 3 ) */
-/* Event : ara_fullscreen( No 2 ) */
+/* Event : stt_prv_layer_apps_map_fll( No 16 ) */
/****************************************/
-static void ZAPL_RestrictionModeOffs3e2( void )
+static void ZAPL_RestrictionModeOffs3e16( void )
{
stm_apl_start_activity_map_fullscreen();
}
@@ -367,10 +367,10 @@ static void ZAPL_RestrictionModeOns1e3( void )
/****************************************/
static void ZAPL_AppsLayers0Event( void )
{
- /*stt_restriction_mode_2_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo2On )
+ /*stt_restriction_mode_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOn )
{
- stm_apl_event_restriction_mode_2_on();
+ stm_apl_event_restriction_mode_on();
/*stt_map_is_activated*/
if( g_stm_map_is_activated == STM_TRUE )
{
@@ -406,7 +406,7 @@ static void ZAPL_AppsLayers0Event( void )
static void ZAPL_RestrictionModeOffs0Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -548,7 +548,7 @@ static void ZAPL_RestrictionModeOffs0Event( void )
static void ZAPL_RestrictionModeOffs1Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -556,13 +556,8 @@ static void ZAPL_RestrictionModeOffs1Event( void )
/*ctg_map*/
if( g_stm_category == StmCtgNoMap )
{
- /*ara_normal*/
- if( g_stm_area == StmAreaNoNormal )
- {
- ZAPL_RestrictionModeOffs1e0();
- }
/*ara_fullscreen*/
- else if( g_stm_area == StmAreaNoFullscreen )
+ if( g_stm_area == StmAreaNoFullscreen )
{
ZAPL_RestrictionModeOffs0e2();
}
@@ -664,7 +659,7 @@ static void ZAPL_RestrictionModeOffs1Event( void )
/*stt_prv_layer_apps_map_nml*/
else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMapNml )
{
- ZAPL_RestrictionModeOffs1e0();
+ ZAPL_RestrictionModeOffs1e14();
}
/*stt_prv_layer_apps_map_spl*/
else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
@@ -723,7 +718,7 @@ static void ZAPL_RestrictionModeOffs1Event( void )
static void ZAPL_RestrictionModeOffs2Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -898,7 +893,7 @@ static void ZAPL_RestrictionModeOffs2Event( void )
static void ZAPL_RestrictionModeOffs3Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -911,11 +906,6 @@ static void ZAPL_RestrictionModeOffs3Event( void )
{
ZAPL_RestrictionModeOffs0e0();
}
- /*ara_fullscreen*/
- else if( g_stm_area == StmAreaNoFullscreen )
- {
- ZAPL_RestrictionModeOffs3e2();
- }
else
{
/*Else and default design have not done.*/
@@ -1019,7 +1009,7 @@ static void ZAPL_RestrictionModeOffs3Event( void )
/*stt_prv_layer_apps_map_fll*/
else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMapFll )
{
- ZAPL_RestrictionModeOffs3e2();
+ ZAPL_RestrictionModeOffs3e16();
}
/*stt_prv_layer_apps_spl_nml*/
else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
@@ -1068,7 +1058,7 @@ static void ZAPL_RestrictionModeOffs3Event( void )
static void ZAPL_RestrictionModeOffs4Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -1253,7 +1243,7 @@ static void ZAPL_RestrictionModeOffs4Event( void )
static void ZAPL_RestrictionModeOffs5Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -1438,7 +1428,7 @@ static void ZAPL_RestrictionModeOffs5Event( void )
static void ZAPL_RestrictionModeOffs6Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -1608,7 +1598,7 @@ static void ZAPL_RestrictionModeOffs6Event( void )
static void ZAPL_RestrictionModeOffs7Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -1773,12 +1763,12 @@ static void ZAPL_RestrictionModeOffs7Event( void )
/****************************************/
/* Event appraisal function */
/* STM : AppsLayer */
-/* State : restriction_mode_2_on( No 1 ) */
+/* State : restriction_mode_on( No 1 )*/
/****************************************/
static void ZAPL_AppsLayers1Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
stm_apl_event_restriction_mode_off();
ZAPL_AppsLayers1e0();
@@ -1797,8 +1787,8 @@ static void ZAPL_AppsLayers1Event( void )
/****************************************/
static void ZAPL_RestrictionModeOns0Event( void )
{
- /*stt_restriction_mode_2_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo2On )
+ /*stt_restriction_mode_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOn )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -1862,8 +1852,8 @@ static void ZAPL_RestrictionModeOns0Event( void )
/****************************************/
static void ZAPL_RestrictionModeOns1Event( void )
{
- /*stt_restriction_mode_2_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo2On )
+ /*stt_restriction_mode_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOn )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
diff --git a/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.c b/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.c
index b42df05..d2e7075 100644
--- a/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.c
+++ b/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.c
@@ -92,15 +92,15 @@ void stm_apl_start_activity_system() {
* @name stm_apl_event_restriction_mode_off
*/
void stm_apl_event_restriction_mode_off() {
- g_stm_crr_state.layer[StmLayerNoApps].state = g_prv_apps_state_rest_mode_1;
+ g_stm_crr_state.layer[StmLayerNoApps].state = g_prv_apps_state_car_stop;
g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
}
/*
- * @name stm_apl_event_restriction_mode_2_on
+ * @name stm_apl_event_restriction_mode_on
*/
-void stm_apl_event_restriction_mode_2_on() {
- g_prv_apps_state_rest_mode_1 = g_stm_prv_state.layer[StmLayerNoApps].state;
+void stm_apl_event_restriction_mode_on() {
+ g_prv_apps_state_car_stop = g_stm_prv_state.layer[StmLayerNoApps].state;
}
/*
diff --git a/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.h b/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.h
index 6f741b5..4f74c9f 100644
--- a/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.h
+++ b/policy_manager/stm/zipc/StateTransitionor/AppsLayer/ZAPL_Apps_func.h
@@ -15,7 +15,7 @@ extern void stm_apl_start_activity_splitable_split();
extern void stm_apl_start_activity_general();
extern void stm_apl_start_activity_system();
extern void stm_apl_event_restriction_mode_off();
-extern void stm_apl_event_restriction_mode_2_on();
+extern void stm_apl_event_restriction_mode_on();
extern void stm_apl_initialize_variable();
extern void stm_apl_start_stm();
diff --git a/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState.c b/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState.c
new file mode 100644
index 0000000..8e20123
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState.c
@@ -0,0 +1,154 @@
+/************************************************************/
+/* ZCAR_CarState.c */
+/* CarState State transition model source file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#include "../ZST_include.h"
+
+/* State management variable */
+static uint8_t ZCAR_CarStateState[ZCAR_CARSTATESTATENOMAX];
+
+static void ZCAR_CarStates0e1( void );
+static void ZCAR_CarStates1e0( void );
+static void ZCAR_CarStates0Event( void );
+static void ZCAR_CarStates1Event( void );
+
+/****************************************/
+/* Action function */
+/* STM : CarState */
+/* State : car_stop( No 0 ) */
+/* Event : stt_accel_pedal_on( No 1 ) */
+/****************************************/
+static void ZCAR_CarStates0e1( void )
+{
+ ZCAR_CarStateState[ZCAR_CARSTATE] = ( uint8_t )ZCAR_CARSTATES1;
+ stm_rns_start_activity_car_run();
+}
+
+/****************************************/
+/* Action function */
+/* STM : CarState */
+/* State : car_run( No 1 ) */
+/* Event : stt_accel_pedal_off( No 0 )*/
+/****************************************/
+static void ZCAR_CarStates1e0( void )
+{
+ ZCAR_CarStateState[ZCAR_CARSTATE] = ( uint8_t )ZCAR_CARSTATES0;
+ stm_rns_start_activity_car_stop();
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : CarState */
+/* State : car_stop( No 0 ) */
+/****************************************/
+static void ZCAR_CarStates0Event( void )
+{
+ /*stt_lightstatus_brake_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
+ {
+ /*stt_accel_pedal_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoAccelPedal].state == StmAccelPedalSttNoOn )
+ {
+ ZCAR_CarStates0e1();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : CarState */
+/* State : car_run( No 1 ) */
+/****************************************/
+static void ZCAR_CarStates1Event( void )
+{
+ /*stt_lightstatus_brake_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
+ {
+ /*stt_accel_pedal_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoAccelPedal].state == StmAccelPedalSttNoOff )
+ {
+ ZCAR_CarStates1e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*stt_lightstatus_brake_on*/
+ else if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
+ {
+ /*stt_accel_pedal_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoAccelPedal].state == StmAccelPedalSttNoOff )
+ {
+ ZCAR_CarStates1e0();
+ }
+ /*stt_accel_pedal_on*/
+ else if( g_stm_crr_state.car_element[StmCarElementNoAccelPedal].state == StmAccelPedalSttNoOn )
+ {
+ ZCAR_CarStates1e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event call function */
+/* STM : CarState */
+/****************************************/
+void stm_rns_event_call( void )
+{
+ stm_rns_start_stm();
+ switch( ZCAR_CarStateState[ZCAR_CARSTATE] )
+ {
+ case ZCAR_CARSTATES0:
+ ZCAR_CarStates0Event();
+ break;
+ case ZCAR_CARSTATES1:
+ ZCAR_CarStates1Event();
+ break;
+ default:
+ /*Not accessible to this else (default).*/
+ break;
+ }
+}
+
+/****************************************/
+/* Initial function */
+/* STM : CarState */
+/****************************************/
+void stm_rns_initialize( void )
+{
+ ZCAR_CarStateState[ZCAR_CARSTATE] = ( uint8_t )ZCAR_CARSTATES0;
+ stm_rns_start_activity_car_stop();
+}
+
+/****************************************/
+/* Terminate function */
+/* STM : CarState */
+/****************************************/
+void ZCAR_CarStateTerminate( void )
+{
+ ZCAR_CarStateState[ZCAR_CARSTATE] = ( uint8_t )ZCAR_CARSTATETERMINATE;
+}
+
diff --git a/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState.h b/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState.h
new file mode 100644
index 0000000..18003a7
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState.h
@@ -0,0 +1,45 @@
+/************************************************************/
+/* ZCAR_CarState.h */
+/* CarState State transition model header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZCAR_CARSTATE_H
+#define ZHEADER_ZCAR_CARSTATE_H
+
+/*State management variable access define*/
+#define ZCAR_CARSTATE ( 0U )
+#define ZCAR_CARSTATES0 ( 0U )
+#define ZCAR_CARSTATES1 ( 1U )
+#define ZCAR_CARSTATESTATENOMAX ( 1U )
+
+/*End state define*/
+#define ZCAR_CARSTATEEND ( 2U )
+/*Terminate state define*/
+#define ZCAR_CARSTATETERMINATE ( ZCAR_CARSTATEEND + 1U )
+
+/*State no define*/
+#define ZCAR_CARSTATES0STATENO ( 0U )
+#define ZCAR_CARSTATES1STATENO ( 1U )
+
+/*State serial no define*/
+#define ZCAR_CARSTATES0STATESERIALNO ( 0U )
+#define ZCAR_CARSTATES1STATESERIALNO ( 1U )
+
+/*Event no define*/
+#define ZCAR_CARSTATEE0EVENTNO ( 0U )
+#define ZCAR_CARSTATEE1EVENTNO ( 1U )
+#define ZCAR_CARSTATEE2EVENTNO ( 2U )
+#define ZCAR_CARSTATEE3EVENTNO ( 3U )
+
+/*Event serial no define*/
+#define ZCAR_CARSTATEE0EVENTSERIALNO ( 0U )
+#define ZCAR_CARSTATEE1EVENTSERIALNO ( 1U )
+#define ZCAR_CARSTATEE2EVENTSERIALNO ( 2U )
+#define ZCAR_CARSTATEE3EVENTSERIALNO ( 3U )
+
+/*Extern function*/
+extern void stm_rns_event_call( void );
+extern void stm_rns_initialize( void );
+extern void ZCAR_CarStateTerminate( void );
+
+#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState_func.c b/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState_func.c
new file mode 100644
index 0000000..d6cd5d1
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState_func.c
@@ -0,0 +1,45 @@
+/************************************************************/
+/* ZCAR_CarState_func.c */
+/* Function and variable source file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#include "../ZST_include.h"
+
+/*************************************************************
+ Function definition
+*************************************************************/
+
+/*
+ * @name stm_rns_start_activity_car_stop
+ */
+void stm_rns_start_activity_car_stop() {
+ g_stm_crr_state.car_element[StmCarElementNoRunning].state = StmRunningNoStop;
+ g_stm_crr_state.car_element[StmCarElementNoRunning].changed = STM_TRUE;
+}
+
+/*
+ * @name stm_rns_start_activity_car_run
+ */
+void stm_rns_start_activity_car_run() {
+ g_stm_crr_state.car_element[StmCarElementNoRunning].state = StmRunningNoRun;
+ g_stm_crr_state.car_element[StmCarElementNoRunning].changed = STM_TRUE;
+}
+
+/*
+ * @name stm_rns_initialize_variable
+ */
+void stm_rns_initialize_variable() {
+ g_stm_prv_state.car_element[StmCarElementNoRunning].state = StmRunningNoStop;
+ g_stm_prv_state.car_element[StmCarElementNoRunning].changed = STM_FALSE;
+
+ g_stm_crr_state.car_element[StmCarElementNoRunning].state = StmRunningNoStop;
+ g_stm_crr_state.car_element[StmCarElementNoRunning].changed = STM_FALSE;
+}
+
+/*
+ * @name stm_rns_start_stm
+ */
+void stm_rns_start_stm() {
+ g_stm_prv_state.car_element[StmCarElementNoRunning].state = g_stm_crr_state.car_element[StmCarElementNoRunning].state;
+ g_stm_crr_state.car_element[StmCarElementNoRunning].changed = STM_FALSE;
+}
diff --git a/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState_func.h b/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState_func.h
new file mode 100644
index 0000000..8c1dc93
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/CarState/ZCAR_CarState_func.h
@@ -0,0 +1,14 @@
+/************************************************************/
+/* ZCAR_CarState_func.h */
+/* Function and variable header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZCAR_CARSTATE_FUNC_H
+#define ZHEADER_ZCAR_CARSTATE_FUNC_H
+
+extern void stm_rns_start_activity_car_stop();
+extern void stm_rns_start_activity_car_run();
+extern void stm_rns_initialize_variable();
+extern void stm_rns_start_stm();
+
+#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/HomeScreenLayer/ZHSL_HomeScreen.c b/policy_manager/stm/zipc/StateTransitionor/HomeScreenLayer/ZHSL_HomeScreen.c
index a4cd474..1375c66 100644
--- a/policy_manager/stm/zipc/StateTransitionor/HomeScreenLayer/ZHSL_HomeScreen.c
+++ b/policy_manager/stm/zipc/StateTransitionor/HomeScreenLayer/ZHSL_HomeScreen.c
@@ -9,7 +9,6 @@
static uint8_t ZHSL_HomeScreenState[ZHSL_HOMESCREENSTATENOMAX];
static void ZHSL_HomeScreens0e0( void );
-static void ZHSL_HomeScreens1e0( void );
static void ZHSL_HomeScreens0Event( void );
static void ZHSL_HomeScreens1Event( void );
@@ -26,17 +25,6 @@ static void ZHSL_HomeScreens0e0( void )
}
/****************************************/
-/* Action function */
-/* STM : HomeScreen */
-/* State : homescreen( No 1 ) */
-/* Event : ara_fullscreen( No 0 ) */
-/****************************************/
-static void ZHSL_HomeScreens1e0( void )
-{
- stm_hsl_start_activity_homescreen();
-}
-
-/****************************************/
/* Event appraisal function */
/* STM : HomeScreen */
/* State : none( No 0 ) */
@@ -80,34 +68,6 @@ static void ZHSL_HomeScreens0Event( void )
/****************************************/
static void ZHSL_HomeScreens1Event( void )
{
- /*evt_activate*/
- if( g_stm_event == StmEvtNoActivate )
- {
- /*ctg_homescreen*/
- if( g_stm_category == StmCtgNoHomescreen )
- {
- /*ara_fullscreen*/
- if( g_stm_area == StmAreaNoFullscreen )
- {
- ZHSL_HomeScreens1e0();
- }
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
}
/****************************************/
diff --git a/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrake.c b/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrake.c
new file mode 100644
index 0000000..8f65d32
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrake.c
@@ -0,0 +1,117 @@
+/************************************************************/
+/* ZLIGHT_LightstatusBrake.c */
+/* LightstatusBrake State transition model source file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#include "../ZST_include.h"
+
+/* State management variable */
+static uint8_t ZLIGHT_LightstatusBrakeState[ZLIGHT_LIGHTSTATUSBRAKESTATENOMAX];
+
+static void ZLIGHT_LightstatusBrakes0e1( void );
+static void ZLIGHT_LightstatusBrakes1e0( void );
+static void ZLIGHT_LightstatusBrakes0Event( void );
+static void ZLIGHT_LightstatusBrakes1Event( void );
+
+/****************************************/
+/* Action function */
+/* STM : LightstatusBrake */
+/* State : lightstatus_brake_on( No 0 ) */
+/* Event : evt_lightstatus_brake_off( No 1 ) */
+/****************************************/
+static void ZLIGHT_LightstatusBrakes0e1( void )
+{
+ ZLIGHT_LightstatusBrakeState[ZLIGHT_LIGHTSTATUSBRAKE] = ( uint8_t )ZLIGHT_LIGHTSTATUSBRAKES1;
+ stm_lbs_start_activity_lightstatus_brake_off();
+}
+
+/****************************************/
+/* Action function */
+/* STM : LightstatusBrake */
+/* State : lightstatus_brake_off( No 1 ) */
+/* Event : evt_lightstatus_brake_on( No 0 ) */
+/****************************************/
+static void ZLIGHT_LightstatusBrakes1e0( void )
+{
+ ZLIGHT_LightstatusBrakeState[ZLIGHT_LIGHTSTATUSBRAKE] = ( uint8_t )ZLIGHT_LIGHTSTATUSBRAKES0;
+ stm_lbs_start_activity_lightstatus_brake_on();
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : LightstatusBrake */
+/* State : lightstatus_brake_on( No 0 ) */
+/****************************************/
+static void ZLIGHT_LightstatusBrakes0Event( void )
+{
+ /*evt_lightstatus_brake_off*/
+ if( g_stm_event == StmEvtNoLightstatusBrakeOff )
+ {
+ ZLIGHT_LightstatusBrakes0e1();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : LightstatusBrake */
+/* State : lightstatus_brake_off( No 1 ) */
+/****************************************/
+static void ZLIGHT_LightstatusBrakes1Event( void )
+{
+ /*evt_lightstatus_brake_on*/
+ if( g_stm_event == StmEvtNoLightstatusBrakeOn )
+ {
+ ZLIGHT_LightstatusBrakes1e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event call function */
+/* STM : LightstatusBrake */
+/****************************************/
+void stm_lbs_event_call( void )
+{
+ stm_lbs_start_stm();
+ switch( ZLIGHT_LightstatusBrakeState[ZLIGHT_LIGHTSTATUSBRAKE] )
+ {
+ case ZLIGHT_LIGHTSTATUSBRAKES0:
+ ZLIGHT_LightstatusBrakes0Event();
+ break;
+ case ZLIGHT_LIGHTSTATUSBRAKES1:
+ ZLIGHT_LightstatusBrakes1Event();
+ break;
+ default:
+ /*Not accessible to this else (default).*/
+ break;
+ }
+}
+
+/****************************************/
+/* Initial function */
+/* STM : LightstatusBrake */
+/****************************************/
+void stm_lbs_initialize( void )
+{
+ ZLIGHT_LightstatusBrakeState[ZLIGHT_LIGHTSTATUSBRAKE] = ( uint8_t )ZLIGHT_LIGHTSTATUSBRAKES0;
+ stm_lbs_start_activity_lightstatus_brake_on();
+}
+
+/****************************************/
+/* Terminate function */
+/* STM : LightstatusBrake */
+/****************************************/
+void ZLIGHT_LightstatusBrakeTerminate( void )
+{
+ ZLIGHT_LightstatusBrakeState[ZLIGHT_LIGHTSTATUSBRAKE] = ( uint8_t )ZLIGHT_LIGHTSTATUSBRAKETERMINATE;
+}
+
diff --git a/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrake.h b/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrake.h
new file mode 100644
index 0000000..0ced0ec
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrake.h
@@ -0,0 +1,41 @@
+/************************************************************/
+/* ZLIGHT_LightstatusBrake.h */
+/* LightstatusBrake State transition model header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZLIGHT_LIGHTSTATUSBRAKE_H
+#define ZHEADER_ZLIGHT_LIGHTSTATUSBRAKE_H
+
+/*State management variable access define*/
+#define ZLIGHT_LIGHTSTATUSBRAKE ( 0U )
+#define ZLIGHT_LIGHTSTATUSBRAKES0 ( 0U )
+#define ZLIGHT_LIGHTSTATUSBRAKES1 ( 1U )
+#define ZLIGHT_LIGHTSTATUSBRAKESTATENOMAX ( 1U )
+
+/*End state define*/
+#define ZLIGHT_LIGHTSTATUSBRAKEEND ( 2U )
+/*Terminate state define*/
+#define ZLIGHT_LIGHTSTATUSBRAKETERMINATE ( ZLIGHT_LIGHTSTATUSBRAKEEND + 1U )
+
+/*State no define*/
+#define ZLIGHT_LIGHTSTATUSBRAKES0STATENO ( 0U )
+#define ZLIGHT_LIGHTSTATUSBRAKES1STATENO ( 1U )
+
+/*State serial no define*/
+#define ZLIGHT_LIGHTSTATUSBRAKES0STATESERIALNO ( 0U )
+#define ZLIGHT_LIGHTSTATUSBRAKES1STATESERIALNO ( 1U )
+
+/*Event no define*/
+#define ZLIGHT_LIGHTSTATUSBRAKEE0EVENTNO ( 0U )
+#define ZLIGHT_LIGHTSTATUSBRAKEE1EVENTNO ( 1U )
+
+/*Event serial no define*/
+#define ZLIGHT_LIGHTSTATUSBRAKEE0EVENTSERIALNO ( 0U )
+#define ZLIGHT_LIGHTSTATUSBRAKEE1EVENTSERIALNO ( 1U )
+
+/*Extern function*/
+extern void stm_lbs_event_call( void );
+extern void stm_lbs_initialize( void );
+extern void ZLIGHT_LightstatusBrakeTerminate( void );
+
+#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrakeStatus_func.c b/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrakeStatus_func.c
new file mode 100644
index 0000000..70c7478
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrakeStatus_func.c
@@ -0,0 +1,45 @@
+/************************************************************/
+/* ZLIGHT_LightstatusBrakeStatus_func.c */
+/* Function and variable source file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#include "../ZST_include.h"
+
+/*************************************************************
+ Function definition
+*************************************************************/
+
+/*
+ * @name stm_lbs_start_activity_lightstatus_brake_off
+ */
+void stm_lbs_start_activity_lightstatus_brake_off() {
+ g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state = StmLightstatusBrakeSttNoOff;
+ g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].changed = STM_TRUE;
+}
+
+/*
+ * @name stm_lbs_start_activity_lightstatus_brake_on
+ */
+void stm_lbs_start_activity_lightstatus_brake_on() {
+ g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state = StmLightstatusBrakeSttNoOn;
+ g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].changed = STM_TRUE;
+}
+
+/*
+ * @name stm_lbs_initialize_variable
+ */
+void stm_lbs_initialize_variable() {
+ g_stm_prv_state.car_element[StmCarElementNoLightstatusBrake].state = StmLightstatusBrakeSttNoOn;
+ g_stm_prv_state.car_element[StmCarElementNoLightstatusBrake].changed = STM_FALSE;
+
+ g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state = StmLightstatusBrakeSttNoOn;
+ g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].changed = STM_FALSE;
+}
+
+/*
+ * @name stm_lbs_start_stm
+ */
+void stm_lbs_start_stm() {
+ g_stm_prv_state.car_element[StmCarElementNoLightstatusBrake].state = g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state;
+ g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].changed = STM_FALSE;
+}
diff --git a/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrakeStatus_func.h b/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrakeStatus_func.h
new file mode 100644
index 0000000..5ebd5b1
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/LightStatusBrake/ZLIGHT_LightstatusBrakeStatus_func.h
@@ -0,0 +1,14 @@
+/************************************************************/
+/* ZLIGHT_LightstatusBrakeStatus_func.h */
+/* Function and variable header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZLIGHT_LIGHTSTATUSBRAKESTATUS_FUNC_H
+#define ZHEADER_ZLIGHT_LIGHTSTATUSBRAKESTATUS_FUNC_H
+
+extern void stm_lbs_start_activity_lightstatus_brake_off();
+extern void stm_lbs_start_activity_lightstatus_brake_on();
+extern void stm_lbs_initialize_variable();
+extern void stm_lbs_start_stm();
+
+#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomeScreen_func.c b/policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomeScreen_func.c
index c8ba22f..dad2484 100644
--- a/policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomeScreen_func.c
+++ b/policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomeScreen_func.c
@@ -29,15 +29,15 @@ void stm_nhl_start_activity_software_keyboard() {
* @name stm_nhl_event_restriction_mode_off
*/
void stm_nhl_event_restriction_mode_off() {
- g_stm_crr_state.layer[StmLayerNoNearHomescreen].state = g_prv_near_homescreen_state_rest_mode_1;
+ g_stm_crr_state.layer[StmLayerNoNearHomescreen].state = g_prv_near_homescreen_state_car_stop;
g_stm_crr_state.layer[StmLayerNoNearHomescreen].changed = STM_TRUE;
}
/*
- * @name stm_nhl_event_restriction_mode_2_on
+ * @name stm_nhl_event_restriction_mode_on
*/
void stm_nhl_event_restriction_mode_on() {
- g_prv_near_homescreen_state_rest_mode_1 = g_stm_prv_state.layer[StmLayerNoNearHomescreen].state;
+ g_prv_near_homescreen_state_car_stop = g_stm_prv_state.layer[StmLayerNoNearHomescreen].state;
}
/*
diff --git a/policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomescreen.c b/policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomescreen.c
index cc3bbc7..1c024b8 100644
--- a/policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomescreen.c
+++ b/policy_manager/stm/zipc/StateTransitionor/NearHomeScreen/ZNHL_NearHomescreen.c
@@ -10,8 +10,8 @@ static uint8_t ZNHL_NearHomescreenState[ZNHL_NEARHOMESCREENSTATENOMAX];
static void ZNHL_NearHomescreens0e0( void );
static void ZNHL_NearHomescreens0e3( void );
-static void ZNHL_NearHomescreens1e0( void );
static void ZNHL_NearHomescreens1e2( void );
+static void ZNHL_NearHomescreens1e4( void );
static void ZNHL_NearHomescreens0Event( void );
static void ZNHL_NearHomescreens1Event( void );
@@ -42,23 +42,23 @@ static void ZNHL_NearHomescreens0e3( void )
/* Action function */
/* STM : NearHomescreen */
/* State : software_keyboard( No 1 ) */
-/* Event : ara_software_keyboard( No 0 ) */
+/* Event : ctg_software_keyboard( No 2 ) */
/****************************************/
-static void ZNHL_NearHomescreens1e0( void )
+static void ZNHL_NearHomescreens1e2( void )
{
- stm_nhl_start_activity_software_keyboard();
+ ZNHL_NearHomescreenState[ZNHL_NEARHOMESCREEN] = ( uint8_t )ZNHL_NEARHOMESCREENS0;
+ stm_nhl_start_activity_none();
}
/****************************************/
/* Action function */
/* STM : NearHomescreen */
/* State : software_keyboard( No 1 ) */
-/* Event : ctg_software_keyboard( No 2 ) */
+/* Event : stt_prv_layer_near_homescreen_sft_kbd( No 4 ) */
/****************************************/
-static void ZNHL_NearHomescreens1e2( void )
+static void ZNHL_NearHomescreens1e4( void )
{
- ZNHL_NearHomescreenState[ZNHL_NEARHOMESCREEN] = ( uint8_t )ZNHL_NEARHOMESCREENS0;
- stm_nhl_start_activity_none();
+ stm_nhl_start_activity_software_keyboard();
}
/****************************************/
@@ -123,30 +123,8 @@ static void ZNHL_NearHomescreens0Event( void )
/****************************************/
static void ZNHL_NearHomescreens1Event( void )
{
- /*evt_activate*/
- if( g_stm_event == StmEvtNoActivate )
- {
- /*ctg_software_keyboard*/
- if( g_stm_category == StmCtgNoSoftwareKeyboard )
- {
- /*ara_software_keyboard*/
- if( g_stm_area == StmAreaNoSoftwareKyeboard )
- {
- ZNHL_NearHomescreens1e0();
- }
- else
- {
- ZNHL_NearHomescreens1e0();
- }
- }
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
/*evt_deactivate*/
- else if( g_stm_event == StmEvtNoDeactivate )
+ if( g_stm_event == StmEvtNoDeactivate )
{
/*ctg_software_keyboard*/
if( g_stm_category == StmCtgNoSoftwareKeyboard )
@@ -170,7 +148,7 @@ static void ZNHL_NearHomescreens1Event( void )
/*stt_prv_layer_near_homescreen_sft_kbd*/
else if( g_stm_prv_state.layer[StmLayerNoNearHomescreen].state == StmLayoutNoSftKbd )
{
- ZNHL_NearHomescreens1e0();
+ ZNHL_NearHomescreens1e4();
}
else
{
@@ -178,8 +156,8 @@ static void ZNHL_NearHomescreens1Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*stt_restriction_mode_1_on*/
- else if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo1On )
+ /*stt_lightstatus_brake_off*/
+ else if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
{
ZNHL_NearHomescreens1e2();
}
diff --git a/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.c b/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.c
index 90a6f6f..c131608 100644
--- a/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.c
+++ b/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.c
@@ -37,15 +37,15 @@ void stm_osl_start_activity_system_alert() {
* @name stm_osl_event_restriction_mode_off
*/
void stm_osl_event_restriction_mode_off() {
- g_stm_crr_state.layer[StmLayerNoOnScreen].state = g_prv_on_screen_state_rest_mode_1;
+ g_stm_crr_state.layer[StmLayerNoOnScreen].state = g_prv_on_screen_state_car_stop;
g_stm_crr_state.layer[StmLayerNoOnScreen].changed = STM_TRUE;
}
/*
- * @name stm_osl_event_restriction_mode_2_on
+ * @name stm_osl_event_restriction_mode_on
*/
-void stm_osl_event_restriction_mode_2_on() {
- g_prv_on_screen_state_rest_mode_1 = g_stm_prv_state.layer[StmLayerNoOnScreen].state;
+void stm_osl_event_restriction_mode_on() {
+ g_prv_on_screen_state_car_stop = g_stm_prv_state.layer[StmLayerNoOnScreen].state;
}
/*
* @name stm_osl_initialize_variable
diff --git a/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.h b/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.h
index e85accb..3edef28 100644
--- a/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.h
+++ b/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OnScreen_func.h
@@ -10,7 +10,7 @@ extern void stm_osl_start_activity_none();
extern void stm_osl_start_activity_pop_up();
extern void stm_osl_start_activity_system_alert();
extern void stm_osl_event_restriction_mode_off();
-extern void stm_osl_event_restriction_mode_2_on();
+extern void stm_osl_event_restriction_mode_on();
extern void stm_osl_initialize_variable();
extern void stm_osl_start_stm();
diff --git a/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OslMain.c b/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OslMain.c
index 53a50e1..6b60219 100644
--- a/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OslMain.c
+++ b/policy_manager/stm/zipc/StateTransitionor/OnScreenlayer/ZOSL_OslMain.c
@@ -18,11 +18,11 @@ static void ZOSL_OslRestOffs0e1( void );
static void ZOSL_OslRestOffs0e4( void );
static void ZOSL_OslRestOffs1e0( void );
static void ZOSL_OslRestOffs1e2( void );
-static void ZOSL_OslRestOffs2e1( void );
+static void ZOSL_OslRestOffs2e6( void );
static void ZOSL_OslRestOns0e0( void );
static void ZOSL_OslRestOns0e2( void );
-static void ZOSL_OslRestOns1e0( void );
static void ZOSL_OslRestOns1e1( void );
+static void ZOSL_OslRestOns1e3( void );
static void ZOSL_OslMains0Event( void );
static void ZOSL_OslRestOffs0Event( void );
static void ZOSL_OslRestOffs1Event( void );
@@ -58,7 +58,7 @@ static void ZOSL_OslMains0StateEntry( void )
/****************************************/
/* State start activity function */
/* STM : OslMain */
-/* State : restriction_mode_2_on( No 1 ) */
+/* State : restriction_mode_on( No 1 )*/
/****************************************/
static void ZOSL_OslMains1StateEntry( void )
{
@@ -105,7 +105,7 @@ static void ZOSL_OslMains0e2( void )
/****************************************/
/* Action function */
/* STM : OslMain */
-/* State : restriction_mode_2_on( No 1 ) */
+/* State : restriction_mode_on( No 1 )*/
/* Event : stt_restriction_mode_off( No 0 ) */
/****************************************/
static void ZOSL_OslMains1e0( void )
@@ -176,9 +176,9 @@ static void ZOSL_OslRestOffs1e2( void )
/* Action function */
/* STM : OslRestOff */
/* State : system_alert( No 2 ) */
-/* Event : ara_onscreen( No 1 ) */
+/* Event : stt_prv_layer_on_screen_sys_alt( No 6 ) */
/****************************************/
-static void ZOSL_OslRestOffs2e1( void )
+static void ZOSL_OslRestOffs2e6( void )
{
stm_osl_start_activity_system_alert();
}
@@ -210,23 +210,23 @@ static void ZOSL_OslRestOns0e2( void )
/* Action function */
/* STM : OslRestOn */
/* State : system_alert( No 1 ) */
-/* Event : ara_onscreen( No 0 ) */
+/* Event : ctg_systemalert( No 1 ) */
/****************************************/
-static void ZOSL_OslRestOns1e0( void )
+static void ZOSL_OslRestOns1e1( void )
{
- stm_osl_start_activity_system_alert();
+ ZOSL_OslMainState[ZOSL_OSLMAINS1F] = ( uint8_t )ZOSL_OSLRESTONS0;
+ stm_osl_start_activity_none();
}
/****************************************/
/* Action function */
/* STM : OslRestOn */
/* State : system_alert( No 1 ) */
-/* Event : ctg_systemalert( No 1 ) */
+/* Event : stt_prv_layer_on_screen_sys_alt( No 3 ) */
/****************************************/
-static void ZOSL_OslRestOns1e1( void )
+static void ZOSL_OslRestOns1e3( void )
{
- ZOSL_OslMainState[ZOSL_OSLMAINS1F] = ( uint8_t )ZOSL_OSLRESTONS0;
- stm_osl_start_activity_none();
+ stm_osl_start_activity_system_alert();
}
/****************************************/
@@ -236,10 +236,10 @@ static void ZOSL_OslRestOns1e1( void )
/****************************************/
static void ZOSL_OslMains0Event( void )
{
- /*stt_restriction_mode_2_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo2On )
+ /*stt_restriction_mode_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOn )
{
- stm_rel_event_restriction_mode_2_on();
+ stm_rel_event_restriction_mode_on();
/*stt_crr_layer_on_screen_pop*/
if( g_stm_crr_state.layer[StmLayerNoOnScreen].state == StmLayoutNoPopUp )
{
@@ -271,7 +271,7 @@ static void ZOSL_OslMains0Event( void )
static void ZOSL_OslRestOffs0Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -355,7 +355,7 @@ static void ZOSL_OslRestOffs0Event( void )
static void ZOSL_OslRestOffs1Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -453,33 +453,10 @@ static void ZOSL_OslRestOffs1Event( void )
static void ZOSL_OslRestOffs2Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
- /*evt_activate*/
- if( g_stm_event == StmEvtNoActivate )
- {
- /*ctg_systemalert*/
- if( g_stm_category == StmCtgNoSystemAlert )
- {
- /*ara_onscreen*/
- if( g_stm_area == StmAreaNoOnScreen )
- {
- ZOSL_OslRestOffs2e1();
- }
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
/*evt_deactivate*/
- else if( g_stm_event == StmEvtNoDeactivate )
+ if( g_stm_event == StmEvtNoDeactivate )
{
/*ctg_systemalert*/
if( g_stm_category == StmCtgNoSystemAlert )
@@ -508,7 +485,7 @@ static void ZOSL_OslRestOffs2Event( void )
/*stt_prv_layer_on_screen_sys_alt*/
else if( g_stm_prv_state.layer[StmLayerNoOnScreen].state == StmLayoutNoSysAlt )
{
- ZOSL_OslRestOffs2e1();
+ ZOSL_OslRestOffs2e6();
}
else
{
@@ -532,12 +509,12 @@ static void ZOSL_OslRestOffs2Event( void )
/****************************************/
/* Event appraisal function */
/* STM : OslMain */
-/* State : restriction_mode_2_on( No 1 ) */
+/* State : restriction_mode_on( No 1 )*/
/****************************************/
static void ZOSL_OslMains1Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
stm_rel_event_restriction_mode_off();
ZOSL_OslMains1e0();
@@ -556,8 +533,8 @@ static void ZOSL_OslMains1Event( void )
/****************************************/
static void ZOSL_OslRestOns0Event( void )
{
- /*stt_restriction_mode_2_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo2On )
+ /*stt_restriction_mode_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOn )
{
/*evt_activate*/
if( g_stm_event == StmEvtNoActivate )
@@ -621,34 +598,11 @@ static void ZOSL_OslRestOns0Event( void )
/****************************************/
static void ZOSL_OslRestOns1Event( void )
{
- /*stt_restriction_mode_2_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo2On )
+ /*stt_restriction_mode_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOn )
{
- /*evt_activate*/
- if( g_stm_event == StmEvtNoActivate )
- {
- /*ctg_systemalert*/
- if( g_stm_category == StmCtgNoSystemAlert )
- {
- /*ara_onscreen*/
- if( g_stm_area == StmAreaNoOnScreen )
- {
- ZOSL_OslRestOns1e0();
- }
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
/*evt_deactivate*/
- else if( g_stm_event == StmEvtNoDeactivate )
+ if( g_stm_event == StmEvtNoDeactivate )
{
/*ctg_systemalert*/
if( g_stm_category == StmCtgNoSystemAlert )
@@ -672,7 +626,7 @@ static void ZOSL_OslRestOns1Event( void )
/*stt_prv_layer_on_screen_sys_alt*/
else if( g_stm_prv_state.layer[StmLayerNoOnScreen].state == StmLayoutNoSysAlt )
{
- ZOSL_OslRestOns1e0();
+ ZOSL_OslRestOns1e3();
}
else
{
diff --git a/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_RelMain.c b/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_RelMain.c
index 6d07643..4c390ff 100644
--- a/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_RelMain.c
+++ b/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_RelMain.c
@@ -58,7 +58,7 @@ static void ZREL_RelMains0StateEntry( void )
/****************************************/
/* State start activity function */
/* STM : RelMain */
-/* State : restriction_mode_2_on( No 1 ) */
+/* State : restriction_mode_on( No 1 )*/
/****************************************/
static void ZREL_RelMains1StateEntry( void )
{
@@ -77,7 +77,7 @@ static void ZREL_RelMains1StateEntry( void )
/* Action function */
/* STM : RelMain */
/* State : restriction_mode_off( No 0 ) */
-/* Event : stt_restriction_mode_2_on( No 1 ) */
+/* Event : stt_restriction_mode_on( No 1 ) */
/****************************************/
static void ZREL_RelMains0e1( void )
{
@@ -89,7 +89,7 @@ static void ZREL_RelMains0e1( void )
/****************************************/
/* Action function */
/* STM : RelMain */
-/* State : restriction_mode_2_on( No 1 ) */
+/* State : restriction_mode_on( No 1 )*/
/* Event : stt_restriction_mode_off( No 0 ) */
/****************************************/
static void ZREL_RelMains1e0( void )
@@ -197,10 +197,10 @@ static void ZREL_RelRestOffs3e0( void )
/****************************************/
static void ZREL_RelMains0Event( void )
{
- /*stt_restriction_mode_2_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo2On )
+ /*stt_restriction_mode_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOn )
{
- stm_rel_event_restriction_mode_2_on();
+ stm_rel_event_restriction_mode_on();
ZREL_RelMains0e1();
}
else
@@ -217,54 +217,73 @@ static void ZREL_RelMains0Event( void )
/****************************************/
static void ZREL_RelRestOffs0Event( void )
{
- /*stt_restriction_mode_1_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo1On )
+ /*stt_restriction_mode_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
- /*stt_crr_layer_apps_changed*/
- if( g_stm_crr_state.layer[StmLayerNoApps].changed == STM_TRUE )
+ /*stt_lightstatus_brake_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
{
- /*stt_crr_layer_apps_map_spl*/
- if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ /*stt_crr_layer_apps_changed*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].changed == STM_TRUE )
{
- ZREL_RelRestOffs0e0();
- }
- /*stt_crr_layer_apps_spl_nml*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
- {
- ZREL_RelRestOffs0e1();
- }
- /*stt_crr_layer_apps_spl_spl*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
- {
- ZREL_RelRestOffs0e1();
- }
- /*stt_crr_layer_apps_gen_nml*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
- {
- ZREL_RelRestOffs0e1();
+ /*stt_crr_layer_apps_map_spl*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ {
+ ZREL_RelRestOffs0e0();
+ }
+ /*stt_crr_layer_apps_spl_nml*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ /*stt_crr_layer_apps_spl_spl*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ /*stt_crr_layer_apps_gen_nml*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
}
- else
+ /*evt_activate*/
+ else if( g_stm_event == StmEvtNoActivate )
{
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
- /*evt_activate*/
- else if( g_stm_event == StmEvtNoActivate )
- {
- /*ctg_restriction*/
- if( g_stm_category == StmCtgNoRestriction )
- {
- /*ara_restriction_normal*/
- if( g_stm_area == StmAreaNoRestrictionNormal )
+ /*ctg_restriction*/
+ if( g_stm_category == StmCtgNoRestriction )
{
- /*stt_crr_layer_apps_spl_nml*/
- if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ /*ara_restriction_normal*/
+ if( g_stm_area == StmAreaNoRestrictionNormal )
{
- ZREL_RelRestOffs0e1();
+ /*stt_crr_layer_apps_spl_nml*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ /*stt_crr_layer_apps_map_spl*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ {
+ ZREL_RelRestOffs0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ara_restriction_split_main*/
+ else if( g_stm_area == StmAreaNoRestrictionSplitMain )
+ {
+ ZREL_RelRestOffs0e8();
}
- /*stt_crr_layer_apps_map_spl*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ /*ara_restriction_split_sub*/
+ else if( g_stm_area == StmAreaNoRestrictionSplitSub )
{
ZREL_RelRestOffs0e0();
}
@@ -274,16 +293,6 @@ static void ZREL_RelRestOffs0Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*ara_restriction_split_main*/
- else if( g_stm_area == StmAreaNoRestrictionSplitMain )
- {
- ZREL_RelRestOffs0e8();
- }
- /*ara_restriction_split_sub*/
- else if( g_stm_area == StmAreaNoRestrictionSplitSub )
- {
- ZREL_RelRestOffs0e0();
- }
else
{
/*Else and default design have not done.*/
@@ -296,17 +305,8 @@ static void ZREL_RelRestOffs0Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
- /*stt_restriction_mode_off*/
- else if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
- {
/*evt_undo*/
- if( g_stm_event == StmEvtNoUndo )
+ else if( g_stm_event == StmEvtNoUndo )
{
/*stt_prv_layer_rst_none*/
if( g_stm_prv_state.layer[StmLayerNoRestriction].state == StmLayoutNoNone )
@@ -354,62 +354,81 @@ static void ZREL_RelRestOffs0Event( void )
/****************************************/
static void ZREL_RelRestOffs1Event( void )
{
- /*stt_restriction_mode_1_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo1On )
+ /*stt_restriction_mode_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
- /*stt_crr_layer_apps_changed*/
- if( g_stm_crr_state.layer[StmLayerNoApps].changed == STM_TRUE )
- {
- /*stt_crr_layer_apps_map_spl*/
- if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
- {
- ZREL_RelRestOffs0e0();
- }
- /*stt_crr_layer_apps_spl_nml*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
- {
- ZREL_RelRestOffs1e1();
- }
- /*stt_crr_layer_apps_spl_spl*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
- {
- ZREL_RelRestOffs1e1();
- }
- /*stt_crr_layer_apps_gen_nml*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
- {
- ZREL_RelRestOffs1e1();
- }
- else
- {
- ZREL_RelRestOffs1e4();
- }
- }
- /*stt_crr_layer_hs_changed*/
- else if( g_stm_crr_state.layer[StmLayerNoHomescreen].changed == STM_TRUE )
+ /*stt_lightstatus_brake_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
{
- /*stt_crr_layer_hs_hms*/
- if( g_stm_crr_state.layer[StmLayerNoHomescreen].state == StmLayoutNoHms )
+ /*stt_crr_layer_apps_changed*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].changed == STM_TRUE )
{
- ZREL_RelRestOffs1e4();
+ /*stt_crr_layer_apps_map_spl*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ {
+ ZREL_RelRestOffs0e0();
+ }
+ /*stt_crr_layer_apps_spl_nml*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ {
+ ZREL_RelRestOffs1e1();
+ }
+ /*stt_crr_layer_apps_spl_spl*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ ZREL_RelRestOffs1e1();
+ }
+ /*stt_crr_layer_apps_gen_nml*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ ZREL_RelRestOffs1e1();
+ }
+ else
+ {
+ ZREL_RelRestOffs1e4();
+ }
}
- else
+ /*stt_crr_layer_hs_changed*/
+ else if( g_stm_crr_state.layer[StmLayerNoHomescreen].changed == STM_TRUE )
{
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
+ /*stt_crr_layer_hs_hms*/
+ if( g_stm_crr_state.layer[StmLayerNoHomescreen].state == StmLayoutNoHms )
+ {
+ ZREL_RelRestOffs1e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
}
- }
- /*evt_activate*/
- else if( g_stm_event == StmEvtNoActivate )
- {
- /*ctg_restriction*/
- if( g_stm_category == StmCtgNoRestriction )
+ /*evt_activate*/
+ else if( g_stm_event == StmEvtNoActivate )
{
- /*ara_restriction_normal*/
- if( g_stm_area == StmAreaNoRestrictionNormal )
+ /*ctg_restriction*/
+ if( g_stm_category == StmCtgNoRestriction )
{
- /*stt_crr_layer_apps_map_spl*/
- if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ /*ara_restriction_normal*/
+ if( g_stm_area == StmAreaNoRestrictionNormal )
+ {
+ /*stt_crr_layer_apps_map_spl*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ {
+ ZREL_RelRestOffs0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ara_restriction_split_main*/
+ else if( g_stm_area == StmAreaNoRestrictionSplitMain )
+ {
+ ZREL_RelRestOffs0e8();
+ }
+ /*ara_restriction_split_sub*/
+ else if( g_stm_area == StmAreaNoRestrictionSplitSub )
{
ZREL_RelRestOffs0e0();
}
@@ -419,15 +438,19 @@ static void ZREL_RelRestOffs1Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*ara_restriction_split_main*/
- else if( g_stm_area == StmAreaNoRestrictionSplitMain )
+ /*ctg_homescreen*/
+ else if( g_stm_category == StmCtgNoHomescreen )
{
- ZREL_RelRestOffs0e8();
- }
- /*ara_restriction_split_sub*/
- else if( g_stm_area == StmAreaNoRestrictionSplitSub )
- {
- ZREL_RelRestOffs0e0();
+ /*ara_fullscreen*/
+ if( g_stm_area == StmAreaNoFullscreen )
+ {
+ ZREL_RelRestOffs1e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
}
else
{
@@ -435,11 +458,11 @@ static void ZREL_RelRestOffs1Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*ctg_homescreen*/
- else if( g_stm_category == StmCtgNoHomescreen )
+ /*evt_deactivate*/
+ else if( g_stm_event == StmEvtNoDeactivate )
{
- /*ara_fullscreen*/
- if( g_stm_area == StmAreaNoFullscreen )
+ /*ctg_restriction*/
+ if( g_stm_category == StmCtgNoRestriction )
{
ZREL_RelRestOffs1e4();
}
@@ -455,11 +478,11 @@ static void ZREL_RelRestOffs1Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*evt_deactivate*/
- else if( g_stm_event == StmEvtNoDeactivate )
+ /*stt_lightstatus_brake_on*/
+ else if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
{
- /*ctg_restriction*/
- if( g_stm_category == StmCtgNoRestriction )
+ /*stt_prv_layer_rst_not_none*/
+ if( g_stm_prv_state.layer[StmLayerNoRestriction].state != StmLayoutNoNone )
{
ZREL_RelRestOffs1e4();
}
@@ -469,20 +492,6 @@ static void ZREL_RelRestOffs1Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
- /*stt_restriction_mode_off*/
- else if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
- {
- /*stt_prv_layer_rst_not_none*/
- if( g_stm_prv_state.layer[StmLayerNoRestriction].state != StmLayoutNoNone )
- {
- ZREL_RelRestOffs1e4();
- }
/*evt_undo*/
else if( g_stm_event == StmEvtNoUndo )
{
@@ -532,69 +541,83 @@ static void ZREL_RelRestOffs1Event( void )
/****************************************/
static void ZREL_RelRestOffs2Event( void )
{
- /*stt_restriction_mode_1_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo1On )
+ /*stt_restriction_mode_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
- /*stt_crr_layer_apps_changed*/
- if( g_stm_crr_state.layer[StmLayerNoApps].changed == STM_TRUE )
- {
- /*stt_crr_layer_apps_map_spl*/
- if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
- {
- ZREL_RelRestOffs0e0();
- }
- /*stt_crr_layer_apps_spl_nml*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
- {
- ZREL_RelRestOffs0e1();
- }
- /*stt_crr_layer_apps_spl_spl*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
- {
- ZREL_RelRestOffs0e1();
- }
- /*stt_crr_layer_apps_gen_nml*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
- {
- ZREL_RelRestOffs0e1();
- }
- else
- {
- ZREL_RelRestOffs1e4();
- }
- }
- /*stt_crr_layer_hs_changed*/
- else if( g_stm_crr_state.layer[StmLayerNoHomescreen].changed == STM_TRUE )
+ /*stt_lightstatus_brake_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
{
- /*stt_crr_layer_hs_hms*/
- if( g_stm_crr_state.layer[StmLayerNoHomescreen].state == StmLayoutNoHms )
+ /*stt_crr_layer_apps_changed*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].changed == STM_TRUE )
{
- ZREL_RelRestOffs1e4();
+ /*stt_crr_layer_apps_map_spl*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ {
+ ZREL_RelRestOffs0e0();
+ }
+ /*stt_crr_layer_apps_spl_nml*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ /*stt_crr_layer_apps_spl_spl*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ /*stt_crr_layer_apps_gen_nml*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ else
+ {
+ ZREL_RelRestOffs1e4();
+ }
}
- else
+ /*stt_crr_layer_hs_changed*/
+ else if( g_stm_crr_state.layer[StmLayerNoHomescreen].changed == STM_TRUE )
{
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
+ /*stt_crr_layer_hs_hms*/
+ if( g_stm_crr_state.layer[StmLayerNoHomescreen].state == StmLayoutNoHms )
+ {
+ ZREL_RelRestOffs1e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
}
- }
- /*evt_activate*/
- else if( g_stm_event == StmEvtNoActivate )
- {
- /*ctg_restriction*/
- if( g_stm_category == StmCtgNoRestriction )
+ /*evt_activate*/
+ else if( g_stm_event == StmEvtNoActivate )
{
- /*ara_restriction_normal*/
- if( g_stm_area == StmAreaNoRestrictionNormal )
+ /*ctg_restriction*/
+ if( g_stm_category == StmCtgNoRestriction )
{
- /*stt_crr_layer_apps_spl_nml*/
- if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ /*ara_restriction_normal*/
+ if( g_stm_area == StmAreaNoRestrictionNormal )
{
- ZREL_RelRestOffs0e1();
+ /*stt_crr_layer_apps_spl_nml*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ /*stt_crr_layer_apps_map_spl*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ {
+ ZREL_RelRestOffs0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
}
- /*stt_crr_layer_apps_map_spl*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ /*ara_restriction_split_sub*/
+ else if( g_stm_area == StmAreaNoRestrictionSplitSub )
{
- ZREL_RelRestOffs0e0();
+ ZREL_RelRestOffs0e1();
}
else
{
@@ -602,10 +625,19 @@ static void ZREL_RelRestOffs2Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*ara_restriction_split_sub*/
- else if( g_stm_area == StmAreaNoRestrictionSplitSub )
+ /*ctg_homescreen*/
+ else if( g_stm_category == StmCtgNoHomescreen )
{
- ZREL_RelRestOffs0e1();
+ /*ara_fullscreen*/
+ if( g_stm_area == StmAreaNoFullscreen )
+ {
+ ZREL_RelRestOffs1e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
}
else
{
@@ -613,11 +645,11 @@ static void ZREL_RelRestOffs2Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*ctg_homescreen*/
- else if( g_stm_category == StmCtgNoHomescreen )
+ /*evt_deactivate*/
+ else if( g_stm_event == StmEvtNoDeactivate )
{
- /*ara_fullscreen*/
- if( g_stm_area == StmAreaNoFullscreen )
+ /*ctg_restriction*/
+ if( g_stm_category == StmCtgNoRestriction )
{
ZREL_RelRestOffs1e4();
}
@@ -633,11 +665,11 @@ static void ZREL_RelRestOffs2Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*evt_deactivate*/
- else if( g_stm_event == StmEvtNoDeactivate )
+ /*stt_lightstatus_brake_on*/
+ else if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
{
- /*ctg_restriction*/
- if( g_stm_category == StmCtgNoRestriction )
+ /*stt_prv_layer_rst_not_none*/
+ if( g_stm_prv_state.layer[StmLayerNoRestriction].state != StmLayoutNoNone )
{
ZREL_RelRestOffs1e4();
}
@@ -647,20 +679,6 @@ static void ZREL_RelRestOffs2Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
- /*stt_restriction_mode_off*/
- else if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
- {
- /*stt_prv_layer_rst_not_none*/
- if( g_stm_prv_state.layer[StmLayerNoRestriction].state != StmLayoutNoNone )
- {
- ZREL_RelRestOffs1e4();
- }
/*evt_undo*/
else if( g_stm_event == StmEvtNoUndo )
{
@@ -710,62 +728,76 @@ static void ZREL_RelRestOffs2Event( void )
/****************************************/
static void ZREL_RelRestOffs3Event( void )
{
- /*stt_restriction_mode_1_on*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNo1On )
+ /*stt_restriction_mode_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
- /*stt_crr_layer_apps_changed*/
- if( g_stm_crr_state.layer[StmLayerNoApps].changed == STM_TRUE )
- {
- /*stt_crr_layer_apps_map_spl*/
- if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
- {
- ZREL_RelRestOffs3e0();
- }
- /*stt_crr_layer_apps_spl_nml*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
- {
- ZREL_RelRestOffs0e1();
- }
- /*stt_crr_layer_apps_spl_spl*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
- {
- ZREL_RelRestOffs0e1();
- }
- /*stt_crr_layer_apps_gen_nml*/
- else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
- {
- ZREL_RelRestOffs0e1();
- }
- else
- {
- ZREL_RelRestOffs1e4();
- }
- }
- /*stt_crr_layer_hs_changed*/
- else if( g_stm_crr_state.layer[StmLayerNoHomescreen].changed == STM_TRUE )
+ /*stt_lightstatus_brake_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
{
- /*stt_crr_layer_hs_hms*/
- if( g_stm_crr_state.layer[StmLayerNoHomescreen].state == StmLayoutNoHms )
+ /*stt_crr_layer_apps_changed*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].changed == STM_TRUE )
{
- ZREL_RelRestOffs1e4();
+ /*stt_crr_layer_apps_map_spl*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoMapSpl )
+ {
+ ZREL_RelRestOffs3e0();
+ }
+ /*stt_crr_layer_apps_spl_nml*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ /*stt_crr_layer_apps_spl_spl*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ /*stt_crr_layer_apps_gen_nml*/
+ else if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ else
+ {
+ ZREL_RelRestOffs1e4();
+ }
}
- else
+ /*stt_crr_layer_hs_changed*/
+ else if( g_stm_crr_state.layer[StmLayerNoHomescreen].changed == STM_TRUE )
{
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
+ /*stt_crr_layer_hs_hms*/
+ if( g_stm_crr_state.layer[StmLayerNoHomescreen].state == StmLayoutNoHms )
+ {
+ ZREL_RelRestOffs1e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
}
- }
- /*evt_activate*/
- else if( g_stm_event == StmEvtNoActivate )
- {
- /*ctg_restriction*/
- if( g_stm_category == StmCtgNoRestriction )
+ /*evt_activate*/
+ else if( g_stm_event == StmEvtNoActivate )
{
- /*ara_restriction_normal*/
- if( g_stm_area == StmAreaNoRestrictionNormal )
+ /*ctg_restriction*/
+ if( g_stm_category == StmCtgNoRestriction )
{
- /*stt_crr_layer_apps_spl_nml*/
- if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ /*ara_restriction_normal*/
+ if( g_stm_area == StmAreaNoRestrictionNormal )
+ {
+ /*stt_crr_layer_apps_spl_nml*/
+ if( g_stm_crr_state.layer[StmLayerNoApps].state == StmLayoutNoSplNml )
+ {
+ ZREL_RelRestOffs0e1();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ara_restriction_split_main*/
+ else if( g_stm_area == StmAreaNoRestrictionSplitMain )
{
ZREL_RelRestOffs0e1();
}
@@ -775,10 +807,19 @@ static void ZREL_RelRestOffs3Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*ara_restriction_split_main*/
- else if( g_stm_area == StmAreaNoRestrictionSplitMain )
+ /*ctg_homescreen*/
+ else if( g_stm_category == StmCtgNoHomescreen )
{
- ZREL_RelRestOffs0e1();
+ /*ara_fullscreen*/
+ if( g_stm_area == StmAreaNoFullscreen )
+ {
+ ZREL_RelRestOffs1e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
}
else
{
@@ -786,11 +827,11 @@ static void ZREL_RelRestOffs3Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*ctg_homescreen*/
- else if( g_stm_category == StmCtgNoHomescreen )
+ /*evt_deactivate*/
+ else if( g_stm_event == StmEvtNoDeactivate )
{
- /*ara_fullscreen*/
- if( g_stm_area == StmAreaNoFullscreen )
+ /*ctg_restriction*/
+ if( g_stm_category == StmCtgNoRestriction )
{
ZREL_RelRestOffs1e4();
}
@@ -806,11 +847,11 @@ static void ZREL_RelRestOffs3Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- /*evt_deactivate*/
- else if( g_stm_event == StmEvtNoDeactivate )
+ /*stt_lightstatus_brake_on*/
+ else if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
{
- /*ctg_restriction*/
- if( g_stm_category == StmCtgNoRestriction )
+ /*stt_prv_layer_rst_not_none*/
+ if( g_stm_prv_state.layer[StmLayerNoRestriction].state != StmLayoutNoNone )
{
ZREL_RelRestOffs1e4();
}
@@ -820,20 +861,6 @@ static void ZREL_RelRestOffs3Event( void )
/*Please confirm the STM and design else and default.*/
}
}
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
- }
- /*stt_restriction_mode_off*/
- else if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
- {
- /*stt_prv_layer_rst_not_none*/
- if( g_stm_prv_state.layer[StmLayerNoRestriction].state != StmLayoutNoNone )
- {
- ZREL_RelRestOffs1e4();
- }
/*evt_undo*/
else if( g_stm_event == StmEvtNoUndo )
{
@@ -879,12 +906,12 @@ static void ZREL_RelRestOffs3Event( void )
/****************************************/
/* Event appraisal function */
/* STM : RelMain */
-/* State : restriction_mode_2_on( No 1 ) */
+/* State : restriction_mode_on( No 1 )*/
/****************************************/
static void ZREL_RelMains1Event( void )
{
/*stt_restriction_mode_off*/
- if( g_stm_crr_state.mode[StmModeNoRestrictionMode].state == StmRestrictionModeSttNoOff )
+ if( g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state == StmRestrictionModeSttNoOff )
{
stm_rel_event_restriction_mode_off();
ZREL_RelMains1e0();
diff --git a/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.c b/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.c
index 5195f98..a1aa213 100644
--- a/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.c
+++ b/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.c
@@ -45,15 +45,15 @@ void stm_rel_start_activity_restriction_split_sub() {
* @name stm_rel_event_restriction_mode_off
*/
void stm_rel_event_restriction_mode_off() {
- g_stm_crr_state.layer[StmLayerNoRestriction].state = g_prv_restriction_state_rest_mode_1;
+ g_stm_crr_state.layer[StmLayerNoRestriction].state = g_prv_restriction_state_car_stop;
g_stm_crr_state.layer[StmLayerNoRestriction].changed = STM_TRUE;
}
/*
- * @name stm_rel_event_restriction_mode_2_on
+ * @name stm_rel_event_restriction_mode_on
*/
-void stm_rel_event_restriction_mode_2_on() {
- g_prv_restriction_state_rest_mode_1 = g_stm_prv_state.layer[StmLayerNoRestriction].state;
+void stm_rel_event_restriction_mode_on() {
+ g_prv_restriction_state_car_stop = g_stm_prv_state.layer[StmLayerNoRestriction].state;
}
/*
diff --git a/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.h b/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.h
index 5cd9b7d..3763820 100644
--- a/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.h
+++ b/policy_manager/stm/zipc/StateTransitionor/RestrictionLayer/ZREL_Restriction_func.h
@@ -11,7 +11,7 @@ extern void stm_rel_start_activity_restriction_normal();
extern void stm_rel_start_activity_restriction_split_main();
extern void stm_rel_start_activity_restriction_split_sub();
extern void stm_rel_event_restriction_mode_off();
-extern void stm_rel_event_restriction_mode_2_on();
+extern void stm_rel_event_restriction_mode_on();
extern void stm_rel_initialize_variable();
extern void stm_rel_start_stm();
diff --git a/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.c b/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.c
index 7fe5700..2ba6a87 100644
--- a/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.c
+++ b/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.c
@@ -9,88 +9,45 @@
static uint8_t ZREM_RestrictionModeState[ZREM_RESTRICTIONMODESTATENOMAX];
static void ZREM_RestrictionModes0e1( void );
-static void ZREM_RestrictionModes0e2( void );
static void ZREM_RestrictionModes1e0( void );
static void ZREM_RestrictionModes0Event( void );
static void ZREM_RestrictionModes1Event( void );
-static void ZREM_RestrictionModes2Event( void );
/****************************************/
/* Action function */
/* STM : RestrictionMode */
-/* State : restriction_mode_off( No 0 ) */
-/* Event : evt_restriction_mode_1_on( No 1 ) */
+/* State : restriction_mode_on( No 0 )*/
+/* Event : evt_restriction_mode_off( No 1 ) */
/****************************************/
static void ZREM_RestrictionModes0e1( void )
{
ZREM_RestrictionModeState[ZREM_RESTRICTIONMODE] = ( uint8_t )ZREM_RESTRICTIONMODES1;
- stm_rem_start_activity_restriction_mode_1_on();
-}
-
-/****************************************/
-/* Action function */
-/* STM : RestrictionMode */
-/* State : restriction_mode_off( No 0 ) */
-/* Event : evt_restriction_mode_2_on( No 2 ) */
-/****************************************/
-static void ZREM_RestrictionModes0e2( void )
-{
- ZREM_RestrictionModeState[ZREM_RESTRICTIONMODE] = ( uint8_t )ZREM_RESTRICTIONMODES2;
- stm_rem_start_activity_restriction_mode_2_on();
+ stm_rem_start_activity_restriction_mode_off();
}
/****************************************/
/* Action function */
/* STM : RestrictionMode */
-/* State : restriction_mode_1_on( No 1 ) */
-/* Event : evt_restriction_mode_off( No 0 ) */
+/* State : restriction_mode_off( No 1 ) */
+/* Event : evt_restriction_mode_on( No 0 ) */
/****************************************/
static void ZREM_RestrictionModes1e0( void )
{
ZREM_RestrictionModeState[ZREM_RESTRICTIONMODE] = ( uint8_t )ZREM_RESTRICTIONMODES0;
- stm_rem_start_activity_restriction_mode_off();
+ stm_rem_start_activity_restriction_mode_on();
}
/****************************************/
/* Event appraisal function */
/* STM : RestrictionMode */
-/* State : restriction_mode_off( No 0 ) */
+/* State : restriction_mode_on( No 0 )*/
/****************************************/
static void ZREM_RestrictionModes0Event( void )
{
- /*evt_restriction_mode_1_on*/
- if( g_stm_event == StmEvtNoRestrictionMode1On )
- {
- ZREM_RestrictionModes0e1();
- }
- /*evt_restriction_mode_2_on*/
- else if( g_stm_event == StmEvtNoRestrictionMode2On )
- {
- ZREM_RestrictionModes0e2();
- }
- else
- {
- /*Else and default design have not done.*/
- /*Please confirm the STM and design else and default.*/
- }
-}
-
-/****************************************/
-/* Event appraisal function */
-/* STM : RestrictionMode */
-/* State : restriction_mode_1_on( No 1 ) */
-/****************************************/
-static void ZREM_RestrictionModes1Event( void )
-{
/*evt_restriction_mode_off*/
if( g_stm_event == StmEvtNoRestrictionModeOff )
{
- ZREM_RestrictionModes1e0();
- }
- /*evt_restriction_mode_2_on*/
- else if( g_stm_event == StmEvtNoRestrictionMode2On )
- {
- ZREM_RestrictionModes0e2();
+ ZREM_RestrictionModes0e1();
}
else
{
@@ -102,20 +59,15 @@ static void ZREM_RestrictionModes1Event( void )
/****************************************/
/* Event appraisal function */
/* STM : RestrictionMode */
-/* State : restriction_mode_2_on( No 2 ) */
+/* State : restriction_mode_off( No 1 ) */
/****************************************/
-static void ZREM_RestrictionModes2Event( void )
+static void ZREM_RestrictionModes1Event( void )
{
- /*evt_restriction_mode_off*/
- if( g_stm_event == StmEvtNoRestrictionModeOff )
+ /*evt_restriction_mode_on*/
+ if( g_stm_event == StmEvtNoRestrictionModeOn )
{
ZREM_RestrictionModes1e0();
}
- /*evt_restriction_mode_1_on*/
- else if( g_stm_event == StmEvtNoRestrictionMode1On )
- {
- ZREM_RestrictionModes0e1();
- }
else
{
/*Else and default design have not done.*/
@@ -138,9 +90,6 @@ void stm_rem_event_call( void )
case ZREM_RESTRICTIONMODES1:
ZREM_RestrictionModes1Event();
break;
- case ZREM_RESTRICTIONMODES2:
- ZREM_RestrictionModes2Event();
- break;
default:
/*Not accessible to this else (default).*/
break;
@@ -153,7 +102,7 @@ void stm_rem_event_call( void )
/****************************************/
void stm_rem_initialize( void )
{
- ZREM_RestrictionModeState[ZREM_RESTRICTIONMODE] = ( uint8_t )ZREM_RESTRICTIONMODES0;
+ ZREM_RestrictionModeState[ZREM_RESTRICTIONMODE] = ( uint8_t )ZREM_RESTRICTIONMODES1;
stm_rem_start_activity_restriction_mode_off();
}
diff --git a/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.h b/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.h
index f2c2026..4ce0cac 100644
--- a/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.h
+++ b/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode.h
@@ -10,33 +10,28 @@
#define ZREM_RESTRICTIONMODE ( 0U )
#define ZREM_RESTRICTIONMODES0 ( 0U )
#define ZREM_RESTRICTIONMODES1 ( 1U )
-#define ZREM_RESTRICTIONMODES2 ( 2U )
#define ZREM_RESTRICTIONMODESTATENOMAX ( 1U )
/*End state define*/
-#define ZREM_RESTRICTIONMODEEND ( 3U )
+#define ZREM_RESTRICTIONMODEEND ( 2U )
/*Terminate state define*/
#define ZREM_RESTRICTIONMODETERMINATE ( ZREM_RESTRICTIONMODEEND + 1U )
/*State no define*/
#define ZREM_RESTRICTIONMODES0STATENO ( 0U )
#define ZREM_RESTRICTIONMODES1STATENO ( 1U )
-#define ZREM_RESTRICTIONMODES2STATENO ( 2U )
/*State serial no define*/
#define ZREM_RESTRICTIONMODES0STATESERIALNO ( 0U )
#define ZREM_RESTRICTIONMODES1STATESERIALNO ( 1U )
-#define ZREM_RESTRICTIONMODES2STATESERIALNO ( 2U )
/*Event no define*/
#define ZREM_RESTRICTIONMODEE0EVENTNO ( 0U )
#define ZREM_RESTRICTIONMODEE1EVENTNO ( 1U )
-#define ZREM_RESTRICTIONMODEE2EVENTNO ( 2U )
/*Event serial no define*/
#define ZREM_RESTRICTIONMODEE0EVENTSERIALNO ( 0U )
#define ZREM_RESTRICTIONMODEE1EVENTSERIALNO ( 1U )
-#define ZREM_RESTRICTIONMODEE2EVENTSERIALNO ( 2U )
/*Extern function*/
extern void stm_rem_event_call( void );
diff --git a/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.c b/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.c
index 94807f8..e920916 100644
--- a/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.c
+++ b/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.c
@@ -10,44 +10,36 @@
*************************************************************/
/*
- * @name stm_rem_start_activity_restriction_mode_1_on
+ * @name stm_rem_start_activity_restriction_mode_on
*/
-void stm_rem_start_activity_restriction_mode_1_on() {
- g_stm_crr_state.mode[StmModeNoRestrictionMode].state = StmRestrictionModeSttNo1On;
- g_stm_crr_state.mode[StmModeNoRestrictionMode].changed = STM_TRUE;
-}
-
-/*
- * @name stm_rem_start_activity_restriction_mode_2_on
- */
-void stm_rem_start_activity_restriction_mode_2_on() {
- g_stm_crr_state.mode[StmModeNoRestrictionMode].state = StmRestrictionModeSttNo2On;
- g_stm_crr_state.mode[StmModeNoRestrictionMode].changed = STM_TRUE;
+void stm_rem_start_activity_restriction_mode_on() {
+ g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state = StmRestrictionModeSttNoOn;
+ g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].changed = STM_TRUE;
}
/*
* @name stm_rem_start_activity_restriction_mode_off
*/
void stm_rem_start_activity_restriction_mode_off() {
- g_stm_crr_state.mode[StmModeNoRestrictionMode].state = StmRestrictionModeSttNoOff;
- g_stm_crr_state.mode[StmModeNoRestrictionMode].changed = STM_TRUE;
+ g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state = StmRestrictionModeSttNoOff;
+ g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].changed = STM_TRUE;
}
/*
* @name stm_rem_initialize_variable
*/
void stm_rem_initialize_variable() {
- g_stm_prv_state.mode[StmModeNoRestrictionMode].state = StmRestrictionModeSttNoOff;
- g_stm_prv_state.mode[StmModeNoRestrictionMode].changed = STM_FALSE;
+ g_stm_prv_state.car_element[StmCarElementNoRestrictionMode].state = StmRestrictionModeSttNoOff;
+ g_stm_prv_state.car_element[StmCarElementNoRestrictionMode].changed = STM_FALSE;
- g_stm_crr_state.mode[StmModeNoRestrictionMode].state = StmRestrictionModeSttNoOff;
- g_stm_crr_state.mode[StmModeNoRestrictionMode].changed = STM_FALSE;
+ g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state = StmRestrictionModeSttNoOff;
+ g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].changed = STM_FALSE;
}
/*
* @name stm_rem_start_stm
*/
void stm_rem_start_stm() {
- g_stm_prv_state.mode[StmModeNoRestrictionMode].state = g_stm_crr_state.mode[StmModeNoRestrictionMode].state;
- g_stm_crr_state.mode[StmModeNoRestrictionMode].changed = STM_FALSE;
+ g_stm_prv_state.car_element[StmCarElementNoRestrictionMode].state = g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].state;
+ g_stm_crr_state.car_element[StmCarElementNoRestrictionMode].changed = STM_FALSE;
}
diff --git a/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.h b/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.h
index f85ab14..bbb6edf 100644
--- a/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.h
+++ b/policy_manager/stm/zipc/StateTransitionor/RestrictionMode/ZREM_RestrictionMode_func.h
@@ -6,8 +6,7 @@
#ifndef ZHEADER_ZREM_RESTRICTIONMODE_FUNC_H
#define ZHEADER_ZREM_RESTRICTIONMODE_FUNC_H
-extern void stm_rem_start_activity_restriction_mode_1_on();
-extern void stm_rem_start_activity_restriction_mode_2_on();
+extern void stm_rem_start_activity_restriction_mode_on();
extern void stm_rem_start_activity_restriction_mode_off();
extern void stm_rem_initialize_variable();
extern void stm_rem_start_stm();
diff --git a/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_func.c b/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_func.c
index 3903202..daea2ca 100644
--- a/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_func.c
+++ b/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_func.c
@@ -4,12 +4,17 @@
/* ZIPC Designer Version 1.2.0 */
/************************************************************/
#include "ZST_include.h"
+#include "../stm_master_apps.h"
+#include "../stm_master_remote.h"
/*************************************************************
Function definition
*************************************************************/
#include <string.h>
+#include <stdbool.h>
+
+static bool isMaster = false;
//=================================
// API
@@ -17,34 +22,69 @@
/**
* Initialize STM
*/
-void stmInitializeInner() {
+void stmInitializeInner(const char *ecu_name) {
+
+ // TODO: Set master mode
+ if (0 == strcmp("master", ecu_name))
+ {
+ isMaster = true;
+ }
+
// Initialize previous state
memset(&g_stm_prv_state, 0, sizeof(g_stm_prv_state));
// Initialize current state
g_stm_crr_state = g_stm_prv_state;
- /* Initialize restriction mode state */
- stm_rem_initialize();
- stm_rem_initialize_variable();
-
- // Initialize homecsreen layer
- stm_hsl_initialize();
- stm_hsl_initialize_variable();
-
- // Initialize apps layer
- stm_apl_initialize();
- stm_apl_initialize_variable();
-
- // Initialize near_homecsreen layer
- stm_nhl_initialize();
- stm_nhl_initialize_variable();
-
- /* Initialize restriction layer */
- stm_rel_initialize();
- stm_rel_initialize_variable();
-
- g_stm_map_is_activated = STM_FALSE;
+ /* Initialize LightstatusBrake state */
+ stm_lbs_initialize();
+ stm_lbs_initialize_variable();
+
+ /* Initialize AccelPedal state */
+ stm_aps_initialize();
+ stm_aps_initialize_variable();
+
+ /* Initialize car state */
+ stm_rns_initialize();
+ stm_rns_initialize_variable();
+
+ /* Initialize restriction mode state */
+ stm_rem_initialize();
+ stm_rem_initialize_variable();
+
+ // Initialize homecsreen layer
+ stm_hsl_initialize();
+ stm_hsl_initialize_variable();
+
+ if (isMaster)
+ {
+ // Initialize apps layer on master ecu
+ stm_master_apl_initialize();
+ stm_master_apl_initialize_valiable();
+ }
+ else
+ {
+ // Initialize apps layer
+ stm_apl_initialize();
+ stm_apl_initialize_variable();
+ }
+
+ // Initialize near_homecsreen layer
+ stm_nhl_initialize();
+ stm_nhl_initialize_variable();
+
+ /* Initialize restriction layer */
+ stm_rel_initialize();
+ stm_rel_initialize_variable();
+
+ if (isMaster)
+ {
+ // Initialize remote layer on master ecu
+ stm_mst_rmt_initialize();
+ stm_mst_rmt_initialize_valiable();
+ }
+
+ g_stm_map_is_activated = STM_FALSE;
}
/**
@@ -55,14 +95,31 @@ int stmTransitionStateInner(int event_id, StmState* state) {
g_stm_category = STM_GET_CATEGORY_FROM_ID(event_id);
g_stm_area = STM_GET_AREA_FROM_ID(event_id);
+ // LightstatusBrake state
+ stm_lbs_event_call();
+
+ // AccelPedal state
+ stm_aps_event_call();
+
+ // Car state
+ stm_rns_event_call();
+
// restriction mode
stm_rem_event_call();
// homescreen layer
stm_hsl_event_call();
- // apps layer
- stm_apl_event_call();
+ if (isMaster)
+ {
+ // apps layer on master ecu
+ stm_master_apl_event_call();
+ }
+ else
+ {
+ // apps layer
+ stm_apl_event_call();
+ }
// near_homecsreen layer
stm_nhl_event_call();
@@ -73,6 +130,12 @@ int stmTransitionStateInner(int event_id, StmState* state) {
// on_screen layer
stm_osl_event_call();
+ if (isMaster)
+ {
+ // remote layer on master ecu
+ stm_mst_rmt_event_call();
+ }
+
// Copy current state for return
memcpy(state, &g_stm_crr_state, sizeof(g_stm_crr_state));
@@ -85,8 +148,16 @@ int stmTransitionStateInner(int event_id, StmState* state) {
void stmUndoStateInner() {
g_stm_event = StmEvtNoUndo;
- // apps layer
- stm_apl_event_call();
+ if (isMaster)
+ {
+ // apps layer on master ecu
+ stm_master_apl_event_call();
+ }
+ else
+ {
+ // apps layer
+ stm_apl_event_call();
+ }
// near_homecsreen layer
stm_nhl_event_call();
@@ -97,6 +168,11 @@ void stmUndoStateInner() {
// on_screen layer
stm_osl_event_call();
+ if (isMaster)
+ {
+ // remote layer on master ecu
+ stm_mst_rmt_event_call();
+ }
+
g_stm_crr_state = g_stm_prv_state;
}
-
diff --git a/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.c b/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.c
index b3a2273..a5e67ff 100644
--- a/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.c
+++ b/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.c
@@ -36,21 +36,21 @@ int g_stm_area;
int g_stm_map_is_activated;
/**
- * g_prv_apps_state_rest_mode_1
+ * g_prv_apps_state_car_stop
*/
-int g_prv_apps_state_rest_mode_1;
+int g_prv_apps_state_car_stop;
/**
- * g_prv_near_homescreen_state_rest_mode_1
+ * g_prv_near_homescreen_state_car_stop
*/
-int g_prv_near_homescreen_state_rest_mode_1;
+int g_prv_near_homescreen_state_car_stop;
/**
- * g_prv_restriction_state_rest_mode_1
+ * g_prv_restriction_state_car_stop
*/
-int g_prv_restriction_state_rest_mode_1;
+int g_prv_restriction_state_car_stop;
/**
- * g_prv_on_screen_state_rest_mode_1
+ * g_prv_on_screen_state_car_stop
*/
-int g_prv_on_screen_state_rest_mode_1;
+int g_prv_on_screen_state_car_stop;
diff --git a/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.h b/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.h
index 57b52ee..4cabced 100644
--- a/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.h
+++ b/policy_manager/stm/zipc/StateTransitionor/ZST_StateTransitionor_var.h
@@ -12,9 +12,9 @@ extern int g_stm_event;
extern int g_stm_category;
extern int g_stm_area;
extern int g_stm_map_is_activated;
-extern int g_prv_apps_state_rest_mode_1;
-extern int g_prv_near_homescreen_state_rest_mode_1;
-extern int g_prv_restriction_state_rest_mode_1;
-extern int g_prv_on_screen_state_rest_mode_1;
+extern int g_prv_apps_state_car_stop;
+extern int g_prv_near_homescreen_state_car_stop;
+extern int g_prv_restriction_state_car_stop;
+extern int g_prv_on_screen_state_car_stop;
#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/ZST_include.h b/policy_manager/stm/zipc/StateTransitionor/ZST_include.h
index e3d1572..2158660 100644
--- a/policy_manager/stm/zipc/StateTransitionor/ZST_include.h
+++ b/policy_manager/stm/zipc/StateTransitionor/ZST_include.h
@@ -11,6 +11,8 @@
#include "../Common/MisraCType.h"
#include "../Common/Event.h"
#include "ZST_StateTransitionor_def.h"
+#include "master/layer/apps/Zmaster_apps_master_apps_def.h"
+#include "master/layer/remote/Zmaster_remote_master_remote_def.h"
#include "ZST_StateTransitionor_func.h"
#include "ZST_StateTransitionor_var.h"
#include "AppsLayer/ZAPL_Apps_func.h"
@@ -19,11 +21,19 @@
#include "RestrictionLayer/ZREL_Restriction_func.h"
#include "RestrictionMode/ZREM_RestrictionMode_func.h"
#include "NearHomeScreen/ZNHL_NearHomeScreen_func.h"
+#include "AccelPedal/ZACCEL_AccelPedalState_func.h"
+#include "CarState/ZCAR_CarState_func.h"
+#include "LightStatusBrake/ZLIGHT_LightstatusBrakeStatus_func.h"
+#include "master/layer/apps/Zmaster_apps_apps_main.h"
+#include "master/layer/remote/Zmaster_remote_remote.h"
#include "AppsLayer/ZAPL_AppsLayer.h"
#include "OnScreenlayer/ZOSL_OslMain.h"
#include "HomeScreenLayer/ZHSL_HomeScreen.h"
#include "RestrictionLayer/ZREL_RelMain.h"
#include "RestrictionMode/ZREM_RestrictionMode.h"
#include "NearHomeScreen/ZNHL_NearHomescreen.h"
+#include "AccelPedal/ZACCEL_AccelPedal.h"
+#include "CarState/ZCAR_CarState.h"
+#include "LightStatusBrake/ZLIGHT_LightstatusBrake.h"
#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_apps_main.c b/policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_apps_main.c
new file mode 100644
index 0000000..af46ea9
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_apps_main.c
@@ -0,0 +1,1456 @@
+/************************************************************/
+/* Zmaster_apps_apps_main.c */
+/* apps_main State transition model source file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#include "../../../ZST_include.h"
+
+/* State management variable */
+static uint8_t Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINSTATENOMAX];
+
+static void Zmaster_apps_apps_mains0StateEntry( void );
+static void Zmaster_apps_apps_mains1StateEntry( void );
+static void Zmaster_apps_apps_mains0e1( void );
+static void Zmaster_apps_apps_mains1e0( void );
+static void Zmaster_apps_apps_car_stops0e0( void );
+static void Zmaster_apps_apps_car_stops0e2( void );
+static void Zmaster_apps_apps_car_stops0e3( void );
+static void Zmaster_apps_apps_car_stops0e4( void );
+static void Zmaster_apps_apps_car_stops0e11( void );
+static void Zmaster_apps_apps_car_stops0e15( void );
+static void Zmaster_apps_apps_car_runs0e0( void );
+static void Zmaster_apps_apps_car_runs0e3( void );
+static void Zmaster_apps_apps_mains0Event( void );
+static void Zmaster_apps_apps_car_stops0Event( void );
+static void Zmaster_apps_apps_car_stops1Event( void );
+static void Zmaster_apps_apps_car_stops2Event( void );
+static void Zmaster_apps_apps_car_stops3Event( void );
+static void Zmaster_apps_apps_car_stops4Event( void );
+static void Zmaster_apps_apps_car_stops5Event( void );
+static void Zmaster_apps_apps_mains1Event( void );
+static void Zmaster_apps_apps_car_runs0Event( void );
+static void Zmaster_apps_apps_car_runs1Event( void );
+
+/****************************************/
+/* State start activity function */
+/* STM : apps_main */
+/* State : lightstatus_brake_on( No 0 ) */
+/****************************************/
+static void Zmaster_apps_apps_mains0StateEntry( void )
+{
+ switch( Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS0F] )
+ {
+ case ZMASTER_APPS_APPS_CAR_STOPS0:
+ stm_mst_apl_start_activity_none();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS1:
+ stm_mst_apl_start_activity_meter_receiver();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS2:
+ stm_mst_apl_start_activity_meter_splitable();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS3:
+ stm_mst_apl_start_activity_splitable_receiver();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS4:
+ stm_mst_apl_start_activity_splitable_split();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS5:
+ stm_mst_apl_start_activity_general();
+ break;
+ default:
+ /*Not accessible to this else (default).*/
+ break;
+ }
+}
+
+/****************************************/
+/* State start activity function */
+/* STM : apps_main */
+/* State : lightstatus_brake_off( No 1 ) */
+/****************************************/
+static void Zmaster_apps_apps_mains1StateEntry( void )
+{
+ switch( Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS1F] )
+ {
+ case ZMASTER_APPS_APPS_CAR_RUNS0:
+ stm_mst_apl_start_activity_meter_receiver();
+ break;
+ case ZMASTER_APPS_APPS_CAR_RUNS1:
+ stm_mst_apl_start_activity_meter();
+ break;
+ default:
+ /*Not accessible to this else (default).*/
+ break;
+ }
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_main */
+/* State : lightstatus_brake_on( No 0 ) */
+/* Event : stt_lightstatus_brake_off( No 1 ) */
+/****************************************/
+static void Zmaster_apps_apps_mains0e1( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAIN] = ( uint8_t )ZMASTER_APPS_APPS_MAINS1;
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS1F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_RUNS0;
+ Zmaster_apps_apps_mains1StateEntry();
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_main */
+/* State : lightstatus_brake_off( No 1 ) */
+/* Event : stt_lightstatus_brake_on( No 0 ) */
+/****************************************/
+static void Zmaster_apps_apps_mains1e0( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAIN] = ( uint8_t )ZMASTER_APPS_APPS_MAINS0;
+ Zmaster_apps_apps_mains0StateEntry();
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_car_stop */
+/* State : none( No 0 ) */
+/* Event : ara_split_main( No 0 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops0e0( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS0F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_STOPS1;
+ stm_mst_apl_start_activity_meter_receiver();
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_car_stop */
+/* State : none( No 0 ) */
+/* Event : ara_split_main( No 2 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops0e2( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS0F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_STOPS3;
+ stm_mst_apl_start_activity_splitable_receiver();
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_car_stop */
+/* State : none( No 0 ) */
+/* Event : ara_split_sub( No 3 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops0e3( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS0F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_STOPS2;
+ stm_mst_apl_start_activity_meter_splitable();
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_car_stop */
+/* State : none( No 0 ) */
+/* Event : ara_normal( No 4 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops0e4( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS0F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_STOPS5;
+ stm_mst_apl_start_activity_general();
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_car_stop */
+/* State : none( No 0 ) */
+/* Event : stt_prv_layer_apps_none( No 11 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops0e11( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS0F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_STOPS0;
+ stm_mst_apl_start_activity_none();
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_car_stop */
+/* State : none( No 0 ) */
+/* Event : stt_prv_layer_apps_splitable_split( No 15 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops0e15( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS0F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_STOPS4;
+ stm_mst_apl_start_activity_splitable_split();
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_car_run */
+/* State : meter_receiver( No 0 ) */
+/* Event : ara_normal( No 0 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_runs0e0( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS1F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_RUNS1;
+ stm_mst_apl_start_activity_meter();
+}
+
+/****************************************/
+/* Action function */
+/* STM : apps_car_run */
+/* State : meter_receiver( No 0 ) */
+/* Event : stt_prv_layer_apps_meter_receiver( No 3 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_runs0e3( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS1F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_RUNS0;
+ stm_mst_apl_start_activity_meter_receiver();
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_main */
+/* State : lightstatus_brake_on( No 0 ) */
+/****************************************/
+static void Zmaster_apps_apps_mains0Event( void )
+{
+ /*stt_lightstatus_brake_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
+ {
+ stm_mst_apl_event_lightstatus_brake_off();
+ Zmaster_apps_apps_mains0e1();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_car_stop */
+/* State : none( No 0 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops0Event( void )
+{
+ /*stt_lightstatus_brake_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
+ {
+ /*evt_activate*/
+ if( g_stm_event == StmEvtNoActivate )
+ {
+ /*ctg_meter*/
+ if( g_stm_category == StmCtgNoMeter )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_receiver*/
+ else if( g_stm_category == StmCtgNoReceiver )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_main*/
+ else if( g_stm_category == StmCtgNoSplitableMain )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_sub*/
+ else if( g_stm_category == StmCtgNoSplitableSub )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_general*/
+ else if( g_stm_category == StmCtgNoGeneral )
+ {
+ /*ara_normal*/
+ if( g_stm_area == StmAreaNoNormal )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_apps_none*/
+ if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoNone )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ /*stt_prv_layer_apps_meter_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrRcv )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ /*stt_prv_layer_apps_meter_splitable*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrSpl )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ /*stt_prv_layer_apps_splitable_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplRcv )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ /*stt_prv_layer_apps_splitable_split*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ /*stt_prv_layer_apps_gen_nml*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_car_stop */
+/* State : meter_receiver( No 1 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops1Event( void )
+{
+ /*stt_lightstatus_brake_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
+ {
+ /*evt_activate*/
+ if( g_stm_event == StmEvtNoActivate )
+ {
+ /*ctg_splitable_main*/
+ if( g_stm_category == StmCtgNoSplitableMain )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_sub*/
+ else if( g_stm_category == StmCtgNoSplitableSub )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_general*/
+ else if( g_stm_category == StmCtgNoGeneral )
+ {
+ /*ara_normal*/
+ if( g_stm_area == StmAreaNoNormal )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_homescreen*/
+ else if( g_stm_category == StmCtgNoHomescreen )
+ {
+ /*ara_fullscreen*/
+ if( g_stm_area == StmAreaNoFullscreen )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_deactivate*/
+ else if( g_stm_event == StmEvtNoDeactivate )
+ {
+ /*ctg_meter*/
+ if( g_stm_category == StmCtgNoMeter )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ /*ctg_receiver*/
+ else if( g_stm_category == StmCtgNoReceiver )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_apps_none*/
+ if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoNone )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ /*stt_prv_layer_apps_meter_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrRcv )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ /*stt_prv_layer_apps_meter_splitable*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrSpl )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ /*stt_prv_layer_apps_splitable_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplRcv )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ /*stt_prv_layer_apps_splitable_split*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ /*stt_prv_layer_apps_gen_nml*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_car_stop */
+/* State : meter_splitable( No 2 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops2Event( void )
+{
+ /*stt_lightstatus_brake_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
+ {
+ /*evt_activate*/
+ if( g_stm_event == StmEvtNoActivate )
+ {
+ /*ctg_receiver*/
+ if( g_stm_category == StmCtgNoReceiver )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_main*/
+ else if( g_stm_category == StmCtgNoSplitableMain )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_sub*/
+ else if( g_stm_category == StmCtgNoSplitableSub )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_general*/
+ else if( g_stm_category == StmCtgNoGeneral )
+ {
+ /*ara_normal*/
+ if( g_stm_area == StmAreaNoNormal )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_homescreen*/
+ else if( g_stm_category == StmCtgNoHomescreen )
+ {
+ /*ara_fullscreen*/
+ if( g_stm_area == StmAreaNoFullscreen )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_deactivate*/
+ else if( g_stm_event == StmEvtNoDeactivate )
+ {
+ /*ctg_meter*/
+ if( g_stm_category == StmCtgNoMeter )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ /*ctg_splitable_sub*/
+ else if( g_stm_category == StmCtgNoSplitableSub )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_apps_none*/
+ if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoNone )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ /*stt_prv_layer_apps_meter_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrRcv )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ /*stt_prv_layer_apps_meter_splitable*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrSpl )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ /*stt_prv_layer_apps_splitable_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplRcv )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ /*stt_prv_layer_apps_splitable_split*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ /*stt_prv_layer_apps_gen_nml*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_car_stop */
+/* State : splitable_receiver( No 3 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops3Event( void )
+{
+ /*stt_lightstatus_brake_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
+ {
+ /*evt_activate*/
+ if( g_stm_event == StmEvtNoActivate )
+ {
+ /*ctg_meter*/
+ if( g_stm_category == StmCtgNoMeter )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_main*/
+ else if( g_stm_category == StmCtgNoSplitableMain )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_sub*/
+ else if( g_stm_category == StmCtgNoSplitableSub )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_general*/
+ else if( g_stm_category == StmCtgNoGeneral )
+ {
+ /*ara_normal*/
+ if( g_stm_area == StmAreaNoNormal )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_homescreen*/
+ else if( g_stm_category == StmCtgNoHomescreen )
+ {
+ /*ara_fullscreen*/
+ if( g_stm_area == StmAreaNoFullscreen )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_deactivate*/
+ else if( g_stm_event == StmEvtNoDeactivate )
+ {
+ /*ctg_receiver*/
+ if( g_stm_category == StmCtgNoReceiver )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ /*ctg_splitable_main*/
+ else if( g_stm_category == StmCtgNoSplitableMain )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_apps_none*/
+ if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoNone )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ /*stt_prv_layer_apps_meter_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrRcv )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ /*stt_prv_layer_apps_meter_splitable*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrSpl )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ /*stt_prv_layer_apps_splitable_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplRcv )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ /*stt_prv_layer_apps_splitable_split*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ /*stt_prv_layer_apps_gen_nml*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_car_stop */
+/* State : splitable_split( No 4 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops4Event( void )
+{
+ /*stt_lightstatus_brake_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
+ {
+ /*evt_activate*/
+ if( g_stm_event == StmEvtNoActivate )
+ {
+ /*ctg_meter*/
+ if( g_stm_category == StmCtgNoMeter )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_receiver*/
+ else if( g_stm_category == StmCtgNoReceiver )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_main*/
+ else if( g_stm_category == StmCtgNoSplitableMain )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_sub*/
+ else if( g_stm_category == StmCtgNoSplitableSub )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_general*/
+ else if( g_stm_category == StmCtgNoGeneral )
+ {
+ /*ara_normal*/
+ if( g_stm_area == StmAreaNoNormal )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_homescreen*/
+ else if( g_stm_category == StmCtgNoHomescreen )
+ {
+ /*ara_fullscreen*/
+ if( g_stm_area == StmAreaNoFullscreen )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_deactivate*/
+ else if( g_stm_event == StmEvtNoDeactivate )
+ {
+ /*ctg_splitable_main*/
+ if( g_stm_category == StmCtgNoSplitableMain )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_sub*/
+ else if( g_stm_category == StmCtgNoSplitableSub )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_apps_none*/
+ if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoNone )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ /*stt_prv_layer_apps_meter_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrRcv )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ /*stt_prv_layer_apps_meter_splitable*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrSpl )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ /*stt_prv_layer_apps_splitable_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplRcv )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ /*stt_prv_layer_apps_splitable_split*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ /*stt_prv_layer_apps_gen_nml*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_car_stop */
+/* State : general( No 5 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_stops5Event( void )
+{
+ /*stt_lightstatus_brake_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
+ {
+ /*evt_activate*/
+ if( g_stm_event == StmEvtNoActivate )
+ {
+ /*ctg_meter*/
+ if( g_stm_category == StmCtgNoMeter )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_receiver*/
+ else if( g_stm_category == StmCtgNoReceiver )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_main*/
+ else if( g_stm_category == StmCtgNoSplitableMain )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_splitable_sub*/
+ else if( g_stm_category == StmCtgNoSplitableSub )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_general*/
+ else if( g_stm_category == StmCtgNoGeneral )
+ {
+ /*ara_normal*/
+ if( g_stm_area == StmAreaNoNormal )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_homescreen*/
+ else if( g_stm_category == StmCtgNoHomescreen )
+ {
+ /*ara_fullscreen*/
+ if( g_stm_area == StmAreaNoFullscreen )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_deactivate*/
+ else if( g_stm_event == StmEvtNoDeactivate )
+ {
+ /*ctg_general*/
+ if( g_stm_category == StmCtgNoGeneral )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_apps_none*/
+ if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoNone )
+ {
+ Zmaster_apps_apps_car_stops0e11();
+ }
+ /*stt_prv_layer_apps_meter_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrRcv )
+ {
+ Zmaster_apps_apps_car_stops0e0();
+ }
+ /*stt_prv_layer_apps_meter_splitable*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrSpl )
+ {
+ Zmaster_apps_apps_car_stops0e3();
+ }
+ /*stt_prv_layer_apps_splitable_receiver*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplRcv )
+ {
+ Zmaster_apps_apps_car_stops0e2();
+ }
+ /*stt_prv_layer_apps_splitable_split*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoSplSpl )
+ {
+ Zmaster_apps_apps_car_stops0e15();
+ }
+ /*stt_prv_layer_apps_gen_nml*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoGenNml )
+ {
+ Zmaster_apps_apps_car_stops0e4();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_main */
+/* State : lightstatus_brake_off( No 1 ) */
+/****************************************/
+static void Zmaster_apps_apps_mains1Event( void )
+{
+ /*stt_lightstatus_brake_on*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOn )
+ {
+ stm_mst_apl_event_lightstatus_brake_on();
+ Zmaster_apps_apps_mains1e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_car_run */
+/* State : meter_receiver( No 0 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_runs0Event( void )
+{
+ /*stt_lightstatus_brake_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
+ {
+ /*evt_activate*/
+ if( g_stm_event == StmEvtNoActivate )
+ {
+ /*ctg_meter*/
+ if( g_stm_category == StmCtgNoMeter )
+ {
+ /*ara_normal*/
+ if( g_stm_area == StmAreaNoNormal )
+ {
+ Zmaster_apps_apps_car_runs0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_apps_meter_receiver*/
+ if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrRcv )
+ {
+ Zmaster_apps_apps_car_runs0e3();
+ }
+ /*stt_prv_layer_apps_meter*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrNml )
+ {
+ Zmaster_apps_apps_car_runs0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : apps_car_run */
+/* State : meter( No 1 ) */
+/****************************************/
+static void Zmaster_apps_apps_car_runs1Event( void )
+{
+ /*stt_lightstatus_brake_off*/
+ if( g_stm_crr_state.car_element[StmCarElementNoLightstatusBrake].state == StmLightstatusBrakeSttNoOff )
+ {
+ /*evt_activate*/
+ if( g_stm_event == StmEvtNoActivate )
+ {
+ /*ctg_meter*/
+ if( g_stm_category == StmCtgNoMeter )
+ {
+ /*ara_split_main*/
+ if( g_stm_area == StmAreaNoSplitMain )
+ {
+ Zmaster_apps_apps_car_runs0e3();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*ctg_receiver*/
+ else if( g_stm_category == StmCtgNoReceiver )
+ {
+ /*ara_split_sub*/
+ if( g_stm_area == StmAreaNoSplitSub )
+ {
+ Zmaster_apps_apps_car_runs0e3();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_apps_meter_receiver*/
+ if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrRcv )
+ {
+ Zmaster_apps_apps_car_runs0e3();
+ }
+ /*stt_prv_layer_apps_meter*/
+ else if( g_stm_prv_state.layer[StmLayerNoApps].state == StmLayoutNoMtrNml )
+ {
+ Zmaster_apps_apps_car_runs0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event call function */
+/* STM : apps_main */
+/****************************************/
+void stm_master_apl_event_call( void )
+{
+ stm_mst_apl_start_stm();
+ switch( Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAIN] )
+ {
+ case ZMASTER_APPS_APPS_MAINS0:
+ switch( Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS0F] )
+ {
+ case ZMASTER_APPS_APPS_CAR_STOPS0:
+ Zmaster_apps_apps_car_stops0Event();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS1:
+ Zmaster_apps_apps_car_stops1Event();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS2:
+ Zmaster_apps_apps_car_stops2Event();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS3:
+ Zmaster_apps_apps_car_stops3Event();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS4:
+ Zmaster_apps_apps_car_stops4Event();
+ break;
+ case ZMASTER_APPS_APPS_CAR_STOPS5:
+ Zmaster_apps_apps_car_stops5Event();
+ break;
+ default:
+ /*Not accessible to this else (default).*/
+ break;
+ }
+ Zmaster_apps_apps_mains0Event();
+ break;
+ case ZMASTER_APPS_APPS_MAINS1:
+ switch( Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS1F] )
+ {
+ case ZMASTER_APPS_APPS_CAR_RUNS0:
+ Zmaster_apps_apps_car_runs0Event();
+ break;
+ case ZMASTER_APPS_APPS_CAR_RUNS1:
+ Zmaster_apps_apps_car_runs1Event();
+ break;
+ default:
+ /*Not accessible to this else (default).*/
+ break;
+ }
+ Zmaster_apps_apps_mains1Event();
+ break;
+ default:
+ /*Not accessible to this else (default).*/
+ break;
+ }
+}
+
+/****************************************/
+/* Initial function */
+/* STM : apps_main */
+/****************************************/
+void stm_master_apl_initialize( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAIN] = ( uint8_t )ZMASTER_APPS_APPS_MAINS0;
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS0F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_STOPS0;
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAINS1F] = ( uint8_t )ZMASTER_APPS_APPS_CAR_RUNS0;
+ Zmaster_apps_apps_mains0StateEntry();
+}
+
+/****************************************/
+/* Terminate function */
+/* STM : apps_main */
+/****************************************/
+void Zmaster_apps_apps_mainTerminate( void )
+{
+ Zmaster_apps_apps_mainState[ZMASTER_APPS_APPS_MAIN] = ( uint8_t )ZMASTER_APPS_APPS_MAINTERMINATE;
+}
+
diff --git a/policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_apps_main.h b/policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_apps_main.h
new file mode 100644
index 0000000..afa2e67
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_apps_main.h
@@ -0,0 +1,111 @@
+/************************************************************/
+/* Zmaster_apps_apps_main.h */
+/* apps_main State transition model header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZMASTER_APPS_APPS_MAIN_H
+#define ZHEADER_ZMASTER_APPS_APPS_MAIN_H
+
+/*State management variable access define*/
+#define ZMASTER_APPS_APPS_MAIN ( 0U )
+#define ZMASTER_APPS_APPS_MAINS0F ( 1U )
+#define ZMASTER_APPS_APPS_MAINS1F ( 2U )
+#define ZMASTER_APPS_APPS_MAINS0 ( 0U )
+#define ZMASTER_APPS_APPS_CAR_STOPS0 ( 0U )
+#define ZMASTER_APPS_APPS_CAR_STOPS1 ( 1U )
+#define ZMASTER_APPS_APPS_CAR_STOPS2 ( 2U )
+#define ZMASTER_APPS_APPS_CAR_STOPS3 ( 3U )
+#define ZMASTER_APPS_APPS_CAR_STOPS4 ( 4U )
+#define ZMASTER_APPS_APPS_CAR_STOPS5 ( 5U )
+#define ZMASTER_APPS_APPS_MAINS1 ( 1U )
+#define ZMASTER_APPS_APPS_CAR_RUNS0 ( 0U )
+#define ZMASTER_APPS_APPS_CAR_RUNS1 ( 1U )
+#define ZMASTER_APPS_APPS_MAINSTATENOMAX ( 3U )
+
+/*End state define*/
+#define ZMASTER_APPS_APPS_MAINEND ( 6U )
+/*Terminate state define*/
+#define ZMASTER_APPS_APPS_MAINTERMINATE ( ZMASTER_APPS_APPS_MAINEND + 1U )
+
+/*State no define*/
+#define ZMASTER_APPS_APPS_MAINS0STATENO ( 0U )
+#define ZMASTER_APPS_APPS_CAR_STOPS0STATENO ( 0U )
+#define ZMASTER_APPS_APPS_CAR_STOPS1STATENO ( 1U )
+#define ZMASTER_APPS_APPS_CAR_STOPS2STATENO ( 2U )
+#define ZMASTER_APPS_APPS_CAR_STOPS3STATENO ( 3U )
+#define ZMASTER_APPS_APPS_CAR_STOPS4STATENO ( 4U )
+#define ZMASTER_APPS_APPS_CAR_STOPS5STATENO ( 5U )
+#define ZMASTER_APPS_APPS_MAINS1STATENO ( 1U )
+#define ZMASTER_APPS_APPS_CAR_RUNS0STATENO ( 0U )
+#define ZMASTER_APPS_APPS_CAR_RUNS1STATENO ( 1U )
+
+/*State serial no define*/
+#define ZMASTER_APPS_APPS_MAINS0STATESERIALNO ( 0U )
+#define ZMASTER_APPS_APPS_CAR_STOPS0STATESERIALNO ( 1U )
+#define ZMASTER_APPS_APPS_CAR_STOPS1STATESERIALNO ( 2U )
+#define ZMASTER_APPS_APPS_CAR_STOPS2STATESERIALNO ( 3U )
+#define ZMASTER_APPS_APPS_CAR_STOPS3STATESERIALNO ( 4U )
+#define ZMASTER_APPS_APPS_CAR_STOPS4STATESERIALNO ( 5U )
+#define ZMASTER_APPS_APPS_CAR_STOPS5STATESERIALNO ( 6U )
+#define ZMASTER_APPS_APPS_MAINS1STATESERIALNO ( 7U )
+#define ZMASTER_APPS_APPS_CAR_RUNS0STATESERIALNO ( 8U )
+#define ZMASTER_APPS_APPS_CAR_RUNS1STATESERIALNO ( 9U )
+
+/*Event no define*/
+#define ZMASTER_APPS_APPS_MAINE0EVENTNO ( 0U )
+#define ZMASTER_APPS_APPS_MAINE1EVENTNO ( 1U )
+#define ZMASTER_APPS_APPS_CAR_STOPE0EVENTNO ( 0U )
+#define ZMASTER_APPS_APPS_CAR_STOPE1EVENTNO ( 1U )
+#define ZMASTER_APPS_APPS_CAR_STOPE2EVENTNO ( 2U )
+#define ZMASTER_APPS_APPS_CAR_STOPE3EVENTNO ( 3U )
+#define ZMASTER_APPS_APPS_CAR_STOPE4EVENTNO ( 4U )
+#define ZMASTER_APPS_APPS_CAR_STOPE5EVENTNO ( 5U )
+#define ZMASTER_APPS_APPS_CAR_STOPE6EVENTNO ( 6U )
+#define ZMASTER_APPS_APPS_CAR_STOPE7EVENTNO ( 7U )
+#define ZMASTER_APPS_APPS_CAR_STOPE8EVENTNO ( 8U )
+#define ZMASTER_APPS_APPS_CAR_STOPE9EVENTNO ( 9U )
+#define ZMASTER_APPS_APPS_CAR_STOPE10EVENTNO ( 10U )
+#define ZMASTER_APPS_APPS_CAR_STOPE11EVENTNO ( 11U )
+#define ZMASTER_APPS_APPS_CAR_STOPE12EVENTNO ( 12U )
+#define ZMASTER_APPS_APPS_CAR_STOPE13EVENTNO ( 13U )
+#define ZMASTER_APPS_APPS_CAR_STOPE14EVENTNO ( 14U )
+#define ZMASTER_APPS_APPS_CAR_STOPE15EVENTNO ( 15U )
+#define ZMASTER_APPS_APPS_CAR_STOPE16EVENTNO ( 16U )
+#define ZMASTER_APPS_APPS_CAR_RUNE0EVENTNO ( 0U )
+#define ZMASTER_APPS_APPS_CAR_RUNE1EVENTNO ( 1U )
+#define ZMASTER_APPS_APPS_CAR_RUNE2EVENTNO ( 2U )
+#define ZMASTER_APPS_APPS_CAR_RUNE3EVENTNO ( 3U )
+#define ZMASTER_APPS_APPS_CAR_RUNE4EVENTNO ( 4U )
+
+/*Event serial no define*/
+#define ZMASTER_APPS_APPS_MAINE0EVENTSERIALNO ( 0U )
+#define ZMASTER_APPS_APPS_MAINE1EVENTSERIALNO ( 1U )
+#define ZMASTER_APPS_APPS_CAR_STOPE0EVENTNO ( 0U )
+#define ZMASTER_APPS_APPS_CAR_STOPE1EVENTNO ( 1U )
+#define ZMASTER_APPS_APPS_CAR_STOPE2EVENTNO ( 2U )
+#define ZMASTER_APPS_APPS_CAR_STOPE3EVENTNO ( 3U )
+#define ZMASTER_APPS_APPS_CAR_STOPE4EVENTNO ( 4U )
+#define ZMASTER_APPS_APPS_CAR_STOPE5EVENTNO ( 5U )
+#define ZMASTER_APPS_APPS_CAR_STOPE6EVENTNO ( 6U )
+#define ZMASTER_APPS_APPS_CAR_STOPE7EVENTNO ( 7U )
+#define ZMASTER_APPS_APPS_CAR_STOPE8EVENTNO ( 8U )
+#define ZMASTER_APPS_APPS_CAR_STOPE9EVENTNO ( 9U )
+#define ZMASTER_APPS_APPS_CAR_STOPE10EVENTNO ( 10U )
+#define ZMASTER_APPS_APPS_CAR_STOPE11EVENTNO ( 11U )
+#define ZMASTER_APPS_APPS_CAR_STOPE12EVENTNO ( 12U )
+#define ZMASTER_APPS_APPS_CAR_STOPE13EVENTNO ( 13U )
+#define ZMASTER_APPS_APPS_CAR_STOPE14EVENTNO ( 14U )
+#define ZMASTER_APPS_APPS_CAR_STOPE15EVENTNO ( 15U )
+#define ZMASTER_APPS_APPS_CAR_STOPE16EVENTNO ( 16U )
+#define ZMASTER_APPS_APPS_CAR_RUNE0EVENTNO ( 0U )
+#define ZMASTER_APPS_APPS_CAR_RUNE1EVENTNO ( 1U )
+#define ZMASTER_APPS_APPS_CAR_RUNE2EVENTNO ( 2U )
+#define ZMASTER_APPS_APPS_CAR_RUNE3EVENTNO ( 3U )
+#define ZMASTER_APPS_APPS_CAR_RUNE4EVENTNO ( 4U )
+
+/*Extern function*/
+extern void stm_master_apl_event_call( void );
+extern void stm_master_apl_initialize( void );
+extern void Zmaster_apps_apps_mainTerminate( void );
+
+#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_master_apps_def.h b/policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_master_apps_def.h
new file mode 100644
index 0000000..5c22ae6
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/master/layer/apps/Zmaster_apps_master_apps_def.h
@@ -0,0 +1,15 @@
+/************************************************************/
+/* Zmaster_apps_master_apps_def.h */
+/* Define header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZMASTER_APPS_MASTER_APPS_DEF_H
+#define ZHEADER_ZMASTER_APPS_MASTER_APPS_DEF_H
+
+/*************************************************************
+ Define definition
+*************************************************************/
+
+#include "../../../../stm_master_apps.h"
+
+#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_master_remote_def.h b/policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_master_remote_def.h
new file mode 100644
index 0000000..7cd92cd
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_master_remote_def.h
@@ -0,0 +1,15 @@
+/************************************************************/
+/* Zmaster_remote_master_remote_def.h */
+/* Define header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZMASTER_REMOTE_MASTER_REMOTE_DEF_H
+#define ZHEADER_ZMASTER_REMOTE_MASTER_REMOTE_DEF_H
+
+/*************************************************************
+ Define definition
+*************************************************************/
+
+#include "../../../../stm_master_remote.h"
+
+#endif
diff --git a/policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_remote.c b/policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_remote.c
new file mode 100644
index 0000000..53ceafa
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_remote.c
@@ -0,0 +1,206 @@
+/************************************************************/
+/* Zmaster_remote_remote.c */
+/* remote State transition model source file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#include "../../../ZST_include.h"
+
+/* State management variable */
+static uint8_t Zmaster_remote_remoteState[ZMASTER_REMOTE_REMOTESTATENOMAX];
+
+static void Zmaster_remote_remotes0e0( void );
+static void Zmaster_remote_remotes0e2( void );
+static void Zmaster_remote_remotes1e1( void );
+static void Zmaster_remote_remotes1e3( void );
+static void Zmaster_remote_remotes0Event( void );
+static void Zmaster_remote_remotes1Event( void );
+
+/****************************************/
+/* Action function */
+/* STM : remote */
+/* State : none( No 0 ) */
+/* Event : ara_master_split_sub( No 0 ) */
+/****************************************/
+static void Zmaster_remote_remotes0e0( void )
+{
+ Zmaster_remote_remoteState[ZMASTER_REMOTE_REMOTE] = ( uint8_t )ZMASTER_REMOTE_REMOTES1;
+ stm_mst_rmt_start_activity_tbt();
+}
+
+/****************************************/
+/* Action function */
+/* STM : remote */
+/* State : none( No 0 ) */
+/* Event : stt_prv_layer_remote_none( No 2 ) */
+/****************************************/
+static void Zmaster_remote_remotes0e2( void )
+{
+ stm_mst_rmt_start_activity_none();
+}
+
+/****************************************/
+/* Action function */
+/* STM : remote */
+/* State : tbt( No 1 ) */
+/* Event : ctg_tbt( No 1 ) */
+/****************************************/
+static void Zmaster_remote_remotes1e1( void )
+{
+ Zmaster_remote_remoteState[ZMASTER_REMOTE_REMOTE] = ( uint8_t )ZMASTER_REMOTE_REMOTES0;
+ stm_mst_rmt_start_activity_none();
+}
+
+/****************************************/
+/* Action function */
+/* STM : remote */
+/* State : tbt( No 1 ) */
+/* Event : stt_prv_layer_remote_tbt( No 3 ) */
+/****************************************/
+static void Zmaster_remote_remotes1e3( void )
+{
+ stm_mst_rmt_start_activity_tbt();
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : remote */
+/* State : none( No 0 ) */
+/****************************************/
+static void Zmaster_remote_remotes0Event( void )
+{
+ /*evt_activate*/
+ if( g_stm_event == StmEvtNoActivate )
+ {
+ /*ctg_tbt*/
+ if( g_stm_category == StmCtgNoTbt )
+ {
+ /*ara_master_split_sub*/
+ if( g_stm_area == StmAreaNoMasterSplitSub )
+ {
+ Zmaster_remote_remotes0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_remote_none*/
+ if( g_stm_prv_state.layer[StmLayerNoRemote].state == StmLayoutNoNone )
+ {
+ Zmaster_remote_remotes0e2();
+ }
+ /*stt_prv_layer_remote_tbt*/
+ else if( g_stm_prv_state.layer[StmLayerNoRemote].state == StmLayoutNoRmtTbt )
+ {
+ Zmaster_remote_remotes0e0();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event appraisal function */
+/* STM : remote */
+/* State : tbt( No 1 ) */
+/****************************************/
+static void Zmaster_remote_remotes1Event( void )
+{
+ /*evt_deactivate*/
+ if( g_stm_event == StmEvtNoDeactivate )
+ {
+ /*ctg_tbt*/
+ if( g_stm_category == StmCtgNoTbt )
+ {
+ Zmaster_remote_remotes1e1();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ /*evt_undo*/
+ else if( g_stm_event == StmEvtNoUndo )
+ {
+ /*stt_prv_layer_remote_none*/
+ if( g_stm_prv_state.layer[StmLayerNoRemote].state == StmLayoutNoNone )
+ {
+ Zmaster_remote_remotes1e1();
+ }
+ /*stt_prv_layer_remote_tbt*/
+ else if( g_stm_prv_state.layer[StmLayerNoRemote].state == StmLayoutNoRmtTbt )
+ {
+ Zmaster_remote_remotes1e3();
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+ }
+ else
+ {
+ /*Else and default design have not done.*/
+ /*Please confirm the STM and design else and default.*/
+ }
+}
+
+/****************************************/
+/* Event call function */
+/* STM : remote */
+/****************************************/
+void stm_mst_rmt_event_call( void )
+{
+ stm_mst_rmt_start_stm();
+ switch( Zmaster_remote_remoteState[ZMASTER_REMOTE_REMOTE] )
+ {
+ case ZMASTER_REMOTE_REMOTES0:
+ Zmaster_remote_remotes0Event();
+ break;
+ case ZMASTER_REMOTE_REMOTES1:
+ Zmaster_remote_remotes1Event();
+ break;
+ default:
+ /*Not accessible to this else (default).*/
+ break;
+ }
+}
+
+/****************************************/
+/* Initial function */
+/* STM : remote */
+/****************************************/
+void stm_mst_rmt_initialize( void )
+{
+ Zmaster_remote_remoteState[ZMASTER_REMOTE_REMOTE] = ( uint8_t )ZMASTER_REMOTE_REMOTES0;
+ stm_mst_rmt_start_activity_none();
+}
+
+/****************************************/
+/* Terminate function */
+/* STM : remote */
+/****************************************/
+void Zmaster_remote_remoteTerminate( void )
+{
+ Zmaster_remote_remoteState[ZMASTER_REMOTE_REMOTE] = ( uint8_t )ZMASTER_REMOTE_REMOTETERMINATE;
+}
+
diff --git a/policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_remote.h b/policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_remote.h
new file mode 100644
index 0000000..5899b07
--- /dev/null
+++ b/policy_manager/stm/zipc/StateTransitionor/master/layer/remote/Zmaster_remote_remote.h
@@ -0,0 +1,45 @@
+/************************************************************/
+/* Zmaster_remote_remote.h */
+/* remote State transition model header file */
+/* ZIPC Designer Version 1.2.0 */
+/************************************************************/
+#ifndef ZHEADER_ZMASTER_REMOTE_REMOTE_H
+#define ZHEADER_ZMASTER_REMOTE_REMOTE_H
+
+/*State management variable access define*/
+#define ZMASTER_REMOTE_REMOTE ( 0U )
+#define ZMASTER_REMOTE_REMOTES0 ( 0U )
+#define ZMASTER_REMOTE_REMOTES1 ( 1U )
+#define ZMASTER_REMOTE_REMOTESTATENOMAX ( 1U )
+
+/*End state define*/
+#define ZMASTER_REMOTE_REMOTEEND ( 2U )
+/*Terminate state define*/
+#define ZMASTER_REMOTE_REMOTETERMINATE ( ZMASTER_REMOTE_REMOTEEND + 1U )
+
+/*State no define*/
+#define ZMASTER_REMOTE_REMOTES0STATENO ( 0U )
+#define ZMASTER_REMOTE_REMOTES1STATENO ( 1U )
+
+/*State serial no define*/
+#define ZMASTER_REMOTE_REMOTES0STATESERIALNO ( 0U )
+#define ZMASTER_REMOTE_REMOTES1STATESERIALNO ( 1U )
+
+/*Event no define*/
+#define ZMASTER_REMOTE_REMOTEE0EVENTNO ( 0U )
+#define ZMASTER_REMOTE_REMOTEE1EVENTNO ( 1U )
+#define ZMASTER_REMOTE_REMOTEE2EVENTNO ( 2U )
+#define ZMASTER_REMOTE_REMOTEE3EVENTNO ( 3U )
+
+/*Event serial no define*/
+#define ZMASTER_REMOTE_REMOTEE0EVENTSERIALNO ( 0U )
+#define ZMASTER_REMOTE_REMOTEE1EVENTSERIALNO ( 1U )
+#define ZMASTER_REMOTE_REMOTEE2EVENTSERIALNO ( 2U )
+#define ZMASTER_REMOTE_REMOTEE3EVENTSERIALNO ( 3U )
+
+/*Extern function*/
+extern void stm_mst_rmt_event_call( void );
+extern void stm_mst_rmt_initialize( void );
+extern void Zmaster_remote_remoteTerminate( void );
+
+#endif
diff --git a/policy_manager/stm/zipc/stm_master_apps.c b/policy_manager/stm/zipc/stm_master_apps.c
new file mode 100644
index 0000000..a8cc0e2
--- /dev/null
+++ b/policy_manager/stm/zipc/stm_master_apps.c
@@ -0,0 +1,63 @@
+#include "./StateTransitionor/ZST_include.h"
+
+void stm_mst_apl_start_activity_none() {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoNone;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+}
+
+void stm_mst_apl_start_activity_meter_receiver() {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMtrRcv;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+}
+
+void stm_mst_apl_start_activity_meter_splitable() {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMtrSpl;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+}
+
+void stm_mst_apl_start_activity_splitable_receiver() {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSplRcv;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+}
+
+void stm_mst_apl_start_activity_splitable_split() {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoSplSpl;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+}
+
+void stm_mst_apl_start_activity_general() {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoGenNml;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+}
+
+void stm_mst_apl_start_activity_meter() {
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoMtrNml;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+}
+
+void stm_mst_apl_event_lightstatus_brake_on() {
+ g_stm_crr_state.layer[StmLayerNoApps].state = g_prv_apps_state_car_stop;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_TRUE;
+}
+
+void stm_mst_apl_event_lightstatus_brake_off() {
+ g_prv_apps_state_car_stop = g_stm_prv_state.layer[StmLayerNoApps].state;
+}
+
+void stm_master_apl_initialize_valiable() {
+ g_stm_prv_state.layer[StmLayerNoApps].state = StmLayoutNoNone;
+ g_stm_prv_state.layer[StmLayerNoApps].changed = STM_FALSE;
+
+ g_stm_crr_state.layer[StmLayerNoApps].state = StmLayoutNoNone;
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_FALSE;
+}
+
+void stm_mst_apl_start_stm() {
+ if (g_stm_event == StmEvtNoUndo) {
+ // nop
+ }
+ else {
+ g_stm_prv_state.layer[StmLayerNoApps].state = g_stm_crr_state.layer[StmLayerNoApps].state;
+ }
+ g_stm_crr_state.layer[StmLayerNoApps].changed = STM_FALSE;
+}
diff --git a/policy_manager/stm/zipc/stm_master_apps.h b/policy_manager/stm/zipc/stm_master_apps.h
new file mode 100644
index 0000000..d10e56b
--- /dev/null
+++ b/policy_manager/stm/zipc/stm_master_apps.h
@@ -0,0 +1,11 @@
+extern void stm_mst_apl_start_activity_none();
+extern void stm_mst_apl_start_activity_meter_receiver();
+extern void stm_mst_apl_start_activity_meter_splitable();
+extern void stm_mst_apl_start_activity_splitable_receiver();
+extern void stm_mst_apl_start_activity_splitable_split();
+extern void stm_mst_apl_start_activity_general();
+extern void stm_mst_apl_start_activity_meter();
+extern void stm_mst_apl_event_lightstatus_brake_on();
+extern void stm_mst_apl_event_lightstatus_brake_off();
+extern void stm_master_apl_initialize_valiable();
+extern void stm_mst_apl_start_stm();
diff --git a/policy_manager/stm/zipc/stm_master_remote.c b/policy_manager/stm/zipc/stm_master_remote.c
new file mode 100644
index 0000000..d63cba1
--- /dev/null
+++ b/policy_manager/stm/zipc/stm_master_remote.c
@@ -0,0 +1,29 @@
+#include "./StateTransitionor/ZST_include.h"
+
+void stm_mst_rmt_start_activity_none() {
+ g_stm_crr_state.layer[StmLayerNoRemote].state = StmLayoutNoNone;
+ g_stm_crr_state.layer[StmLayerNoRemote].changed = STM_TRUE;
+}
+
+void stm_mst_rmt_start_activity_tbt() {
+ g_stm_crr_state.layer[StmLayerNoRemote].state = StmLayoutNoRmtTbt;
+ g_stm_crr_state.layer[StmLayerNoRemote].changed = STM_TRUE;
+}
+
+void stm_mst_rmt_initialize_valiable() {
+ g_stm_prv_state.layer[StmLayerNoRemote].state = StmLayoutNoNone;
+ g_stm_prv_state.layer[StmLayerNoRemote].changed = STM_FALSE;
+
+ g_stm_crr_state.layer[StmLayerNoRemote].state = StmLayoutNoNone;
+ g_stm_crr_state.layer[StmLayerNoRemote].changed = STM_FALSE;
+}
+
+void stm_mst_rmt_start_stm() {
+ if (g_stm_event == StmEvtNoUndo) {
+ // nop
+ }
+ else {
+ g_stm_prv_state.layer[StmLayerNoRemote].state = g_stm_crr_state.layer[StmLayerNoRemote].state;
+ }
+ g_stm_crr_state.layer[StmLayerNoRemote].changed = STM_FALSE;
+}
diff --git a/policy_manager/stm/zipc/stm_master_remote.h b/policy_manager/stm/zipc/stm_master_remote.h
new file mode 100644
index 0000000..45d77c7
--- /dev/null
+++ b/policy_manager/stm/zipc/stm_master_remote.h
@@ -0,0 +1,4 @@
+extern void stm_mst_rmt_start_activity_none();
+extern void stm_mst_rmt_start_activity_tbt();
+extern void stm_mst_rmt_initialize_valiable();
+extern void stm_mst_rmt_start_stm();
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 21f287a..4b67d38 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -35,7 +35,9 @@ add_library(${TARGETS_WM} MODULE
wm_client.cpp
wm_error.cpp
wm_layer.cpp
- wm_layer_control.cpp)
+ wm_layer_control.cpp
+ wm_connection.cpp
+ low_can_client.cpp)
target_include_directories(${TARGETS_WM}
PRIVATE
@@ -111,9 +113,10 @@ add_custom_command(TARGET ${TARGETS_WM} POST_BUILD
COMMAND mkdir -p ${PROJECT_BINARY_DIR}/package/root/lib
COMMAND cp -rf ${PROJECT_BINARY_DIR}/src/${TARGETS_WM}.so ${PROJECT_BINARY_DIR}/package/root/lib
COMMAND mkdir -p ${PROJECT_BINARY_DIR}/package/root/etc
- COMMAND cp -f ${CMAKE_SOURCE_DIR}/conf/layers.json ${PROJECT_BINARY_DIR}/package/root/etc
- COMMAND cp -f ${CMAKE_SOURCE_DIR}/conf/old_roles.json ${PROJECT_BINARY_DIR}/package/root/etc
- COMMAND cp -f ${CMAKE_SOURCE_DIR}/conf/areas.json ${PROJECT_BINARY_DIR}/package/root/etc
+ COMMAND cp -f ${PROJECT_SOURCE_DIR}/layers.json ${PROJECT_BINARY_DIR}/package/root/etc
+ COMMAND cp -f ${PROJECT_SOURCE_DIR}/src/config/old_roles.json ${PROJECT_BINARY_DIR}/package/root/etc
+ COMMAND cp -f ${PROJECT_SOURCE_DIR}/src/config/areas.json ${PROJECT_BINARY_DIR}/package/root/etc
+ COMMAND cp -f ${PROJECT_SOURCE_DIR}/src/config/connection.json ${PROJECT_BINARY_DIR}/package/root/etc
)
add_custom_target(package DEPENDS ${PROJECT_BINARY_DIR}/package/root
diff --git a/src/applist.cpp b/src/applist.cpp
index 17b47e3..be5fe57 100644
--- a/src/applist.cpp
+++ b/src/applist.cpp
@@ -377,7 +377,7 @@ WMError AppList::setAction(unsigned req_num, shared_ptr<WMClient> client, const
}
// If visible task is not invisible, redraw is required -> true
bool edraw_f = (visible != TaskVisible::INVISIBLE) ? false : true;
- WMAction action{req_num, client, role, area, visible, edraw_f};
+ WMAction action{req_num, client, role, area, visible, edraw_f, TaskCarState::NO_TASK};
x.sync_draw_req.push_back(action);
result = WMError::SUCCESS;
@@ -413,11 +413,23 @@ bool AppList::setEndDrawFinished(unsigned req_num, const string &appid, const st
{
for (auto &y : x.sync_draw_req)
{
- if (y.client->appID() == appid && y.role == role)
+ if (nullptr != y.client)
{
- HMI_SEQ_INFO(req_num, "Role %s finish redraw", y.role.c_str());
- y.end_draw_finished = true;
- result = true;
+ if (y.client->appID() == appid && y.role == role)
+ {
+ HMI_SEQ_INFO(req_num, "Role %s finish redraw", y.role.c_str());
+ y.end_draw_finished = true;
+ result = true;
+ }
+ }
+ else
+ {
+ if (y.role == role)
+ {
+ HMI_SEQ_INFO(req_num, "Role %s finish redraw", y.role.c_str());
+ y.end_draw_finished = true;
+ result = true;
+ }
}
}
}
@@ -528,7 +540,7 @@ void AppList::reqDump()
{
DUMP(
"Action : (APPID :%s, ROLE :%s, AREA :%s, VISIBLE : %s, END_DRAW_FINISHED: %d)",
- y.client->appID().c_str(),
+ (y.client) ? y.client->appID().c_str() : "-",
y.role.c_str(),
y.area.c_str(),
(y.visible == TaskVisible::INVISIBLE) ? "invisible" : "visible",
diff --git a/src/config/areas.json b/src/config/areas.json
new file mode 100644
index 0000000..d4f3531
--- /dev/null
+++ b/src/config/areas.json
@@ -0,0 +1,204 @@
+{
+ "ecus": [
+ {
+ "name": "master",
+ "screens": [
+ {
+ "id": 0,
+ "areas": [
+ {
+ "name": "fullscreen",
+ "rect": {
+ "x": 0,
+ "y": 0,
+ "w": 1920,
+ "h": 720
+ }
+ },
+ {
+ "name": "normal.full",
+ "rect": {
+ "x": 0,
+ "y": 0,
+ "w": 1920,
+ "h": 720
+ }
+ },
+ {
+ "name": "split.main",
+ "rect": {
+ "x": 0,
+ "y": 0,
+ "w": 1280,
+ "h": 720
+ }
+ },
+ {
+ "name": "split.sub",
+ "rect": {
+ "x": 1280,
+ "y": 0,
+ "w": 640,
+ "h": 720
+ }
+ },
+ {
+ "name": "software_keyboard",
+ "rect": {
+ "x": 0,
+ "y": 962,
+ "w": 1080,
+ "h": 744
+ }
+ },
+ {
+ "name": "restriction.normal",
+ "rect": {
+ "x": 0,
+ "y": 0,
+ "w": 1920,
+ "h": 1080
+ }
+ },
+ {
+ "name": "restriction.split.main",
+ "rect": {
+ "x": 0,
+ "y": 0,
+ "w": 1920,
+ "h": 540
+ }
+ },
+ {
+ "name": "restriction.split.sub",
+ "rect": {
+ "x": 0,
+ "y": 540,
+ "w": 1920,
+ "h": 540
+ }
+ },
+ {
+ "name": "on_screen",
+ "rect": {
+ "x": 1280,
+ "y": 0,
+ "w": 640,
+ "h": 720
+ }
+ },
+ {
+ "name": "master.split.sub",
+ "rect": {
+ "x": 1280,
+ "y": 0,
+ "w": 640,
+ "h": 720
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "slave",
+ "screens": [
+ {
+ "id": 0,
+ "areas": [
+ {
+ "name": "fullscreen",
+ "rect": {
+ "x": 0,
+ "y": 0,
+ "w": 1080,
+ "h": 1920
+ }
+ },
+ {
+ "name": "normal.full",
+ "rect": {
+ "x": 0,
+ "y": 218,
+ "w": 1080,
+ "h": 1488
+ }
+ },
+ {
+ "name": "split.main",
+ "rect": {
+ "x": 0,
+ "y": 218,
+ "w": 1080,
+ "h": 744
+ }
+ },
+ {
+ "name": "split.sub",
+ "rect": {
+ "x": 0,
+ "y": 962,
+ "w": 1080,
+ "h": 744
+ }
+ },
+ {
+ "name": "software_keyboard",
+ "rect": {
+ "x": 0,
+ "y": 962,
+ "w": 1080,
+ "h": 744
+ }
+ },
+ {
+ "name": "restriction.normal",
+ "rect": {
+ "x": 0,
+ "y": 218,
+ "w": 1080,
+ "h": 1488
+ }
+ },
+ {
+ "name": "restriction.split.main",
+ "rect": {
+ "x": 0,
+ "y": 218,
+ "w": 1080,
+ "h": 744
+ }
+ },
+ {
+ "name": "restriction.split.sub",
+ "rect": {
+ "x": 0,
+ "y": 962,
+ "w": 1080,
+ "h": 744
+ }
+ },
+ {
+ "name": "on_screen",
+ "rect": {
+ "x": 0,
+ "y": 218,
+ "w": 1080,
+ "h": 1488
+ }
+ },
+ {
+ "name": "master.split.sub",
+ "rect": {
+ "x": 0,
+ "y": 180,
+ "w": 640,
+ "h": 720
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/config/connection.json b/src/config/connection.json
new file mode 100644
index 0000000..3ee06c3
--- /dev/null
+++ b/src/config/connection.json
@@ -0,0 +1,5 @@
+{
+ "mode": "master",
+ "master_ip": "10.4.1.78",
+ "master_port": 54400
+}
diff --git a/conf/old_roles.json b/src/config/old_roles.json
index d8f19f9..02a4c2d 100644
--- a/conf/old_roles.json
+++ b/src/config/old_roles.json
@@ -34,7 +34,7 @@
},
{
"name": "Navigation",
- "new": "navigation"
+ "new": "map"
},
{
"name": "HVAC",
diff --git a/src/json_helper.cpp b/src/json_helper.cpp
index 72ae36a..d9cf5eb 100644
--- a/src/json_helper.cpp
+++ b/src/json_helper.cpp
@@ -69,6 +69,18 @@ int getIntFromJson(json_object *obj, const char *key)
return json_object_get_int(tmp);
}
+double getDoubleFromJson(json_object *obj, const char *key)
+{
+ json_object *tmp;
+ if (!json_object_object_get_ex(obj, key, &tmp))
+ {
+ HMI_DEBUG("Not found key \"%s\"", key);
+ return 0;
+ }
+
+ return json_object_get_double(tmp);
+}
+
json_bool getBoolFromJson(json_object *obj, const char *key)
{
json_object *tmp;
diff --git a/src/json_helper.hpp b/src/json_helper.hpp
index 6ccbcc1..d4ae85a 100644
--- a/src/json_helper.hpp
+++ b/src/json_helper.hpp
@@ -21,12 +21,12 @@
#include <vector>
struct json_object;
-
json_object *to_json(std::vector<uint32_t> const &v);
namespace jh {
const char* getStringFromJson(json_object* obj, const char* key);
int getIntFromJson(json_object *obj, const char *key);
+double getDoubleFromJson(json_object *obj, const char *key);
json_bool getBoolFromJson(json_object *obj, const char *key);
int inputJsonFilie(const char* file, json_object** obj);
} // namespace jh
diff --git a/src/low_can_client.cpp b/src/low_can_client.cpp
new file mode 100644
index 0000000..090aa14
--- /dev/null
+++ b/src/low_can_client.cpp
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2018 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "low_can_client.hpp"
+#include "json_helper.hpp"
+#include "util.hpp"
+
+extern "C"
+{
+#include <afb/afb-binding.h>
+}
+
+namespace wm
+{
+
+LowCanClient::LowCanClient()
+ : vehicle_speed(0),
+ trans_gear_pos(0),
+ headlamp_status(FALSE),
+ parking_brake_status(TRUE),
+ accel_pedal_pos(0),
+ accel_pedal_stt(FALSE),
+ lightstatus_brake_status(TRUE),
+ is_changed_accel_pedal_stt(false)
+{
+}
+
+void LowCanClient::initialize()
+{
+ int ret;
+
+ // Require API "low-can"
+ ret = afb_daemon_require_api_v2("low-can", 1);
+ if (0 > ret)
+ {
+ HMI_INFO("Requirement API \"low-can\" failed");
+ return;
+ }
+
+ // Subscribe low-level-can
+ // low-can subscribe { "event": "vehicle.speed" }
+ // low-can subscribe { "event": "transmission_gear_position" }
+ // low-can subscribe { "event": "headlamp_status" }
+ // low-can subscribe { "event": "parking_brake_status" }
+ // low-can subscribe { "event": "accelerator.pedal.position" }
+ // low-can subscribe { "event": "lightstatus.brake" }
+ for (int i = SignalNoMin; i <= SignalNoMax; i++)
+ {
+ // Set Event
+ json_object *json_obj = json_object_new_object();
+ json_object_object_add(json_obj, "event",
+ json_object_new_string(this->kSignalName[i]));
+
+ // Set filter
+ if (0 != strcmp("", this->kFilterValue[i]))
+ {
+ json_object_object_add(json_obj, "filter",
+ json_tokener_parse(this->kFilterValue[i]));
+ }
+ HMI_DEBUG("subscribe message:%s", json_object_get_string(json_obj));
+
+ // Subscribe
+ afb_service_call("low-can", "subscribe", json_obj,
+ [](void *closure, int status, json_object *result) {
+ HMI_DEBUG("subscribe result:%s", json_object_get_string(result));
+ },
+ nullptr);
+ }
+
+ return;
+}
+
+const char *LowCanClient::analyzeCanSignal(struct json_object *object)
+{
+ HMI_DEBUG("object:%s", json_object_get_string(object));
+
+ const char *name = jh::getStringFromJson(object, "name");
+ HMI_DEBUG("CAN signal name:%s", name);
+
+ if (strstr(name, this->kSignalName[SignalNoVehicliSpeed]))
+ {
+ // Update vehicle speed
+ this->vehicle_speed = jh::getIntFromJson(object, "value");
+ HMI_DEBUG("Update vehicle speed:%d", this->vehicle_speed);
+ }
+ else if (strstr(name, this->kSignalName[SignalNoTransGearPos]))
+ {
+ // Update transmission gear position
+ this->trans_gear_pos = jh::getIntFromJson(object, "value");
+ HMI_DEBUG("Update transmission gear position:%d", this->trans_gear_pos);
+ }
+ else if (strstr(name, this->kSignalName[SignalNoHeadlame]))
+ {
+ // Update headlamp status
+ this->headlamp_status = jh::getBoolFromJson(object, "value");
+ HMI_DEBUG("Update headlamp status:%d", this->headlamp_status);
+ }
+ else if (strstr(name, this->kSignalName[SignalNoParkingBrake]))
+ {
+ // Update parking gear status
+ this->parking_brake_status = jh::getBoolFromJson(object, "value");
+ HMI_DEBUG("Update parking brake status:%d", this->parking_brake_status);
+ }
+ else if (strstr(name, this->kSignalName[SignalNoAccelPedalPos]))
+ {
+ // Clear flag for whether accel pedal state is changed
+ this->is_changed_accel_pedal_stt = false;
+
+ // Update accelerator pedal status
+ this->accel_pedal_pos = jh::getDoubleFromJson(object, "value");
+ HMI_DEBUG("Update accelerator pedal position:%lf", this->accel_pedal_pos);
+
+ bool accel_pedal_stt;
+ if (0 != this->accel_pedal_pos)
+ {
+ accel_pedal_stt = true;
+ }
+ else
+ {
+ accel_pedal_stt = false;
+ }
+
+ if (accel_pedal_stt != this->accel_pedal_stt)
+ {
+ this->is_changed_accel_pedal_stt = true;
+ this->accel_pedal_stt = accel_pedal_stt;
+ }
+ }
+ else if (strstr(name, this->kSignalName[SignalNoLightstatusBrake]))
+ {
+ // Update lightstatus brake status
+ this->lightstatus_brake_status = jh::getBoolFromJson(object, "value");
+ HMI_DEBUG("Update lightstatus brake status:%d", this->lightstatus_brake_status);
+ }
+
+ return name;
+}
+
+bool LowCanClient::isChangedAccelPedalState()
+{
+ return this->is_changed_accel_pedal_stt;
+}
+
+int LowCanClient::getCurrentTransGearState()
+{
+ return this->trans_gear_pos;
+}
+
+bool LowCanClient::getCurrentHeadlampState()
+{
+ return (bool)this->headlamp_status;
+}
+
+bool LowCanClient::getCurrentParkingBrakeState()
+{
+ return (bool)this->parking_brake_status;
+}
+
+double LowCanClient::getCurrentAccelPedalPosition()
+{
+ return this->accel_pedal_pos;
+}
+
+bool LowCanClient::getCurrentAccelPedalState()
+{
+ return this->accel_pedal_stt;
+}
+
+bool LowCanClient::getCurrentLightstatusBrakeState()
+{
+ return (bool)this->lightstatus_brake_status;
+}
+
+} // namespace wm
diff --git a/src/low_can_client.hpp b/src/low_can_client.hpp
new file mode 100644
index 0000000..9b7f509
--- /dev/null
+++ b/src/low_can_client.hpp
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef TMCAGLWM_LOW_CAN_CLIENT_HPP
+#define TMCAGLWM_LOW_CAN_CLIENT_HPP
+
+#include <string>
+#include <vector>
+#include <json-c/json.h>
+
+namespace wm
+{
+
+class LowCanClient
+{
+
+ public:
+ explicit LowCanClient();
+ ~LowCanClient() = default;
+
+ enum SignalNo
+ {
+ SignalNoVehicliSpeed = 0,
+ SignalNoTransGearPos,
+ SignalNoHeadlame,
+ SignalNoParkingBrake,
+ SignalNoAccelPedalPos,
+ SignalNoLightstatusBrake,
+
+ SignalNum,
+
+ SignalNoMin = SignalNoVehicliSpeed,
+ SignalNoMax = SignalNum - 1,
+ };
+
+ const std::vector<const char *> kSignalName{
+ "vehicle.speed",
+ "transmission_gear_position",
+ "headlamp_status",
+ "parking_brake_status",
+ "accelerator.pedal.position",
+ "lightstatus.brake",
+ };
+
+ void initialize();
+ const char *analyzeCanSignal(struct json_object *object);
+
+ int getCurrentTransGearState();
+ bool getCurrentHeadlampState();
+ bool getCurrentParkingBrakeState();
+ double getCurrentAccelPedalPosition();
+ bool getCurrentAccelPedalState();
+ bool getCurrentLightstatusBrakeState();
+
+ bool isChangedAccelPedalState();
+
+ private:
+ // Disable copy and move
+ LowCanClient(LowCanClient const &) = delete;
+ LowCanClient &operator=(LowCanClient const &) = delete;
+ LowCanClient(LowCanClient &&) = delete;
+ LowCanClient &operator=(LowCanClient &&) = delete;
+
+ enum TransGearPosVal
+ {
+ TransGearPosValD1 = 1,
+ TransGearPosValD2,
+ TransGearPosValD3,
+ TransGearPosValD4,
+ TransGearPosValD5,
+ TransGearPosValD6,
+ TransGearPosValD7,
+ TransGearPosValD8,
+ TransGearPosValR,
+ TransGearPosValN,
+ };
+
+ const std::vector<const char *> kFilterValue{
+ "", // vehicle.speed
+ "", // transmission_gear_position
+ "", // headlamp_status
+ "", // parking_brake_status
+ "", // accelerator.pedal.position
+ "", // lightstatus.brake
+ };
+
+ int vehicle_speed;
+ int trans_gear_pos;
+ json_bool headlamp_status;
+ json_bool parking_brake_status;
+ double accel_pedal_pos;
+ bool accel_pedal_stt;
+ json_bool lightstatus_brake_status;
+
+ bool is_changed_accel_pedal_stt;
+};
+
+} // namespace wm
+
+#endif // TMCAGLWM_LOW_CAN_CLIENT_HPP
diff --git a/src/main.cpp b/src/main.cpp
index d0d7930..b62bb58 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -18,6 +18,8 @@
#include <algorithm>
#include <mutex>
#include <json.h>
+#include <stdlib.h>
+#include <vector>
#include "window_manager.hpp"
#include "json_helper.hpp"
@@ -223,6 +225,49 @@ void windowmanager_requestsurfacexdg(afb_req req) noexcept
}
}
+void windowmanager_setrole(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
+ return;
+ }
+ try
+ {
+ json_object *jreq = afb_req_json(req);
+
+ json_object *j_role = nullptr;
+ if (!json_object_object_get_ex(jreq, "role", &j_role))
+ {
+ afb_req_fail(req, "failed", "Need char const* argument role");
+ return;
+ }
+ char const *a_role = json_object_get_string(j_role);
+ char *appid = afb_req_get_application_id(req);
+
+ if(appid)
+ {
+ auto ret = g_afb_instance->wmgr.api_set_role(appid, a_role);
+ if (!ret)
+ {
+ afb_req_fail(req, "failed", "Couldn't register");
+ }
+ else
+ {
+ createSecurityContext(req, appid, a_role);
+ afb_req_success(req, NULL, "success");
+ }
+ free(appid);
+ }
+ }
+ catch (std::exception &e)
+ {
+ afb_req_fail_f(req, "failed", "Uncaught exception while calling requestsurfacexdg: %s", e.what());
+ return;
+ }
+}
+
void windowmanager_activatewindow(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
@@ -251,17 +296,35 @@ void windowmanager_activatewindow(afb_req req) noexcept
char* appid = afb_req_get_application_id(req);
if(appid)
{
- g_afb_instance->wmgr.api_activate_window(
- appid, a_drawing_name, a_drawing_area,
- [&req](const char *errmsg) {
- if (errmsg != nullptr)
- {
- HMI_ERROR(errmsg);
- afb_req_fail(req, "failed", errmsg);
- return;
- }
- afb_req_success(req, NULL, "success");
- });
+ auto reply = [&req](const char *errmsg) {
+ if (errmsg != nullptr)
+ {
+ HMI_ERROR(errmsg);
+ afb_req_fail(req, "failed", errmsg);
+ return;
+ }
+ afb_req_success(req, NULL, "success");
+ };
+
+ if (g_afb_instance->wmgr.wmcon.isMasterMode() ||
+ !g_afb_instance->wmgr.wmcon.isMasterArea(a_drawing_area))
+ {
+ g_afb_instance->wmgr.api_activate_window(
+ appid, a_drawing_name, a_drawing_area, reply);
+ }
+ else
+ {
+ // TODO: temporarily
+ if (!g_afb_instance->wmgr.wmcon.isConnecting())
+ {
+ g_afb_instance->wmgr.wmcon.connectToMaster();
+ }
+
+ // If Window Manager is slave and this request is for master,
+ // request activateWindow to master
+ g_afb_instance->wmgr.api_activate_surface_to_master(
+ appid, a_drawing_name, a_drawing_area, reply);
+ }
free(appid);
}
}
@@ -294,17 +357,30 @@ void windowmanager_deactivatewindow(afb_req req) noexcept
char* appid = afb_req_get_application_id(req);
if(appid)
{
- g_afb_instance->wmgr.api_deactivate_window(
- appid, a_drawing_name,
- [&req](const char *errmsg) {
- if (errmsg != nullptr)
- {
- HMI_ERROR(errmsg);
- afb_req_fail(req, "failed", errmsg);
- return;
- }
- afb_req_success(req, NULL, "success");
- });
+ auto reply = [&req](const char *errmsg) {
+ if (errmsg != nullptr)
+ {
+ HMI_ERROR(errmsg);
+ afb_req_fail(req, "failed", errmsg);
+ return;
+ }
+ afb_req_success(req, NULL, "success");
+ };
+
+ // TODO: Check whether role is tbtnavi to request remote invisible
+ if (g_afb_instance->wmgr.wmcon.isMasterMode() ||
+ ("tbtnavi" != std::string(a_drawing_name)))
+ {
+ g_afb_instance->wmgr.api_deactivate_window(
+ appid, a_drawing_name, reply);
+ }
+ else
+ {
+ // If Window Manager is slave and this request is for master,
+ // request deactivateWindow to master
+ g_afb_instance->wmgr.api_deactivate_surface_to_master(
+ appid, a_drawing_name, reply);
+ }
free(appid);
}
}
@@ -338,8 +414,18 @@ void windowmanager_enddraw(afb_req req) noexcept
char* appid = afb_req_get_application_id(req);
if(appid)
{
- g_afb_instance->wmgr.api_enddraw(appid, a_drawing_name);
- free(appid);
+ if (g_afb_instance->wmgr.wmcon.isMasterMode() ||
+ !g_afb_instance->wmgr.wmcon.isSyncDrawingForRemote(appid))
+ {
+ g_afb_instance->wmgr.api_enddraw(appid, a_drawing_name);
+ }
+ else
+ {
+ // If Window Manager is slave and requesting app is syncDrawing,
+ // request endDraw to master
+ g_afb_instance->wmgr.api_enddraw_for_remote(appid, a_drawing_name);
+ }
+ free(appid);
}
}
catch (std::exception &e)
@@ -414,6 +500,124 @@ void windowmanager_getareainfo_thunk(afb_req req) noexcept
}
}
+void windowmanager_getcarinfo_thunk(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
+ return;
+ }
+
+ try
+ {
+ json_object *jreq = afb_req_json(req);
+
+ json_object *j_label = nullptr;
+ if (! json_object_object_get_ex(jreq, "label", &j_label))
+ {
+ afb_req_fail(req, "failed", "Need char const* argument label");
+ return;
+ }
+ char const* a_label = json_object_get_string(j_label);
+
+ auto ret = g_afb_instance->wmgr.api_get_car_info(a_label);
+ if (ret.is_err())
+ {
+ afb_req_fail(req, "failed", ret.unwrap_err());
+ return;
+ }
+
+ afb_req_success(req, ret.unwrap(), "success");
+ }
+ catch (std::exception &e)
+ {
+ afb_req_fail_f(req, "failed", "Uncaught exception while calling getcarinfo: %s", e.what());
+ return;
+ }
+}
+
+void windowmanager_set_render_order(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
+ return;
+ }
+
+ char* appid = afb_req_get_application_id(req);
+ if(appid)
+ {
+ json_object *jreq = afb_req_json(req);
+ json_object *j_ro; // Do not free this. binder frees jreq, then free j_ro
+ if (json_object_object_get_ex(jreq, "render_order", &j_ro))
+ {
+ int size = json_object_array_length(j_ro);
+ std::vector<std::string> ro(size);
+ for(int i = 0; i < size; i++)
+ {
+ ro[i] = json_object_get_string(json_object_array_get_idx(j_ro, i));
+ }
+
+ auto ret = g_afb_instance->wmgr.api_client_set_render_order(appid, ro);
+ if (!ret)
+ {
+ afb_req_fail(req, "failed", nullptr);
+ }
+ else
+ {
+ afb_req_success(req, nullptr, nullptr);
+ }
+ }
+ free(appid);
+ }
+ else
+ {
+ afb_req_fail(req, "failed", nullptr);
+ }
+}
+
+void windowmanager_attach_app(afb_req req) noexcept
+{
+ std::lock_guard<std::mutex> guard(binding_m);
+ if (g_afb_instance == nullptr)
+ {
+ afb_req_fail(req, "failed", "Binding not initialized, did the compositor die?");
+ return;
+ }
+
+ char* appid = afb_req_get_application_id(req);
+ if(appid)
+ {
+ json_object *jreq = afb_req_json(req);
+ json_object *j_dest, *j_id; // Do not free this. binder frees jreq, then free j_ro
+ if (json_object_object_get_ex(jreq, "destination", &j_dest) &&
+ json_object_object_get_ex(jreq, "service_surface", &j_id))
+ {
+ const char* dest_app = json_object_get_string(j_dest);
+ const char* service = json_object_get_string(j_id);
+
+ std::string uuid = g_afb_instance->wmgr.api_client_attach_service_surface(appid, dest_app, service);
+ if (uuid.empty())
+ {
+ afb_req_fail(req, "failed", nullptr);
+ }
+ else
+ {
+ json_object *resp = json_object_new_object();
+ json_object_object_add(resp, "uuid", json_object_new_string(uuid.c_str()));
+ afb_req_success(req, resp, nullptr);
+ }
+ }
+ free(appid);
+ }
+ else
+ {
+ afb_req_fail(req, "failed", nullptr);
+ }
+}
+
void windowmanager_wm_subscribe(afb_req req) noexcept
{
std::lock_guard<std::mutex> guard(binding_m);
@@ -491,18 +695,27 @@ void windowmanager_debug_terminate(afb_req req) noexcept
}
}
+void on_event(const char *event, struct json_object *object)
+{
+ g_afb_instance->wmgr.analyzeReceivedEvent(event, object);
+}
+
const struct afb_verb_v2 windowmanager_verbs[] = {
{"requestSurface", windowmanager_requestsurface, nullptr, nullptr, AFB_SESSION_NONE},
- {"requestSurfaceXDG", windowmanager_requestsurfacexdg, nullptr, nullptr, AFB_SESSION_NONE},
+ {"requestSurfaceXdg", windowmanager_requestsurfacexdg, nullptr, nullptr, AFB_SESSION_NONE},
+ {"setRole", windowmanager_setrole, nullptr, nullptr, AFB_SESSION_NONE},
{"activateWindow", windowmanager_activatewindow, nullptr, nullptr, AFB_SESSION_NONE},
{"deactivateWindow", windowmanager_deactivatewindow, nullptr, nullptr, AFB_SESSION_NONE},
{"endDraw", windowmanager_enddraw, nullptr, nullptr, AFB_SESSION_NONE},
{"getDisplayInfo", windowmanager_getdisplayinfo_thunk, nullptr, nullptr, AFB_SESSION_NONE},
{"getAreaInfo", windowmanager_getareainfo_thunk, nullptr, nullptr, AFB_SESSION_NONE},
+ {"getCarInfo", windowmanager_getcarinfo_thunk, nullptr, nullptr, AFB_SESSION_NONE },
+ {"setRenderOrder", windowmanager_set_render_order, nullptr, nullptr, AFB_SESSION_NONE},
+ {"attachApp", windowmanager_attach_app, nullptr, nullptr, AFB_SESSION_NONE},
{"wm_subscribe", windowmanager_wm_subscribe, nullptr, nullptr, AFB_SESSION_NONE},
{"ping", windowmanager_ping, nullptr, nullptr, AFB_SESSION_NONE},
{"debug_terminate", windowmanager_debug_terminate, nullptr, nullptr, AFB_SESSION_NONE},
{}};
extern "C" const struct afb_binding_v2 afbBindingV2 = {
- "windowmanager", nullptr, nullptr, windowmanager_verbs, nullptr, binding_init, nullptr, 0};
+ "windowmanager", nullptr, nullptr, windowmanager_verbs, nullptr, binding_init, on_event, 0};
diff --git a/src/pm_wrapper.cpp b/src/pm_wrapper.cpp
index 8706128..7cf90f0 100644
--- a/src/pm_wrapper.cpp
+++ b/src/pm_wrapper.cpp
@@ -43,14 +43,14 @@ static void onError(json_object *json_out)
PMWrapper::PMWrapper() {}
-int PMWrapper::initialize()
+int PMWrapper::initialize(std::string ecu_name)
{
int ret = 0;
- ret = this->pm.initialize();
+ ret = this->pm.initialize(ecu_name);
if (0 > ret)
{
- HMI_ERROR("Faild to initialize PolicyManager");
+ HMI_ERROR("wm:pmw", "Faild to initialize PolicyManager");
}
g_context = this;
@@ -81,7 +81,39 @@ int PMWrapper::setInputEventData(Task task, std::string role, std::string area)
{
event = "deactivate";
}
- else
+ else if (Task::TASK_PARKING_BRAKE_OFF == task)
+ {
+ event = "parking_brake_off";
+ }
+ else if (Task::TASK_PARKING_BRAKE_ON == task)
+ {
+ event = "parking_brake_on";
+ }
+ else if (Task::TASK_ACCEL_PEDAL_OFF == task)
+ {
+ event = "accel_pedal_off";
+ }
+ else if (Task::TASK_ACCEL_PEDAL_ON == task)
+ {
+ event = "accel_pedal_on";
+ }
+ else if (Task::TASK_HEDLAMP_OFF == task)
+ {
+ event = "headlamp_off";
+ }
+ else if (Task::TASK_HEDLAMP_ON == task)
+ {
+ event = "headlamp_on";
+ }
+ else if (Task::TASK_LIGHTSTATUS_BRAKE_OFF == task)
+ {
+ event = "lightstatus_brake_off";
+ }
+ else if (Task::TASK_LIGHTSTATUS_BRAKE_ON == task)
+ {
+ event = "lightstatus_brake_on";
+ }
+ else
{
event = "";
}
@@ -95,7 +127,7 @@ int PMWrapper::setInputEventData(Task task, std::string role, std::string area)
ret = this->pm.setInputEventData(json_in);
if (0 > ret)
{
- HMI_ERROR("Faild to set input event data to PolicyManager");
+ HMI_ERROR("wm:pmw", "Faild to set input event data to PolicyManager");
}
json_object_put(json_in);
@@ -108,7 +140,7 @@ int PMWrapper::executeStateTransition()
ret = this->pm.executeStateTransition();
if (0 > ret)
{
- HMI_ERROR("Failed to execute state transition for PolicyManager");
+ HMI_ERROR("wm:pmw", "Failed to execute state transition for PolicyManager");
}
return ret;
@@ -127,11 +159,151 @@ void PMWrapper::updateStates(json_object *json_out)
HMI_DEBUG("json_out dump:%s", json_object_get_string(json_out));
+ this->createCarStateChangeAction(json_out, actions);
this->createLayoutChangeAction(json_out, actions);
this->on_state_transitioned(actions);
}
+void PMWrapper::createCarStateChangeAction(json_object *json_out, std::vector<WMAction> &actions)
+{
+ json_object *json_car_ele;
+ if (!json_object_object_get_ex(json_out, "car_elements", &json_car_ele))
+ {
+ HMI_DEBUG("Not found key \"car_elements\"");
+ return;
+ }
+
+ int len = json_object_array_length(json_car_ele);
+ HMI_DEBUG("json_car_ele len:%d", len);
+
+ for (int i = 0; i < len; i++)
+ {
+ json_object *json_tmp = json_object_array_get_idx(json_car_ele, i);
+
+ std::string car_ele_name = jh::getStringFromJson(json_tmp, "name");
+ std::string state = jh::getStringFromJson(json_tmp, "state");
+ json_bool changed = jh::getBoolFromJson(json_tmp, "changed");
+ HMI_DEBUG("car_element:%s changed:%d", car_ele_name.c_str(), changed);
+
+ if (changed)
+ {
+ TaskCarState task = TaskCarState::NO_TASK;
+ if ("parking_brake" == car_ele_name)
+ {
+ if ("off" == state)
+ {
+ task = TaskCarState::PARKING_BRAKE_OFF;
+ }
+ else if ("on" == state)
+ {
+ task = TaskCarState::PARKING_BRAKE_ON;
+ }
+ else
+ {
+ HMI_DEBUG("Unknown parking brake state: %s", state.c_str());
+ }
+ }
+ else if ("accel_pedal" == car_ele_name)
+ {
+ if ("off" == state)
+ {
+ task = TaskCarState::ACCEL_PEDAL_OFF;
+ }
+ else if ("on" == state)
+ {
+ task = TaskCarState::ACCEL_PEDAL_ON;
+ }
+ else
+ {
+ HMI_DEBUG("Unknown accel pedal state: %s", state.c_str());
+ }
+ }
+ else if ("lamp" == car_ele_name)
+ {
+ if ("off" == state)
+ {
+ task = TaskCarState::HEDLAMP_OFF;
+ }
+ else if ("on" == state)
+ {
+ task = TaskCarState::HEDLAMP_ON;
+ }
+ else
+ {
+ HMI_DEBUG("Unknown lamp state: %s", state.c_str());
+ }
+ }
+ else if ("lightstatus_brake" == car_ele_name)
+ {
+ if ("off" == state)
+ {
+ task = TaskCarState::LIGHTSTATUS_BRAKE_OFF;
+ }
+ else if ("on" == state)
+ {
+ task = TaskCarState::LIGHTSTATUS_BRAKE_ON;
+ }
+ else
+ {
+ HMI_DEBUG("Unknown lightstatus brake state: %s", state.c_str());
+ }
+ }
+ else if ("running" == car_ele_name)
+ {
+ if ("stop" == state)
+ {
+ task = TaskCarState::CAR_STOP;
+ }
+ else if ("run" == state)
+ {
+ task = TaskCarState::CAR_RUN;
+ }
+ else
+ {
+ HMI_DEBUG("Unknown car state: %s", state.c_str());
+ }
+ }
+ else if ("restriction_mode" == car_ele_name)
+ {
+ if ("off" == state)
+ {
+ task = TaskCarState::RESTRICTION_MODE_OFF;
+ }
+ else if ("on" == state)
+ {
+ task = TaskCarState::RESTRICTION_MODE_ON;
+ }
+ else
+ {
+ HMI_DEBUG("Unknown car state: %s", state.c_str());
+ }
+ }
+ else
+ {
+ HMI_DEBUG("Unknown car element: %s", car_ele_name.c_str());
+ }
+
+ // Set action
+ if (TaskCarState::NO_TASK != task)
+ {
+ bool end_draw_finished = true;
+ WMAction act
+ {
+ 0,
+ nullptr,
+ "",
+ "",
+ TaskVisible::NO_CHANGE,
+ end_draw_finished,
+ task
+ };
+ actions.push_back(act);
+ }
+ }
+ }
+}
+
void PMWrapper::createLayoutChangeAction(json_object *json_out, std::vector<WMAction> &actions)
{
// Get displayed roles from previous layout
@@ -197,7 +369,8 @@ void PMWrapper::createLayoutChangeAction(json_object *json_out, std::vector<WMAc
role_name,
area_name,
TaskVisible::VISIBLE,
- end_draw_finished
+ end_draw_finished,
+ TaskCarState::NO_TASK
};
actions.push_back(act);
}
@@ -220,7 +393,8 @@ void PMWrapper::createLayoutChangeAction(json_object *json_out, std::vector<WMAc
role_name,
area_name,
TaskVisible::VISIBLE,
- end_draw_finished
+ end_draw_finished,
+ TaskCarState::NO_TASK
};
actions.push_back(act);
}
@@ -245,7 +419,8 @@ void PMWrapper::createLayoutChangeAction(json_object *json_out, std::vector<WMAc
i_prv.first,
"",
TaskVisible::INVISIBLE,
- end_draw_finished
+ end_draw_finished,
+ TaskCarState::NO_TASK
};
actions.push_back(act);
}
diff --git a/src/pm_wrapper.hpp b/src/pm_wrapper.hpp
index 31ec002..84d68df 100644
--- a/src/pm_wrapper.hpp
+++ b/src/pm_wrapper.hpp
@@ -41,7 +41,7 @@ class PMWrapper
using StateTransitionHandler = std::function<void(std::vector<WMAction>)>;
using ErrorHandler = std::function<void(void)>;
- int initialize();
+ int initialize(std::string ecu_name);
void registerCallback(StateTransitionHandler on_state_transitioned,
ErrorHandler on_error);
int setInputEventData(Task task, std::string role, std::string area);
@@ -67,6 +67,7 @@ class PMWrapper
std::map<std::string, RoleState> prvlayer2rolestate;
std::map<std::string, RoleState> crrlayer2rolestate;
+ void createCarStateChangeAction(json_object *json_out, std::vector<WMAction> &actions);
void createLayoutChangeAction(json_object *json_out, std::vector<WMAction> &actions);
};
diff --git a/src/request.cpp b/src/request.cpp
index 069f8ff..0d8e5d4 100644
--- a/src/request.cpp
+++ b/src/request.cpp
@@ -30,6 +30,13 @@ WMRequest::WMRequest(string appid, string role, string area, Task task)
{
}
+WMRequest::WMRequest(Task task)
+ : req_num(0),
+ trigger{"", "", "", task},
+ sync_draw_req(0)
+{
+}
+
WMRequest::~WMRequest()
{
}
@@ -41,4 +48,4 @@ WMRequest::WMRequest(const WMRequest &obj)
this->sync_draw_req = obj.sync_draw_req;
}
-} // namespace wm \ No newline at end of file
+} // namespace wm
diff --git a/src/request.hpp b/src/request.hpp
index 073dd27..bb203e3 100644
--- a/src/request.hpp
+++ b/src/request.hpp
@@ -30,6 +30,16 @@ enum Task
{
TASK_ALLOCATE,
TASK_RELEASE,
+ TASK_PARKING_BRAKE_OFF,
+ TASK_PARKING_BRAKE_ON,
+ TASK_ACCEL_PEDAL_OFF,
+ TASK_ACCEL_PEDAL_ON,
+ TASK_HEDLAMP_OFF,
+ TASK_HEDLAMP_ON,
+ TASK_LIGHTSTATUS_BRAKE_OFF,
+ TASK_LIGHTSTATUS_BRAKE_ON,
+ TASK_RESTRICTION_MODE_OFF,
+ TASK_RESTRICTION_MODE_ON,
TASK_INVALID
};
@@ -37,9 +47,30 @@ enum TaskVisible
{
VISIBLE,
INVISIBLE,
+ REQ_REMOTE_VISIBLE,
+ REQ_REMOTE_INVISIBLE,
+ REMOTE_VISIBLE,
+ REMOTE_INVISIBLE,
NO_CHANGE
};
+enum TaskCarState
+{
+ PARKING_BRAKE_OFF,
+ PARKING_BRAKE_ON,
+ ACCEL_PEDAL_OFF,
+ ACCEL_PEDAL_ON,
+ HEDLAMP_OFF,
+ HEDLAMP_ON,
+ LIGHTSTATUS_BRAKE_OFF,
+ LIGHTSTATUS_BRAKE_ON,
+ CAR_STOP,
+ CAR_RUN,
+ RESTRICTION_MODE_OFF,
+ RESTRICTION_MODE_ON,
+ NO_TASK,
+};
+
struct WMTrigger
{
std::string appid;
@@ -56,6 +87,7 @@ struct WMAction
std::string area;
TaskVisible visible;
bool end_draw_finished;
+ TaskCarState car_state;
};
struct WMRequest
@@ -63,6 +95,7 @@ struct WMRequest
WMRequest();
explicit WMRequest(std::string appid, std::string role,
std::string area, Task task);
+ explicit WMRequest(Task task);
virtual ~WMRequest();
WMRequest(const WMRequest &obj);
@@ -73,4 +106,4 @@ struct WMRequest
} // namespace wm
-#endif //WMREQUEST_HPP \ No newline at end of file
+#endif //WMREQUEST_HPP
diff --git a/src/util.cpp b/src/util.cpp
index 37977f2..b22a704 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -16,6 +16,7 @@
#include "util.hpp"
+#include <sstream>
#include <time.h>
#include <stdio.h>
#include <stdarg.h>
@@ -139,4 +140,33 @@ void _DUMP(enum LOG_LEVEL level, const char *log, ...)
fprintf(stderr, "%s \n", message);
va_end(args);
free(message);
-} \ No newline at end of file
+}
+
+std::vector<std::string> parseString(std::string str, char delimiter)
+{
+ // Parse string by delimiter
+ std::vector<std::string> vct;
+ std::stringstream ss{str};
+ std::string buf;
+ while (std::getline(ss, buf, delimiter))
+ {
+ if (!buf.empty())
+ {
+ // Delete space and push back to vector
+ vct.push_back(deleteSpace(buf));
+ }
+ }
+ return vct;
+}
+
+std::string deleteSpace(std::string str)
+{
+ std::string ret = str;
+ size_t pos;
+ while ((pos = ret.find_first_of(" ")) != std::string::npos)
+ {
+ ret.erase(pos, 1);
+ }
+ return ret;
+}
+
diff --git a/src/util.hpp b/src/util.hpp
index 077f212..57eaf81 100644
--- a/src/util.hpp
+++ b/src/util.hpp
@@ -19,6 +19,8 @@
#include <functional>
#include <thread>
+#include <string>
+#include <vector>
#include <sys/poll.h>
#include <string.h>
@@ -36,7 +38,7 @@
#define HMI_SEQ_INFO(seq_num, args,...) _HMI_SEQ_LOG(LOG_LEVEL_INFO, __FILENAME__, __FUNCTION__, __LINE__, seq_num, args, ##__VA_ARGS__)
#define HMI_SEQ_DEBUG(seq_num, args,...) _HMI_SEQ_LOG(LOG_LEVEL_DEBUG, __FILENAME__, __FUNCTION__, __LINE__, seq_num, args, ##__VA_ARGS__)
-#define DUMP(args, ...) _DUMP(LOG_LEVEL_DEBUG, args, ##__VA_ARGS__)
+#define DUMP(args, ...) _DUMP(LOG_LEVEL_INFO, args, ##__VA_ARGS__)
enum LOG_LEVEL{
LOG_LEVEL_NONE = 0,
@@ -52,6 +54,9 @@ void _HMI_LOG(enum LOG_LEVEL level, const char* file, const char* func, const in
void _HMI_SEQ_LOG(enum LOG_LEVEL level, const char* file, const char* func, const int line, unsigned seq_num, const char* log, ...);
void _DUMP(enum LOG_LEVEL level, const char *log, ...);
+std::vector<std::string> parseString(std::string str, char delimiter);
+std::string deleteSpace(std::string str);
+
struct rect
{
int32_t w, h;
diff --git a/src/window_manager.cpp b/src/window_manager.cpp
index 7ab5213..cdf57c2 100644
--- a/src/window_manager.cpp
+++ b/src/window_manager.cpp
@@ -16,6 +16,7 @@
#include <fstream>
#include <regex>
+#include <sstream>
#include "window_manager.hpp"
#include "json_helper.hpp"
@@ -64,12 +65,31 @@ static const vector<string> kListEventName{
"syncDraw",
"flushDraw",
"screenUpdated",
+ "headlampOff",
+ "headlampOn",
+ "parkingBrakeOff",
+ "parkingBrakeOn",
+ "lightstatusBrakeOff",
+ "lightstatusBrakeOn",
+ "carStop",
+ "carRun",
"error"};
+static const char kPathOldRolesConfigFile[] = "/etc/old_roles.json";
static sd_event_source *g_timer_ev_src = nullptr;
static AppList g_app_list;
static WindowManager *g_context;
+struct AfbClosure {
+public:
+ AfbClosure(unsigned pid, unsigned ppid, unsigned surface)
+ : pid(pid), ppid(ppid), surface(surface) {}
+ ~AfbClosure() = default;
+ unsigned pid;
+ unsigned ppid;
+ unsigned surface;
+};
+
namespace
{
@@ -89,13 +109,19 @@ static void onError()
{
g_context->processError(WMError::LAYOUT_CHANGE_FAIL);
}
+
+static void onReceiveRemoteRequest(json_object *data)
+{
+ g_context->processForRemoteRequest(data);
+}
} // namespace
/**
* WindowManager Impl
*/
WindowManager::WindowManager()
- : id_alloc{}
+ : wmcon{},
+ id_alloc{}
{
const char *path = getenv("AFM_APP_INSTALL_DIR");
if (!path)
@@ -104,7 +130,11 @@ WindowManager::WindowManager()
}
string root = path;
- this->lc = std::make_shared<LayerControl>(root);
+ // TODO: ECU name should be decide by config file
+ // Get mode and decide ECU name
+ string ecu_name = this->wmcon.getEcuName();
+
+ this->lc = std::make_shared<LayerControl>(root, ecu_name);
HMI_DEBUG("Layer Controller initialized");
}
@@ -113,31 +143,36 @@ int WindowManager::init()
{
LayerControlCallbacks lmcb;
lmcb.surfaceCreated = [&](unsigned pid, unsigned surface){
- this->surface_created(surface);
+ this->surface_created(pid, surface);
};
lmcb.surfaceDestroyed = [&](unsigned surface){
this->surface_removed(surface);
};
-
- if(this->lc->init(lmcb) != WMError::SUCCESS)
- {
- return -1;
- }
+ this->lc->init(lmcb);
// TODO: application requests by old role,
// so create role map (old, new)
- // Load old_role.db
- this->loadOldRoleDb();
+ // Load old_roles config file
+ this->loadOldRolesConfigFile();
+
+ // Initialize LowCanClient
+ this->lcc.initialize();
// Store my context for calling callback from PolicyManager
g_context = this;
// Initialize PMWrapper
- this->pmw.initialize();
+ this->pmw.initialize(this->wmcon.getEcuName());
// Register callback to PolicyManager
this->pmw.registerCallback(onStateTransitioned, onError);
+ // Initialize WMConnection
+ this->wmcon.initialize();
+
+ // Register callback to WMConnection
+ this->wmcon.registerCallback(onReceiveRemoteRequest);
+
// Make afb event
for (int i = Event_Val_Min; i <= Event_Val_Max; i++)
{
@@ -157,7 +192,7 @@ int WindowManager::init()
double scale = static_cast<double>(dp_bg.height()) / css_bg.h;
this->lc->setupArea(dp_bg, scale);
- return 0;
+ return 0; //init_layers();
}
result<int> WindowManager::api_request_surface(char const *appid, char const *drawing_name)
@@ -165,35 +200,52 @@ result<int> WindowManager::api_request_surface(char const *appid, char const *dr
// TODO: application requests by old role,
// so convert role old to new
const char *role = this->convertRoleOldToNew(drawing_name);
- string str_id = appid;
- string str_role = role;
- unsigned lid = 0;
+ string l_name;
+ string s_appid = appid;
+ string s_role = role;
- if(!g_app_list.contains(str_id))
+ if(!g_app_list.contains(s_appid))
{
- lid = this->lc->getNewLayerID(str_role);
- if (lid == 0)
+ unsigned l_id = this->lc->getNewLayerID(s_role, &l_name);
+ if (l_id == 0)
{
// register drawing_name as fallback and make it displayed.
- lid = this->lc->getNewLayerID(string("fallback"));
+ l_id = this->lc->getNewLayerID("fallback", &l_name);
HMI_DEBUG("%s is not registered in layers.json, then fallback as normal app", role);
- if (lid == 0)
+ if (l_id == 0)
{
return Err<int>("Designated role does not match any role, fallback is disabled");
}
}
- this->lc->createNewLayer(lid);
+
+ // TODO: remote layer size is fixed value
+ if ("Remote" == l_name)
+ {
+ this->lc->createNewRemoteLayer(l_id);
+ }
+ else
+ {
+ this->lc->createNewLayer(l_id);
+ }
+
// add client into the db
- g_app_list.addClient(str_id, lid, str_role);
+ g_app_list.addClient(s_appid, l_id, s_role);
}
// generate surface ID for ivi-shell application
- auto rname = this->id_alloc.lookup(str_role);
+
+ auto rname = this->id_alloc.lookup(string(role));
if (!rname)
{
// name does not exist yet, allocate surface id...
- auto id = int(this->id_alloc.generate_id(str_role));
- this->tmp_surface2app[id] = {str_id, lid};
+ auto id = int(this->id_alloc.generate_id(role));
+ this->tmp_surface2app[id] = {s_appid, 0};
+
+ // Work Around
+ HMI_NOTICE("WORK AROUND: add surface on request surface");
+ auto client = g_app_list.lookUpClient(s_appid);
+ client->addSurface(id);
+ ///////////////
// Set role map of (new, old)
this->rolenew2old[role] = string(drawing_name);
@@ -208,13 +260,8 @@ result<int> WindowManager::api_request_surface(char const *appid, char const *dr
char const *WindowManager::api_request_surface(char const *appid, char const *drawing_name,
char const *ivi_id)
{
- // TODO: application requests by old role,
- // so convert role old to new
- const char *role = this->convertRoleOldToNew(drawing_name);
- string str_id = appid;
- string str_role = role;
-
unsigned sid = std::stol(ivi_id);
+
HMI_DEBUG("This API(requestSurfaceXDG) is for XDG Application using runXDG");
/*
* IVI-shell doesn't send surface_size event via ivi-wm protocol
@@ -229,35 +276,54 @@ char const *WindowManager::api_request_surface(char const *appid, char const *dr
return "fail";
}
- if(!g_app_list.contains(str_id))
+ // TODO: application requests by old role,
+ // so convert role old to new
+ const char *role = this->convertRoleOldToNew(drawing_name);
+ string s_role = role;
+ string s_appid = appid;
+ string l_name;
+
+ if(!g_app_list.contains(s_appid))
{
- unsigned l_id = this->lc->getNewLayerID(str_role);
+ // auto lid = this->layers.get_layer_id(string(role));
+ unsigned l_id = this->lc->getNewLayerID(s_role, &l_name);
if (l_id == 0)
{
- // register drawing_name as fallback and make it displayed.
- l_id = this->lc->getNewLayerID("fallback");
+ /**
+ * register drawing_name as fallback and make it displayed.
+ */
+ l_id = this->lc->getNewLayerID("fallback", &l_name);
HMI_DEBUG("%s is not registered in layers.json, then fallback as normal app", role);
if (l_id == 0)
{
return "Designated role does not match any role, fallback is disabled";
}
}
- this->lc->createNewLayer(l_id);
+
+ // TODO: remote layer size is fixed value
+ if ("Remote" == l_name)
+ {
+ this->lc->createNewRemoteLayer(l_id);
+ }
+ else
+ {
+ this->lc->createNewLayer(l_id);
+ }
+
// add client into the db
- g_app_list.addClient(str_id, l_id, str_role);
+ g_app_list.addClient(s_appid, l_id, s_role);
}
- auto rname = this->id_alloc.lookup(str_role);
-
+ auto rname = this->id_alloc.lookup(s_role);
if (rname)
{
return "Surface already present";
}
// register pair drawing_name and ivi_id
- this->id_alloc.register_name_id(str_role, sid);
+ this->id_alloc.register_name_id(role, sid);
- auto client = g_app_list.lookUpClient(str_id);
+ auto client = g_app_list.lookUpClient(s_appid);
client->addSurface(sid);
// Set role map of (new, old)
@@ -266,6 +332,103 @@ char const *WindowManager::api_request_surface(char const *appid, char const *dr
return nullptr;
}
+bool WindowManager::api_set_role(char const *appid, char const *drawing_name)
+{
+ bool ret = false;
+
+ // TODO: application requests by old role,
+ // so convert role old to new
+ const char *role = this->convertRoleOldToNew(drawing_name);
+ string s_role = role;
+ string s_appid = appid;
+ string l_name;
+
+ // Create WMClient
+ if(!g_app_list.contains(s_appid))
+ {
+ // auto lid = this->layers.get_layer_id(string(role));
+ unsigned l_id = this->lc->getNewLayerID(s_role, &l_name);
+ if (l_id == 0)
+ {
+ /**
+ * register drawing_name as fallback and make it displayed.
+ */
+ l_id = this->lc->getNewLayerID("fallback", &l_name);
+ HMI_DEBUG("%s is not registered in layers.json, then fallback as normal app", role);
+ if (l_id == 0)
+ {
+ HMI_ERROR("Designated role does not match any role, fallback is disabled");
+ return ret;
+ }
+ }
+
+ // TODO: remote layer size is fixed value
+ if ("Remote" == l_name)
+ {
+ this->lc->createNewRemoteLayer(l_id);
+ }
+ else
+ {
+ this->lc->createNewLayer(l_id);
+ }
+
+ // add client into the db
+ g_app_list.addClient(s_appid, l_id, s_role);
+ // Set role map of (new, old)
+ this->rolenew2old[role] = string(drawing_name);
+ }
+
+ // for(auto itr = this->tmp_surface2app.begin();
+ // itr != this->tmp_surface2app.end() ; ++itr)
+ // {
+ for(auto& x : this->tmp_surface2app)
+ {
+ if(x.second.appid == s_appid)
+ {
+ unsigned surface = x.first;
+ auto client = g_app_list.lookUpClient(s_appid);
+ client->addSurface(surface);
+ this->tmp_surface2app.erase(surface);
+ this->id_alloc.register_name_id(s_role, surface);
+ break;
+ }
+ }
+
+/* if(0 != pid){
+ // search floating surfaceID from pid if pid is designated.
+ wm_err = g_app_list.popFloatingSurface(pid, &surface);
+ }
+ else{
+ // get floating surface with appid. If WM queries appid from pid,
+ // WM can bind surface and role with appid(not implemented yet)
+ //wm_err = g_app_list.popFloatingSurface(id);
+ }
+ if(wm_err != WMError::SUCCESS){
+ HMI_ERROR("No floating surface for app: %s", id.c_str());
+ g_app_list.addFloatingClient(id, lid, role);
+ HMI_NOTICE("%s : Waiting for surface creation", id.c_str());
+ return ret;
+ }
+
+ ret = true;
+ if (g_app_list.contains(id))
+ {
+ HMI_INFO("Add role: %s with surface: %d. Client %s has multi surfaces.",
+ role.c_str(), surface, id.c_str());
+ auto client = g_app_list.lookUpClient(id);
+ client->appendRole(role);
+ }
+ else{
+ HMI_INFO("Create new client: %s, surface: %d into layer: %d with role: %s",
+ id.c_str(), surface, lid, role.c_str());
+ g_app_list.addClient(id, lid, role);
+ } */
+
+ // register pair drawing_name and ivi_id
+
+ return true;
+}
+
void WindowManager::api_activate_window(char const *appid, char const *drawing_name,
char const *drawing_area, const reply_func &reply)
{
@@ -284,12 +447,21 @@ void WindowManager::api_activate_window(char const *appid, char const *drawing_n
}
auto client = g_app_list.lookUpClient(id);
+ // unsigned srfc = client->surfaceID(role);
+ // unsigned layer = client->layerID();
+
+ // g_app_list.removeFloatingSurface(client->surfaceID());
+ // g_app_list.removeFloatingSurface(client);
+
Task task = Task::TASK_ALLOCATE;
unsigned req_num = 0;
WMError ret = WMError::UNKNOWN;
ret = this->setRequest(id, role, area, task, &req_num);
+ //vector<WMLayerState> current_states = this->lc->getCurrentStates();
+ // ret = this->setRequest(id, role, area, task, current_states, &req_num);
+
if(ret != WMError::SUCCESS)
{
HMI_ERROR(errorDescription(ret));
@@ -319,6 +491,137 @@ void WindowManager::api_activate_window(char const *appid, char const *drawing_n
}
}
+void WindowManager::api_activate_surface_for_slave(
+ char const *appid, char const *drawing_name,
+ char const *drawing_area, const reply_func &reply)
+{
+ // TODO: application requests by old role,
+ // so convert role old to new
+ const char *c_role = this->convertRoleOldToNew(drawing_name);
+
+ string id = appid;
+ string role = c_role;
+ string area = drawing_area;
+
+ if(!g_app_list.contains(id))
+ {
+ // Request surface of app in slave to register app information
+ this->api_request_surface(appid, drawing_name);
+
+ // Set role of app in slave to register app information
+ this->api_set_role(appid, drawing_name);
+ }
+ auto client = g_app_list.lookUpClient(id);
+
+ // unsigned srfc = client->surfaceID(role);
+ // unsigned layer = client->layerID();
+
+ // g_app_list.removeFloatingSurface(client->surfaceID());
+ // g_app_list.removeFloatingSurface(client);
+
+ Task task = Task::TASK_ALLOCATE;
+ unsigned req_num = 0;
+ WMError ret = WMError::UNKNOWN;
+
+ ret = this->setRequestForSlave(id, role, area, task, &req_num);
+
+ //vector<WMLayerState> current_states = this->lc->getCurrentStates();
+ // ret = this->setRequest(id, role, area, task, current_states, &req_num);
+
+ if(ret != WMError::SUCCESS)
+ {
+ HMI_ERROR(errorDescription(ret));
+ reply("Failed to set request");
+ return;
+ }
+
+ reply(nullptr);
+ if (req_num != g_app_list.currentRequestNumber())
+ {
+ // Add request, then invoked after the previous task is finished
+ HMI_SEQ_DEBUG(req_num, "request is accepted");
+ return;
+ }
+
+ /*
+ * Do allocate tasks
+ */
+ ret = this->checkPolicyForSlave(req_num);
+
+ if (ret != WMError::SUCCESS)
+ {
+ //this->emit_error()
+ HMI_SEQ_ERROR(req_num, errorDescription(ret));
+ g_app_list.removeRequest(req_num);
+ this->processNextRequest();
+ }
+}
+
+void WindowManager::api_activate_surface_to_master(
+ char const *appid, char const *drawing_name,
+ char const *drawing_area, const reply_func &reply)
+{
+ // TODO: application requests by old role,
+ // so convert role old to new
+ const char *c_role = this->convertRoleOldToNew(drawing_name);
+
+ string id = appid;
+ string role = c_role;
+ string area = drawing_area;
+
+ if(!g_app_list.contains(id))
+ {
+ reply("app doesn't request 'requestSurface' or 'setRole' yet");
+ return;
+ }
+ auto client = g_app_list.lookUpClient(id);
+
+ // unsigned srfc = client->surfaceID(role);
+ // unsigned layer = client->layerID();
+
+ // g_app_list.removeFloatingSurface(client->surfaceID());
+ // g_app_list.removeFloatingSurface(client);
+
+ Task task = Task::TASK_ALLOCATE;
+ unsigned req_num = 0;
+ WMError ret = WMError::UNKNOWN;
+
+ ret = this->setRequest(id, role, area, task, &req_num);
+
+ //vector<WMLayerState> current_states = this->lc->getCurrentStates();
+ // ret = this->setRequest(id, role, area, task, current_states, &req_num);
+
+ if(ret != WMError::SUCCESS)
+ {
+ HMI_ERROR(errorDescription(ret));
+ reply("Failed to set request");
+ return;
+ }
+
+ reply(nullptr);
+ if (req_num != g_app_list.currentRequestNumber())
+ {
+ // Add request, then invoked after the previous task is finished
+ HMI_SEQ_DEBUG(req_num, "request is accepted");
+ return;
+ }
+
+ /*
+ * Do allocate tasks
+ */
+ int i_ret = this->wmcon.sendRequest("activateWindow", appid,
+ drawing_name, drawing_area);
+ if (0 > i_ret)
+ {
+ //this->emit_error()
+ HMI_SEQ_ERROR(req_num, errorDescription(ret));
+ g_app_list.removeRequest(req_num);
+ this->processNextRequest();
+ }
+
+ this->setTimer();
+}
+
void WindowManager::api_deactivate_window(char const *appid, char const *drawing_name,
const reply_func &reply)
{
@@ -367,6 +670,104 @@ void WindowManager::api_deactivate_window(char const *appid, char const *drawing
}
}
+void WindowManager::api_deactivate_surface_for_slave(char const *appid, char const *drawing_name,
+ const reply_func &reply)
+{
+ // TODO: application requests by old role,
+ // so convert role old to new
+ const char *c_role = this->convertRoleOldToNew(drawing_name);
+
+ /*
+ * Check Phase
+ */
+ string id = appid;
+ string role = c_role;
+ string area = "";//drawing_area;
+ Task task = Task::TASK_RELEASE;
+ unsigned req_num = 0;
+ WMError ret = WMError::UNKNOWN;
+
+ ret = this->setRequest(id, role, area, task, &req_num);
+
+ if (ret != WMError::SUCCESS)
+ {
+ HMI_ERROR(errorDescription(ret));
+ reply("Failed to set request");
+ return;
+ }
+
+ reply(nullptr);
+ if (req_num != g_app_list.currentRequestNumber())
+ {
+ // Add request, then invoked after the previous task is finished
+ HMI_SEQ_DEBUG(req_num, "request is accepted");
+ return;
+ }
+
+ /*
+ * Do allocate tasks
+ */
+ ret = this->checkPolicyForSlave(req_num);
+
+ if (ret != WMError::SUCCESS)
+ {
+ //this->emit_error()
+ HMI_SEQ_ERROR(req_num, errorDescription(ret));
+ g_app_list.removeRequest(req_num);
+ this->processNextRequest();
+ }
+}
+
+void WindowManager::api_deactivate_surface_to_master(char const *appid, char const *drawing_name,
+ const reply_func &reply)
+{
+ // TODO: application requests by old role,
+ // so convert role old to new
+ const char *c_role = this->convertRoleOldToNew(drawing_name);
+
+ /*
+ * Check Phase
+ */
+ string id = appid;
+ string role = c_role;
+ string area = "";//drawing_area;
+ Task task = Task::TASK_RELEASE;
+ unsigned req_num = 0;
+ WMError ret = WMError::UNKNOWN;
+
+ ret = this->setRequest(id, role, area, task, &req_num);
+
+ if (ret != WMError::SUCCESS)
+ {
+ HMI_ERROR(errorDescription(ret));
+ reply("Failed to set request");
+ return;
+ }
+
+ reply(nullptr);
+ if (req_num != g_app_list.currentRequestNumber())
+ {
+ // Add request, then invoked after the previous task is finished
+ HMI_SEQ_DEBUG(req_num, "request is accepted");
+ return;
+ }
+
+ /*
+ * Do allocate tasks
+ */
+ int i_ret = this->wmcon.sendRequest("deactivateWindow", appid,
+ drawing_name, "");
+ if (0 > i_ret)
+ {
+ //this->emit_error()
+ HMI_SEQ_ERROR(req_num, errorDescription(ret));
+ g_app_list.removeRequest(req_num);
+ this->processNextRequest();
+ }
+
+ this->setTimer();
+}
+
void WindowManager::api_enddraw(char const *appid, char const *drawing_name)
{
// TODO: application requests by old role,
@@ -418,6 +819,53 @@ int WindowManager::api_subscribe(afb_req req, int event_id)
return afb_req_subscribe(req, event);
}
+void WindowManager::api_enddraw_for_remote(char const *appid, char const *drawing_name)
+{
+ int ret = this->wmcon.sendRequest("endDraw", appid, drawing_name, "");
+ if (0 > ret)
+ {
+ //this->emit_error()
+
+ this->pmw.undoState();
+ this->lc->undoUpdate();
+
+ unsigned current_req = g_app_list.currentRequestNumber();
+ g_app_list.removeRequest(current_req);
+ this->processNextRequest();
+
+ return;
+ }
+
+ this->api_enddraw(appid, drawing_name);
+}
+
+bool WindowManager::api_client_set_render_order(char const* appid, const vector<string>& render_order)
+{
+ bool ret = false;
+ string id = appid;
+ auto client = g_app_list.lookUpClient(id);
+ if(client)
+ {
+ client->setRenderOrder(render_order);
+ }
+ return ret;
+}
+
+string WindowManager::api_client_attach_service_surface
+ (const char* appid, const char* dest, const char* service_surface)
+{
+ string uuid, s_dest = dest;
+ auto client = g_app_list.lookUpClient(s_dest);
+ if(!client)
+ {
+ HMI_ERROR("Failed to look up destination [%s]", dest);
+ return uuid;
+ }
+ uuid = client->attachTmpServiceSurface(appid, service_surface);
+ this->tmp_services.emplace_back(TmpService{appid, dest, service_surface, uuid});
+ return uuid;
+}
+
result<json_object *> WindowManager::api_get_display_info()
{
Screen screen = this->lc->getScreenInfo();
@@ -449,7 +897,7 @@ result<json_object *> WindowManager::api_get_area_info(char const *drawing_name)
}
// Set area rectangle
- struct rect area_info = this->area_info[*surface_id];
+ rect area_info = this->area_info[*surface_id];
json_object *object = json_object_new_object();
json_object_object_add(object, kKeyX, json_object_new_int(area_info.x));
json_object_object_add(object, kKeyY, json_object_new_int(area_info.y));
@@ -459,8 +907,61 @@ result<json_object *> WindowManager::api_get_area_info(char const *drawing_name)
return Ok<json_object *>(object);
}
+result<json_object *> WindowManager::api_get_car_info(char const *label)
+{
+ json_object *j_in = nullptr;
+ json_object *j_out = nullptr;
+
+ if (0 == strcmp("parking_brake_status", label))
+ {
+ // Get parking brake status
+ json_bool val = (this->crr_car_info.parking_brake_stt) ? TRUE : FALSE;
+ j_in = json_object_new_boolean(val);
+ }
+ else if (0 == strcmp("accelerator.pedal.position", label))
+ {
+ // Get accelerator pedal position
+ double val = this->crr_car_info.accel_pedal_pos;
+ j_in = json_object_new_double(val);
+ }
+ else if (0 == strcmp("car_state", label))
+ {
+ // Get running state
+ const char* val = (this->crr_car_info.running_stt) ? "run" : "stop";
+ j_in = json_object_new_string(val);
+ }
+ else if (0 == strcmp("lightstatus.brake", label)) {
+ // Get lightstatus brake status
+ json_bool val = (this->crr_car_info.lightstatus_brake_stt) ? TRUE : FALSE;
+ j_in = json_object_new_boolean(val);
+ }
+ else
+ {
+ return Err<json_object *>("Car info does not exist");
+ }
+
+ // Create output object
+ j_out = json_object_new_object();
+ json_object_object_add(j_out, "value", j_in);
+
+ return Ok<json_object *>(j_out);
+}
+
+void WindowManager::send_event(const string& evname)
+{
+ HMI_DEBUG("%s: %s", __func__, evname.c_str());
+
+ int ret = afb_event_push(this->map_afb_event[evname], nullptr);
+ if (ret != 0)
+ {
+ HMI_DEBUG("afb_event_push: %m");
+ }
+}
+
void WindowManager::send_event(const string& evname, const string& role)
{
+ HMI_DEBUG("%s: %s(%s)", __func__, evname.c_str(), role.c_str());
+
json_object *j = json_object_new_object();
json_object_object_add(j, kKeyDrawingName, json_object_new_string(role.c_str()));
@@ -474,6 +975,9 @@ void WindowManager::send_event(const string& evname, const string& role)
void WindowManager::send_event(const string& evname, const string& role, const string& area,
int x, int y, int w, int h)
{
+ HMI_DEBUG("%s: %s(%s, %s) x:%d y:%d w:%d h:%d",
+ __func__, evname.c_str(), role.c_str(), area.c_str(), x, y, w, h);
+
json_object *j_rect = json_object_new_object();
json_object_object_add(j_rect, kKeyX, json_object_new_int(x));
json_object_object_add(j_rect, kKeyY, json_object_new_int(y));
@@ -492,10 +996,77 @@ void WindowManager::send_event(const string& evname, const string& role, const s
}
}
+string WindowManager::searchApp(unsigned pid, unsigned ppid, unsigned surface, json_object* resp)
+{
+ // retrieve appid from pid from application manager
+ string appid;
+ // check appid then add it to the client
+ HMI_INFO("Runners:%s", json_object_get_string(resp));
+ int size = json_object_array_length(resp);
+ HMI_INFO("pid %d, ppid %d, surface %d",pid, ppid, surface);
+ for(int i = 0; i < size; i++)
+ {
+ json_object *j = json_object_array_get_idx(resp, i);
+ int runid = jh::getIntFromJson(j, "runid");
+ const char* id = jh::getStringFromJson(j, "id");
+ HMI_DEBUG("Appid %s, runid %d", id, runid);
+ if(id && (runid == ppid))
+ {
+ string s_id = id;
+ s_id.erase(s_id.find('@'));
+ appid = s_id;
+ HMI_INFO("App found %s", appid.c_str());
+ break;
+ }
+ }
+ if(appid.empty())
+ {
+ HMI_WARNING("Failed to retrieve id");
+ }
+ return appid;
+}
+
+void WindowManager::storeSurface(const string& appid, unsigned ppid, unsigned surface)
+{
+ auto elem = std::find_if(this->tmp_services.begin(), this->tmp_services.end(),
+ [&appid](TmpService& ts){
+ return (ts.dest == appid );
+ });
+
+ this->lc->setXDGSurfaceOriginSize(surface);
+ if(elem != this->tmp_services.end())
+ {
+ // attachApp
+ auto client = g_app_list.lookUpClient(elem->dest);
+ if(client == nullptr)
+ {
+ return;
+ }
+ HMI_INFO("Attach surface %d (service %s) to app %s", surface, elem->service.c_str(), elem->dest.c_str());
+ client->attachServiceSurface(elem->service, surface);
+ }
+ else
+ {
+ // setRole
+ auto client = g_app_list.lookUpClient(appid);
+ if(client != nullptr)
+ {
+ client->addSurface(surface);
+ this->id_alloc.register_name_id(client->role(), surface);
+ }
+ else
+ {
+ // Store tmp surface and appid for application
+ // who requests setRole after creating shell surface
+ this->tmp_surface2app.emplace(surface, TmpClient{appid, ppid});
+ }
+ }
+}
+
/**
* proxied events
*/
-void WindowManager::surface_created(unsigned surface_id)
+void WindowManager::surface_created(unsigned pid, unsigned surface_id)
{
// requestSurface
if(this->tmp_surface2app.count(surface_id) != 0)
@@ -513,6 +1084,52 @@ void WindowManager::surface_created(unsigned surface_id)
}
this->tmp_surface2app.erase(surface_id);
}
+ else
+ {
+ HMI_NOTICE("Unknown surface %d", surface_id);
+ // retrieve ppid
+ std::ostringstream os;
+ os << pid ;
+ string path = "/proc/" + os.str() + "/stat";
+ std::ifstream ifs(path.c_str());
+ string str;
+ unsigned ppid = 0;
+ if(!ifs.fail() && std::getline(ifs, str))
+ {
+ std::sscanf(str.data(), "%*d %*s %*c %d", &ppid);
+ HMI_INFO("Retrieve ppid %d", ppid);
+ }
+ else
+ {
+ HMI_ERROR("Failed to open /proc/%d/stat", pid);
+ HMI_ERROR("File system may be different");
+ return;
+ }
+ struct AfbClosure* c = new struct AfbClosure(pid, ppid, surface_id);
+ // search pid from surfaceID
+ afb_service_call("afm-main", "runners", json_object_new_object(),
+ [](void* closure, int stat, json_object* resp){
+ HMI_DEBUG("check %s", json_object_get_string(resp));
+ struct AfbClosure* c = static_cast<struct AfbClosure*>(closure);
+ HMI_DEBUG("check");
+ if(stat != 0)
+ {
+ HMI_ERROR("Failed to call runners");
+ }
+ else
+ {
+ json_object* j;
+ json_object_object_get_ex(resp, "response", &j);
+ string appid = g_context->searchApp(c->pid, c->ppid, c->surface, j);
+ if(!appid.empty())
+ {
+ g_context->storeSurface(appid, c->ppid, c->surface);
+ }
+ }
+ json_object_put(resp);
+ delete c;
+ }, c);
+ }
}
void WindowManager::surface_removed(unsigned surface_id)
@@ -539,6 +1156,25 @@ void WindowManager::exceptionProcessForTransition()
this->processNextRequest();
}
+void WindowManager::analyzeReceivedEvent(const char *event, struct json_object *object)
+{
+ HMI_DEBUG("event:%s", event);
+
+ // If receive low can signal
+ if (strstr(event, "low-can"))
+ {
+ // Analyze low can signal
+ const char *signal_name = this->lcc.analyzeCanSignal(object);
+
+ // Create task for car state and input it to PolicyManager
+ Task task = this->convertCanSignalToCarStateTask(signal_name);
+ if (Task::TASK_INVALID != task)
+ {
+ this->inputCarStateTask(task);
+ }
+ }
+}
+
void WindowManager::timerHandler()
{
unsigned req_num = g_app_list.currentRequestNumber();
@@ -550,8 +1186,10 @@ void WindowManager::timerHandler()
void WindowManager::startTransitionWrapper(vector<WMAction> &actions)
{
- WMError ret;
+ WMError ret = WMError::UNKNOWN;
+ // req_num is guaranteed by Window Manager
unsigned req_num = g_app_list.currentRequestNumber();
+ Task task = Task::TASK_INVALID;
if (actions.empty())
{
@@ -567,6 +1205,35 @@ void WindowManager::startTransitionWrapper(vector<WMAction> &actions)
}
}
+ // Check weather there is the no request task
+ // [The no request task]
+ // - TaskCarState::RESTRICTION_MODE_OFF
+ // - TaskCarState::RESTRICTION_MODE_ON
+ for (const auto &act : actions)
+ {
+ if (TaskCarState::RESTRICTION_MODE_OFF == act.car_state)
+ {
+ task = Task::TASK_RESTRICTION_MODE_OFF;
+ break;
+ }
+ else if (TaskCarState::RESTRICTION_MODE_ON == act.car_state)
+ {
+ task = Task::TASK_RESTRICTION_MODE_ON;
+ break;
+ }
+ }
+
+ // If there is the request-less task, set request here
+ if (Task::TASK_INVALID != task) {
+ unsigned req_num;
+ ret = this->setRequest(task, &req_num);
+
+ if(ret != WMError::SUCCESS)
+ {
+ goto error;
+ }
+ }
+
for (auto &act : actions)
{
if ("" != act.role)
@@ -575,19 +1242,21 @@ void WindowManager::startTransitionWrapper(vector<WMAction> &actions)
auto const &surface_id = this->id_alloc.lookup(act.role.c_str());
if(surface_id == nullopt)
{
- goto proc_remove_request;
+ HMI_SEQ_DEBUG(req_num, "There is not surface id for role:%s", act.role.c_str());
+ continue;
}
+
string appid = g_app_list.getAppID(*surface_id, &found);
if (!found)
{
if (TaskVisible::INVISIBLE == act.visible)
{
- // App is killed, so do not set this action
+ HMI_SEQ_DEBUG(req_num, "role:%s is killed, so do not set this action", act.role.c_str());
continue;
}
else
{
- HMI_SEQ_ERROR(req_num, "appid which is visible is not found");
+ HMI_SEQ_ERROR(req_num, "appid of role:%s which is visible is not found", act.role.c_str());
ret = WMError::FAIL;
goto error;
}
@@ -595,6 +1264,24 @@ void WindowManager::startTransitionWrapper(vector<WMAction> &actions)
auto client = g_app_list.lookUpClient(appid);
act.req_num = req_num;
act.client = client;
+
+ // If Window Manager is master and this action is for slave,
+ // change TaskVisible
+ if (this->wmcon.isMasterMode())
+ {
+ if (this->wmcon.isMasterArea(act.area.c_str()))
+ {
+ HMI_DEBUG("Set TaskVisible::REQ_REMOTE_VISIBLE");
+ act.visible = TaskVisible::REQ_REMOTE_VISIBLE;
+ }
+ // TODO: Check whether role is tbtnavi to request remote invisible
+ else if (("tbtnavi" == act.role) &&
+ (TaskVisible::INVISIBLE == act.visible))
+ {
+ HMI_DEBUG("Set TaskVisible::REQ_REMOTE_INVISIBLE");
+ act.visible = TaskVisible::REQ_REMOTE_INVISIBLE;
+ }
+ }
}
ret = g_app_list.setAction(req_num, act);
@@ -642,6 +1329,156 @@ void WindowManager::processError(WMError error)
this->processNextRequest();
}
+void WindowManager::processForRemoteRequest(json_object *data)
+{
+ const char *req = jh::getStringFromJson(data, "req");
+ const char *appid = jh::getStringFromJson(data, "appid");
+ const char *drawing_name = jh::getStringFromJson(data, "drawing_name");
+ const char *drawing_area = jh::getStringFromJson(data, "drawing_area");
+ string request = req;
+ string role = drawing_name;
+ string area = drawing_area;
+
+ if (!req || !drawing_name)
+ {
+ HMI_ERROR("Parse Error!!");
+ return;
+ }
+
+ if (this->wmcon.isMasterMode())
+ {
+ if (!appid)
+ {
+ HMI_ERROR("Parse Error!!");
+ return;
+ }
+
+ auto reply = [](const char *errmsg) {
+ if (errmsg != nullptr)
+ {
+ HMI_ERROR(errmsg);
+ return;
+ }
+ };
+
+ if ("activateWindow" == request)
+ {
+ if (!drawing_area)
+ {
+ HMI_ERROR("Parse Error!!");
+ return;
+ }
+
+ this->api_activate_surface_for_slave(
+ appid, drawing_name, drawing_area, reply);
+ }
+ else if ("deactivateWindow" == request)
+ {
+ this->api_deactivate_surface_for_slave(
+ appid, drawing_name, reply);
+ }
+ else if ("endDraw" == request)
+ {
+ this->api_enddraw(appid, drawing_name);
+ }
+ }
+ else
+ {
+ if ("syncDraw" == request)
+ {
+ this->stopTimer();
+
+ if (!appid || !drawing_area)
+ {
+ HMI_ERROR("Parse Error!!");
+ return;
+ }
+
+ unsigned req_num = g_app_list.currentRequestNumber();
+ auto client = g_app_list.lookUpClient(appid);
+
+ // TODO: application requests by old role,
+ // so convert role old to new
+ const char *c_role = this->convertRoleOldToNew(drawing_name);
+
+ // Create action
+ bool end_draw_finished = false;
+ WMAction act
+ {
+ req_num,
+ client,
+ string(c_role),
+ area,
+ TaskVisible::REMOTE_VISIBLE,
+ end_draw_finished,
+ TaskCarState::NO_TASK
+ };
+
+ // Set action
+ WMError ret = g_app_list.setAction(req_num, act);
+ if (ret != WMError::SUCCESS)
+ {
+ HMI_SEQ_ERROR(req_num, "Setting action is failed");
+ return;
+ }
+
+ this->emit_syncdraw(role, area);
+ this->wmcon.startSyncDrawForRemote(appid);
+ this->setTimer();
+ }
+ else if ("activated" == request)
+ {
+ this->emit_visible(role);
+ this->emit_activated(area);
+ }
+ else if ("deactivated" == request)
+ {
+ this->stopTimer();
+
+ if (!appid || !drawing_area)
+ {
+ HMI_ERROR("Parse Error!!");
+ return;
+ }
+
+ unsigned req_num = g_app_list.currentRequestNumber();
+ auto client = g_app_list.lookUpClient(appid);
+
+ // TODO: application requests by old role,
+ // so convert role old to new
+ const char *c_role = this->convertRoleOldToNew(drawing_name);
+
+ // Create action
+ bool end_draw_finished = true;
+ WMAction act
+ {
+ req_num,
+ client,
+ string(c_role),
+ "",
+ TaskVisible::REMOTE_INVISIBLE,
+ end_draw_finished,
+ TaskCarState::NO_TASK
+ };
+
+ this->lc->visibilityChange(act);
+ this->lc->renderLayers();
+ this->lc->renderLayersRemote();
+
+ this->emit_invisible(role);
+ this->emit_deactivated(role);
+ this->emitScreenUpdated(req_num);
+
+ g_app_list.removeRequest(req_num);
+ this->processNextRequest();
+ }
+ else if ("flushDraw" == request)
+ {
+ this->emit_flushdraw(role);
+ }
+ }
+}
+
/*
******* Private Functions *******
*/
@@ -685,6 +1522,54 @@ void WindowManager::emit_invisible(const string& role)
void WindowManager::emit_visible(const string& role) { return emit_visible(role, true); }
+void WindowManager::emitHeadlampOff()
+{
+ // Send HeadlampOff event for all application
+ this->send_event(kListEventName[Event_HeadlampOff]);
+}
+
+void WindowManager::emitHeadlampOn()
+{
+ // Send HeadlampOn event for all application
+ this->send_event(kListEventName[Event_HeadlampOn]);
+}
+
+void WindowManager::emitParkingBrakeOff()
+{
+ // Send ParkingBrakeOff event for all application
+ this->send_event(kListEventName[Event_ParkingBrakeOff]);
+}
+
+void WindowManager::emitParkingBrakeOn()
+{
+ // Send ParkingBrakeOn event for all application
+ this->send_event(kListEventName[Event_ParkingBrakeOn]);
+}
+
+void WindowManager::emitLightstatusBrakeOff()
+{
+ // Send LightstatusBrakeOff event for all application
+ this->send_event(kListEventName[Event_LightstatusBrakeOff]);
+}
+
+void WindowManager::emitLightstatusBrakeOn()
+{
+ // Send LightstatusBrakeOn event for all application
+ this->send_event(kListEventName[Event_LightstatusBrakeOn]);
+}
+
+void WindowManager::emitCarStop()
+{
+ // Send CarStop event for all application
+ this->send_event(kListEventName[Event_CarStop]);
+}
+
+void WindowManager::emitCarRun()
+{
+ // Send CarRun event for all application
+ this->send_event(kListEventName[Event_CarRun]);
+}
+
WMError WindowManager::setRequest(const string& appid, const string &role, const string &area,
Task task, unsigned* req_num)
{
@@ -717,6 +1602,48 @@ WMError WindowManager::setRequest(const string& appid, const string &role, const
return WMError::SUCCESS;
}
+WMError WindowManager::setRequest(Task task, unsigned* req_num)
+{
+ /*
+ * Queueing Phase
+ */
+ unsigned current = g_app_list.currentRequestNumber();
+
+ WMRequest req = WMRequest(task);
+ unsigned new_req = g_app_list.addRequest(req);
+ *req_num = new_req;
+ g_app_list.reqDump();
+
+ HMI_SEQ_DEBUG(current, "start sequence for task:%d", task);
+
+ return WMError::SUCCESS;
+}
+
+WMError WindowManager::setRequestForSlave(const string& appid, const string &role, const string &area,
+ Task task, unsigned* req_num)
+{
+ /*
+ * Queueing Phase
+ */
+ unsigned current = g_app_list.currentRequestNumber();
+ unsigned requested_num = g_app_list.getRequestNumber(appid);
+ if (requested_num != 0)
+ {
+ HMI_SEQ_INFO(requested_num,
+ "%s %s %s request is already queued", appid.c_str(), role.c_str(), area.c_str());
+ return REQ_REJECTED;
+ }
+
+ WMRequest req = WMRequest(appid, role, area, task);
+ unsigned new_req = g_app_list.addRequest(req);
+ *req_num = new_req;
+ g_app_list.reqDump();
+
+ HMI_SEQ_DEBUG(current, "%s start sequence with %s, %s", appid.c_str(), role.c_str(), area.c_str());
+
+ return WMError::SUCCESS;
+}
+
WMError WindowManager::checkPolicy(unsigned req_num)
{
/*
@@ -733,6 +1660,54 @@ WMError WindowManager::checkPolicy(unsigned req_num)
}
string req_area = trigger.area;
+ if (trigger.task == Task::TASK_ALLOCATE)
+ {
+ const char *msg = this->check_surface_exist(trigger.role.c_str());
+
+ if (msg)
+ {
+ HMI_SEQ_ERROR(req_num, msg);
+ return ret;
+ }
+ }
+
+ // Input event data to PolicyManager
+ if (0 > this->pmw.setInputEventData(trigger.task, trigger.role, trigger.area))
+ {
+ HMI_SEQ_ERROR(req_num, "Failed to set input event data to PolicyManager");
+ return ret;
+ }
+
+ // Execute state transition of PolicyManager
+ if (0 > this->pmw.executeStateTransition())
+ {
+ HMI_SEQ_ERROR(req_num, "Failed to execute state transition of PolicyManager");
+ return ret;
+ }
+
+ ret = WMError::SUCCESS;
+
+ g_app_list.reqDump();
+
+ return ret;
+}
+
+WMError WindowManager::checkPolicyForSlave(unsigned req_num)
+{
+ /*
+ * Check Policy
+ */
+ // get current trigger
+ bool found = false;
+ WMError ret = WMError::LAYOUT_CHANGE_FAIL;
+ auto trigger = g_app_list.getRequest(req_num, &found);
+ if (!found)
+ {
+ ret = WMError::NO_ENTRY;
+ return ret;
+ }
+ string req_area = trigger.area;
+
// Input event data to PolicyManager
if (0 > this->pmw.setInputEventData(trigger.task, trigger.role, trigger.area))
{
@@ -771,18 +1746,28 @@ WMError WindowManager::startTransition(unsigned req_num)
g_app_list.reqDump();
for (const auto &action : actions)
{
+ // TODO: application requests by old role,
+ // so convert role new to old for emitting event
+ string old_role = this->rolenew2old[action.role];
+
if (action.visible == TaskVisible::VISIBLE)
{
sync_draw_happen = true;
- // TODO: application requests by old role,
- // so convert role new to old for emitting event
- string old_role = this->rolenew2old[action.role];
-
this->emit_syncdraw(old_role, action.area);
/* TODO: emit event for app not subscriber
- if(g_app_list.contains(y.appid))
- g_app_list.lookUpClient(y.appid)->emit_syncdraw(y.role, y.area); */
+ if(g_app_list.contains(y.appid))
+ g_app_list.lookUpClient(y.appid)->emit_syncdraw(y.role, y.area); */
+ }
+ else if(action.visible == TaskVisible::REQ_REMOTE_VISIBLE)
+ {
+ // If this action is for slave, send to slave
+ this->wmcon.sendRequest("syncDraw", action.client->appID().c_str(),
+ old_role.c_str(), action.area.c_str());
+ }
+ else if (action.car_state != TaskCarState::NO_TASK)
+ {
+ this->transitionCarState(action.car_state);
}
}
@@ -798,23 +1783,92 @@ WMError WindowManager::startTransition(unsigned req_num)
{
this->lc->visibilityChange(x);
string old_role = this->rolenew2old[x.role];
- emit_deactivated(old_role.c_str());
- /* if (g_app_list.contains(x.client->appID()))
+
+ if (x.visible == TaskVisible::INVISIBLE)
+ {
+ emit_deactivated(old_role);
+ }
+ else if (x.visible == TaskVisible::REQ_REMOTE_INVISIBLE)
+ {
+ // If this action is for slave, send to slave
+ int i_ret = this->wmcon.sendRequest("deactivated", x.client->appID().c_str(),
+ old_role.c_str(), "");
+ if (0 > i_ret)
+ {
+ ret = WMError::FAIL;
+ }
+ }
+
+ /* if (g_app_list.contains(x.appid))
{
- auto client = g_app_list.lookUpClient(x.client->appID());
- this->deactivate(client->surfaceID(x.role));
+ auto client = g_app_list.lookUpClient(x.appid);
+ //this->deactivate(client->surfaceID(x.role));
} */
}
this->lc->renderLayers();
+ this->lc->renderLayersRemote();
ret = WMError::NO_LAYOUT_CHANGE;
}
return ret;
}
+void WindowManager::transitionCarState(TaskCarState task)
+{
+ if (TaskCarState::PARKING_BRAKE_OFF == task)
+ {
+ this->crr_car_info.parking_brake_stt = false;
+ this->emitParkingBrakeOff();
+ }
+ else if (TaskCarState::PARKING_BRAKE_ON == task)
+ {
+ this->crr_car_info.parking_brake_stt = true;
+ this->emitParkingBrakeOn();
+ }
+ else if (TaskCarState::ACCEL_PEDAL_OFF == task)
+ {
+ this->crr_car_info.accel_pedal_stt = false;
+ }
+ else if (TaskCarState::ACCEL_PEDAL_ON == task)
+ {
+ this->crr_car_info.accel_pedal_stt = true;
+ }
+ else if (TaskCarState::HEDLAMP_OFF == task)
+ {
+ this->crr_car_info.headlamp_stt = false;
+ this->emitHeadlampOff();
+ }
+ else if (TaskCarState::HEDLAMP_ON == task)
+ {
+ this->crr_car_info.headlamp_stt = true;
+ this->emitHeadlampOn();
+ }
+ else if (TaskCarState::LIGHTSTATUS_BRAKE_OFF == task)
+ {
+ this->crr_car_info.lightstatus_brake_stt = false;
+ this->emitLightstatusBrakeOff();
+ }
+ else if (TaskCarState::LIGHTSTATUS_BRAKE_ON == task)
+ {
+ this->crr_car_info.lightstatus_brake_stt = true;
+ this->emitLightstatusBrakeOn();
+ }
+ else if (TaskCarState::CAR_STOP == task)
+ {
+ this->crr_car_info.running_stt = false;
+ this->emitCarStop();
+ }
+ else if (TaskCarState::CAR_RUN == task)
+ {
+ this->crr_car_info.running_stt = true;
+ this->emitCarRun();
+ }
+}
+
WMError WindowManager::doEndDraw(unsigned req_num)
{
// get actions
bool found;
+ bool trigger_homescreen = false;
auto actions = g_app_list.getActions(req_num, &found);
WMError ret = WMError::SUCCESS;
if (!found)
@@ -822,6 +1876,13 @@ WMError WindowManager::doEndDraw(unsigned req_num)
ret = WMError::NO_ENTRY;
return ret;
}
+ auto trigger = g_app_list.getRequest(req_num, &found);
+ HMI_SEQ_INFO(req_num, "trigger.role = %s", trigger.role.c_str());
+
+ if(trigger.role == "homescreen")
+ {
+ trigger_homescreen = true;
+ }
HMI_SEQ_INFO(req_num, "do endDraw");
@@ -838,19 +1899,45 @@ WMError WindowManager::doEndDraw(unsigned req_num)
"Failed to manipulate surfaces while state change : %s", errorDescription(ret));
return ret;
}
- ret = this->lc->visibilityChange(act);
- // Emit active/deactive event
- string old_role = this->rolenew2old[act.role];
- if(act.visible == VISIBLE)
+ if(trigger_homescreen && (act.visible == TaskVisible::INVISIBLE))
{
- emit_visible(old_role.c_str());
- emit_activated(old_role.c_str());
+ HMI_SEQ_NOTICE(req_num, "don't change visible if homescreen role is trigger");
}
else
{
- emit_invisible(old_role.c_str());
- emit_deactivated(old_role.c_str());
+ ret = this->lc->visibilityChange(act);
+ }
+
+ // Emit active/deactive event
+ string old_role = this->rolenew2old[act.role];
+ switch(act.visible)
+ {
+ case TaskVisible::VISIBLE :
+ emit_visible(old_role);
+ emit_activated(old_role);
+ break;
+ case TaskVisible::REQ_REMOTE_VISIBLE :
+ {
+ // If this action is for slave, send to slave
+ int i_ret = this->wmcon.sendRequest("activated", "", old_role.c_str(), "");
+ if (0 > i_ret)
+ {
+ ret = WMError::FAIL;
+ }
+ break;
+ }
+ case TaskVisible::INVISIBLE :
+ if(!trigger_homescreen)
+ {
+ emit_invisible(old_role);
+ emit_deactivated(old_role);
+ }
+ break;
+ default :
+ // TaskVisible::REMOTE_VISIBLE, TaskVisible::REMOTE_INVISIBLE is this case
+ // If this action is for slave, send to slave
+ break;
}
if (ret != WMError::SUCCESS)
@@ -863,18 +1950,24 @@ WMError WindowManager::doEndDraw(unsigned req_num)
}
}
this->lc->renderLayers();
+ this->lc->renderLayersRemote();
HMI_SEQ_INFO(req_num, "emit flushDraw");
for(const auto &act_flush : actions)
{
+ // TODO: application requests by old role,
+ // so convert role new to old for emitting event
+ string old_role = this->rolenew2old[act_flush.role];
+
if(act_flush.visible == TaskVisible::VISIBLE)
{
- // TODO: application requests by old role,
- // so convert role new to old for emitting event
- string old_role = this->rolenew2old[act_flush.role];
-
- this->emit_flushdraw(old_role.c_str());
+ this->emit_flushdraw(old_role);
+ }
+ else if(act_flush.visible == TaskVisible::REQ_REMOTE_VISIBLE)
+ {
+ // If this action is for slave, send to slave
+ this->wmcon.sendRequest("flushDraw", "", old_role.c_str(), "");
}
}
@@ -888,13 +1981,15 @@ void WindowManager::emitScreenUpdated(unsigned req_num)
bool found = false;
auto actions = g_app_list.getActions(req_num, &found);
+ HMI_DEBUG("@@@@@");
// create json object
json_object *j = json_object_new_object();
json_object *jarray = json_object_new_array();
for(const auto& action: actions)
{
- if(action.visible != TaskVisible::INVISIBLE)
+ if((action.visible == TaskVisible::VISIBLE) ||
+ (action.visible == TaskVisible::REMOTE_VISIBLE))
{
json_object_array_add(jarray, json_object_new_string(action.client->appID().c_str()));
}
@@ -994,7 +2089,7 @@ const char* WindowManager::convertRoleOldToNew(char const *old_role)
return new_role;
}
-int WindowManager::loadOldRoleDb()
+int WindowManager::loadOldRolesConfigFile()
{
// Get afm application installed dir
char const *afm_app_install_dir = getenv("AFM_APP_INSTALL_DIR");
@@ -1007,16 +2102,16 @@ int WindowManager::loadOldRoleDb()
}
else
{
- file_name = string(afm_app_install_dir) + string("/etc/old_roles.json");
+ file_name = string(afm_app_install_dir) + string(kPathOldRolesConfigFile);
}
- // Load old_role.db
+ // Load old_rolea config file
json_object* json_obj;
int ret = jh::inputJsonFilie(file_name.c_str(), &json_obj);
if (0 > ret)
{
- HMI_ERROR("Could not open old_role.db, so use default old_role information");
- json_obj = json_tokener_parse(kDefaultOldRoleDb);
+ HMI_ERROR("Could not open %s, so use default old_roles information", kPathOldRolesConfigFile);
+ json_obj = json_tokener_parse(kDefaultOldRolesConfig);
}
HMI_DEBUG("json_obj dump:%s", json_object_get_string(json_obj));
@@ -1067,7 +2162,132 @@ int WindowManager::loadOldRoleDb()
return 0;
}
-const char* WindowManager::kDefaultOldRoleDb = "{ \
+Task WindowManager::convertCanSignalToCarStateTask(const char *signal_name)
+{
+ wm::LowCanClient *lcc = &(this->lcc);
+ Task task = Task::TASK_INVALID;
+
+ // If car info is updated, set car state change event
+ if (strstr(signal_name, lcc->kSignalName[lcc->SignalNoParkingBrake]))
+ {
+ HMI_DEBUG("Parking Brake state is changed");
+
+ if (lcc->getCurrentParkingBrakeState())
+ {
+ task = wm::Task::TASK_PARKING_BRAKE_ON;
+ }
+ else
+ {
+ task = wm::Task::TASK_PARKING_BRAKE_OFF;
+ }
+ }
+ else if (strstr(signal_name, lcc->kSignalName[lcc->SignalNoAccelPedalPos]))
+ {
+ // Update accel pedal position
+ this->crr_car_info.accel_pedal_pos = lcc->getCurrentAccelPedalPosition();
+
+ if (lcc->isChangedAccelPedalState())
+ {
+ HMI_DEBUG("Accelerator Pedal state is changed");
+
+ if (lcc->getCurrentAccelPedalState())
+ {
+ task = wm::Task::TASK_ACCEL_PEDAL_ON;
+ }
+ else
+ {
+ task = wm::Task::TASK_ACCEL_PEDAL_OFF;
+ }
+ }
+ }
+ else if (strstr(signal_name, lcc->kSignalName[lcc->SignalNoHeadlame]))
+ {
+ HMI_DEBUG("Headlamp state is changed");
+
+ if (lcc->getCurrentHeadlampState())
+ {
+ task = wm::Task::TASK_HEDLAMP_ON;
+ }
+ else
+ {
+ task = wm::Task::TASK_HEDLAMP_OFF;
+ }
+ }
+ else if (strstr(signal_name, lcc->kSignalName[lcc->SignalNoLightstatusBrake]))
+ {
+ HMI_DEBUG("Lightstatus Brake state is changed");
+
+ if (lcc->getCurrentLightstatusBrakeState())
+ {
+ task = wm::Task::TASK_LIGHTSTATUS_BRAKE_ON;
+ }
+ else
+ {
+ task = wm::Task::TASK_LIGHTSTATUS_BRAKE_OFF;
+ }
+ }
+ return task;
+}
+
+void WindowManager::inputCarStateTask(Task task)
+{
+ unsigned req_num = 0;
+ WMError ret = WMError::UNKNOWN;
+
+ ret = this->setRequest(task, &req_num);
+
+ if(ret != WMError::SUCCESS)
+ {
+ HMI_ERROR(errorDescription(ret));
+ return;
+ }
+
+ if (req_num != g_app_list.currentRequestNumber())
+ {
+ // Add request, then invoked after the previous task is finished
+ HMI_SEQ_DEBUG(req_num, "request is accepted");
+ return;
+ }
+
+ /*
+ * Do allocate tasks
+ */
+ ret = this->checkPolicy(req_num);
+
+ if (ret != WMError::SUCCESS)
+ {
+ //this->emit_error()
+ HMI_SEQ_ERROR(req_num, errorDescription(ret));
+ g_app_list.removeRequest(req_num);
+ this->processNextRequest();
+ }
+}
+
+const char *WindowManager::check_surface_exist(const char *drawing_name)
+{
+ auto const &surface_id = this->id_alloc.lookup(string(drawing_name));
+ if (!surface_id)
+ {
+ return "Surface does not exist";
+ }
+
+ /* if (!this->controller->surface_exists(*surface_id))
+ {
+ return "Surface does not exist in controller!";
+ } */
+
+ /* auto layer_id = this->layers.get_layer_id(*surface_id);
+
+ if (!layer_id)
+ {
+ return "Surface is not on any layer!";
+ } */
+
+ HMI_DEBUG("surface %d is detected", *surface_id);
+ return nullptr;
+}
+
+const char* WindowManager::kDefaultOldRolesConfig = "{ \
\"old_roles\": [ \
{ \
\"name\": \"HomeScreen\", \
diff --git a/src/window_manager.hpp b/src/window_manager.hpp
index 57b9fde..18182b2 100644
--- a/src/window_manager.hpp
+++ b/src/window_manager.hpp
@@ -27,6 +27,8 @@
#include "request.hpp"
#include "wm_error.hpp"
#include "wm_layer_control.hpp"
+#include "wm_connection.hpp"
+#include "low_can_client.hpp"
extern "C"
{
#include <afb/afb-binding.h>
@@ -131,9 +133,38 @@ struct id_allocator
struct TmpClient
{
std::string appid;
- unsigned layer;
+ unsigned pid;
};
+struct TmpService
+{
+ std::string appid; // Used to search who create service surface
+ std::string dest; // Used to attach service to destination application
+ std::string service;// The name of service surface
+ std::string uuid; // uuid
+ TmpService(const std::string& app, const std::string& dst,
+ const std::string& svc, const std::string& uuid)
+ : appid(app), dest(dst), service(svc), uuid(uuid) {}
+};
+
+struct CarInfo
+{
+ CarInfo()
+ : parking_brake_stt(true),
+ accel_pedal_stt(false),
+ accel_pedal_pos(0.0),
+ running_stt(false),
+ headlamp_stt(false),
+ lightstatus_brake_stt(true)
+ {};
+
+ bool parking_brake_stt;
+ bool accel_pedal_stt;
+ double accel_pedal_pos;
+ bool running_stt;
+ bool headlamp_stt;
+ bool lightstatus_brake_stt;
+};
class WindowManager
{
@@ -156,6 +187,18 @@ class WindowManager
Event_ScreenUpdated,
+ Event_HeadlampOff,
+ Event_HeadlampOn,
+
+ Event_ParkingBrakeOff,
+ Event_ParkingBrakeOn,
+
+ Event_LightstatusBrakeOff,
+ Event_LightstatusBrakeOn,
+
+ Event_CarStop,
+ Event_CarRun,
+
Event_Error,
Event_Val_Max = Event_Error,
@@ -173,27 +216,48 @@ class WindowManager
result<int> api_request_surface(char const *appid, char const *role);
char const *api_request_surface(char const *appid, char const *role, char const *ivi_id);
+ bool api_set_role(char const *appid, char const *role);
void api_activate_window(char const *appid, char const *role, char const *drawing_area, const reply_func &reply);
+ void api_activate_surface_for_slave(char const *appid, char const *drawing_name,
+ char const *drawing_area, const reply_func &reply);
+ void api_activate_surface_to_master(char const *appid, char const *drawing_name,
+ char const *drawing_area, const reply_func &reply);
void api_deactivate_window(char const *appid, char const *role, const reply_func &reply);
+ void api_deactivate_surface_for_slave(char const *appid, char const *drawing_name,
+ const reply_func &reply);
+ void api_deactivate_surface_to_master(char const *appid, char const *drawing_name,
+ const reply_func &reply);
void api_enddraw(char const *appid, char const *role);
int api_subscribe(afb_req req, int event_id);
+ void api_enddraw_for_remote(char const *appid, char const *drawing_name);
+ bool api_client_set_render_order(const char *appid, const std::vector<std::string> &render_order);
+ std::string api_client_attach_service_surface(const char* appid, const char* dest, const char* service_surface);
result<json_object *> api_get_display_info();
result<json_object *> api_get_area_info(char const *role);
+ result<json_object *> api_get_car_info(char const *label);
+ void send_event(const std::string& evname);
void send_event(const std::string& evname, const std::string& role);
void send_event(const std::string& evname, const std::string& role, const std::string& area, int x, int y, int w, int h);
// Events from the compositor we are interested in
- void surface_created(unsigned surface_id);
+ void surface_created(unsigned pid, unsigned surface_id);
void surface_removed(unsigned surface_id);
void removeClient(const std::string &appid);
void exceptionProcessForTransition();
const char* convertRoleOldToNew(char const *role);
+ void analyzeReceivedEvent(const char *event, struct json_object *object);
+
// Do not use this function
void timerHandler();
void startTransitionWrapper(std::vector<WMAction> &actions);
void processError(WMError error);
+ void processForRemoteRequest(json_object *data);
+ std::string searchApp(unsigned pid, unsigned ppid, unsigned surface, json_object* resp);
+ void storeSurface(const std::string& appid, unsigned ppid, unsigned surface);
+
+ WMConnection wmcon;
private:
// WM Events to clients
@@ -205,11 +269,24 @@ class WindowManager
void emit_visible(const std::string& role, bool is_visible);
void emit_invisible(const std::string& role);
void emit_visible(const std::string& role);
+ void emitHeadlampOff();
+ void emitHeadlampOn();
+ void emitParkingBrakeOff();
+ void emitParkingBrakeOn();
+ void emitLightstatusBrakeOff();
+ void emitLightstatusBrakeOn();
+ void emitCarStop();
+ void emitCarRun();
WMError setRequest(const std::string &appid, const std::string &role, const std::string &area,
Task task, unsigned *req_num);
+ WMError setRequest(Task task, unsigned* req_num);
+ WMError setRequestForSlave(const std::string& appid, const std::string &role,
+ const std::string &area, Task task, unsigned* req_num);
WMError checkPolicy(unsigned req_num);
+ WMError checkPolicyForSlave(unsigned req_num);
WMError startTransition(unsigned req_num);
+ void transitionCarState(TaskCarState task);
WMError doEndDraw(unsigned req_num);
void emitScreenUpdated(unsigned req_num);
@@ -218,21 +295,30 @@ class WindowManager
void stopTimer();
void processNextRequest();
- int loadOldRoleDb();
+ int loadOldRolesConfigFile();
+
+ Task convertCanSignalToCarStateTask(const char *signal_name);
+ void inputCarStateTask(Task task);
+
+ const char *check_surface_exist(const char *role);
private:
std::map<std::string, struct afb_event> map_afb_event;
- std::unordered_map<std::string, struct rect> area2size;
std::unordered_map<std::string, std::string> roleold2new;
std::unordered_map<std::string, std::string> rolenew2old;
std::shared_ptr<LayerControl> lc;
+
+ LowCanClient lcc;
+ CarInfo crr_car_info;
+
PMWrapper pmw;
rect_map area_info;
struct id_allocator id_alloc;
// ID allocation and proxy methods for lookup
std::unordered_map<unsigned, struct TmpClient> tmp_surface2app;
- static const char* kDefaultOldRoleDb;
+ std::vector<struct TmpService> tmp_services;
+ static const char* kDefaultOldRolesConfig;
};
} // namespace wm
diff --git a/src/wm_client.cpp b/src/wm_client.cpp
index 7a93c7c..f2ad7be 100644
--- a/src/wm_client.cpp
+++ b/src/wm_client.cpp
@@ -18,6 +18,8 @@
#include "wm_client.hpp"
#include "util.hpp"
#include <ilm/ilm_control.h>
+#include <uuid/uuid.h>
+
#define INVALID_SURFACE_ID 0
@@ -50,7 +52,7 @@ WMClient::WMClient(const string &appid, unsigned layer, unsigned surface, const
#else
afb_event ev = afb_daemon_make_event(x.c_str());
#endif
- evname2list[x] = ev;
+ evname2afb_event[x] = ev;
}
}
@@ -58,7 +60,7 @@ WMClient::WMClient(const string &appid, const string &role)
: id(appid),
layer(0),
role2surface(0),
- evname2list(0)
+ evname2afb_event(0)
{
role2surface[role] = INVALID_SURFACE_ID;
for (auto x : kWMEvents)
@@ -68,7 +70,7 @@ WMClient::WMClient(const string &appid, const string &role)
#else
afb_event ev = afb_daemon_make_event(x.c_str());
#endif
- evname2list[x] = ev;
+ evname2afb_event[x] = ev;
}
}
@@ -77,7 +79,7 @@ WMClient::WMClient(const string &appid, unsigned layer, const string &role)
layer(layer),
main_role(role),
role2surface(0),
- evname2list(0)
+ evname2afb_event(0)
{
role2surface[role] = INVALID_SURFACE_ID;
for (auto x : kWMEvents)
@@ -87,7 +89,7 @@ WMClient::WMClient(const string &appid, unsigned layer, const string &role)
#else
afb_event ev = afb_daemon_make_event(x.c_str());
#endif
- evname2list[x] = ev;
+ evname2afb_event[x] = ev;
}
}
@@ -139,9 +141,90 @@ bool WMClient::removeSurfaceIfExist(unsigned surface)
this->surface = INVALID_SURFACE_ID;
ret = true;
}
+ else
+ {
+ for(auto &x : this->service2surfaces)
+ {
+ if(x.second = surface)
+ {
+ ret = true;
+ string key = x.first;
+ this->service2surfaces.erase(key);
+ this->service2supplier.erase(key);
+ }
+ }
+ }
return ret;
}
+WMError WMClient::setRenderOrder(const vector<string> &order)
+{
+ WMError ret = WMError::SUCCESS;
+ this->surface_render_order.clear();
+ for(const auto& x : order)
+ {
+ unsigned s; // surface
+ if(x == this->role())
+ {
+ s = this->surfaceID();
+ }
+ else if(this->service2surfaces.count(x) != 0)
+ {
+ s = this->service2surfaces[x];
+ }
+ else
+ {
+ ret = WMError::NOT_REGISTERED;
+ break;
+ }
+ this->surface_render_order.push_back(s);
+ }
+ if(ret == WMError::SUCCESS)
+ {
+ int count = 0;
+ t_ilm_layer* id_array = new t_ilm_surface[this->surface_render_order.size()];
+ if(id_array == nullptr)
+ {
+ HMI_WARNING("short memory");
+ ret = WMError::FAIL;
+ }
+ else
+ {
+ for(const auto& i : this->surface_render_order)
+ {
+ id_array[count] = i;
+ ++count;
+ }
+ ilm_layerSetRenderOrder(this->layerID(),
+ id_array, this->surface_render_order.size());
+ delete id_array;
+ }
+ }
+ return ret;
+}
+
+string WMClient::attachTmpServiceSurface(const string& supplier, const string& service_surface)
+{
+ string uuid;
+ uuid_t u;
+ char out[37]; // uuid is 36 characters
+ uuid_generate_random(u);
+ uuid_unparse(u, out);
+ uuid = out;
+ this->service2supplier.emplace(service_surface, supplier);
+ return uuid;
+}
+
+WMError WMClient::attachServiceSurface(const string& service_surface, unsigned surface)
+{
+ WMError ret = WMError::NOT_REGISTERED;
+ if(this->service2supplier.count(service_surface) != 0)
+ {
+ this->service2surfaces.emplace(service_surface, surface);
+ ret = WMError::SUCCESS;
+ }
+ return ret;
+}
#if GTEST_ENABLED
bool WMClient::subscribe(afb_req req, const string &evname)
@@ -150,7 +233,7 @@ bool WMClient::subscribe(afb_req req, const string &evname)
HMI_DEBUG("error is only enabeled for now");
return false;
}
- int ret = afb_req_subscribe(req, this->evname2list[evname]);
+ int ret = afb_req_subscribe(req, this->evname2afb_event[evname]);
if (ret)
{
HMI_DEBUG("Failed to subscribe %s", evname.c_str());
@@ -161,7 +244,7 @@ bool WMClient::subscribe(afb_req req, const string &evname)
void WMClient::emitError(WM_CLIENT_ERROR_EVENT ev)
{
- if (!afb_event_is_valid(this->evname2list[kKeyError])){
+ if (!afb_event_is_valid(this->evname2afb_event[kKeyError])){
HMI_ERROR("event err is not valid");
return;
}
@@ -170,7 +253,7 @@ void WMClient::emitError(WM_CLIENT_ERROR_EVENT ev)
json_object_object_add(j, kKeyErrorDesc, json_object_new_string(kErrorDescription[ev].c_str()));
HMI_DEBUG("error: %d, description:%s", ev, kErrorDescription[ev].c_str());
- int ret = afb_event_push(this->evname2list[kKeyError], j);
+ int ret = afb_event_push(this->evname2afb_event[kKeyError], j);
if (ret != 0)
{
HMI_DEBUG("afb_event_push failed: %m");
@@ -182,10 +265,7 @@ void WMClient::dumpInfo()
{
DUMP("APPID : %s", id.c_str());
DUMP(" LAYER : %d", layer);
- for (const auto &x : this->role2surface)
- {
- DUMP(" ROLE : %s , SURFACE : %d", x.first.c_str(), x.second);
- }
+ DUMP(" ROLE : %s , SURFACE : %d", main_role.c_str(), surface);
}
} // namespace wm \ No newline at end of file
diff --git a/src/wm_client.hpp b/src/wm_client.hpp
index 7e92ed5..fc171f4 100644
--- a/src/wm_client.hpp
+++ b/src/wm_client.hpp
@@ -52,8 +52,15 @@ class WMClient
std::string role() const;
unsigned layerID() const;
unsigned surfaceID() const;
+ // void setRole(const std::string& role);
+ // void appendRole(const std::string& role);
WMError addSurface(unsigned surface);
bool removeSurfaceIfExist(unsigned surface);
+ // bool removeRole(const std::string& role);
+ std::vector<unsigned> renderOrder() const;
+ WMError setRenderOrder(const std::vector<std::string>& order);
+ std::string attachTmpServiceSurface(const std::string& from, const std::string& service_surface);
+ WMError attachServiceSurface(const std::string& service_surface, unsigned surface);
#if GTEST_ENABLED
bool subscribe(afb_req req, const std::string &event_name);
@@ -69,12 +76,15 @@ class WMClient
std::string area;
unsigned surface; // currently, main application has only one surface.
//std::vector<std::string> role_list;
+ std::vector<unsigned> surface_render_order;
+ std::unordered_map<std::string, unsigned> service2surfaces;
std::unordered_map<std::string, unsigned> role2surface;
+ std::unordered_map<std::string, std::string> service2supplier;
#if GTEST_ENABLED
// This is for unit test. afb_make_event occurs sig11 if call not in afb-binding
- std::unordered_map<std::string, std::string> event2list;
+ std::unordered_map<std::string, std::string> evname2afb_event;
#else
- std::unordered_map<std::string, struct afb_event> evname2list;
+ std::unordered_map<std::string, struct afb_event> evname2afb_event;
#endif
};
} // namespace wm
diff --git a/src/wm_connection.cpp b/src/wm_connection.cpp
new file mode 100644
index 0000000..10ecc3b
--- /dev/null
+++ b/src/wm_connection.cpp
@@ -0,0 +1,457 @@
+/*
+ * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "wm_connection.hpp"
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "json_helper.hpp"
+#include "util.hpp"
+
+extern "C"
+{
+#include <afb/afb-binding.h>
+#include <systemd/sd-event.h>
+}
+
+
+/**
+ * namespace wm
+ */
+namespace wm
+{
+
+
+namespace
+{
+
+static const char kPathConnectionConfigFile[] = "/etc/connection.json";
+static const char kDefaultIpAddr[] = "192.168.10.10";
+static const int kDefaultPort = 4000;
+
+static int onIoEventReceive(sd_event_source *src, int fd, uint32_t revents, void * data)
+{
+ WMConnection *p_wmcon = (WMConnection*)data;
+
+ json_object *j_out;
+ int ret = p_wmcon->receive(&j_out);
+ if (0 > ret)
+ {
+ return 0;
+ }
+
+ const char* rq = jh::getStringFromJson(j_out, "req");
+ const char* id = jh::getStringFromJson(j_out, "appid");
+ const char* dn = jh::getStringFromJson(j_out, "drawing_name");
+ const char* da = jh::getStringFromJson(j_out, "drawing_area");
+
+ HMI_DEBUG("req:%s appid:%s, drawing_name:%s, drawing_area:%s", rq, id, dn, da);
+
+ // Callback
+ p_wmcon->callOnReceivedHandler(j_out);
+
+ return 0;
+}
+
+static int onIoEventAccept(sd_event_source *src, int fd, uint32_t revents, void * data)
+{
+ struct sockaddr_in addr;
+
+ WMConnection *p_wmcon = (WMConnection*)data;
+
+ // Accept connection
+ socklen_t len = sizeof(addr);
+ int my_socket = p_wmcon->getMySocket();
+ int connected_socket = accept(my_socket, (struct sockaddr *)&addr, &len);
+ if (0 > connected_socket)
+ {
+ HMI_ERROR("Failed to accept connection (%s)", strerror(errno));
+ return -1;
+ }
+
+ // Store connected socket
+ p_wmcon->setConnectedSocket(connected_socket);
+
+ // Register callback to receive
+ int ret = sd_event_add_io(afb_daemon_get_event_loop(), nullptr,
+ connected_socket, EPOLLIN,
+ onIoEventReceive, p_wmcon);
+ if (0 > ret)
+ {
+ HMI_ERROR("Failed to add I/O event receive(%s)", strerror(-ret));
+ return -1;
+ }
+
+ return 0;
+}
+
+} // namespace
+
+WMConnection::WMConnection()
+{
+ // Load connection config file
+ this->loadConnectionConfigFile();
+
+ // TODO: ECU name should be decide by config file
+ this->ecu_name = this->mode;
+}
+
+int WMConnection::initialize()
+{
+ int ret;
+
+ // Initialize for Master/Slave
+ if (this->isMasterMode())
+ {
+ ret = this->initializeMaster();
+ }
+ else
+ {
+ ret = this->initializeSlave();
+ }
+
+ return ret;
+}
+
+void WMConnection::registerCallback(ReceivedHandler on_received)
+{
+ this->onReceived = on_received;
+}
+
+int WMConnection::sendRequest(char const *req, char const *appid,
+ char const *drawing_name, char const *drawing_area)
+{
+ int ret;
+ json_object *j_obj = json_object_new_object();
+ json_object_object_add(j_obj, "req", json_object_new_string(req));
+ json_object_object_add(j_obj, "appid", json_object_new_string(appid));
+ json_object_object_add(j_obj, "drawing_name", json_object_new_string(drawing_name));
+ json_object_object_add(j_obj, "drawing_area", json_object_new_string(drawing_area));
+
+ ret = this->send(j_obj);
+
+ json_object_put(j_obj);
+
+ return ret;
+}
+
+int WMConnection::send(struct json_object* j_in)
+{
+ // Convert json_object to string to send
+ const char *buf = json_object_to_json_string(j_in);
+ if (nullptr == buf)
+ {
+ HMI_ERROR("Failed to convert json_object to string");
+ return -1;
+ }
+
+ int len = strlen(buf);
+
+ HMI_DEBUG("Send data(len:%d): %s", len, buf);
+
+ int n = write(this->connected_socket, buf, len);
+ if(0 > n)
+ {
+ HMI_ERROR("Failed to send data (%s)", strerror(errno));
+ return -1;
+ }
+
+ return 0;
+}
+
+bool WMConnection::isMasterMode()
+{
+ if ("master" == this->mode)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool WMConnection::isMasterArea(const char* area)
+{
+ if (nullptr == area)
+ {
+ return false;
+ }
+
+ std::string str_area = std::string(area);
+ if ("" == str_area)
+ {
+ return false;
+ }
+
+ std::vector<std::string> elements;
+ elements = parseString(str_area, '.');
+
+ if ("master" == elements[0])
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool WMConnection::isConnecting()
+{
+ return (0 > this->connected_socket) ? false : true;
+}
+
+std::string WMConnection::parseMasterArea(const char* area)
+{
+ std::string ret_area = "";
+ std::vector<std::string> elements;
+ elements = parseString(std::string(area), '.');
+
+ if ("master" != elements[0])
+ {
+ return std::string(area);
+ }
+
+ for (auto itr = (elements.begin() + 1); itr != elements.end(); ++itr)
+ {
+ ret_area += *itr;
+
+ if ((elements.end() - 1) != itr)
+ {
+ ret_area += ".";
+ }
+ }
+ return ret_area;
+}
+
+bool WMConnection::isSyncDrawingForRemote(const char* appid)
+{
+ if (std::string(appid) == this->syndDrawingAppId)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void WMConnection::startSyncDrawForRemote(const char* appid)
+{
+ this->syndDrawingAppId = std::string(appid);
+}
+
+void WMConnection::finishSyncDrawForRemote(const char* appid)
+{
+ if (std::string(appid) == this->syndDrawingAppId)
+ {
+ this->syndDrawingAppId = "";
+ }
+}
+
+int WMConnection::getMySocket()
+{
+ return this->my_socket;
+}
+
+int WMConnection::getConnectedSocket()
+{
+ return this->connected_socket;
+}
+
+void WMConnection::setConnectedSocket(int connected_socket)
+{
+ this->connected_socket = connected_socket;
+}
+
+std::string WMConnection::getEcuName()
+{
+ return this->ecu_name;
+}
+
+void WMConnection::callOnReceivedHandler(json_object *j_out)
+{
+ this->onReceived(j_out);
+}
+
+int WMConnection::initializeMaster()
+{
+ int ret = 0;
+ struct sockaddr_in addr;
+
+ // Create socket
+ this->my_socket = socket(AF_INET, SOCK_STREAM, 0);
+ if (0 > this->my_socket)
+ {
+ HMI_ERROR("Failed to create socket (%s)", strerror(errno));
+ return -1;
+ }
+
+ // Bind socket
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(this->port);
+ addr.sin_addr.s_addr = htonl(INADDR_ANY);
+
+ ret = bind(this->my_socket, (struct sockaddr *)&addr, sizeof(addr));
+ if (0 > ret)
+ {
+ HMI_ERROR("Failed to bind socket (%s)", strerror(errno));
+ return -1;
+ }
+
+ // Listen connection
+ ret = listen(this->my_socket, 1);
+ if (0 > ret)
+ {
+ HMI_ERROR("Failed to listen connection (%s)", strerror(errno));
+ return -1;
+ }
+
+ // Register callback to accept connection
+ ret = sd_event_add_io(afb_daemon_get_event_loop(), nullptr,
+ this->my_socket, EPOLLIN,
+ onIoEventAccept, this);
+ if (0 > ret)
+ {
+ HMI_ERROR("Failed to add I/O event accept(%s)", strerror(-ret));
+ return -1;
+ }
+
+ return ret;
+}
+
+int WMConnection::initializeSlave()
+{
+ // Create socket
+ this->my_socket = socket(AF_INET, SOCK_STREAM, 0);
+ if (0 > this->my_socket)
+ {
+ HMI_ERROR("Failed to create socket (%s)", strerror(errno));
+ return -1;
+ }
+
+ return 0;
+}
+
+int WMConnection::connectToMaster()
+{
+ int ret = 0;
+ struct sockaddr_in addr;
+
+ // Connect to master
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(this->port);
+ addr.sin_addr.s_addr = inet_addr(this->ip.c_str());
+
+ ret = connect(this->my_socket, (struct sockaddr *)&addr, sizeof(addr));
+ if (0 > ret)
+ {
+ HMI_ERROR("Failed to connect to master (%s)", strerror(errno));
+ return ret;
+ }
+
+ HMI_DEBUG("Connected to master");
+
+ // Store connected socket
+ this->connected_socket = this->my_socket;
+
+ // Register callback to receive
+ ret = sd_event_add_io(afb_daemon_get_event_loop(), nullptr,
+ this->connected_socket, EPOLLIN,
+ onIoEventReceive, this);
+ if (0 > ret)
+ {
+ HMI_ERROR("Failed to add I/O event receive(%s)", strerror(-ret));
+ return -1;
+ }
+
+ return ret;
+}
+
+int WMConnection::receive(struct json_object** j_out)
+{
+ char buf[1024];
+ int n;
+
+ n = read(this->connected_socket, buf, sizeof(buf));
+ if(0 > n)
+ {
+ HMI_ERROR("Failed to receive data (%s)", strerror(errno));
+ return -1;
+ }
+
+ HMI_DEBUG("Received data length: %d", n);
+ HMI_DEBUG("Received data: %s", buf);
+
+ // Parse received data
+ struct json_tokener *tokener = json_tokener_new();
+ *j_out = json_tokener_parse_ex(tokener, buf, n);
+ if (nullptr == *j_out)
+ {
+ HMI_DEBUG("Failed to parse received data");
+ return -1;
+ }
+
+ return 0;
+}
+
+int WMConnection::loadConnectionConfigFile()
+{
+ // Get afm application installed dir
+ char const *afm_app_install_dir = getenv("AFM_APP_INSTALL_DIR");
+ if (!afm_app_install_dir)
+ {
+ HMI_ERROR("AFM_APP_INSTALL_DIR is not defined");
+ }
+ std::string path = std::string(afm_app_install_dir) + std::string(kPathConnectionConfigFile);
+
+ // Load connection config file
+ json_object* json_obj;
+ int ret = jh::inputJsonFilie(path.c_str(), &json_obj);
+ if (0 > ret)
+ {
+ HMI_ERROR("Could not open %s, so use default mode \"slave\"", kPathConnectionConfigFile);
+ this->mode = "slave";
+ this->ip = kDefaultIpAddr;
+ this->port = kDefaultPort;
+ return 0;
+ }
+ HMI_DEBUG("json_obj dump:%s", json_object_get_string(json_obj));
+
+ const char* mode = jh::getStringFromJson(json_obj, "mode");
+ this->mode = (nullptr != mode) ? mode : "slave";
+
+ const char* ip = jh::getStringFromJson(json_obj, "master_ip");
+ this->ip = (nullptr != ip) ? ip : kDefaultIpAddr;
+
+ int port = jh::getIntFromJson(json_obj, "master_port");
+ this->port = (0 != port) ? port : kDefaultPort;
+
+ // Check
+ HMI_DEBUG("mode:%s master_ip:%s master_port:%d", mode, ip, port);
+
+ // Release json_object
+ json_object_put(json_obj);
+
+ return 0;
+}
+
+
+} // namespace wm
diff --git a/src/wm_connection.hpp b/src/wm_connection.hpp
new file mode 100644
index 0000000..9d3180f
--- /dev/null
+++ b/src/wm_connection.hpp
@@ -0,0 +1,64 @@
+/*
+ * Insert Copyright if needed.
+ */
+
+#ifndef WM_CONNECTION_HPP
+#define WM_CONNECTION_HPP
+
+#include <functional>
+
+struct json_object;
+
+namespace wm
+{
+
+class WMConnection
+{
+ public:
+ WMConnection();
+ ~WMConnection() = default;
+
+ using ReceivedHandler = std::function<void(json_object* j_out)>;
+
+ int initialize();
+ void registerCallback(ReceivedHandler on_received);
+ int sendRequest(char const *req, char const *appid,
+ char const *drawing_name, char const *drawing_area);
+ bool isMasterMode();
+ bool isMasterArea(const char* area);
+ bool isConnecting();
+ std::string parseMasterArea(const char* area);
+ bool isSyncDrawingForRemote(const char* role);
+ void startSyncDrawForRemote(const char* role);
+ void finishSyncDrawForRemote(const char* role);
+ int getMySocket();
+ int getConnectedSocket();
+ void setConnectedSocket(int connected_socket);
+ std::string getEcuName();
+ void callOnReceivedHandler(json_object *j_out);
+ int connectToMaster();
+
+ int receive(json_object** j_out);
+
+ private:
+ std::string mode;
+ std::string ip;
+ int port;
+ int my_socket = -1;
+ int connected_socket = -1;
+ ReceivedHandler onReceived;
+ std::string syndDrawingAppId;
+
+ std::string ecu_name;
+
+ int initializeMaster();
+ int initializeSlave();
+ int loadConnectionConfigFile();
+
+ int send(json_object* j_in);
+};
+
+} // namespace wm
+
+#endif // WM_CONNECTION_HPP
+
diff --git a/src/wm_layer.cpp b/src/wm_layer.cpp
index 294e356..2e30069 100644
--- a/src/wm_layer.cpp
+++ b/src/wm_layer.cpp
@@ -36,6 +36,26 @@ LayerState::LayerState()
area2appid()
{}
+
+void LayerState::attachIdToArea(const string& area, const WMClient& client)
+{
+ this->area2appid[area] = client.appID();
+ this->render_order.push_back(client.layerID());
+}
+
+const unordered_map<string, string> LayerState::popCurrentState()
+{
+ unordered_map<string, string> tmp = this->area2appid;
+ this->area2appid.clear();
+ this->render_order.clear();
+ return tmp;
+}
+
+const unordered_map<string, string> LayerState::getCurrentState()
+{
+ return this->area2appid;
+}
+
const vector<unsigned> LayerState::getIviIdList()
{
return this->render_order;
@@ -240,4 +260,9 @@ void WMLayer::dump()
}
+/* void WMLayer::undo()
+{
+ this->tmp_state = this->state;
+}
+ */
} // namespace wm
diff --git a/src/wm_layer.hpp b/src/wm_layer.hpp
index 83a5e74..70826d4 100644
--- a/src/wm_layer.hpp
+++ b/src/wm_layer.hpp
@@ -34,6 +34,9 @@ class LayerState
public:
LayerState();
~LayerState() = default;
+ void attachIdToArea(const std::string& area, const WMClient&);
+ const std::unordered_map<std::string, std::string> popCurrentState();
+ const std::unordered_map<std::string, std::string> getCurrentState();
const std::vector<unsigned> getIviIdList();
void addLayer(unsigned layer);
void removeLayer(unsigned layer);
diff --git a/src/wm_layer_control.cpp b/src/wm_layer_control.cpp
index 011402d..75c35da 100644
--- a/src/wm_layer_control.cpp
+++ b/src/wm_layer_control.cpp
@@ -56,7 +56,7 @@ static void layerCallback_static(t_ilm_layer layer,
g_lc_ctxt->dispatchLayerPropChangeEvent(layer, layer_prop, mask);
}
-LayerControl::LayerControl(const std::string& root)
+LayerControl::LayerControl(const std::string& root, const std::string& ecu_name)
{
string area_path = root + LC_AREA_PATH;
string layer_path= root + LC_LAYER_SETTING_PATH;
@@ -64,7 +64,7 @@ LayerControl::LayerControl(const std::string& root)
WMError ret = this->loadLayerSetting(layer_path);
assert(ret == WMError::SUCCESS);
// load areas.json
- ret = this->loadAreaDb(area_path);
+ ret = this->loadAreasConfigFile(area_path, ecu_name);
assert(ret == WMError::SUCCESS);
}
@@ -102,6 +102,18 @@ WMError LayerControl::init(const LayerControlCallbacks& cb)
// Currently, 0 is only available
this->screenID = ids[0];
+ if (1 < num)
+ {
+ // TODO: set remote screen id
+ HMI_INFO("There is remote screen (id:%d)", ids[1]);
+ this->remoteScreenID = ids[1];
+ }
+ else
+ {
+ HMI_INFO("There is no remote screen");
+ this->remoteScreenID = -1;
+ }
+
rc = ilm_getPropertiesOfScreen(this->screenID, &this->screen_prop);
if(rc != ILM_SUCCESS) goto lc_init_error;
@@ -131,9 +143,26 @@ void LayerControl::createNewLayer(unsigned id)
auto wm_layer = getWMLayer(id);
wm_layer->addLayerToState(id);
this->renderLayers();
+ this->renderLayersRemote();
+}
+
+void LayerControl::createNewRemoteLayer(unsigned id)
+{
+ HMI_INFO("create new ID :%d (For remote layer)", id);
+ struct rect rct = {640, 720, 0, 0};
+ ilm_layerCreateWithDimension(&id, rct.w, rct.h);
+ //ilm_layerSetSourceRectangle(id, rct.x, rct.y, rct.w, rct.h);
+ ilm_layerSetDestinationRectangle(id, this->offset_x, this->offset_y, rct.w, rct.h);
+ ilm_layerSetOpacity(id, 1.0);
+ ilm_layerSetVisibility(id, ILM_FALSE);
+ ilm_commitChanges();
+ auto wm_layer = getWMLayer(id);
+ wm_layer->addLayerToState(id);
+ this->renderLayers();
+ this->renderLayersRemote();
}
-unsigned LayerControl::getNewLayerID(const string& role)
+unsigned LayerControl::getNewLayerID(const string& role, string* layer_name)
{
unsigned ret = 0;
for(const auto& l: this->wm_layers)
@@ -141,6 +170,7 @@ unsigned LayerControl::getNewLayerID(const string& role)
ret = l->getNewLayerID(role);
if(ret != 0)
{
+ *layer_name = l->layerName();
unsigned wmlid = l->getWMLayerID();
this->lid2wmlid[ret] = wmlid;
break;
@@ -200,6 +230,11 @@ double LayerControl::scale()
return this->scaling;
}
+WMError LayerControl::updateLayer(LayerState& layer_state)
+{
+ return WMError::SUCCESS;
+}
+
WMError LayerControl::renderLayers()
{
HMI_INFO("Commit change");
@@ -252,6 +287,69 @@ WMError LayerControl::renderLayers()
return rc;
}
+WMError LayerControl::renderLayersRemote()
+{
+ HMI_INFO("Commit change");
+ WMError rc = WMError::SUCCESS;
+
+ if (0 > this->remoteScreenID)
+ {
+ return rc;
+ }
+
+ // Check the number of layers
+ vector<unsigned> ivi_l_ids;
+ for(auto& l : this->wm_remote_layers)
+ {
+ auto state = l->getLayerState();
+ HMI_DEBUG("layer %s", l->layerName().c_str());
+ for(const auto& id : state.getIviIdList())
+ {
+ HMI_DEBUG("Add %d", id);
+ ivi_l_ids.push_back(id);
+ }
+ }
+
+ if (0 == ivi_l_ids.size())
+ {
+ ilm_displaySetRenderOrder(this->remoteScreenID, nullptr, 0);
+ return rc;
+ }
+
+ // Create render order
+ t_ilm_layer* id_array = new t_ilm_layer[ivi_l_ids.size()];
+ if(id_array == nullptr)
+ {
+ HMI_WARNING("short memory");
+ this->undoUpdate();
+ return WMError::FAIL;
+ }
+ int count = 0;
+ for(const auto& i : ivi_l_ids)
+ {
+ id_array[count] = i;
+ ++count;
+ }
+
+ // Display
+ ilmErrorTypes ret = ilm_displaySetRenderOrder(this->remoteScreenID, id_array, ivi_l_ids.size());
+ if(ret != ILM_SUCCESS)
+ {
+ this->undoUpdate();
+ rc = WMError::FAIL;
+ }
+ else
+ {
+ for(auto& l : this->wm_remote_layers)
+ {
+ l->update();
+ }
+ }
+ ilm_commitChanges();
+ delete id_array;
+ return rc;
+}
+
WMError LayerControl::setXDGSurfaceOriginSize(unsigned surface)
{
WMError ret = WMError::NOT_REGISTERED;
@@ -309,9 +407,9 @@ WMError LayerControl::loadLayerSetting(const string &path)
return WMError::SUCCESS;
}
-WMError LayerControl::loadAreaDb(const std::string& path)
+WMError LayerControl::loadAreasConfigFile(const std::string& path, const std::string& ecu_name)
{
- // Load area.db
+ // Load areas config file
json_object *json_obj;
int ret = jh::inputJsonFilie(path.c_str(), &json_obj);
if (0 > ret)
@@ -321,54 +419,114 @@ WMError LayerControl::loadAreaDb(const std::string& path)
}
HMI_INFO("json_obj dump:%s", json_object_get_string(json_obj));
- // Perse areas
+ // Parse ecus
json_object *json_cfg;
- if (!json_object_object_get_ex(json_obj, "areas", &json_cfg))
+ if (!json_object_object_get_ex(json_obj, "ecus", &json_cfg))
{
HMI_ERROR("Parse Error!!");
return WMError::FAIL;
}
- int len = json_object_array_length(json_cfg);
- HMI_DEBUG("json_cfg len:%d", len);
+ int num_ecu = json_object_array_length(json_cfg);
+ HMI_DEBUG("json_cfg(ecus) len:%d", num_ecu);
- const char *area;
- for (int i = 0; i < len; i++)
+ const char* c_ecu_name;
+ json_object *json_ecu;
+ for (int i = 0; i < num_ecu; i++)
{
- json_object *json_tmp = json_object_array_get_idx(json_cfg, i);
- HMI_DEBUG("> json_tmp dump:%s", json_object_get_string(json_tmp));
+ json_ecu= json_object_array_get_idx(json_cfg, i);
- area = jh::getStringFromJson(json_tmp, "name");
- if (nullptr == area)
+ c_ecu_name = jh::getStringFromJson(json_ecu, "name");
+ if (nullptr == c_ecu_name)
{
HMI_ERROR("Parse Error!!");
return WMError::FAIL;
}
- HMI_DEBUG("> area:%s", area);
- json_object *json_rect;
- if (!json_object_object_get_ex(json_tmp, "rect", &json_rect))
+ if (ecu_name == string(c_ecu_name))
{
- HMI_ERROR("Parse Error!!");
- return WMError::FAIL;
+ break;
}
- HMI_DEBUG("> json_rect dump:%s", json_object_get_string(json_rect));
+ else
+ {
+ json_ecu = nullptr;
+ }
+ }
- struct rect area_size;
- area_size.x = jh::getIntFromJson(json_rect, "x");
- area_size.y = jh::getIntFromJson(json_rect, "y");
- area_size.w = jh::getIntFromJson(json_rect, "w");
- area_size.h = jh::getIntFromJson(json_rect, "h");
+ if (!json_ecu)
+ {
+ HMI_ERROR("Areas for ecu:%s is NOT exist!!", ecu_name.c_str());
+ return WMError::FAIL;
+ }
- this->area2size[area] = area_size;
+ // Parse screens
+ if (!json_object_object_get_ex(json_ecu, "screens", &json_cfg))
+ {
+ HMI_ERROR("Parse Error!!");
+ return WMError::FAIL;
}
- // Check
- for (const auto& itr : this->area2size)
+ int num_screen = json_object_array_length(json_cfg);
+ HMI_DEBUG("json_cfg(screens) len:%d", num_screen);
+
+ int screen_id;
+ json_object *json_screen;
+ for (int i = 0; i < num_screen; i++)
{
- HMI_DEBUG("area:%s x:%d y:%d w:%d h:%d",
- itr.first.c_str(), itr.second.x, itr.second.y,
- itr.second.w, itr.second.h);
+ json_screen = json_object_array_get_idx(json_cfg, i);
+ HMI_INFO("json_cfg dump:%s", json_object_get_string(json_cfg));
+
+ // TODO: Currently only one display is connected to a ECU.
+
+ screen_id = jh::getIntFromJson(json_screen, "id");
+
+ // Parse areas
+ json_object *json_tmp;
+ if (!json_object_object_get_ex(json_screen, "areas", &json_tmp))
+ {
+ HMI_ERROR("Parse Error!!");
+ return WMError::FAIL;
+ }
+
+ int num_area = json_object_array_length(json_tmp);
+ HMI_DEBUG("json_tmp(areas) len:%d", num_area);
+
+ const char *area;
+ for (int j = 0; j < num_area; j++)
+ {
+ json_object *json_area = json_object_array_get_idx(json_tmp, j);
+
+ area = jh::getStringFromJson(json_area, "name");
+ if (nullptr == area)
+ {
+ HMI_ERROR("Parse Error!!");
+ return WMError::FAIL;
+ }
+ HMI_DEBUG("> area:%s", area);
+
+ json_object *json_rect;
+ if (!json_object_object_get_ex(json_area, "rect", &json_rect))
+ {
+ HMI_ERROR("Parse Error!!");
+ return WMError::FAIL;
+ }
+
+ struct rect area_size;
+ area_size.x = jh::getIntFromJson(json_rect, "x");
+ area_size.y = jh::getIntFromJson(json_rect, "y");
+ area_size.w = jh::getIntFromJson(json_rect, "w");
+ area_size.h = jh::getIntFromJson(json_rect, "h");
+
+ this->area2size[area] = area_size;
+ }
+
+ // Check
+ for (const auto& itr : this->area2size)
+ {
+ HMI_DEBUG("area:%s x:%d y:%d w:%d h:%d",
+ itr.first.c_str(), itr.second.x, itr.second.y,
+ itr.second.w, itr.second.h);
+ }
}
// Release json_object
@@ -379,7 +537,9 @@ WMError LayerControl::loadAreaDb(const std::string& path)
WMError LayerControl::layoutChange(const WMAction& action)
{
- if (action.visible == TaskVisible::INVISIBLE)
+ if ((action.visible == TaskVisible::INVISIBLE) ||
+ (action.visible == TaskVisible::REQ_REMOTE_VISIBLE) ||
+ (action.visible == TaskVisible::REQ_REMOTE_INVISIBLE))
{
// Visibility is not change -> no redraw is required
return WMError::SUCCESS;
@@ -394,7 +554,19 @@ WMError LayerControl::layoutChange(const WMAction& action)
auto rect = this->getAreaSize(action.area);
HMI_DEBUG("Set layout %d, %d, %d, %d",rect.x, rect.y, rect.w, rect.h);
- ilm_commitChanges();
+
+ // TO BE FIXED:
+ // Sometimes, ivi_wm_surface_size signal doesn't reach window manager,
+ // then, Window Manager can't set source size.
+ // This fixes it but it takes about 200ns(on R-Car M3) wastefully
+ ilmSurfaceProperties sp;
+ ilm_getPropertiesOfSurface(surface, &sp);
+ if(sp.origSourceHeight != sp.sourceHeight) {
+ HMI_SEQ_NOTICE(action.req_num, "WORK AROUND: set source size w:%d h%d", sp.origSourceWidth, sp.origSourceHeight);
+ ilm_surfaceSetSourceRectangle(surface, 0, 0, sp.origSourceWidth, sp.origSourceHeight);
+ ilm_commitChanges();
+ }
+
ilm_surfaceSetDestinationRectangle(surface, rect.x, rect.y, rect.w, rect.h);
ilm_commitChanges();
for(auto &wm_layer: this->wm_layers)
@@ -430,7 +602,20 @@ WMError LayerControl::visibilityChange(const WMAction& action)
{
ret = this->makeInvisible(action.client);
}
- ilm_commitChanges();
+ else if (action.visible == TaskVisible::REMOTE_VISIBLE)
+ {
+ ret = this->makeRemoteVisible(action.client);
+ }
+ else if (action.visible == TaskVisible::REMOTE_INVISIBLE)
+ {
+ ret = this->makeRemoteInvisible(action.client);
+ }
+ else // TaskVisible::REQ_REMOTE_VISIBLE || TaskVisible::REQ_REMOTE_INVISIBLE
+ {
+ // Visibility is not change
+ ret = WMError::SUCCESS;
+ }
+
return ret;
}
@@ -460,6 +645,7 @@ void LayerControl::dispatchCreateEvent(ilmObjectType object, unsigned id, bool c
return;
}
this->cb.surfaceCreated(sp.creatorPid, id);
+ ilm_surfaceSetSourceRectangle(id, 0, 0, sp.origSourceWidth, sp.origSourceHeight);
ilm_surfaceAddNotification(id, surfaceCallback_static);
ilm_surfaceSetVisibility(id, ILM_TRUE);
ilm_surfaceSetType(id, ILM_SURFACETYPE_DESKTOP);
@@ -568,6 +754,71 @@ WMError LayerControl::makeInvisible(const shared_ptr<WMClient> client)
return ret;
}
+WMError LayerControl::makeRemoteVisible(const shared_ptr<WMClient> client)
+{
+ WMError ret = WMError::SUCCESS;
+ unsigned layer = client->layerID(); // Don't check here the client is not nullptr
+
+ if (0 > this->remoteScreenID)
+ {
+ return ret;
+ }
+
+ // TODO: Currently there is only one remote screen.
+ for (auto itr = this->wm_layers.begin(); itr != this->wm_layers.end(); ++itr)
+ {
+ if((*itr)->hasLayerID(layer))
+ {
+ HMI_DEBUG("Add layer:%d to remote screen:%d", layer, this->remoteScreenID);
+ this->wm_remote_layers.push_back(*itr);
+ this->wm_layers.erase(itr);
+ }
+
+ if (this->wm_layers.end() == itr)
+ {
+ HMI_DEBUG("iteretor indicates end of vector of wm_layers");
+ break;
+ }
+ }
+
+ ilm_layerSetVisibility(layer, ILM_TRUE);
+
+ return ret;
+}
+
+WMError LayerControl::makeRemoteInvisible(const shared_ptr<WMClient> client)
+{
+ WMError ret = WMError::SUCCESS;
+ unsigned layer = client->layerID(); // Don't check here the client is not nullptr
+
+ if (0 > this->remoteScreenID)
+ {
+ return ret;
+ }
+
+ // TODO: Currently there is only one remote screen.
+ for (auto itr = this->wm_remote_layers.begin();
+ itr != this->wm_remote_layers.end(); ++itr)
+ {
+ if((*itr)->hasLayerID(layer))
+ {
+ HMI_DEBUG("Remove layer:%d from remote screen:%d", layer, this->remoteScreenID);
+ this->wm_layers.push_back(*itr);
+ this->wm_remote_layers.erase(itr);
+ }
+
+ if (this->wm_remote_layers.end() == itr)
+ {
+ HMI_DEBUG("iteretor indicates end of vector of wm_remote_layers");
+ break;
+ }
+ }
+
+ ilm_layerSetVisibility(layer, ILM_FALSE);
+
+ return ret;
+}
+
bool LayerControl::moveBackGround(const shared_ptr<WMClient> client)
{
bool ret = false;
diff --git a/src/wm_layer_control.hpp b/src/wm_layer_control.hpp
index 25d71fd..fef71ff 100644
--- a/src/wm_layer_control.hpp
+++ b/src/wm_layer_control.hpp
@@ -60,18 +60,21 @@ class WMClient;
class LayerControl
{
public:
- explicit LayerControl(const std::string& root);
+ explicit LayerControl(const std::string& root, const std::string& ecu_name);
~LayerControl() = default;
WMError init(const LayerControlCallbacks& cb);
void createNewLayer(unsigned id);
- unsigned getNewLayerID(const std::string& role);
+ void createNewRemoteLayer(unsigned id);
+ unsigned getNewLayerID(const std::string& role, std::string* layer_name);
std::shared_ptr<WMLayer> getWMLayer(unsigned layer);
std::shared_ptr<WMLayer> getWMLayer(std::string layer_name);
struct rect getAreaSize(const std::string& area);
void setupArea(const rectangle& base_rct, double scaling);
Screen getScreenInfo();
double scale();
+ WMError updateLayer(LayerState& layer_state);
WMError renderLayers();
+ WMError renderLayersRemote();
WMError setXDGSurfaceOriginSize(unsigned surface);
void undoUpdate();
WMError layoutChange(const WMAction& action);
@@ -89,12 +92,18 @@ class LayerControl
bool moveForeGround(const std::shared_ptr<WMClient> client);
bool moveBackGround(const std::shared_ptr<WMClient> client);
WMError loadLayerSetting(const std::string& path);
- WMError loadAreaDb(const std::string& path);
+ WMError loadAreasConfigFile(const std::string& path, const std::string& ecu_name);
+
+ // For Remote
+ WMError makeRemoteVisible(const std::shared_ptr<WMClient> client);
+ WMError makeRemoteInvisible(const std::shared_ptr<WMClient> client);
std::vector<std::shared_ptr<WMLayer>> wm_layers;
+ std::vector<std::shared_ptr<WMLayer>> wm_remote_layers;
std::unordered_map<unsigned, unsigned> lid2wmlid;
std::unordered_map<std::string, struct rect> area2size;
unsigned screenID;
+ signed remoteScreenID;
struct ilmScreenProperties screen_prop;
double scaling;
int offset_x;