17. 使用 tslib 库

news2024/11/16 17:44:33

17. 使用 tslib 库

  • 1. tslib 简介
  • 2. tslib 移植
    • 2.1 下载 tslib 源码
    • 2.2 编译 tslib 源码
    • 2.3 tslib 安装目录下的文件夹介绍
    • 2.4 在开发板上测试 tslib
  • 3. tslib 库函数介绍
    • 3.1 打开触摸屏设备
    • 3.2 配置触摸屏设备
    • 3.3 读取触摸屏设备
  • 4. 基于 tslib 编写触摸屏应用程序
    • 4.1 单点触摸应用程序
    • 4.2 多点触摸应用程序

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;
}

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

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

相关文章

CHS_03.2.3.2_2+进程互斥的硬件实现方法

CHS_03.2.3.2_2进程互斥的硬件实现方法 知识总览中断屏蔽方法TestAndSet指令Swap指令 知识回顾 进程互斥的四种软件实现方法 知识总览 这个小节我们会介绍另外的三种进程互斥的硬件实现方法 那么 这个小节的学习过程当中 大家需要注意理解各个方法的原理 并且要稍微的了解各个…

OpenHarmony RK3568 启动流程优化

目前rk3568的开机时间有21s&#xff0c;统计的是关机后从按下 power 按键到显示锁屏的时间&#xff0c;当对openharmony的系统进行了裁剪子系统&#xff0c;系统app&#xff0c;禁用部分服务后发现开机时间仅仅提高到了20.94s 优化微乎其微。在对init进程的log进行分析并解决其…

机器学习:多项式回归(Python)

多元线性回归闭式解&#xff1a; closed_form_sol.py import numpy as np import matplotlib.pyplot as pltclass LRClosedFormSol:def __init__(self, fit_interceptTrue, normalizeTrue):""":param fit_intercept: 是否训练bias:param normalize: 是否标准化…

重写Sylar基于协程的服务器(1、日志模块的架构)

重写Sylar基于协程的服务器&#xff08;1、日志模块的架构&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

2.室内设计学习 - CAD 2021 调整经典界面教程及基本设置

设置经典界面 1.在第二行的空白处右击&#xff0c;弹出对话框&#xff0c;并点击【关闭】&#xff0c;关闭掉。 2.菜单栏没有显示的情况下&#xff0c;在最上面的一排&#xff0c;点击向下的箭头展开下拉框&#xff0c;勾选 【显示菜单栏】 3.点击菜单【工具】-【工具栏】-【a…

AES 加解密python实现

1. 要求 编程实现AES-128的加解密算法&#xff0c;满足给定明文和密钥加密得到密文&#xff0c;给定密文和密钥解密得到明文&#xff0c;最终用界面化的形式呈现。 2. 算法流程 程序主要分为加密与解密两个大模块。在加密模块中包括四个小模块&#xff0c;分别为轮密钥加、字…

C语言KR圣经笔记 6.4结构体指针 6.5自引用结构体

6.4 结构体指针 为了说明结构体指针和数组的某些注意事项&#xff0c;我们把上一节的关键字计数程序再写一次&#xff0c;不过这回使用指针而不是数组下标。 keytab 的外部声明不需要动&#xff0c;但 main 和 binsearch 确实需要修改。 #include <stdio.h> #include …

3、css设置样式总结、节点、节点之间关系、创建元素的方式、BOM

一、css设置样式的方式总结&#xff1a; 对象.style.css属性 对象.className ‘’ 会覆盖原来的类 对象.setAttribut(‘style’,‘css样式’) 对象.setAttribute(‘class’,‘类名’) 对象.style.setProperty(css属性名,css属性值) 对象.style.cssText “css样式表” …

开发工具之GIT协同开发流程和微服务部署实践与总结

GIT协同开发流程和微服务部署的实践&#xff0c;并总结经验和教训。通过合理的GIT协同开发流程和良好的微服务部署策略&#xff0c;团队可以更高效地开发和部署软件。 ## 引言 在当今快节奏的软件开发环境中&#xff0c;采用合适的工具和流程对于实现高效协同开发和可靠部署至…

1.25时间序列分析,FB先知模型、简要傅里叶变化解决周期性变化,实例步骤

目录 FB概念 ​编辑 GEOGEBRA可视化傅里叶​编辑 先知模型步骤 财务数据要考虑到可解释性 FB模型概念 可以用傅里叶级数来描述周期性变化的因素 GEOGEBRA可视化傅里叶 先知模型步骤

vue+ElementPlus实现中国省市区三级级联动封装

安装插件获取中国省份的所有数据 npm install element-china-area-data -S 借助ElementPlus 级联选择器 Cascader实现 <template><div><el-cascadersize"large":options"options"v-model"selectedOptions"change"handleCh…

C# 一个快速读取写入操作execl的方法封装

这里封装了3个实用类ExcelDataReaderExtensions&#xff0c;ExcelDataSetConfiguration&#xff0c;ExcelDataTableConfiguration和一个实用代码参考&#xff1a; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.T…

2024.1.29 关于 Redis 缓存详解

目录 缓存基本概念 二八定律 Redis 作为缓存 缓存更新策略 定期生成 实时生成 内存淘汰策略 缓存使用的注意事项 关于缓存预热 关于缓存穿透 关于缓存雪崩 关于缓存击穿&#xff08;瘫痪&#xff09; 缓存基本概念 所谓缓存&#xff0c;其实就是将一部分常用数据放…

向日葵企业“云策略”升级 支持Android 被控策略设置

此前&#xff0c;贝锐向日葵推出了适配PC企业客户端的云策略功能&#xff0c;这一功能支持管理平台统一修改设备设置&#xff0c;上万设备实时下发实时生效&#xff0c;很好的解决了当远程控制方案部署后&#xff0c;想要灵活调整配置需要逐台手工操作的痛点&#xff0c;大幅提…

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )

文章目录 为什么要数据交换&#xff1f;总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…

正则表达式(RE)

什么是正则表达式 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;。正则表达式通常被用来检索、替换那些符合某个规则的文本 正则表达式的作用 验证数据的有效性替换文本内容从字符串中提取子字符串 匹配单个字符 字符功能.匹配任意1个…

(一)Spring 核心之控制反转(IoC)—— 配置及使用

目录 一. 前言 二. IoC 基础 2.1. IoC 是什么 2.2. IoC 能做什么 2.3. IoC 和 DI 是什么关系 三. IoC 配置的三种方式 3.1. XML 配置 3.2. Java 配置 3.3. 注解配置 四. 依赖注入的三种方式 4.1. 属性注入&#xff08;setter 注入&#xff09; 4.2. 构造方法注入&a…

ES Serverless让日志检索更加便捷

前言 在项目中,或者开发过程中,出现bug或者其他线上问题,开发人员可以通过查看日志记录来定位问题。通过日志定位 bug 是一种常见的软件开发和运维技巧,只有观察日志才能追踪到具体代码。在软件开发过程中,开发人员会在代码中添加日志记录,以记录程序的运行情况和异常信…

【蓝桥杯日记】复盘篇二:分支结构

前言 本篇笔记主要进行复盘的内容是分支结构&#xff0c;通过学习分支结构从而更好巩固之前所学的内容。 目录 前言 目录 &#x1f34a;1.数的性质 分析&#xff1a; 知识点&#xff1a; &#x1f345;2.闰年判断 说明/提示 分析&#xff1a; 知识点&#xff1a; &am…

【Linux操作系统】:Linux开发工具编辑器vim

目录 Linux 软件包管理器 yum 什么是软件包 注意事项 查看软件包 如何安装软件 如何卸载软件 Linux 开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 插入模式 插入模式切换为命令模式 移动光标 删除文字 复制 替换 撤销 跳至指…