import time import platform def zeit(): if platform.system() == 'Windows': return time.clock() else: return time.time() import serial import threading class Model(object): def __init__(self): self.s = serial.Serial('/dev/ttyS0') self.s.setRTS(False) self.stopflag = threading.Event() self.pegelfolge = '' self.pegelzeit = 0.01 self.sendThread = None def send(self,pegelfolge,pegelzeit,setLeitung,getLeitung,stopflag,OnCollision): """ sendet die Pegel aus der pegelfolge (str) mit der pegelzeit (float), benutzt dazu die Funktion setLeitung, die ein boolsches Argument hat, das Senden kann ueber stopflag (threading-event) abgebrochen werden, die Funktion getLeitung gibt einen boolschen Wert zurueck, bei einer Kollision wird der Callback OnCollision aufgerufen """ t0 = zeit() n = len(pegelfolge) i = 0 while (not stopflag.isSet()) and (len(pegelfolge) > 0) : pegel = (pegelfolge[0] == '1') # print(pegel) # DEBUG setLeitung(pegel) pegelfolge = pegelfolge[1:] i = i + 1 # Warten und Kollisionserkennung collisionsflag = False while zeit() - t0 < i*pegelzeit: if (pegel == False) and (not collisionsflag) and (getLeitung() == True): collisionsflag = True if OnCollision != None: OnCollision() if (pegel == True) or collisionsflag: time.sleep(0.0001) if stopflag.isSet(): print('Senden abgebrochen ...') # DEBUG setLeitung(False) def stop(self): self.stopflag.set() def OnColl(self): print('Kollision') # DEBUG def start(self): self.stopflag.clear() self.sendThread = threading.Thread(target=self.send, args=(self.pegelfolge,self.pegelzeit,self.s.setRTS, self.s.getCTS,self.stopflag,self.OnColl)) self.sendThread.start() def __del__(self): # schliesst sicher die Schnittstelle self.s.close() def Manchestercodiert(bitfolge): """ gibt zu bitfolge (str) die Manchester-codierte Pegelfolge (str) zurueck '101011' --> '011001100101' """ t = ['10','01'] return ''.join([t[int(x)] for x in bitfolge])