What is the “format” of the character devices located in /dev/input/event*?
In other words, how can I decode the character stream? A Python example would be greatly appreciated.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
A simple and raw reader can be just done using:
#!/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()
Method 2
The format is described in the Documentation/input/input.txt file in the Linux source. Basically, you read structs of the following form from the file:
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
};
type and code are values defined in linux/input.h. For example,
type might be EV_REL for relative moment of a mouse, or EV_KEY for
a keypress, and code is the keycode, or REL_X or ABS_X for a
mouse.
Method 3
Right here in the Input.py module. You’ll also need the event.py module.
Method 4
The python-evdev package provides bindings to the event device interface. A short usage example would be:
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
Keep in mind that, unlike the very convenient, purely Pythonic modules mentioned so far, evdev contains C extensions. Building them requires having your Python development and kernel headers installed.
Method 5
The data is in the form of input_event structures; see http://www.thelinuxdaily.com/2010/05/grab-raw-keyboard-input-from-event-device-node-devinputevent/ for a C example. The struct definition is at (for example) http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/input.h?v=2.6.11.8. Note that you will need to use a bunch of ioctl calls to get information on the device before reading from it.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0