разница между /dev/input/mouse0 и /dev/input/mice

разница между /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);are
    return -1;
}

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

close(fd);

return 0;

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

Я не нашел никакого кода для использования /dev/input/mouse0. Какая информация сохраняется в этом файле?

У меня есть вопросы:

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

решение1

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

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

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

1.3.1.3.мышидев

mousedev — это хак, позволяющий заставить работать устаревшие программы, использующие ввод с помощью мыши. Он принимает события от мышей или дигитайзеров/планшетов и делает мышь в стиле PS/2 (a 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файл, предоставленныйевдев(обработчик событий, не путать с xorg-driver 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для просмотра событий, генерируемых устройством. Вы можете найти его исходный кодздесьесли вам интересно, как это работает.

решение2

В моем случае я попытался выполнить событие мыши ОС. Мой код app.jsбыл таким:

var Mouse = require("./node_modules/node-mouse/mouse");
 
var m = new Mouse();
 
m.on("mousedown",function(event) {
    console.log(event);
});
 
m.on("mouseup",function(event) {
    console.log(event);
});
 
// same as mouseup, but fired after
m.on("click",function(event) {
    console.log(event);
});
 
 
m.on("mousemove", function(event) {
    console.log(event);
});

я бегалnode app.js

поэтому он выдает мне следующую ошибку

Error: EACCES: permission denied, open '/dev/input/mice'
Emitted 'error' event on Mouse instance at:

так что просто беги с sudo таким

node app.js

не выдает следующую ошибку

{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 1,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}

Связанный контент