判断按键值_TinyUI(嵌入式UI库)-按键移植
TinyUI是一套用于嵌入式开发的UI库。
TinyUI定义了与windows类似的虚拟按键码,一般嵌入式设备可能会有物理按键,物理按键可以与虚拟键码绑定/关联,期望当按下物理按键后(需把虚拟键码和界面元素进行绑定),界面可以得到相应并执行相应的操作。
对于无触摸的嵌入式设备来说,按键就是整个人机交互的入口点,TinyUI定义了按键接口类TUIKeyInterface,当需要把底层驱动和TinyUI对接时,需要实现一个自定义按键类,继承自TUIKeyInterface接口即可,最后把自定义按键类实例化,并调用TinyUI的按键注册接口TUIRegisterKeyInterface即可。
TUIKeyInterface只有一个方法需要开发人员实现,即registerCallback(),当驱动把自定义按键类实例注册到TinyUI时,TinyUI注册回调方法给驱动,当按钮产生中断时调用该接口注册的回调方法即可,TUIKeyInterface定义如下:
#ifndef __TUI_KEY_INTERFACE_H__#define __TUI_KEY_INTERFACE_H__#include #include typedef void (*KeyCallback)(TUIACTION_KEY action, TUIVKCode keyCode);class TUIKeyInterface{public: virtual void registerCallback(KeyCallback callback) = 0; // TinyUI向驱动层注册回调};#endif // !__TUI_KEY_INTERFACE_H__
该回调方法有2个参数分别是TUIACTION_KEY和TUIVKCode,TUIACTION_KEY代表按键是按下还是弹起,其定义如下:
enum class TUIACTION_KEY : uint8_t{ TUI_DOWN, // 按键按下(物理按键) TUI_UP, // 按键弹起(物理按键)};
TUIVKCode是TinyUI定义的虚拟按键码,其定义了大部分常用快捷键如F1~F12,上、下、左、右等等,移植时根据实际情况发出对应的键码和动作(按下还是弹起)。
移植
1. 自定义按键类,并继承自TUIKeyInterface
UIKey.h
#ifndef __UI_KEY_H__#define __UI_KEY_H__#include "device_driver_ioc.h"#include class UIKey : public TUIKeyInterface{public: UIKey(); virtual ~UIKey();public: void registerCallback(KeyCallback callback); // 调用TUIRegisterKeyInterface(key)注册物理按键后,TinyUI将注册回调函数到驱动层,以响应按键事件private: input_t *input = nullptr; // 驱动中的按键实例/对象};#endif
UIKey.cpp
#include #include #include KeyCallback gCallBack = nullptr; // 定义TinyUI回调接口/* 由于驱动中的按键键码定义和TinyUI所定义键码不一致,把该方法注册到驱动作为回调 当有按键产生时,在该方法中调用gCallBack,把按键传递到TinyUI中*/void UIKey_input_input_callback(enum VK_ACT act, enum VK_CODE vcode){ if (nullptr == gCallBack) // 判断TinyUI是否注册了回调 { return; } TUIACTION_KEY action; uint32_t vk = (uint32_t)vcode; // 驱动和TinyUI按键值都是枚举,转换一次 /* 按键中断定义的按下和抬起与TinyUI不一致,此处转换一次 */ if (VACT_DOWN == act) { action = TUIACTION_KEY::TUI_DOWN; // 按下 } else if (VACT_UP == act) { action = TUIACTION_KEY::TUI_UP; // 弹起 } gCallBack(action, (TUIVKCode)vk); // 调用TinyUI的回调函数}UIKey::UIKey(){ input = (input_t *)device_driver_autowired(DDTYPE_INPUT, DDID_INPUT_BUTTON); // 使用依赖注入技术获取驱动的按键实例 if (nullptr != input) { input->ops->register_input_callback(UIKey_input_input_callback); // 把UIKey_input_input_callback注册到按键中断回调中 input->ops->open(); // 打开按键驱动 }}UIKey::~UIKey(){ input->ops->close(); // 关闭按键驱动}void UIKey::registerCallback(KeyCallback callback){ gCallBack = callback; // gCallBack指向TinyUI的回调函数}
2. 实例化UIKey并注册到TinyUI中
UIKey* key = new UIKey();TUIRegisterKeyInterface(key); // 把UIKey注册到TinyUI中,当物理按键按下后,TinyUI将可以得到按键事件
至此,TinyUI可以响应物理按键了(如TUIButton,TUIListView等界面元素可以绑定键码)
注:本示例中的芯片为ST的STM32F103芯片,驱动使用了类似linux的总线,所有驱动都挂载在该总线上,通过设备名或id获取对应的驱动对象(如uart_t/iic_t/spi_t/lcd_control_t)。