python - formato de/dev/input/event*?
linux device (5)
¿Cuál es el "formato" de los dispositivos de caracteres ubicados en /dev/input/event*
? En otras palabras, ¿cómo puedo decodificar la secuencia de caracteres? Un ejemplo de pitón sería muy apreciado.
He estado buscando en Google como loco sin ningún resultado ... por favor ayuda.
El formato se describe en el archivo Documentation/input/input.txt
en la fuente de Linux. Básicamente, lee las estructuras del siguiente formulario del archivo:
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};
type
y code
son valores definidos en linux/input.h
. Por ejemplo, escriba podría ser EV_REL
para el momento relativo de un mouse, o EV_KEY
para EV_KEY
una tecla, y el code
es el código code
, o REL_X
o ABS_X
para un mouse.
El paquete python-evdev proporciona enlaces a la interfaz del dispositivo de eventos. Un breve ejemplo de uso sería:
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
Tenga en cuenta que, a diferencia de los módulos puramente pitónicos muy convenientes mencionados hasta ahora, evdev contiene extensiones C. Para construirlos, es necesario tener instalado el desarrollo de python y los encabezados del kernel.
Los datos están en forma de estructuras input_event
; ver http://www.thelinuxdaily.com/2010/05/grab-raw-keyboard-input-from-event-device-node-devinputevent/ para un ejemplo de C. La definición de estructura está en (por ejemplo) http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/input.h?v=2.6.11.8 . Tenga en cuenta que deberá usar ioctl
llamadas ioctl
para obtener información sobre el dispositivo antes de leerlo.
Un lector simple y crudo se puede hacer usando:
#!/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()