以两点为例,Linux多点触摸协议上报次序为
ABS_MT_TOUCH_MAJOR ABS_MT_WIDTH_MAJOR ABS_MT_POSITION_X ABS_MT_POSITION_Y SYN_MT_REPORT //手指1 ABS_MT_TOUCH_MAJOR ABS_MT_WIDTH_MAJOR ABS_MT_POSITION_X ABS_MT_POSITION_Y SYN_MT_REPORT //手指2 SYN_REPORT
即采样一次需上报11个事件,利用率太低,很容易出现丢包的现象。因此我们决定encode data.格式见下表。
Bit | 31 | 30~27 | 26~20 | 19~10 | 9~0 |
Data | Reserved | Size | Press | Y | X |
可以看出这种编码格式可以支持分辨率1024×1024以下的LCD。完全满足当前及未来很长一段时间内项目的需求。我们将这种上报格式命名为ABS_BYD_MT_DATA,既然是打包上传,SYN_MT_REPORT也可以省略了。修改后的上报次序为
ABS_BYD_MT_DATA //手指1 ABS_BYD_MT_DATA //手指2 SYN_REPORT
为了便于支持2个手指以上的触摸项目,这里我们保留SYN_REPORT。如果修改下android,便可以支持256个手指。扩展起来非常方便
ABS_BYD_MT_DATA //手指1 ABS_BYD_MT_DATA //手指2 … ABS_BYD_MT_DATA //手指256 SYN_REPORT
当然这样修改,android恐怕是无法识别的,修改上层就行了。在EventHub.cpp中定义下 device class,然后在KeyInputQueue.java识别出class,将包解析出来。万事大吉。