06day01input_app
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 }