import ctypes 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 } 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) ] class input_id (ctypes.Structure): _fields_ = [ ("bustype", ctypes.c_uint16), ("vendor", ctypes.c_uint16), ("product", ctypes.c_uint16), ("version", ctypes.c_uint16), ] 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 */