diff options
author | Scott Murray <scott.murray@konsulko.com> | 2018-12-04 11:52:01 -0500 |
---|---|---|
committer | Scott Murray <scott.murray@konsulko.com> | 2018-12-04 16:57:21 -0500 |
commit | d9d2667e365f7e4220afd8098a694800666329af (patch) | |
tree | c7057f4ff68075ed87d8ff13e3a579b39fe5a58a /app/main.cpp | |
parent | 3b82568265b0a149928495ba22f4055eb7161328 (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.cpp | 91 |
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(); +} |