觸摸屏驅動(dòng)程序的設計和實(shí)現
嵌入式設備觸摸屏按其技術(shù)原理可分為五類(lèi):矢量壓力傳感式、電阻式、電容式、紅外線(xiàn)式和表面聲波式。其中電阻式觸摸屏在嵌入式系統中用的較多,電阻式觸摸屏可分為四線(xiàn)、五線(xiàn)、七線(xiàn)等幾種。一般來(lái)說(shuō),WinCE觸摸屏驅動(dòng)的設計和實(shí)現有以下幾個(gè)步驟:
(1)配置和初始化觸摸屏
觸摸屏驅動(dòng)在初始化過(guò)程會(huì )調用TouchPanelEnable函數,該函數調用的DDSI函數為DdsiTouchPanelEnable和DdsiTouchPanelDisable。這兩個(gè)DDSI接口函數是驅動(dòng)實(shí)現的關(guān)鍵所在,分別用于打開(kāi)和關(guān)閉觸摸屏硬件。但是為了降低功耗,這兩個(gè)函數其實(shí)可以不真正操作硬件,而只是實(shí)現軟件上的控制。
同時(shí),在初始化時(shí)還需要進(jìn)行這幾個(gè)配置和初始化:一是創(chuàng )建事件hTouchPanelEvent和hCalibrationSampleAvailable,前者是在正常狀態(tài)下當有觸摸筆按下或者按下后需要定時(shí)采集數據時(shí)被觸發(fā);而后者是在校準狀態(tài)下當有校準數據輸入時(shí)被觸發(fā)。二是檢查初始化所需的中斷gIntrTouch(觸摸屏中斷)和gIntrTouchChanged(定時(shí)器中斷),并將這兩個(gè)中斷關(guān)聯(lián)到事件hTouchPanelEvent。三是創(chuàng )建一個(gè)ISR線(xiàn)程TouchPanelpISR,用于等待和處理觸摸屏事件hTouchPanelEvent,它也是整個(gè)驅動(dòng)程序中*的事件源。
(2)校準觸摸屏基準參數
完成前面繁瑣的工作后,驅動(dòng)程序的各種功能就都已經(jīng)準備就緒了,現在就可以實(shí)際操作觸摸屏幕了。但一般來(lái)說(shuō),電阻式觸摸屏需要校準,也就是說(shuō)在驅動(dòng)啟動(dòng)過(guò)程中MDD層要調用相應的DDSI函數來(lái)讀取注冊表中的校正數據校正觸摸屏。理想情況下,校準程序只要在嵌入式設備初次加電測試過(guò)程中運行一次就可以了,參考值會(huì )被存儲在非易失性存儲器中,以免讓用戶(hù)在以后的加電啟動(dòng)期間再做校準。不過(guò),高質(zhì)量的觸摸屏驅動(dòng)程序是應該要向用戶(hù)提供一種進(jìn)入校準例程的途徑,從而在由于溫度漂移或其它因素造成校準不準確時(shí)進(jìn)行重新校準。
在理想情況下,校正觸摸屏基準只需兩組原始數據,即在屏幕對角讀取的zui小和zui大值。但在實(shí)際應用中,因為許多電阻式觸摸屏存在明顯的非線(xiàn)性,如果只在zui小和zui大值之間簡(jiǎn)單的插入位置數值會(huì )導致驅動(dòng)程序非常的不。因此,在WinCE中需要獲取多個(gè)校準點(diǎn),常用的校準點(diǎn)數量為5個(gè)。
方法是:①首動(dòng)程序在函數DdsiTouchPanelGetDeviceCaps 中設置校準點(diǎn)的個(gè)數;②是系統在TouchDriverCalibrationPointGet中獲取每個(gè)校準點(diǎn)的屏幕坐標;③是在屏幕界面的校準點(diǎn)坐標處顯示一個(gè)位置符號,用戶(hù)需要地在位置符號按下觸摸屏;④驅動(dòng)程序通過(guò)TouchPanelReadCalibrationPoint函數讀取相應的觸摸屏坐標值;⑤然后再開(kāi)始下一個(gè)校準點(diǎn),直到循環(huán)設定的次數后將采集到的觸摸屏坐標值和校準點(diǎn)屏幕坐標送到TouchPanelSetCalibration函數中進(jìn)行處理,該函數將產(chǎn)生校準基準參數。校準完成之后,觸摸屏便可以開(kāi)始正常的操作了。
(3)判斷屏幕是否被觸摸
一旦完成了觸摸屏硬件設置、初始化和基準參數校準后,接下來(lái)就需要用一種可靠的方法來(lái)判斷屏幕是否被觸摸了。WinCE提供了屏幕是否被觸摸的檢測機制,而且當觸摸事件發(fā)生時(shí)還可選擇是否中斷主處理器。判斷屏幕是否被觸摸的驅動(dòng)程序的函數名叫WaitForTouchState()。當屏幕被初次觸摸時(shí)喚醒主機的中斷,稱(chēng)為PEN_DOWN中斷。這樣做可以讓驅動(dòng)程序在屏幕沒(méi)有被觸摸時(shí)中斷自己的執行,而不消耗任何CPU資源,而一旦用戶(hù)觸摸屏幕,驅動(dòng)程序就被喚醒并進(jìn)入轉換模式。
當被喚醒后就有一組模數數據等待轉換并產(chǎn)生中斷信號。中斷是硬件與軟件打交道的重要方法,所以大多數驅動(dòng)程序都涉及到中斷處理。就中斷處理而言,WinCE采用了一種*的方法。它將中斷處理分為兩步:中斷服務(wù)例程(ISR)和中斷服務(wù)線(xiàn)程(IST)。具體來(lái)講就是把每個(gè)硬件的設備中斷請求(IRQ) 和一個(gè)ISR 起來(lái),當一個(gè)中斷發(fā)生并未被屏蔽時(shí),內核調用該中斷注冊的ISR。因為ISR 運行于內核模式,所以應該被設計得盡可能的短,ISR 的基本職責是引導內核調度和啟動(dòng)合適的IST。IST 在設備驅動(dòng)程序軟件模塊中編寫(xiě),它從硬件獲取或向硬件發(fā)送數據和控制代碼,并進(jìn)一步處理設備中斷。
WinCE觸摸屏驅動(dòng)程序是采用中斷方式對觸摸筆的按下?tīng)顟B(tài)進(jìn)行檢測,當檢測到觸摸筆按下時(shí)產(chǎn)生的中斷,就會(huì )觸發(fā)一個(gè)事件通知一個(gè)工作線(xiàn)程開(kāi)始采集數據。同時(shí),驅動(dòng)將打開(kāi)一個(gè)硬件定時(shí)器,只要檢測到觸摸筆仍然在按下?tīng)顟B(tài),將定時(shí)觸發(fā)同一個(gè)事件通知這個(gè)工作線(xiàn)程繼續采集數據,直到觸摸筆抬起后關(guān)閉該定時(shí)器。簡(jiǎn)單的說(shuō),就是驅動(dòng)程序會(huì )同時(shí)采用觸摸屏中斷和定時(shí)器中斷這兩個(gè)中斷源。目的在于不僅可以監控觸摸筆按下和抬起狀態(tài),而且可以檢測觸摸筆按下時(shí)的拖動(dòng)軌跡。觸摸屏中斷的兩個(gè)邏輯中斷分別是:SYSINTR_TOUCH是用于觸摸筆點(diǎn)擊觸摸屏時(shí)產(chǎn)生相應的中斷;SYSINTR_TOUCH_CHANGE則用于觸摸筆離開(kāi)時(shí)產(chǎn)生相應的中斷。
(4)獲得穩定的、去抖動(dòng)的測量數據
在進(jìn)行觸摸屏程序開(kāi)發(fā)時(shí),一定要注意原始的觸摸測量數據經(jīng)常會(huì )有一些噪聲和偏差,這是正常的。一般來(lái)說(shuō),只有用戶(hù)緊緊壓住電阻觸摸屏才能得到兩個(gè)連續的讀數,然而我們會(huì )發(fā)現當觸控筆或手指按上或離開(kāi)觸摸屏時(shí),讀數的變化要比保持穩定壓力時(shí)大得多。這是因為用戶(hù)是以機械的方式連通二個(gè)平面電阻-觸摸層,當用戶(hù)按壓和釋放觸摸屏時(shí),在很短的一段時(shí)間內觸摸屏的電氣連接均處于臨界狀態(tài)。這時(shí),我們需要丟棄這些讀數直到系統穩定下來(lái),否則提交的觸摸位置讀數會(huì )產(chǎn)生大幅跳躍,導致嚴重的失真或觸摸位置漂移。
這時(shí)就需要進(jìn)行折衷考慮,這也是觸摸屏驅動(dòng)設計的關(guān)鍵所在。如果我們要求較窄的穩定窗口,那么驅動(dòng)程序將無(wú)法跟蹤快速的“拖曳”操作;如果加寬穩定窗口,就可能面臨著(zhù)許多風(fēng)險,這些風(fēng)險包括接收到不的觸摸數據,或上面描述處于臨界狀態(tài)的層連接結果。這時(shí),就需要通過(guò)實(shí)驗來(lái)確定適合系統的*值。
在正常情況下,當屏幕被觸摸時(shí)驅動(dòng)程序應會(huì )得到每個(gè)穩定的讀數,并利用簡(jiǎn)單的線(xiàn)性插值法將原始數據轉換成像素坐標。讀取觸摸點(diǎn)的坐標是由DdsiTouchPanalGetPoint()函數實(shí)現的。另外,在每個(gè)轉換過(guò)程的前后,驅動(dòng)程序必須檢查并確認屏幕仍處于被觸摸狀態(tài)。因為我們不希望采集到實(shí)際上是處于“開(kāi)路狀態(tài)”的穩定讀數。因此,在讀取觸摸數據時(shí),我們需要對原始數據進(jìn)行去抖動(dòng)處理,然后確定屏幕被觸摸時(shí)是否有穩定的讀數;如果不穩定就要繼續讀取數據并進(jìn)行去抖動(dòng)處理,直到得到穩定的數據為止。
zui后,觸摸屏驅動(dòng)程序應將觸摸狀態(tài)和位置變化信息發(fā)送給更高層的應用軟件,以完成一次完整的觸摸操作。
聯(lián)系我們
唐山領(lǐng)航自動(dòng)化設備有限公司 公司地址:河北省唐山市開(kāi)平區東華五金城14棟1號掃一掃 更多精彩
微信二維碼
網(wǎng)站二維碼