このページでは

C

Qt Quick Ultralite interrupt_handler の例

Qt Quick Ultralite における入力割り込みの処理方法を示します。

概要

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

Interrupt_handler の例。白い画面に、小さな黒い四角形が水平方向に移動する様子を示しています。

対象プラットフォーム

コードの概要

このコードは、割り込みハンドラからデータを転送する方法を示しています。この例では入力データは単純な整数ですが、温度計からのデータなど、より複雑なデータでも処理可能です。

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 UltraliteFreeRTOS の併用」を参照してください。

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
    }

ファイル:

特定の Qt ライセンスの下で利用可能です。
詳細はこちら。