12dad8905Sopenharmony_ci# mtdev - Multitouch Protocol Translation Library 22dad8905Sopenharmony_ci 32dad8905Sopenharmony_cimtdev是一个独立的库,它将内核MT事件的所有变体转换为信号槽类型B协议。归为mtdev的事件可能来自任何MT设备,具体来说,包括无接触跟踪的TypeA设备、带接触跟踪的TypeA或带触点跟踪的TypeB设备。 42dad8905Sopenharmony_ci 52dad8905Sopenharmony_ci作为Multitouch X驱动程序的一部分,大部分mtdev代码自2008年以来就已经存在。通过此软件包,手指跟踪和无缝MT协议处理在免费许可下可用。 62dad8905Sopenharmony_ci 72dad8905Sopenharmony_ci 82dad8905Sopenharmony_ci## 目录结构 92dad8905Sopenharmony_ci 102dad8905Sopenharmony_ci``` 112dad8905Sopenharmony_ciREADME.md 英文说明 122dad8905Sopenharmony_ciREADME_zh.md 中文说明 132dad8905Sopenharmony_ciinclude/ API定义 142dad8905Sopenharmony_cisrc/ 封装层实现 152dad8905Sopenharmony_ciREADME.OpenSource 开源说明 162dad8905Sopenharmony_ci``` 172dad8905Sopenharmony_ci 182dad8905Sopenharmony_ci## OpenHarmony如何集成mtdev 192dad8905Sopenharmony_ci### 1.头文件引入 202dad8905Sopenharmony_ci```c 212dad8905Sopenharmony_ci#include <mtdev.h> 222dad8905Sopenharmony_ci``` 232dad8905Sopenharmony_ci### 2.BUILD.gn添加引用 242dad8905Sopenharmony_ci```c 252dad8905Sopenharmony_cipublic_deps += ["//third_party/mtdev:libmtdev"] 262dad8905Sopenharmony_ci``` 272dad8905Sopenharmony_ci### 3.调用mtdev函数过程举例 282dad8905Sopenharmony_ci```c 292dad8905Sopenharmony_ci//全年毫秒事件时间 302dad8905Sopenharmony_citypedef uint64_t mstime_t; 312dad8905Sopenharmony_ci 322dad8905Sopenharmony_cistatic int use_event(const struct input_event *ev) 332dad8905Sopenharmony_ci{ 342dad8905Sopenharmony_ci#if 0 352dad8905Sopenharmony_ci return ev->type == EV_ABS && mtdev_is_absmt(ev->code); 362dad8905Sopenharmony_ci#else 372dad8905Sopenharmony_ci return 1; 382dad8905Sopenharmony_ci#endif 392dad8905Sopenharmony_ci} 402dad8905Sopenharmony_ci 412dad8905Sopenharmony_ci//打印事件 422dad8905Sopenharmony_cistatic void print_event(const struct input_event *ev) 432dad8905Sopenharmony_ci{ 442dad8905Sopenharmony_ci static const mstime_t ms = 1000; 452dad8905Sopenharmony_ci static int slot; 462dad8905Sopenharmony_ci mstime_t evtime = ev->input_event_usec / ms + ev->input_event_sec * ms; 472dad8905Sopenharmony_ci if (ev->type == EV_ABS && ev->code == ABS_MT_SLOT) 482dad8905Sopenharmony_ci slot = ev->value; 492dad8905Sopenharmony_ci fprintf(stderr, "%012llx %02d %01d %04x %d\n", 502dad8905Sopenharmony_ci evtime, slot, ev->type, ev->code, ev->value); 512dad8905Sopenharmony_ci} 522dad8905Sopenharmony_ci 532dad8905Sopenharmony_ci#define CHECK(dev, name) \ 542dad8905Sopenharmony_ci if (mtdev_has_mt_event(dev, name)) \ 552dad8905Sopenharmony_ci fprintf(stderr, " %s\n", #name) 562dad8905Sopenharmony_ci 572dad8905Sopenharmony_ci//检查属性 582dad8905Sopenharmony_cistatic void show_props(const struct mtdev *dev) 592dad8905Sopenharmony_ci{ 602dad8905Sopenharmony_ci fprintf(stderr, "supported mt events:\n"); 612dad8905Sopenharmony_ci CHECK(dev, ABS_MT_SLOT); 622dad8905Sopenharmony_ci CHECK(dev, ABS_MT_TOUCH_MAJOR); 632dad8905Sopenharmony_ci CHECK(dev, ABS_MT_TOUCH_MINOR); 642dad8905Sopenharmony_ci CHECK(dev, ABS_MT_WIDTH_MAJOR); 652dad8905Sopenharmony_ci CHECK(dev, ABS_MT_WIDTH_MINOR); 662dad8905Sopenharmony_ci CHECK(dev, ABS_MT_ORIENTATION); 672dad8905Sopenharmony_ci CHECK(dev, ABS_MT_POSITION_X); 682dad8905Sopenharmony_ci CHECK(dev, ABS_MT_POSITION_Y); 692dad8905Sopenharmony_ci CHECK(dev, ABS_MT_TOOL_TYPE); 702dad8905Sopenharmony_ci CHECK(dev, ABS_MT_BLOB_ID); 712dad8905Sopenharmony_ci CHECK(dev, ABS_MT_TRACKING_ID); 722dad8905Sopenharmony_ci CHECK(dev, ABS_MT_PRESSURE); 732dad8905Sopenharmony_ci CHECK(dev, ABS_MT_DISTANCE); 742dad8905Sopenharmony_ci} 752dad8905Sopenharmony_ci 762dad8905Sopenharmony_ci//创建mtdev,检查prop,获取并打印mt事件 772dad8905Sopenharmony_cistatic void loop_device(int fd) 782dad8905Sopenharmony_ci{ 792dad8905Sopenharmony_ci struct mtdev dev; 802dad8905Sopenharmony_ci struct input_event ev; 812dad8905Sopenharmony_ci int ret = mtdev_open(&dev, fd); 822dad8905Sopenharmony_ci if (ret) { 832dad8905Sopenharmony_ci fprintf(stderr, "error: could not open device: %d\n", ret); 842dad8905Sopenharmony_ci return; 852dad8905Sopenharmony_ci } 862dad8905Sopenharmony_ci show_props(&dev); 872dad8905Sopenharmony_ci //当设备五秒钟未处于非活动状态时 882dad8905Sopenharmony_ci while (!mtdev_idle(&dev, fd, 5000)) { 892dad8905Sopenharmony_ci //提取所有可被处理的事件 902dad8905Sopenharmony_ci while (mtdev_get(&dev, fd, &ev, 1) > 0) { 912dad8905Sopenharmony_ci if (use_event(&ev)) 922dad8905Sopenharmony_ci print_event(&ev); 932dad8905Sopenharmony_ci } 942dad8905Sopenharmony_ci } 952dad8905Sopenharmony_ci mtdev_close(&dev); 962dad8905Sopenharmony_ci} 972dad8905Sopenharmony_ci 982dad8905Sopenharmony_ci//主程序 992dad8905Sopenharmony_ciint main(int argc, char *argv[]) 1002dad8905Sopenharmony_ci{ 1012dad8905Sopenharmony_ci int fd; 1022dad8905Sopenharmony_ci if (argc < 2) { 1032dad8905Sopenharmony_ci fprintf(stderr, "Usage: mtdev <device>\n"); 1042dad8905Sopenharmony_ci return -1; 1052dad8905Sopenharmony_ci } 1062dad8905Sopenharmony_ci fd = open(argv[1], O_RDONLY | O_NONBLOCK); 1072dad8905Sopenharmony_ci if (fd < 0) { 1082dad8905Sopenharmony_ci fprintf(stderr, "error: could not open device\n"); 1092dad8905Sopenharmony_ci return -1; 1102dad8905Sopenharmony_ci } 1112dad8905Sopenharmony_ci if (ioctl(fd, EVIOCGRAB, 1)) { 1122dad8905Sopenharmony_ci fprintf(stderr, "error: could not grab the device\n"); 1132dad8905Sopenharmony_ci return -1; 1142dad8905Sopenharmony_ci } 1152dad8905Sopenharmony_ci loop_device(fd); 1162dad8905Sopenharmony_ci ioctl(fd, EVIOCGRAB, 0); 1172dad8905Sopenharmony_ci close(fd); 1182dad8905Sopenharmony_ci return 0; 1192dad8905Sopenharmony_ci} 1202dad8905Sopenharmony_ci``` 1212dad8905Sopenharmony_ci 1222dad8905Sopenharmony_ci## mtdev使用文档 1232dad8905Sopenharmony_ci 1242dad8905Sopenharmony_ci 1252dad8905Sopenharmony_ciAPI官方文档 http://bitmath.org/code/mtdev/ 1262dad8905Sopenharmony_ci 1272dad8905Sopenharmony_ci 1282dad8905Sopenharmony_ci## License 1292dad8905Sopenharmony_ci 1302dad8905Sopenharmony_ci见 [LICENSE](MIT(X11)License). 1312dad8905Sopenharmony_ci 1322dad8905Sopenharmony_ci--- 1332dad8905Sopenharmony_ci 1342dad8905Sopenharmony_ciThe mtdev library was released under the MIT licence in collaboration with Canonical, Ltd.