SHOW:
|
|
- or go back to the newest paste.
| 1 | #!/usr/bin/python2 | |
| 2 | # -*- coding: utf-8 -*- | |
| 3 | ||
| 4 | import Tkinter, random, time | |
| 5 | - | import socket, sys, serial |
| 5 | + | import socket, sys |
| 6 | import random, time, threading | |
| 7 | from struct import unpack | |
| 8 | ||
| 9 | ||
| 10 | ######################### PARAMÈTRES ##################################### | |
| 11 | ||
| 12 | # Dimmensions du graphique en pixel | |
| 13 | canvas_height = 600 | |
| 14 | canvas_width = 800 | |
| 15 | ||
| 16 | # Valeurs min et max de l'axe des ordonnées | |
| 17 | val_min = -200 | |
| 18 | val_max = 200 | |
| 19 | ||
| 20 | # Temps de raffraichissement de l'écran en secondes | |
| 21 | refresh = 0.01 | |
| 22 | ||
| 23 | # Couleurs des graphes | |
| 24 | colors = ["#00FF00", "#FF0000", "#0000FF", "#FFFF00", "#00FFFF", "#FF00FF"] | |
| 25 | ||
| 26 | # Entrées, valeurs acceptées : | |
| 27 | # -> stdin : récupération des valeurs via l'entrée standard | |
| 28 | # utilisation ./script_qui_affiche_mes_données_ligne_par_ligne | ./real_time_plot.py | |
| 29 | # -> random : valeurs aléatoires, pour les tests | |
| 30 | # -> serial : port série | |
| 31 | entree = "random" | |
| 32 | ||
| 33 | if entree == "serial": | |
| 34 | import serial | |
| 35 | # Configuration du port série | |
| 36 | port = '/dev/pts/13' # sous Windows : COM13 | |
| 37 | baudrate = 9600 | |
| 38 | # Format binaire des données | |
| 39 | # définit par http://docs.python.org/2/library/struct.html#format-characters | |
| 40 | format = "Ihh" | |
| 41 | # taille en octets du format, | |
| 42 | # exemple, si format = "hh" (2 shorts, 2 octets chacun), alors taille_format = 4 | |
| 43 | taille_format = 8 | |
| 44 | ||
| 45 | ||
| 46 | ############################ FIN PARAMÈTRES ############################# | |
| 47 | ||
| 48 | def convert(val): | |
| 49 | return canvas_height - canvas_height*float(val-val_min)/(val_max-val_min) | |
| 50 | ||
| 51 | def convert2(val): | |
| 52 | return (canvas_height - val)/512.0*(val_max-val_min) + val_min | |
| 53 | ||
| 54 | ||
| 55 | ||
| 56 | class App: | |
| 57 | ||
| 58 | def white(self): | |
| 59 | self.lines=[] | |
| 60 | self.lastpos=[] | |
| 61 | ||
| 62 | self.c.create_rectangle(0, 0, canvas_width, canvas_height, fill="black") | |
| 63 | ||
| 64 | self.gradations() | |
| 65 | ||
| 66 | def gradations(self): | |
| 67 | # Vertical gradations | |
| 68 | for y in range(0,canvas_height,32): | |
| 69 | self.c.create_line(0, y, canvas_width, y, fill="#333333",dash=(4, 4)) | |
| 70 | self.c.create_text(5, y-10, fill="#999999", text=str(convert2(y)), anchor="w") | |
| 71 | # Horizontal gradations | |
| 72 | for x in range(100,canvas_width,100): | |
| 73 | self.c.create_line(x, 0, x, canvas_height, fill="#333333",dash=(4, 4)) | |
| 74 | self.c.create_text(x+3, canvas_height-22, fill="#999999", text=str(x), anchor="w") | |
| 75 | ||
| 76 | self.lineRedraw=self.c.create_line(0, canvas_width, 0, 0, fill="red") | |
| 77 | ||
| 78 | self.lines1text=self.c.create_text(canvas_width-150, 10, fill="#00FF00", text=str("TEST"), anchor="e")
| |
| 79 | ||
| 80 | def addPoint(self,vals): | |
| 81 | for i in range(len(vals)): | |
| 82 | val = vals[i] | |
| 83 | if len(self.data) <= i: | |
| 84 | self.data.append([0]*canvas_width) | |
| 85 | self.lastpos.append(0) | |
| 86 | self.lines.append([]) | |
| 87 | for x in range(canvas_width): | |
| 88 | self.lines[i].append(self.c.create_line(x, 0, x, 0, fill=colors[i%len(colors)])) | |
| 89 | ||
| 90 | self.data[i][self.xpos] = val | |
| 91 | # Display the average value | |
| 92 | #~ self.line1avg+=val | |
| 93 | #~ if self.xpos%10==0: | |
| 94 | #~ self.c.itemconfig(self.lines1text,text="Average: "+str(self.line1avg/10.0)) | |
| 95 | #~ self.line1avg=0 | |
| 96 | if self.xpos>0: | |
| 97 | self.c.coords(self.lines[i][self.xpos],(self.xpos-1,self.lastpos[i],self.xpos,convert(val))) | |
| 98 | if self.xpos<canvas_width: | |
| 99 | self.c.coords(self.lineRedraw,(self.xpos+1,0,self.xpos+1,canvas_width)) | |
| 100 | self.lastpos[i]=convert(val) | |
| 101 | self.xpos+=1 | |
| 102 | if self.xpos==canvas_width: | |
| 103 | self.xpos=0 | |
| 104 | self.totalPoints+=canvas_width | |
| 105 | print "FPS:",self.totalPoints/(time.time()-self.timeStart) | |
| 106 | t.update() | |
| 107 | ||
| 108 | def __init__(self, t): | |
| 109 | self.xpos=0 | |
| 110 | self.line1avg=0 | |
| 111 | self.data = [] | |
| 112 | self.c = Tkinter.Canvas(t, width=canvas_width, height=canvas_height) | |
| 113 | self.c.pack() | |
| 114 | self.totalPoints=0 | |
| 115 | self.white() | |
| 116 | self.timeStart=time.time() | |
| 117 | ||
| 118 | ||
| 119 | ||
| 120 | ||
| 121 | class ValuesReaderSerial: | |
| 122 | def __init__(self): | |
| 123 | self.ser = serial.Serial( | |
| 124 | port=port, | |
| 125 | baudrate=baudrate, | |
| 126 | parity=serial.PARITY_ODD, | |
| 127 | stopbits=serial.STOPBITS_TWO, | |
| 128 | bytesize=serial.SEVENBITS | |
| 129 | ) | |
| 130 | if not self.ser.isOpen(): | |
| 131 | self.ser.open() | |
| 132 | print "Serial port open" | |
| 133 | ||
| 134 | def get(self): | |
| 135 | if self.ser.inWaiting() > 0: | |
| 136 | buff = self.ser.read(taille_format); | |
| 137 | values = unpack(format, buff) | |
| 138 | print(values) | |
| 139 | return values | |
| 140 | else: | |
| 141 | return None | |
| 142 | ||
| 143 | ||
| 144 | class ValuesReaderRandom: | |
| 145 | def __init__(self): | |
| 146 | self.val1 = 20 | |
| 147 | self.val2 = 30 | |
| 148 | self.val3 = 40 | |
| 149 | def get(self): | |
| 150 | self.val1 += random.randint(-1,1) | |
| 151 | self.val2 += random.randint(-3,3) | |
| 152 | self.val3 += random.randint(-2,2) | |
| 153 | return (self.val1, self.val2, self.val3) | |
| 154 | ||
| 155 | ||
| 156 | class ValuesReaderStdIn: | |
| 157 | def get(self): | |
| 158 | line = sys.stdin.readline() | |
| 159 | vals = map(float, line.split()) | |
| 160 | return vals | |
| 161 | ||
| 162 | ||
| 163 | ||
| 164 | ||
| 165 | ||
| 166 | if entree == "random": | |
| 167 | values = ValuesReaderRandom() | |
| 168 | elif entree == "stdin": | |
| 169 | values = ValuesReaderStdIn() | |
| 170 | elif entree == "serial": | |
| 171 | values = ValuesReaderSerial() | |
| 172 | else: | |
| 173 | RuntimeError("entree invalide")
| |
| 174 | ||
| 175 | ||
| 176 | t = Tkinter.Tk() | |
| 177 | a = App(t) | |
| 178 | ||
| 179 | # Boucle principale | |
| 180 | while True: | |
| 181 | points = values.get() | |
| 182 | if points != None: | |
| 183 | print points | |
| 184 | a.addPoint(points) | |
| 185 | else: | |
| 186 | t.update() | |
| 187 | time.sleep(refresh) |