对于无触摸的嵌入式设备来说,按键就是整个人机交互的入口点,TinyUI定义了按键接口类TUIKeyInterface,当需要把底层驱动和TinyUI对接时,需要实现一个自定义按键类,继承自TUIKeyInterface接口即可,最后把自定义按键类实例化,并调用TinyUI的按键注册接口TUIRegisterKeyInterface即可。
TUIKeyInterface只有一个方法需要开发人员实现,即registerCallback(),当驱动把自定义按键类实例注册到TinyUI时,TinyUI注册回调方法给驱动,当按钮产生中断时调用该接口注册的回调方法即可,TUIKeyInterface定义如下:
#ifndef __TUI_KEY_INTERFACE_H__
#define __TUI_KEY_INTERFACE_H__
#include <TUIVKCode.h>
#include <TUIAction.h>
typedef void (*KeyCallback)(TUIACTION_KEY action, TUIVKCode keyCode);
class TUIKeyInterface
{
public:
virtual void registerCallback(KeyCallback callback) = 0;
};
#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 <TUIKeyInterface.h>
class UIKey : public TUIKeyInterface
{
public:
UIKey();
virtual ~UIKey();
public:
void registerCallback(KeyCallback callback);
private:
input_t *input = nullptr; // 驱动中的按键实例/对象
};
#endif
UIKey.cpp
#include <UIKey.h>
#include <TUIVKCode.h>
#include <TUIAction.h>
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);