import struct import time import board import digitalio import analogio from adafruit_hid import find_device class Gamepad: def __init__(self, devices): self._gamepad_device = find_device(devices, usage_page=0x1, usage=0x05) self._buttons = { 1: digitalio.DigitalInOut(board.GP0), 2: digitalio.DigitalInOut(board.GP1), 3: digitalio.DigitalInOut(board.GP2), 4: digitalio.DigitalInOut(board.GP3), 5: digitalio.DigitalInOut(board.GP4), 6: digitalio.DigitalInOut(board.GP5), 7: digitalio.DigitalInOut(board.GP6), } for button in self._buttons.values(): button.direction = digitalio.Direction.INPUT button.pull = digitalio.Pull.UP self._joy_x_axis = analogio.AnalogIn(board.GP26) self._joy_y_axis = analogio.AnalogIn(board.GP27) self._report = bytearray(6) self._last_report = bytearray(6) self._buttons_state = 0 self._joy_x = 0 self._joy_y = 0 self._joy_z = 0 self._joy_r_z = 0 try: self.reset_all() except OSError: time.sleep(1) self.reset_all() def read_buttons(self): self._buttons_state = 0 for button_num, button in self._buttons.items(): if not button.value: self._buttons_state |= 1 << (button_num - 1) def read_joysticks(self): self._joy_x = self._scale_joystick_value(self._joy_x_axis.value) self._joy_y = self._scale_joystick_value(self._joy_y_axis.value) def _scale_joystick_value(self, value): return (value - 32768) // 258 def update(self): self.read_buttons() self.read_joysticks() self._send() def _send(self, always=False): struct.pack_into( "