невозможно прочитать необработанное событие клавиатуры из / dev / input / eventx - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь прочитать необработанный буфер клавиатуры из / 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). Что я сделал не так? Как я могу прочитать необработанную информацию из буфера ключей?

...