android触摸屏校准算法_第1页
android触摸屏校准算法_第2页
android触摸屏校准算法_第3页
android触摸屏校准算法_第4页
android触摸屏校准算法_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、转An droid触摸屏校准程序的实现一,触摸校准算法 触摸屏校准通用方法。(XL, YL是显示屏坐标,XT, YT是触摸屏坐标,)XL = XT*A+YT*B+CYL = XT*D+YT*E+F由于具体计算是希望是整数运算,所以实际中保存的 ABCDEF为整数,而增加一个参数DivXL = (XT*A+YT*B+C) / DivYL = (YT*D+YT*E+F) / DivTSLIB把以上的7个参数 ABCDEF Div 保存在 pointercal文件中。不校准的数据:A=1, B=0, C=0, D=0, E=1, F=0, Div=1A B C D E F Div-41137818-

2、3636780-51325394706558465536二,An droid 事件处理机制an droid事件的传入是从 Even tHub开始的,Even tHub是事件的抽象结构,维护着系统设 备的运行情况(设备文件放在/dev/input里),设备类型包括 Keyboard、TouchScreen、TraceBall。它在系统启动的时候会通过open_device方法将系统提供的输入设备都增加到这个抽象结构中,并维护一个所有输入设备的文件描述符,如果输入设备是键盘的话还会读取/system/usr/keylayout/ 目录下对应键盘设备的映射文件(修改./developme nt/em

3、ulator/keymaps /qwerty.kl来改变键值的映射关系),另外getEve nt方法是对EventHub中的设备文件描述符使用poll操作等侍驱动层事件的发生,如果发生的事件是键盘事件,则调用 Map函数按照映射文件转换成相应的键值并将扫描码和键码返回 给 KeylnputQueue.frameworks/base/services/j ni/com_a ndroid_server_Ke yin putQueue.cpp根据事件的类型以及事件值进行判断处理,从而确定这个事件对应的设备状态是否发生了改变并相应的改变对这个设备的描述结构InputDevice 。Win dowma

4、nager 读取发生的事件 的不同分成三类( 如键盘事件会调用会创建一个线程 (InputDispatcherThread ),在这个线程里从事件队列中(QueuedEvent ev = mQueue.getEvent (),并根据读取到事件类型 KEYBOARD、TOUCHSCREEN 、TRACKBALL ),分另U进 行处理,例 dispatchKey(KeyEvent)ev.event, 0, 0)以将事件通过 Binder 发送给具有焦点的窗口应用程序,然后调用mQueue.recycleEve nt(ev) 继续等侍键盘事件的发生;如果是触摸屏事件则调用dispatchPoi nt

5、er(ev, (Motio nEve nt)ev.eve nt, 0, 0),这里会根据事件的种类(UP、DOWN、MOVE、OUT_SIDE 等)进行判断并处理,比如Cancel或将事件发送到具有权限的指定的窗口中 去;移植方案An droid本身并不带触摸屏校准。An droid获取到的数据就是驱动上报的原始数据。方案一:移植TSLIB,通过TSLIB产生pointercal校准参数文件。方案二:从An droid框架层获取On Touch事件产生poi ntercal校准参数文件方案一:数据的校准在驱动中完成。即把pointercal的参数数据通过某种方式(sysfs)传递给驱动程序进行

6、校准。方案二:驱动上报原始点,原始点在框架层拦截后进行校验处理。TSLIB移植过程修改源码以适应 an droid的文件结构。设定Android.mk 编译选项,生成库即应用。etc/ts.c onf module_raw in putsrc/ts_co nfig.c #defi ne TS_CONF "/system/etc/ts.co nf"src/ts_load_module.cchar *plug in _directory="/system/lib/ts/plugi ns/"tests/fbutils.cchar *defaultfbdevic

7、e = "/dev/graphics/fbO"COPY ts.conf 至U /system/etc/ts.confinit.rc. mkdir /data/etc/pointercal通过ts_calibrate 产生pointercal 数据文件。框架内获取参数文件制作APK应用,仿效ts_calibrate采点并计算出各参数,产生pointercal框架内实现触摸屏校准在InputDevive.java 中 拦截触摸屏原始数据进行pointercal参数校验后再分发驱动内实现触摸屏校准在init.rc中添加event,在触摸屏加载后把pointercal参数输送给驱动

8、。结果-效果实现细节:扩展in it - proper_serivce系统支持的属性权限,对自定义的特殊系统属性进行权限开放。使用自定义系统属性在init.rc中on property 事件中处理pointercal的读写权限。使用自定义系统属性触摸屏校准程序.apk和InputDevice.java中的输入事件的同步。(在触摸屏校准期间in putDevice在输入事件中不能采用算法。校准程序完成有inputDevice重新启用校准算法)被调模拟器中至今无法进入device.absX/Y != null的代码,需要了解以下in putDevice用的步骤。三,触摸屏的时间流程:驱动层:/*

9、Touchscree n absolute values* These parameters are used to help the in put layer discard out of* range readi ngs and reduce jitter etc.* o min, max:- indicate the min and max values your touch screen returns* o fuzz:- use a higher nu mber to reduce jitter* The default values corresp ond to Mainstone

10、 II in QVGA mode* Please read* Docume ntati on/in put/i nput-program min g.txt for more details.*/static int abs_x3 = 350, 3900, 5;module_param_array(abs_x, int, NULL, 0);MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz");static int abs_y3 = 320, 3750, 40;module_param_array(a

11、bs_ y, int, NULL, 0);MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz");static int abs_p3 = 0, 150, 4;module_param_array(abs_p, int, NULL, 0);MODULE_PARM_DESC(abs_p, "Touchscreen absolute Pressure min, max, fuzz");/*对设备进行初始化设置*/set_bit(EV_ABS, wm->i nput_dev->

12、evbit);set_bit(ABS_X, wm-> in put_dev->absbit);set_bit(ABS_Y, wm-> in put_dev->absbit);set_bit(ABS_PRESSURE, wm-> in put_dev->absbit);in put_set_abs_params(wm->in put_dev, ABS_X, abs_x0, abs_x1,abs_x2, 0);in put_set_abs_params(wm->in put_dev, ABS_Y, abs_y0, abs_y1,abs_y2, 0);

13、in put_set_abs_params(wm->i nput_dev, ABS_PRESSURE, abs_p0, abs_p1, abs_p2, 0);/*事件发生时,提供原始点*/in put_report_abs(wm->i nput_dev, ABS_X, data.x & 0xfff);in put_report_abs(wm->i nput_dev, ABS_Y, data.y & 0xfff);in put_report_abs(wm->i nput_dev, ABS_PRESSURE, data.p & 0xfff);/*提供

14、给驱动外查询in put_dev的接口* struct in put_abs info info;* ioctl(fd, EVIOCGABS(axis), &info)* src file: evDev.c*/if (_IOC_NR(cmd) & ABS_MAX) = _IOC_NR(EVIOCGABS(0) t = _IOC_NR(cmd) & ABS_MAX;abs.value = dev->abst;abs.mi nimum = dev->absm in t;abs.maximum = dev->absmaxt; abs.fuzz = dev-&

15、gt;absfuzzt;abs.flat = dev->absflatt;An droid底层驱动Even tHub.cppstatic const char *device_path = "/dev/i nput"ope nPlatform In put(void)sca n_dir(device_path);ope n_device(dev name);fd = ope n( deviceName, O_RDWR);/* 对外接口,getEvent ,* inotify监控device_path目录, 使用poll机制轮询inotify和各个输入设备的可用状态。

16、解析事件或输入信息,放入各个传出参数中。*/bool Even tHub:getEve nt(i nt32_t* outDeviceId, i nt32_t* outType,in t32_t* outSca ncode, i nt32_t* outKeycode, ui nt32_t *outFlags,in t32_t* outValue, nsecs_t* outWhe n)JNI 咅B分:com_android_server_KeyInputQueue.cpp.提供接口static JNINativeMethod gin putMethods = /* n ame, sig natur

17、e, fun cPtr */ "readEve nt", "(La ndroid/view/Raw In putEve nt;)Z",(void*) an droid_server_Key In putQueue_readEve nt , "getDeviceClasses", "(I)I",(void*) an droid_server_Key In putQueue_getDeviceClasses , "getDeviceName", "(I)Ljava/la ng/Stri n

18、g;",(void*) an droid_server_KeyI nputQueue_getDeviceName , "getAbsoluteInfo", "(IILcom/android/server/InputDevice$AbsoluteInfo;)Z",(void*) an droid_server_Key In putQueue_getAbsolute Info , "getSwitchState", "(I)I",(void*) an droid_server_Key In putQueue_

19、getSwitchState , "getSwitchState", "(II)I",(void*) an droid_server_Key In putQueue_getSwitchStateDevice , "getScancodeState", "(I)I",(void*) an droid_server_Key In putQueue_getSca ncodeState , "getSca ncodeState", "(11)1",(void*) an droid_s

20、erver_Key In putQueue_getSca ncodeStateDevice , "getKeycodeState", "(1)1",(void*) an droid_server_Key In putQueue_getKeycodeState , "getKeycodeState", "(II)I",(void*) an droid_server_Key In putQueue_getKeycodeStateDevice , "hasKeys", ”(IZ)Z",(vo

21、id*) an droid_server_Key In putQueue_hasKeys ,;java service 部分:Keyln putQueue.java.循环查询输入设备信息或目录状态并处理Thread mThread = new Thread("I nputDeviceReader") public void run() an droid.os.Process.setThreadPriority(an droid.os. Process.THREAD_PRIORITY_URGENT_DISPLAY);try Rawln putEve nt ev = new R

22、awI nputEve nt();while (true) In putDevice di;/ block, does n't release the mon itorreadEve nt(ev);boolea n send = false;boolea n con figCha nged = false;/检测到新设备后if (ev.type = RawI nputEve nt.EV_DEVICE_ADDED) synchroni zed (mFirst) di = n ewI nputDevice(ev.deviceId);mDevices.put(ev.deviceId, di)

23、;con figCha nged = true;/对触摸屏设备In putDevice.Absolute Info absX;InputDevice.Absolutelnfo absY;InputDevice.AbsoluteInfo absPressure;In putDevice.Absolute Info absSize;if (classes&Rawl nputEve nt.CLASS_TOUCHSCREEN) != 0) absX = loadAbsoluteI nfo(deviceld, RawI nputEve nt.ABS_X, "X");absY = loadAbsoluteI nfo(deviceld, RawI nputEve nt.ABS_Y, "Y");absPressure = loadAbsoluteI nfo(deviceld, RawI nputEve nt.ABS_PRESSURE, "Pressure");absSize = loadAbsoluteI nfo(deviceld, RawI nputEve nt.ABS_TOOL_WIDTH, "Size"); else absX = n ull;absY = n ull;ab

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论