# # dimp.py # receive and plot dual/differential impulse response # (c) Neil Gershenfeld CBA MIT # 5/27/04 # from Tkinter import * import serial WINDOW = 600 NSAMPLES = 254 MAX = 1040 DT = 3.5 eps = 0.1 slope = 0 oldslope = 0 int = 0 oldint = 0 asymp = 0 oldasymp = 0 saveflag = 0 def idle(parent,canvas): global index, channel, path1, path2, imp1, imp2, saveflag # # idle routine # lo1 = ord(ser.read()) hi1 = ord(ser.read()) lo2 = ord(ser.read()) hi2 = ord(ser.read()) if ((lo1 == 1) & (hi1 == 2) & (lo2 == 3) & (hi2 == 4)): # if ((lo2 == 4) & (hi2 == 4)): canvas.delete("path2") canvas.create_line(path2,tag="path2",fill="#00b000") canvas.itemconfigure("v10",text="v2[0]: %d"%imp2[0]) canvas.itemconfigure("v1-",text="v2[1]-v2[0]: %d"%(imp2[1]-imp2[0])) canvas.itemconfigure("v1n",text="v2[N]: %d"%imp2[-1]) canvas.delete("diff") diff = [] for i in range(len(imp2)): diff.append(i*WINDOW/float(NSAMPLES)) diff.append(WINDOW/2-(imp1[i]-imp2[i])*WINDOW/float(1.5*MAX)) canvas.create_line(diff,tag="diff",fill="#b00000") canvas.itemconfigure("d0",text="d[0]: %d"%(imp1[0]-imp2[0])) canvas.itemconfigure("d-",text="d[1]-d[0]: %d"%((imp1[1]-imp1[0])-(imp2[1]-imp2[0]))) canvas.itemconfigure("dn",text="d[N]: %d"%(imp1[-1]-imp2[-1])) if (saveflag == 1): file = open("out","w") for i in range(len(imp2)): file.write("%d %d\n"%(imp1[i],imp2[i])) file.close() print 'saved to "out"' saveflag = 0 index = 0 path1 = [] imp1 = [] channel = 1 if ((lo1 == 5) & (hi1 == 6) & (lo2 == 7) & (hi2 == 8)): # if ((lo2 == 8) & (hi2 == 8)): canvas.delete("path1") canvas.create_line(path1,tag="path1",fill="#0000b0") canvas.itemconfigure("v20",text="v1[0]: %d"%imp1[0]) canvas.itemconfigure("v2-",text="v1[1]-v1[0]: %d"%(imp1[1]-imp1[0])) canvas.itemconfigure("v2n",text="v1[N]: %d"%imp1[-1]) index = 0 path2 = [] imp2 = [] channel = 2 else: value1 = 256*hi1 + lo1 value2 = 256*hi2 + lo2 if (channel == 1): index += 1 imp1.insert(0,value1) path1.insert(0,WINDOW-value1*WINDOW/float(MAX)) path1.insert(0,WINDOW-index*WINDOW/float(NSAMPLES)) index += 1 imp1.insert(0,value2) path1.insert(0,WINDOW-value2*WINDOW/float(MAX)) path1.insert(0,WINDOW-index*WINDOW/float(NSAMPLES)) else: index += 1 imp2.insert(0,value1) path2.insert(0,WINDOW-value1*WINDOW/float(MAX)) path2.insert(0,WINDOW-index*WINDOW/float(NSAMPLES)) index += 1 imp2.insert(0,value2) path2.insert(0,WINDOW-value2*WINDOW/float(MAX)) path2.insert(0,WINDOW-index*WINDOW/float(NSAMPLES)) parent.after_idle(idle,parent,canvas) def save(parent): global saveflag saveflag = 1 # # open serial port # ser = serial.Serial('/dev/ttyS0',9600) ser.setDTR() # # find framing # print "finding framing ..." byte2 = 0 byte3 = 0 byte4 = 0 while 1: byte1 = byte2 byte2 = byte3 byte3 = byte4 byte4 = ord(ser.read()) if ((byte1 == 1) & (byte2 == 2) & (byte3 == 3) & (byte4 == 4)): # if ((byte3 == 4) & (byte4 == 4)): index = 0 path1 = [] path2 = [] imp1 = [] imp2 = [] channel = 1 break # # start plotting # root = Tk() root.title('imp.py') root.bind('q','exit') root.bind('s',save) canvas = Canvas(root, width=WINDOW, height=WINDOW, background='white') canvas.create_text(.1*WINDOW,WINDOW-.02*WINDOW,text="",font=("Helvetica", 20),tags="v20",fill="#0000b0") canvas.create_text(.1*WINDOW,WINDOW-.06*WINDOW,text="",font=("Helvetica", 20),tags="d0",fill="#b00000") canvas.create_text(.1*WINDOW,WINDOW-.1*WINDOW,text="",font=("Helvetica", 20),tags="v10",fill="#00b000") canvas.create_text(.32*WINDOW,WINDOW-.02*WINDOW,text="",font=("Helvetica", 20),tags="v2-",fill="#0000b0") canvas.create_text(.32*WINDOW,WINDOW-.06*WINDOW,text="",font=("Helvetica", 20),tags="d-",fill="#b00000") canvas.create_text(.32*WINDOW,WINDOW-.1*WINDOW,text="",font=("Helvetica", 20),tags="v1-",fill="#00b000") canvas.create_text(.55*WINDOW,WINDOW-.02*WINDOW,text="",font=("Helvetica", 20),tags="v2n",fill="#0000b0") canvas.create_text(.55*WINDOW,WINDOW-.06*WINDOW,text="",font=("Helvetica", 20),tags="dn",fill="#b00000") canvas.create_text(.55*WINDOW,WINDOW-.1*WINDOW,text="",font=("Helvetica", 20),tags="v1n",fill="#00b000") canvas.pack() root.after(100,idle,root,canvas) root.mainloop()