deathonater

GPD Pocket 4 Game Dongle

Mar 5th, 2025
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.06 KB | None | 0 0
  1. import time
  2. import board
  3. import busio
  4. import digitalio
  5. import rotaryio
  6. import usb_hid
  7. import usb_cdc
  8. import adafruit_ssd1306
  9. from adafruit_hid.consumer_control import ConsumerControl
  10. from adafruit_hid.consumer_control_code import ConsumerControlCode
  11. from adafruit_hid.keyboard import Keyboard
  12. from adafruit_hid.keycode import Keycode
  13.  
  14. # Setup I2C for OLED (SCL = D13, SDA = D12)
  15. i2c = busio.I2C(board.D13, board.D12)
  16. display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)
  17.  
  18. # Setup HID and Serial
  19. consumer_control = ConsumerControl(usb_hid.devices)
  20. keyboard = Keyboard(usb_hid.devices)
  21. serial = usb_cdc.console
  22.  
  23. # Setup Rotary Encoders (only second one works)
  24. encoder_brightness = rotaryio.IncrementalEncoder(board.D5, board.D6)
  25. button_brightness_mute = digitalio.DigitalInOut(board.D7)
  26. button_brightness_mute.direction = digitalio.Direction.INPUT
  27. button_brightness_mute.pull = digitalio.Pull.UP
  28.  
  29. encoder_vol = rotaryio.IncrementalEncoder(board.D8, board.D9)
  30. button_vol_mute = digitalio.DigitalInOut(board.D4)
  31. button_vol_mute.direction = digitalio.Direction.INPUT
  32. button_vol_mute.pull = digitalio.Pull.UP
  33.  
  34. last_position_vol = encoder_vol.position
  35. last_position_brightness = encoder_brightness.position
  36.  
  37. # Clear OLED and display initial message
  38. display.fill(0)
  39. display.text("Waiting for host...", 0, 0, 1)
  40. display.show()
  41.  
  42. print("KB2040 HID & OLED Ready")
  43.  
  44. while True:
  45.     # Read Serial Data and Update OLED
  46.     if serial.in_waiting > 0:
  47.         received_data = serial.read(serial.in_waiting).decode().strip()
  48.         print(f"BATT: {received_data}%")
  49.  
  50.         # Update OLED Display
  51.         display.fill(0)
  52.         display.text("BATT: " + received_data[:20] + "%", 0, 0, 1)
  53.         display.show()
  54.  
  55.     # Check Volume Encoder
  56.     position_vol = encoder_vol.position
  57.     if position_vol > last_position_vol:
  58.         print("Volume Up")
  59.         consumer_control.send(ConsumerControlCode.VOLUME_INCREMENT)
  60.     elif position_vol < last_position_vol:
  61.         print("Volume Down")
  62.         consumer_control.send(ConsumerControlCode.VOLUME_DECREMENT)
  63.     last_position_vol = position_vol
  64.  
  65.     # Check Mute Button for Volume
  66.     if not button_vol_mute.value:
  67.         print("Mute Toggle")
  68.         consumer_control.send(ConsumerControlCode.MUTE)
  69.         time.sleep(0.3)  # Debounce
  70.  
  71.     # Check Brightness Encoder
  72.     position_brightness = encoder_brightness.position
  73.     if position_brightness > last_position_brightness:
  74.         print("Brightness Up")
  75.         consumer_control.send(ConsumerControlCode.BRIGHTNESS_INCREMENT)
  76.     elif position_brightness < last_position_brightness:
  77.         print("Brightness Down")
  78.         consumer_control.send(ConsumerControlCode.BRIGHTNESS_DECREMENT)
  79.     last_position_brightness = position_brightness
  80.  
  81.     # Check Button for Brightness Encoder (Send Ctrl+Alt+Del)
  82.     if not button_brightness_mute.value:
  83.         print("Sending Ctrl+Alt+Del")
  84.         keyboard.press(Keycode.CONTROL, Keycode.ALT, Keycode.DELETE)
  85.         keyboard.release_all()
  86.         time.sleep(0.3)  # Debounce
  87.  
  88.     time.sleep(0.05)  # Keep loop responsive
  89.  
Advertisement
Add Comment
Please, Sign In to add comment