Я пытаюсь прочитать необработанный буфер клавиатуры из / dev / input / event2
ls -l /dev/input/by-id/
lrwxrwxrwx 1 root root 9 Mar 14 21:08 usb-0461_HP_USB_Multimedia_Keyboard-event-if01 -> ../event3
lrwxrwxrwx 1 root root 9 Mar 14 21:08 usb-0461_HP_USB_Multimedia_Keyboard-event-kbd -> ../event2
lrwxrwxrwx 1 root root 9 Mar 14 16:07 usb-Logitech_USB_Receiver-if01-event-mouse -> ../event4
lrwxrwxrwx 1 root root 9 Mar 14 16:07 usb-Logitech_USB_Receiver-if01-mouse -> ../mouse0
Также я попробовал это: sudo cat / dev / input / event2 Когда я нажимаю любую клавишу или отпускаю любую клавишу Я могу видеть некоторый двоичный код напечатан. Итак, я знаю, что / dev / input / event2 предположительно является необработанным буфером моей клавиатуры.
Вот мой код
int fd1 = 0;
if( (fd1 = open("/dev/input/event2", O_RDONLY)) > 0 )
{
struct input_event event;
unsigned int scan_code = 0;
bool exit_sign = false;
ssize_t evt_size = sizeof(event);
printf("Try read %ld bytes\n", evt_size);
int flags = fcntl(fd1, F_GETFL, 0);
fcntl(fd1, F_SETFL, flags | O_NONBLOCK);
while (!exit_sign)
{
usleep(1000);
ssize_t n = read(fd, &event, evt_size);
if (n == (ssize_t)-1)
{
if (errno == EAGAIN || errno == EWOULDBLOCK )
continue;
else
{
printf("Unknown error:%d\n", errno);
break;
}
}
else if (n != evt_size)
{
printf("Unexpected event:%ld\n", n);
return -1; // Keyboard events are always of type EV_KEY
}
printf("type:%x, code:%x, value:%x\n", event.type, event.code, event.value);
if(event.type != EV_KEY)
{
printf("Unexpected event type:%d\n", event.type);
return -1; // Keyboard events are always of type EV_KEY
}
if(event.value == EV_RELEASED)
{
scan_code = event.code;
printf("read back scan_code is: %d \n", scan_code);
if (scan_code == KEY_X)
exit_sign = true;
}
}
close(fd1);
}
Когда я запускаю приведенный выше код, это действительно приводит меня в движение сумасшедший. когда я нажимаю любую клавишу, кажется, что функция чтения не читает какой-либо необработанный буфер, а интерпретирует клавишу. Например, если я быстро нажму 'b' на клавиатуре, я надеюсь прочитать 2 input_event. 1 ключ вниз и 1 ключ вверх; с правильным типом и надлежащим значением ключа. Но вместо этого он не возвращается (поскольку в буфере есть только 'b', и этого недостаточно для struct input_event). Если я нажму клавишу ввода до того, как нажму достаточное количество клавиш, кажется, что чтение вернется и скажет мне только несколько прочитанных байтов. Эти байты интерпретируются ключом, а не необработанной информацией (input_event). Что я сделал не так? Как я могу прочитать необработанную информацию из буфера ключей?