2013-04-17 18:34:45 -04:00
|
|
|
import ctypes
|
|
|
|
|
2013-04-18 18:10:15 -04:00
|
|
|
import struct
|
|
|
|
|
|
|
|
from gen import input_constants_dict as icd
|
|
|
|
|
|
|
|
for k, v in icd.iteritems():
|
|
|
|
locals()[k] = v
|
|
|
|
|
|
|
|
|
|
|
|
rdict = lambda x: dict(map(lambda (k, v): (v, k), x))
|
|
|
|
|
|
|
|
events = filter(lambda (k, v): k in ["EV_SYN", "EV_KEY", "EV_REL",
|
|
|
|
"EV_ABS", "EV_MSC", "EV_SW", "EV_LED", "EV_SND", "EV_REP",
|
|
|
|
"EV_FF", "EV_PWR", "EV_FF_STATUS"], icd.iteritems())
|
|
|
|
rev_events = rdict(events)
|
|
|
|
|
|
|
|
|
|
|
|
# event sets
|
|
|
|
"""
|
|
|
|
static const char * const * const names[EV_MAX + 1] = {
|
|
|
|
[0 ... EV_MAX] = NULL,
|
|
|
|
[EV_SYN] = events, [EV_KEY] = keys,
|
|
|
|
[EV_REL] = relatives, [EV_ABS] = absolutes,
|
|
|
|
[EV_MSC] = misc, [EV_LED] = leds,
|
|
|
|
[EV_SND] = sounds, [EV_REP] = repeats,
|
|
|
|
[EV_SW] = switches,
|
|
|
|
[EV_FF] = force, [EV_FF_STATUS] = forcestatus,
|
|
|
|
};
|
|
|
|
"""
|
|
|
|
|
|
|
|
keys = filter(lambda (k, v): k.startswith("KEY_") or k.startswith("BTN_"),
|
|
|
|
icd.iteritems())
|
|
|
|
rev_keys = rdict(keys)
|
|
|
|
|
|
|
|
absaxes = filter(lambda (k, v): k.startswith("ABS_"),
|
|
|
|
icd.iteritems())
|
|
|
|
rev_absaxes = rdict(absaxes)
|
|
|
|
|
|
|
|
rel = filter(lambda (k, v): k.startswith("REL_"),
|
|
|
|
icd.iteritems())
|
|
|
|
rev_rel = rdict(rel)
|
|
|
|
|
|
|
|
syn = filter(lambda (k, v): k.startswith("SYN_"),
|
|
|
|
icd.iteritems())
|
|
|
|
rev_syn = rdict(syn)
|
|
|
|
|
|
|
|
del rdict
|
|
|
|
|
|
|
|
# TODO
|
|
|
|
misc = {}
|
|
|
|
|
|
|
|
leds = sounds = repeats = switches = force = forcestatus = None
|
|
|
|
|
|
|
|
event_keys = {
|
|
|
|
EV_SYN: rev_syn,
|
|
|
|
EV_KEY: rev_keys,
|
|
|
|
EV_REL: rev_rel,
|
|
|
|
EV_ABS: rev_absaxes,
|
|
|
|
EV_MSC: misc,
|
|
|
|
EV_LED: leds,
|
|
|
|
EV_SND: sounds,
|
|
|
|
EV_REP: repeats,
|
|
|
|
EV_SW: switches,
|
|
|
|
EV_FF: force,
|
|
|
|
EV_FF_STATUS: forcestatus
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-04-17 18:34:45 -04:00
|
|
|
class timeval(ctypes.Structure):
|
|
|
|
_fields_ = [("tv_sec", ctypes.c_long), ("tv_usec", ctypes.c_long)]
|
|
|
|
|
|
|
|
class input_event(ctypes.Structure):
|
|
|
|
_fields_ = [
|
|
|
|
("time", timeval),
|
|
|
|
("type", ctypes.c_uint16),
|
|
|
|
("code", ctypes.c_uint16),
|
|
|
|
("value", ctypes.c_int32)
|
|
|
|
]
|
|
|
|
|
2013-04-18 18:10:15 -04:00
|
|
|
class input_id (ctypes.Structure):
|
|
|
|
_fields_ = [
|
|
|
|
("bustype", ctypes.c_uint16),
|
|
|
|
("vendor", ctypes.c_uint16),
|
|
|
|
("product", ctypes.c_uint16),
|
|
|
|
("version", ctypes.c_uint16),
|
|
|
|
]
|
|
|
|
|
2013-04-18 12:13:57 -04:00
|
|
|
from ioctlhelp import IOR, IOW, IOC, IO, _IOC_READ
|
|
|
|
|
|
|
|
# Get driver version
|
|
|
|
EVIOCGVERSION = IOR(ord('E'), 0x01, '@i')
|
|
|
|
|
|
|
|
# Get device ID
|
|
|
|
#EVIOCGID = IOR(ord('E'), 0x02, struct input_id)
|
|
|
|
|
|
|
|
# Get repeat settings
|
|
|
|
EVIOCGREP = IOR(ord('E'), 0x03, '@ii')
|
|
|
|
# Set repeat settings
|
|
|
|
EVIOCSREP = IOW(ord('E'), 0x03, '@ii')
|
|
|
|
|
|
|
|
# Get keycode
|
|
|
|
EVIOCGKEYCODE = IOR(ord('E'), 0x04, '@ii')
|
|
|
|
# EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry)
|
|
|
|
|
|
|
|
# Set keycode
|
|
|
|
|
|
|
|
EVIOCSKEYCODE = IOW(ord('E'), 0x04, '@ii')
|
|
|
|
#EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry)
|
|
|
|
|
|
|
|
# Get device name
|
|
|
|
EVIOCGNAME = lambda _len: IOC(_IOC_READ, ord('E'), 0x06,
|
|
|
|
struct.calcsize('%ds' % _len))
|
|
|
|
|
|
|
|
# Get physical location
|
|
|
|
EVIOCGPHYS= lambda _len: IOC(_IOC_READ, ord('E'), 0x07,
|
|
|
|
struct.calcsize('%ds' % _len))
|
|
|
|
|
|
|
|
# Get unique identifier
|
|
|
|
EVIOCGUNIQ = lambda _len: IOC(_IOC_READ, ord('E'), 0x08,
|
|
|
|
struct.calcsize('%ds' % _len))
|
|
|
|
|
|
|
|
# Get device properties
|
|
|
|
EVIOCGPROP = lambda _len: IOC(_IOC_READ, ord('E'), 0x09,
|
|
|
|
struct.calcsize('%ds' % _len))
|
|
|
|
|
|
|
|
#EVIOCGMTSLOTS(len) _IOC(_IOC_READ, 'E', 0x0a, len)
|
|
|
|
#
|
|
|
|
#EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global key state */
|
|
|
|
#EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */
|
|
|
|
#EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */
|
|
|
|
#EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */
|
|
|
|
|
|
|
|
|
|
|
|
# Get event bits
|
|
|
|
EVIOCGBIT = lambda ev, _len: IOC(_IOC_READ, ord('E'), 0x20 + ev, _len)
|
|
|
|
|
|
|
|
#EVIOCGABS(abs) _IOR('E', 0x40 + (abs), struct input_absinfo) /* get abs value/limits */
|
|
|
|
#EVIOCSABS(abs) _IOW('E', 0xc0 + (abs), struct input_absinfo) /* set abs value/limits */
|
|
|
|
#
|
|
|
|
#EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */
|
|
|
|
#EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */
|
|
|
|
#EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */
|
|
|
|
#
|
|
|
|
#EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */
|
|
|
|
#
|
|
|
|
#EVIOCSCLOCKID _IOW('E', 0xa0, int) /* Set clockid to be used for timestamps */
|
|
|
|
|