From d0c6cf06e5d9ebdb54969c6d290fe12b73e04110 Mon Sep 17 00:00:00 2001 From: DJ Sundog Date: Sun, 2 Aug 2020 16:47:56 -0700 Subject: [PATCH] first pass at turning SoundslabInput into a class --- SoundslabInput.py | 227 +++++++++++++++++++++++----------------------- 1 file changed, 112 insertions(+), 115 deletions(-) diff --git a/SoundslabInput.py b/SoundslabInput.py index 550c4b3..4a74f62 100644 --- a/SoundslabInput.py +++ b/SoundslabInput.py @@ -5,149 +5,146 @@ import time import musicpd from math import floor -# connect to mpd -player_client = musicpd.MPDClient() -player_client.connect() +class SoundslabInputHandler: + def __init__(self): + # connect to mpd + self.player_client = musicpd.MPDClient() + self.player_client.connect() -# initialize connection to display -display = SoundslabDisplay(player_client) + # initialize connection to display + self.display = SoundslabDisplay(player_client) -# The buttons on Pirate Audio are connected to pins 5, 6, 16 and 24 -# Boards prior to 23 January 2020 used 5, 6, 16 and 20 -# try changing 24 to 20 if your Y button doesn't work. -BUTTONS = [5, 6, 16, 24, 17, 27, 22, 23, 20] + # The buttons on Pirate Audio are connected to pins 5, 6, 16 and 24 + # Boards prior to 23 January 2020 used 5, 6, 16 and 20 + # try changing 24 to 20 if your Y button doesn't work. + self.BUTTONS = [5, 6, 16, 24, 17, 27, 22, 23, 20] -# These correspond to buttons A, B, X and Y then the five-way switch positions -LABELS = ['NW', 'SW', 'NE', 'SE', 'UP', 'SELECT', 'LF', 'DN', 'RT'] + # These correspond to buttons A, B, X and Y then the five-way switch positions + self.LABELS = ['NW', 'SW', 'NE', 'SE', 'UP', 'SELECT', 'LF', 'DN', 'RT'] -# Set up RPi.GPIO with the "BCM" numbering scheme -GPIO.setmode(GPIO.BCM) + # Set up RPi.GPIO with the "BCM" numbering scheme + GPIO.setmode(GPIO.BCM) -# Buttons connect to ground when pressed, so we should set them up -# with a "PULL UP", which weakly pulls the input signal to 3.3V. -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) + # Buttons connect to ground when pressed, so we should set them up + # with a "PULL UP", which weakly pulls the input signal to 3.3V. + GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) -# some button handlers -def NE(): - # play/pause toggle - global player_client - status = player_client.status() - if status['state'] == "play": - print("pausing") - player_client.pause(1) - elif status['state'] == "pause": - print("resuming") - player_client.pause(0) - else: # state == "stop" - print("playing") - player_client.play() + # This is a dictionary of the combination of pins and labels + self.LABELLED_BUTTONS = { + 5: NW, + 6: SW, + 16: NE, + 24: SE, + 17: UP, + 27: SELECT, + 22: LF, + 23: DN, + 20: RT + } -def SW(): - # previous track - global player_client - status = player_client.status() - if float(status['elapsed']) > 5.0: - # restart track - print("restart current track") - player_client.seekcur(0) - else: - # go to previous track - print("previous track") - player_client.previous() + # Loop through out buttons and attach the "handle_button" function to each + # We're watching the "FALLING" edge (transition from 3.3V to Ground) and + # picking a generous bouncetime of 150ms to smooth out button presses. + for pin in self.BUTTONS: + GPIO.add_event_detect(pin, GPIO.FALLING, self.handle_button, bouncetime=150) -def NW(): - # open menu - global display - print("toggling menu") - if display.show_menu is True: - display.show_menu = False - else: - display.show_menu = True + # some button handlers + def NE(self): + # play/pause toggle + status = self.player_client.status() + if status['state'] == "play": + print("pausing") + player_client.pause(1) + elif status['state'] == "pause": + print("resuming") + player_client.pause(0) + else: # state == "stop" + print("playing") + player_client.play() -def SE(): - # next track - global player_client - print("next track") - player_client.next() + def SW(self): + # previous track + status = player_client.status() + if float(status['elapsed']) > 5.0: + # restart track + print("restart current track") + self.player_client.seekcur(0) + else: + # go to previous track + print("previous track") + self.player_client.previous() -def UP(): - # volume up 10% - global player_client - print("vol up") - status = player_client.status() - if int(status['volume']) < 100: - player_client.setvol(int(status['volume']) + 10) + def NW(self): + # open menu + print("toggling menu") + if self.display.show_menu is True: + self.display.show_menu = False + else: + self.display.show_menu = True -def DN(): - # volume down 10% - global player_client - print("vol down") - status = player_client.status() - if int(status['volume']) > 0: - player_client.setvol(int(status['volume']) - 10) + def SE(self): + # next track + print("next track") + self.player_client.next() -def LF(): - # seek back 10s - global player_client - print("seek -10s") - status = player_client.status() - player_client.seekcur(floor(float(status['elapsed']) - 10.0)) + def UP(self): + # volume up 10% + print("vol up") + status = self.player_client.status() + if int(status['volume']) < 100: + self.player_client.setvol(int(status['volume']) + 10) -def RT(): - # seek forward 10s - global player_client - print("seek +10s") - status = player_client.status() - player_client.seekcur(floor(float(status['elapsed']) + 10.0)) + def DN(self): + # volume down 10% + print("vol down") + status = self.player_client.status() + if int(status['volume']) > 0: + self.player_client.setvol(int(status['volume']) - 10) -def SELECT(): - # display lock/unlock - display.toggleDisplayOnOff() + def LF(self): + # seek back 10s + print("seek -10s") + status = self.player_client.status() + self.player_client.seekcur(floor(float(status['elapsed']) - 10.0)) -# This is a dictionary of the combination of pins and labels -LABELLED_BUTTONS = { - 5: NW, - 6: SW, - 16: NE, - 24: SE, - 17: UP, - 27: SELECT, - 22: LF, - 23: DN, - 20: RT -} + def RT(self): + # seek forward 10s + print("seek +10s") + status = self.player_client.status() + self.player_client.seekcur(floor(float(status['elapsed']) + 10.0)) -# "handle_button" will be called every time a button is pressed -# It receives one argument: the associated input pin. -def handle_button(pin): - label = LABELS[BUTTONS.index(pin)] - print("Button press detected on pin: {} label: {}".format(pin, label)) - func = LABELLED_BUTTONS.get(pin) - func() + def SELECT(self): + # display lock/unlock + self.display.toggleDisplayOnOff() -# Loop through out buttons and attach the "handle_button" function to each -# We're watching the "FALLING" edge (transition from 3.3V to Ground) and -# picking a generous bouncetime of 150ms to smooth out button presses. -for pin in BUTTONS: - GPIO.add_event_detect(pin, GPIO.FALLING, handle_button, bouncetime=150) + # "handle_button" will be called every time a button is pressed + # It receives one argument: the associated input pin. + def handle_button(self, pin): + label = self.LABELS[self.BUTTONS.index(pin)] + print("Button press detected on pin: {} label: {}".format(pin, label)) + func = self.LABELLED_BUTTONS.get(pin) + func() + +# for now, we'll just go ahead and keep kicking things off from here +input_handler = SoundslabInputHandler() while True: - if display.show_menu is True: + if input_handler.display.show_menu is True: # test menu - display.updateMenu({ + input_handler.display.updateMenu({ "has_previous": False, "has_next": True, "selected": 0, "rows": ["Turn repeat on", "Turn shuffle on", "View queue >"] }) else: - display.updateMenu() + input_handler.display.updateMenu() # test album art - display.updateAlbumArt() + input_handler.display.updateAlbumArt() # test setting up the overlay - display.updateOverlay() + input_handler.display.updateOverlay() # test pushing the update to the display - display.updateDisplay() + input_handler.display.updateDisplay() # wait before continuing - time.sleep(1.0) + time.sleep(0.75)