aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Kočí <karel.koci@nic.cz>2017-07-18 13:04:24 +0200
committerKarel Kočí <karel.koci@nic.cz>2017-07-18 13:15:54 +0200
commit2cdfe900d79bc2364ef609ddf4c5c0fe732e78df (patch)
tree1149897c514f538771b432013f9a4b5cd3b2cc7d
downloadturris-tetris-2cdfe900d79bc2364ef609ddf4c5c0fe732e78df.tar.gz
turris-tetris-2cdfe900d79bc2364ef609ddf4c5c0fe732e78df.tar.bz2
turris-tetris-2cdfe900d79bc2364ef609ddf4c5c0fe732e78df.zip
Add initial version with support for gamepad input
-rw-r--r--.gitignore5
-rw-r--r--README.md3
-rw-r--r--setup.py30
-rw-r--r--turtetris-master/__init__.py12
-rw-r--r--turtetris-master/__main__.py3
-rw-r--r--turtetris-master/usb_input.py54
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),
+ }