zoukankan      html  css  js  c++  java
  • 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
    ", event->value);
     45             break;
     46         case REL_Y:
     47             printf("y=%d
    ", event->value);
     48             break;
     49         case REL_WHEEL:
     50             printf("wheel = %d
    ",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
    ",  event->code);
     64 
     65     if(event->value) {
     66         printf("按下
    ");
     67     }else {
     68         printf("松开
    ");
     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("结束事件
    ");
     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>
    ");
    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 }
  • 相关阅读:
    组合模式
    HashMap,ArrayList扩容
    Maven入门使用(一)
    OutputStreamWriter API 以及源码解读
    java.io.BufferedWriter API 以及源码解读
    java.io.writer API 以及 源码解读
    自定义redis序列化工具
    策略模式
    Spring下redis的配置
    简单工厂模式
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6477024.html
Copyright © 2011-2022 走看看