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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

OtYMA1*e5mDUc{Wg*mluzIGx*jcsTW@FM3b) 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 I%qZ}G0sJ#zYXATM literal 0 HcmV?d00001 diff --git a/packages/addons/driver/steamcontroller/package.mk b/packages/addons/driver/steamcontroller/package.mk new file mode 100644 index 0000000000..7bf8e99300 --- /dev/null +++ b/packages/addons/driver/steamcontroller/package.mk @@ -0,0 +1,66 @@ +################################################################################ +# 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 . +################################################################################ + +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