Есть ли способ доступа к клавиатуре Linux, основанный на более высоком уровне (символ?), кроме / dev / input / eventx? - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь написать демон Linux, который должен принимать ввод с устройства, похожего на клавиатуру (HID) - это не консольная клавиатура, а второе устройство (на самом деле это 1D-сканер штрих-кода, если он что-то меняет),Демон будет обрабатывать данные, которые он получает («нажатия клавиш» из буквенно-цифровых штрих-кодов).

Я знаю, что демон может использовать ioctl (EVIOCGRAB), чтобы получить это устройство из / dev / input / eventx, а затем прочитать события ()(struct input_event from), это работает, но это слишком низкий уровень для моих нужд.Мне не нужно знать о каждом событии клавиш вверх и вниз, и я бы предпочел не декодировать / обрабатывать одновременные клавиши, т.е. я не хочу знать KEY_DOWN + KEY_RTSHIFT, KEY_DOWN + KEY_A, KEY_UP + KEY_RTSHIFT, KEY_UP + KEY_AЯ просто хочу получить «А».

Для использования входных событий требуется написать целую кучу дополнительного кода, просто чтобы получить «А» из него - и это кажется пустой тратой времени и усилий.когда почти наверняка существуют обработчики клавиатуры (или что-то в этом роде), которые будут выполнять намного лучшую работу, чем я, взламывая код вместе - я просто не могу их найти!

Есть ли способ поместить существующий слойпрограммного обеспечения (клавиатура?) в / dev / input / eventx, из которого демон может затем исключительно читать поток простых ascii из?

Для этого устройства / proc / bus / input / devices сообщает ...

H: Handlers=sysrq kbd leds event9

... что может означать, что что-то уже поместило слой "kbd" на него, но как получить к нему доступ?

Если я не EVIOCGRAB, то когда я сканируюштрих-код я вижу системные журналы оut "Ошибка входа в / dev / tty1", так что ввод с клавиатуры явно пытается войти в терминал / оболочку где-либо: - / (На этом компьютере также нет X, рабочего стола и т. д.)

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Библиотека libevdev не совсем то, что вы просите. Но он широко используется (например, драйверами evdev и libinput сервера Xorg).

Как указано на домашней странице:

libevdev - это чтение (2) стероидов для устройств / dev / input / eventX.

Он управляет ioctl вызовами для вас, обрабатывает очередь событий и т. Д.

Одна дополнительная функция, которую вы не просили, но она действительно полезна: она может обрабатывать события с нескольких устройств одновременно. Он позволяет прослушивать несколько устройств, находящихся в / dev / input, и обрабатывать один и тот же тип события в одном потоке.

0 голосов
/ 13 мая 2018

Я не знаю о такой библиотеке или демоне.

Тем не менее, написание демона для выполнения именно этого не так сложно, как вы думаете.По моему мнению / опыту, если вам не нужно реализовывать автоповтор (то есть, делать автоповтор только если устройство, похожее на клавиатуру, посылает автоповторные нажатия клавиш), демон на удивление прост.

В частности, основной циклэто просто блокирующее чтение, за которым следует ноль или более блокирующих записей с поиском массива в середине.

Вы можете использовать либо именованный канал (в этом случае вы открываете канал перед открытием устройства, потому чтооткрытие завершается успешно только после того, как другой процесс открывает именованный канал или FIFO для чтения) или сокет;либо сокет Unix Domain, либо сокет TCP или UDP (на интерфейсе обратной связи).Я бы, вероятно, использовал именованный канал, /var/run/barcode-scanner.

. Я бы использовал отдельный файл конфигурации для отображения ввода и поддерживал бы имена макросов препроцессора (KEY_) из /usr/include/linux/input-event-codes.h,проанализировал массив с помощью вспомогательного сценария awk.Файл сопоставления клавиш, вероятно, будет находиться в /etc/barcode-scanner/keymap и содержать определения, подобные

KEY_1 = 1
KEY_NUMERIC_1 = 1
KEY_E = e
shift KEY_E = E
ctrl KEY_E = \5
altgr KEY_E = €
KEY_UP = \033[A

и т. Д.События, не перечисленные в файле определения, будут игнорироваться или необязательно регистрироваться.

Вы можете использовать массив, поскольку существует до 768 (от 0 до KEY_MAX включительно; хотя 0 - KEY_RESERVED) различных событий клавиатуры;в качестве двумерного массива вам, вероятно, понадобится что-то вроде 16 массивов для поддержки всех комбинаций Shift , Ctrl , Alt и AltGr (или правая клавиша alt), когда нажата каждая клавиша.Внутренне вам просто нужно обработать KEY_LEFTSHIFT, KEY_RIGHTSHIFT, KEY_CAPSLOCK (для управления состоянием сдвига);KEY_LEFTALT (для управления состоянием alt);KEY_RIGHTALT (для управления состоянием altgr);и KEY_LEFTCTRL и KEY_RIGHTCTRL (для управления состоянием ctrl).Если вы используете битовую маску для обозначения текущих состояний, вы можете использовать ее как индекс для внешнего измерения массива поиска.Это действительно очень просто.

Обратите внимание, что каждый элемент массива представляет собой строку, которая генерируется при нажатии клавиши этого состояния (ev.value == 1 для нажатия клавиши, ev.value == 2 для автоповтора).Помимо вышеупомянутых специальных ключей, вам вообще не нужно обрабатывать нажатия клавиш.

Хм.Интересно, есть ли другие, кому нужен такой демон?Вы бы использовали лицензию под GPL3, если бы источники были на GitHub?

...