GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Format von /dev/input/event*

Ein einfaches und rohes Lesegerät kann einfach erstellt werden mit:

#!/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()

Das Paket python-evdev stellt Bindungen an die Ereignisgeräteschnittstelle bereit. Ein kurzes Verwendungsbeispiel wäre:

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

Denken Sie daran, dass evdev im Gegensatz zu den bisher erwähnten sehr praktischen, rein pythonischen Modulen C-Erweiterungen enthält. Um sie zu erstellen, müssen Ihre Python-Entwicklungs- und Kernel-Header installiert sein.


Genau hier im Modul Input.py. Außerdem benötigen Sie das Modul event.py.


Das Format ist im Documentation/input/input.txt beschrieben Datei in der Linux-Quelle. Im Grunde lesen Sie Strukturen der folgenden Form aus der Datei:

struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
};

type und code sind in linux/input.h definierte Werte . Typ könnte beispielsweise EV_REL sein für den relativen Moment einer Maus oder EV_KEY für einen Tastendruck und code ist der Schlüsselcode oder REL_X oder ABS_X zum Spaß.


Linux
  1. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Was sind /dev/zero- und /dev/null-Dateien in Linux

  3. Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

  4. Wie Linux /dev/tty und /dev/tty0 verwendet

  5. Ist es falsch, /dev/random unter Linux mit /dev/urandom zu verknüpfen?

tty (/dev/tty ) vs. pts (/dev/pts) unter Linux

Wie tauscht man /dev/sda mit /dev/sdb aus?

DD von /dev/zero nach /dev/null ... was eigentlich passiert

Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0

Kernel:/dev/kmem und /dev/mem deaktivieren

Unterschiede zwischen /dev/sda und /dev/sda1