# model import serial def scan(): """ gibt eine Liste von Strings der Namen der verfügbaren Ports zurück """ L = [] for i in range(10): try: s = serial.Serial('/dev/ttyS'+str(i)) L.append(s.portstr) s.close() except serial.SerialException: pass for i in range(10): try: s = serial.Serial('/dev/ttyUSB'+str(i)) L.append(s.portstr) s.close() except serial.SerialException: pass for i in range(10): try: s = serial.Serial('COM'+str(i)) L.append(s.portstr) s.close() except serial.SerialException: pass return L import threading,time class Timer(threading.Thread): def __init__(self,interval,routine): threading.Thread.__init__(self) self.interval = interval self.routine = routine def run(self): time.sleep(self.interval) self.routine() class Model(object): def __init__(self): self.s = serial.Serial(scan()[0]) self.s.setRTS(False) def sendBits(self,bitmuster,bitzeit): pass def __del__(self): # schließt sicher die Schnittstelle self.s.close() # view import tkinter import time def zeit(): # todo: angepasst an Betriebssystem return time.time() zeiten = [] # DEBUG für Pollzeiten class View(tkinter.Tk): def __init__(self,cbEin,cbAus,cbCTS,cbSetPort,cbHalt,cbSend): tkinter.Tk.__init__(self) # Callbacks self.cbEin = cbEin self.cbAus = cbAus self.cbCTS = cbCTS self.cbSend = cbSend self.cbSetPort = cbSetPort self.protocol("WM_DELETE_WINDOW",cbHalt) # cbHalt wird aufgerufen, wenn das 'X' gedrückt wird # Timersteuerung self.interval = 1 # 'Elektronenstrahl' self.enabled = True self.y = 30 # Position der Linie für '0' self.y1 = 20 # 'Höhe einer 1' in Pixel self.x = 0 # aktuelles x self.xa = 0 # altes x self.t0 = zeit() # Zeit am Anfang einer Zeile self.t = zeit() - self.t0 # Zeit seit Anfang einer Zeile self.ta = zeit() self.cts = self.cbCTS() self.pxs = 100 self.t1 = zeit() # versuchsweise zur Pollingtime # Fenster self.title("Bit-Transceiver") self.geometry('640x480') # Label self.lP = tkinter.Label(master=self, text='Port:') self.lP.place(x=20, y=20) self.lS = tkinter.Label(master=self, text='px/s:') self.lS.place(x=200, y=20) self.lCTS = tkinter.Label(master=self, text='CTS:') self.lCTS.place(x=507, y=20) self.lBits = tkinter.Label(master=self, text='Bits:') self.lBits.place(x=20, y=55) self.lBitzeit = tkinter.Label(master=self, text='Bitzeit:') self.lBitzeit.place(x=320, y=55) self.ls = tkinter.Label(master=self, text='s') self.ls.place(x=410, y=55) # Optionmenu self.vS = tkinter.StringVar(master=self) self.vS.set(scan()[0]) self.oS = tkinter.OptionMenu(self,self.vS,*scan(), command=self.cbOption) self.oS.place(x=60,y=14, width=120) # Entry self.eA = tkinter.Entry(master=self) self.eA.insert(0, str(self.pxs)) self.eA.place(x=240, y=20, width=50) self.eBits = tkinter.Entry(master=self) self.eBits.insert(0, str('100100110100001')) self.eBits.place(x=60, y=55, width=230) self.eBitzeit = tkinter.Entry(master=self) self.eBitzeit.insert(0, str('0.1')) self.eBitzeit.place(x=370, y=55, width=40) # Buttons self.bStart = tkinter.Button(master=self, text="Start", command=self.start) self.bStart.place(x=300,y=14) self.bStop = tkinter.Button(master=self, text="Stop", command=self.stop) self.bStop.place(x=370,y=14) self.bClear = tkinter.Button(master=self, text="Clear", command=self.clear) self.bClear.place(x=440,y=14) self.bSend = tkinter.Button(master=self, text="Send", command=self.send) self.bSend.place(x=440,y=50) self.bRTS = tkinter.Button(master=self, text="RTS") self.bRTS.bind('',self.cbEin) self.bRTS.bind('',self.cbAus) self.bRTS.place(x=570,y=14) # Canvases self.cLed = tkinter.Canvas(master=self,width=22,height=22) self.cLed.place(x=542,y=18) self.c = tkinter.Canvas(master=self,width=640,height=450) self.c.place(x=0,y=80) # Items item = self.cLed.create_oval(1,1,20,20,fill='#550000') self.cLed.itemconfig(item,tags=('LED')) # Timer starten self.after(0,self.poll) def poll(self): # Anfang DEBUG für Pollzeiten t = zeit() tp = t-self.t1 self.t1 = t zeiten.append(tp) # Ende DEBUG für Pollzeiten if self.enabled: self.t = zeit() - self.t0 self.x = self.t*self.pxs if self.x > 640: # todo: width abfragen self.t = 0 self.t0 = zeit() self.x = 0 self.xa = 0 self.y = self.y + self.y1 + 10 # Bearbeiten von Led und Canvas aktCTS = self.cbCTS() if aktCTS and not self.cts: # Zustand 0 --> 1 self.cLed.itemconfig('LED',fill='#ff0000') if self.enabled: self.c.create_line(self.xa,self.y+1,self.xa,self.y - self.y1) # +1 ?? self.y = self.y - self.y1 self.cts = True elif not aktCTS and self.cts: # Zustand 1 --> 0 self.cLed.itemconfig('LED',fill='#550000') if self.enabled: self.c.create_line(self.xa,self.y,self.xa,self.y + self.y1) self.y = self.y + self.y1 self.cts = False else: # Zustand unverändert if (self.x - self.xa > 0.5) and self.enabled: self.c.create_line(self.xa,self.y,self.x,self.y) self.xa = self.x # Bearbeiten der Eingabe zu px/s eingabe = self.eA.get() try: zahl = int(eingabe) # print(zahl) # DEBUG if zahl > 0: self.pxs = zahl self.t0 = zeit() - self.x/self.pxs self.t = self.x/self.pxs else: self.eA.delete(0,tkinter.END) self.eA.insert(0,'0') except: self.eA.delete(0,tkinter.END) self.eA.insert(0,'0') # rekursiver Aufruf self.after(self.interval,self.poll) def start(self): self.enabled = True self.t0 = zeit() - self.x/self.pxs self.t = self.x/self.pxs def stop(self): self.enabled = False def send(self): print('send') def clear(self): self.c = tkinter.Canvas(master=self,width=640,height=450) self.c.place(x=0,y=80) self.y = 30 # Position der Linie für '0' self.x = 0 # aktuelles x self.xa = 0 # altes x self.t0 = zeit() # Zeit am Anfang einer Zeile self.t = zeit() - self.t0 # Zeit seit Anfang einer Zeile self.ta = zeit() self.cts = self.cbCTS() def cbOption(self, wert): # print(wert) # DEBUG self.cbSetPort(wert) # controller class Controller(object): def __init__(self): self.model = Model() self.view = View(self.schalteEin,self.schalteAus,self.model.s.getCTS, self.model.s.setPort,self.Halt,None) self.view.mainloop() def schalteEin(self,event): self.model.s.setRTS(True) def schalteAus(self,event): self.model.s.setRTS(False) def setPort(self,port): self.model.s.setPort(port) def Halt(self): # Aufräumarbeiten self.model.s.close() # Schnittstelle schließen self.view.quit() # mainloop beenden self.view.destroy() # Fenster beseitigen # Hauptprogramm c = Controller()