首页>
技术资讯>
详情

自己编写wince的校准程序

2016-05-12 来源:佚名 阅读量: 0
关键词: WINCE

    项目的需求,需要改写校准时的语言显示,例如我的程序中现在是中文,那么校准时必须显示的提示就是中文,同样的是西班牙语,那么提示也必须是西班牙语。但是在TouchCalibrate()是不会有参数来供用户调用和修改的,所以校准时的提示都是在内核中编译好的, 他是通过资源文件来调用的,校准提示,都会编译到GWES.exe(在你的编译内核的目录下)文件中,大家可以通过PB打开GWES.exe,可以在string table里看到。当然这里显示的语言种类是根据你设置的系统默认语言是什么有关了,例如你在编译内核时默认的语言是西班牙语,那么你的校准提示就是西班牙语了。但是如果应用中选择了别的语言,应用中的显示改了,但是校准时调用的还是西班牙语,所以出现了冲突的问题。

    下面的流程是根据我接到此工作后,考虑流程来写的:

    首先看到MSDN中有篇帮助“how to replace Calibrate Moudle”,从文章中可以看出来,微软没有提供校准程序的源码,而只提供了校准时的UI界面的代码,即:CalibrateUI ,大家可以根据MSDN,step by step,最终克隆出一个CalibrateUI的文件,供大家修改,可是灾难性的东西来了,每次修改都需要重新“Sysgen”,哪怕只是在CalibrateUI.cpp中加一句打印函数,并且你要想修改它中的那个。rc文件,更是苦不堪言啊。在这里如果通过自己编写资源文件的方式,然后只是修改CalibrateUI.cpp可能能做到上述项目的需求,没有实验,供大家讨论吧。(大家若不想一遍一遍的Sysgen,可以自己编个小程序先试,成功了,直接移植过来,在Sysgen一下,应该高效点,否则…)。如果想用此种方法,跟大家提供一篇被转烂了的帖子,http://cache.baidu.com/c?m=9f65cb4a8c8507ed4fece763104e8a3a5254826136c0d0622f8ace1dd2260607506694ea7a7d0d1096983c310efe1a02b1a076356c1421c78ccffc5ddccbc37672d47023716c914165c418df8b1164d620e10bb4ed52f0bb8025e5aec5a3af4352ba44757f9786fd4d0164dd1ff7034195b19838025f17adec4020a405267e982142a14689f732691081879f0c099e6a892053c4fe62f12912c404a4180c2534fd0da6082031379458268f126a45c9be01f02b091c70e91fa4b8b1a1eb4f9bdc9b60cba490ff6f&p=8065c64adc8816e008e291371e&user=baidu

    但里面好像有个错误“再提醒一点,如果改了CalibrUi_clone.rc,要再次手动将上面两文件夹中的CalibrUi_clone.rc替换。”两个文件夹中根本就没有。rc文件啊,只有。res文件,是不是写错了,不知道转载的人们是不是也这样觉得。不管了,进行下种方法的考虑,自己编写校准程序。

    ……(搜集资料中)

    大家可以通过MSDN搜索“Touch Screen Driver Development Concepts”,里面有校准的步骤:

    The following steps detail the basic algorithm that you, the driver developer, can use to sample and calibrate the screen with the touch screen driver:

    Call the TouchPanelEnable function to start the screen sampling.

    Call the TouchPanelGetDeviceCaps function to request the number of sampling points.

    For every calibration point, perform the following steps:

    Call TouchPanelGetDeviceCaps to get a calibration coordinate.

    Draw a crosshair at the returned coordinate.

    Call the TouchPanelReadCalibrationPoint function to get calibration data.

    Call the TouchPanelSetCalibration function to calculate the calibration coefficients.

    这是你用微软提供的函数,自己写一个校准程序的基本流程,感觉问题忽然变的简单了,于是照着这个流程,自己实现了一个小程序,但是很快问题出现了,每次等待校准时都失败,于是到TouchPanelReadCalibrationPoint()函数中,探索究竟,此函数一般放在tchmain.cpp文件中。

    通过读这段代码,发现了一些问题,校验失败的原因是WaitForSingleObject( hCalibrationSampleAvailable, 10000 );等待超时,(微软实现的这个地方原先是INFINITE ,会无限制的等待,项目需求改为等待十秒钟),经过查找分析激活hCalibrationSampleAvailable事件的地方应该是TouchPanelpISR()函数,即触摸屏中断服务线程, 最终通过打印发现,CalibrationState 变量问题,

    CalibrationState 在tchmai.cpp中是全局变量,在TouchPanelReadCalibrationPoint()等待之前,会把CalibrationState 置为CalibrationWaiting状态,然而在中断服务线程中CalibrationState 的值仍然为初始化的CalibrationInactive(0),所以TouchPanelpISR()一直不能进入校准状态更不用谈校准事件hCalibrationSampleAvailable的激活了,搜遍所有的地方,CalibrationState 的改变绝对应该是在TouchPanelReadCalibrationPoint()这里改的。去网上搜索发现了两个人跟我遇到了同样的问题,一个没有解决,另一个认为是静态映射中断和动态映射中断的问题,说静态映射中断就不会出现此问题,但是我试过这种方法最后还是不行,(不知道他是在做什么应用,当时是可行的),通过这篇帖子坚定了我的信心,至少这种奇怪的问题不是个案,有同

热门推荐 查看更多