From 0107af2eef1f5b818edcca46cf806aa99441532d Mon Sep 17 00:00:00 2001 From: Stany MARCEL Date: Fri, 2 Dec 2016 00:18:10 +0100 Subject: Add a xbox/desktop mixed script This script permit to switch between xbox mode and desktop mode when the steam button is pressed. Signed-off-by: Stany MARCEL --- scripts/sc-mixed.py | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100755 scripts/sc-mixed.py diff --git a/scripts/sc-mixed.py b/scripts/sc-mixed.py new file mode 100755 index 0000000..6cfebce --- /dev/null +++ b/scripts/sc-mixed.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python + +# The MIT License (MIT) +# +# Copyright (c) 2015 Stany MARCEL +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +"""Steam Controller XBOX360 Gamepad Emulator""" + +from steamcontroller import \ + SteamController, \ + SCButtons +from steamcontroller.events import \ + EventMapper, \ + Pos +from steamcontroller.uinput import \ + Keys, \ + Axes +from steamcontroller.daemon import Daemon + + +def set_evm_pad(evm): + evm.setStickAxes(Axes.ABS_X, Axes.ABS_Y) + evm.setPadAxes(Pos.RIGHT, Axes.ABS_RX, Axes.ABS_RY) + evm.setPadAxesAsButtons(Pos.LEFT, [Axes.ABS_HAT0X, + Axes.ABS_HAT0Y]) + + evm.setTrigAxis(Pos.LEFT, Axes.ABS_Z) + evm.setTrigAxis(Pos.RIGHT, Axes.ABS_RZ) + + evm.setButtonAction(SCButtons.A, Keys.BTN_A) + evm.setButtonAction(SCButtons.B, Keys.BTN_B) + evm.setButtonAction(SCButtons.X, Keys.BTN_X) + evm.setButtonAction(SCButtons.Y, Keys.BTN_Y) + evm.setButtonAction(SCButtons.LB, Keys.BTN_TL) + evm.setButtonAction(SCButtons.RB, Keys.BTN_TR) + evm.setButtonAction(SCButtons.BACK, Keys.BTN_SELECT) + evm.setButtonAction(SCButtons.START, Keys.BTN_START) + + evm.setButtonAction(SCButtons.LPAD, Keys.BTN_THUMBL) + evm.setButtonAction(SCButtons.RPAD, Keys.BTN_THUMBR) + evm.setButtonAction(SCButtons.LGRIP, Keys.BTN_A) + evm.setButtonAction(SCButtons.RGRIP, Keys.BTN_B) + +def set_evm_desktop(evm): + evm.setPadMouse(Pos.RIGHT) + evm.setPadScroll(Pos.LEFT) + evm.setStickButtons([Keys.KEY_UP, + Keys.KEY_LEFT, + Keys.KEY_DOWN, + Keys.KEY_RIGHT]) + + evm.setTrigButton(Pos.LEFT, Keys.BTN_RIGHT) + evm.setTrigButton(Pos.RIGHT, Keys.BTN_LEFT) + + evm.setButtonAction(SCButtons.LB, Keys.KEY_VOLUMEDOWN) + evm.setButtonAction(SCButtons.RB, Keys.KEY_VOLUMEUP) + + evm.setButtonAction(SCButtons.A, Keys.KEY_ENTER) + evm.setButtonAction(SCButtons.B, Keys.KEY_BACKSPACE) + evm.setButtonAction(SCButtons.X, Keys.KEY_ESC) + evm.setButtonAction(SCButtons.Y, Keys.KEY_PLAYPAUSE) + + evm.setButtonAction(SCButtons.START, Keys.KEY_NEXTSONG) + evm.setButtonAction(SCButtons.BACK, Keys.KEY_PREVIOUSSONG) + + evm.setButtonAction(SCButtons.LGRIP, Keys.KEY_BACK) + evm.setButtonAction(SCButtons.RGRIP, Keys.KEY_FORWARD) + + evm.setButtonAction(SCButtons.LPAD, Keys.BTN_MIDDLE) + evm.setButtonAction(SCButtons.RPAD, Keys.KEY_SPACE) + + + +pad = True +def toggle_callback(evm, btn, pressed): + global pad + if not pressed: + if pad: + set_evm_desktop(evm) + else: + set_evm_pad(evm) + pad = not pad + +def evminit(): + evm = EventMapper() + set_evm_pad(evm) + evm.setButtonCallback(SCButtons.STEAM, toggle_callback) + return evm + +class SCDaemon(Daemon): + def run(self): + evm = evminit() + sc = SteamController(callback=evm.process) + sc.run() + +if __name__ == '__main__': + import argparse + + def _main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('command', type=str, choices=['start', 'stop', 'restart', 'debug']) + parser.add_argument('-i', '--index', type=int, choices=[0,1,2,3], default=None) + args = parser.parse_args() + if args.index != None: + daemon = SCDaemon('/tmp/steamcontroller{:d}.pid'.format(args.index)) + else: + daemon = SCDaemon('/tmp/steamcontroller.pid') + + if 'start' == args.command: + daemon.start() + elif 'stop' == args.command: + daemon.stop() + elif 'restart' == args.command: + daemon.restart() + elif 'debug' == args.command: + try: + evm = evminit() + sc = SteamController(callback=evm.process) + sc.run() + except KeyboardInterrupt: + return + + _main() -- cgit v1.2.3