GNU/Linux >> Tutoriales Linux >  >> Linux

Formato de /dev/input/event*

Se puede hacer un lector simple y sin procesar 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")

"""
FORMAT represents the format used by linux kernel input event struct
See https://github.com/torvalds/linux/blob/v5.5-rc5/include/uapi/linux/input.h#L28
Stands for: 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()

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 muy convenientes módulos puramente pitónicos mencionados hasta ahora, evdev contiene extensiones C. Construirlos requiere tener instalados el desarrollo de Python y los encabezados del kernel.


Justo aquí en el módulo Input.py. También necesitará el módulo event.py.


El formato se describe en el Documentation/input/input.txt archivo en la fuente de Linux. Básicamente, lee estructuras de la siguiente forma 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, el tipo podría ser EV_REL para el momento relativo de un mouse, o EV_KEY para presionar una tecla, y code es el código clave, o REL_X o ABS_X para un ratón.


Linux
  1. ¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

  2. ¿Qué tan portátiles son /dev/stdin, /dev/stdout y /dev/stderr?

  3. ¿Cuándo usar /dev/random Vs /dev/urandom?

  4. Cómo mapear dispositivos /dev/sdX y /dev/mapper/mpathY desde el dispositivo /dev/dm-Z

  5. ¿Qué son los archivos /dev/zero y /dev/null en Linux?

tty (/dev/tty) vs pts (/dev/pts) en Linux

Linux:diferencia entre /dev/console, /dev/tty y /dev/tty0

kernel:deshabilitar /dev/kmem y /dev/mem

¿Está mal vincular /dev/random a /dev/urandom en Linux?

¿Por qué se requieren < o > para usar /dev/tcp?

Diferencias entre /dev/sda y /dev/sda1