IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁(yè)操作系統(tǒng)LINUX → 使用ts_calibrate校準(zhǔn)觸摸屏

使用ts_calibrate校準(zhǔn)觸摸屏

時(shí)間:2015/6/28來(lái)源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)

  使用ts_lib包自帶的ts_calibrate校準(zhǔn)觸摸屏非常簡(jiǎn)單實(shí)用,但在基于Xsever的GUI應(yīng)用環(huán)境下,有兩個(gè)問(wèn)題存在:

  1.校準(zhǔn)后必須重新啟動(dòng)X,應(yīng)用端才能生效。這樣處理用戶肯定不能接受,因?yàn)閱?dòng)一次機(jī)器畢竟耗時(shí)。

  2.在使用ts_calibrate校準(zhǔn)觸摸屏?xí)r,要觸摸5個(gè)點(diǎn),這時(shí)如果GUI應(yīng)用端在運(yùn)行其他響應(yīng)觸摸事件(鼠標(biāo)事件)的程序就會(huì)出現(xiàn)錯(cuò)亂。所以安全的做法應(yīng)該是在校準(zhǔn)觸摸屏?xí)r進(jìn)行鎖屏操作。

  解決這兩個(gè)問(wèn)題之前來(lái)看看tslib校準(zhǔn)方面的原理,如果將原理搞清楚,剩下就是方法實(shí)現(xiàn)的問(wèn)題了。

  Tslib 是觸摸屏驅(qū)動(dòng)和應(yīng)用層之間的適配層,它從觸摸屏驅(qū)動(dòng)處獲得原始的設(shè)備坐標(biāo)數(shù)據(jù),通過(guò)一系列的去噪、去抖、坐標(biāo)變換等操作,來(lái)去除噪聲并將原始的設(shè)備坐標(biāo)轉(zhuǎn)換為相應(yīng)的屏幕坐標(biāo)。通過(guò)tslib/src/tslib.h文件可以看出,在tslib中為應(yīng)用層提供了2個(gè)主要的接口 ts_open(),ts_close();ts_read()和ts_read_raw(),其中ts_read()為正常情況下的接口,ts_read_raw()為校準(zhǔn)情況下使用的接口。從tslib默認(rèn)的ts.conf文件中可以看出包括如下基本插件:

  pthres 為T(mén)slib 提供的觸摸屏靈敏度門(mén)檻插件;

  variance 為T(mén)slib提供的觸摸屏濾波算法插件;

  dejitter 為T(mén)slib 提供的觸摸屏去噪算法插件;

  linear為T(mén)slib 提供的觸摸屏坐標(biāo)變換插件。

  tslib 從觸摸屏驅(qū)動(dòng)采樣到的設(shè)備坐標(biāo)進(jìn)行處理再提供給應(yīng)用端的過(guò)程大體如下:

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

  module   module module      module

  再來(lái)看看ts_calibrate主要做了哪些事情,校準(zhǔn)情況下,tslib對(duì)驅(qū)動(dòng)采樣到的數(shù)據(jù)進(jìn)行處理的一般過(guò)程如下:

  1。讀取屏上5個(gè)點(diǎn)的坐標(biāo)(Top Left,Top Right,Bottom Left,Bottom Right,Center),在進(jìn)行一系列的變換,取樣的5個(gè)點(diǎn),實(shí)際上是包含3個(gè)不同的X值,3個(gè)不同的Y值。和scaling 值一共7個(gè)值,一起保存到/etc/pointercal中.

  2.這個(gè)/etc/pointercal文件主要是供linear插件使用。而我們每次的觸摸的操作都進(jìn)行多次觸摸坐標(biāo)變換。

  至此已經(jīng)找到解決問(wèn)題的大體的方法了。在校準(zhǔn)觸摸屏后只需及時(shí)的讓linear插件再次讀取新的/etc/pointeracal文件,這樣新校準(zhǔn)的坐標(biāo)信息就及時(shí)的更新到上層應(yīng)用。下面就要考慮具體實(shí)現(xiàn)的問(wèn)題了。

  1。從linear.c文件可以看出在該模塊初始化時(shí)讀取了/etc/pointercal文件。只要在linear_read()中讀取新的/etc/pointercal文件即可。

  2。校準(zhǔn)后保存了一個(gè)新的pointercal文件,但ts_lib怎么知道當(dāng)前的pointercal文件是應(yīng)該讀取的新文件。剛開(kāi)始的時(shí)候我們?cè)?linear.c的linear_read()函數(shù)中采取計(jì)數(shù)輪詢的方式查看/etc/poinercal文件的最后更新時(shí)間,如果當(dāng)前的更新時(shí)間大于上次更新時(shí)間,就去讀取下pointercal文件。我們暫且不說(shuō)在一臺(tái)剛下流水線的機(jī)器,它的rtc時(shí)間是不確定,再進(jìn)行時(shí)間比較時(shí)會(huì)出現(xiàn)錯(cuò)誤。另外始終的輪詢的方式和ts_lib的采樣間隔時(shí)間值很小。這樣用戶在進(jìn)行觸摸屏常按操作時(shí),會(huì)非常明顯的消耗系統(tǒng)資源。

  3。此時(shí)想到的辦法就是進(jìn)程通信,ts_lib是個(gè)動(dòng)態(tài)庫(kù)運(yùn)行于系統(tǒng)中,他存在系統(tǒng)中不是以進(jìn)程方式,但可以采取折衷方法,將調(diào)用ts_lib的進(jìn)程號(hào)(實(shí)際上就是X的進(jìn)程號(hào))保存到一個(gè)配置文件中。這樣在使用ts_calibrate校準(zhǔn)觸摸屏后,利用信號(hào)的方式給ts_lib發(fā)送用戶自定義信號(hào),ts_lib的 lineral.c中加一個(gè)簡(jiǎn)單的信號(hào)處理函數(shù)。在接受到信號(hào)后就去讀取下新的pointercal文件。正常情況下不做任何的輪詢和讀取操作。

  從上說(shuō)的3個(gè)步驟中完全解決了校準(zhǔn)后應(yīng)用端觸摸及時(shí)生效的問(wèn)題。還有個(gè)次要問(wèn)題就是如何鎖屏?這需要從內(nèi)核入手了,查看linux2.6內(nèi)核 /drivers/input/evdev.c從該驅(qū)動(dòng)提供的ioctl中看到對(duì)基于evdev的輸入設(shè)備都提供EVIOCGRAB實(shí)現(xiàn)。顧名思義,grab就是將當(dāng)前的輸入操作抓取到當(dāng)前的操作中,讓當(dāng)前操作之外的所有應(yīng)用端讀不到觸摸屏的觸摸操作。由驅(qū)動(dòng)源碼就很容易知道該如何實(shí)現(xiàn)鎖屏解鎖操作了。源碼如下:

  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");

關(guān)鍵詞標(biāo)簽:ts_calibrate,校準(zhǔn)觸摸

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門(mén)文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程使用screen管理你的遠(yuǎn)程會(huì)話使用screen管理你的遠(yuǎn)程會(huì)話GNU/Linux安裝vmwareGNU/Linux安裝vmware如何登錄linux vps圖形界面 Linux遠(yuǎn)程桌面連如何登錄linux vps圖形界面 Linux遠(yuǎn)程桌面連

相關(guān)下載

人氣排行 Linux下獲取CPUID、硬盤(pán)序列號(hào)與MAC地址linux tc實(shí)現(xiàn)ip流量限制dmidecode命令查看內(nèi)存型號(hào)linux下解壓rar文件安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令lcx.exe、nc.exe、sc.exe入侵中的使用方法查看linux服務(wù)器硬盤(pán)IO讀寫(xiě)負(fù)載