soundslab/SoundslabInput.py

157 lines
4.1 KiB
Python

import signal
import RPi.GPIO as GPIO
from SoundslabDisplay import SoundslabDisplay
import time
import musicpd
from math import floor
# connect to mpd
player_client = musicpd.MPDClient()
player_client.connect()
# initialize connection to display
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]
# 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']
# 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)
# a temporary place to store menu state
show_menu = False
# 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()
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()
def NW():
# open menu
print("toggling menu")
if show_menu is True:
show_menu = False
else:
show_menu = True
def SE():
# next track
global player_client
print("next track")
player_client.next()
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 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 LF():
# seek back 10s
global player_client
print("seek -10s")
status = player_client.status()
player_client.seekcur(floor(float(status['elapsed']) - 10.0))
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 SELECT():
# display lock/unlock
display.toggleDisplayOnOff()
# 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
}
# "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()
# 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 100ms to smooth out button presses.
for pin in BUTTONS:
GPIO.add_event_detect(pin, GPIO.FALLING, handle_button, bouncetime=100)
while True:
if show_menu is True:
# test menu
display.updateMenu(
[
{output: ""},
{output: "Toggle repeat", selected=True},
{output: "Toggle shuffle"},
{output: "View queue"},
{output: ""}
]
)
# test album art
display.updateAlbumArt()
# test setting up the overlay
display.updateOverlay()
# test pushing the update to the display
display.updateDisplay()
# wait before continuing
time.sleep(1.0)