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"
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...