#!python3 import sys import evdev import contextlib keymap = { evdev.ecodes.KEY_1: (b'&', b'1'), evdev.ecodes.KEY_2: (b'?', b'2'), evdev.ecodes.KEY_3: (b'"', b'3'), evdev.ecodes.KEY_4: (b'\'', b'4'), evdev.ecodes.KEY_5: (b'(', b'5'), evdev.ecodes.KEY_6: (b'-', b'6'), evdev.ecodes.KEY_7: (b'?', b'7'), evdev.ecodes.KEY_8: (b'_', b'8'), evdev.ecodes.KEY_9: (b'?', b'9'), evdev.ecodes.KEY_0: (b'?', b'0'), evdev.ecodes.KEY_MINUS: (b')', '°'.encode('utf8')), evdev.ecodes.KEY_EQUAL: (b'=', b'+'), evdev.ecodes.KEY_Q: b'a', evdev.ecodes.KEY_W: b'z', evdev.ecodes.KEY_E: b'e', evdev.ecodes.KEY_R: b'r', evdev.ecodes.KEY_T: b't', evdev.ecodes.KEY_Y: b'y', evdev.ecodes.KEY_U: b'u', evdev.ecodes.KEY_I: b'i', evdev.ecodes.KEY_O: b'o', evdev.ecodes.KEY_P: b'p', evdev.ecodes.KEY_A: b'q', evdev.ecodes.KEY_S: b's', evdev.ecodes.KEY_D: b'd', evdev.ecodes.KEY_F: b'f', evdev.ecodes.KEY_G: b'g', evdev.ecodes.KEY_H: b'h', evdev.ecodes.KEY_J: b'j', evdev.ecodes.KEY_K: b'k', evdev.ecodes.KEY_L: b'l', evdev.ecodes.KEY_SEMICOLON: b'm', evdev.ecodes.KEY_Z: b'w', evdev.ecodes.KEY_X: b'z', evdev.ecodes.KEY_C: b'c', evdev.ecodes.KEY_V: b'v', evdev.ecodes.KEY_B: b'b', evdev.ecodes.KEY_N: b'n', evdev.ecodes.KEY_M: (b',', b'?'), evdev.ecodes.KEY_COMMA: (b';', b'.'), evdev.ecodes.KEY_DOT: (b':', b'/'), evdev.ecodes.KEY_SLASH: b'!', evdev.ecodes.KEY_SPACE: b' ', } kpkeys_map = { evdev.ecodes.KEY_KP0: '0', evdev.ecodes.KEY_KP1: '1', evdev.ecodes.KEY_KP2: '2', evdev.ecodes.KEY_KP3: '3', evdev.ecodes.KEY_KP4: '4', evdev.ecodes.KEY_KP5: '5', evdev.ecodes.KEY_KP6: '6', evdev.ecodes.KEY_KP7: '7', evdev.ecodes.KEY_KP8: '8', evdev.ecodes.KEY_KP9: '9', } def list_devices(name=None): devices = [evdev.InputDevice(fn) for fn in evdev.list_devices()] for dev in devices: #print(dev.fn, dev.name, dev.phys) if name and name == dev.name: return dev def read_events(dev=None): dev = evdev.InputDevice(dev.fn) dev.grab() line = '' shift = False active_keys = dict.fromkeys(( 42, # KEY_LEFTSHIFT 56, # KEY_LEFTALT ), False) accumulate = [] bindata = [] unidata = [] try: for event in dev.read_loop(): if event.type == evdev.ecodes.EV_KEY: data = evdev.categorize(event) #print(data) #key = scancodes[data.scancode] if data.scancode in scancodes else str(data.scancode) #print('scancode', data.scancode, 'up' if data.keystate == # data.key_up else 'down') if data.scancode in active_keys: active_keys[data.scancode] = data.keystate == data.key_down if data.scancode == 56 and data.keystate == data.key_up: value = int(''.join(accumulate)) accumulate = [] print('value', value, bytes([value])) bindata.append(bytes([value])) with contextlib.suppress(UnicodeDecodeError): unidata.append(bytes([value]).decode('utf8')) for i in range(6): with contextlib.suppress(UnicodeDecodeError): unidata.append(b''.join(bindata[-i:] + [bytes([value])]) .decode('utf8')) break elif data.keystate == data.key_up: continue elif data.scancode == 28: # keycode: KEY_ENTER print('end of data scan') bindata = b''.join(bindata) print('bytes', bindata) #print(bindata.decode('utf8')) bindata = [] else: if active_keys[56]: # if KEY_LEFTALT down, then accumulate binary data accumulate.append(kpkeys_map[data.scancode]) elif data.scancode in keymap: key = keymap[data.scancode] if active_keys[42]: # KEY_LEFTSHIFT if len(key) > 1: key = key[1] else: key = key.upper() else: if len(key) > 1: key = key[0] bindata.append(key) unidata.append(key.decode('utf8')) else: print(active_keys, data) finally: dev.ungrab() dev = list_devices(name='The Code Corporation CR1000') print(dev) read_events(dev)