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.