WinCE中的Touch Panel驅動是由GWES模塊來管理的,Touch Panel驅動接收用戶的觸摸信息,并將其轉換為屏幕上的坐標信息,傳給GWES模塊。在WinCE中,Touch Panel驅動是分層的,分為MDD層和PDD層,這和其他WinCE設備驅動是一樣的。MDD層由微軟提供,用戶只需要實現MDD和PDD層間的DDSI函數就可以了。如圖
WinCE中的GWES模塊負責加載和管理Touch Panel驅動,Touch Panel的MDD層向上提供DDI接口,PDD層是針對硬件的實現,對MDD層提供DDSI接口。
1 Touch Panel驅動中的數據結構
(1) TOUCH_PANEL_SAMPLE_FLAGS
用于描述一個采樣點的信息,這些信息被定義在一個枚舉結構中:
enum enumTouchPanelSampleFlags {
TouchSampleValidFlag = 0x01,
TouchSampleDownFlag = 0x02,
TouchSampleIsCalibratedFlag = 0x04,
TouchSamplePreviousDownFlag = 0x08,
TouchSampleIgnore = 0x10,
TouchSampleMouse = 0x40000000
};
TouchSampleValidFlag:一個有效的采樣值
TouchSampleDownFlag:第一次按觸摸屏時,返回該flag
TouchSampleIsCalibratedFlag:采樣的x和y坐標值不需要再被校驗了
TouchSamplePreviousDownFlag:表示上一次采樣狀態是按在觸摸屏上
TouchSampleIgnore:忽略這次采樣值
TouchSampleMouse:預留
(2) TPDC_CALIBRATION_POINT
用于描述一個校驗點的相關信息,結構如下:
struct TPDC_CALIBRATION_POINT {
INT PointNumber;
INT cDisplayWidth;
INT cDisplayHeight;
INT CalibrationX;
INT CalibrationY;
};
PointNumber:校驗點索引值,用于描述校驗點在LCD上的位置
0:中間
1:左上
2:左下
3:右下
4:右上
cDisplayWidth:顯示的寬度
cDisplayHeight:顯示的高度
CalibrationX:校驗點的x坐標值
CalibrationY:校驗點的y坐標值
(3) TPDC_CALIBRATION_POINT_COUNT
用于描述需要校驗的點的個數,結構如下:
struct TPDC_CALIBRATION_POINT_COUNT {
DDI_TOUCH_PANEL_CALIBRATION_FLAGS flags;
INT cCalibrationPoints;
};
flags:一般為0
cCalibrationPoints:需要校驗的點的個數,一般是5
(4) gIntrTouch和gIntrTouchChanged
這是兩個被MDD層用到的中斷,需要在PDD層中定義,如下:
DWORD gIntrTouch = SYSINTR_NOP;
DWORD gIntrTouchChanged = SYSINTR_NOP;
gIntrTouch用于描述觸摸屏中斷,要和硬件的觸摸屏中斷相關聯。
gIntrTouchChanged用于在觸摸屏按下后,每隔一段時間進行一次采樣,應該和硬件的一個定時器中斷相關聯。
這兩個值應該在DdsiTouchPanelEnable(..)函數中和硬件中斷關聯,并在函數DdsiTouchPanelGetPoint(..)中根據情況清除相應的中斷。
2 MDD層API
MDD為上層導出所需的Touch Panel驅動接口函數,上層通過這些函數可以完成對Touch Panel的操作,下面會介紹這些函數的功能。
(1) BOOL TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pfnCallback):
使能Touch Panel設備,用于初始化Touch Panel。
pfnCallback:指向處理Touch Panel事件的回調函數
(2) Void TouchPanelDisable(void):
禁用Touch Panel設備。
(3) BOOL TouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput ):
獲得Touch Panel設備的相關信息。
iIndex:索引值
TPDC_SAMPLE_RATE_ID:采樣率信息
TPDC_CALIBRATION_POINT_COUNT_ID:采樣點個數信息
TPDC_CALIBRATION_POINT_ID:采樣點坐標信息
lpOutput:指向一個內存區域,用于存放獲得的相關信息
(4) VOID TouchPanelCalibrateAPoint(INT32 UncalX, INT32 UncalY, INT32* pCalX, INT32* pCalY):
將輸入的未經過校驗的坐標信息轉換成校驗后的坐標信息。
UncalX:輸入的X坐標
UncalY:輸入的Y坐標
pCalX:校驗后的X坐標
pCalY: 校驗后的Y坐標
(5) VOID TouchPanelPowerHandler(BOOL bOff):
Touch Panel的電源控制函數。
bOff:TRUE表示關閉電源,FALSE表示打開電源
(6) BOOL TouchPanelReadCalibrationPoint(INT* pRawX, INT* pRawY):
獲得Touch Panel的坐標。
pRawX:觸摸屏的X坐標
PRawY:觸摸屏的Y坐標
(7) VOID TouchPanelReadCalibrationAbort(void):
終止當前的校驗。
(8) VOID TouchPanelSetCalibration(INT32 cCalibrationPoints, INT32* pScreenXBuffer, INT32* pScreenYBuffer, INT32* pUncalXBuffer, INT32* pUncalYBuffer):