54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
import serial
|
|
import uinput
|
|
|
|
ev = (uinput.BTN_SOUTH, uinput.BTN_EAST, uinput.BTN_DPAD_UP, uinput.BTN_DPAD_DOWN, uinput.BTN_DPAD_LEFT, uinput.BTN_DPAD_RIGHT)
|
|
device_p3 = uinput.Device(ev, name="Zockbox3")
|
|
device_p4 = uinput.Device(ev, name="Zockbox4")
|
|
|
|
p3int = 0
|
|
p4int = 64
|
|
|
|
s = serial.Serial('/dev/ttyACM0', 9600)
|
|
|
|
def handle_ctrl(controller, byte):
|
|
if byte % 32 == 0:
|
|
controller.emit(uinput.BTN_SOUTH, 1)
|
|
byte -= 32
|
|
else:
|
|
controller.emit(uinput.BTN_SOUTH, 0)
|
|
if byte % 16 == 0:
|
|
controller.emit(uinput.BTN_EAST, 1)
|
|
byte -= 16
|
|
else:
|
|
controller.emit(uinput.BTN_EAST, 0)
|
|
if byte % 8 == 0:
|
|
controller.emit(uinput.BTN_DPAD_RIGHT, 1)
|
|
byte -= 8
|
|
else:
|
|
controller.emit(uinput.BTN_DPAD_RIGHT, 0)
|
|
if byte % 4 == 0:
|
|
controller.emit(uinput.BTN_DPAD_LEFT, 1)
|
|
byte -= 4
|
|
else:
|
|
controller.emit(uinput.BTN_DPAD_LEFT, 0)
|
|
if byte % 2 == 0:
|
|
controller.emit(uinput.BTN_DPAD_DOWN, 1)
|
|
byte -= 2
|
|
else:
|
|
controller.emit(uinput.BTN_DPAD_DOWN, 0)
|
|
if byte % 1 == 0:
|
|
controller.emit(uinput.BTN_DPAD_UP, 1)
|
|
else:
|
|
controller.emit(uinput.BTN_DPAD_UP, 0)
|
|
|
|
|
|
while s.isOpen():
|
|
control = s.read()
|
|
ctrlint = int.from_bytes(control, byteorder='big', signed=False)
|
|
if ctrlint < 64 and p3int != ctrlint:
|
|
p3int = ctrlint
|
|
handle_ctrl(device_p3, ctrlint)
|
|
if ctrlint >= 64 and p4int != ctrlint:
|
|
p4int = ctrlint
|
|
ctrlint -= 64
|
|
handle_ctrl(device_p4, ctrlint)
|