C

Indicators: Creating Safety-Critical UI

// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial

// This file is part of the Qt Safe Renderer module
#include <QtSafeRenderer/qsafelayout.h>
#include <QtSafeRenderer/qsafelayoutresourcereader.h>
#include <QtSafeRenderer/statemanager.h>
#if defined(HOST_BUILD)
#include <QQuickView>
#include <QWindow>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#endif
#if defined(USE_OUTPUTVERIFIER)
#include <outputverifier.h>
#endif

#include <QtSafePlatformAdaptation/safewindow.h>
#include <QtSafePlatformAdaptation/eventhandler.h>

using namespace SafeRenderer;

int main(int argc, char **argv)
{
    (void)argc;
    (void)argv;
    static QSafeLayoutResourceReader layout("/layoutData/MainForm/MainForm.ui.srl");

#if defined(USE_OUTPUTVERIFIER)
    try {
#endif

#if defined(USE_OUTPUTVERIFIER)
    static OutputVerifier outputVerifier;
    SafeWindow telltaleWindow(layout.size(), QSafePoint(0U, 0U), outputVerifier);
#else
    SafeWindow telltaleWindow(layout.size(), QSafePoint(0U, 0U));
#endif
    static SafeRenderer::StateManager stateManager(telltaleWindow, layout);
    telltaleWindow.requestUpdate(); //Request is required because eventHandler is not running yet.

#if defined(USE_OUTPUTVERIFIER)
    EventHandler msgHandler(stateManager, telltaleWindow, outputVerifier);
#else
    EventHandler msgHandler(stateManager, telltaleWindow);
#endif

#if defined(HOST_BUILD)
    //Mixing the Qt and Qt Safe Renderer renderers is done here only for demonstration purposes on host, not for production purposes of any kind.
    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/ControlUI.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, qApp,
                     [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            qDebug() << "Failed to start the ControlUI.qml";
    }, Qt::QueuedConnection);
    engine.addImportPath(":/imports");
    engine.load(url);
#endif

    msgHandler.handleEvents();

#if defined(USE_OUTPUTVERIFIER)
    }
    catch (const OutputVerifierException &e) {
        qWarning() << e.what();
    }
#endif

    return 0;
}