C
Qt Quick Ultralite interrupt_handler の例
Qt Quick Ultralite における入力割り込みの処理方法を示します。
概要
この「interrupt_handler 」サンプルでは、Qt Quick Ultralite において、タッチスクリーンやボタン入力などの入力割り込みを処理する方法を示します。シンプルな QML UI を採用しており、ボックスが左から右へ移動します。画面はタッチ操作時に背景色が変わり、デバイス上のボタンを押すと移動が一時停止・再開されます。

対象プラットフォーム
コードの概要
このコードは、割り込みハンドラからデータを転送する方法を示しています。この例では入力データは単純な整数ですが、温度計からのデータなど、より複雑なデータでも処理可能です。
HWButtonInput class
HWButtonInput classはC++インターフェースを提供し、これを使用してボタン押下イベントを interrupt_handler.qmlに伝達するために使用されます。これは Qul::Singleton および Qul::EventQueueから派生しています。
typedef int HWButtonEvent; class HWButtonInput : public Qul::Singleton<HWButtonInput>, public Qul::EventQueue<HWButtonEvent> { public: Qul::Signal<void(int button)> buttonEvent; void onEvent(const HWButtonEvent &inputEvent); };
ボタンイベントは、onEvent() 内でbuttonEvent() シグナルを発行することでQMLに送信されます。このシグナルは、イベントキューがイベントを処理した際にトリガーされます:
void HWButtonInput::onEvent(const HWButtonEvent &inputEvent) { buttonEvent(inputEvent); }
board_config.h また、board_config.cpp
board_config.h には、ConfigureBoard() 関数の宣言のみが含まれています:
#pragma once void ConfigureBoard();
これはボード固有の関数であり、ボードごとに実装が異なります。すべてのボード固有の実装は、interrupt_handler のサンプルディレクトリ内の、サポートされている各ボードのディレクトリに格納されています。
以下の `board_config.cpp ` は、STM32F769i 向けの実装例です:
#include "stm32f769i_discovery.h" #include "board_config.h" #include "interrupt_queue.h" void ConfigureBoard() { BSP_PB_Init(BUTTON_USER, BUTTON_MODE_EXTI); } extern "C" void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN); HWButtonInput::instance().postEventFromInterrupt(0); }
ConfigureBoard() STM32Cube F7 SDKのBSP_PB_Init() 関数を使用して、STM32F769i-Discoveryボードに搭載されているユーザーボタンを設定するように実装されています。
EXTI0_IRQHandler() は、ボタンが押されるたびにトリガーされる割り込みハンドラです。このハンドラ関数は、STM32 HAL独自の割り込みハンドラを実行した後、HWButtonInput インスタンスのイベントキューにイベントを投稿します。この例では、イベントは値が0の整数です。
main.cpp
main.cpp ファイルは 2 つあり、BareMetal 用とFreeRTOS 用がそれぞれ 1 つずつ用意されています。どちらもinterrupt_handler/os ディレクトリの下にあり、それぞれbaremetal およびfreertos ディレクトリ内に配置されています。
#include "board_config.h" #include "interrupt_handler.h" #include <qul/application.h> #include <qul/qul.h> int main() { Qul::initHardware(); Qul::initPlatform(); ConfigureBoard(); Qul::Application app; static interrupt_handler item; app.setRootItem(&item); app.exec(); return 0; }
main() この関数は、ボードの設定、そのボード上のボタンの設定、Qt Quick Ultraliteアプリケーションの初期化、およびアプリケーションの実行を行います。
注:ここに 示されているmain.cpp は 、BareMetal構成用です。FreeRTOS 構成では、FreeRTOS 固有の設定コードが追加されます。「Qt Quick Ultralite とFreeRTOS の併用」を参照してください。
interrupt_handler.qml
interrupt_handler.qml 画面に表示される UI を宣言します。
import QtQuick 2.15 Rectangle { id: root color: "white" Text { text: "Press the board's user button to\nstop and resume the rectangle" anchors.horizontalCenter: parent.horizontalCenter anchors.top: parent.top } Rectangle { id: rect anchors.verticalCenter: parent.verticalCenter width: 50; height: 50 color: "black" } Timer { id: timer interval: 10 running: true repeat: true onTriggered: { rect.x = ((rect.x + rect.width + 5) % (root.width + rect.width)) - rect.width } }
MouseArea というQMLタイプはタッチ入力を処理し、この例では画面全体を覆っています。この領域がタッチされると、背景の矩形(root )の色が白から黄色に変わります。画面がタッチされていない状態になると、色は再び白に戻ります。
MouseArea { id: ta anchors.fill: parent onPressedChanged: { root.color = pressed ? "yellow" : "white" } }
HWButtonInput.onButtonEvent は、buttonEventシグナルに対応するスロットです。シグナルが発信されると、タイマーの現在の状態に応じて、タイマーが一時停止または再開されます。タイマーが一時停止すると、rect の移動も停止します。
HWButtonInput.onButtonEvent: { timer.running = !timer.running }
ファイル:
- interrupt_handler/CMakeLists.txt
- interrupt_handler/board_config.h
- interrupt_handler/esp32s3box3/board_config.cpp
- interrupt_handler/example/CMakeLists.txt
- interrupt_handler/example/board_config.cpp
- interrupt_handler/interrupt_handler.qml
- interrupt_handler/interrupt_queue.cpp
- interrupt_handler/interrupt_queue.h
- interrupt_handler/mcu_interrupt_handler.qmlproject
- interrupt_handler/mimxrt1050-evk/CMakeLists.txt
- interrupt_handler/mimxrt1050-evk/board.h
- interrupt_handler/mimxrt1050-evk/board_config.cpp
- interrupt_handler/mimxrt1050-evk/nxp_config.c
- interrupt_handler/mimxrt1060-evkb/CMakeLists.txt
- interrupt_handler/mimxrt1060-evkb/board.h
- interrupt_handler/mimxrt1060-evkb/board_config.cpp
- interrupt_handler/mimxrt1060-evkb/nxp_config.c
- interrupt_handler/mimxrt1064-evk/CMakeLists.txt
- interrupt_handler/mimxrt1064-evk/board.h
- interrupt_handler/mimxrt1064-evk/board_config.cpp
- interrupt_handler/mimxrt1064-evk/nxp_config.c
- interrupt_handler/os/baremetal/main.cpp
- interrupt_handler/rh850-d1m1a/CMakeLists.txt
- interrupt_handler/rh850-d1m1a/board_config.cpp
- interrupt_handler/stm32f769i-discovery/CMakeLists.txt
- interrupt_handler/stm32f769i-discovery/board_config.cpp
- interrupt_handler/stm32h750b-discovery/CMakeLists.txt
- interrupt_handler/stm32h750b-discovery/board_config.cpp
特定のQtライセンスの下で利用可能です。
詳細はこちら。