Der Thread für den Handbetrieb ist relativ simpel durch die Event-Steuerung von RevPiModIO.
Der Thread wird durch die Evenfunktion def evt_start(self): aus unserem vorherigen Beitrag gestartet.
In dem Thread werden alle Taster für den Handbetrieb als Events registriert und an Funktionen gebunden, die die dazugehörige Aktion ausführen. Die Schleife, die der Thread bei def run(self): ausführt lässt lediglich die „h_automatik“ Lampe blinken. Wenn der Thread durch Aufruf von .stop() beendet wird, werden die Eventfunktionen wieder entfernt und die Taster haben keine Funktion mehr.
class Hand(Thread):
"""Thread fuer den Handbetrieb."""
def __init__(self, rpi):
"""Instanziiert Thread."""
super().__init__()
self.evt_ende = Event()
self.daemon = True
self.rpi = rpi
self.m1 = False
self.m2 = False
self.m3 = False
def run(self):
"""Wird ausgefuehrt wenn der Thread gestartet wird.
Hier werden fuer alle Taster des Handbetriebs die noetigen Events
registriert. Die einzige Aufgabe, die diese Funktion sonst noch
ausfuehrt, ist das Blinken der Lampe h_automatik. Alles weitere wird
durch Events gesteuert.
"""
# Lampe h_start Einschalten
self.rpi.devices["do02"]["h_start"] = True
self.rpi.devices["di01"].reg_event("t_m1", self.evt_zylinder, edge=revpimodio.RISING)
self.rpi.devices["di01"].reg_event("t_m2", self.evt_zylinder, edge=revpimodio.RISING)
self.rpi.devices["di01"].reg_event("t_m3", self.evt_zylinder, edge=revpimodio.RISING)
self.rpi.devices["di01"].reg_event("t_lahm_rechts", self.evt_bandlauf)
self.rpi.devices["di01"].reg_event("t_lahm_links", self.evt_bandlauf)
self.rpi.devices["di01"].reg_event("t_schnell_rechts", self.evt_bandlauf)
# Warten bis Ende
while not self.evt_ende.is_set():
self.rpi.devices["do02"]["h_automatik"] = funccatalog.myflash.status1
funccatalog.myflash.wait()
self.rpi.devices["do02"]["h_automatik"] = False
# Lampe h_start Ausschalten
self.rpi.devices["do02"]["h_start"] = False
def evt_bandlauf(self, ioname, iovalue):
"""Eventfunktion fuer das Ein-/Auschalten des Bandmotors."""
aktion = False
if ioname == "t_lahm_links" and iovalue:
aktion = funccatalog.band.set_lahm_links(True)
elif ioname == "t_lahm_rechts" and iovalue:
aktion = funccatalog.band.set_lahm_rechts(True)
elif ioname == "t_schnell_rechts" and iovalue:
aktion = funccatalog.band.set_schnell_rechts(True)
funccatalog.anlage.stoerung = False
if not aktion:
funccatalog.band.set_lahm_links(False)
funccatalog.band.set_lahm_rechts(False)
funccatalog.band.set_schnell_rechts(False)
def evt_zylinder(self, ioname, iovalue):
"""Eventfunktion fuer Ein-/Ausfahren von Zylinder."""
if ioname == "t_m1":
self.m1 = not self.m1
funccatalog.zylinder.set_m1(not self.m1)
elif ioname == "t_m2":
self.m2 = not self.m2
funccatalog.zylinder.set_m2(self.m2)
funccatalog.anlage.stoerung = False
elif ioname == "t_m3":
self.m3 = not self.m3
funccatalog.zylinder.set_m3(self.m3)
funccatalog.anlage.stoerung = False
def stop(self):
"""Beendet den Thread und entfernt alle registrierten Events.
Durch das Entfernen der Events sind die Taster fuer den Handbetrieb
ohne Funktion.
"""
self.evt_ende.set()
self.rpi.devices["di01"].unreg_event("t_m1")
self.rpi.devices["di01"].unreg_event("t_m2")
self.rpi.devices["di01"].unreg_event("t_m3")
self.rpi.devices["di01"].unreg_event("t_lahm_rechts")
self.rpi.devices["di01"].unreg_event("t_lahm_links")
self.rpi.devices["di01"].unreg_event("t_schnell_rechts")
