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)