• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            唐吉訶德

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              5 Posts :: 75 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            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

            posted on 2011-03-01 11:51 心羽 閱讀(918) 評(píng)論(0)  編輯 收藏 引用 所屬分類: wince
            精品国产乱码久久久久久人妻 | 婷婷久久综合| 久久久久久无码国产精品中文字幕| 久久精品亚洲福利| 国产aⅴ激情无码久久| 国产成人精品久久亚洲高清不卡| 亚洲国产日韩欧美久久| 久久精品国产亚洲av麻豆色欲| 精品久久一区二区三区| 热久久视久久精品18| 91精品国产91久久久久久蜜臀| 99久久这里只精品国产免费| 久久成人精品| 久久久黄片| AV狠狠色丁香婷婷综合久久| 97久久婷婷五月综合色d啪蜜芽| 日本精品久久久久中文字幕8| 精品久久久噜噜噜久久久| 久久精品亚洲精品国产欧美| 99久久精品国内| 久久久久免费精品国产| 久久WWW免费人成一看片| 久久精品成人免费国产片小草| 亚洲中文久久精品无码| 亚洲午夜精品久久久久久浪潮 | 亚州日韩精品专区久久久| 国内精品久久久久| 久久精品国产第一区二区三区| 一级做a爰片久久毛片看看| 久久精品18| 久久久中文字幕日本| 香蕉久久久久久狠狠色| 久久99精品久久久久久噜噜| 91久久成人免费| 国产91久久综合| 国产日韩久久久精品影院首页| 久久精品国产半推半就| 大美女久久久久久j久久| 久久天天躁狠狠躁夜夜av浪潮| 国产精品狼人久久久久影院| 久久久精品日本一区二区三区 |