2014-11-01 99 views
4

我有一些问题得到两个代码的两边使用uinput工作。linux uinput:简单的例子?

基于Getting started with uinput: the user level input subsystem我总结了以下作家(减去错误处理):

int main(int ac, char **av) 
{ 
    int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); 
    int ret = ioctl(fd, UI_SET_EVBIT, EV_ABS); 
    ret = ioctl(fd, UI_SET_ABSBIT, ABS_X); 

    struct uinput_user_dev uidev = {0}; 
    snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-rotary"); 
    uidev.absmin[ABS_X] = 0; 
    uidev.absmax[ABS_X] = 255; 
    ret = write(fd, &uidev, sizeof(uidev)); 
    ret = ioctl(fd, UI_DEV_CREATE); 

    struct input_event ev = {0}; 
    ev.type = EV_ABS; 
    ev.code = ABS_X; 
    ev.value = 42; 

    ret = write(fd, &ev, sizeof(ev)); 

    getchar(); 

    ret = ioctl(fd, UI_DEV_DESTROY); 
    return EXIT_SUCCESS; 
} 

,似乎工作,至少全input_event结构似乎被写入。

我然后写事件的最幼稚的读者我能想出:

int main(int ac, char **av) 
{ 
    int fd = open(av[1], O_RDONLY); 

    char name[256] = "unknown"; 
    ioctl(fd, EVIOCGNAME(sizeof(name)), name); 
    printf("reading from %s\n", name); 

    struct input_event ev = {0}; 
    int ret = read(fd, &ev, sizeof(ev)); 
    printf("Read an event! %i\n", ret); 
    printf("ev.time.tv_sec: %li\n", ev.time.tv_sec); 
    printf("ev.time.tv_usec: %li\n", ev.time.tv_usec); 
    printf("ev.type: %hi\n", ev.type); 
    printf("ev.code: %hi\n", ev.code); 
    printf("ev.value: %li\n", ev.value); 

    return EXIT_SUCCESS; 
} 

不幸的是,读者面不工作的时候,只管理每次读取8个字节,这不是完整的input_event结构。

我在犯什么愚蠢的错误?

回答

4

您应该在实际事件之后编写同步事件。在您的编写者代码中:

struct input_event ev = {0}; 
ev.type = EV_ABS; 
ev.code = ABS_X; 
ev.value = 42; 

usleep(1500); 

memset(&ev, 0, sizeof(ev)); 
ev.type = EV_SYN; 
ev.code = 0; 
ev.value = 0; 

ret = write(fd, &ev, sizeof(ev)); 

getchar(); 
+3

为什么需要同步事件? – dtmland 2016-03-04 17:51:43