C

Qt Quick Ultralite 中断处理示例

演示如何在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,onEvent()是当事件队列处理事件时触发的事件

void HWButtonInput::onEvent(const HWButtonEvent &inputEvent)
{
    buttonEvent(inputEvent);
}
board_config.hboard_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()实现为配置STM32F769i-Discovery板上找到的用户按钮,使用STM32Cube F7 SDK中的BSP_PB_Init()函数。

EXTI0_IRQHandler() 是一个在每次按钮按下时触发的中断处理程序。处理程序函数运行 STM32 HAL 的自车主中断处理程序,然后向 HWButtonInput 实例的 事件队列发送一个事件。在这个例子中,事件只是一个值为 0 的整数。

main.cpp

有两个 main.cpp 文件,一个用于裸金属,一个用于 FreeRTOS。它们分别位于 baremetalfreertos 目录下的 interrupt_handler/os 目录中。

#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 是用于裸金属配置的。FreeRTOS 配置会添加 FreeRTOS 特定的配置代码。请参阅 使用 FreeRTOS 与 Qt Quick Ultralite

interrupt_handler.qml

interrupt_handler.qml 声明了在屏幕上显示的用户界面。

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 是按钮事件信号的槽。当信号被触发时,根据计时器的当前状态暂停或恢复计时器。暂停计时器阻止 rect 移动。

    HWButtonInput.onButtonEvent: {
        timer.running = !timer.running
    }

文件

在本许可下可用的 Qt 许可协议。
了解更多信息。