1 /*
2 从应用层的角度去分析
3 sysfs proc 这两个节点下文件都是虚拟的文件系统
4 凡是在sys proc目录下文件都是在内存中
5
6 可以通过 /proc/bus/input/devices 来查看当前的系统下面所有的输入设备的信息,包括绑定的设备节点
7
8 */
9 #include <sys/stat.h>
10 #include <fcntl.h>
11 #include <stdio.h>
12 #include <unistd.h>
13
14 ////////////////////////input 输入子系统////////////////////////////
15 #include <linux/input.h>
16 // /user/include/linux/input.h
17 /*
18 在应用层处理一个
19 struct input_event {
20 struct timeval time;
21 __u16 type; 事件的类型 Event types下定义了 事件的类型
22 EV_SYN 事件结束
23 EV_KEY 按键事件
24 EV_REL 相对事件
25 EV_ABS 绝对事件
26
27 __u16 code;
28 __s32 value;
29
30 code和value 会根据 事件不同而代表不同的含义
31 };
32 结构体
33
34 应用层 当接收input_event 然后进行解析
35 */
36
37 static void rel_handler(struct input_event * event)
38 {
39 //相对坐标事件
40 //code 表示REL_X REL_Y REL_WHEEL
41 //value 表示位移的距离
42 switch(event->code) {
43 case REL_X:
44 printf("x=%d\n", event->value);
45 break;
46 case REL_Y:
47 printf("y=%d\n", event->value);
48 break;
49 case REL_WHEEL:
50 printf("wheel = %d\n",event->value );
51 break;
52 default:
53 break;
54 }
55
56 }
57
58 static void key_handler(struct input_event * event)
59 {
60 //如果event type 是按键类型
61 //code 表示按键键值
62 //value 表示状态 0 松开 1按下
63 printf("key: code = %#x\n", event->code);
64
65 if(event->value) {
66 printf("按下\n");
67 }else {
68 printf("松开\n");
69 }
70
71 }
72
73 //事件处理函数
74 static void input_event_handler(struct input_event * event)
75 {
76 switch(event->type) {
77 case EV_SYN: //结束事件
78 printf("结束事件\n");
79 break;
80 case EV_KEY: //按键事件
81 key_handler(event);
82 break;
83 case EV_REL: //相对坐标事件
84 rel_handler(event);
85 break;
86 default:
87 break;
88 }
89
90 }
91
92
93 int main(int argc, char const *argv[])
94 {
95 if(argc < 2) {
96 //输入设备的节点在 /dev/input目录下
97 //可以通过查看 /proc/bus/input/devices 来找到对应的设备节点
98 //
99 printf("Usage:cmd <input devices node>\n");
100 return -1;
101 }
102
103 int fd = open(argv[1], O_RDONLY);
104
105 if(fd < 0) {
106 perror("open");
107 goto err_open;
108 }
109
110 struct input_event event = {0};
111
112 //应用层是通过input_event 来获取底层的各种事件
113 //如果该设备有对应的事件发生,那么可以读取其中的值
114 while(read(fd, &event, sizeof(event))) {
115 input_event_handler(&event);
116 }
117
118 return 0;
119
120 err_open:
121 return -1;
122 }