使用ts_lib包自带的ts_calibrate校准触摸屏非常简单实用,但在基于Xsever的GUI应用环境下,有两个问题存在:

1.校准后必须重新启动X,应用端才能生效。这样处理用户肯定不能接受,因为启动一次机器毕竟耗时。

2.在使用ts_calibrate校准触摸屏时,要触摸5个点,这时如果GUI应用端在运行其他响应触摸事件(鼠标事件)的程序就会出现错乱。所以安全的做法应该是在校准触摸屏时进行锁屏操作。

解决这两个问题之前来看看tslib校准方面的原理,如果将原理搞清楚,剩下就是方法实现的问题了。

Tslib 是触摸屏驱动和应用层之间的适配层,它从触摸屏驱动处获得原始的设备坐标数据,通过一系列的去噪、去抖、坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕坐标。通过tslib/src/tslib.h文件可以看出,在tslib中为应用层提供了2个主要的接口 ts_open(),ts_close();ts_read()和ts_read_raw(),其中ts_read()为正常情况下的接口,ts_read_raw()为校准情况下使用的接口。从tslib默认的ts.conf文件中可以看出包括如下基本插件:

pthres 为Tslib 提供的触摸屏灵敏度门槛插件;

variance 为Tslib提供的触摸屏滤波算法插件;

dejitter 为Tslib 提供的触摸屏去噪算法插件;

linear为Tslib 提供的触摸屏坐标变换插件。

tslib 从触摸屏驱动采样到的设备坐标进行处理再提供给应用端的过程大体如下:

raw device --> variance --> dejitter --> linear --> application

module module module module

再来看看ts_calibrate主要做了哪些事情,校准情况下,tslib对驱动采样到的数据进行处理的一般过程如下:

1。读取屏上5个点的坐标(Top Left,Top Right,Bottom Left,Bottom Right,Center),在进行一系列的变换,取样的5个点,实际上是包含3个不同的X值,3个不同的Y值。和scaling 值一共7个值,一起保存到/etc/pointercal中.

2.这个/etc/pointercal文件主要是供linear插件使用。而我们每次的触摸的操作都进行多次触摸坐标变换。

至此已经找到解决问题的大体的方法了。在校准触摸屏后只需及时的让linear插件再次读取新的/etc/pointeracal文件,这样新校准的坐标信息就及时的更新到上层应用。下面就要考虑具体实现的问题了。

1。从linear.c文件可以看出在该模块初始化时读取了/etc/pointercal文件。只要在linear_read()中读取新的/etc/pointercal文件即可。

2。校准后保存了一个新的pointercal文件,但ts_lib怎么知道当前的pointercal文件是应该读取的新文件。刚开始的时候我们在 linear.c的linear_read()函数中采取计数轮询的方式查看/etc/poinercal文件的最后更新时间,如果当前的更新时间大于上次更新时间,就去读取下pointercal文件。我们暂且不说在一台刚下流水线的机器,它的rtc时间是不确定,再进行时间比较时会出现错误。另外始终的轮询的方式和ts_lib的采样间隔时间值很小。这样用户在进行触摸屏常按操作时,会非常明显的消耗系统资源。

3。此时想到的办法就是进程通信,ts_lib是个动态库运行于系统中,他存在系统中不是以进程方式,但可以采取折衷方法,将调用ts_lib的进程号(实际上就是X的进程号)保存到一个配置文件中。这样在使用ts_calibrate校准触摸屏后,利用信号的方式给ts_lib发送用户自定义信号,ts_lib的 lineral.c中加一个简单的信号处理函数。在接受到信号后就去读取下新的pointercal文件。正常情况下不做任何的轮询和读取操作。

从上说的3个步骤中完全解决了校准后应用端触摸及时生效的问题。还有个次要问题就是如何锁屏?这需要从内核入手了,查看linux2.6内核 /drivers/input/evdev.c从该驱动提供的ioctl中看到对基于evdev的输入设备都提供EVIOCGRAB实现。顾名思义,grab就是将当前的输入操作抓取到当前的操作中,让当前操作之外的所有应用端读不到触摸屏的触摸操作。由驱动源码就很容易知道该如何实现锁屏解锁操作了。源码如下:

truct tsdev *ts;

char *tsdevice = “/dev/input/event0”;

ts = ts_open(tsdevice, 0);

int ts_tmpfd = ts_fd(ts);

if (ts_tmpfd== -1)

{

perror(“ts_open”);

exit(1);

}

unsigned long val =1;

int ioctl_ret=ioctl(ts_tmpfd,EVIOCGRAB,&val);

printf(“now lock the ts ioctl ret is:%d\n”,ioctl_ret);

if (ioctl_ret!=0)

{

printf(“Error: %s\n”, strerror(errno));

exit(1);

}

printf(“lock the ts success \n”);

原文链接:https://blog.csdn.net/z1179675084/article/details/17752427

使用ts_calibrate校准触摸屏相关推荐

  1. linux内核关闭触摸屏校准,触摸屏校正原理

    1,触摸屏校准通用方法 主要采用以下公式,实现触摸屏校正,其中XL, YL是显示屏坐标,XT, YT是触摸屏坐标, XL = XT*A+YT*B+C; YL = XT*D+YT*E+F;    公式( ...

  2. 触屏计算机显示器CDU,如何在计算机上进行校准触摸屏?

    以下文章可帮助您识别并解决运行 Windows 操作系统的计算机上的触摸屏相关问题.了解如何在膝上型计算机或台式机上重新校准触摸面板.本文提供了有关如何调整灵敏度.切换触摸功能和使用平板电脑模式的说明 ...

  3. ts_calibrate校准原理

    Tslib 是触摸屏驱动和应用层之间的适配层,它从触摸屏驱动处获得原始的设备坐标数据,通过一系列的去噪.去抖.坐标变换等操作,来去除噪声并将原始的设备坐标转换为相应的屏幕坐标.通过tslib/src/ ...

  4. 触摸屏校准程序ts_calibrate(转)

    使用ts_lib包自带的ts_calibrate校准触摸屏很简单实用,但在基于Xsever的GUI应用环境下,有两个问题存在: 1.校准后必须重新启动X,应用端才能生效.这样处理用户肯定不能接受,因为 ...

  5. Zynq移植USB触摸屏

    Zynq平台移植USB触摸屏的实现(Qt5.7) 使用的环境: 1. CPU type:ARM CortexA9(Xilinx zynq7000)(使用的是黑金AX7021开发板) 2. Kernel ...

  6. X10 电阻屏tsc2007调试

    设备树的添加 驱动加载检测 1)检测I2c设备是否注册成功 测试方法:输入命令dmesg | grep plat: 测试结果:如下图所示,可以看出tsc2007已挂载到I2c总线上. 设备-i2c设备 ...

  7. 嵌入式Linux系统之I.MX6触摸屏驱动程序TSC2007.C的分析、移植与校准

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 今天来记录一下I.MX6开发板移植触摸屏驱动程序的过程分析.在移植驱 ...

  8. linux蜂鸣器控制实验,【Linux公开课】蜂鸣器使用、LCD背光控制、触摸屏校准、GPIO操作...

    摘要为方便使用蜂鸣器,系统为蜂鸣器提供类似LED的操作接口,对应的操作文件是/sys/class/leds/beep/brightness.写入1使蜂鸣器鸣叫,写入0停止鸣叫- 8.12 蜂鸣器使用 ...

  9. 电阻触摸屏的校准算法

    一.   为什么要校准 简单来说,电阻式触摸屏就是一种传感器,它利用压力感应进行控制,将矩形区域中触摸点(X,Y)的物理位置转换为代表 X坐标和 Y 坐标的电压 电阻式触摸屏的主要部分是一块与显示器表 ...

最新文章

  1. Aria2打造属于自己的下载神器
  2. 《Ansible权威指南 》一 第一篇 Part 1 基础入门篇
  3. Python在Seaborn中手动指定调色板颜色进行数据可视化颜色自定义实战(Manually Specify Palette Colors in Seaborn)
  4. Docker+Selenium Grid+Python搭建分布式测试环境
  5. 浅谈Linux下的EXT3文件系统
  6. Python之seaborn:利用seaborn的color_palette()函数改变绘图界面风格
  7. python算法与数据结构-数据结构中二叉树的介绍
  8. DotNetAnywhere:可供选择的 .NET 运行时
  9. java 图片操作_Java对图片的操作
  10. jquery快速入门(二)
  11. Qt 根据PCM获取分贝 并自动调节电脑音量
  12. 非Build Rebuild--Compilation of Maven projects is supported only if external build is started from an
  13. oracle删除双引号,oracle 表名 双引号 删除
  14. mac系统恢复服务器上的安装器损坏,Mac提示App已损坏你应该将它移到废纸篓的解决方案-mac无法安装软件解决教程 - 河东软件园...
  15. 关于学校计算机的情景剧剧本,校园剧本校园情景剧
  16. java下拉框怎么做_java下拉框怎么做?
  17. Struts Tiles 框架概述
  18. 华硕计算机用户名默认,华硕路由器设置方法_华硕(ASUS)路由器怎么设置?-192路由网...
  19. combine wwdc_WWDC的失败之处
  20. 新版SAPI+微信SaaS平台源码V1.8.7.1版本

热门文章

  1. 翻转电平函数实现LED闪烁-STM32电控学习笔记05
  2. 霍尔电流传感器的磁芯和芯片是如何选择的
  3. mac使用Chrome模拟微信内置浏览器
  4. 剑指offer——stack与queue的互相实现
  5. 文件重名修改专家 v1.1.4 bt
  6. Dreammail V4.6.9.2 XSS漏洞利用
  7. 仅需一步将人脸检测算法从30FPS提升到120FPS
  8. P2P金融,终将成为主流
  9. k8s执行 kubeadm join token id i6q6rl is invalid for this cluster or it has expired.
  10. linux安装微信和qq