summaryrefslogtreecommitdiffstats
path: root/app/main.cpp
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2018-12-04 11:52:01 -0500
committerScott Murray <scott.murray@konsulko.com>2018-12-04 16:57:21 -0500
commitd9d2667e365f7e4220afd8098a694800666329af (patch)
treec7057f4ff68075ed87d8ff13e3a579b39fe5a58a /app/main.cpp
parent3b82568265b0a149928495ba22f4055eb7161328 (diff)
Initial check-in
Demo instrument cluster dashboard application to display instrument cluster mock-up with speedometer, tachometer, temperature, and fuel gauges. A space is provided in the center of the dashboard for the overlay of the receiver application's remote display. Note that the gauges themselves and their animation are based on the Qt dashboard example: https://doc.qt.io/qt-5.11/qtquickextras-dashboard-example.html The associated qml source files are under the BSD license, other files are Apache 2.0. Additionally, note that the application uses the windowmanager, but not the homescreen service, as the demo instrument cluster does not use the homescreen. There is also an implicit assumption that the windowmanager configuration allows the application to claim the homescreen role and that the surface for that role will be 1920x1080 portrait mode. Change-Id: I413fa165125813757ab4712993320440ed641f32 Signed-off-by: Scott Murray <scott.murray@konsulko.com>
Diffstat (limited to 'app/main.cpp')
-rw-r--r--app/main.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/app/main.cpp b/app/main.cpp
new file mode 100644
index 0000000..4f36ef7
--- /dev/null
+++ b/app/main.cpp
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (C) 2018 Konsulko Group
+ *
+ * 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 <QtCore/QDebug>
+#include <QtCore/QCommandLineParser>
+#include <QtCore/QUrlQuery>
+#include <QtGui/QGuiApplication>
+#include <QtQml/QQmlApplicationEngine>
+#include <QtQml/QQmlContext>
+#include <QtQml/qqml.h>
+#include <QQuickWindow>
+#include <QtQuickControls2/QQuickStyle>
+
+#include <qlibwindowmanager.h>
+
+int main(int argc, char *argv[])
+{
+ // Slight hack, using the homescreen role greatly simplifies things wrt
+ // the windowmanager
+ QString myname = QString("homescreen");
+
+ QGuiApplication app(argc, argv);
+
+ 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();
+
+ QQmlApplicationEngine engine;
+
+ if (positionalArguments.length() == 2) {
+ int port = positionalArguments.takeFirst().toInt();
+ QString secret = positionalArguments.takeFirst();
+ QUrl bindingAddress;
+ bindingAddress.setScheme(QStringLiteral("ws"));
+ bindingAddress.setHost(QStringLiteral("localhost"));
+ bindingAddress.setPort(port);
+ bindingAddress.setPath(QStringLiteral("/api"));
+ QUrlQuery query;
+ query.addQueryItem(QStringLiteral("token"), secret);
+ bindingAddress.setQuery(query);
+ QQmlContext *context = engine.rootContext();
+ context->setContextProperty(QStringLiteral("bindingAddress"), bindingAddress);
+
+ std::string token = secret.toStdString();
+ QLibWindowmanager* qwm = new QLibWindowmanager();
+
+ // WindowManager
+ if(qwm->init(port, secret) != 0){
+ exit(EXIT_FAILURE);
+ }
+
+ // Request a surface as described in layers.json windowmanager’s file
+ if (qwm->requestSurface(myname) != 0) {
+ exit(EXIT_FAILURE);
+ }
+
+ // Create an event callback against an event type. Here a lambda is called when SyncDraw event occurs
+ qwm->set_event_handler(QLibWindowmanager::Event_SyncDraw, [qwm, myname](json_object*) {
+ fprintf(stderr, "Surface got syncDraw!\n");
+ qwm->endDraw(myname);
+ });
+
+ engine.load(QUrl(QStringLiteral("qrc:/cluster-gauges.qml")));
+
+ // Find the instantiated model QObject and connect the signals/slots
+ QList<QObject *> mobjs = engine.rootObjects();
+
+ QQuickWindow *window = qobject_cast<QQuickWindow *>(mobjs.first());
+ QObject::connect(window, SIGNAL(frameSwapped()), qwm, SLOT(slotActivateSurface()));
+ }
+
+ return app.exec();
+}