Betriebsart: Hand

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