различие между/dev/input/mouse0 и/dev/input/mice

Я работаю с мышью драйвер USB, и я действительно не знаю, как к различию и используют информацию, отправляют /dev/input/mouse0 и /dev/input/mice

После того, как немногие ищут на Google, я нашел, что некоторые кодируют об использовании /dev/input/mice

int fd, bytes;
unsigned char data[4];

const char *pDevice = "/dev/input/mice";

// Open Mouse
fd = open(pDevice, O_RDWR);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pDevice);
    return -1;
}

int left, middle, right;
signed char x, y;

// Read Mouse
bytes = read(fd, data, sizeof(data));

if(bytes > 0)
{
    left = data[0] & 0x1;
    right = data[0] & 0x2;
    middle = data[0] & 0x4;

    x = data[1];
    y = data[2];
    printf("x=%d, y=%d, left=%d, middle=%d, right=%d\n", x, y, left, middle, right);

    if(left)
        return left;
    if(right)
        return right;
    if(middle)
        return middle;
}

return 0;

Эта программа работы, но не получила информации о прокрутке колеса

Я смог к найденному программа, которые используют /dev/input/event0

int fd;
struct input_event ev
const char* pFile = "/dev/input/event0";

fd = open(pFile, O_RDONLY);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pFile);
    return -1;
}

read(fd, &ev, sizeof(ev));
std::cout << "type : " << ev.type << "  code : " << ev.code << "  value : " << ev.value << std::endl;

close(fd);

return 0;

Но существует проблема для диагонального перемещения, потому что этот файл сохранил только 1 координату в то же время, и X координат имеют приоритет на Y; таким образом, это является довольно раздражающим, когда Вы хотите переместить свою мышь в ось Y

Однако я не нахожу, что любой код использует /dev/input/mouse0, таким образом, какая информация сохранена в этом файле?

Таким образом, мои вопросы: 1. В какой информации сохраняются /dev/input/mouse0? 2. Как я могу считать всю информацию о мыши, не открывая 2 файла, и без приоритетной проблемы (колесо, прокручивающее + перемещение оси X/Y)?

1
задан 5 June 2018 в 17:36

1 ответ

Документация API пользовательского пространства Linux Input Subsystem отвечает на ваши вопросы. В общем, все файлы в /dev/input/ предоставляются обработчиками событий , которые распределяют события устройства в пространстве пользователя.

Что такое / dev / input / mouse0 и / dev / input / mice?

Из введения (важные части выделены мной)

[тысяча сто тридцать два] 1.3.1.3. mousedev

mousedev - это хак, чтобы заставить старые программы, использующие ввод мыши, работать. Он принимает события от мышей или дигитайзеров / планшетов и делает доступным для пользователя пользовательское устройство в стиле PS / 2 (la / dev / psaux).

Устройства Mousedev в / dev / input (как показано выше):

crw-r--r--   1 root     root      13,  32 Mar 28 22:45 mouse0
crw-r--r--   1 root     root      13,  33 Mar 29 00:41 mouse1
crw-r--r--   1 root     root      13,  34 Mar 29 00:41 mouse2
crw-r--r--   1 root     root      13,  35 Apr  1 10:50 mouse3 ... 
...
crw-r--r--   1 root     root      13,  62 Apr  1 10:50 mouse30
crw-r--r--   1 root     root      13,  63 Apr  1 10:50 mice

Каждое устройство мыши назначено одной мыши или дигитайзеру, кроме последней - мыши. Это односимвольное устройство является общим для всех мышей и дигитайзеров , и даже если ни одно из них не подключено, устройство присутствует. Это полезно для горячего подключения USB-мышей, так что старые программы, которые не поддерживают горячее подключение, могут открывать устройство, даже когда мыши отсутствуют. [...]

Mousedev будет генерировать протоколы PS / 2, ImPS / 2 (Microsoft IntelliMouse) или ExplorerPS / 2 (IntelliMouse Explorer) в зависимости от того, что хочет программа, читающая данные. Вы можете установить GPM и X для любого из них. Вам понадобится ImPS / 2, если вы хотите использовать колесо на USB-мышке и ExplorerPS / 2, если вы хотите использовать дополнительные (до 5) кнопки.

... это также может быть причиной того, что вы не видите события колесика мыши. Так как это «взлом» для устаревших программ, вы не должны использовать его, если вам не нужно.

Как я могу прочитать всю информацию мыши [...]?

Использовать соответствующий файл /dev/input/eventX, предоставленный evdev (обработчик событий, не путать с xorg-драйвер evdev). Именно это и делает ваш второй фрагмент кода.

... но как насчет проблемы приоритета?

Нет проблемы приоритета. Согласно 2.2. Коды событий :

SYN_REPORT:

Используется для синхронизации и разделения событий в пакеты изменений входных данных , происходящих в один и тот же момент времени . Например, движение мыши может установить значения REL_X и REL_Y для одного движения, а затем выдать SYN_REPORT. Следующее движение выдаст больше значений REL_X и REL_Y и отправит еще один SYN_REPORT.

Поскольку можно считать, что все последовательные события до события SYN_REPORT произошли одновременно, порядок их сообщения не имеет значения.

Например (используя эту программу , которую я нашел на github):

time:1528290186.256449  type:EV_REL     code:REL_X      value:-1
time:1528290186.256449  type:EV_REL     code:REL_Y      value:1
time:1528290186.256449  type:EV_SYN     code:SYN_REPORT value:0
time:1528290186.264460  type:EV_REL     code:REL_Y      value:1
time:1528290186.264460  type:EV_REL     code:REL_WHEEL  value:-1
time:1528290186.264460  type:EV_SYN     code:SYN_REPORT value:0

Как вы можете видеть, параллельные события не только разделены событиями SYN_REPORT, они также имеют та же отметка времени.

Кстати, вы также можете использовать evtest для просмотра событий, генерируемых устройством. Вы можете найти его исходный код здесь , если вам интересно, как он работает.

7
ответ дан 7 December 2019 в 12:29

Другие вопросы по тегам:

Похожие вопросы: