我正在尝试使用mtdev测试来处理触摸板多点触摸事件,因为evtest还不能用于Solus操作系统。
所以我找到了一个名为mtdev-test的神奇命令,但我真的不知道这个输出意味着什么。我发现第二列可能代表手指数(00=1,01=2,02=3,…),但我不知道其他列的意思。
我尝试在以下位置查找一些信息:https://github.com/torvalds/linux/blob/master/drivers/input/mouse/elantech.c
和
https://www.kernel.org/doc/Documentation/input/elantech.txt
以及
https://www.kernel.org/doc/Documentation/input/event-codes.txt
也许我真的很想找到三人之间的关系。
我的目标是以某种方式将使用java/python/athing的mtdev测试的输出转换为人类可以理解的数据,并检测X&每个手指的Y
unicornponny@unicornponny ~ $ sudo mtdev-test /dev/input/event14
supported mt events:
ABS_MT_SLOT
ABS_MT_TOUCH_MAJOR
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TRACKING_ID
ABS_MT_PRESSURE
0159b6c31962 00 3 0039 3588
0159b6c31962 00 3 0035 2049
0159b6c31962 00 3 0036 690
0159b6c31962 00 3 003a 25
0159b6c31962 00 3 0030 624
0159b6c31962 00 3 001c 4
0159b6c31962 00 1 014a 1
0159b6c31962 00 1 0145 1
0159b6c31962 00 3 0000 2049
0159b6c31962 00 3 0001 690
0159b6c31962 00 3 0018 25
0159b6c31962 00 0 0000 0
0159b6c31969 00 3 003a 21
0159b6c31969 00 3 0018 21
0159b6c31969 00 0 0000 0
0159b6c3196f 00 3 0030 156
0159b6c3196f 00 3 001c 1
0159b6c3196f 00 0 0000 0
0159b6c31979 00 3 0039 -1
0159b6c31979 00 1 014a 0
0159b6c31979 00 1 0145 0
0159b6c31979 00 3 0018 0
0159b6c31979 00 0 0000 0
那么,有人能解释它是如何工作的吗?这些数据意味着什么?或者有人知道我没有发现的任何资源吗?
从mtdev-test.c我们可以看到值是如何打印的
fprintf(stderr, "%012llx %02d %01d %04x %dn",
evtime, slot, ev->type, ev->code, ev->value);
所以格式是:
Timestamp Slot Type Code Value
事件类型和代码可以在Linux内核中的输入事件代码.h中找到:
/*
* Event types
*/
#define EV_SYN 0x00
#define EV_KEY 0x01
#define EV_REL 0x02
#define EV_ABS 0x03
#define EV_MSC 0x04
#define EV_SW 0x05
#define EV_LED 0x11
#define EV_SND 0x12
#define EV_REP 0x14
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
因此,3
是EV_ABS
事件类型,我们有其事件代码(为简洁起见,已编辑):
#define ABS_X 0x00
#define ABS_Y 0x01
#define ABS_Z 0x02
// <snip>
#define ABS_PRESSURE 0x18
#define ABS_DISTANCE 0x19
// <snip>
#define ABS_MT_SLOT 0x2f /* MT slot being modified */
#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
#define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
#define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
#define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
#define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
#define ABS_MT_POSITION_X 0x35 /* Center X touch position */
#define ABS_MT_POSITION_Y 0x36 /* Center Y touch position */
#define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
#define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
#define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */
#define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */
#define ABS_MT_DISTANCE 0x3b /* Contact hover distance */
#define ABS_MT_TOOL_X 0x3c /* Center X tool position */
#define ABS_MT_TOOL_Y 0x3d /* Center Y tool position */
现在,给定输出
0159b6c31962 00 3 0039 3588
0159b6c31962 00 3 0035 2049
0159b6c31962 00 3 0036 690
0159b6c31962 00 3 003a 25
0159b6c31962 00 3 0030 624
0159b6c31962 00 3 001c 4
0159b6c31962 00 1 014a 1
0159b6c31962 00 1 0145 1
0159b6c31962 00 3 0000 2049
0159b6c31962 00 3 0001 690
0159b6c31962 00 3 0018 25
0159b6c31962 00 0 0000 0
我们得到
1484829956450 ms, Slot 0, 3 (EV_ABS) 0039 (ABS_MT_TRACKING_ID) 3588
1484829956450 ms, Slot 0, 3 (EV_ABS) 0035 (ABS_MT_POSITION_X) 2049
1484829956450 ms, Slot 0, 3 (EV_ABS) 0036 (ABS_MT_POSITION_Y) 690
1484829956450 ms, Slot 0, 3 (EV_ABS) 003a (ABS_MT_PRESSURE) 25
1484829956450 ms, Slot 0, 3 (EV_ABS) 0030 (ABS_MT_TOUCH_MAJOR) 624
1484829956450 ms, Slot 0, 3 (EV_ABS) 001c (ABS_TOOL_WIDTH) 4
1484829956450 ms, Slot 0, 1 (EV_KEY) 014a (BTN_TOUCH) 1
1484829956450 ms, Slot 0, 1 (EV_KEY) 0145 (BTN_TOOL_FINGER) 1
1484829956450 ms, Slot 0, 3 (EV_ABS) 0000 (ABS_X) 2049
1484829956450 ms, Slot 0, 3 (EV_ABS) 0001 (ABS_Y) 690
1484829956450 ms, Slot 0, 3 (EV_ABS) 0018 (ABS_PRESSURE) 25
1484829956450 ms, Slot 0, 0 (EV_SYN) 0000 0
有关事件包的更多详细信息,请参阅文档:
- https://www.kernel.org/doc/Documentation/input/event-codes.txt
- https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt