first pass at turning SoundslabInput into a class
This commit is contained in:
parent
7e42594e13
commit
d0c6cf06e5
@ -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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user