Advertisement
vins31

Untitled

Feb 28th, 2013
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/python2
  2. # -*- coding: utf-8 -*-
  3.  
  4. import Tkinter, random, time
  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)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement