ERR0RPR0MPT / maimai-android-touch-panel

适用于 Android 设备的 maimai 虚拟触摸屏幕
MIT License
55 stars 5 forks source link

对旧的 Linux 多点触控协议类型 A 的支持 #6

Open chiyuki0325 opened 2 weeks ago

chiyuki0325 commented 2 weeks ago
chiyuki0325 commented 2 weeks ago

一个可行的解决办法是在接收到 BTN_TOUCH UP 时清空触摸,但我不清楚具体如何实现

chiyuki0325 commented 2 weeks ago

在使用过程中,我还发现了一个问题:程序并不会正确地处理双押。 在查询 相关文档 之后,发现我遇到的几个问题的成因是本程序只支持触控协议类型 B,而不支持类型 A。 我在 这个分支 中尝试支持了协议类型 A,有遇到相关问题的用户可以尝试使用。但这个分支的代码是写死的,如果让用户可以设置协议类型,就需要在 getevent 函数中使用一些 if 从而降低效率,因此我希望作者能想出一个更好的解决办法。

ERR0RPR0MPT commented 2 weeks ago

可以提供一下你设备的 getevent 输出嘛,还有 Android/Linux 版本

chiyuki0325 commented 2 weeks ago

我的平板和 文档 中描述的协议类型 A 一致,并不会上报 ABS_MT_SLOT 数据,而是使用 ABS_MT_TRACKING_ID 来区分不同的触摸点,并且即使手指不移动,长按时也会产生连续的 ABS_MT_PRESSURE 等数据。

getevent 输出
/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

可以看到,即使是轻轻地点了一下,就上报了六次位置。

chiyuki0325 commented 2 weeks ago

设备:华为 M6 (SCM-W09) 系统版本:EMUI 11.0.0.161,安卓 10,Linux 4.14.116

chiyuki0325 commented 2 weeks ago

然而我的手机(安卓 12,Linux 4.19.157)不上报 ABS_MT_SLOT ,也不会重复上报位置。 getevent 输出的内容可能还真的会因设备而异。

chiyuki0325 commented 2 weeks ago

发现修改后的代码存在一个问题:当重复点击一个触摸区块时,第偶数次的点击会被忽略,即第一下判定正常,第二下点击被忽略,第三下有判定,第四下忽略,循环往复。会造成大量音符 miss。感觉代码没有问题,输出的 touch keys 也没有问题。不清楚如何修复。

ERR0RPR0MPT commented 2 weeks ago

我的理解是旧的A协议每次 SYN_REPORT 中间会根据当前 DOWN 的触摸点数量输出 SYN_MT_REPORT 并上报每个触摸点的状态,所以设个变量切两种协议处理方式就可以了。正在摸鱼晚点修,或者修好之后PR一下(

ERR0RPR0MPT commented 2 weeks ago

发现修改后的代码存在一个问题:当重复点击一个触摸区块时,第偶数次的点击会被忽略,即第一下判定正常,第二下点击被忽略,第三下有判定,第四下忽略,循环往复。会造成大量音符 miss。感觉代码没有问题,输出的 touch keys 也没有问题。不清楚如何修复。

可能是脚本没连上游戏,在脚本控制台输入 start 试试

chiyuki0325 commented 2 weeks ago

确实连上游戏了,控制台输出的 Touch Keys 也完全正常(说明直到 update_touch 应该都被正确调用了),但同一区块的第偶数次点击 游戏内仍然没有判定,我推测是写入线程的问题,但反复调整 sleep 的时长之后问题依然存在 ...

chiyuki0325 commented 2 weeks ago

这一部分我没怎么看懂,因为 write_thread 和 touch_thread 都在调用 send_touch ...

chiyuki0325 commented 5 days ago

似乎华为设备都会出现问题