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