qt觸控螢幕的適配層tslib

2021-06-23 07:51:57 字數 2243 閱讀 2371

使用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 從觸控螢幕驅動取樣到的裝置座標進行處理再提供給應用端的過程大體如下:

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)

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("lock the ts success /n");

QT 觸控螢幕 TSLIB庫

tslib 是linux 觸控螢幕驅動與 qt之間的一層庫,用於支援 event 事件,在 qt中也配有 linux input 選項支援觸控螢幕,不過由於事件結構與 linux 驅動傳遞的 input event 不匹配,因而不配使用。a qt編譯 qt的編譯中需要在 configure 中新增 ...

linux arm移植觸控螢幕tslib

tar zxvf tslib 1.4.tar.gz cd tslib autogen.sh echo ac cv func malloc 0 nonnull yes arm linux.cache configure host arm linux cache file arm linux.cache...

QT 觸控螢幕 驅動

要 本文主要介紹了在嵌入式 linux 系統下基於 qt embeded 的觸控螢幕驅動的設計,通過對 linux 裝置 驅動和qt embedded裝置驅動介面的工作原理和機制介紹,並結合大量源 進行分析,提出了基於qt embeded 的觸控螢幕驅動的開發方案。linux 下的裝置驅動基礎 li...