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 | |
| download | turris-tetris-2cdfe900d79bc2364ef609ddf4c5c0fe732e78df.tar.gz turris-tetris-2cdfe900d79bc2364ef609ddf4c5c0fe732e78df.tar.bz2 turris-tetris-2cdfe900d79bc2364ef609ddf4c5c0fe732e78df.zip  | |
Add initial version with support for gamepad input
| -rw-r--r-- | .gitignore | 5 | ||||
| -rw-r--r-- | README.md | 3 | ||||
| -rw-r--r-- | setup.py | 30 | ||||
| -rw-r--r-- | turtetris-master/__init__.py | 12 | ||||
| -rw-r--r-- | turtetris-master/__main__.py | 3 | ||||
| -rw-r--r-- | turtetris-master/usb_input.py | 54 | 
6 files changed, 107 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..45dc3cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +*~ +.* +__*__ + +!.gitignore diff --git a/README.md b/README.md new file mode 100644 index 0000000..91adc32 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +Turris Tetris +============= +Tetris game played on ten Turris Omnias stacked on top of each other.  diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..ab7ffa6 --- /dev/null +++ b/setup.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +from setuptools import setup + +setup( +    name='turtetris', +    version='0.1', +    description="Turris Tetris", +    long_description="Tetris game played on ten Turris Omnias stacked on top of each other.", +    url="https://github.com/Cynerd/mcserver-wrapper", +    author="Cynerd", +    author_email="cynerd@email.cz", +    license="GPLv2", + +    classifiers=[ +        'Development Status :: 3 - Alpha', +        'Programming Language :: Python :: 3', +        'Programming Language :: Python :: 3.3', +        'Programming Language :: Python :: 3.4', +        'Programming Language :: Python :: 3.5', +        'Programming Language :: Python :: 3.6', +        ], +    keywords='Turris Tetris', + +    packages=['turtetris'], +    entry_points={ +        'console_scripts': [ +            'turtetris-master=turtetris-master' +            ] +        } +    ) diff --git a/turtetris-master/__init__.py b/turtetris-master/__init__.py new file mode 100644 index 0000000..9cf22b1 --- /dev/null +++ b/turtetris-master/__init__.py @@ -0,0 +1,12 @@ +from .usb_input import Gamepad + + +def main(): +    "Main function" +    inpt = Gamepad() +    while True: +        print(inpt.check()) + + +if __name__ == '__main__': +    main() diff --git a/turtetris-master/__main__.py b/turtetris-master/__main__.py new file mode 100644 index 0000000..8273c4f --- /dev/null +++ b/turtetris-master/__main__.py @@ -0,0 +1,3 @@ +from . import main + +main() 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), +        }  | 
