fread из mouseevent возвращает 3 байта вместо 16, sizeof (input_event) - PullRequest
0 голосов
/ 21 января 2011

Следуя инструкциям по использованию ввода мыши для одометрии робота (http://web.me.com/haroldsoh/tutorials/technical-skills/using-optical-mice-for-othe-2/)), я создал правило udev для идентификации мыши как пользовательского устройства ввода и назвал его / dev / odoml & /dev/odomr.

/ и т.д. / Udev / rules.d / 90-odom.rules:

SUBSYSTEMS == "input" ATTRS {phys} == "usb-0000: 00: 1d.2-1 / input0", NAME = "odoml"

порт usb идентифицирует мышь. Теперь я пытаюсь прочитать ввод мыши в c:

int f = open ("dev / odoml", O_RDONLY);
input_event ev;
int read_byes = (f, & ev, sizeof (input_event));

Моя проблема в том, что большую часть времени я получаю неполные 3 вместо ожидаемых 16 байтов input_event. Отключение мыши, похоже, меняет дело: каждые 10 раз мышь работает как положено. Как только мышь подключена и read () правильно читает 16 байт, мышь продолжает работать между выполнениями программы. Если мышь не работает, она не начнет работать, пока я не подключу ее снова и не повезу - 1 из ~ 10. Я не вижу никакой закономерности в том, как это терпит неудачу.

Файл открывается правильно каждый раз. cat / dev / odoml отображает меньше данных, когда мышь перестает работать. Открытие устройства с помощью O_DIRECT не удается. O_ASYNC, O_NDELAY не помогают - это либо -1, либо 3. Я проверил это на 4 разных мышах, 3 из них вели себя так ошибочно.

Пожалуйста, помогите или укажите в правильном направлении.

1 Ответ

1 голос
/ 24 января 2011

Подсистема input предоставляет несколько интерфейсов.То, с чего вы читаете, - это устаревший интерфейс мыши, который предоставляет устройство мыши в стиле /dev/psaux.(Они обычно создаются как /dev/input/mouse* устройства).

Тот, который вы хотите , - это интерфейс событий для мыши, который обычно создается как /dev/input/event*.Это тот, который предоставляет 16-байтовые struct input_event кадры.

Вам нужно настроить правило udev, чтобы выбрать устройство «событие», а не устройство «мышь».Попробуйте добавить это условие:

KERNEL=="event[0-9]*"
...