GNU/Linux >> Tutoriels Linux >  >> Linux

Format de /dev/input/event*

Un lecteur simple et brut peut être simplement fait en utilisant :

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

Le package python-evdev fournit des liaisons à l'interface du périphérique d'événement. Un court exemple d'utilisation serait :

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

Gardez à l'esprit que, contrairement aux modules purement Pythonic très pratiques mentionnés jusqu'à présent, evdev contient des extensions C. Leur construction nécessite l'installation de votre développement Python et des en-têtes du noyau.


Ici même dans le module Input.py. Vous aurez également besoin du module event.py.


Le format est décrit dans le Documentation/input/input.txt fichier dans la source Linux. Fondamentalement, vous lisez les structures du formulaire suivant à partir du fichier :

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

type et code sont des valeurs définies dans linux/input.h . Par exemple, le type peut être EV_REL pour le moment relatif d'une souris, ou EV_KEY fora keypress, et code est le code clé, ou REL_X ou ABS_X pour l'amusement.


Linux
  1. Linux :Différence entre /dev/console , /dev/tty et /dev/tty0 ?

  2. Quelle est la portabilité de /dev/stdin, /dev/stdout et /dev/stderr ?

  3. Quand utiliser /dev/random contre /dev/urandom ?

  4. Comment mapper les périphériques /dev/sdX et /dev/mapper/mpathY à partir du périphérique /dev/dm-Z

  5. Comment encoder en base64 /dev/random ou /dev/urandom ?

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

Quand dois-je utiliser /dev/shm/ et quand dois-je utiliser /tmp/?

DD de /dev/zero à /dev/null...ce qui se passe réellement

Linux :Différence entre /dev/console , /dev/tty et /dev/tty0

noyau :désactiver /dev/kmem et /dev/mem

Différences entre /dev/sda et /dev/sda1