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 ライセンスの下で利用可能です。
詳細はこちら。