LVGL学习(4):输入设备的四种类型及物理按键的实现

2023-11-16

在有一些场合中,如野外情况,可能我们会选择使用物理按键来控制LVGL,而不是使用触摸屏。所以本篇文章就以物理键盘为例来介绍一下如何自定义输入设备与LVGL进行交互。

1 输入设备类型

对于键盘、触摸屏、编码器等输入设备,都可以与LVGL进行交互。我们只需要将输入设备注册到LVGL的输入设备结构体lv_indev_drv_t中即可。输入设备的类型,有以下几种选择:

typedef enum {
    LV_INDEV_TYPE_NONE,    /**< Uninitialized state*/
    LV_INDEV_TYPE_POINTER, /**< Touch pad, mouse, external button*/
    LV_INDEV_TYPE_KEYPAD,  /**< Keypad or keyboard*/
    LV_INDEV_TYPE_BUTTON,  /**< External (hardware button) which is assigned to a specific point of the screen*/
    LV_INDEV_TYPE_ENCODER, /**< Encoder with only Left, Right turn and a Button*/
} lv_indev_type_t;

先来分析一下这四种输入设备有什么区别,具体源码请参考lv_indev_read_timer_cb函数:
(1)LV_INDEV_TYPE_POINTER
主要用于触摸屏、鼠标,所以它的输入处理函数indev_pointer_proc就是判断当前触摸屏返回的位置处是不是有组件存在,若有且触摸释放了,则会执行对应组件的Clicked动作。
(2)LV_INDEV_TYPE_KEYPAD
它的输入处理函数indev_keypad_proc中,就根据输入的不同按键(Prev,Next,ESC,Enter等)对Keypad所绑定的group内的组件进行操作,如焦点的切换、进度条的滑动。比如说对于一个Table来说,里面的数据很多,有一个滑动条,这个滑动条就受LV_KEY_UPLV_KEY_Down键控制;而对于一个Tabview来说,Tab的切换则是受LV_KEY_LEFTLV_KEY_RIGHT键控制。而Group中的组件之间的焦点切换则是通过LV_KEY_PREVLV_KEY_NEXT键切换。
(3)LV_INDEV_TYPE_BUTTON
就是一个按键,适用于GUI中焦点永远在某一个组件上的情况。按下物理按键就代表GUI中的按键按下。
(4)LV_INDEV_TYPE_ENCODER
一个编码器应该只能左右旋转,也就是支持LV_KEY_LEFTLV_KEY_RIGHT。但在LVGL的源码中,编码器除了左右外,还保留了LV_KEY_ENTERLV_KEY_ESC两个按键触发的代码,用户可以根据自己的情况触发这两个按键,适用于编码器和按键的组合情况。

2 物理键盘实现

经过上面的分析,我们知道对于物理键盘应该选择LV_INDEV_TYPE_KEYPAD,这样我们就可以完成各个组件焦点的切换、滑动条上下移动等操作。

2.1 输入设备驱动注册

在函数lv_port_indev_init中,默认有触摸设备LV_INDEV_TYPE_POINTER的注册代码,这里我们仿照触摸设备,写一个物理按键的注册代码:

static lv_indev_drv_t keypad_drv;
lv_indev_drv_init(&keypad_drv);
keypad_drv.type    = LV_INDEV_TYPE_KEYPAD;
/* 回调函数:通过这个函数读取输入设备的值 */
keypad_drv.read_cb = keypad_read;
indev_keypad = lv_indev_drv_register(&keypad_drv);

通过前面的分析,我们知道LV_KEY_PREVLV_KEY_NEXT两个按键可以切换焦点,而焦点是基于组中的组件进行切换的,最后还需要绑定Keypad输入设备对应的组。

group = lv_group_create();
lv_indev_set_group(indev_keypad, group); 
lv_group_set_default(group);

2.2 按键驱动的实现

首先我们要实现按键的驱动,比如物理按键有四个,左、右、退出和确定,分别对应LV_KEY_LEFTLV_KEY_RIGHTLV_KEY_ESCLV_KEY_ENTER

对于硬件上来说,在按键处接了电容,所以不用消抖。我们就打开硬件上按键所对应引脚的上升沿/下降沿中断,然后在中断中返回我们的按键即可。这里我们默认数字0为没有任何按键按下,数字1~4分别对应物理按键的四种,在中断中将这个数字赋值给curKey变量。然后定义一个按键读取函数,代码如下所示:

static uint8_t curKey
uint8_t button_read()
{
	uint8_t tmp = curKey;
	curKey = 0;
	return tmp;
}

我们注意到前面注册输入设备驱动的时候,还有一个回调函数:keypad_drv.read_cb = keypad_read,LVGL就会周期性调用这个函数来判断是否有按键按下,按键的扫描频率可以通过修改下面的宏定义改变。

#define LV_INDEV_DEF_READ_PERIOD       10

现在我们需要通过keypad_read函数将我们的物理按键和与LVGL中的左、右、退出和确定对应起来,代码如下:

static void keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static uint32_t last_key = 0;
    uint32_t act_key = button_read();
    if(act_key != 0) {
        data->state = LV_INDEV_STATE_PR;
        switch(act_key)
        {
	        case 1:
	            act_key = LV_KEY_LEFT;
	            break;
	        case 2:
	            act_key = LV_KEY_RIGHT;
	            break;
	        case 3:
	            act_key = LV_KEY_ESC;
	            break;
	        case 4:
	        	act_key = LV_KEY_ENTER;
	        default:
	        	break;
        }
        last_key = act_key;
    } else {
        data->state = LV_INDEV_STATE_REL;
    }
    data->key = last_key;
}

上面的函数就是在有按键按下时,赋值对应的LVGL按键宏给data->key,而在没有按键按下时,data->key就等于上一次按下的键。而data->state变量则是判断按键按下后是否松开,比如对于按键的回调函数来说,可以设置ClickedReleased时触发GUI中的按键,对于Clicked来说,按下不松开就触发按键回调函数,而Released则需要按下后放开才会触发按键回调函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LVGL学习(4):输入设备的四种类型及物理按键的实现 的相关文章

  • Javescribt Library Javescript 库 总结

    Yahoo User Interface Library YUI Library YUI is a free open source JavaScript and CSS library for building richly intera
  • Qt——用于表格QTableView的模型

    如果想使用表格来呈现数据 Qt提供了一个方便的部件QTableWidget 但是直接用它实现一些功能可能比较困难 这里将介绍一种强大 灵活的方式来操作表格 一 模型 视图架构 在这个架构中 模型用于存储数据 视图用于呈现数据 除此之外 还有
  • 优秀软件测试工程师必备的8个能力!-(附思维导图)

    结合自己以往的工作经验 自己梳理出来一些材料 绝对原创 绝对干货 优秀的软件测试工程师必备的 8个能力 作为一名软件工程师 需要的能力并不多 但是要成为一名优秀的软件测试工程师 需要的能力就比较多了 自己整理出来8个方面 每个方面都会分成很
  • element-ui中$confirm弹出框的确定和取消按钮互换位置

    element ui中 confirm弹出框的确定和取消按钮互换位置 1 定位元素 2 找到元素class 通过flex布局 进行位置更换 3 app vue中 进行全局修改 确认窗 取消确认按钮位置更换 el message box wr
  • Java课程设计之学习成绩管理系统

    package System import java awt import java awt event import java io import javax swing import javax swing table Abstract
  • 分享 20 道关于 React 开发相关的面试题及答案

    React 面试可能你会觉得有点吓人 为了帮助您自信并准备好迎接下一次面试 我们列出了 20 个常见的 React 问题和参考答案 希望通过本篇文章的内容 能够帮助你重新温习你的 React 知识 复习重要概念 并为你的下一次面试做好更充分
  • 24.qint64转QString 以及获取文件属性

    qint64转QString 1 qint64 size info size 2 qint64 转QString 3 QString size2 tr 1 arg size 获取文件属性 1 include mainwindow h 2 i
  • app上架流程的整理

    app的上架流程 一 准备工作 首先需要有开发者账号 企业级的账号是299 个人开发者账号是99 没有的话可以登录http developer apple com 自行申请 假如你已经有账号了 进入苹果官网点击Accout登录 二 申请证书
  • 关于UI适配的文档

    第一部分 原理 1 根据当前屏幕尺寸与开发预设屏幕尺寸尺寸得出以下参数 1 XRatio 当前屏幕尺寸与开发尺寸的X轴比例 2 YRtaio 当前屏幕尺寸与开发尺寸的Y轴比例 3minRatio XRatio与YRtaio中的较小值 2 之
  • 一些大厂的开源平台

    百度 http fex baidu com http efe baidu com 饿了么 https fe ele me 腾讯 http www alloyteam com 美团 https tech meituan com 滴滴 http
  • UE4命令行使用,解释

    命令行在外部 从命令行运行编辑项目 1 导航到您的 LauncherInstall VersionNumber Engine Binaries Win64 目录中 2 右键单击上 UE4Editor exe 的可执行文件 并选择创建快捷方式
  • Qt—帮助系统

    一个完善的应用程序应该提供尽可能丰富的帮助信息 Qt中可以使用工具提示 状态提示以及 What s This 等简单的帮助提示 也可以使用Qt Assistant来提供强大的在线帮助 简单的帮助提示 已经讲到了工具提示和状态提示 这里简单介
  • Consul服务注册与发现

    目录 一 Consul简介 一 官网 二 特点 二 安装并运行Consul 一 官网安装说明 二 下载 三 使用开发模式启动 三 服务提供者 四 服务消费者 五 三个注册中心异同点 一 CAP理论 二 AP架构 三 CP架构 一 Consu
  • 探索创意无限的Photoshop CC 2020Mac/Win版

    作为一款功能强大的图像处理软件 Photoshop CC 2020 简称PS 2020 在全球范围内备受设计师 摄影师和艺术家的喜爱和推崇 它不仅为用户提供了丰富多样的工具和功能 还不断推出新的创意特效和改进的功能 让用户的创意无限延展 首
  • UI自动化测试方案

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 3k次 点赞60次 收藏8次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自动
  • APP UI自动化测试思路总结

    首先想要说明一下 APP自动化测试可能很多公司不用 但也是大部分自动化测试工程师 高级测试工程师岗位招聘信息上要求的 所以为了更好的待遇 我们还是需要花时间去掌握的 毕竟谁也不会跟钱过不去 接下来 一起总结一下APP UI自动化测试的思路吧
  • WPF-UI HandyControl 控件简单实战

    文章目录 前言 UserControl简单使用 新建项目 直接新建项目 初始化UserControl Geometry 矢量图形 额外Icon导入
  • element ui弹窗在别的弹窗下方,优先级不高的问题

    在 弹窗 的标签中加入append to body即可解决该问题
  • HarmonyOS鸿蒙开发指南:容器组建 tabs开发指导

    目录 创建Tabs 设置Tabs方向 设置样式 显示页签索引 场景示例 创建Tabs 在pages index目录下的hml文件中创建一个Tabs组件 div class container div
  • 界面控件DevExpress WPF属性网格 - 让应用轻松显示编辑各种属性事件

    DevExpress WPF Property Grid 属性网格 灵感来自于Visual Studio Visual Studio启发的属性窗口 对象检查器 让在WPF应用程序显示和编辑任何对象的属性和事件变得更容易 P S DevExp

随机推荐