From dd885d03489a2d77dbba09497369aab1dfc282c4 Mon Sep 17 00:00:00 2001 From: Lukas Rusak Date: Fri, 18 Nov 2016 00:03:22 -0800 Subject: [PATCH] steamcontroller: initial add-on --- .../driver/steamcontroller/changelog.txt | 2 + .../driver/steamcontroller/icon/icon.png | Bin 0 -> 30512 bytes .../addons/driver/steamcontroller/package.mk | 66 ++++++++++++++++++ ...steamcontroller-0001-fix-include-dir.patch | 17 +++++ ...amcontroller-0002-append-python-path.patch | 28 ++++++++ ...-0003-wait-for-controller-connection.patch | 31 ++++++++ ...oller-0004-use-run-for-pid-directory.patch | 24 +++++++ .../driver/steamcontroller/source/default.py | 35 ++++++++++ .../system.d/driver.steamcontroller.service | 13 ++++ 9 files changed, 216 insertions(+) create mode 100644 packages/addons/driver/steamcontroller/changelog.txt create mode 100644 packages/addons/driver/steamcontroller/icon/icon.png create mode 100644 packages/addons/driver/steamcontroller/package.mk create mode 100644 packages/addons/driver/steamcontroller/patches/steamcontroller-0001-fix-include-dir.patch create mode 100644 packages/addons/driver/steamcontroller/patches/steamcontroller-0002-append-python-path.patch create mode 100644 packages/addons/driver/steamcontroller/patches/steamcontroller-0003-wait-for-controller-connection.patch create mode 100644 packages/addons/driver/steamcontroller/patches/steamcontroller-0004-use-run-for-pid-directory.patch create mode 100644 packages/addons/driver/steamcontroller/source/default.py create mode 100644 packages/addons/driver/steamcontroller/source/system.d/driver.steamcontroller.service diff --git a/packages/addons/driver/steamcontroller/changelog.txt b/packages/addons/driver/steamcontroller/changelog.txt new file mode 100644 index 0000000000..32d81ca428 --- /dev/null +++ b/packages/addons/driver/steamcontroller/changelog.txt @@ -0,0 +1,2 @@ +100 +- Initial add-on diff --git a/packages/addons/driver/steamcontroller/icon/icon.png b/packages/addons/driver/steamcontroller/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e75bb57a61009cd30baf93207143c1a1d7711550 GIT binary patch literal 30512 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. +################################################################################ + +PKG_NAME="steamcontroller" +PKG_VERSION="02f27c4" +PKG_REV="100" +PKG_ARCH="any" +PKG_LICENSE="MIT" +PKG_SITE="https://github.com/ynsta/steamcontroller" +PKG_URL="https://github.com/ynsta/steamcontroller/archive/$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain Python distutilscross:host python-libusb1 enum34 linux" +PKG_SECTION="driver" +PKG_SHORTDESC="A standalone userland driver for the steam controller to be used where steam client can't be installed." +PKG_LONGDESC="A standalone userland driver for the steam controller to be used where steam client can't be installed." +PKG_AUTORECONF="no" + +PKG_IS_ADDON="yes" +PKG_ADDON_NAME="Steam Controller Driver" +PKG_ADDON_TYPE="xbmc.service" + +pre_make_target() { + export PYTHONXCPREFIX="$SYSROOT_PREFIX/usr" + export LDSHARED="$CC -shared" +} + +make_target() { + python setup.py build +} + +makeinstall_target() { + : +} + +addon() { + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin + cp -a $PKG_BUILD/build/scripts-2.7/* $ADDON_BUILD/$PKG_ADDON_ID/bin/ + + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/lib + cp -a $PKG_BUILD/build/lib.linux-*-2.7/* $ADDON_BUILD/$PKG_ADDON_ID/lib/ + cp -a $(get_build_dir python-libusb1)/build/lib/* $ADDON_BUILD/$PKG_ADDON_ID/lib/ + cp -a $(get_build_dir enum34)/build/lib/* $ADDON_BUILD/$PKG_ADDON_ID/lib/ + + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/include/linux + if [ -f "$(get_build_dir linux)/usr/include/linux/input-event-codes.h" ]; then + cp $(get_build_dir linux)/usr/include/linux/input-event-codes.h $ADDON_BUILD/$PKG_ADDON_ID/include/linux/ + fi + cp $(get_build_dir linux)/usr/include/linux/input.h $ADDON_BUILD/$PKG_ADDON_ID/include/linux/ + + python -Wi -t -B $ROOT/$TOOLCHAIN/lib/python2.7/compileall.py $ADDON_BUILD/$PKG_ADDON_ID/lib/ -f + find $ADDON_BUILD/$PKG_ADDON_ID/lib/ -name '*.py' -exec rm {} \; +} diff --git a/packages/addons/driver/steamcontroller/patches/steamcontroller-0001-fix-include-dir.patch b/packages/addons/driver/steamcontroller/patches/steamcontroller-0001-fix-include-dir.patch new file mode 100644 index 0000000000..66579e1ffb --- /dev/null +++ b/packages/addons/driver/steamcontroller/patches/steamcontroller-0001-fix-include-dir.patch @@ -0,0 +1,17 @@ +diff -Naur a/src/uinput.py b/src/uinput.py +--- a/src/uinput.py 2016-01-02 23:13:18.000000000 +0100 ++++ b/src/uinput.py 2016-01-03 08:44:34.003676619 +0100 +@@ -34,10 +34,10 @@ + from collections import deque + + # Get All defines from linux headers +-if os.path.exists('/usr/include/linux/input-event-codes.h'): +- CHEAD = defines('/usr/include', 'linux/input-event-codes.h') ++if os.path.exists('/storage/.kodi/addons/driver.steamcontroller/include/linux/input-event-codes.h'): ++ CHEAD = defines('/storage/.kodi/addons/driver.steamcontroller/include', 'linux/input-event-codes.h') + else: +- CHEAD = defines('/usr/include', 'linux/input.h') ++ CHEAD = defines('/storage/.kodi/addons/driver.steamcontroller/include', 'linux/input.h') + + # Keys enum contains all keys and button from linux/uinput.h (KEY_* BTN_*) + Keys = IntEnum('Keys', {i: CHEAD[i] for i in CHEAD.keys() if (i.startswith('KEY_') or diff --git a/packages/addons/driver/steamcontroller/patches/steamcontroller-0002-append-python-path.patch b/packages/addons/driver/steamcontroller/patches/steamcontroller-0002-append-python-path.patch new file mode 100644 index 0000000000..1a6790e4d2 --- /dev/null +++ b/packages/addons/driver/steamcontroller/patches/steamcontroller-0002-append-python-path.patch @@ -0,0 +1,28 @@ +diff -Naur a/scripts/sc-desktop.py b/scripts/sc-desktop.py +--- a/scripts/sc-desktop.py 2016-01-02 23:13:18.000000000 +0100 ++++ b/scripts/sc-desktop.py 2016-01-04 22:00:18.536497613 +0100 +@@ -22,6 +22,10 @@ + # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + # THE SOFTWARE. + ++import sys ++ ++sys.path.append('/storage/.kodi/addons/driver.steamcontroller/lib') ++ + """Steam Controller Mouse, Keyboard mode""" + + from steamcontroller import SteamController, SCButtons +diff -Naur a/scripts/sc-xbox.py b/scripts/sc-xbox.py +--- a/scripts/sc-xbox.py 2016-01-02 23:13:18.000000000 +0100 ++++ b/scripts/sc-xbox.py 2016-01-04 22:00:30.751519105 +0100 +@@ -22,6 +22,10 @@ + # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + # THE SOFTWARE. + ++import sys ++ ++sys.path.append('/storage/.kodi/addons/driver.steamcontroller/lib') ++ + """Steam Controller XBOX360 Gamepad Emulator""" + + from steamcontroller import \ diff --git a/packages/addons/driver/steamcontroller/patches/steamcontroller-0003-wait-for-controller-connection.patch b/packages/addons/driver/steamcontroller/patches/steamcontroller-0003-wait-for-controller-connection.patch new file mode 100644 index 0000000000..b0f3bf01ad --- /dev/null +++ b/packages/addons/driver/steamcontroller/patches/steamcontroller-0003-wait-for-controller-connection.patch @@ -0,0 +1,31 @@ +diff -Naur a/src/__init__.py b/src/__init__.py +--- a/src/__init__.py 2016-09-14 13:00:35.000000000 -0700 ++++ b/src/__init__.py 2016-11-17 23:40:57.137095353 -0800 +@@ -116,18 +116,16 @@ + self._cmsg = [] + self._ctx = usb1.USBContext() + ++ while self._handle is None: ++ for i in range(len(PRODUCT_ID)): ++ pid = PRODUCT_ID[i] ++ endpoint = ENDPOINT[i] ++ ccidx = CONTROLIDX[i] + +- for i in range(len(PRODUCT_ID)): +- pid = PRODUCT_ID[i] +- endpoint = ENDPOINT[i] +- ccidx = CONTROLIDX[i] +- +- self._handle = self._ctx.openByVendorIDAndProductID( +- VENDOR_ID, pid, +- skip_on_error=True, +- ) +- if self._handle is not None: +- break ++ self._handle = self._ctx.openByVendorIDAndProductID( ++ VENDOR_ID, pid, ++ skip_on_error=True, ++ ) + + if self._handle is None: + raise ValueError('SteamControler Device not found') diff --git a/packages/addons/driver/steamcontroller/patches/steamcontroller-0004-use-run-for-pid-directory.patch b/packages/addons/driver/steamcontroller/patches/steamcontroller-0004-use-run-for-pid-directory.patch new file mode 100644 index 0000000000..ca60886135 --- /dev/null +++ b/packages/addons/driver/steamcontroller/patches/steamcontroller-0004-use-run-for-pid-directory.patch @@ -0,0 +1,24 @@ +diff -Naur a/scripts/sc-desktop.py b/scripts/sc-desktop.py +--- a/scripts/sc-desktop.py 2016-11-18 13:31:29.522462062 -0800 ++++ b/scripts/sc-desktop.py 2016-11-18 13:33:09.268432661 -0800 +@@ -80,7 +80,7 @@ + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('command', type=str, choices=['start', 'stop', 'restart', 'debug']) + args = parser.parse_args() +- daemon = SCDaemon('/tmp/steamcontroller.pid') ++ daemon = SCDaemon('/run/steamcontroller.pid') + + if 'start' == args.command: + daemon.start() +diff -Naur a/scripts/sc-xbox.py b/scripts/sc-xbox.py +--- a/scripts/sc-xbox.py 2016-11-18 13:31:29.522462062 -0800 ++++ b/scripts/sc-xbox.py 2016-11-18 13:33:09.266432642 -0800 +@@ -79,7 +79,7 @@ + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('command', type=str, choices=['start', 'stop', 'restart', 'debug']) + args = parser.parse_args() +- daemon = SCDaemon('/tmp/steamcontroller.pid') ++ daemon = SCDaemon('/run/steamcontroller.pid') + + if 'start' == args.command: + daemon.start() diff --git a/packages/addons/driver/steamcontroller/source/default.py b/packages/addons/driver/steamcontroller/source/default.py new file mode 100644 index 0000000000..6c6b84a8a5 --- /dev/null +++ b/packages/addons/driver/steamcontroller/source/default.py @@ -0,0 +1,35 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016 Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +import subprocess +import xbmc +import xbmcaddon + + +class Monitor(xbmc.Monitor): + + def __init__(self, *args, **kwargs): + xbmc.Monitor.__init__(self) + self.id = xbmcaddon.Addon().getAddonInfo('id') + + def onSettingsChanged(self): + subprocess.call(['systemctl', 'restart', self.id]) + + +if __name__ == '__main__': + Monitor().waitForAbort() diff --git a/packages/addons/driver/steamcontroller/source/system.d/driver.steamcontroller.service b/packages/addons/driver/steamcontroller/source/system.d/driver.steamcontroller.service new file mode 100644 index 0000000000..4a5be360ae --- /dev/null +++ b/packages/addons/driver/steamcontroller/source/system.d/driver.steamcontroller.service @@ -0,0 +1,13 @@ +[Unit] +Description=a standalone userland driver for the steam controller + +[Service] +Type=forking +ExecStart=/usr/bin/python /storage/.kodi/addons/driver.steamcontroller/bin/sc-xbox.py start +ExecStop=/usr/bin/python /storage/.kodi/addons/driver.steamcontroller/bin/sc-xbox.py stop +PIDFile=/run/steamcontroller.pid +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target