异常现象

android开启触摸白点模式后, 屏幕上出现白点不消失,存在一个长按down事件

分析

经过研究,发现多点触摸协议存在type A和type B。出现此异常的TP使用的是Type B的多点触摸协议,支持轨迹跟踪。

通过sendevent发送input event事件,发现该异常与ABS_MT_SLOT,ABS_MT_TRACKING_ID事件关系密切。先简单介绍下这2个事件。

多点触摸协议的事件

ABS_MT_SLOT这个事件的SLOT值由TP IC传递给主机.

ABS_MT_TRACKING_ID这个事件的值由Input Driver生成(也可以由TP Driver中hardCode)。在input driver中它的值分为2种情况正值(代表与之关联的SLOT的down事件),负值(-1代表与之关联的SLOT的UP事件);不同的SLOT匹配不同的ABS_MT_TRACKING_ID值,ABS_MT_TRACKING_ID值是一个递增的值。

本文之前提到的问题与ABS_MT_TRACKING_ID事件密切相关

异常的可能性

  1. TP Driver没有发送对应的ABS_MT_SLOT和ABS_MT_TRACKING_ID(-1)的事件

  1. TP Driver仅仅发送了ABS_MT_SLOT,没有发送ABS_MT_TRACKING_ID的正值;

第一类问题很好处理,仅仅需要在合适的时候增加一个UP的事件组合即可,第二类问题相对复杂。

第二类问题,可能是驱动本身遗漏了ABS_MT_TRACKING_ID的正值,相对容易排查;也可能是因为input event的异步发送导致的问题,这个问题相对复杂。经过调试input driver,我获取了一些信息。


对于常用的ABS_MT_SLOT常用通道(1~5)发生异常,很容易通过人为的多点触摸恢复,因为在新的多点触摸中驱动必然由down和up事件生成,那么此时异常旧恢复了,但是对于ABS_MT_SLOT通道值较大(10~15)的异常,旧很难通过人为的手动操作恢复了,没那么多手指去触摸呀。

我调试的是cyttsp的一款触摸板,通过手动触摸和sendevent命令同时操作很容易就触发这个bug。

经过调试我发现,cyttsp的驱动的sync_report插入了sendevent发送的事件中间,导致sendevent发送的事件添加了一个ABS_MT_SLOT为15的触摸事件集合,并且这个事件集合中没有ABS_MT_TRACKING_ID事件。最终这个点发送除去,并且被framework作为一个down事件处理。然而在最后释放的时候这个ABS_MT_SLOT为15对应的点确没有UP事件。

这个测试说明:缺少ABS_MT_TRACKING_ID的触摸down事件可以被framework处理,但是kernel没办法触发对应的

dev=8
function touch_point()
{
adb shell sendevent /dev/input/event${dev} 3 ABS_MT_SLOT $1
adb shell sendevent /dev/input/event${dev} 3 ABS_MT_TRACKING_ID $2
adb shell sendevent /dev/input/event${dev} 3 53 $3
adb shell sendevent /dev/input/event${dev} 3 54 $4
}

sendevent发送了ABS_MT_TRACKING_ID后,cyttsp发送了UP事件,完成了此次点击。后面2条命令继续发送,产生了以仅仅包含ABS_MT_SLOT的触摸事件。ABS_MT_SLOT的值为15是因为cyttsp驱动在每次事件处理后会遍历ABS_MT_SLOT并释放。


通过分析input模块代码,在tp driver或者user space空间向input driver发送input event时,

如果发送的事件ACTION_1包含(ABS_MT_SLOT,ABS_MT_POSITION_X,ABS_MT_POSITION_Y, ABS_MT_PRESSURE)且不含ABS_MT_TRACKING_ID时,

tp driver即使发送了ACTION_2(对应的ABS_MT_SLOT和ABS_MT_TRACKING_ID=-1),但是在input driver 模块处理event时,因为在input_handle_abs_event函数中逻辑如下:

static int input_handle_abs_event(struct input_dev *dev,unsigned int code, int *pval)
{struct input_mt *mt = dev->mt;bool is_mt_event;int *pold;if (code == ABS_MT_SLOT) {//input_event函数发送ABS_MT_SLOT消息时,实际上并不将对应的事件添加到队列中//仅仅完成了赋值操作if (mt && *pval >= 0 && *pval < mt->num_slots)mt->slot = *pval;return INPUT_IGNORE_EVENT;}is_mt_event = input_is_mt_value(code);if (!is_mt_event) {pold = &dev->absinfo[code].value;} else if (mt) {//因为ACTION_1中没有ABS_MT_TRACKING_ID的值,因此这个值一直为-1//当发送ACTION_2事件时,这个pold的值为-1pold = &mt->slots[mt->slot].abs[code - ABS_MT_FIRST];} else {/** Bypass filtering for multi-touch events when* not employing slots.*/pold = NULL;}if (pold) {*pval = input_defuzz_abs_event(*pval, *pold,dev->absinfo[code].fuzz);//pold和pval都为-1,因此不处理这个事件,丢失抬起事件if (*pold == *pval)return INPUT_IGNORE_EVENT;*pold = *pval;}/* Flush pending slot event */if (is_mt_event && mt && mt->slot != input_abs_get_val(dev, ABS_MT_SLOT)) {input_abs_set_val(dev, ABS_MT_SLOT, mt->slot);//input_event函数发送ABS_MT_SLOT消息时,实际上并不将对应的事件添加到队列中//在使用input_event发送其他消息时,根据需要在返回值中增加INPUT_SLOT,//然后在input_handle_event函数中把ABS_MT_SLOT数据添加发送队列中return INPUT_PASS_TO_HANDLERS | INPUT_SLOT;}return INPUT_PASS_TO_HANDLERS;
}

出现白点不消失后,需要再次给对应的ABS_MT_SLOT,发送一条包含ABS_MT_TRACKING_ID的值(需要为正值),然后再次发送释放point的input event(对应的ABS_MT_SLOT和ABS_MT_TRACKING_ID=-1)

多点触摸TP的touch异常事件相关推荐

  1. Android多点触摸交互处理,放大缩小图片

    多点触摸(MultiTouch),指的是允许计算机用户同时通过多个手指来控制图形界面的一种技术.与多点触摸技术相对应的就是单点触摸,单点触摸的设备已经有很多年了,小尺寸的有触摸式的手机,大尺寸的最常见 ...

  2. android怎么监听多点触摸_Android开发中多点触摸的实现方法

    Android多点触控需要LCD驱动和程序设计支持,其实我们只要采用电容屏触摸手机的技术即可,接下来,就让爱站技术频道小编来讲解Android开发中多点触摸的实现方法吧! 多点触摸技术在实际开发过程中 ...

  3. 5.触摸touch,单点触摸,多点触摸,触摸优先和触摸事件的吞噬

     1 触摸 Coco2dx默认只有CCLayer及其派生类才有触摸的功能. 2 单点触摸 打开触摸开关和触摸方式 setTouchEnabled(true); setTouchMode(kCCTo ...

  4. WP7开发—Silverlight多点触摸事件详解【含Demo代码】

    最近在学习WP7的Silverlight编程,就把学习到知识点整理为日志,方便自己理解深刻点,也作为笔记和备忘,如有不合理或者错误之处,还恳请指正. WP7的支持多点触摸,有两种不同的编程模式: 1. ...

  5. Ended a touch event which was not counted in trackedTouchCount (ReactNative RN开发时多点触摸滑动报错)

    在进行React Native开发app时,如果在 ReactActivity 的子类所在页面,多个(三个以上)手指同时滑动时,会报出以下错误: "Ended a touch event w ...

  6. ios实例开发精品文章推荐(8.12)11个处理触摸事件和多点触摸的JS库

    11个处理触摸事件和多点触摸的JS库 触摸屏是现在所有智能手机的标配,还包括各种平板设备,而且很多桌面也慢慢在开始支持触摸操作.要开发支持触摸屏设备的Web应用,我们需要借助浏览器的触摸事件来实现. ...

  7. QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理

    QT:触摸屏支持手指触摸,增加touch事件touchevent,记录前后touch坐标并处理 1.手指触摸事件当做鼠标事件去响应的可行性 2.触摸事件touchEvent的添加 3.重写touch事 ...

  8. js触摸(touch)事件

    移动端触摸(touch)事件 移动端时代已经到来,作为前端开发的我们没有理由也不应该坐井观天,而是勇敢地跳出心里的那口井,去拥抱蔚蓝的天空.该来的总会来,我们要做的就是接受未知的挑战.正如你所看到的, ...

  9. 基于Visual C++2010与windows SDK fo windows7开发Windows 7的多点触摸特性应用程序(1)

    2008年5月28日,微软即将退休的精神领袖比尔·盖茨和首席执行官史蒂夫·鲍尔默共同在北圣地亚哥四季艾维亚拉洲际度假村举办的2008 D6 All Things数字化大会上向到场的嘉宾展示了windo ...

最新文章

  1. 报表-对于多数据进行 分sheet以及 分workbook处理
  2. Windows键盘驱动结构与消息机制--转
  3. hdu5455(2015沈阳网络赛F题)
  4. Chrome浏览器切换到之前打开的标签页会重新加载
  5. Nodejs前端服务器压缩图片
  6. 如何证明服从卡方分布_谈谈抽样分布定理
  7. JSP request response session
  8. gbdt和xgboost中feature importance的获取
  9. JEECG 3.7.1 非Maven版本源码下载,企业级JAVA快速开发平台
  10. C#自定义控件七水波纹
  11. 远程控制软件 mRemoteNG,管理多台虚拟机
  12. Web API-BOM- 操作浏览器
  13. Memcached(七)Memcached的并发实例
  14. linux创建用户、设置密码、修改用户、删除用户:
  15. 爬虫(六十九)简明 jieba 中文分词教程(六十)
  16. vs2015 社区版
  17. 利用打码平台识别点选验证码
  18. 如何接受上级指令_职场老手教你怎么应对领导错误的指令,千万要注意这几点...
  19. 详解统计套利交易系统模型
  20. 神经网络辨识的优势是,神经网络辨识的优势有

热门文章

  1. 计算机显示器模糊,电脑显示器模糊是什么原因
  2. 【id:179】【20分】C. DS二叉树--赫夫曼树的构建与编码(不含代码框架)
  3. 编写自定义的字符串一致性匹配方法,只要两个字符串包含同样的字符, 不管字符的顺序如何,都认为两个字符串一致,如:”aabbcc”和”abcabc”被认为是一致的
  4. Vue-cli3入门
  5. 三星 s4(i9502) android4.4rom 官方,三星S4(I9500)刷机包 Android4.4 官方精简 稳定流畅 极速省电 完整root权限 V1.0...
  6. 合理利用for循环遍历查找数据库数据
  7. math.h中常用的函数(C语言)
  8. 自己收款码实现个人网站支付
  9. 支付宝个人收款解决方案
  10. idea中用java不能自动导包的解决办法