Что такое "формат" символьных устройств, расположенных в /dev/input/event*
? Другими словами, как я могу декодировать поток символов? Приветствуется пример python.
Я искал, как сумасшедший, безрезультатно... пожалуйста, помогите.
Что такое "формат" символьных устройств, расположенных в /dev/input/event*
? Другими словами, как я могу декодировать поток символов? Приветствуется пример python.
Я искал, как сумасшедший, безрезультатно... пожалуйста, помогите.
прямо здесь, в модуле Input.py. Вам также понадобится модуль event.py.
Простой и грубый читатель можно просто сделать, используя:
#!/usr/bin/python
import struct
import time
import sys
infile_path = "/dev/input/event" + (sys.argv[1] if len(sys.argv) > 1 else "0")
#long int, long int, unsigned short, unsigned short, unsigned int
FORMAT = 'llHHI'
EVENT_SIZE = struct.calcsize(FORMAT)
#open file in binary mode
in_file = open(infile_path, "rb")
event = in_file.read(EVENT_SIZE)
while event:
(tv_sec, tv_usec, type, code, value) = struct.unpack(FORMAT, event)
if type != 0 or code != 0 or value != 0:
print("Event type %u, code %u, value %u at %d.%d" % \
(type, code, value, tv_sec, tv_usec))
else:
# Events with code, type and value == 0 are "separator" events
print("===========================================")
event = in_file.read(EVENT_SIZE)
in_file.close()
Формат описан в файле Documentation/input/input.txt
в источнике Linux. В принципе, вы читаете структуры из формы:
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};
type
и code
- значения, определенные в linux/input.h
. Например,
тип может быть EV_REL
для относительного момента мыши или EV_KEY
для
keypress, а code
- код ключа или REL_X
или ABS_X
для
мыши.
Пакет python-evdev обеспечивает привязки к интерфейсу устройства событий. Пример короткого использования:
from evdev import InputDevice
from select import select
dev = InputDevice('/dev/input/event1')
while True:
r,w,x = select([dev], [], [])
for event in dev.read():
print(event)
# event at 1337427573.061822, code 01, type 02, val 01
# event at 1337427573.061846, code 00, type 00, val 00
Имейте в виду, что в отличие от очень удобных, чисто pythonic модулей, упомянутых до сих пор, evdev содержит расширения C. Для их создания требуется установка вашего питона и заголовков ядра.
Данные представлены в виде структур input_event
; см. http://www.thelinuxdaily.com/2010/05/grab-raw-keyboard-input-from-event-device-node-devinputevent/ для примера. Определение структуры - это (например) http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/input.h?v=2.6.11.8. Обратите внимание, что вам нужно будет использовать кучу вызовов ioctl
для получения информации об устройстве, прежде чем читать с него.