diff options
author | wang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com> | 2018-09-26 10:39:58 +0800 |
---|---|---|
committer | wang_zhiqiang <wang_zhiqiang@dl.cn.nexty-ele.com> | 2018-09-26 10:39:58 +0800 |
commit | e79d82c88e350e6b882158624363b82fe3e2d91a (patch) | |
tree | ffce5bb5ca731ac3b3fd323b18c72c7d18572481 /app | |
parent | ec044f44133cad1d12311345437b13b1a953226e (diff) |
update
Diffstat (limited to 'app')
-rw-r--r-- | app/app.pro | 18 | ||||
-rw-r--r-- | app/eventhandler.cpp | 198 | ||||
-rw-r--r-- | app/eventhandler.h | 71 | ||||
-rw-r--r-- | app/hmi-debug.h | 77 | ||||
-rw-r--r-- | app/main.cpp | 84 | ||||
-rw-r--r-- | app/main.qml | 58 | ||||
-rw-r--r-- | app/qml.qrc | 5 |
7 files changed, 511 insertions, 0 deletions
diff --git a/app/app.pro b/app/app.pro new file mode 100644 index 0000000..f234ea6 --- /dev/null +++ b/app/app.pro @@ -0,0 +1,18 @@ +TEMPLATE = app +TARGET = onscreenapp +QT += quickcontrols2 quick qml +CONFIG += c++11 link_pkgconfig +DESTDIR = $${OUT_PWD}/../package/root/bin +PKGCONFIG += qlibwindowmanager libhomescreen + +HEADERS += \ + eventhandler.h + +SOURCES += \ + eventhandler.cpp \ + main.cpp + +RESOURCES += \ + qml.qrc + +LIBS += -ljson-c diff --git a/app/eventhandler.cpp b/app/eventhandler.cpp new file mode 100644 index 0000000..044eec6 --- /dev/null +++ b/app/eventhandler.cpp @@ -0,0 +1,198 @@ +/* + * 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 <functional> +#include <QUrl> +#include <QDebug> +#include <QJsonDocument> +#include <QJsonObject> +#include <QQuickWindow> +#include <cstring> + +#include "eventhandler.h" + +void* EventHandler::myThis = 0; + +EventHandler::EventHandler(QObject *parent) : + QObject(parent), + mp_hs(NULL), + mp_wm(NULL), + mp_qw(NULL) +{ + m_dspreq = QString(""); + my_id = QString(APP_ID); + my_role = QString(ROLE_NAME); + m_req.clear(); +} + +EventHandler::~EventHandler() +{ + if (mp_hs != NULL) { + delete mp_hs; + } + if (mp_wm != NULL) { + delete mp_wm; + } +} + +void EventHandler::init(int port, const char *token) +{ + myThis = this; + mp_wm = new QLibWindowmanager(); + mp_wm->init(port, token); + + mp_hs = new LibHomeScreen(); + mp_hs->init(port, token); + +// my_id = QString(std::strtok(std::getenv("AFM_ID"), "@")); + mp_hs->registerCallback(nullptr, EventHandler::onRep_static); + mp_hs->set_event_handler(LibHomeScreen::Event_ShowWindow, [this](json_object *object){ + // {"id": "onscreenXXX", "parameter": {"replyid": "app's id", "file": "onsreen file path", "data": {"key": "value", ...}}} + struct json_object *appid; + json_object_object_get_ex(object, "application_id", &appid); + const char *id = json_object_get_string(appid); + if(my_id != QString(id)) { + HMI_DEBUG(APP_ID, "Event_ShowWindow id = %s", id); + return; + } + else + HMI_DEBUG(APP_ID, "recived json message is[%s]", json_object_get_string(object)); + + struct json_object *param; + json_object_object_get_ex(object, "parameter", ¶m); + if(json_object_get_type(param) != json_type_object ) { + HMI_DEBUG(APP_ID, "parameter error!"); + return; + } + + struct json_object *replyid; + json_object_object_get_ex(param, "replyid", &replyid); + const char *_replyid = json_object_get_string(replyid); + + struct json_object *path; + json_object_object_get_ex(param, "file", &path); + const char *_path = json_object_get_string(path); + + struct json_object *data; + json_bool rtn = json_object_object_get_ex(param, "data", &data); + const char* _data = ""; + if(rtn) { + _data = json_object_to_json_string(data); + } + + m_dspreq = QString(_replyid); + if(m_req.contains(m_dspreq)) { + m_req[m_dspreq] = qMakePair(QString(_path), QString(_data)); + } + else + m_req.insert(QString(m_dspreq), qMakePair(QString(_path), QString(_data))); + + this->mp_wm->activateWindow(ROLE_NAME); + HMI_DEBUG(APP_ID, "received showWindow event, end!, line=%d", __LINE__); + }); + + mp_hs->set_event_handler(LibHomeScreen::Event_HideWindow, [this](json_object *object){ + struct json_object *value; + json_object_object_get_ex(object, "application_id", &value); + const char *appid = json_object_get_string(value); + + HMI_DEBUG(APP_ID, "release onScreen is %s!", appid); + + if (appid == my_id) { + emit this->signalLoader(QVariant("")); + this->mp_wm->deactivateWindow(ROLE_NAME); + } + else { + HMI_DEBUG(APP_ID, "!!!!releaseOnScreen is not displaying!!!!!"); + } + }); + + if (mp_wm->requestSurface(ROLE_NAME) != 0) { + HMI_DEBUG(APP_ID, "!!!!LayoutHandler requestSurface Failed!!!!!"); + exit(EXIT_FAILURE); + } + + mp_wm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [this](json_object *object) { + HMI_DEBUG(APP_ID, "Surface %s got syncDraw!", ROLE_NAME); + emit this->signalLoader(QVariant("file://" + m_req[m_dspreq].first)); + emit this->signalOnScreenParameter(QVariant(m_req[m_dspreq].second)); + this->mp_wm->endDraw(QString(ROLE_NAME)); + }); + + mp_wm->set_event_handler(QLibWindowmanager::Event_Visible, [this](json_object *object) { + struct json_object *value; + json_object_object_get_ex(object, "drawing_name", &value); + const char *name = json_object_get_string(value); + + HMI_DEBUG(APP_ID, "Event_Visible kKeyDrawingName = %s", name); + }); + + mp_wm->set_event_handler(QLibWindowmanager::Event_Invisible, [this](json_object *object) { + struct json_object *value; + json_object_object_get_ex(object, "drawing_name", &value); + const char *name = json_object_get_string(value); + + HMI_DEBUG(APP_ID, "Event_Invisible kKeyDrawingName = %s", name); + }); + + HMI_DEBUG(APP_ID, "LayoutHander::init() finished."); +} + +void EventHandler::setQuickWindow(QQuickWindow *qw) +{ + mp_qw = qw; +} + +void EventHandler::onRep_static(struct json_object* reply_contents) +{ + static_cast<EventHandler*>(EventHandler::myThis)->onRep(reply_contents); +} +void EventHandler::onRep(struct json_object* reply_contents) +{ + const char* str = json_object_to_json_string(reply_contents); + HMI_DEBUG(APP_ID, "EventHandler::onReply %s", str); +} + +void EventHandler::activateWindow(QString &role) +{ + HMI_DEBUG(APP_ID, "EventHandler::activateWindow()"); + mp_wm->activateWindow(role); +} + +void EventHandler::deactivateWindow(QString &role) +{ + HMI_DEBUG(APP_ID, "EventHandler::deactivateWindow()"); + + emit this->signalLoader(QVariant("")); + mp_wm->deactivateWindow(role); +} + +void EventHandler::onScreenReply(const QString &btn_name) +{ + HMI_DEBUG(APP_ID, "EventHandler::onScreenReply()"); + deactivateWindow(my_role); + + struct json_object* j_obj = json_object_new_object(); + json_object_object_add(j_obj, "application_id", json_object_new_string(m_dspreq.toLatin1())); + + struct json_object* j_param = json_object_new_object(); + json_object_object_add(j_param, "method", json_object_new_string("Buttons.ButtonPress")); + json_object_object_add(j_param, "buttonName", json_object_new_string(btn_name.toStdString().c_str())); + json_object_object_add(j_param, "buttonPressMode", json_object_new_string("Short")); + json_object_object_add(j_obj, "parameter", j_param); + + mp_hs->replyShowWindow(m_dspreq.toLatin1(), j_obj); +} diff --git a/app/eventhandler.h b/app/eventhandler.h new file mode 100644 index 0000000..58f694d --- /dev/null +++ b/app/eventhandler.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2017 TOYOTA MOTOR CORPORATION + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef HOMESCREENHANDLER_H +#define HOMESCREENHANDLER_H + +#include <QObject> +#include <string> +#include <QVariant> +#include <QPair> +#include <QMap> + +#include <libhomescreen.hpp> +#include <qlibwindowmanager.h> +#include "hmi-debug.h" + +#define ROLE_NAME "on_screen.app" +#define APP_ID "onscreenapp" + +class QQuickWindow; + +class EventHandler : public QObject +{ + Q_OBJECT +public: + explicit EventHandler(QObject *parent = 0); + ~EventHandler(); + + void init(int port, const char* token); + void setQuickWindow(QQuickWindow *qw); + + void onRep(struct json_object* reply_contents); + + static void* myThis; + static void onRep_static(struct json_object* reply_contents); + + void activateWindow(QString &role); + Q_INVOKABLE void deactivateWindow(QString &role); + Q_INVOKABLE void onScreenReply(const QString &btn_name); + +signals: + void signalLoader(QVariant url); + void signalOnScreenParameter(QVariant text); + +private: + + LibHomeScreen *mp_hs; + QLibWindowmanager* mp_wm; + + QQuickWindow *mp_qw; + + QMap<QString, QPair<QString, QString>> m_req; + QString m_dspreq; + QString my_id; + QString my_role; +}; + +#endif // HOMESCREENHANDLER_H diff --git a/app/hmi-debug.h b/app/hmi-debug.h new file mode 100644 index 0000000..5178aa5 --- /dev/null +++ b/app/hmi-debug.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2017 TOYOTA MOTOR CORPORATION + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __HMI_DEBUG_H__ +#define __HMI_DEBUG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <time.h> +#include <stdio.h> +#include <stdarg.h> +#include <string.h> +#include <stdlib.h> + +enum LOG_LEVEL{ + LOG_LEVEL_NONE = 0, + LOG_LEVEL_ERROR, + LOG_LEVEL_WARNING, + LOG_LEVEL_NOTICE, + LOG_LEVEL_INFO, + LOG_LEVEL_DEBUG, + LOG_LEVEL_MAX = LOG_LEVEL_DEBUG +}; + +#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) + +#define HMI_ERROR(prefix, args,...) _HMI_LOG(LOG_LEVEL_ERROR, __FILENAME__, __FUNCTION__, __LINE__, prefix, args, ##__VA_ARGS__) +#define HMI_WARNING(prefix, args,...) _HMI_LOG(LOG_LEVEL_WARNING, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__) +#define HMI_NOTICE(prefix, args,...) _HMI_LOG(LOG_LEVEL_NOTICE, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__) +#define HMI_INFO(prefix, args,...) _HMI_LOG(LOG_LEVEL_INFO, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__) +#define HMI_DEBUG(prefix, args,...) _HMI_LOG(LOG_LEVEL_DEBUG, __FILENAME__, __FUNCTION__,__LINE__, prefix, args,##__VA_ARGS__) + +static char ERROR_FLAG[6][20] = {"NONE", "ERROR", "WARNING", "NOTICE", "INFO", "DEBUG"}; + +static void _HMI_LOG(enum LOG_LEVEL level, const char* file, const char* func, const int line, const char* prefix, const char* log, ...) +{ + const int log_level = (getenv("USE_HMI_DEBUG") == NULL)?LOG_LEVEL_ERROR:atoi(getenv("USE_HMI_DEBUG")); + if(log_level < level) + { + return; + } + + char *message; + struct timespec tp; + unsigned int time; + + clock_gettime(CLOCK_REALTIME, &tp); + time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000); + + va_list args; + va_start(args, log); + if (log == NULL || vasprintf(&message, log, args) < 0) + message = NULL; + fprintf(stderr, "[%10.3f] [%s %s] [%s, %s(), Line:%d] >>> %s \n", time / 1000.0, prefix, ERROR_FLAG[level], file, func, line, message); + va_end(args); + free(message); +} + +#ifdef __cplusplus +} +#endif +#endif //__HMI_DEBUG_H__ diff --git a/app/main.cpp b/app/main.cpp new file mode 100644 index 0000000..ea727c6 --- /dev/null +++ b/app/main.cpp @@ -0,0 +1,84 @@ +/* + * 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 <QGuiApplication> +#include <QCommandLineParser> +#include <QtGui/QBitmap> +#include <QtGui/QGuiApplication> +#include <QtQml/QQmlApplicationEngine> +#include <QtQml/QQmlContext> +#include <QtQml/qqml.h> +#include <QQuickWindow> +#include <QtQuickControls2/QQuickStyle> + +#include "eventhandler.h" + +using namespace std; + +static EventHandler* eventHandler; + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + QCoreApplication::setOrganizationDomain("LinuxFoundation"); + QCoreApplication::setOrganizationName("AutomotiveGradeLinux"); + QCoreApplication::setApplicationName("Onscreenapp"); + QCoreApplication::setApplicationVersion("0.1.0"); + + QQuickStyle::setStyle("AGL"); + + QCommandLineParser parser; + parser.addPositionalArgument("port", app.translate("main", "port for binding")); + parser.addPositionalArgument("secret", app.translate("main", "secret for binding")); + parser.addHelpOption(); + parser.addVersionOption(); + parser.process(app); + QStringList positionalArguments = parser.positionalArguments(); + + int port = 1700; + QString token = "wm"; + + if (positionalArguments.length() == 2) { + port = positionalArguments.takeFirst().toInt(); + token = positionalArguments.takeFirst(); + } + + HMI_DEBUG(APP_ID, "port = %d, token = %s", port, token.toStdString().c_str()); + + eventHandler = new EventHandler(); + eventHandler->init(port, token.toStdString().c_str()); + + QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("eventHandler", eventHandler); + engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + if (engine.rootObjects().isEmpty()) { + HMI_DEBUG(APP_ID, "Fatal Error, rootObject is empty!"); + return -1; + } + + QObject *root = engine.rootObjects().first(); + QQuickWindow *window = qobject_cast<QQuickWindow *>(root); + + eventHandler->setQuickWindow(window); + QObject::connect(eventHandler, SIGNAL(signalLoader(QVariant)), window, SLOT(qmlLoader(QVariant))); + QObject::connect(eventHandler, SIGNAL(signalOnScreenParameter(QVariant)), window, SLOT(qmlOnScreenParameter(QVariant))); + + HMI_DEBUG(APP_ID, "Launched!"); + + return app.exec(); +} + diff --git a/app/main.qml b/app/main.qml new file mode 100644 index 0000000..758115b --- /dev/null +++ b/app/main.qml @@ -0,0 +1,58 @@ +/* + * 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.6 +import QtQuick.Window 2.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 2.0 +import AGL.Demo.Controls 1.0 + +Window { + id: root + flags: Qt.FramelessWindowHint + visible: true + x: 0 + y: 218 + width: 1080 + height: 1488 + color: '#00000000' + + function qmlLoader(url) { + console.log(qsTr('onscreenapp >>> qmlLoader load ' + url)); + osLoader.source = url; + } + + function qmlOnScreenParameter(text) { + console.log(qsTr('onscreenapp >>> qmlOnScreenParameter.' + text)); + if (osLoader.status == Loader.Ready) { + // call qmlOnScreenParameter in qml to post parameter which from application + if (osLoader.item && osLoader.item.qmlOnScreenParameter) { + osLoader.item.qmlOnScreenParameter(text); + } + } + else { + console.log("osLoader.status is not ready") + } + } + + Loader { + objectName: "loaderObject" + id: osLoader + anchors.centerIn: parent + width: childrenRect.width + height: childrenRect.height + } +} diff --git a/app/qml.qrc b/app/qml.qrc new file mode 100644 index 0000000..5f6483a --- /dev/null +++ b/app/qml.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> |