使用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")

触摸屏校准程序ts_calibrate(转)相关推荐

  1. 更改触摸屏校准程序界面提示文字

    BSP中提供的触摸屏校准程序在个别设备上用起来可能不太适合,比如说我们的设备屏幕宽度只有 240pixels,会有部分字符超出屏幕外侧,原以为这是BSP的提供的程序,无源码没办法修改,这两天才知道原来 ...

  2. wince7 屏幕控制_WinCE下如何调用触摸屏校准程序

    wince的cordll提供了屏幕校准的函数,使用方法与我的上一篇文章中说的钩子函数类似,强制加载dll,获取地址,然后用函数指针调用.这里飞狐给出源代码. 首先在头文件里加入函数指针定义:typed ...

  3. linux内核关闭触摸屏校准,linux内核usb触摸屏驱动bug调试- selected device is not a touchscreen I understand...

    近期给客户调试一块数控板,今天客户带过来一个屏,并且有一个usb的触摸屏芯片接在屏上.屏很快就弄好正常显示. 触摸屏在内核下找到usb 触摸屏驱动,内核启动后这个usb转的触摸屏也正常找到,注册为ev ...

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

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

  5. Android电阻触摸屏校准

    首先电阻屏为什么需要校准,这是电气方面的知识,我也不懂,这里就不说了,这里主要讲讲自己在项目中是怎么通过应用程序来实现校准的,好记性不如烂笔头这里有一篇讲解触摸屏校准原理和优化的文章,道客巴巴上的,先 ...

  6. 自己编写wince的校准程序

    自己编写wince的校准程序 2009-12-22 22:32 http://hi.baidu.com/lihuanhai1943/blog/item/2ccc99fa599d3e14a9d3117f ...

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

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

  8. [转]Android 触摸屏校准

    Android 触摸屏校准 话接上回,我们发现了手工利用 tslib 校验触摸屏的缺点.那么这一回 我们就来一次稍微高级一点的校验吧. 我们其实只需要相对的 x,y 以及lcd的 x,y 就可以把校验 ...

  9. 计算机软件与plc兼容,触摸屏传程序的时候显示电脑里的软件和hmi中的不兼容

    传程序的时候显示里的软件和中的不兼容,让我升级,升级后会丢失数据么? 答:不会丢失,但是为了保险起见,最好对触摸屏程序做好备份,比如如果触摸屏程序有源程序备份,就不需要上载或者prosave备份. 提 ...

最新文章

  1. mongo 改字段名_一日一技:修改MongoDB集合中的字段名
  2. java统计分析_数据统计(java实现)
  3. Java提高班(一)Thread详解
  4. Qt窗口部件与布局之二:布局管理
  5. intelij不识别java文件
  6. C++ 11 深度学习(一)auto、头文件防卫、引用、常量
  7. [转]MPlayer快捷键参数设置--系统开销最少的影音播放器
  8. 【设计模式】设计模式C++编程实现之观察者模式(ObserverPattern)
  9. arcgis server site 快速恢复与重建
  10. MRFC-使用VXML、CCXML
  11. ENVI软件中决策树分类和监督分类算法比较
  12. jquery_ajax_js,浅析jQuery Ajax通用js封装
  13. cad转dwf简易教程
  14. 【手机连接adb的两种方法】
  15. MongoDB填充因子和更新优化
  16. 第22章 声音与音乐
  17. PreScan 使用点云雷达代替激光雷达操作步骤:
  18. 自助点餐php,餐饮类小程序:微信自助点餐小程序v2.0.12_开源完整版前后端源码_已测试...
  19. 使用ADB命令连接手机、发送广播
  20. android 全选功能,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

热门文章

  1. C++小游戏扫雷——如何写出一个简易的扫雷
  2. Mac Edge浏览器全屏问题
  3. 速达开发版增值报表-非财务资产负债利润表
  4. 计算机毕设选题推荐 SSM个人交友网站 网上交友平台 同城交友平台Java Vue MySQL数据库 远程调试 代码讲解
  5. 如何用php新增税金一列_根据新税改增加税额,税率时,增加字段保存报错ORA-01430: 表中已存在要添加的列...
  6. C++ 判定值为x的结点的层号
  7. 简单的投票页面,只有一个html页面
  8. Springboot连接mysql数据库报错
  9. 解决夜神模拟器adb connect 127.0.0.1:62001提示 cannot connect to 127.0.0.1:62001: 由于目标计算机积极拒绝,无法连接。 (10061)
  10. android照片美颜项目_Android OpenGLES 实时美颜(磨皮)的优化