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);

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneOnce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值