GNU/Linux >> Znalost Linux >  >> Linux

Formát /dev/input/event*

Jednoduché a hrubé čtení lze provést pomocí:

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

Balíček python-evdev poskytuje vazby na rozhraní zařízení událostí. Krátký příklad použití by byl:

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

Mějte na paměti, že na rozdíl od dosud zmíněných velmi pohodlných, čistě Pythonic modulů, evdev obsahuje C rozšíření. Jejich vytvoření vyžaduje mít nainstalovaný vývoj Pythonu a hlavičky jádra.


Přímo zde v modulu Input.py. Budete také potřebovat modul event.py.


Formát je popsán v Documentation/input/input.txt soubor ve zdroji Linuxu. V podstatě ze souboru čtete struktury následujícího tvaru:

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

type a code jsou hodnoty definované v linux/input.h . Typ může být například EV_REL pro relativní moment myši nebo EV_KEY pro stisknutí klávesy a code je kód klíče nebo REL_X nebo ABS_X pro pobavení.


Linux
  1. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  2. Jak přenosné jsou /dev/stdin, /dev/stdout a /dev/stderr?

  3. Co jsou soubory /dev/zero a /dev/null v Linuxu

  1. Jak zaměníte /dev/sda s /dev/sdb?

  2. Kdy mám použít /dev/shm/ a kdy /tmp/?

  3. DD z /dev/zero do /dev/null...co se vlastně stane

  1. Jak vygenerovat náhodné heslo v linuxu pomocí /dev/random

  2. Je špatné propojit /dev/random s /dev/urandom v Linuxu?

  3. Rozdíly mezi /dev/sda a /dev/sda1