WinCE中的Touch Panel驅(qū)動(dòng)是由GWES模塊來管理的,Touch Panel驅(qū)動(dòng)接收用戶的觸摸信息,并將其轉(zhuǎn)換為屏幕上的坐標(biāo)信息,傳給GWES模塊。在WinCE中,Touch Panel驅(qū)動(dòng)是分層的,分為MDD層和PDD層,這和其他WinCE設(shè)備驅(qū)動(dòng)是一樣的。MDD層由微軟提供,用戶只需要實(shí)現(xiàn)MDD和PDD層間的DDSI函數(shù)就可以了。如圖
WinCE中的GWES模塊負(fù)責(zé)加載和管理Touch Panel驅(qū)動(dòng),Touch Panel的MDD層向上提供DDI接口,PDD層是針對(duì)硬件的實(shí)現(xiàn),對(duì)MDD層提供DDSI接口。
WinCE中的GWES模塊負(fù)責(zé)加載和管理Touch Panel驅(qū)動(dòng),Touch Panel的MDD層向上提供DDI接口,PDD層是針對(duì)硬件的實(shí)現(xiàn),對(duì)MDD層提供DDSI接口。
1 Touch Panel驅(qū)動(dòng)中的數(shù)據(jù)結(jié)構(gòu)
(1) TOUCH_PANEL_SAMPLE_FLAGS
用于描述一個(gè)采樣點(diǎn)的信息,這些信息被定義在一個(gè)枚舉結(jié)構(gòu)中:
enum enumTouchPanelSampleFlags {
TouchSampleValidFlag = 0x01,
TouchSampleDownFlag = 0x02,
TouchSampleIsCalibratedFlag = 0x04,
TouchSamplePreviousDownFlag = 0x08,
TouchSampleIgnore = 0x10,
TouchSampleMouse = 0x40000000
};
TouchSampleValidFlag:一個(gè)有效的采樣值
TouchSampleDownFlag:第一次按觸摸屏?xí)r,返回該flag
TouchSampleIsCalibratedFlag:采樣的x和y坐標(biāo)值不需要再被校驗(yàn)了
TouchSamplePreviousDownFlag:表示上一次采樣狀態(tài)是按在觸摸屏上
TouchSampleIgnore:忽略這次采樣值
TouchSampleMouse:預(yù)留
(2) TPDC_CALIBRATION_POINT
用于描述一個(gè)校驗(yàn)點(diǎn)的相關(guān)信息,結(jié)構(gòu)如下:
struct TPDC_CALIBRATION_POINT {
INT PointNumber;
INT cDisplayWidth;
INT cDisplayHeight;
INT CalibrationX;
INT CalibrationY;
};
PointNumber:校驗(yàn)點(diǎn)索引值,用于描述校驗(yàn)點(diǎn)在LCD上的位置
0:中間
1:左上
2:左下
3:右下
4:右上
cDisplayWidth:顯示的寬度
cDisplayHeight:顯示的高度
CalibrationX:校驗(yàn)點(diǎn)的x坐標(biāo)值
CalibrationY:校驗(yàn)點(diǎn)的y坐標(biāo)值
(3) TPDC_CALIBRATION_POINT_COUNT
用于描述需要校驗(yàn)的點(diǎn)的個(gè)數(shù),結(jié)構(gòu)如下:
struct TPDC_CALIBRATION_POINT_COUNT {
DDI_TOUCH_PANEL_CALIBRATION_FLAGS flags;
INT cCalibrationPoints;
};
flags:一般為0
cCalibrationPoints:需要校驗(yàn)的點(diǎn)的個(gè)數(shù),一般是5
(4) gIntrTouch和gIntrTouchChanged
這是兩個(gè)被MDD層用到的中斷,需要在PDD層中定義,如下:
DWORD gIntrTouch = SYSINTR_NOP;
DWORD gIntrTouchChanged = SYSINTR_NOP;
gIntrTouch用于描述觸摸屏中斷,要和硬件的觸摸屏中斷相關(guān)聯(lián)。
gIntrTouchChanged用于在觸摸屏按下后,每隔一段時(shí)間進(jìn)行一次采樣,應(yīng)該和硬件的一個(gè)定時(shí)器中斷相關(guān)聯(lián)。
這兩個(gè)值應(yīng)該在DdsiTouchPanelEnable(..)函數(shù)中和硬件中斷關(guān)聯(lián),并在函數(shù)DdsiTouchPanelGetPoint(..)中根據(jù)情況清除相應(yīng)的中斷。
2 MDD層API
MDD為上層導(dǎo)出所需的Touch Panel驅(qū)動(dòng)接口函數(shù),上層通過這些函數(shù)可以完成對(duì)Touch Panel的操作,下面會(huì)介紹這些函數(shù)的功能。
(1) BOOL TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback):
使能Touch Panel設(shè)備,用于初始化Touch Panel。
pfnCallback:指向處理Touch Panel事件的回調(diào)函數(shù)
(2) Void TouchPanelDisable(void):
禁用Touch Panel設(shè)備。
(3) BOOL TouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput ):
獲得Touch Panel設(shè)備的相關(guān)信息。
iIndex:索引值
TPDC_SAMPLE_RATE_ID:采樣率信息
TPDC_CALIBRATION_POINT_COUNT_ID:采樣點(diǎn)個(gè)數(shù)信息
TPDC_CALIBRATION_POINT_ID:采樣點(diǎn)坐標(biāo)信息
lpOutput:指向一個(gè)內(nèi)存區(qū)域,用于存放獲得的相關(guān)信息
(4) VOID TouchPanelCalibrateAPoint(INT32 UncalX, INT32 UncalY, INT32* pCalX, INT32* pCalY):
將輸入的未經(jīng)過校驗(yàn)的坐標(biāo)信息轉(zhuǎn)換成校驗(yàn)后的坐標(biāo)信息。
UncalX:輸入的X坐標(biāo)
UncalY:輸入的Y坐標(biāo)
pCalX:校驗(yàn)后的X坐標(biāo)
pCalY: 校驗(yàn)后的Y坐標(biāo)
(5) VOID TouchPanelPowerHandler(BOOL bOff):
Touch Panel的電源控制函數(shù)。
bOff:TRUE表示關(guān)閉電源,F(xiàn)ALSE表示打開電源
(6) BOOL TouchPanelReadCalibrationPoint(INT* pRawX, INT* pRawY):
獲得Touch Panel的坐標(biāo)。
pRawX:觸摸屏的X坐標(biāo)
PRawY:觸摸屏的Y坐標(biāo)
(7) VOID TouchPanelReadCalibrationAbort(void):
終止當(dāng)前的校驗(yàn)。
(8) VOID TouchPanelSetCalibration(INT32 cCalibrationPoints, INT32* pScreenXBuffer, INT32* pScreenYBuffer, INT32* pUncalXBuffer, INT32* pUncalYBuffer):
校驗(yàn)函數(shù)。通過一組實(shí)際的觸摸屏上采集的點(diǎn)坐標(biāo)和相應(yīng)的屏幕坐標(biāo)計(jì)算校驗(yàn)系數(shù)。具體公式如下:
Sx = A1*Tx + B1*Ty + C1
Sy = A2*Tx + B2*Ty + C2
這里就是通過顯示屏坐標(biāo)和采樣的觸摸屏坐標(biāo)計(jì)算A1,B1,C1,A2,B2,C2。
cCalibrationPoints:校驗(yàn)點(diǎn)的個(gè)數(shù)
pScreenXBuffer:一組顯示屏上的X坐標(biāo)
pScreenYBuffer:一組顯示屏上的Y坐標(biāo)
pUncalXBuffer:一組觸摸屏上采樣的X坐標(biāo)
pUncalYBuffer:一組觸摸屏上采樣的Y坐標(biāo)
(9) BOOL TouchPanelSetMode(INT iIndex, LPVOID lpInput):
設(shè)置Touch Panel的工作模式。
iIndex:索引模式
TPSM_SAMPLERATE_HIGH:設(shè)置高采樣率
TPSM_SAMPLERATE_LOW:設(shè)置低采樣率
TPSM_PRIORITY_HIGH_ID:設(shè)置觸摸屏的IST為高優(yōu)先級(jí)
TPSM_PRIORITY_NORMAL_ID:設(shè)置IST為正常優(yōu)先級(jí)
lpInput:指向一塊內(nèi)存,其中包含相關(guān)信息。
3 PDD層API
(1) LONG DdsiTouchPanelAttach(void):
該函數(shù)在Touch Panel驅(qū)動(dòng)的Dll被加載的時(shí)候調(diào)用
(2) LONG DdsiTouchPanelDettach(void):
該函數(shù)在Touch Panel驅(qū)動(dòng)的Dll被卸載的時(shí)候調(diào)用
(3) BOOL DdsiTouchPanelEnable(void):
打開Touch Panel電源并做初始化。一般會(huì)在這里初始化一些信息,打開Touch Panel設(shè)備電源并做初始化。
(4) VOID DdsiTouchPanelDisable(void):
關(guān)閉Touch Panel設(shè)備。關(guān)閉Touch Panel電源并釋放資源。
(5) BOOL DdsiTouchPanelGetDeviceCaps(ULONG iIndex, LPVOID lpOutput):
查詢Touch Panel設(shè)備的相關(guān)信息
iIndex:查詢的索引值
TPDC_SAMPLE_RATE_ID:查詢采樣率信息
TPDC_CALIBRATION_POINT_ID:查詢需要校驗(yàn)的點(diǎn)的坐標(biāo)
TPDC_CALIBRATION_POINT_COUNT_ID:查詢用于校驗(yàn)的點(diǎn)的個(gè)數(shù)
lpOutput:根據(jù)iIndex值分別指向相關(guān)的信息
(6) void DdsiTouchPanelGetPoint(TOUCH_PANEL_SAMPLE_FLAGS pTipState, PLONG pUnCalX, PLONG pUnCalY):
獲得Touch Panel上被按下的點(diǎn)的狀態(tài)和坐標(biāo)。
pTipState:當(dāng)前觸摸點(diǎn)的狀態(tài),比如無效點(diǎn),有效點(diǎn),被按下的點(diǎn)等。
pUnCalX:觸摸點(diǎn)的X坐標(biāo)
pUnCalY:觸摸點(diǎn)的Y坐標(biāo)
(7) VOID DdsiTouchPanelPowerHandler(BOOL bOff):
設(shè)置Touch Panel的電源狀態(tài)。
bOff:TRUE表示關(guān)閉電源,F(xiàn)ALSE表示打開電源
(8) BOOL DdsiTouchPanelSetMode(ULONG iIndex, LPVOID lpInput):
設(shè)置Touch Panel工作模式。
iIndex:模式索引
TPSM_SAMPLERATE_HIGH_ID:高采樣率
TPSM_SAMPLERATE_LOW_ID:低采樣率
lpInput:指向包含相關(guān)信息的內(nèi)存
4 注冊(cè)表設(shè)置
對(duì)于Touch Panel驅(qū)動(dòng)來說,有些注冊(cè)表項(xiàng)是需要配置的。具體如下:
“InputConfig”:WinCE系統(tǒng)輸入配置。
Bit0表示鍵盤輸入
Bit1表示Touch Panel輸入
Bit2表示硬件按鍵輸入
“DeviceName”:Touch Panel驅(qū)動(dòng)的名字。
“MaxCalError”:Touch Panel的精確度配置。
“CalibrationData”:Touch Panel的校驗(yàn)值。第一次啟動(dòng)WinCE后,需要通過WinCE的觸摸屏校驗(yàn)程序?qū)ouch Panel進(jìn)行校驗(yàn)。校驗(yàn)完成后,校驗(yàn)值會(huì)被寫入注冊(cè)表里面。
下面是關(guān)于Touch Panel的注冊(cè)表配置的例子:
[HKEY_LOCAL_MACHINE\ControlPanel]
"InputConfig"=dword:3 ;3 => keybd and touch screen
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\TOUCH]
"DriverName"="touch.dll"
"MaxCalError"=dword:8
"CalibrationData"="446,671 36,191 38,1179 856,1161 862,169 "
個(gè)人覺得,要想更好的理解Touch Panel驅(qū)動(dòng),還是需要去讀讀代碼,基于WinCE6.0下,可以參考"\WINCE600\PLATFORM\H4SAMPLE\SRC\DRIVERS\TOUCH"下面的驅(qū)動(dòng),基于這個(gè)驅(qū)動(dòng)開發(fā)自己的驅(qū)動(dòng)會(huì)比較方便。
Windows CE下觸摸屏驅(qū)動(dòng)實(shí)現(xiàn)的分析
Analysis of Touch Panel Driver Realization Based on Windows CE OS
劉林輝1 張 芬2
Liu,LinHui1 Zhang,Fen2
(1 長沙理工大學(xué)能源與動(dòng)力工程學(xué)院,湖南 長沙,410077;2 華中科技大學(xué)機(jī)械科學(xué)與工程學(xué)院,湖北 武漢,430074)
摘要:本文介紹了Windows CE操作系統(tǒng)的觸摸屏驅(qū)動(dòng)程序模型,詳細(xì)闡述嵌入式系統(tǒng)中電阻式觸摸屏的Windows CE驅(qū)動(dòng)程序的設(shè)計(jì)和實(shí)現(xiàn)方法。
關(guān)鍵詞:觸摸屏,Windows CE
中圖分類號(hào):TP316
文獻(xiàn)標(biāo)識(shí)碼:A
Abstract:This article introduced touch panel driver model of Windows CE operating system, and elaborated the driver design and the realization method of resistance-type touch panel based on an embedded system which take Windows CE as operating system.
Keyword:Touch Panel,Windows CE
1. 前言
觸摸屏是嵌入式設(shè)備中常用的計(jì)算機(jī)輸入設(shè)備,它可使操作簡(jiǎn)單直觀,人人都會(huì)使用,這一點(diǎn)無論是鍵盤還是鼠標(biāo)都無法與其相比。在手機(jī)、PDA等手持產(chǎn)品及公共服務(wù)設(shè)備中大量采用觸摸屏。觸摸屏分為電阻式、電容式、表面聲波式等多種,電阻式觸摸屏是目前應(yīng)用比較廣泛的一種,有四線、五線、七線等幾種。本文將分析Windows CE操作系統(tǒng)下的觸摸屏驅(qū)動(dòng)程序模型及實(shí)現(xiàn)方法。
2. Windows CE觸摸屏驅(qū)動(dòng)程序模型
在Windows CE操作系統(tǒng)中觸摸屏驅(qū)動(dòng)是一種分層驅(qū)動(dòng)。其驅(qū)動(dòng)模型如圖1所示。上層是模型設(shè)備驅(qū)動(dòng)程序(Model Device Driver, MDD),下層是依賴平臺(tái)的驅(qū)動(dòng)程序(Platform Dependent Driver, PDD)。MDD通常無需修改直接使用,MDD鏈接PDD層并定義它希望調(diào)用的函數(shù)接口:設(shè)備驅(qū)動(dòng)程序提供器接口(Device Driver Service Provider Interface, DDSI)。同時(shí)MDD把不同的函數(shù)集提供給操作系統(tǒng),這些函數(shù)叫做設(shè)備驅(qū)動(dòng)程序接口(Device Driver Interface, DDI),這部分為也就是我們通常驅(qū)動(dòng)需要實(shí)現(xiàn)的部分。
3 Windows CE的觸摸屏驅(qū)動(dòng)程序接口
Windows CE的觸摸屏驅(qū)動(dòng)鏈接了tch_cal.lib和tchmdd.lib兩個(gè)靜態(tài)鏈接庫。觸摸屏驅(qū)動(dòng)由GWES加載,GWES通過DDI調(diào)用驅(qū)動(dòng)程序獲取設(shè)備狀態(tài),設(shè)置驅(qū)動(dòng)功能等,而驅(qū)動(dòng)本身通過DDSI直接獲得硬件信息來確定當(dāng)前觸摸屏的狀態(tài)。
Windows CE觸摸屏驅(qū)動(dòng)要求的DDI接口包括:TouchPanelGetDeviceCaps、TouchPanelEnable、TouchPanelDisable、TouchPanelSetMode、TouchPanelReadCalibrationPoint、TouchPanelReadCalibrationAbort、TouchPanelSetCalibration、TouchPanelCalibrateAPoint、TouchPanelPowerHandler。
Windows CE觸摸屏驅(qū)動(dòng)要求的DDSI接口包括:DdsiTouchPanelAttach、DdsiTouchPanelDetach、DdsiTouchPanelDisable、DdsiTouchPanelEnable、DdsiTouchPanelGetDeviceCaps、DdsiTouchPanelGetPoint、DdsiTouchPanelPowerHandler。
4 Windows CE的觸摸屏數(shù)據(jù)采集
Windows CE觸摸屏驅(qū)動(dòng)程序采用中斷方式對(duì)觸摸筆的按下狀態(tài)進(jìn)行檢測(cè),如果檢測(cè)到觸摸筆按下將產(chǎn)生中斷并觸發(fā)一個(gè)事件通知一個(gè)工作線程開始采集數(shù)據(jù)。同時(shí),驅(qū)動(dòng)將打開一個(gè)硬件定時(shí)器,只要檢測(cè)到觸摸筆仍然在按下狀態(tài)將定時(shí)觸發(fā)同一個(gè)事件通知工作線程采集數(shù)據(jù),直到觸摸筆抬起后關(guān)閉該定時(shí)器,并重新檢測(cè)按下狀態(tài)。驅(qū)動(dòng)中采用了觸摸屏中斷以及定時(shí)器中斷兩個(gè)中斷源,不僅可以監(jiān)控觸摸筆按下和抬起狀態(tài),而且可以檢測(cè)觸摸筆按下時(shí)的拖動(dòng)軌跡。
觸摸屏驅(qū)動(dòng)在初始化過程調(diào)用TouchPanelEnable函數(shù)使能觸摸屏。該函數(shù)調(diào)用的DDSI函數(shù)為:DdsiTouchPanelEnable和DdsiTouchPanelDisable。該函數(shù)實(shí)現(xiàn)如下 內(nèi)容:
1) 創(chuàng)建事件hTouchPanelEvent和hCalibrationSampleAvailable。hTouchPanelEvent事件在正常狀態(tài)下當(dāng)有觸摸筆按下或者按下后需要定時(shí)采集數(shù)據(jù)時(shí)被觸發(fā)。而hCalibrationSampleAvailable事件在校準(zhǔn)狀態(tài)下當(dāng)有校準(zhǔn)數(shù)據(jù)輸入時(shí)被觸發(fā);
2) 檢查并初始化所需的中斷gIntrTouch(觸摸屏中斷)和gIntrTouchChanged(定時(shí)器中斷),并將中斷gIntrTouch、gIntrTouchChanged關(guān)聯(lián)到事件hTouchPanelEvent。當(dāng)gIntrTouch,gIntrTouchChanged中斷產(chǎn)生時(shí)將觸發(fā)hTouchPanelEvent事件;
3) 創(chuàng)建一個(gè)ISR線程TouchPanelpISR。TouchPanelpISR用于等待和處理觸摸屏事件hTouchPanelEvent,它是整個(gè)驅(qū)動(dòng)程序中唯一的事件源。
TouchPanelpISR函數(shù)是實(shí)現(xiàn)觸摸屏數(shù)據(jù)采集關(guān)鍵函數(shù),它實(shí)現(xiàn)的內(nèi)容為:
1) 等待循環(huán),用于接收hTouchPanelEvent事件,并構(gòu)成函數(shù)的主體;
2) 通過調(diào)用DdsiTouchPanelGetPoint函數(shù)獲取當(dāng)前觸摸屏位置和狀態(tài)信息;
3) 在獲取有效數(shù)據(jù)且在校準(zhǔn)狀態(tài)下,收集并提交按下的位置信息;
4) 在正常狀態(tài)下,校準(zhǔn)數(shù)據(jù),并檢查校準(zhǔn)后數(shù)據(jù)的有效性;
5) 最后調(diào)用由GWES傳入的回調(diào)函數(shù),提交位置信息和狀態(tài)信息。
因此,在觸摸屏驅(qū)動(dòng)程序中DdsiTouchPanelEnable、DdsiTouchPanelDisable和DdsiTouchPanelGetPoint三個(gè)DDSI接口函數(shù)是驅(qū)動(dòng)實(shí)現(xiàn)的關(guān)鍵所在。
在DdsiTouchPanelEnable和DdsiTouchPanelDisable函數(shù)中分別打開和關(guān)閉觸摸屏硬件,這兩個(gè)函數(shù)其實(shí)可以不真正操作硬件,而只是實(shí)現(xiàn)軟件上的控制,但是為了降低功耗最好在DdsiTouchPanelDisable中將觸摸屏控制器電源關(guān)閉并在DdsiTouchPanelEnable函數(shù)中打開。
在DdsiTouchPanelGetPoint函數(shù)中實(shí)現(xiàn)對(duì)觸摸屏數(shù)據(jù)的采樣。從上面的分析得知MDD通過檢測(cè)hTouchPanelEvent和hCalibrationSampleAvailable事件控制采樣,這兩個(gè)事件被觸發(fā)都將調(diào)用該函數(shù)。而這兩個(gè)事件觸發(fā)條件有兩個(gè):
1) 觸摸筆按下時(shí)產(chǎn)生觸摸屏中斷gIntrTouch時(shí)觸發(fā);
2) 觸摸筆按下后,定時(shí)器被打開,定時(shí)器將定時(shí)產(chǎn)生中斷gIntrTouchChanged,并觸發(fā)事件,直到觸摸筆抬起為止。
因此該函數(shù)不僅需要對(duì)觸摸屏數(shù)據(jù)采樣,而且需要對(duì)觸發(fā)條件進(jìn)行狀態(tài)控制,其流程如圖2所示。圖中定義了三個(gè)變量,它們分別為:
1) TouchIrq為靜態(tài)變量或全局變量,且初始值為TRUE,該變量必須在觸摸屏按下并產(chǎn)生觸摸屏中斷時(shí)設(shè)置為FALSE;
2) InterruptType為靜態(tài)變量或全局變量,且初始值為SYSINTR_NOP,當(dāng)在處理觸摸屏中斷時(shí)設(shè)置為SYSINTR_TOUCH,在處理定時(shí)器中斷時(shí)設(shè)置為SYSINTR_TOUCH_CHANGED,其余設(shè)置為SYSINTR_NOP,且在處理完畢后必須將其作為參數(shù)傳入InterruptDone函數(shù)以清除中斷;
3) g_NextExpectedInterrupt為靜態(tài)變量或全局變量,該變量表示下一個(gè)希望產(chǎn)生的中斷,初始狀態(tài)為PEN_DOWN,也就是觸摸筆在抬起狀態(tài),因此希望下一個(gè)產(chǎn)生的中斷為PEN_DOWN。當(dāng)觸摸屏中斷產(chǎn)生以及定時(shí)器中斷產(chǎn)生時(shí)該變量為PEN_UP_OR_TIMER,也就是下一個(gè)可能產(chǎn)生的狀態(tài)為觸摸筆抬起狀態(tài)或者觸摸筆按下但定時(shí)器中斷產(chǎn)生。
DdsiTouchPanelGetPoint函數(shù)一開始從觸摸筆抬起狀態(tài)開始執(zhí)行,此時(shí)TouchIrq等于TRUE。如果此時(shí)觸摸筆按下,將設(shè)置TouchIrq為FALSE,表示本次采樣是由于觸摸屏中斷產(chǎn)生并設(shè)置下一次調(diào)用由定時(shí)器產(chǎn)生。然后設(shè)置InterruptType狀態(tài)為SYSINTR_TOUCH,接著開始采集數(shù)據(jù)并設(shè)置g_NextExpectedInterrupt變量為PEN_UP_OR_TIMER,表示下一次產(chǎn)生的中斷為定時(shí)器中斷。接著判斷在觸摸筆按下狀態(tài)(g_NextExpectedInterrupt等于PEN_UP_OR_TIMER)下觸摸筆是否抬起,如果抬起則設(shè)置g_NextExpectedInterrupt為PEN_DOWN恢復(fù)到抬起狀態(tài)。最后通過將InterruptType作為參數(shù)傳入InterruptDone函數(shù)以清除中斷。當(dāng)觸摸筆按下,并產(chǎn)生定時(shí)器中斷時(shí),TouchIrq等于FALSE,此時(shí)InterruptType被設(shè)置為SYSINTR_TOUCH_CHANGED,其余的動(dòng)作基本和上面的流程一致。
5 Windows CE下的觸摸屏校準(zhǔn)
電阻觸摸屏需要校準(zhǔn)。應(yīng)用程序需要一些參考值,以便將接收到的觸摸屏坐標(biāo)數(shù)據(jù)轉(zhuǎn)換成高層軟件所需的屏幕坐標(biāo)。理想情況下校準(zhǔn)程序只要在產(chǎn)品初次加電測(cè)試過程中運(yùn)行一次就可以了,參考值被存儲(chǔ)在非易失性存儲(chǔ)器中。在理想情況下只需兩組原始數(shù)據(jù),即在屏幕對(duì)角讀取的最小和最大值。而在實(shí)際應(yīng)用中,因?yàn)樵S多電阻觸摸屏存在顯著的非線性,因此如果在最小和最大值之間簡(jiǎn)單的插入位置數(shù)值會(huì)導(dǎo)致驅(qū)動(dòng)程序非常的不精確。
在Windows CE中通過在函數(shù)DdsiTouchPanelGetDeviceCaps 中設(shè)置校準(zhǔn)點(diǎn)的個(gè)數(shù),在TouchDriverCalibrationPointGet中獲取每個(gè)校準(zhǔn)點(diǎn)的屏幕坐標(biāo)。常用的校準(zhǔn)點(diǎn)數(shù)量為5。校準(zhǔn)UI將在校準(zhǔn)點(diǎn)坐標(biāo)處相應(yīng)顯示一個(gè)十字叉,用戶需要精確地在該十字叉位置按下觸摸屏,驅(qū)動(dòng)通過TouchPanelReadCalibrationPoint函數(shù)讀取相應(yīng)的觸摸屏坐標(biāo)值,然后開始下一個(gè)校準(zhǔn)點(diǎn)。循環(huán)設(shè)定的次數(shù)后,將采集到的觸摸屏坐標(biāo)值和校準(zhǔn)點(diǎn)屏幕坐標(biāo)送到TouchPanelSetCalibration函數(shù)中進(jìn)行處理。該函數(shù)將產(chǎn)生校準(zhǔn)基準(zhǔn)參數(shù)。
TouchPanelSetCalibration函數(shù)執(zhí)行的動(dòng)作是一套數(shù)學(xué)算法,具體內(nèi)容為:
在觸摸屏數(shù)據(jù)與其位置偏移關(guān)系且屏幕像素與其位置偏移關(guān)系同為線性關(guān)系假設(shè)情況下,觸摸屏返回的位置信息與像素位置信息之間成2D坐標(biāo)變換關(guān)系。則對(duì)于觸摸屏按下點(diǎn)的觸摸屏坐標(biāo)(Tx,Ty)與其在顯示設(shè)備位置關(guān)系上匹配的點(diǎn)的屏幕坐標(biāo)(Sx,Sy)之間的轉(zhuǎn)換關(guān)系,可以通過下述坐標(biāo)變換表示:
Sx = A1*Tx + B1*Ty + C1
Sy = A2*Tx + B2*Ty + C2
TouchPanelSetCalibration的具體工作就是通過校準(zhǔn)的動(dòng)作獲取的屏幕坐標(biāo)和觸摸屏坐標(biāo)TouchCoordinate來確定A1,B1,C1和A2, B2, C2。
6. 結(jié)束語
本文作者的創(chuàng)新點(diǎn):從分析嵌入式Windows CE操作系統(tǒng)中觸摸屏驅(qū)動(dòng)程序的模型及實(shí)現(xiàn)方法的角度深入剖析了Windows CE中觸摸屏數(shù)據(jù)采集和校準(zhǔn)的執(zhí)行流程,對(duì)于類似系統(tǒng)的驅(qū)動(dòng)開發(fā)具有一定的借鑒性。
參考文獻(xiàn):
[1] Paul Kovitz. 電阻式觸摸屏結(jié)構(gòu)和實(shí)現(xiàn)原理,夏普公司,2003
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/zhongnanjun_3/archive/2008/11/11/3274020.aspx