HSG |
|
Realisierung eines Automaten in Python
class Automat(object): def __init__(self): self.zustaende = ('aus','Aan','Ban') # Zustände self.eingaben = ('a','b','r') # Eingaben self.ausgaben = ('Aan','Ban','ABaus') # Ausgaben self.f = (((1,0),(2,1),(0,2)), # Automatentabelle ((1,0),(1,0),(0,2)), ((2,1),(2,1),(0,2))) self.zustand = 0 # Anfangszustand self.ausgabe = None # anfangs keine Ausgabe gespeichert self.eingabe = None # anfangs keine Eingabe gespeichert def verarbeiteEingabe(self,eingabe): # Arbeitsschritt self.eingabe = eingabe (self.zustand,self.ausgabe) = self.f[self.zustand][self.eingabe]
Testen von buzzer0.py z.B. auf der Shell, indem man eine Instanz erzeugt und die Eingabe testet. Bis hierher hat die serielle Schnittstelle noch nichts zu suchen.
# Hardware import threading,time class Timer(threading.Thread): # Timer für das Polling der Taster def __init__(self,interval,routine): threading.Thread.__init__(self) self.interval = interval self.routine = routine def run(self): time.sleep(self.interval) self.routine() import serial class ComPort(serial.Serial): def __init__(self,portnr): serial.Serial.__init__(self,portnr) def __del__(self): # wenn Referenz verloren self.close() # Schnittstelle schließen class SerialInterface(object): def __init__(self,cba,cbb,cbr): # Callbacks für die Tasten a, b, r # serielle Schnittstelle self.s = ComPort(0) # Callbacks self.cba = cba self.cbb = cbb self.cbr = cbr # + 12V self.s.setBreak(1) # TxD als Spannungsversorgung für Taster # Aktoren self.s.setRTS(0) # RTS für Lampe A self.s.setDTR(0) # DTR für Lampe B # Sensoren self.a = self.s.getRI() # RI für Taste a self.aAlt = self.a self.b = self.s.getDSR() # DSR für Taste b self.bAlt = self.b self.r = self.s.getCTS() # CTS für Taste r self.rAlt = self.r # Timer self.timer = Timer(0.02,self.poll) self.timer.start() def __del__(self): self.s.close() del self.timer print('Schnittstelle geschlossen') # DEBUG def schalte(self,n): if n == 0: self.s.setRTS(1) self.s.setDTR(0) else: if n == 1: self.s.setRTS(0) self.s.setDTR(1) else: self.s.setRTS(0) self.s.setDTR(0) def poll(self): # Taster a self.aAlt = self.a self.a = self.s.getRI() if not self.aAlt and self.a: # ansteigende Flanke print('Taster a gedrückt') # DEBUG if self.cba != None: self.cba() # Callback cba aufrufen # Taster b self.bAlt = self.b self.b = self.s.getDSR() if not self.bAlt and self.b: # ansteigende Flanke print('Taster b gedrückt') # DEBUG if self.cbb != None: self.cbb() # Callback cbb aufrufen # Taster r self.rAlt = self.r self.r = self.s.getCTS() if not self.rAlt and self.r: # ansteigende Flanke print('Taster r gedrückt') # DEBUG if self.cbr != None: self.cbr() # Callback cbr aufrufen # rekursiver Aufruf self.timer = Timer(0.02,self.poll) self.timer.start()
# controller class Controller(object): def __init__(self): self.auto = Automat() self.buzzer = SerialInterface(self.cba,self.cbb,self.cbr) def cba(self): self.auto.verarbeiteEingabe(0) self.buzzer.schalte(self.auto.ausgabe) def cbb(self): self.auto.verarbeiteEingabe(1) self.buzzer.schalte(self.auto.ausgabe) def cbr(self): self.auto.verarbeiteEingabe(2) self.buzzer.schalte(self.auto.ausgabe) # Hauptprogramm c = Controller()
Vorschlag Transistorschaltstufen, bei Relais Löschdiode nicht vergessen.
Was würde sich verändern, wenn man 3 und mehr Teilnehmer hätte?