예제 #1
0
def controller_states(controller_id):

    sdl2.SDL_Init(sdl2.SDL_INIT_GAMECONTROLLER)

    controller = get_controller(controller_id)

    try:
        print('Using "{:s}" for input.'.format(
            sdl2.SDL_JoystickName(sdl2.SDL_GameControllerGetJoystick(controller)).decode('utf8')))
    except AttributeError:
        print('Using controller {:s} for input.'.format(controller_id))

    while True:
        elaped_time = dt.datetime.now().timestamp() - start_dttm
        buttons = sum([sdl2.SDL_GameControllerGetButton(controller, b) << n for n, b in enumerate(buttonmapping)])
        buttons |= (abs(sdl2.SDL_GameControllerGetAxis(controller, sdl2.SDL_CONTROLLER_AXIS_TRIGGERLEFT)) > trigger_deadzone) << 6
        buttons |= (abs(sdl2.SDL_GameControllerGetAxis(controller, sdl2.SDL_CONTROLLER_AXIS_TRIGGERRIGHT)) > trigger_deadzone) << 7

        hat = hatcodes[sum([sdl2.SDL_GameControllerGetButton(controller, b) << n for n, b in enumerate(hatmapping)])]

        rawaxis = [sdl2.SDL_GameControllerGetAxis(controller, n) for n in axismapping]
        axis = [((0 if abs(x) < axis_deadzone else x) >> 8) + 128 for x in rawaxis]

        rawbytes = struct.pack('>BHBBBB', hat, buttons, *axis)
        message_stamp = ControllerStateTime(rawbytes, elaped_time)
        yield message_stamp
예제 #2
0
    def controller_states(self):
        cls = self.__class__
        controller = self.controller
        while True:
            for _ in sdl2.ext.get_events():
                pass
            elaped_time = dt.datetime.now().timestamp(
            ) - self.start_dttm.timestamp()
            buttons = sum((sdl2.SDL_GameControllerGetButton(controller, b) << n
                           for n, b in enumerate(cls.buttonmapping)))
            buttons |= (abs(
                sdl2.SDL_GameControllerGetAxis(
                    controller, sdl2.SDL_CONTROLLER_AXIS_TRIGGERLEFT)) >
                        cls.trigger_deadzone) << 6
            buttons |= (abs(
                sdl2.SDL_GameControllerGetAxis(
                    controller, sdl2.SDL_CONTROLLER_AXIS_TRIGGERRIGHT)) >
                        cls.trigger_deadzone) << 7

            hat = cls.hatcodes[sum([
                sdl2.SDL_GameControllerGetButton(controller, b) << n
                for n, b in enumerate(cls.hatmapping)
            ])]

            rawaxis = [
                sdl2.SDL_GameControllerGetAxis(controller, n)
                for n in cls.axismapping
            ]
            axis = [((0 if abs(x) < cls.axis_deadzone else x) >> 8) + 128
                    for x in rawaxis]

            rawbytes = struct.pack('>BHBBBB', hat, buttons, *axis)
            message_stamp = ControllerStateTime(rawbytes, elaped_time)
            yield message_stamp
예제 #3
0
    def __next__(self):
        buttons = sum([
            sdl2.SDL_GameControllerGetButton(self.controller, b) << n
            for n, b in enumerate(Controller.buttonmapping)
        ])
        buttons |= (abs(
            sdl2.SDL_GameControllerGetAxis(
                self.controller, sdl2.SDL_CONTROLLER_AXIS_TRIGGERLEFT)) >
                    self.trigger_deadzone) << 6
        buttons |= (abs(
            sdl2.SDL_GameControllerGetAxis(
                self.controller, sdl2.SDL_CONTROLLER_AXIS_TRIGGERRIGHT)) >
                    self.trigger_deadzone) << 7

        hat = Controller.hatcodes[sum([
            sdl2.SDL_GameControllerGetButton(self.controller, b) << n
            for n, b in enumerate(Controller.hatmapping)
        ])]

        rawaxis = [
            sdl2.SDL_GameControllerGetAxis(self.controller, n)
            for n in Controller.axismapping
        ]
        axis = [((0 if abs(x) < self.axis_deadzone else x) >> 8) + 128
                for x in rawaxis]

        state = State(buttons, hat, *axis)
        # TODO: quantize
        self.previous_state = state
        return state
예제 #4
0
    def get_axis(self, axis_index):
        axis_value = sdl2.SDL_GameControllerGetAxis(self._sdl_controller, axis_index)

        # Sticks have a dead zone
        if axis_index != self.AXIS_TRIGGER_LEFT and axis_index != self.AXIS_TRIGGER_RIGHT:
            if abs(axis_value) < self.AXIS_DEAD_ZONE:
                return 0

        # Return scaled value
        return axis_value / self.AXIS_MAX_VALUE if axis_value > 0 else -axis_value / self.AXIS_MIN_VALUE
예제 #5
0
    def handle(self, event):

        if event.type in [
                sdl2.SDL_CONTROLLERBUTTONDOWN, sdl2.SDL_CONTROLLERBUTTONUP
        ]:

            button = event.cbutton.button
            state = event.cbutton.state

            buttonName = sdl2.SDL_GameControllerGetStringForButton(button)
            function = getattr(self, self.BUTTON_TO_FUNCTION_MAP[buttonName])
            if DEBUG: print "CALLING", function, state
            return function(state)

        elif event.type in [sdl2.SDL_CONTROLLERAXISMOTION]:

            axis = event.caxis.axis
            axisName = sdl2.SDL_GameControllerGetStringForAxis(axis)
            function = getattr(self, self.AXIS_TO_FUNCTION_MAP[axisName])

            if axisName in ['leftx', 'lefty']:
                axes = ['leftx', 'lefty']

            elif axisName in ['rightx', 'righty']:
                axes = ['rightx', 'righty']

            else:
                # LT or RT
                value = (event.caxis.value + 32768.0) / 65535.0
                if DEBUG: print "CALL", function, value
                return function(value)

            args = []
            for axis in axes:
                value = sdl2.SDL_GameControllerGetAxis(
                    self.sdl_controller,
                    sdl2.SDL_GameControllerGetAxisFromString(axis))
                value = value / 32768.0
                args.append(value)

            if DEBUG: print "CALL", function, args
            return function(*args)

        raise Exception("I should not be here")
예제 #6
0
                                        sdl2.SDL_CONTROLLER_BUTTON_RIGHTSTICK):
        right_buttons |= (1 << 0)  # System
    else:
        right_buttons &= ~(1 << 0)
    if sdl2.SDL_GameControllerGetButton(gamecontroller,
                                        sdl2.SDL_CONTROLLER_BUTTON_GUIDE):
        right_buttons |= (1 << 1)  # Menu
    else:
        right_buttons &= ~(1 << 1)
    if sdl2.SDL_GameControllerGetButton(
            gamecontroller, sdl2.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER):
        right_buttons |= (1 << 2)  # Grip
    else:
        right_buttons &= ~(1 << 2)

    right_pitch = sdl2.SDL_GameControllerGetAxis(
        gamecontroller, sdl2.SDL_CONTROLLER_AXIS_RIGHTY)
    right_yaw = sdl2.SDL_GameControllerGetAxis(gamecontroller,
                                               sdl2.SDL_CONTROLLER_AXIS_RIGHTX)
    right_trigger = sdl2.SDL_GameControllerGetAxis(
        gamecontroller, sdl2.SDL_CONTROLLER_AXIS_TRIGGERRIGHT)

    if right_trigger > 3276:  # 10% depressed
        right_touched |= (1 << 33)  # Axis1
    else:
        right_touched &= ~(1 << 33)
    if right_trigger > 16384:  # 50% depressed
        right_buttons |= (1 << 33)  # Axis1
    else:
        right_buttons &= ~(1 << 33)

    # Make a controller visible only for 15 seconds after movement/button press