このページでは

C

Qt Quick ウルトラライト割り込みハンドラの例

Qt Quick Ultraliteで入力割り込みを処理する方法を示す。

概要

interrupt_handler のサンプルは、Qt Quick Ultralite でタッチスクリーンやボタン入力のような入力割り込みを処理する方法を示しています。シンプルなQML UIを持ち、ボックスが左から右に移動します。タッチするとスクリーンの背景色が変わり、デバイスのボタンを押すと動きが一時停止したり再開したりします。

対象プラットフォーム

コードの概要

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

HWButtonInput クラス

HWButtonInput クラスはC++インターフェースを提供し、ボタン押下イベントを interrupt_handler.qml.このクラスは Qul::SingletonQul::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 example ディレクトリの、サポートされている各ボードのディレクトリの下にあります。

次の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() ハンドラ関数は、STM32Cube F7 SDK の 関数を使用します。ハンドラ関数は STM32 HAL 自身の割り込みハンドラを実行し、HWButtonInput インスタンスのイベント・キューにイベントをポストします。この例では、イベントは値 0 の単なる整数です。

main.cpp

main.cpp ファイルは 2 つあり、BareMetal 用とFreeRTOS 用にそれぞれ 1 つずつあります。どちらもinterrupt_handler/os ディレクトリの下にあり、それぞれbaremetalfreertos ディレクトリにある。

#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- 特有の構成コードを追加します。 FreeRTOSQt Quick Ultralite を使用するを参照してください。

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
    }

ファイル


詳細はこちらをご覧ください。