Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Отправка собственных событий в /dev/uinput. Эмуляция геймпада.  (Прочитано 550 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Robotex

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Пытаюсь сэмулировать геймпад, отправляя собственные события в uinput. Клавиатура эмулируется отлично, а вот с геймпадом отчего-то беда. Его события не регистрируются. Что не так? Вот код: http://pastebin.com/NqA3jKJ3

Собственно, открываю файл:

    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
        if(fd < 0)
            die("error: open");

Разрешаю конкретные события:

    if(ioctl(fd, UI_SET_KEYBIT, BTN_A) < 0)
        die("error: ioctl");
     
    if(ioctl(fd, UI_SET_EVBIT, EV_SYN) < 0)
        die("error: ioctl");

Регистрирую устройство:

    memset(&uidev, 0, sizeof(uidev));
        snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");
        uidev.id.bustype = BUS_USB;
        uidev.id.vendor  = 0x1;
        uidev.id.product = 0x1;
        uidev.id.version = 1;
   
        if(write(fd, &uidev, sizeof(uidev)) < 0)
            die("error: write");

И отправляю события:

    memset(&ev, 0, sizeof(struct input_event));
                ev.type = EV_KEY;
                ev.code = BTN_A;
                ev.value = 1;
                if(write(fd, &ev, sizeof(struct input_event)) < 0)
                    die("error: write");
   
                memset(&ev, 0, sizeof(struct input_event));
                ev.type = EV_SYN;
                ev.code = 0;
                ev.value = 0;
                if(write(fd, &ev, sizeof(struct input_event)) < 0)
                    die("error: write");


Что не так?

 

Страница сгенерирована за 0.018 секунд. Запросов: 22.