C
Qt Quick Ultralite 中断处理示例
演示如何在Qt Quick Ultralite中处理输入中断。
概述
interrupt_handler
示例展示了如何在Qt Quick Ultralite中处理输入中断,例如触摸屏或按钮输入。它有一个简单的QML UI,其中有一个方框从左向右移动。屏幕在触摸时会改变背景颜色,设备上的按钮按压会暂停和恢复移动。
目标平台
代码概述
代码演示了如何从中断处理程序传输数据。虽然本示例中的输入数据是一个简单的整数,但它也可以更复杂,例如来自温度计的数据。
HWButtonInput
类
HWButtonInput
类提供了一个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,onEvent()
是当事件队列处理事件时触发的事件
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()
实现为配置STM32F769i-Discovery板上找到的用户按钮,使用STM32Cube F7 SDK中的BSP_PB_Init()
函数。
EXTI0_IRQHandler()
是一个在每次按钮按下时触发的中断处理程序。处理程序函数运行 STM32 HAL 的自车主中断处理程序,然后向 HWButtonInput
实例的 事件队列发送一个事件。在这个例子中,事件只是一个值为 0 的整数。
main.cpp
有两个 main.cpp
文件,一个用于裸金属,一个用于 FreeRTOS。它们分别位于 baremetal
和 freertos
目录下的 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 }
文件
- interrupt_handler/CMakeLists.txt
- interrupt_handler/board_config.h
- interrupt_handler/ek-ra6m3g/CMakeLists.txt
- interrupt_handler/ek-ra6m3g/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/stm32f469i-discovery/CMakeLists.txt
- interrupt_handler/stm32f469i-discovery/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 许可协议。
了解更多信息。