diff options
author | Karel Kočí <karel.koci@nic.cz> | 2017-07-18 13:04:24 +0200 |
---|---|---|
committer | Karel Kočí <karel.koci@nic.cz> | 2017-07-18 13:15:54 +0200 |
commit | 2cdfe900d79bc2364ef609ddf4c5c0fe732e78df (patch) | |
tree | 1149897c514f538771b432013f9a4b5cd3b2cc7d /turtetris-master/usb_input.py | |
download | turris-tetris-2cdfe900d79bc2364ef609ddf4c5c0fe732e78df.tar.gz turris-tetris-2cdfe900d79bc2364ef609ddf4c5c0fe732e78df.tar.bz2 turris-tetris-2cdfe900d79bc2364ef609ddf4c5c0fe732e78df.zip |
Add initial version with support for gamepad input
Diffstat (limited to 'turtetris-master/usb_input.py')
-rw-r--r-- | turtetris-master/usb_input.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/turtetris-master/usb_input.py b/turtetris-master/usb_input.py new file mode 100644 index 0000000..8864ef9 --- /dev/null +++ b/turtetris-master/usb_input.py @@ -0,0 +1,54 @@ +import usb.core +import usb.util + +# Personal Communication Systems, Inc. SNES Gamepad +CONF_SNES_GAMEPAD = { + "idVendor": 0x0810, + "idProduct": 0xe501, + "iInterface": 0, +} + + +class Gamepad: + "Simple gamepad handle function" + + def __init__(self, conf=CONF_SNES_GAMEPAD): + "Initializes usb subsystem" + self.dev = usb.core.find(idVendor=conf['idVendor'], + idProduct=conf['idProduct']) + if self.dev is None: + raise ValueError('Device not found') + + if self.dev.is_kernel_driver_active(conf['iInterface']) is True: + # Detach any kernel driver so it won't interfere with us + self.dev.detach_kernel_driver(conf['iInterface']) + + # set the active configuration. With no arguments, the first + # configuration will be the active one + self.dev.set_configuration() + + # get an endpoint instance + self.cfg = self.dev.get_active_configuration() + intf = self.cfg[(0, 0)] + + self.ep = usb.util.find_descriptor( + intf, + # match the first IN endpoint + custom_match=lambda e: + usb.util.endpoint_direction(e.bEndpointAddress) == + usb.util.ENDPOINT_IN + ) + assert self.ep is not None + + def check(self): + "Check the input state" + data = self.dev.read(self.ep.bEndpointAddress, + self.ep.wMaxPacketSize*2, 1000).tolist() + return { + "left": data[3] < 120 or bool(data[5] & 0x80), + "right": data[3] > 140 or bool(data[5] & 0x20), + "up": data[4] < 120 or bool(data[5] & 0x10), + "down": data[4] > 140 or bool(data[5] & 0x40), + "select": bool(data[6] & 0x10), + "start": bool(data[6] & 0x20), + } |