Linux-使用 tslib 库

上一章我们学习了如何编写触摸屏应用程序,包括单点触摸和多点触摸,主要是对读取到的 struct input_event 类型数据进行剖析,得到各个触摸点的坐标。本章向大家介绍 tslib 库,这是 Linux 系统下,专门为触摸屏开发的应用层函数库,本章我们将学习如何基于 tslib 库编写触摸屏应用程序。

本章将会讨论如下主题内容。

⚫ tslib 简介;

⚫ tslib 移植;

⚫ tslib 库函数的使用介绍;

⚫ 基于 tslib 库函数编写触摸屏应用程序。

tslib 简介

tslib 是专门为触摸屏设备所开发的 Linux 应用层函数库,并且是开源,也就意味着我们可以直接获取到tslib 的源代码,下一小节将向大家介绍如何获取到 tslib 的源代码。

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

tslib 有一个配置文件 ts.conf,该配置文件中提供了一些配置参数、用户可以对其进行修改,具体的配置信息稍后介绍!

tslib 可以作为 Qt 的触摸屏输入插件,为 Qt 提供触摸输入支持,如果在嵌入式 Linux 硬件平台下开发过Qt 应用程序的读者应该知道;当然,并不是只有 tslib 才能作为 Qt 的插件、为其提供触摸输入支持,还有很多插件都可以,只不过大部分都会选择使用 tslib。

关于 tslib 就介绍这么多,接下来看看如何将 tslib 库移植到我们的开发板平台上。

tslib 移植

下载 tslib 源码

首先下载 tslib 源码包,进入到 tslib 的 git 仓库下载源码 Releases · libts/tslib (github.com),如下:

ALPHA/Mini 开发板出厂系统中已经移植了 tslib,并且版本为 1.16,可以在开发板执行 ts_finddev 命令查看到它的版本信息,如下所示:

所以为了统一,我们也下载 1.16 版本的 tslib,往下翻找到 1.16 版本的下载链接:

点击红框字样进入下载页面:

推荐下载 tar.bz2 或 tar.gz 格式压缩包,或者 tar.xz 压缩包,这里笔者下载 tar.gz 格式的压缩包文件,点击文字即可下载。

编译 tslib 源码

将 tslib-1.16.tar.gz 源码包拷贝到 Ubuntu 系统的用户家目录下:

将其解压到当前目录下:

tar -xzf tslib-1.16.tar.gz

解压之后会生成 tslib-1.16 目录,在家目录下创建一个 tools 目录,然后在 tools 目录下创建 tslib 目录,等会编译 tslib 库的时候将安装目录指定到这里,如下所示:

进入到 tslib-1.16 目录,准备进行编译 tslib 源码:

接下来进行编译,整个源码的编译分为 3 个步骤:

⚫ 首先第一步是配置工程;

⚫ 第二步是编译工程;

⚫ 第三步是安装,将编译得到的库文件、可执行文件等安装到一个指定的目录下。

首先在配置工程之前,先对交叉编译工具的环境进行设置,使用 source 执行交叉编译工具安装目录下的 environment-setup-cortexa7hf-neon-poky-linux-gnueabi 脚本文件:

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

然后执行下面这条命令对 tslib 源码工程进行配置:

./configure --host=arm-poky-linux-gnueabi --prefix=/home/dt/tools/tslib/

至于工程是如何配置的,大家可以执行./configure --help 查看它的配置选项以及含义,--host 选项用于指定交叉编译得到的库文件是运行在哪个平台,通常将--host 设置为交叉编译器名称的前缀,譬如 arm-poky-linux-gnueabi-gcc 前缀就是 arm-poky-linux-gnueabi;--prefix 选项则用于指定库文件的安装路径,我们将安装路径设置为之前在家目录下创建的 tools/tslib 目录。

接着编译工程,直接执行 make:

make

最后执行 make install 安装:

make install

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

进入到 tslib 编译安装后的目录下:

bin 目录

bin 目录下有一些 tslib 提供的小工具,可以用于测试触摸屏,如下所示:

etc 目录

etc 目录下有一个配置文件 ts.conf,前面给大家提到过,

打开 ts.conf 文件看看它有哪些配置选项:

module_raw input:取消注释,使能支持 input 输入事件;

module pthres pmin=1:如果我们的设备支持按压力大小测试,那么可以把它的注释取消,pmin 用于调节按压力灵敏度,默认就是等于 1。

module dejitter delta=100:tslib 提供了触摸屏去噪算法插件,如果需要过滤噪声样本,取消注释,默认参数 delta=100。

module linear:tslib 提供了触摸屏坐标变换的功能,譬如将 X、Y 坐标互换、坐标旋转等之类,如果我们需要实现坐标变换,可以把注释去掉。

这里就不去改动了,直接使用默认的配置就行了。

include 目录

include 目录下只有一个头文件 tslib.h,该头文件中包含了一些结构体数据结构以及 API 接口的申明,使用 tslib 提供的 API 就需要包含该头文件。

lib 目录

lib 目录下包含了编译 tslib 源码所得到的库文件,默认这些都是动态库文件,也可以通过配置 tslib 工程使其生成静态库文件;ts 目录下存放的是一些插件库。

share 目录

可以忽略!

在开发板上测试 tslib

移植的最后一步就是把 tslib 安装目录下的库文件、etc 下的配置文件以及编译得到的测试工具拷贝到开发板 Linux 系统目录下,由于开发板出厂系统中已经移植了 tslib 库,所以我们这里就不用拷贝了。但如果大家是自己做的根文件系统,并没有移植 tslib,那么就需要把这些库、可执行文件以及配置文件拷贝到根文件系统中,那怎么去拷贝?这里简单地提一下:

⚫ 将安装目录 bin/目录下的所有可执行文件拷贝到开发板/usr/bin 目录下;

⚫ 将安装目录 etc/目录下的配置文件 ts.conf 拷贝到开发板/etc 目录下;

⚫ 将安装目录 lib/目录下的所有库文件拷贝到开发板/usr/lib 目录下。

将安装目录下的测试工具、库文件以及配置文件拷贝到开发板之后,接着需要配置一些环境变量,因为tslib 工作的时候它需要依赖于一些环境变量,譬如它会通过读取环境变量来得知 ts.conf 配置文件、库文件的路径以及我们要测试的触摸屏对应的设备节点等。

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

TSLIB_CONSOLEDEVICE:用于配置控制台设备文件名,直接配置为 none 即可!

TSLIB_FBDEVICE:用于配置显示设备的名称,tslib 提供了手指触摸画线的测试工具,需要在 LCD 上显示,所以这里需要指定一个显示设备的设备节点。

TSLIB_TSDEVICE:用于配置触摸屏对应的设备节点,根据实际情况配置。

TSLIB_CONFFILE:用于配置 ts.conf 文件的所在路径。

TSLIB_PLUGINDIR:用于配置插件所在路径。

如果想每次启动系统都能生效,可以把这些命令放置在/etc/profile 脚本中执行;出厂系统中已经配置好了,无需用户进行配置。

接着我们使用 tslib 提供的测试工具测试触摸屏,它提供了单点触摸测试工具(ts_print、ts_test)和多点触摸测试工具(ts_print_mt、ts_test_mt),ts_print 和 ts_print_mt 可以在终端打印触摸点信息,而 ts_test 和 ts_test_mt 则支持在 LCD 上画线。

执行 ts_print 命令:

执行 ts_print 命令之后,在触摸屏上滑动、或按下、松开触摸屏将会在终端打印出相应的信息。同理, ts_print_mt 也是如此,不过它支持多点触摸,可以打印多个触摸点的信息:

ts_test 和 ts_test_mt 支持触摸屏画线操作,这里就不再给演示了,自己去测试即可!如果大家想看这些测试工具的源码实现,可以在 tslib 源码中找到,具体路径为 tslib 源码目录下的 tests 文件夹中:

譬如 ts_test 程序对应的源码实现为 ts_test.c,不管它怎么做最终都是落实到上一章“输入设备应用编程”中给大家介绍的内容中。

tslib 库函数介绍

本小节介绍如何使用 tslib 提供的 API 接口来编写触摸屏应用程序,使用 tslib 库函数需要在我们的应用程序中包含 tslib 的头文件 tslib.h,使用 tslib 编程其实非常简单,基本步骤如下所示:

第一步打开触摸屏设备;

第二步配置触摸屏设备;

第三步读取触摸屏数据。

打开触摸屏设备

使用 tslib 提供的库函数 ts_open 打开触摸屏设备,其函数原型如下所示:

#include "tslib.h"

struct tsdev *ts_open(const char *dev_name, int nonblock);

参数 dev_name 指定了触摸屏的设备节点;参数 nonblock 表示是否以非阻塞方式打开触摸屏设备,如果 nonblock 等于 0 表示阻塞方式,如果为非 0 值则表示以非阻塞方式打开。

调用成功返回一个 struct tsdev *指针,指向触摸屏设备句柄;如果打开设备失败,将返回 NULL。

除了使用 ts_open()打开设备外,还可以使用 ts_setup()函数,其函数原型如下所示:

#include "tslib.h"

struct tsdev *ts_setup(const char *dev_name, int nonblock)

参数 dev_name 指定触摸屏的设备节点,与 ts_open()函数中的 dev_name 参数意义相同;但对于 ts_setup()来说,参数 dev_name 可以设置为 NULL,当 dev_name 设置为 NULL 时,ts_setup()函数内部会读取 TSLIB_TSDEVICE 环境变量,获取该环境变量的内容以得知触摸屏的设备节点。

参数 nonblock 的意义与 ts_open()函数的 nonblock 参数相同。

ts_setup()相比 ts_open(),除了打开触摸屏设备外,还对触摸屏设备进行了配置,也就是接下来说到的第

二步操作。

关闭触摸屏设备使用 ts_close()函数:

int ts_close(struct tsdev *);

配置触摸屏设备

调用 ts_config()函数进行配置,其函数原型如下所示:

#include "tslib.h"

int ts_config(struct tsdev *ts)

参数 ts 指向触摸屏句柄。

成功返回 0,失败返回-1。

所谓配置其实指的就是解析 ts.conf 文件中的配置信息,加载相应的插件。

读取触摸屏数据

读取触摸屏数据使用 ts_read()或 ts_read_mt()函数,区别在于 ts_read 用于读取单点触摸数据,而ts_read_mt 则用于读取多点触摸数据,其函数原型如下所示:

#include "tslib.h"

int ts_read(struct tsdev *ts, struct ts_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_mt()函数有一个 max_slots 参数,表示触摸屏支持的最大触摸点数,应用程序可以通过调用 ioctl()函数来获取触摸屏支持的最大触摸点数以及触摸屏坐标的最大分辨率等信息,稍后向大家介绍。

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_mt 结构体内容如下所示:

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

通过对 tslib 库函数的简单介绍,本小节来编写基于 tslib 的触摸屏应用程序,包括单点触摸应用程序和多点触摸应用程序。

单点触摸应用程序

本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->18_tslib->ts_read.c。

代码非常简单,就不再解释了,直接打开、配置设备,接着读取数据即可!通过判断按压力大小确定触摸的状态,如果按压力等于 0 则表示手指已经松开;按压力大于 0,则需根据上一次的按压力是否大于 0 来判断。

读取数据出错时,ts_read()返回一个负数。

接下来编译应用程序,编译代码时,需要通过交叉编译器来指定头文件、库文件的路径以及动态链接库文件名:

${CC} -I /home/dt/tools/tslib/include -L /home/dt/tools/tslib/lib -lts -o testApp testApp.c

-I 选项指定头文件的路径,也就是指定 tslib 安装目录下的 include 目录,如果不指定头文件路径,编译时将会找不到 tslib.h 头文件;-L 选项用于指定库文件的路径,也就是指定 tslib 安装目录下的 lib 目录;我们将 tslib 编译成了动态库文件,以库文件的形式提供,编译时需要链接到这些库文件;而-l 选项则用于指定链接库(也可写成-l ts,也就是 libts.so 库文件,Linux 中,动态库文件的命名方式为 lib+名字+.so)。

将编译得到的可执行文件拷贝到开发板 Linux 系统的用户家目录下,执行应用程序,进行测试:

多点触摸应用程序

本小节我们来写基于 tslib 的多点触摸应用程序,使用 ts_read_mt()函数读取多点触摸数据。

本例程源码对应的路径为:开发板光盘->11、Linux C 应用编程例程源码->18_tslib->ts_read_mt.c。

整个思路与单点触摸应用程序相同,关注 for()循环内部,通过 ts_read_mt()函数读取触摸点数据,将这些数据存放在 mt_ptr 数组中,接着在 fof()循环中判断每一个触摸点数据是否有效,有效则表示该触摸点信息发生更新。

编译应用程序:

${CC} -I /home/dt/tools/tslib/include -L /home/dt/tools/tslib/lib -lts -o testApp testApp.c

将编译得到的可执行文件拷贝到开发板 Linux 系统的用户家目录下,执行程序:

slot<0>表示触摸点 0,slot<1>表示触摸点 1,以此类推,大家自己去测试,没什么可说的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34497.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SHELL----正则表达式

一、文本搜索工具——grep grep -参数 条件 文件名 其中参数有以下&#xff1a; -i 忽略大小写 -c 统计匹配的行数 -v 取反&#xff0c;不显示匹配的行 -w 匹配单词 -E 等价于 egrep &#xff0c;即启用扩展正则表达式 -n 显示行号 -rl 将指定目录内的文件打…

[Redis#15] 持久化 | AOF | rewrite | aof_buf | 混合持久化

目录 1 使用AOF 流程 问题一&#xff1a;父进程在fork之后继续写旧AOF文件的意义 问题二&#xff1a;执行BGREWRITEAOF时的特殊情况处理 2 命令写入 3 文件同步 4 重写机制 工作流程&#xff1a; 触发条件 混合持久化 持久化 sum AOF&#xff08;Append Only File&a…

重生之我在异世界学智力题(1)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言智力题题目&#xff1a;《奇怪的时钟…

【WRF后处理】WRF时区(UTC)需转化为北京时间(CST)!!!

目录 WRF运行时间标准注意事项-本地时区问题 输入数据&#xff1a;ERA5时间标准ERA5数据和WRF模型需要转换为北京时间&#xff01;&#xff01;&#xff01;北京时间&#xff08;CST&#xff09;与协调世界时&#xff08;UTC&#xff09;的关系转换方法 参考 WRF运行时间标准 …

css怎么使页面高度占满屏幕?

下面是一个小程序的页面&#xff0c;用uniapp写的&#xff0c;现在有一个问题&#xff0c;就是最外层的allmy的图层&#xff0c;屏幕是灰色&#xff0c;我怎么才能使这个图层占满屏幕&#xff0c;就是让灰色占满屏幕。 直接先给page设置一个height:100%;然后allmy的height:100%…

K8S离线部署Nacos集群【Oracle作外部数据源】

一、前言 由于公司的要求下要使Nacos集群以Oracle作为外部数据源&#xff0c;前期咱们已经阐述了如何在本地搭建&#xff08;Nacos集群搭建【Oracle作外部数据源】&#xff09;&#xff0c;本次将带领大家在k8s上部署Nacos集群并以Oracle作为外部数据源。 二、软件包 nacos-f…

Halcon 深度学习目标分类:原理与应用全解析

摘要&#xff1a; 本文深入探讨了 Halcon 在深度学习目标分类方面的原理及广泛的应用场景。详细阐述了从数据准备到模型训练与分类决策的目标分类工作流程&#xff0c;剖析了其背后的深度学习技术支撑。同时&#xff0c;结合多个行业领域&#xff0c;展示了 Halcon 目标分类技术…

【burp】burpsuite基础(五)

Burp Suite基础&#xff08;五&#xff09; 声明&#xff1a;该笔记为up主 泷羽的课程笔记&#xff0c;本节链接指路。 警告&#xff1a;本教程仅作学习用途&#xff0c;若有用于非法行为的&#xff0c;概不负责。 抓包方式 burp在抓包上十分全面&#xff0c;这里介绍几种抓包…

固态电池产业路径思考

《固态电池产业路径思考》主要探讨了固态电池的研究思路、解决方案、已取得的成果以及TC固态电池的介绍。以下是核心内容的整理&#xff1a; 一、固态电池优势 高比能耐高温易匹配高电压镍钴锰&#xff08;NCM&#xff09;正极和金属锂负极 二、固态电池关键共性问题 固态电…

第3章.垃圾收集器与内存分配策略

概述 对象已死 引用计数法 可达性分析算法 再谈引用 生存还是死亡 回收方法区 垃圾收集算法 分代收集理论 3种垃圾收集算法 HotSpot的算法细节实现 根节点枚举 安全点 安全区域 记忆集与卡表 写屏障 并发的可达性分析 误消亡问题 经典垃圾收集器 概述 简单的一些GC CMS G1 低延…

推动行业创新 猿辅导素养课斩获“2024影响力教育品牌”奖项

近日&#xff0c;由教育界网、校长邦联合主办&#xff0c;鲸媒体、职教共创会协办的“第9届榜样教育年度盛典”评奖结果揭晓。猿辅导素养课凭借在素养教育领域的卓越表现和深远影响力&#xff0c;荣获“2024影响力教育品牌”奖项。这一殊荣不仅肯定了猿辅导素养课在教学教研和产…

Vue工程化开发中各文件的作用

1.main.js文件 main.js文件的主要作用&#xff1a;导入App.vue&#xff0c;基于App.vue创建结构渲染index.html。

注解方式的AspectJ实现方式

BookService类 package com.hkd.service;public interface BookService {public void buyJava();public int comment();void buy(); }BookServiceImp类 package com.hkd.service;import org.springframework.stereotype.Component;Component("bs") public class Bo…

侦查与监测类吊舱应用场景!

一、军事领域 侦察与监视&#xff1a; 侦查与监测类吊舱能够全天候、全气候地提供高清图像数据&#xff0c;支持军事侦察和监视任务。 通过可见光相机和红外热成像仪的结合&#xff0c;吊舱可以在白天和夜晚、晴天和恶劣天气条件下&#xff0c;为无人机等空中平台提供清晰的…

(ICLR-2022)LoRA:大型语言模型的低秩自适应

LoRA&#xff1a;大型语言模型的低秩自适应 Paper是Microsoft Corporation发表在ICLR 2022的工作 Paper Title&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models Code &#xff1a;地址 Abstract 自然语言处理的主导范式包括对通用领域数据进行大规模预训练&am…

linux上修改容器网卡docker0为固定ip

修改容器为固定ip段。 1.在一次项目中发现创建的容器网段跟办公室网段有冲突的&#xff0c;导致连接不上。修改容器ip为固定ip 这是默认启动docker自动创建的。172网段 2.修改前先停用运行容器 3.在配置路径下修改vim /etc/docker/daemon.json 4.重启docker systemctl re…

群硕融合医疗器械:打造智能治疗设备管理平台,全程护航精准手术

治疗成功率更高&#xff0c;患者更信任。 科技革命在医疗领域开花 在珠海航展上&#xff0c;一群灵活穿梭于复杂地形的机器狗吸引了人们的目光&#xff0c;它们仿佛是从科幻电影中走出的“未来战士”&#xff0c;展现了科技应用的无限潜力。 与此同时&#xff0c;医疗领域同…

成都栩熙酷网络科技抖音电商为您打造无忧购物体验

在这个信息爆炸的时代&#xff0c;电子商务的便捷性让越来越多的人选择在线购物。作为一家深耕西南地区的创新型科技企业&#xff0c;成都栩熙酷网络科技有限公司&#xff08;以下简称“栩熙酷”&#xff09;始终将用户的安全与满意度置于首位&#xff0c;致力于通过先进的技术…

细节之处见真章:移门缓冲支架的功能之美

细节之处见真章&#xff0c;这句话在移门缓冲支架的设计与应用中得到了完美的诠释。移门缓冲支架不仅仅是一个简单的五金件&#xff0c;它通过一系列精心设计的功能&#xff0c;确保了移门关闭过程中的平稳和安静&#xff0c;同时为家居环境增添了实用和美学价值。下面我们将深…

Hive 中 IP 字典的应用:让你的数据分析更加精准

​ 大家好&#xff01;时隔一年&#xff0c;再次更新帖子&#xff0c;今天我们来探讨一个在大数据分析中非常实用的功能&#xff1a;在 Hive 中将连续的 IP 地址合并为一整条数据&#xff0c;作为字典使用。这项技术可以帮助我们减少数据量&#xff0c;提高数据处理效率&#x…