TinyUI-按鍵對接

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章