Advertisement
vins31

Python graphique temps réel

Feb 28th, 2013
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.58 KB | None | 0 0
  1. #!/usr/bin/python2
  2. # -*- coding: utf-8 -*-
  3.  
  4. import Tkinter, random, time
  5. import socket, sys, serial
  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.     # Configuration du port série
  35.     port = '/dev/pts/13' # sous Windows : COM13
  36.     baudrate = 9600
  37.     # Format binaire des données
  38.     # définit par http://docs.python.org/2/library/struct.html#format-characters
  39.     format = "Ihh"
  40.     # taille en octets du format,
  41.     #    exemple, si format = "hh" (2 shorts, 2 octets chacun), alors taille_format = 4
  42.     taille_format = 8
  43.  
  44.  
  45. ############################    FIN PARAMÈTRES     #############################
  46.  
  47. def convert(val):
  48.     return canvas_height - canvas_height*float(val-val_min)/(val_max-val_min)
  49.    
  50. def convert2(val):
  51.     return (canvas_height - val)/512.0*(val_max-val_min) + val_min
  52.    
  53.  
  54.  
  55. class App:
  56.  
  57.     def white(self):
  58.         self.lines=[]
  59.         self.lastpos=[]
  60.  
  61.         self.c.create_rectangle(0, 0, canvas_width, canvas_height, fill="black")
  62.        
  63.         self.gradations()
  64.        
  65.     def gradations(self):
  66.         # Vertical gradations
  67.         for y in range(0,canvas_height,32):
  68.                 self.c.create_line(0, y, canvas_width, y, fill="#333333",dash=(4, 4))
  69.                 self.c.create_text(5, y-10, fill="#999999", text=str(convert2(y)), anchor="w")
  70.         # Horizontal gradations
  71.         for x in range(100,canvas_width,100):
  72.                 self.c.create_line(x, 0, x, canvas_height, fill="#333333",dash=(4, 4))
  73.                 self.c.create_text(x+3, canvas_height-22, fill="#999999", text=str(x), anchor="w")
  74.  
  75.         self.lineRedraw=self.c.create_line(0, canvas_width, 0, 0, fill="red")
  76.  
  77.         self.lines1text=self.c.create_text(canvas_width-150, 10, fill="#00FF00", text=str("TEST"), anchor="e")
  78.  
  79.     def addPoint(self,vals):
  80.         for i in range(len(vals)):
  81.             val = vals[i]  
  82.             if len(self.data) <= i:
  83.                 self.data.append([0]*canvas_width)
  84.                 self.lastpos.append(0)
  85.                 self.lines.append([])
  86.                 for x in range(canvas_width):
  87.                     self.lines[i].append(self.c.create_line(x, 0, x, 0, fill=colors[i%len(colors)]))
  88.                
  89.             self.data[i][self.xpos] = val
  90.             # Display the average value
  91.             #~ self.line1avg+=val
  92.             #~ if self.xpos%10==0:
  93.                     #~ self.c.itemconfig(self.lines1text,text="Average: "+str(self.line1avg/10.0))
  94.                     #~ self.line1avg=0
  95.             if self.xpos>0:
  96.                 self.c.coords(self.lines[i][self.xpos],(self.xpos-1,self.lastpos[i],self.xpos,convert(val)))
  97.             if self.xpos<canvas_width:
  98.                 self.c.coords(self.lineRedraw,(self.xpos+1,0,self.xpos+1,canvas_width))
  99.             self.lastpos[i]=convert(val)
  100.         self.xpos+=1
  101.         if self.xpos==canvas_width:
  102.                 self.xpos=0
  103.                 self.totalPoints+=canvas_width
  104.                 print "FPS:",self.totalPoints/(time.time()-self.timeStart)
  105.         t.update()
  106.  
  107.     def __init__(self, t):
  108.         self.xpos=0
  109.         self.line1avg=0
  110.         self.data = []
  111.         self.c = Tkinter.Canvas(t, width=canvas_width, height=canvas_height)
  112.         self.c.pack()
  113.         self.totalPoints=0
  114.         self.white()
  115.         self.timeStart=time.time()
  116.                
  117.  
  118.  
  119.  
  120. class ValuesReaderSerial:
  121.     def __init__(self):
  122.         self.ser = serial.Serial(
  123.             port=port,
  124.             baudrate=baudrate,
  125.             parity=serial.PARITY_ODD,
  126.             stopbits=serial.STOPBITS_TWO,
  127.             bytesize=serial.SEVENBITS
  128.         )
  129.         if not self.ser.isOpen():
  130.             self.ser.open()
  131.         print "Serial port open"
  132.            
  133.     def get(self):
  134.         if self.ser.inWaiting() > 0:
  135.             buff = self.ser.read(taille_format);
  136.             values = unpack(format, buff)
  137.             print(values)
  138.             return values
  139.         else:
  140.              return None
  141.  
  142.  
  143. class ValuesReaderRandom:
  144.     def __init__(self):
  145.         self.val1 = 20
  146.         self.val2 = 30
  147.         self.val3 = 40
  148.     def get(self):
  149.         self.val1 += random.randint(-1,1)
  150.         self.val2 += random.randint(-3,3)
  151.         self.val3 += random.randint(-2,2)
  152.         return (self.val1, self.val2, self.val3)
  153.    
  154.    
  155. class ValuesReaderStdIn:
  156.     def get(self):
  157.         line = sys.stdin.readline()
  158.         vals = map(float, line.split())
  159.         return vals
  160.  
  161.  
  162.  
  163.  
  164.  
  165. if entree == "random":
  166.     values = ValuesReaderRandom()
  167. elif entree == "stdin":
  168.     values = ValuesReaderStdIn()
  169. elif entree == "serial":
  170.     values = ValuesReaderSerial()
  171. else:
  172.     RuntimeError("entree invalide")
  173.  
  174.  
  175. t = Tkinter.Tk()
  176. a = App(t)
  177.  
  178. # Boucle principale
  179. while True:
  180.     points = values.get()
  181.     if points != None:
  182.         print points
  183.         a.addPoint(points)
  184.     else:
  185.         t.update()
  186.     time.sleep(refresh)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement