graph_plotter.py 3.12 KB
#!/usr/bin/env python

import pyglet
import math
import random
import time
import serial

datafeed = serial.Serial(
 port='/dev/ttyUSB0',
 baudrate = 9600,
 parity=serial.PARITY_NONE,
 stopbits=serial.STOPBITS_ONE,
 bytesize=serial.EIGHTBITS,
 timeout=1
)

red = [1, 0, 0]
green = [0, 1, 0]
blue = [0.2, 0.5, 1]
 
window0 = pyglet.window.Window(800, 480, resizable=True)
window0.set_caption("First graph")

window1 = pyglet.window.Window(800, 480, resizable=True)
window1.set_caption("Second graph")

starttime = time.time()

                 
def drawgrid(target, xlines, ylines, xlimits, ylimits):
    pyglet.gl.glColor3f(0.5, 0.5, 0.5) 
    for xpos in range(0, target.width, target.width/xlines):
        pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (xpos, 0, xpos, target.height)))
        tagtext = str(round((xlimits[1]-xlimits[0])*(float(xpos)/target.width) + xlimits[0], 1))
        tag = pyglet.text.Label(tagtext, font_name='Arkhip', font_size=10, x=xpos-2, y=0, anchor_x='right', anchor_y='bottom')
        tag.draw()
    for ypos in range(0, target.width, target.height/ylines):
        pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (0, ypos, target.width, ypos)))
        tagtext = str(round((ylimits[1]-ylimits[0])*(float(ypos)/target.height) + ylimits[0], 1))
        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(target, xdata, ydata, colour):
    pyglet.gl.glColor3f(colour[0], colour[1], colour[2])
    points = []
    for n in range(max(len(xdata), len(ydata))):
        try:
            xpos = ((xdata[n]-min(xdata))*target.width)/(max(xdata)-min(xdata))
        except:
            xpos = 0
        xpos = int(xpos)
        try:
            ypos = ((ydata[n]-min(ydata))*target.height)/(max(ydata)-min(ydata))
        except:
            ypos = 0
        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])))


xdata = [0]
y0data = [0]
y1data = [0]

def poll_serial(foo):
    max_points = 200
    value0 = datafeed.readline().strip().split(", ")[0]
    value1 = datafeed.readline().strip().split(", ")[1]
    try:
        value0 = float(value0)
        y0data.append(value0)
        if len(y0data) > max_points:
            del y0data[0]
            
        value1 = float(value1)
        y1data.append(value1)
        if len(y1data) > max_points:
            del y1data[0]
            
        xdata.append(round(time.time() - starttime, 3))
        if len(xdata) > max_points:
            del xdata[0]  
    except:
        pass
    
pyglet.clock.schedule_interval(poll_serial, 0.01)

def drawgraph(target, xpoints, ypoints, colour):
    plotline(target, xpoints, ypoints, colour)
    drawgrid(target, 16, 10, [min(xpoints), max(xpoints)], [min(ypoints), max(ypoints)])

@window0.event
def on_draw():
    window0.clear()
    drawgraph(window0, xdata, y0data, red)
    
@window1.event
def on_draw():
    window1.clear()
    drawgraph(window1, xdata, y1data, green)
    
pyglet.app.run()