17. 使用 tslib 库

1. tslib 简介

tslib 是专门为触摸屏设备所开发的 Linux 应用层函数库,并且是开源。tslib 为触摸屏驱动和应用层之间的适配层, 它把应用程序中读取触摸屏 struct input_event 类型数据(这是输入设备上报给应用层的原始数据)并进行解析的操作过程进行了封装,向使用者提供了封装好的 API 接口。tslib 从触摸屏中获得原始的坐标数据, 并通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的触摸屏坐标转换为相应的屏幕坐标。

2. tslib 移植

2.1 下载 tslib 源码

下载源码包:git源码地址,我下载的是 1.16
在这里插入图片描述

2.2 编译 tslib 源码

将上面下载的文件拷贝到系统根目录下。解压tar -xzf tslib-1.16.tar.gz,在家目录下创建 tools/tslib 目录。
进入解压后的目录中,使用source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi设置交叉编译工具;./configure --host=arm-poky-linux-gnueabi --prefix=/home/dnkrc/tools/tslib/ 执行配置,注意将dnkrc替换为你的地址。然后 make,再 make install 安装。

2.3 tslib 安装目录下的文件夹介绍

在这里插入图片描述
bin: 一些 tslib 提供的小工具,用于测试触摸屏
etc: 有一个配置文件 ts.conf,直接使用默认的就好
include: 只有一个头文件tslib.h,包含一些结构体以及接口的声明
lib: 包含了编译 tslib 源码得到的库文件,默认都是动态
share: 可忽略

2.4 在开发板上测试 tslib

将 tslib 目录下的一些文件拷贝到开发板系统目录下。

  • bin 目录下所有可执行文件拷贝到开发板 /usr/bin 目录下
  • etc 目录下的配置文件 ts.conf 拷贝到开发板 /etc 目录下
  • lib 目录下的所有库文件拷贝到开发板 /usr/lib 目录下
    在开发板系统中,还需要配置一些环境变量。
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts

如果想每次启动系统都能生效,可以把这些命令放置在/etc/profile 脚本中执行

3. tslib 库函数介绍

3.1 打开触摸屏设备

#include <tslib.h>
struct tsdev *ts_open(const char *dev_name,int nonblock);
struct tsdev *ts_setup(const char *dev_name,int nonblock);
int ts_clock(struct tsdev *);

上面两个函数都可以打开触摸屏设备
dev_name: 指定了触摸屏的设备节点,对于 ts_setup 可以设备为 NULL,会读取环境变量,从而获取设备节点
nonblock: 为 0 表示阻塞方式,不为 0 表示非阻塞方式

3.2 配置触摸屏设备

int ts_config(struct tsdev *ts);

就是解析 ts.conf 文件中的配置信息

3.3 读取触摸屏设备

int ts_read(struct tedev *ts,struct te_sample *samp,int nr);
int ts_read_mt(struct tsdev *ts,struct ts_sample_mt **samp,int max_slots,int nr);

参数 ts 指向一个触摸屏设备句柄,参数 nr 表示对一个触摸点的采样数,设置为 1 即可.
ts_read()函数的 samp 参数是一个 struct ts_sample *类型的指针,指向一个 struct ts_sample 对象, struct ts_sample 数据结构描述了触摸点的信息;调用 ts_read()函数获取到的数据会存放在 samp 指针所指向的内存中。struct ts_sample 结构体内容如下所示:
在这里插入图片描述
ts_read_mt()函数的 samp 参数是一个 struct ts_sample_mt **类型的指针,多点触摸应用程序,每一个触摸点的信息使用 struct ts_sample_mt 数据结构来描述;一个触摸点的数据使用一个 struct ts_sample_mt 对象来装载,将它们组织成一个 struct ts_sample_mt 数组,调用 ts_read_mt()时,将数组地址赋值给 samp 参数。struct ts_sample 结构体内容如下所示:
在这里插入图片描述

4. 基于 tslib 编写触摸屏应用程序

4.1 单点触摸应用程序

#include <stdio.h>
#include <stdlib.h>
#include <tslib.h>

int main(int argc,char *argv[])
{
	struct tsdev *ts = NULL;
	struct ts_sample samp;
	int pressure = 0;	// 保存上一次压力,初始为 0,表示松开
	ts=ts_setup(NULL,0);
	for(;;)
	{
		ts_read(ts,&samp,1);
		if(samp.pressure) 
		{
			if(pressure)	// 上一次按压力
				printf("移动(%d, %d)\n", samp.x, samp.y);
			else
				printf("按下(%d, %d)\n", samp.x, samp.y);
		}
		else
			printf("松开\n");
		pressure=samp.pressure;
	}
	ts_close(ts);
	return 0;
}

压力大于 0,则需要根据上一次压力判断状态。
编译代码时,需要指定头文件、库文件的路径以及动态链接库文件名:
${CC} -I /home/dnkrc/tools/tslib/include -L /home/dnkrc/tools/tslib/lib -lts -o testApp testApp.c

4.2 多点触摸应用程序

int main(int argc, char *argv[])
{
	struct tsdev *ts = NULL;
	struct ts_sample_mt *mt_ptr = NULL;
	struct input_absinfo slot;
	int max_slots;
	unsigned int pressure[12] = {0}; //用于保存每一个触摸点上一次的按压力,初始为 0,表示松开
	int i;
	
	/* 打开并配置触摸屏设备 */
	ts = ts_setup(NULL, 0);
	if (NULL == ts) 
	{
		fprintf(stderr, "ts_setup error");
		return -1;
	}
	/* 获取触摸屏支持的最大触摸点数 */
	ioctl(ts_fd(ts), EVIOCGABS(ABS_MT_SLOT), &slot);
	max_slots = slot.maximum + 1 - slot.minimum;
	printf("max_slots: %d\n", max_slots);
	/* 内存分配 */
	mt_ptr = calloc(max_slots, sizeof(struct ts_sample_mt));
	/* 读数据 */
	for ( ; ; ) 
	{
		ts_read_mt(ts, &mt_ptr, max_slots, 1);
		for (i = 0; i < max_slots; i++) 
		{
			if (mt_ptr[i].valid) //有效表示有更新
			{
				if (mt_ptr[i].pressure) //如果按压力>0
				{
					if (pressure[mt_ptr[i].slot])//如果上一次的按压力>0
						printf("slot<%d>, 移动(%d, %d)\n", mt_ptr[i].slot, mt_ptr[i].x, mt_ptr[i].y);
					else
						printf("slot<%d>, 按下(%d, %d)\n", mt_ptr[i].slot, mt_ptr[i].x, mt_ptr[i].y);
				}
				else
					printf("slot<%d>, 松开\n", mt_ptr[i].slot);
				pressure[mt_ptr[i].slot] = mt_ptr[i].pressure;
			}
		}
	}
	ts_close(ts);
	free(mt_ptr);
	return 0;
}
  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 校准是指通过对触摸屏进行一系列操作和调整,使其能够准确地感知和响应手指或其他触摸操作。在Qt5.9.9中,tslib1.22是一个触摸屏校准工具。 校准触摸屏可以提高触摸精度和准确性,使得用户在使用触摸屏设备时能够更加方便和流畅地进行操作。校准旨在消除触摸屏的误差和漂移,确保触摸点与实际点击位置一致。 在Qt5.9.9中,使用tslib1.22进行触摸屏校准的步骤如下: 1. 确保系统已经安装了tslib1.22。如果没有安装,可以通过包管理器或在官方网站上下载并安装。 2. 打开终端或命令行界面,并进入tslib1.22安装目录。 3. 运行命令"calibrate",启动触摸屏校准工具。 4. 根据屏幕上的指示,依次点击几个目标点,使校准工具准确计算出触摸屏的误差和漂移。 5. 完成所有目标点的点击后,校准工具将显示校准结果。 6. 根据校准工具的指示,确认校准结果是否满意。 7. 如果满意,保存校准结果,并重启系统使之生效。 8. 如果不满意,可以重新进行校准,或者调整校准参数,直到满意为止。 通过使用tslib1.22进行触摸屏校准,可以提高触摸屏的精度和准确性,为用户提供更好的触摸体验。不同设备可能有不同的校准步骤或工具,可以根据具体情况选择合适的方法进行校准。 ### 回答2: 校准在qt5.9.9中是通过tslib1.22实现的。Qt是一款跨平台的开发框架,它允许开发者使用C++编写高效且易于维护的应用程序。而tslib是一个触摸屏校准工具,用于校准触摸屏设备。 在qt5.9.9的安装过程中,tslib1.22是一个常用的工具,它能够检测触摸屏的坐标并进行校准,以确保在使用触摸屏进行交互时,触摸点的准确性和精度。 校准过程主要分为三个步骤:采集样本、计算参数和应用参数。 首先,通过ts_calibrate命令行工具或者使用图形界面的Qt触摸屏校准程序进行采集样本。在这个步骤中,用户需要按照指示在屏幕上轻触几个指定的位置,以获取屏幕的触摸信息。 接下来,根据采集到的样本数据,计算出校准参数。这些参数将用于校准算法,以进行更准确的触摸点转换。 最后,应用参数到系统中,以使系统能够正确地将触摸点转换为屏幕上的坐标。这样,在使用触摸屏设备时,就能够获得准确和精确的触摸体验。 总的来说,通过在qt5.9.9中使用tslib1.22进行校准,可以很好地提高触摸屏设备的准确性。这样,用户在使用触摸屏进行交互时将获得更好的用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值