Porting to new HMI Framework 35/11935/2
authorRomain Forlot <romain.forlot@iot.bzh>
Fri, 27 Oct 2017 21:17:48 +0000 (23:17 +0200)
committerScott Murray <scott.murray@konsulko.com>
Tue, 14 Nov 2017 13:27:58 +0000 (22:27 +0900)
Changes following guidelines given in "Kickstart: New HMI Framework"
document at:

https://wiki.automotivelinux.org/_media/kickstart_apps_migration_guide.pdf

Change-Id: Ifb298e09db821dba5dc1a28ad2d1c2193c511ee9
Signed-off-by: Romain Forlot <romain.forlot@iot.bzh>
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
app/app.pri
app/app.pro
app/main.cpp
app/qlibwindowmanager.cpp [new file with mode: 0644]
app/qlibwindowmanager.h [new file with mode: 0644]
package/config.xml

index 014646f..e535cbc 100644 (file)
@@ -1,12 +1,5 @@
 TEMPLATE = app
 
 load(configure)
-qtCompileTest(libhomescreen)
-
-config_libhomescreen {
-    CONFIG += link_pkgconfig
-    PKGCONFIG += homescreen
-    DEFINES += HAVE_LIBHOMESCREEN
-}
 
 DESTDIR = $${OUT_PWD}/../package/root/bin
index 2c81b9f..62d547e 100644 (file)
@@ -1,7 +1,11 @@
 TARGET = hvac
 QT = quickcontrols2
 
-SOURCES = main.cpp
+HEADERS = qlibwindowmanager.h
+SOURCES = main.cpp qlibwindowmanager.cpp
+
+CONFIG += link_pkgconfig
+PKGCONFIG += libhomescreen libwindowmanager
 
 RESOURCES += \
     hvac.qrc \
index b532b73..ca527e6 100644 (file)
 #include <QtQml/QQmlApplicationEngine>
 #include <QtQml/QQmlContext>
 #include <QtQuickControls2/QQuickStyle>
-
-#ifdef HAVE_LIBHOMESCREEN
+#include <QQuickWindow>
 #include <libhomescreen.hpp>
-#endif
+#include "qlibwindowmanager.h"
 
 int main(int argc, char *argv[])
 {
-#ifdef HAVE_LIBHOMESCREEN
-    LibHomeScreen libHomeScreen;
-
-    if (!libHomeScreen.renderAppToAreaAllowed(0, 1)) {
-        qWarning() << "renderAppToAreaAllowed is denied";
-        return -1;
-    }
-#endif
+    std::string myname = std::string("HVAC");
 
     QGuiApplication app(argc, argv);
-    app.setApplicationName(QStringLiteral("HVAC"));
+    app.setApplicationName(myname.c_str());
     app.setApplicationVersion(QStringLiteral("0.1.0"));
     app.setOrganizationDomain(QStringLiteral("automotivelinux.org"));
     app.setOrganizationName(QStringLiteral("AutomotiveGradeLinux"));
@@ -53,7 +45,6 @@ int main(int argc, char *argv[])
     parser.process(app);
     QStringList positionalArguments = parser.positionalArguments();
 
-
     QQmlApplicationEngine engine;
     if (positionalArguments.length() == 2) {
         int port = positionalArguments.takeFirst().toInt();
@@ -68,9 +59,46 @@ int main(int argc, char *argv[])
         bindingAddress.setQuery(query);
         QQmlContext *context = engine.rootContext();
         context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress);
-    }
-    engine.load(QUrl(QStringLiteral("qrc:/HVAC.qml")));
 
+        std::string token = secret.toStdString();
+        LibHomeScreen* hs = new LibHomeScreen();
+        QLibWindowmanager* qwm = new QLibWindowmanager();
+
+        // WindowManager
+        if(qwm->init(port,secret) != 0){
+            exit(EXIT_FAILURE);
+        }
+        if (qwm->requestSurface(json_object_new_string(myname.c_str())) != 0) {
+            exit(EXIT_FAILURE);
+        }
+        qwm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [qwm, myname](json_object *object) {
+            fprintf(stderr, "Surface got syncDraw!\n");
+            qwm->endDraw(json_object_new_string(myname.c_str()));
+        });
+
+        // HomeScreen
+        hs->init(port, token.c_str());
+        hs->set_event_handler(LibHomeScreen::Event_TapShortcut, [qwm, myname](json_object *object){
+            qDebug("object %s", json_object_to_json_string(object));
+            json_object *appnameJ = nullptr;
+            if(json_object_object_get_ex(object, "application_name", &appnameJ))
+            {
+                const char *appname = json_object_get_string(appnameJ);
+                qDebug("appnameJ %s", json_object_to_json_string(appnameJ));
+                if(myname == appname)
+                {
+                    qDebug("Surface %s got tapShortcut\n", appname);
+                    qwm->activateSurface(json_object_new_string(myname.c_str()));
+                }
+            }
+        });
+
+        engine.load(QUrl(QStringLiteral("qrc:/HVAC.qml")));
+        QObject *root = engine.rootObjects().first();
+        QQuickWindow *window = qobject_cast<QQuickWindow *>(root);
+        QObject::connect(window, SIGNAL(frameSwapped()), qwm, SLOT(slotActivateSurface()
+        ));
+    }
     return app.exec();
 }
 
diff --git a/app/qlibwindowmanager.cpp b/app/qlibwindowmanager.cpp
new file mode 100644 (file)
index 0000000..370f9f7
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * 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 <QDebug>
+#include <unistd.h>
+
+int QLibWindowmanager::init(int port, const QString &token) {
+    std::string ctoken = token.toStdString();
+    return this->wm->init(port, ctoken.c_str());
+}
+
+int QLibWindowmanager::requestSurface(json_object *label) {
+    applabel = json_object_get_string(label);
+
+    json_object *obj = json_object_new_object();
+    json_object_object_add(obj, wm->kKeyDrawingName, label);
+    return this->wm->requestSurface(obj);
+}
+
+int QLibWindowmanager::activateSurface(json_object *label) {
+    qDebug() << "activateSurface applabel: " << applabel.c_str();
+    json_object *obj = json_object_new_object();
+    qDebug() << "DrawingName: " << wm->kKeyDrawingName;
+    json_object_object_add(obj, wm->kKeyDrawingName, label);
+    qDebug() << "DrawingArea: " << wm->kKeyDrawingArea;
+    json_object_object_add(obj, wm->kKeyDrawingArea, json_object_new_string("normal.full"));
+    qDebug() << "obj pointer: " << obj;
+    qDebug() << "activateSurface end obj: " << json_object_get_string(obj);
+
+    return this->wm->activateSurface(obj);
+}
+
+int QLibWindowmanager::deactivateSurface(json_object *label) {
+    json_object *obj = json_object_new_object();
+    json_object_object_add(obj, wm->kKeyDrawingName, label);
+    return this->wm->deactivateSurface(obj);
+}
+
+int QLibWindowmanager::endDraw(json_object *label) {
+    json_object *obj = json_object_new_object();
+    qDebug() << "endDraw label: " << json_object_get_string(label);
+    json_object_object_add(obj, wm->kKeyDrawingName, label);
+    return this->wm->endDraw(obj);
+    }
+
+void QLibWindowmanager::set_event_handler(enum QEventType et,
+ handler_fun f) {
+    LibWindowmanager::EventType wet = (LibWindowmanager::EventType)et;
+    return this->wm->set_event_handler(wet, std::move(f));
+}
+
+void QLibWindowmanager::slotActivateSurface(){
+    if(!isActive){
+        qDebug("Let's show HVAC");
+        isActive = true;
+        qDebug() << "slotActivateSurface applabel: " << applabel.c_str();
+        this->activateSurface(json_object_new_string(applabel.c_str()));
+    }
+}
+
+QLibWindowmanager::QLibWindowmanager(QObject *parent)
+    :QObject(parent), isActive(false)
+{
+    wm = new LibWindowmanager();
+}
+
+QLibWindowmanager::~QLibWindowmanager() { }
diff --git a/app/qlibwindowmanager.h b/app/qlibwindowmanager.h
new file mode 100644 (file)
index 0000000..07f8479
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * 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(json_object *object)>;
+
+    enum QEventType {
+       Event_Active = 0,
+       Event_Inactive,
+
+       Event_Visible,
+       Event_Invisible,
+
+       Event_SyncDraw,
+       Event_FlushDraw,
+    };
+
+    static QLibWindowmanager &instance();
+
+    int init(int port, const QString &token);
+
+    // WM API
+    int requestSurface(json_object *label);
+    int activateSurface(json_object *label);
+    int deactivateSurface(json_object *label);
+    int endDraw(json_object *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;
+    bool isActive;
+
+};
+#endif // LIBWINDOWMANAGER_H
index a576945..9748f0b 100644 (file)
@@ -7,11 +7,11 @@
   <author>Romain Forlot &lt;romain.forlot@iot.bzh&gt;</author>
   <license>APL 2.0</license>
   <feature name="urn:AGL:widget:required-api">
+    <param name="windowmanager" value="ws" />
+    <param name="homescreen" value="ws" />
     <param name="lib/libhvac-demo-binding.so" value="local" />
   </feature>
   <feature name="urn:AGL:widget:required-permission">
     <param name="urn:AGL:permission::public:no-htdocs" value="required" />
   </feature>
 </widget>
-
-