Skip to content

Instantly share code, notes, and snippets.

@danthedaniel
Created March 2, 2024 22:40
Show Gist options
  • Save danthedaniel/5d22f7662c2e2783da42d3a79af29d56 to your computer and use it in GitHub Desktop.
Save danthedaniel/5d22f7662c2e2783da42d3a79af29d56 to your computer and use it in GitHub Desktop.
import time
import board
import digitalio
import usb_hid
from adafruit_hid.consumer_control import ConsumerControl
from adafruit_hid.consumer_control_code import ConsumerControlCode
def init_pin(pin_id):
pin = digitalio.DigitalInOut(pin_id)
pin.direction = digitalio.Direction.INPUT
pin.pull = digitalio.Pull.UP
return pin
def key_pressed(pin):
return not pin.value
def handle_volume(playpause_pin):
global pins, key_codes, cc
volume_changed = False
while key_pressed(playpause_pin):
for pin_id, pin in pins.items():
if pin == playpause_pin:
continue
if not key_pressed(pin):
continue
inner_key_code = key_codes[pin_id]
volume_changed = True
if inner_key_code == ConsumerControlCode.SCAN_PREVIOUS_TRACK:
cc.send(ConsumerControlCode.VOLUME_DECREMENT)
elif inner_key_code == ConsumerControlCode.SCAN_NEXT_TRACK:
cc.send(ConsumerControlCode.VOLUME_INCREMENT)
cc.release()
time.sleep(0.05)
return volume_changed
key_codes = {
board.D6: ConsumerControlCode.SCAN_PREVIOUS_TRACK,
board.D7: ConsumerControlCode.PLAY_PAUSE,
board.D5: ConsumerControlCode.SCAN_NEXT_TRACK,
}
pins = {
pin_id: init_pin(pin_id)
for pin_id in key_codes.keys()
}
cc = ConsumerControl(usb_hid.devices)
while True:
for pin_id, pin in pins.items():
if not key_pressed(pin):
continue
key_code = key_codes[pin_id]
if key_code == ConsumerControlCode.PLAY_PAUSE:
volume_changed = handle_volume(pin)
if not volume_changed:
cc.send(key_code)
cc.release()
time.sleep(0.01)
else:
# Handle next/previous track
cc.send(key_code)
while key_pressed(pin):
# wait for button release
pass
cc.release()
time.sleep(0.01)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment