以文本方式查看主题

-  曙海教育集团论坛  (http://sun4.cn/bbs/index.asp)
--  Wince技术讨论区  (http://sun4.cn/bbs/list.asp?boardid=9)
----  WinCE中的Touch Panel驱动介绍  (http://sun4.cn/bbs/dispbbs.asp?boardid=9&id=1380)

--  作者:wangxinxin
--  发布时间:2010-11-16 11:29:14
--  WinCE中的Touch Panel驱动介绍

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):