C
アプリケーション内でのQt Quick Ultraliteの実行
起動とQt Quick Ultraliteのイベントループへの参加
ハードウェアの初期化をいつ、どのように行うかは、アプリケーション開発者に委ねられています。通常は、Qul::initPlatform() の直前にQul::initHardware() を呼び出して行われますが、開発者はこれを呼び出さず、独自のハードウェア初期化を行うことも可能です。
アプリケーションのグラフィカルな部分を起動するには、Qul::initPlatform() を呼び出し、main() またはタスク関数内でQul::Application オブジェクトを作成し、その後Qul::Application::exec() 関数を呼び出す必要があります。
Qul::initPlatform() はQt Quick Ultralite プラットフォームのコンポーネントを初期化し、Qul::Application::exec() を呼び出すとイベントループが開始されます。
あるいは、Qul::Application::update() を定期的に呼び出すことで、Qt Quick Ultralite のイベントループを実行することもできます。
ベアメタル
たとえば、QMLで定義されたメイン項目が MainScreen である場合、ベアメタル上の main.cpp には次のような内容を含めることができます。
#include "MainScreen.h" #include <qul/application.h> #include <qul/qul.h> int main() { Qul::initHardware(); Qul::initPlatform(); Qul::Application app; static MainScreen item; app.setRootItem(&item); while (true) { uint64_t now = Qul::Platform::getPlatformInstance()->currentTimestamp(); // <handle timers> uint64_t nextUpdate = app.update(); if (nextUpdate > now) { // Device can go to sleep until next update is due // enterLowPowerMode(nextUpdate - now); } } return 1; }
FreeRTOS
main.cpp の例:
#include "MainScreen.h" #include <qul/application.h> #include <qul/qul.h> #include <platforminterface/log.h> #include <FreeRTOS.h> #include <task.h> #ifndef QUL_STACK_SIZE #error QUL_STACK_SIZE must be defined. #endif static void Qul_Thread(void *argument); // extern const HeapRegion_t xHeapRegions[]; // HeapRegion for FreeRTOS Heap_5 int main() { Qul::initHardware(); // vPortDefineHeapRegions(xHeapRegions); // Initialize FreeRTOS Heap_5 Qul::initPlatform(); if (xTaskCreate(Qul_Thread, "QulExec", QUL_STACK_SIZE, 0, 4, 0) != pdPASS) { Qul::PlatformInterface::log("Task creation failed!.\r\n"); configASSERT(false); } vTaskStartScheduler(); // Should not reach this point return 1; } static void Qul_Thread(void *argument) { Qul::Application app; static MainScreen item; app.setRootItem(&item); while (true) app.update(); }
注: FreeRTOS Heap_5 は、Qul::initPlatform() を呼び出す前に初期化する必要があります。
テキストキャッシュの初期化
ベアメタル
アプリケーションのテキストキャッシュを設定するには、次の例に示すように、main.app 内で適切なQul::Application コンストラクタを呼び出します。
#include "MainScreen.h" #include <qul/application.h> #include <qul/qul.h> int main() { Qul::initHardware(); Qul::initPlatform(); Qul::ApplicationConfiguration appConfig; appConfig.setTextCacheEnabled(true); appConfig.setTextCacheSize(128 * 1024); Qul::Application app(appConfig); static MainScreen item; app.setRootItem(&item); while (true) { uint64_t now = Qul::Platform::getPlatformInstance()->currentTimestamp(); // <handle timers> uint64_t nextUpdate = app.update(); if (nextUpdate > now) { // Device can go to sleep until next update is due // enterLowPowerMode(nextUpdate - now); } } return 1; }
FreeRTOS
Main.cpp の例:
#include "MainScreen.h" #include <qul/application.h> #include <qul/qul.h> #include <platforminterface/log.h> #include <FreeRTOS.h> #include <task.h> #ifndef QUL_STACK_SIZE #error QUL_STACK_SIZE must be defined. #endif static void Qul_Thread(void *argument); // extern const HeapRegion_t xHeapRegions[]; // HeapRegion for FreeRTOS Heap_5 int main() { Qul::initHardware(); // vPortDefineHeapRegions(xHeapRegions); // Initialize FreeRTOS Heap_5 Qul::initPlatform(); if (xTaskCreate(Qul_Thread, "QulExec", QUL_STACK_SIZE, 0, 4, 0) != pdPASS) { Qul::PlatformInterface::log("Task creation failed!.\r\n"); configASSERT(false); } vTaskStartScheduler(); // Should not reach this point return 1; } static void Qul_Thread(void *argument) { Qul::ApplicationConfiguration appConfig; appConfig.setTextCacheEnabled(true); appConfig.setTextCacheSize(64 * 1024); Qul::Application app(appConfig); static MainScreen item; app.setRootItem(&item); while (true) app.update(); }
特定の Qt ライセンスの下で利用可能です。
詳細はこちら。