Blame view

telemetry/code/monitor/graph_plotter.py 2.68 KB
b0f61ccf   Christopher Stone   Working demo for ...
1
2
#!/usr/bin/env python

6afdc6b9   Christopher Stone   Attempt at drawin...
3
4
import pyglet
import math
caf04a11   Christopher Stone   Demo code now dra...
5
6
import random
import time
b0f61ccf   Christopher Stone   Working demo for ...
7
8
9
10
11
12
13
14
15
16
import serial

datafeed = serial.Serial(
 port='/dev/ttyUSB0',
 baudrate = 9600,
 parity=serial.PARITY_NONE,
 stopbits=serial.STOPBITS_ONE,
 bytesize=serial.EIGHTBITS,
 timeout=1
)
6afdc6b9   Christopher Stone   Attempt at drawin...
17
18
19
 
window = pyglet.window.Window()
window.set_caption("Test graph")
caf04a11   Christopher Stone   Demo code now dra...
20
21

starttime = time.time()
6afdc6b9   Christopher Stone   Attempt at drawin...
22
23
24
25
26
27
28
29
30
31
32
33
 
title = pyglet.text.Label('Test Graph',
                          font_name='Arkhip',
                          font_size=12,
                          x=window.width//2, y=window.height//2,
                          anchor_x='center', anchor_y='top')

                 
def round_sig(x, sig=2):
    return round(x, sig-int(math.floor(math.log10(abs(x))))-1)
                 
def drawgrid(xlines, ylines, xlimits, ylimits):
caf04a11   Christopher Stone   Demo code now dra...
34
    pyglet.gl.glColor4f(0.5, 0.5, 0.5, 1.0) 
6afdc6b9   Christopher Stone   Attempt at drawin...
35
36
    for xpos in range(0, window.width, window.width/xlines):
        pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (xpos, 0, xpos, window.height)))
7f7ce6b5   Christopher Stone   Fixed bug in axis...
37
        tagtext = str(round((xlimits[1]-xlimits[0])*(float(xpos)/window.width) + xlimits[0], 1))
6afdc6b9   Christopher Stone   Attempt at drawin...
38
39
        tag = pyglet.text.Label(tagtext, font_name='Arkhip', font_size=10, x=xpos-2, y=0, anchor_x='right', anchor_y='bottom')
        tag.draw()
7f7ce6b5   Christopher Stone   Fixed bug in axis...
40
    for ypos in range(0, window.width, window.height/ylines):
6afdc6b9   Christopher Stone   Attempt at drawin...
41
        pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (0, ypos, window.width, ypos)))
7f7ce6b5   Christopher Stone   Fixed bug in axis...
42
        tagtext = str(round((ylimits[1]-ylimits[0])*(float(ypos)/window.height) + ylimits[0], 1))
6afdc6b9   Christopher Stone   Attempt at drawin...
43
44
45
46
47
        tag = pyglet.text.Label(tagtext, font_name='Arkhip', font_size=10, x=0, y=ypos-2, anchor_x='left', anchor_y='top')
        tag.draw()


def plotline(xdata, ydata):
caf04a11   Christopher Stone   Demo code now dra...
48
49
50
    pyglet.gl.glColor4f(1, 0, 0, 1.0)
    points = []
    for n in range(max(len(xdata), len(ydata))):
b0f61ccf   Christopher Stone   Working demo for ...
51
52
53
54
        try:
            xpos = ((xdata[n]-min(xdata))*window.width)/(max(xdata)-min(xdata))
        except:
            xpos = 0
caf04a11   Christopher Stone   Demo code now dra...
55
        xpos = int(xpos)
b0f61ccf   Christopher Stone   Working demo for ...
56
57
58
59
        try:
            ypos = ((ydata[n]-min(ydata))*window.height)/(max(ydata)-min(ydata))
        except:
            ypos = 0
caf04a11   Christopher Stone   Demo code now dra...
60
61
62
63
64
        ypos = int(ypos)
        points.append([xpos, ypos])
    for n in range(len(points)-1):            
        pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (points[n][0], points[n][1], points[n+1][0], points[n+1][1])))

6afdc6b9   Christopher Stone   Attempt at drawin...
65

caf04a11   Christopher Stone   Demo code now dra...
66
67
xdata = [0]
ydata = [0]
6afdc6b9   Christopher Stone   Attempt at drawin...
68

6afdc6b9   Christopher Stone   Attempt at drawin...
69
70
71
72

@window.event
def on_draw():
    window.clear()
b0f61ccf   Christopher Stone   Working demo for ...
73
74
75
76
    value = datafeed.readline()
    try:
        value = float(value)
        ydata.append(value)
b0f61ccf   Christopher Stone   Working demo for ...
77
78
79
80
81
82
83
84

        if len(ydata) > 250:
            del ydata[0]
        xdata.append(round(time.time() - starttime, 3))
        if len(xdata) > 250:
            del xdata[0]
    except:
        pass
7f7ce6b5   Christopher Stone   Fixed bug in axis...
85
    drawgrid(10, 10, [min(xdata), max(xdata)], [min(ydata), max(ydata)])
caf04a11   Christopher Stone   Demo code now dra...
86
87
    plotline(xdata, ydata)

b0f61ccf   Christopher Stone   Working demo for ...
88

6afdc6b9   Christopher Stone   Attempt at drawin...
89
90
    
pyglet.app.run()