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