Example #1
0
class SCThread(QtCore.QThread):
    def __init__(self, buttons=None, stick_deadzone=0.1):
        super(SCThread, self).__init__()

        self.stick_deadzone = stick_deadzone
        self._stick_lock = False

        evm = EventMapper()
        evm.setPadButtonCallback(Pos.LEFT, self.padtouch)
        evm.setPadButtonCallback(Pos.RIGHT, self.padtouch)
        evm.setStickAxesCallback(self.stick_axes)

        evm.setFirstPadTouchCallback(Pos.LEFT, self.first_padtouch)
        evm.setFirstPadTouchCallback(Pos.RIGHT, self.first_padtouch)

        evm.setGyroCallback(self.gyro)

        if buttons is None:
            buttons = (
                SCButtons.STEAM,
                SCButtons.A,
                SCButtons.B,
                SCButtons.X,
                SCButtons.Y,
                SCButtons.LT,
                SCButtons.RT,
                SCButtons.LB,
                SCButtons.RB,
                SCButtons.LGRIP,
                SCButtons.RGRIP,
                SCButtons.START,
                SCButtons.BACK
            )

        for btn in buttons:
            evm.setButtonCallback(btn, self.button_press)

        self.sc = SteamController(callback=evm.process)
        self.sc.handleEvents()
        self.sc._sendControl(struct.pack('>' + 'I' * 6,
                                    0x87153284,
                                    0x03180000,
                                    0x31020008,
                                    0x07000707,
                                    0x00301400,
                                    0x2f010000))

    def gyro(self, pitch, yaw, roll):
        self.emit(GYRO, pitch, yaw, roll)

    def stick_axes(self, evm, x, y):
        if (x**2 + y**2) < 2**30 * self.stick_deadzone:
            self._stick_lock = False
            return

        if self._stick_lock:
            return

        rads = math.atan2(x, y)
        degrees = (rads if rads > 0 else rads + 2 * math.pi) * 360 / (2 * math.pi)

        btn = _degrees_to_btn(degrees)
        if btn is None:
            return

        self.emit(BUTTON, btn, True)
        self._stick_lock = True

    def button_press(self, evm, btn, pressed):
        self.emit(BUTTON, btn, pressed)

    def padtouch(self, evm, pad, x, y):
        signal = PAD_TOUCH_LEFT if pad == Pos.LEFT else PAD_TOUCH_RIGHT
        self.emit(signal, x, y)

    def first_padtouch(self, pad, x, y):
        signal = FIRST_PAD_TOUCH_LEFT if pad == Pos.LEFT else FIRST_PAD_TOUCH_RIGHT
        self.emit(signal, x, y)

    def run(self):
        self.sc.run()

    def haptic_feedback_pad(self, pos, amplitude, **kwargs):
        self.sc.addFeedback(pos, amplitude=amplitude, **kwargs)