2016-01-21 2 views
1

Ниже приведен код, с помощью которого я пытаюсь отправить событие touch на наш hmi из пользовательского пространства. Все вызовы и запись ioctl проверяются явно, чтобы быть успешными, но событие не вводится. Идентификатор устройства поставщика и имя устройства не введен правильно. Не уверен, что это релевантно для вывода. (Все три метода вставки событий уже опробованы один за другим). Идентификатор продукта идентификатора поставщика и имя устройства требуется, а затем, где в системе на базе Linux на базе Embedded мы получим эти данные.Моделирование сенсорных событий с использованием uinput на экране hmi на основе linux не работает?

#include <linux/input.h> 
#include <linux/uinput.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <fcntl.h> 
#include <string.h> 

void injectEvent(int, int, int, int); 

int main() 
{ 
    struct uinput_user_dev dev; 
    int i; 
    int err; 
    int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); 
    if(fd < 0) { 
     //perror("Failed to open: /dev/uinput"); 
     printf("Failed to open: /dev/uinput\n"); 
     return fd; 
    } 

    err = ioctl(fd, UI_SET_EVBIT, EV_KEY); 
    if (err) 
     goto err; 

    err = ioctl(fd, UI_SET_EVBIT, EV_ABS); 
    if (err) 
     goto err; 

    err = ioctl(fd, UI_SET_KEYBIT, BTN_TOUCH); 
    if (err) 
     goto err; 

    err = ioctl(fd, UI_SET_ABSBIT, ABS_MT_SLOT); 
    if (err) 
     goto err; 

    memset(&dev, 0, sizeof(dev)); 
    snprintf(dev.name, sizeof(dev.name), "Test device"); 
    printf("devname = %s\n",dev.name); 
    dev.id.bustype = BUS_SPI; 

    /* 10 touch inputs */ 
    dev.absmax[ABS_MT_SLOT] = 10; 

    dev.absmax[ABS_X] = 4096; 
    dev.absmin[ABS_X] = 0; 

    dev.absmax[ABS_Y] = 4096; 
    dev.absmin[ABS_Y] = 0; 

    dev.absmax[ABS_PRESSURE] = 0xff; 
    dev.absmin[ABS_PRESSURE] = 0; 

    dev.absmax[ABS_MT_TOUCH_MAJOR] = 0xff; 
    dev.absmin[ABS_MT_TOUCH_MAJOR] = 0; 

    dev.absmax[ABS_MT_POSITION_X] = 4096; 
    dev.absmin[ABS_MT_POSITION_X] = 0; 

    dev.absmax[ABS_MT_POSITION_Y] = 4096; 
    dev.absmin[ABS_MT_POSITION_Y] = 0; 

    dev.absmax[ABS_MT_PRESSURE] = 4096; 
    dev.absmin[ABS_MT_PRESSURE] = 0; 

    err = write(fd, &dev, sizeof(dev)); 
    if (err < 0) 
     goto err; 

    err = ioctl(fd, UI_DEV_CREATE); 
    if (err < 0) 
     goto err; 

    /* Event should be injected here.... */ 

    /********************First Method***********************/ 
#if 1 
    struct input_event ev[2]; 

    memset(ev, 0, sizeof(ev)); 

    ev[0].type = EV_ABS; 
    ev[0].code = ABS_X; 
    ev[0].value = 1001; 
    ev[1].type = EV_ABS; 
    ev[1].code = ABS_Y; 
    ev[1].value = 2002; 

    if(write(fd, &ev, sizeof(ev)) < 0) 
     printf("Error::event injection failed\n"); 

#endif 

    /********************Second Method***********************/ 
#if 0 
    injectEvent(fd, EV_ABS, ABS_MT_TRACKING_ID, 0 ); 
    injectEvent(fd, EV_ABS, ABS_MT_POSITION_X, 1001 ); 
    injectEvent(fd, EV_ABS, ABS_MT_POSITION_Y, 2002 ); 
    injectEvent(fd, EV_ABS, ABS_MT_TOUCH_MAJOR, 111); 
    injectEvent(fd, EV_ABS, ABS_MT_PRESSURE, 3003); 
    injectEvent(fd, EV_SYN, SYN_MT_REPORT, 0 ); 
    injectEvent(fd, EV_SYN, SYN_REPORT, 0 ); 
    injectEvent(fd, EV_SYN, SYN_MT_REPORT, 0 ); 
    injectEvent(fd, EV_SYN, SYN_REPORT, 0 ); 

    void injectEvent(int fd_ev,int type, int code, int value) 
    { 
     printf("(%s)==>> (%d,%d,%d,%d)\n",__func__, fd_ev, type, code, value); 

     struct uinput_event event; 
     int len; 

     if (fd_ev <= fileno(stderr)) 
      return; 

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

     len = write(fd_ev, &event, sizeof(event)); 

     printf("(%s) done:%d\n",__func__,len); 
    } 
#endif 

    /********************Third Method***********************/ 
#if 0 
    struct uinput_event event; 
    for (int i=0; i<30; i++) 
    { 
     memset(&event, 0, sizeof(event)); 

     event.type=EV_ABS; 
     event.code=ABS_X; 
     event.value=1005; 

     if(write(fd, &event, sizeof(event)) < 0) 
      printf("Error::event injection failed\n"); 

     sleep (5); 
    } 
#endif 

    sleep (180); 
    /* start cleanup ... */ 
    err = ioctl(fd, UI_DEV_DESTROY); 
    if (err < 0) 
     goto err; 

    close(fd); 
    return 0; 
err: 
    //perror("Failed to initialise"); 
    printf("(%s) Failed to initialise\n",__func__); 
    close(fd); 
    return err; 
} 

ответ

0

Я не знаю, если это ваше решение, но ABS_X и ABS_Y не могут быть установлены вместе с ABS_MT_POSITION_X и * _Y, они не могут жить вместе, вы должны активировать один или другой. Вы можете проверить это, используя «список xinput-реквизит + номер устройства» в linux. Надеюсь, это вам помогло;)