Commit d9d096654b60a4186c37e26a4aa4cd8e350f3d61

Authored by Christopher Stone
1 parent ba381288
Exists in master

Demo reading two values from serial, plotting them on the same graph

robots/little_john/telemetry/code/monitor/version1/main.py
... ... @@ -40,7 +40,7 @@ else:
40 40 os='Other'
41 41 logging.info('OS = ' + os)
42 42  
43   -testseries = Series(points=150, ylimits=(9, 1024), title="Sine wave demo", xname="Time (s)", yname="100sin(t)")
  43 +testseries = Series(points=150, ylimits=(0, 1024), title="Data from serial", xname="Time (s)", yname="ADC output")
44 44 plots = []
45 45 plots.append(Plot(testseries))
46 46  
... ... @@ -48,13 +48,22 @@ def pollSerial(elapsed):
48 48 """Check serial port for incoming data"""
49 49 # Note: 'elapsed' is time since last call of this function
50 50 # This works, but it might be better for performance to have two seperate functions, only one of which is run.
51   - if os=='Windows':
52   - values = datafeed.readline().strip().split(b", ")
53   - else:
54   - values = datafeed.readline().strip()
55   - values = values.split(b', ')
  51 + try:
  52 + if os=='Windows':
  53 + values = datafeed.readline().strip().split(b", ")
  54 + else:
  55 + values = datafeed.readline().strip()
  56 + values = values.split(b', ')
  57 + except:
  58 + logging.error("Failed to recieve or parse input data")
  59 + return
  60 +
56 61 for n, value in enumerate(values):
57   - values[n] = float(value)
  62 + try:
  63 + values[n] = float(value)
  64 + except:
  65 + logging.error("Failed to convert input to float")
  66 + return
58 67 #logging.info("Recieved data: " + str(values))
59 68 testseries.addpoint([time.time()-starttime] + values)
60 69  
... ... @@ -66,6 +75,6 @@ def fakePollSerial(elapsed):
66 75 testseries.addpoint(values)
67 76  
68 77 # Pyglet looks after the main event loop, but this ensures that data keeps being read in
69   -pyglet.clock.schedule_interval(pollSerial, 0.04)
  78 +pyglet.clock.schedule_interval(pollSerial, 0.01)
70 79  
71 80 pyglet.app.run()
... ...
robots/little_john/telemetry/code/monitor/version1/plot.py
... ... @@ -40,7 +40,7 @@ class Plot(pyglet.window.Window):
40 40 self.drawHeading()
41 41 self.drawAxis(0)
42 42 self.drawAxis(1)
43   - self.drawLine(self.series)
  43 + self.drawLines(self.series)
44 44  
45 45 def drawBackground(self):
46 46 """Draw the graph background, currently a plain colour"""
... ... @@ -54,7 +54,7 @@ class Plot(pyglet.window.Window):
54 54 anchor_x='center', anchor_y='top')
55 55 heading.draw()
56 56  
57   - def drawLine(self, series):
  57 + def drawLines(self, series):
58 58 xscale = float(self.series.xlimits[1]-self.series.xlimits[0])/(self.bounds[0][1]-self.bounds[0][0])
59 59 yscale = float(self.series.ylimits[1]-self.series.ylimits[0])/(self.bounds[1][1]-self.bounds[1][0])
60 60 lmar = int(self.width * self.margins[0])
... ... @@ -63,17 +63,24 @@ class Plot(pyglet.window.Window):
63 63 bmar = int(self.height * self.margins[1])
64 64  
65 65 pyglet.gl.glLineWidth(2)
66   -
67   - for n in range(len(series.data) - 1):
68   - x1, y1 = series.data[n][0]-series.xlimits[0], series.data[n][1]-series.ylimits[0]
69   - x2, y2 = series.data[n+1][0]-series.xlimits[0], series.data[n+1][1]-series.ylimits[0]
70   - x1 = int((x1/xscale)+lmar)
71   - y1 = int((y1/yscale)+bmar)
72   - x2 = int((x2/xscale)+lmar)
73   - y2 = int((y2/yscale)+bmar)
74   - pyglet.graphics.draw(2, pyglet.gl.GL_LINES,
75   - ('v2i', (x1, y1, x2, y2)),
76   - ('c3B', (255, 0, 0, 255, 0, 0)))
  66 +
  67 + linecolours = [(255, 0, 0, 255, 0, 0), (0, 0, 255, 0, 0, 255)]
  68 +
  69 + try:
  70 + for m in range(len(series.data[0])-1):
  71 + for n in range(len(series.data) - 1):
  72 + x1, y1 = series.data[n][0]-series.xlimits[0], series.data[n][m+1]-series.ylimits[0]
  73 + x2, y2 = series.data[n+1][0]-series.xlimits[0], series.data[n+1][m+1]-series.ylimits[0]
  74 + x1 = int((x1/xscale)+lmar)
  75 + y1 = int((y1/yscale)+bmar)
  76 + x2 = int((x2/xscale)+lmar)
  77 + y2 = int((y2/yscale)+bmar)
  78 + pyglet.graphics.draw(2, pyglet.gl.GL_LINES,
  79 + ('v2i', (x1, y1, x2, y2)),
  80 + ('c3B', linecolours[m]))
  81 + except:
  82 + logging.error("Failed to plot lines, possibly due to corrupt/missing data. (This happens at startup)")
  83 +
77 84 pyglet.gl.glLineWidth(1)
78 85  
79 86  
... ...
robots/little_john/telemetry/code/monitor/version1/series.py
... ... @@ -32,8 +32,11 @@ class Series:
32 32 self.data.append(point)
33 33 if len(self.data) > self.points:
34 34 del self.data[0]
35   - self.autoscale(0)
36   -
  35 + try:
  36 + self.autoscale(0)
  37 + except:
  38 + logging.error("Series autoscale failed")
  39 +
37 40 def autoscale(self, axis): # axis=0 is x, 1 is y
38 41 minval = self.data[0][axis]
39 42 maxval = self.data[0][axis]
... ...
robots/little_john/telemetry/code/robot/analogread_demo/analogread_demo.ino
... ... @@ -6,7 +6,6 @@
6 6 * This code is under the GPL
7 7 */
8 8  
9   -#include <math.h>
10 9 #include <SoftwareSerial.h>
11 10  
12 11 SoftwareSerial Bluetooth(3, 2); // Rx, Tx
... ... @@ -14,7 +13,6 @@ SoftwareSerial Bluetooth(3, 2); // Rx, Tx
14 13 void setup() {
15 14 Serial.begin(9600);
16 15 Bluetooth.begin(115200);
17   - //Bluetooth.print("Hello, wireless world!");
18 16 pinMode(13, OUTPUT);
19 17 }
20 18  
... ... @@ -25,5 +23,5 @@ void loop() {
25 23 Bluetooth.print(a0value);
26 24 Bluetooth.print(", ");
27 25 Bluetooth.println(a7value);
28   - delay(500);
  26 + delay(100);
29 27 }
... ...