mpd-Client für meinen Musikspieler

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

mpd-Client für meinen Musikspieler

Beitrag von smutbert » 30.05.2019 23:20:10

Hallo liebe Leute,

meinen Musikspieler habe ich ja bereits vorgestellt. Beim Schreiben des mpd-Clients, der nach Betätigen der Taster und Drehimpulsgeber Befehle ausführen, ein paar Status-LEDs und das Display ansprechen soll, habe ich allerdings gelegentlich das Gefühl seltsame Irrwege zu gehen.

Eine der Übersicht wegen extrem abgespeckte Version des Programms, die lediglich auf den Play/Pause-Taster reagiert, sieht so aus

Code: Alles auswählen

import threading
import time
import mpd
import Queue
import wiringpi2

#1 und 2 fuer Pull-up und -down sind beim Cubietruck vertauscht
PULLUP=1

wiringpi2.wiringPiSetup()

class Switch(threading.Thread):
	def __init__(self, pin, pin_pud, callback):
		threading.Thread.__init__(self)
		self.daemon = True
		self.pin = pin
		self.pin_pud = pin_pud
		self.callback = callback
		wiringpi2.pinMode(self.pin, 0)
		wiringpi2.pullUpDnControl(self.pin, self.pin_pud)

	def run(self):
		last_state = wiringpi2.digitalRead(self.pin)
		while True:
			state = wiringpi2.digitalRead(self.pin)
			if state != last_state:	
				self.callback(state - last_state)
			last_state = state
			time.sleep(0.08)

class LED:
        def __init__(self, pin):
                self.pin = pin
                self.state = 0
                wiringpi2.pinMode(self.pin, 1)
                wiringpi2.digitalWrite(self.pin, 0)

        def setState(self, state):
                wiringpi2.digitalWrite(self.pin, state)
                self.state = state


localmpd = mpd.MPDClient()
localmpd.connect("localhost",6600)

def pressed_play(event):
	if event == 1:
		commands.put("play")

commands=Queue.Queue()

led_play = LED(22)
switch_play = Switch(17, PULLUP, pressed_play)
switch_play.start()

while True:
	try:
		command=commands.get(1, 1)
	except:
		command="no command"

	if command == "play":
		localmpd.pause()
        if localmpd.status()['state'] == 'play':
                led_play.setState(1)
        else:
                led_play.setState(0)

	command = "no command"
Es sind alle möglichen Tipps und Hinweise willkommen. Zur Struktur des Programms, sinnvolleren Namen von Variablen, Funktionen, Klassen.... und so weiter.

Was mir zum Beispiel nicht gefällt, ist die Tatsache, dass ich in der Hauptschleife einen Timeout von einer Sekunde beim Warten auf Befehle von den Tastern habe (commands.get(1, 1)) und das nur damit die Schleife mindestens sekündlich durchläuft und beispielsweise der Zustand der play-LED auch dann richtig gesetzt wird, wenn die Befehle nicht von den Tastern am Gerät sondern von mpd-Clients aus dem Netzwerk kommen. Ich habe aber keine Ahnung wie man so etwas richtig/besser machen kann...

Antworten