import serial import uinput import struct ev = (uinput.BTN_SOUTH, uinput.BTN_EAST, uinput.ABS_X + (0, 100, 0, 0), uinput.ABS_Y + (0, 100, 0, 0)) device_p3 = uinput.Device(ev, name="Zockbox3") device_p4 = uinput.Device(ev, name="Zockbox4") p3int = 0 p4int = 0 s = serial.Serial('/dev/ttyACM0', 9600) def handle_ctrl(controller, byte): if byte & 0x20: controller.emit(uinput.BTN_SOUTH, 1) else: controller.emit(uinput.BTN_SOUTH, 0) if byte & 0x10: controller.emit(uinput.BTN_EAST, 1) else: controller.emit(uinput.BTN_EAST, 0) if byte & 0x08: controller.emit(uinput.ABS_X, 100) elif byte & 0x04: controller.emit(uinput.ABS_X, 0) else: controller.emit(uinput.ABS_X, 50) if byte & 0x02: controller.emit(uinput.ABS_Y, 0) elif byte & 0x01: controller.emit(uinput.ABS_Y, 100) else: controller.emit(uinput.ABS_Y, 50) while s.isOpen(): control = s.read(2) for c in struct.unpack('>BB', control): i = 3 if c < 64 else 4 c = c & 0x3f ctrl = device_p3 if i == 3 else device_p4 if i == 3: p3int = c else: p4int = c handle_ctrl(ctrl, c)