C

Qt Safe Monitor: Qt Quick Ultralite Example on Bare-Metal Traveo II

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

#if !defined(DESKTOP_BUILD)

#include <qul/application.h>
#include <qul/qul.h>
#include <qul/imagedecoders/saferendererbitmapdecoder.h>

#include <QtSafeRenderer/qsafeglobal.h>

// We must use the SafeRenderer namespace here because
// the Monitor library is written in C, and its types
// are implemented without a namespace.
using namespace SafeRenderer;
extern "C" {
#include "QtSafeMonitor/qsrmonitor.h"
#include "QtSafeOutputVerifierAdaptation/outputverifier_capi.h"
#include "QtSafeMonitor/qsafechecksum.h"
}

#include <tviiextras/tviiconfiguration.h>

#include "simulator.h"
#include "mainUI.h"

static void defaultErrorHandler(ErrorCode errorType, qint64 arg1, qint64 arg2)
{
    quint64 timestamp = Qul::Platform::getPlatformInstance()->currentTimestamp();
    Qul::PlatformInterface::log("Error: %s\n", errorCodeToString(errorType));
    Qul::PlatformInterface::log("Item id: %d, CRC checking failed. Actual value: %x\n", (uint32_t)arg1, (uint32_t)arg2);
}

qint32 verifyItem(const char *itemName, quint32 stateId)
{
    const quint32 itemId = qsafe_hash(itemName, strlen(itemName));
    qint32 ret = addItemToVerification(itemId, stateId);
    return ret;
}

int main()
{
    Qul::initHardware();
    static SafeRendererBitmapDecoder srbDecoder;
    Qul::Application::addImageDecoder(&srbDecoder);
    Qul::initPlatform();

    Qul::ApplicationConfiguration appConfig;
    appConfig.setTextCacheEnabled(true);
    appConfig.setTextCacheSize(64 * 1024);
    Qul::Application app(appConfig);

    static struct ::mainUI item;

    Tvii::Configuration::Config config = Tvii::Configuration::defaultConfigForOTFLayer();
    Tvii::Configuration::setConfigForOTFLayer(1, 16, 64 * 1024, 32);

    Simulator simulator;

    app.setRootItem(&item);

    OutputVerifier_initVerifierDevice(0, 0, 800, 480);

    static quint64 previousUpdate = 0;
    static quint64 previousMonitorUpdate = 0;
    const quint32 updatePeriod = 10;
    const quint32 updateMonitorPeriod = 100;

    while (true) {
        quint64 timestamp = Qul::Platform::getPlatformInstance()->currentTimestamp();

        if (timestamp > previousUpdate + updatePeriod) {
            simulator.tick(timestamp - previousUpdate);

            quint32 stateIdIconBeams = simulator.getBeamsState() ? 1U : 0;
            quint32 stateIdIconEngine = simulator.getEngineState() ? 1U : 0;
            quint32 stateIdIconBattery = simulator.getBatteryState() ? 1U : 0;
            quint32 stateIdIconOil = simulator.getOilState() ? 1U : 0;

            verifyItem("iconBeams", stateIdIconBeams);
            verifyItem("iconEngine", stateIdIconEngine);
            verifyItem("iconBattery", stateIdIconBattery);
            verifyItem("iconOil", stateIdIconOil);

            app.update();

            if (timestamp > previousMonitorUpdate + updateMonitorPeriod) {
                qint32 verificationResult = verifyOutput(defaultErrorHandler);
                previousMonitorUpdate = timestamp;
            }

            previousUpdate = timestamp;
        }
    }

    return 0;
}

#endif

#if defined(DESKTOP_BUILD)

#include <qul/application.h>
#include <qul/qul.h>
#include <qul/imagedecoders/saferendererbitmapdecoder.h>

#include "simulator.h"
#include "mainUI.h"

// Monitoring functionality is not implemented in this desktop build.

int main()
{
    Qul::initHardware();

    static SafeRendererBitmapDecoder srbDecoder;
    Qul::Application::addImageDecoder(&srbDecoder);

    Qul::initPlatform();

    Qul::Application app;

    static mainUI item;

    Simulator simulator;

    app.setRootItem(&item);

    static uint64_t previousUpdate = 0;
    const uint64_t updatePeriod = 10;

    while (true) {
        uint64_t timestamp = Qul::Platform::getPlatformInstance()->currentTimestamp();
        if (timestamp > previousUpdate + updatePeriod) {
            simulator.tick(timestamp - previousUpdate);
            app.update();
            previousUpdate = timestamp;
        }
    }

    return 0;
}

#endif