多路IO复用->键盘&鼠标

借鉴网络文章,加了自己写的部分,重要的是理解多路IO复用。测试如下:

#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc,char **argv)
{
    int fd, retval,i;
    char buf[6],c;
    fd_set readfds;
    struct timeval tv;

    // 打开鼠标设备
    fd = open( "/dev/input/mice", O_RDONLY );
    // 判断是否打开成功
    if(fd<0) {
        printf("Failed to open \"/dev/input/mice\".\n");
        exit(1);
    } else {
        printf("open \"/dev/input/mice\" successfuly.\n");
    }

    int fd_kb;
    struct input_event event_kb;
    fd_kb =open("/dev/tty",O_RDONLY | O_NONBLOCK); //键盘输入
    if(fd_kb <= 0)
    {
        printf("open device error\n");
        return 0;
    }

    int fd_mouse;
    struct input_event event_mouse;
    fd_mouse = open("/dev/input/event4", O_RDONLY); //鼠标输入
    if(fd_mouse <= 0)
    {
        printf("open device error\n");
        return 0;
    }


    while(1) {
        // 设置最长等待时间
        tv.tv_sec = 5;
        tv.tv_usec = 0;

        FD_ZERO( &readfds );
        FD_SET( fd, &readfds );
        FD_SET( fd_kb, &readfds );
        FD_SET( fd_mouse, &readfds );

        int max=fd>fd_kb?(fd>fd_mouse?fd:fd_mouse):(fd_kb>fd_mouse?fd_kb:fd_mouse);

        retval = select( max+1, &readfds, NULL, NULL, &tv );//有文件描述符的状态发生变化(变为可读)或者超时和错误就返回,否则就阻塞
        if(retval==0) {
            printf( "Time out!\n" );
        }else if(retval<0){
            printf( "error!\n" );
        }else{  //判断是哪个文件描述符的状态发生了变化,进行处理即可

            //鼠标位置
            if(FD_ISSET(fd,&readfds))
            {
                // 读取鼠标设备中的数据
                if(read(fd, buf, 6) <= 0) {
                    continue;
                }
                // 打印出从鼠标设备中读取到的数据
                printf("Button type = %d, X = %d, Y = %d, Z = %d\n", (buf[0] & 0x07), buf[1], buf[2],   buf[3]);
            }

            //键盘点击
            if(FD_ISSET(fd_kb,&readfds))
            {
                i=read(fd_kb,&c,1);
                if('\n'==c)
                    continue;
                printf("The input is %c\n",c);
                if ('q'==c)
                    break;
            }

            //鼠标点击
            if(FD_ISSET(fd_mouse,&readfds))
            {
                if(read(fd_mouse, &event_mouse, sizeof(event_mouse)) == sizeof(event_mouse))
                {
                    if(event_mouse.type = EV_REL)
                    {
                        if(event_mouse.code == REL_WHEEL)
                            printf("REL_WHEEL %d\n", event_mouse.value);//-1表示下滑,1表示上滑
                    }

                    if(event_mouse.code == BTN_LEFT && event_mouse.value==1)//左键按下,1表示按下,0表示释放。不然会检测到两次
                        printf("left down: %d\n", event_mouse.code);

                    if(event_mouse.code == BTN_RIGHT && event_mouse.value==1)
                        printf("right down: %d\n", event_mouse.code);

                    if(event_mouse.code == BTN_MIDDLE && event_mouse.value==1)
                        printf("middle down: %d\n", event_mouse.code);

                }
            }

        }

    }
    close(fd);
    close(fd_kb);
    close(fd_mouse);
    return 0;
}

 

posted on 2017-03-08 15:47  杜聪  阅读(210)  评论(0)    收藏  举报

导航