Open chiyuki0325 opened 2 weeks ago
一个可行的解决办法是在接收到 BTN_TOUCH UP 时清空触摸,但我不清楚具体如何实现
可以提供一下你设备的 getevent
输出嘛,还有 Android/Linux 版本
我的平板和 文档 中描述的协议类型 A 一致,并不会上报 ABS_MT_SLOT
数据,而是使用 ABS_MT_TRACKING_ID
来区分不同的触摸点,并且即使手指不移动,长按时也会产生连续的 ABS_MT_PRESSURE
等数据。
/dev/input/event6: EV_ABS ABS_MT_PRESSURE 000000ff /dev/input/event6: EV_ABS ABS_MT_POSITION_X 000001e5 /dev/input/event6: EV_ABS ABS_MT_POSITION_Y 000005b8 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MAJOR 04000064 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MINOR 00000064 /dev/input/event6: EV_ABS ABS_MT_TRACKING_ID 00000000 /dev/input/event6: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event6: EV_KEY BTN_TOUCH DOWN /dev/input/event6: EV_SYN SYN_REPORT 00000000 /dev/input/event6: EV_ABS ABS_MT_PRESSURE 000000ff /dev/input/event6: EV_ABS ABS_MT_POSITION_X 000001e5 /dev/input/event6: EV_ABS ABS_MT_POSITION_Y 000005b8 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MAJOR 04000064 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MINOR 00000064 /dev/input/event6: EV_ABS ABS_MT_TRACKING_ID 00000000 /dev/input/event6: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event6: EV_SYN SYN_REPORT 00000000 /dev/input/event6: EV_ABS ABS_MT_PRESSURE 000000ff /dev/input/event6: EV_ABS ABS_MT_POSITION_X 000001e5 /dev/input/event6: EV_ABS ABS_MT_POSITION_Y 000005b8 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MAJOR 04000064 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MINOR 00000064 /dev/input/event6: EV_ABS ABS_MT_TRACKING_ID 00000000 /dev/input/event6: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event6: EV_SYN SYN_REPORT 00000000 /dev/input/event6: EV_ABS ABS_MT_PRESSURE 000000ff /dev/input/event6: EV_ABS ABS_MT_POSITION_X 000001e5 /dev/input/event6: EV_ABS ABS_MT_POSITION_Y 000005b8 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MAJOR 04000064 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MINOR 00000064 /dev/input/event6: EV_ABS ABS_MT_TRACKING_ID 00000000 /dev/input/event6: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event6: EV_SYN SYN_REPORT 00000000 /dev/input/event6: EV_ABS ABS_MT_PRESSURE 000000ff /dev/input/event6: EV_ABS ABS_MT_POSITION_X 000001e5 /dev/input/event6: EV_ABS ABS_MT_POSITION_Y 000005b8 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MAJOR 04000064 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MINOR 00000064 /dev/input/event6: EV_ABS ABS_MT_TRACKING_ID 00000000 /dev/input/event6: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event6: EV_SYN SYN_REPORT 00000000 /dev/input/event6: EV_ABS ABS_MT_PRESSURE 000000ff /dev/input/event6: EV_ABS ABS_MT_POSITION_X 000001e5 /dev/input/event6: EV_ABS ABS_MT_POSITION_Y 000005b8 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MAJOR 04000064 /dev/input/event6: EV_ABS ABS_MT_TOUCH_MINOR 00000064 /dev/input/event6: EV_ABS ABS_MT_TRACKING_ID 00000000 /dev/input/event6: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event6: EV_SYN SYN_REPORT 00000000 /dev/input/event6: EV_SYN SYN_MT_REPORT 00000000 /dev/input/event6: EV_KEY BTN_TOUCH UP /dev/input/event6: EV_SYN SYN_REPORT 00000000
可以看到,即使是轻轻地点了一下,就上报了六次位置。
设备:华为 M6 (SCM-W09) 系统版本:EMUI 11.0.0.161,安卓 10,Linux 4.14.116
然而我的手机(安卓 12,Linux 4.19.157)不上报 ABS_MT_SLOT
,也不会重复上报位置。
getevent
输出的内容可能还真的会因设备而异。
发现修改后的代码存在一个问题:当重复点击一个触摸区块时,第偶数次的点击会被忽略,即第一下判定正常,第二下点击被忽略,第三下有判定,第四下忽略,循环往复。会造成大量音符 miss。感觉代码没有问题,输出的 touch keys 也没有问题。不清楚如何修复。
我的理解是旧的A协议每次 SYN_REPORT
中间会根据当前 DOWN
的触摸点数量输出 SYN_MT_REPORT
并上报每个触摸点的状态,所以设个变量切两种协议处理方式就可以了。正在摸鱼晚点修,或者修好之后PR一下(
发现修改后的代码存在一个问题:当重复点击一个触摸区块时,第偶数次的点击会被忽略,即第一下判定正常,第二下点击被忽略,第三下有判定,第四下忽略,循环往复。会造成大量音符 miss。感觉代码没有问题,输出的 touch keys 也没有问题。不清楚如何修复。
可能是脚本没连上游戏,在脚本控制台输入 start
试试
确实连上游戏了,控制台输出的 Touch Keys 也完全正常(说明直到 update_touch 应该都被正确调用了),但同一区块的第偶数次点击 游戏内仍然没有判定,我推测是写入线程的问题,但反复调整 sleep 的时长之后问题依然存在 ...
这一部分我没怎么看懂,因为 write_thread 和 touch_thread 都在调用 send_touch ...
似乎华为设备都会出现问题