View difference between Paste ID: w3ZR34gr and VeKwvQDR
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)