使用ts calibrate校準觸控螢幕

2021-06-20 00:36:46 字數 2480 閱讀 8512

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

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校準觸控螢幕

使用ts lib包自帶的ts calibrate校準觸控螢幕非常簡單實用,但在基於xsever的gui應用環境下,有兩個問題存在 1.校準後必須重新啟動x,應用端才能生效。這樣處理使用者肯定不能接受,因為啟動一次機器畢竟耗時。2.在使用ts calibrate校準觸控螢幕時,要觸控5個點,這時如果g...

使用ts calibrate校準觸控螢幕

使用ts lib包自帶的ts calibrate校準觸控螢幕非常簡單實用,但在基於xsever的gui應用環境下,有兩個問題存在 1.校準後必須重新啟動x,應用端才能生效。這樣處理使用者肯定不能接受,因為啟動一次機器畢竟耗時。2.在使用ts calibrate校準觸控螢幕時,要觸控5個點,這時如果g...

AFC校準過程

afc校準過程 一型別為crystal crystal是指晶體 crystal afc的校準過程 先校準cap id 在afc dac不變的前提下,在0 63 127 範圍內之間選取乙個cap id,選取的標準是其對應的傳送訊號頻率頻偏最小,然後對這個cap id進行驗證是否在正確的範圍中,針對62...