LVGL7.5版本 触摸与键盘输入(API)对接(一)

2023-11-12

LVGL7.5版本 触摸与键盘输入(API)对接(一)

前言:

  • 前提条件:
  • 已完成移植lvgl
  • 本篇文章将重点讲解Keypad键盘按键

一、indev输入设备的种类介绍

  1. Touchpad (触摸板,例如电容屏、电阻屏等)
  2. Mouse (鼠标)
  3. Keypad (键盘)
  4. Encoder (编码器)
  5. Button (外部按键)

二、移植Touchpad与Keypad

void lv_port_indev_init(void)
{
    lv_indev_drv_t indev_drv;

    /*------------------
     * Touchpad
     * -----------------*/
	//触摸屏
    /*Initialize your touchpad if you have*/
    touchpad_init();

    /*Register a touchpad input device*/
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_POINTER;
    indev_drv.read_cb = touchpad_read;
    indev_touchpad = lv_indev_drv_register(&indev_drv);

	//按键
	    /*------------------
     * Keypad
     * -----------------*/

    /*Initialize your keypad or keyboard if you have*/
    keypad_init();

    /*Register a keypad input device*/
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_KEYPAD;
    indev_drv.read_cb = keypad_read;
    indev_keypad = lv_indev_drv_register(&indev_drv);
		
    /* Later you should create group(s) with `lv_group_t * group = lv_group_create()`,
     * add objects to the group with `lv_group_add_obj(group, obj)`
     * and assign this input device to group to navigate in it:
     * `lv_indev_set_group(indev_keypad, group);` */
}

Touchpad

触摸屏移植只需要结合自己的TP驱动完成这两个函数

/*Return true is the touchpad is pressed*/
static bool touchpad_is_pressed(void)
{	
	  if (TouchItOccurred == SET)
    {
      TouchItOccurred = RESET;
			/*Your code comes here*/
			//判断是否有被按下
			BSP_TS_GetState(&TS_State);
			if(TS_State.touchDetected)
			{
				if(TS_State.touchEventId[0]==0x03)
				{
					return true;
				}
			}
	  }
    return false;
}

/*Get the x and y coordinates if the touchpad is pressed*/
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{
		BSP_TS_GetState(&TS_State);
		if(TS_State.touchDetected)
		{
    	/*Your code comes here*/
    	//按下所获得的坐标
		(*x) = TS_State.touchX[0];
    	(*y) = TS_State.touchY[0];
		}			
		//log("x %d,y %d",TS_State.touchX[0],TS_State.touchY[0]);

}

Keypad

目前只做了一个按键返回值做为测试

/* Will be called by the library to read the mouse */
static bool keypad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static uint32_t last_key = 0;

    /*Get the current x and y coordinates*/
    mouse_get_xy(&data->point.x, &data->point.y);

    /*Get whether the a key is pressed and save the pressed key*/
    uint32_t act_key = keypad_get_key();
    if(act_key != 0) {
        data->state = LV_INDEV_STATE_PR;
        /*Translate the keys to LVGL control characters according to your key definitions*/
        switch(act_key) {
        case 1:
            act_key = LV_KEY_NEXT;
            break;
        case 2:
            act_key = LV_KEY_PREV;
            break;
        case 3:
            act_key = LV_KEY_LEFT;
            break;
        case 4:
            act_key = LV_KEY_RIGHT;
            break;
        case 5:
            act_key = LV_KEY_ENTER;
            break;
        }

        last_key = act_key;
    } else {
        data->state = LV_INDEV_STATE_REL;
    }

    data->key = last_key;

    /*Return `false` because we are not buffering and no more data to read*/
    return false;
}


/*Get the currently being pressed key.  0 if no key is pressed*/
static uint32_t keypad_get_key(void)
{
		uint8_t key_val=0;
    /*Your code comes here*/
    	//读取按键是否被按下
		key_val=KEY_Scan(0);
		if(key_val>0)
		return key_val;
    return 0;
}

Keypad测试示例

此测试利用tabview创建tab1与tab2,在两个tab分别使用不同的图片,按下按键由tab1->tab2,再次按下又由tab2->tab1

lv_obj_t *nihao;
lv_obj_t *tab1;
lv_obj_t *tab2;
lv_group_t *test_group;		//定义一个新的对象组
LV_IMG_DECLARE(huoxingtest); //此处为测试定义的图片
LV_IMG_DECLARE(muxingtest);//此处为测试定义的图片
extern lv_indev_t * indev_keypad;

static void event_callback(lv_obj_t * obj, lv_event_t event)
{
	if(event == LV_EVENT_KEY){
		const uint32_t *key = lv_event_get_data();	
		if(*key == LV_KEY_RIGHT){
			if(obj==tab1)
			{
				lv_group_focus_next(test_group);//切换焦点obj
				lv_tabview_set_tab_act(nihao,1,LV_ANIM_OFF);
			}
			else if(obj==tab2)
			{
				lv_group_focus_prev(test_group);
				lv_tabview_set_tab_act(nihao,0,LV_ANIM_OFF);
			}
		}
	}
}

void app_test(void)
{
	test_group=lv_group_create();	//创建对象组
	lv_indev_set_group(indev_keypad,test_group);	//关联输入设备与对象组
	
	
	nihao=lv_tabview_create(lv_scr_act(),NULL);
	lv_obj_set_pos(nihao,0,0);
	lv_obj_set_size(nihao,390,390);
	lv_tabview_set_btns_pos(nihao,LV_TABVIEW_TAB_POS_NONE);
	lv_obj_set_style_local_border_width(nihao,LV_PAGE_PART_BG,LV_STATE_DEFAULT,0);
	lv_obj_set_style_local_bg_color(nihao,LV_PAGE_PART_BG,LV_STATE_DEFAULT,LV_COLOR_BLACK);
	
	tab1=lv_tabview_add_tab(nihao,"tab1");
	lv_page_set_scrlbar_mode(tab1,LV_SCRLBAR_MODE_OFF);
	lv_obj_t *img1=lv_img_create(tab1,NULL);
	lv_obj_set_pos(img1,0,0);
	lv_img_set_src(img1,&huoxingtest);
	lv_obj_set_event_cb(tab1,event_callback);
	
	tab2=lv_tabview_add_tab(nihao,"tab2");
	lv_page_set_scrlbar_mode(tab2,LV_SCRLBAR_MODE_OFF);
	lv_obj_t *img2=lv_img_create(tab2,NULL);
	lv_obj_set_pos(img2,0,0);
	lv_img_set_src(img2,&muxingtest);
	lv_obj_set_event_cb(tab2,event_callback);

	lv_group_add_obj(test_group,tab1);
	lv_group_add_obj(test_group,tab2);
	
	lv_group_set_editing(test_group,false);

}

本篇完

总结:按键触发响应,需要将对象加入group中,通过焦点的切换完成对event事件具体的响应,KEY值做出对应的策略,目前只做了一个按键对应的KEY的测试,后续将测试不同键值对应的操作,如果文中有不正确的地方,欢迎赐教!!!

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

LVGL7.5版本 触摸与键盘输入(API)对接(一) 的相关文章

  • 西门子S7-1200 PLC选型前这些要了解

    西门子S7 1200PLC是西门子S7系列PLC产品中一员 S7系列产品包含有 S7 200 Smart 200 S7 1200 S7 300 S7 1500 S7 400等系列PLC 其中S7 200 Smart 200 S7 1200系
  • 数据集下载OTB,VOT,UAV,鸢尾花

    OTB数据集下载百度网盘链接 链接 https pan baidu com s 1snsJF 7Sw EbKtzdvLO1nw 提取码 ls23 VOT数据集下载百度网盘链接 链接 https pan baidu com s 1UiTG1z
  • 数据下载网站整理

    数据十分重要 如何找到理想的数据显得更重要了 这里记录自己经过网上查询到的数据 进行整理 如果侵权 请联系我删除 再次感谢网友大佬们提供的资料 1 中国气象站点数据 下载地址 https www resdc cn data aspx DAT
  • 为什么计算机中的整数要用补码表示?补码表示有什么好处?

    为什么计算机中的整数要用补码表示 补码表示有什么好处 在计算机中 补码可谓是十分神奇而又重要的存在 我们知道整数在计算机内部的机器数一般都是补码表示的 这里给出几个这样表示的好处 符号位可以和数值为一起参加运算 比如俩个负数相加 只要结果在
  • UG NX10.0软件安装教程

    软件下载 名称 UG NX 10 0 语言 简体中文 安装环境 Windows 下载链接 链接 https pan baidu com s 1SkskLU2CYLQznfGWM7O4HQ 提取码 ersv 安装中有问题请咨询管家微信 don
  • 工业安全生产信息化平台的基本架构和关键功能分享

    工业安全生产信息化平台是指利用信息技术手段 将工业安全生产管理与数据采集 传输 处理相结合 实现对工业安全生产全过程的数字化 信息化 智能化管理的平台 它通过集成多种信息系统和设备 实现对重大危险源监控预警 安全风险分级管控 安全生产一张图
  • C# Socket连接请求超时处理

    在Socket的超时时间默认20多秒 而实际连上不需1秒时间 20多秒很多时候用户是不能接受的 而在等待返回结果的这段时间里程序会处于停止响应状态 废话不多说了 先上代码 private delegate string ConnectSoc
  • Windows环境下使用GTK

    一 前言 维基百科 GTK 原名GTK 最初是GIMP的专用开发库 GIMP Toolkit 后来发展为Unix like系统下开发图形界面的应用程序的主流开发工具之一 GTK是自由软件 并且是GNU计划的一部分 自2019年2月6日起 G
  • 【Android Studio】Design editor is unavailable until next gradle sync.如何解决?

    Design editor is unavailable until next gradle sync 如何解决 打开一个网上开源的下载文件 在查看安卓页面布局 也就是控件布局时 会出现一个bug Design editor is unav
  • 突发!ITELLYOU要改版了!

    微信公众号 网管小贾 个人博客 www sysadm cc 经常下载Windows系统镜像的老司机中 我敢保证十之八九对 MSDN 我告诉你 这个网站再熟悉不过 可是对于新手小白们来说 这个站TA究竟是个啥 其实 MSDN 我告诉你 是个名
  • TRMF 辅助论文:最小二乘法复现TRMF

    1 目标函数 总 论文笔记 Temporal Regularized Matrix Factorization forHigh dimensional Time Series Prediction UQI LIUWJ的博客 CSDN博客 1
  • GitHub Action入门简介

    1 What is GitHub Actions GItHub Actions是一个持续集成和持续交付的平台 能够让你自动化你的编译 测试和部署流程 GitHub 提供 Linux Windows 和 macOS 虚拟机来运行您的工作流程
  • 什么是离岸公司?有什么作用?

    离岸公司是泛指在离岸法区内依据其离岸公司法规范成立的有限责任公司或股份有限公司 这些公司不能在注册地经营 而主要是在离岸法区以外的地方开展业务活动 离岸公司的主要特点包括高度保密性 无外汇管制和减免税务负担 离岸公司的作用主要有以下几个方面
  • MacBook电脑内存容量小根本不够用?如何一键解决?

    得益于M1系列芯片的强势表现 很多朋友都换用了MacBook 首次接触到了macOS系统 但出乎意料的是 很多人就开始受罪了 明明这么出色的硬件 为何到处都不顺手呢 尤其是容量 MacBook相比同价位的Windows笔记本 硬盘本来就偏小
  • FL Studio21.2.2963水果音乐软件安装

    FL Studio是功能强大的音乐制作解决方案 使用旨在为用户提供一个友好完整的音乐创建环境 让您能够轻松创建 管理 编辑 混合具有专业品质的音乐 一切的一切都集中在一个软件中 只要您想 只要您需要 它总能满足您的音乐需求 工具方面 包括强
  • 最具挑战的骑行路线

    1 318川藏线 2 独库公路 561公里 3 珠峰尼泊尔 1000公里 4 沙漠公路 1800公里 5 219新藏线 2500公里 下面是一些别人的骑行记录 证书或奖牌 参考 1 抖音 Max骑行玩家 https v douyin com
  • CSDN找到“仅我可见”内容

    有时候自己做一些笔记参考了他人的内容 所以想将文章转为 仅自己可见 仅作自用 记录一下CSDN找私密文章的方式 今天摸了好一会儿才找到哈哈哈 1 点击导航栏处的创作中心进入 2 查看更多 3 点击浏览就可以查看啦 来源 CSDN找到 仅我可
  • easyrecovery软件2025免费版电脑数据恢复软件

    easyrecovery14是easyrecovery系列软件的新版本 也是目前行业领先的数据恢复软件 具备更快捷 更高效 更便捷三大特色 能够帮助用户轻松恢复电脑丢失的数据 目前软件支持恢复不同存储介质数据 包括硬盘 光盘 U盘 移动硬盘
  • 看完这篇 教你玩转镜像转换神器qumu实现虚拟机做题自由!

    前言 最近有小伙伴说比赛没设备 问有没有不需要设备也能实现做题自由的方法 今天这里分享一期 看完这篇你将学会 使用 qumu 转换镜像格式 一般我们做题都是 img 格式的环境 需要导入设备 有些小伙伴没有设备 就可以使用这种方法 把 im
  • 液晶偏振光栅

    1 偏振 光是横波 在垂直于光的传播方向的平面内光波振动 即E矢量振动 各方向振幅都相等的光为自然光 只在某一方向有光振动的光称为线偏振光 各方向光振动都有 但振幅不同的光叫部分偏振光 螺旋着振动的光称圆偏振光 分旋和右旋 2 庞加莱球表示

随机推荐