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