Events mit dem mainloop()

Hier testen wir den mainloop().

Wir registrieren ein Event auf den „Input“. Durch die unten stehende piCtory Konfiguration sind hier ALLE Inputs als bytes() Wert zusammengefasst. Wenn sich einer der Inputs ändert, wird die Funktion „eventfunktion“ aufgerufen. In dieser Funktion werden alle Eingänge auf die Ausgänge gespiegelt und die Zeit in der Konsole ausgegeben.

Quelltext für RevPiModIO Version 2
#!/usr/bin/python3
import revpimodio2
import time


class RevPiModIOTest():

    """Kleine Testklasse fuer mainloop().

    Wenn nach der Instanziierung der Klasse die start() Funktion aufgerufen
    wird, gehen wir in den mainloop(). Das Programm wartet dann auf Events.
    Per Strg+C wird der mainloop() sauber verlassen.

    """

    def __init__(self):
        """Wird bei der Instanziierung aufgerufen."""

        # RevPiModIO Instantieren und Module in den auto_refresh setzen, damit
        # das Prozessabbild automatisch synchronisiert wird.
        self.revpi = revpimodio2.RevPiModIO(autorefresh=True)

        # Signale für das Programmende von RevPiModIO verwalten lassen.
        # Aufräumfunktion übergeben, welche bei Programmende
        # (Strg+C / SIGTERM) ausgeführt wird.
        self.revpi.handlesignalend(self.exitfunktion)

        # Auf einen Input eine Funktion anmelden, welche ausgeführt wird,
        # wenn sich der Inputwert ändert.
        self.revpi.io.Input.reg_event(self.eventfunktion)

    def eventfunktion(self, ioname, iovalue):
        """Wird nur ausgefuehrt, wenn ein Input Pin den Status aendert.
        @param ioname: Wird automatisch uebergeben und enthaelt den IO-Namen
        @param iovlaue: Wert, den der IO zum ausloesezeitpunkt hat"""
        # Eingänge werden auf Ausgänge gespiegelt und eine Bildschirmausgabe
        # erfolg. Natürlich nur, wenn das event ausgelöst wird!
        self.revpi.io.Output.value = iovalue
        print(time.time(), ioname, iovalue)

    def exitfunktion(self):
        """Diese Funktion erledigt Aufraumarbeiten vor Programmende."""
        # LED A1 am Core Abschalten
        self.revpi.core.A1 = revpimodio2.OFF

    def start(self):
        """Hier laeuft das eigentliche Programm in der Endlosschleife."""

        # LED A1 am Core grün setzen
        self.revpi.core.A1 = 1

        # In den mainloop gehen und auf Events warten
        print("Gehe in den mainloop()")
        self.revpi.mainloop()


if __name__ == "__main__":
    root = RevPiModIOTest()
    root.start()
Quelltext für RevPiModIO Version 1
#!/usr/bin/python3
import revpimodio
import signal
import time


class RevPiModIOTest():

    """Kleine Testklasse fuer mainloop().

    Wenn nach der Instanziierung der Klasse die start() Funktion aufgerufen
    wird, gehen wir in den mainloop(). Das Programm wartet dann auf Events.
    Per Strg+C wird der mainloop() sauber verlassen.

    """

    def __init__(self):
        """Wird bei der Instanziierung aufgerufen."""

        # RevPiModIO Instantieren und Module in den auto_refresh setzen, damit
        # das Prozessabbild automatisch synchronisiert wird.
        self.revpi = revpimodio.RevPiModIO(auto_refresh=True)

        # Auf einen Input eine Funktion anmelden, welche ausgeführt wird,
        # wenn sich der Inputwert ändert.
        self.revpi.devices[32].reg_event("Input", self.eventfunktion)

        # Signal events
        signal.signal(signal.SIGINT, self._sigexit)
        signal.signal(signal.SIGTERM, self._sigexit)

    def _sigexit(self, signum, frame):
        """Signal handler to exit."""

        # mainloop verlassen und Kontrolle zurückgeben
        self.revpi.devices.exit()

    def eventfunktion(self, ioname, iovalue):
        """Wird nur ausgefuehrt, wenn ein Input Pin den Status aendert.
        @param ioname: Wird automatisch uebergeben und enthaelt den IO-Namen
        @param iovlaue: Wert, den der IO zum ausloesezeitpunkt hat"""
        # Eingänge werden auf Ausgänge gespiegelt und eine Bildschirmausgabe
        # erfolg. Natürlich nur, wenn das event ausgelöst wird!
        self.revpi.devices[32]["Output"].value = iovalue
        print(time.time(), ioname, iovalue)

    def start(self):
        """Hier laeuft das eigentliche Programm in der Endlosschleife."""

        # LED A1 am Core grün setzen
        self.revpi.devices.core.A1 = 1

        # In den mainloop gehen und auf Events warten
        print("Gehe in den mainloop()")
        self.revpi.devices.mainloop()

        # LED A1 beim Verlassen des mainloop() ausschalten
        self.revpi.devices.core.A1 = 0
        self.revpi.devices.writeprocimg()


if __name__ == "__main__":
    root = RevPiModIOTest()
    root.start()

 

Die passende piCtory-Konfiguration sieht so aus. Achtet darauf, dass beim DIO die Inputs auf 19 und die Outputs auf 17 gestellt sind! Das brauchen wir, damit wir mit einer Zeile Code ALLE Eingänge auf die Ausgänge spiegeln können.