對於無觸摸的嵌入式設備來說,按鍵就是整個人機交互的入口點,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);