当前位置: 首页 > news >正文

判断按键值_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)。

ac946db462cc10e253b1d8dff368fe63.png

相关文章:

  • 布局pd_PD-1/L1之后,肿瘤免疫疗法的这些方向也可能成为爆款!
  • 怎么投屏_手机投屏竖屏显示器怎么全屏
  • c++ map作为返回值_详解 C++ STL 中 map::erase 的正确姿势
  • python试卷(有答案版本、个人答案不是官方答案)_python试卷(有答案版本,个人答案不是官方答案)(精品文档)_共7页...
  • echarts 饼图进度条_Echarts实现环状半圆形饼图
  • 多开脚本_现阶段魔兽世界怀旧服晚上脚本成灾?G币会暴跌吗?
  • c#split方法拆分为数据_C#:使用String.Split方法在每个单独的行中拆分字符串列表?...
  • 压缩图片_图片压缩
  • python随机数应用_Python中随机数的使用于详细讲解
  • 生成图片_ThinkPHP5 动态生成图片缩略图
  • c++max函数怎么用_比函数还强大的Excel分列技巧,你知道怎么用吗
  • mysql2005错误_SQL Server 2005 还原数据库错误解决方法
  • mysql中取字符串函数是_MySQL 字符串函数:字符串截取
  • mysql查询时间提前五天_MySQL查询不含周末的五天前的日期
  • elasticsearch 嵌入式_3.JanusGraph+HBase+ElasticSearch配置
  • 分享一款快速APP功能测试工具
  • 4. 路由到控制器 - Laravel从零开始教程
  • CSS中外联样式表代表的含义
  • github从入门到放弃(1)
  • Magento 1.x 中文订单打印乱码
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 初探 Vue 生命周期和钩子函数
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 今年的LC3大会没了?
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 树莓派 - 使用须知
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #QT(智能家居界面-界面切换)
  • (26)4.7 字符函数和字符串函数
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (二十三)Flask之高频面试点
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (一)UDP基本编程步骤
  • (一)VirtualBox安装增强功能
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ***详解账号泄露:全球约1亿用户已泄露
  • .bat批处理出现中文乱码的情况
  • .Net 8.0 新的变化
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .sdf和.msp文件读取
  • @property @synthesize @dynamic 及相关属性作用探究
  • [20150321]索引空块的问题.txt
  • [Android View] 可绘制形状 (Shape Xml)
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [HCIE] IPSec-VPN (手工模式)
  • [InnoDB系列] -- SHOW INNODB STATUS 探秘
  • [iOS]-网络请求总结
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流