Commit f2e29c3ffa4bd8e9fbad39e6522df3432c3f0355

Authored by Hugo Stephens
1 parent c8b904ce
Exists in master

Updated to mostly PEP8 and working

Needs a bit of tidying up for clarity, and a number of bare excepts mean that it is not fully PEP8
robots/little_john/telemetry/code/monitor/version1/colours.py
@@ -2,4 +2,4 @@ WHITE = (255, 255, 255, 255) @@ -2,4 +2,4 @@ WHITE = (255, 255, 255, 255)
2 BLACK = (0, 0, 0, 255) 2 BLACK = (0, 0, 0, 255)
3 RED = (255, 0, 0, 255) 3 RED = (255, 0, 0, 255)
4 GREEN = (0, 255, 0, 255) 4 GREEN = (0, 255, 0, 255)
5 -BLUE = (0, 0, 255, 255)  
6 \ No newline at end of file 5 \ No newline at end of file
  6 +BLUE = (0, 0, 255, 255)
robots/little_john/telemetry/code/monitor/version1/getdata.py
@@ -5,17 +5,18 @@ @@ -5,17 +5,18 @@
5 import logging 5 import logging
6 import os 6 import os
7 import time 7 import time
8 -import serial  
9 -#from serialselect import selectserial 8 +import math
  9 +
10 10
11 def getData(starttime, datafeed, testseries, testseries2, fake=False): 11 def getData(starttime, datafeed, testseries, testseries2, fake=False):
12 """Check serial port for incoming data""" 12 """Check serial port for incoming data"""
13 # Note: 'elapsed' is time since last call of this function 13 # Note: 'elapsed' is time since last call of this function
14 - # This works, but it might be better for performance to have two seperate functions, only one of which is run. 14 + # This works, but it might be better for performance to have
  15 + # two seperate functions, only one of which is run.
15 if fake: 16 if fake:
16 timefromstart = (time.time()-starttime) 17 timefromstart = (time.time()-starttime)
17 values = [timefromstart, 100*math.sin(timefromstart)] 18 values = [timefromstart, 100*math.sin(timefromstart)]
18 - #logging.info("Generated test data: " + str(values)) 19 + # logging.info("Generated test data: " + str(values))
19 testseries.addpoint(values) 20 testseries.addpoint(values)
20 testseries2.addpoint(values) 21 testseries2.addpoint(values)
21 else: 22 else:
@@ -23,9 +24,9 @@ def getData(starttime, datafeed, testseries, testseries2, fake=False): @@ -23,9 +24,9 @@ def getData(starttime, datafeed, testseries, testseries2, fake=False):
23 incoming = datafeed.readline() 24 incoming = datafeed.readline()
24 except: 25 except:
25 logging.error("Failed to read input data") 26 logging.error("Failed to read input data")
26 - 27 +
27 try: 28 try:
28 - if os=='Windows': 29 + if os == 'Windows':
29 values = incoming.strip().split(b", ") 30 values = incoming.strip().split(b", ")
30 else: 31 else:
31 values = incoming.strip() 32 values = incoming.strip()
@@ -33,15 +34,13 @@ def getData(starttime, datafeed, testseries, testseries2, fake=False): @@ -33,15 +34,13 @@ def getData(starttime, datafeed, testseries, testseries2, fake=False):
33 except: 34 except:
34 logging.error("Failed to parse input data") 35 logging.error("Failed to parse input data")
35 return 36 return
36 - 37 +
37 try: 38 try:
38 for n, value in enumerate(values): 39 for n, value in enumerate(values):
39 values[n] = float(value) 40 values[n] = float(value)
40 except: 41 except:
41 logging.error("Failed to convert input to float") 42 logging.error("Failed to convert input to float")
42 return 43 return
43 - #logging.info("Recieved data: " + str(values)) 44 + # logging.info("Recieved data: " + str(values))
44 testseries.addpoint([time.time()-starttime] + values) 45 testseries.addpoint([time.time()-starttime] + values)
45 testseries2.addpoint(values) 46 testseries2.addpoint(values)
46 -  
47 -  
robots/little_john/telemetry/code/monitor/version1/main.py
@@ -7,16 +7,16 @@ @@ -7,16 +7,16 @@
7 7
8 # This code is incomplete, and is missing core features 8 # This code is incomplete, and is missing core features
9 9
10 -import math 10 +# import math
11 import time 11 import time
12 -#import serial 12 +# import serial
13 13
14 import pyglet 14 import pyglet
15 -import numpy 15 +# import numpy
16 import os 16 import os
17 import platform 17 import platform
18 import sys 18 import sys
19 -import easygui 19 +# import easygui
20 import logging 20 import logging
21 21
22 from serialselect import selectserial 22 from serialselect import selectserial
@@ -31,11 +31,11 @@ starttime = time.time() @@ -31,11 +31,11 @@ starttime = time.time()
31 31
32 datafeed = selectserial() 32 datafeed = selectserial()
33 33
34 -if datafeed == None: 34 +if datafeed is None:
35 logging.critical("Failed to open serial port") 35 logging.critical("Failed to open serial port")
36 sys.exit() 36 sys.exit()
37 -  
38 -if platform.system()=='Windows': 37 +
  38 +if platform.system() == 'Windows':
39 os='Windows' 39 os='Windows'
40 else: 40 else:
41 os='Other' 41 os='Other'
@@ -43,20 +43,30 @@ logging.info('OS = ' + os) @@ -43,20 +43,30 @@ logging.info('OS = ' + os)
43 43
44 44
45 testseries = Series(points=150, xauto=True, ylimits=(0, 1024), 45 testseries = Series(points=150, xauto=True, ylimits=(0, 1024),
46 - title="Data from serial (time)", xname="Time (s)", yname="ADC output") 46 + title="Data from serial (time)",
  47 + xname="Time (s)", yname="ADC output")
47 testseries2 = Series(points=150, xlimits=(0, 1024), ylimits=(0, 1024), 48 testseries2 = Series(points=150, xlimits=(0, 1024), ylimits=(0, 1024),
48 - title="Data from serial (xy)", xname="ADC0 output", yname="ADC7 output") 49 + title="Data from serial (xy)",
  50 + xname="ADC0 output", yname="ADC7 output")
49 51
50 plots = [] 52 plots = []
51 plots.append(Plot(testseries)) 53 plots.append(Plot(testseries))
52 plots.append(Plot(testseries2)) 54 plots.append(Plot(testseries2))
53 55
54 -# Yes I know these are absurd placeholder names. I'm leaving it like that for the moment because I'm not sure if this is really the only (or best) way to achive the desired result. clock.schedule_interval takes a function, not the result of the function as its argument, so how can you pass arguments to it? 56 +''' Yes I know these are absurd placeholder names. I'm leaving it like that
  57 +for the moment because I'm not sure if this is really the only (or best) way
  58 +to achive the desired result. clock.schedule_interval takes a function,
  59 +not the result of the function as its argument, so how can you pass arguments
  60 +to it?'''
  61 +
55 62
56 def shrubbery(ni): 63 def shrubbery(ni):
57 getData(starttime, datafeed, testseries, testseries2) 64 getData(starttime, datafeed, testseries, testseries2)
58 65
59 -# Pyglet looks after the main event loop, but this ensures that data keeps being read in  
60 -pyglet.clock.schedule_interval(shrubbery, 0.01) 66 +
  67 +# Pyglet looks after the main event loop,
  68 +# but this ensures that data keeps being read in
  69 +
  70 +pyglet.clock.schedule_interval(shrubbery, 0.1)
61 71
62 pyglet.app.run() 72 pyglet.app.run()
robots/little_john/telemetry/code/monitor/version1/plot.py
@@ -6,32 +6,41 @@ import pyglet @@ -6,32 +6,41 @@ import pyglet
6 import numpy 6 import numpy
7 import logging 7 import logging
8 from colours import * 8 from colours import *
  9 +import sys
  10 +
9 11
10 class Plot(pyglet.window.Window): 12 class Plot(pyglet.window.Window):
11 def __init__(self, series): 13 def __init__(self, series):
12 """Setup a the details of a plot, and create a corresponding window""" 14 """Setup a the details of a plot, and create a corresponding window"""
13 pyglet.window.Window.__init__(self, resizable=True) 15 pyglet.window.Window.__init__(self, resizable=True)
14 self.set_icon(pyglet.image.load('32x32.png')) 16 self.set_icon(pyglet.image.load('32x32.png'))
15 - self.set_minimum_size(320,320) 17 + self.set_minimum_size(320, 320)
16 self.series = series 18 self.series = series
17 self.font = 'Arkhip' 19 self.font = 'Arkhip'
18 - self.margins = (0.09, 0.08) # Fractions of window size 20 + self.margins = (0.09, 0.08) # Fractions of window size
19 self.lines = (10, 8) 21 self.lines = (10, 8)
20 - #self.resizable = True 22 + # self.resizable = True
21 self.set_caption(self.series.title) 23 self.set_caption(self.series.title)
22 24
23 def on_resize(self, width, height): 25 def on_resize(self, width, height):
24 """Handle a resize event from the pyglet event loop""" 26 """Handle a resize event from the pyglet event loop"""
25 try: 27 try:
26 - self.bounds = ((int(self.width * self.margins[0]), int(self.width * (1 - self.margins[0]))),  
27 - (int(self.height * self.margins[1]), int(self.height * (1 - self.margins[1])))) 28 + self.bounds = ((int(self.width * self.margins[0]),
  29 + int(self.width * (1 - self.margins[0]))),
  30 + (int(self.height * self.margins[1]),
  31 + int(self.height * (1 - self.margins[1]))))
28 except Exception as e: 32 except Exception as e:
29 logging.critical(str(e)) 33 logging.critical(str(e))
30 self.close() 34 self.close()
31 logging.critical('Instance closed') 35 logging.critical('Instance closed')
32 sys.exit() 36 sys.exit()
33 - self.tag_size = min(self.height*self.margins[1]*0.3,self.width*self.margins[0]*0.3)  
34 - # This sometimes seems to throw an error ('AttributeError: 'Plot' object has no attribute 'margins') when started for a second time from the same instance. Interesting. Causes the plot windows to freeze 37 + self.tag_size = min(self.height*self.margins[1]*0.3,
  38 + self.width*self.margins[0]*0.3)
  39 + # This sometimes seems to throw an error
  40 + # ('AttributeError: 'Plot' object has no attribute 'margins')
  41 + # when started for a second time from the same instance.
  42 + # Interesting. Causes the plot windows to freeze
  43 +
35 pyglet.window.Window.on_resize(self, width, height) 44 pyglet.window.Window.on_resize(self, width, height)
36 45
37 def on_draw(self): 46 def on_draw(self):
@@ -44,49 +53,55 @@ class Plot(pyglet.window.Window): @@ -44,49 +53,55 @@ class Plot(pyglet.window.Window):
44 53
45 def drawBackground(self): 54 def drawBackground(self):
46 """Draw the graph background, currently a plain colour""" 55 """Draw the graph background, currently a plain colour"""
47 - pyglet.image.SolidColorImagePattern(WHITE).create_image(self.width, self.height).blit(0, 0) 56 + pyglet.image.SolidColorImagePattern(WHITE).create_image(
  57 + self.width, self.height).blit(0, 0)
48 58
49 def drawHeading(self): 59 def drawHeading(self):
50 - """Draw a title for the graph (duplicated in the window titlebar, if present""" 60 + """Draw a title for the graph (duplicated in the window titlebar"""
51 heading = pyglet.text.Label(self.series.title, color=BLACK, 61 heading = pyglet.text.Label(self.series.title, color=BLACK,
52 - font_name=self.font, font_size=self.height*self.margins[0]*0.5,  
53 - x=self.width/2, y=self.height-(self.margins[1]),  
54 - anchor_x='center', anchor_y='top') 62 + font_name=self.font,
  63 + font_size=self.height*self.margins[0]*0.5,
  64 + x=self.width/2,
  65 + y=self.height-(self.margins[1]),
  66 + anchor_x='center', anchor_y='top')
55 heading.draw() 67 heading.draw()
56 68
57 def drawLines(self, series): 69 def drawLines(self, series):
58 - xscale = float(self.series.xlimits[1]-self.series.xlimits[0])/(self.bounds[0][1]-self.bounds[0][0])  
59 - yscale = float(self.series.ylimits[1]-self.series.ylimits[0])/(self.bounds[1][1]-self.bounds[1][0]) 70 + xscale = float(self.series.xlimits[1]-self.series.xlimits[0])/(
  71 + self.bounds[0][1]-self.bounds[0][0])
  72 + yscale = float(self.series.ylimits[1]-self.series.ylimits[0])/(
  73 + self.bounds[1][1]-self.bounds[1][0])
60 lmar = int(self.width * self.margins[0]) 74 lmar = int(self.width * self.margins[0])
61 rmar = int(self.width * self.margins[1]) 75 rmar = int(self.width * self.margins[1])
62 tmar = int(self.height * self.margins[0]) 76 tmar = int(self.height * self.margins[0])
63 bmar = int(self.height * self.margins[1]) 77 bmar = int(self.height * self.margins[1])
64 78
65 pyglet.gl.glLineWidth(2) 79 pyglet.gl.glLineWidth(2)
66 - 80 +
67 linecolours = [(255, 0, 0, 255, 0, 0), (0, 220, 0, 0, 220, 0), (0, 0, 255, 0, 0, 255)] 81 linecolours = [(255, 0, 0, 255, 0, 0), (0, 220, 0, 0, 220, 0), (0, 0, 255, 0, 0, 255)]
68 82
69 try: 83 try:
70 for m in range(len(series.data[0])-1): 84 for m in range(len(series.data[0])-1):
71 for n in range(len(series.data) - 1): 85 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] 86 + x1 = series.data[n][0]-series.xlimits[0]
  87 + y1 = series.data[n][m+1]-series.ylimits[0]
  88 + x2 = series.data[n+1][0]-series.xlimits[0]
  89 + y2 = series.data[n+1][m+1]-series.ylimits[0]
74 x1 = int((x1/xscale)+lmar) 90 x1 = int((x1/xscale)+lmar)
75 y1 = int((y1/yscale)+bmar) 91 y1 = int((y1/yscale)+bmar)
76 x2 = int((x2/xscale)+lmar) 92 x2 = int((x2/xscale)+lmar)
77 y2 = int((y2/yscale)+bmar) 93 y2 = int((y2/yscale)+bmar)
78 pyglet.graphics.draw(2, pyglet.gl.GL_LINES, 94 pyglet.graphics.draw(2, pyglet.gl.GL_LINES,
79 - ('v2i', (x1, y1, x2, y2)),  
80 - ('c3B', linecolours[m])) 95 + ('v2i', (x1, y1, x2, y2)),
  96 + ('c3B', linecolours[m]))
81 except: 97 except:
82 - logging.error("Failed to plot lines, possibly due to corrupt/missing data. (This happens at startup)")  
83 -  
84 - pyglet.gl.glLineWidth(1)  
85 - 98 + logging.error("Failed to plot lines: corrupt/missing data?")
86 99
  100 + pyglet.gl.glLineWidth(1)
87 101
88 - def drawAxis(self, axis): # axis=0 is x, 1 is y  
89 - """Draw the gridlines and labels for one axis, specified in the last argument""" 102 + def drawAxis(self, axis): # axis=0 is x, 1 is y
  103 + """Draw the gridlines and labels for one axis,
  104 + specified in the last argument"""
90 limita = self.bounds[1-axis][1] 105 limita = self.bounds[1-axis][1]
91 limitb = self.bounds[1-axis][0] 106 limitb = self.bounds[1-axis][0]
92 start = self.bounds[axis][0] 107 start = self.bounds[axis][0]
@@ -95,37 +110,49 @@ class Plot(pyglet.window.Window): @@ -95,37 +110,49 @@ class Plot(pyglet.window.Window):
95 for pos in numpy.arange(start, stop+1, increment): 110 for pos in numpy.arange(start, stop+1, increment):
96 # Using fp arithmetic to avoid intermittent fencepost errors 111 # Using fp arithmetic to avoid intermittent fencepost errors
97 pos = int(pos) 112 pos = int(pos)
98 - if axis==0: # x axis, vertical lines  
99 - scale = float(self.series.xlimits[1]-self.series.xlimits[0])/(stop-start) 113 + if axis == 0: # x axis, vertical lines
  114 + scale = float(self.series.xlimits[1]-self.series.xlimits[0])/(
  115 + stop-start)
100 tagvalue = ((pos-start) * scale) + self.series.xlimits[0] 116 tagvalue = ((pos-start) * scale) + self.series.xlimits[0]
101 tagtext = str(int(tagvalue)) 117 tagtext = str(int(tagvalue))
102 - pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (pos, limita, pos, limitb)),  
103 - ('c3B', (0, 0, 0, 0, 0, 0))) 118 + pyglet.graphics.draw(2, pyglet.gl.GL_LINES,
  119 + ('v2i', (pos, limita, pos, limitb)),
  120 + ('c3B', (0, 0, 0, 0, 0, 0)))
104 tag = pyglet.text.Label(tagtext, color=BLACK, 121 tag = pyglet.text.Label(tagtext, color=BLACK,
105 - font_name=self.font, font_size=self.tag_size, 122 + font_name=self.font,
  123 + font_size=self.tag_size,
106 x=pos, y=self.height*self.margins[1], 124 x=pos, y=self.height*self.margins[1],
107 anchor_x='left', anchor_y='top') 125 anchor_x='left', anchor_y='top')
108 axistitle = pyglet.text.Label(self.series.xname, color=BLACK, 126 axistitle = pyglet.text.Label(self.series.xname, color=BLACK,
109 - font_name=self.font, font_size=self.tag_size,  
110 - x=self.width/2, y=0,  
111 - anchor_x='center', anchor_y='bottom') 127 + font_name=self.font,
  128 + font_size=self.tag_size,
  129 + x=self.width/2, y=0,
  130 + anchor_x='center',
  131 + anchor_y='bottom')
112 axistitle.draw() 132 axistitle.draw()
113 - if axis==1: # y axis, horizontal lines  
114 - scale = float(self.series.ylimits[1]-self.series.ylimits[0])/(stop-start) 133 + if axis == 1: # y axis, horizontal lines
  134 + scale = float(self.series.ylimits[1]-self.series.ylimits[0])/(
  135 + stop-start)
115 tagvalue = ((pos-start) * scale) + self.series.ylimits[0] 136 tagvalue = ((pos-start) * scale) + self.series.ylimits[0]
116 tagtext = str(int(tagvalue)) 137 tagtext = str(int(tagvalue))
117 - pyglet.graphics.draw(2, pyglet.gl.GL_LINES, ('v2i', (limita, pos, limitb, pos)),  
118 - ('c3B', (0, 0, 0, 0, 0, 0))) 138 + pyglet.graphics.draw(2, pyglet.gl.GL_LINES,
  139 + ('v2i', (limita, pos, limitb, pos)),
  140 + ('c3B', (0, 0, 0, 0, 0, 0)))
119 tag = pyglet.text.Label(tagtext, color=BLACK, 141 tag = pyglet.text.Label(tagtext, color=BLACK,
120 - font_name=self.font, font_size=self.tag_size,  
121 - x=self.width*self.margins[0]*0.9, y=pos, 142 + font_name=self.font,
  143 + font_size=self.tag_size,
  144 + x=self.width*self.margins[0]*0.9,
  145 + y=pos,
122 anchor_x='right', anchor_y='center') 146 anchor_x='right', anchor_y='center')
123 axistitle = pyglet.text.Label(self.series.yname, color=BLACK, 147 axistitle = pyglet.text.Label(self.series.yname, color=BLACK,
124 - font_name=self.font, font_size=self.tag_size,  
125 - x=0, y=self.height/2,  
126 - anchor_x='center', anchor_y='top')  
127 - pyglet.gl.glPushMatrix() # Set up a new context to avoid confusing the main one  
128 - # Tranformation to rotate label, and ensure it ends up in the right place 148 + font_name=self.font,
  149 + font_size=self.tag_size,
  150 + x=0, y=self.height/2,
  151 + anchor_x='center',
  152 + anchor_y='top')
  153 + pyglet.gl.glPushMatrix()
  154 + # Set up a new context to avoid confusing the main one
  155 + # Tranformation to rotate label
129 pyglet.gl.glTranslatef(self.height//2, self.height//2, 0.0) 156 pyglet.gl.glTranslatef(self.height//2, self.height//2, 0.0)
130 pyglet.gl.glRotatef(90.0, 0.0, 0.0, 1.0) 157 pyglet.gl.glRotatef(90.0, 0.0, 0.0, 1.0)
131 # Draw the axis title using the rotated coordinate system 158 # Draw the axis title using the rotated coordinate system
robots/little_john/telemetry/code/monitor/version1/serialselect.py
@@ -2,27 +2,29 @@ @@ -2,27 +2,29 @@
2 # Written as a telemetry tool by: 2 # Written as a telemetry tool by:
3 # The UoN Robot Wars Project, 2018 3 # The UoN Robot Wars Project, 2018
4 4
  5 +
5 def selectserial(): 6 def selectserial():
6 - """Cross-platform function to find appropriate serial ports, query the user if necessary, and open one of them""" 7 + """Cross-platform function to find appropriate serial ports, query the
  8 + user if necessary, and open one of them"""
7 import platform 9 import platform
8 import serial 10 import serial
9 import os 11 import os
10 import easygui 12 import easygui
11 import logging 13 import logging
12 - 14 +
13 devpatterns = ['ttyACM', 'ttyUSB', 'rfcomm'] 15 devpatterns = ['ttyACM', 'ttyUSB', 'rfcomm']
14 targetdevs = [] 16 targetdevs = []
15 - if platform.system()=='Windows': 17 + if platform.system() == 'Windows':
16 com_ports = ['COM%s' % (i + 1) for i in range(256)] 18 com_ports = ['COM%s' % (i + 1) for i in range(256)]
17 for port in com_ports: 19 for port in com_ports:
18 try: 20 try:
19 s = serial.Serial(port) 21 s = serial.Serial(port)
20 s.close() 22 s.close()
21 targetdevs.append(port) 23 targetdevs.append(port)
22 - # Temporarily broadened exception in attempt to make this work on uni PCs  
23 - except: # (OSError, serial.SerialException): 24 + # Temporarily broadened exception to make this work on uni PCs
  25 + except: # (OSError, serial.SerialException):
24 pass 26 pass
25 - os='Windows' #may be useful 27 + os = 'Windows' # may be useful
26 else: 28 else:
27 alldevs = os.listdir("/dev/") 29 alldevs = os.listdir("/dev/")
28 targetdevs = [] 30 targetdevs = []
@@ -30,7 +32,7 @@ def selectserial(): @@ -30,7 +32,7 @@ def selectserial():
30 for pattern in devpatterns: 32 for pattern in devpatterns:
31 if pattern in dev: 33 if pattern in dev:
32 targetdevs.append("/dev/" + dev) 34 targetdevs.append("/dev/" + dev)
33 - os='Other' #may be useful 35 + os = 'Other' # may be useful
34 36
35 if len(targetdevs) == 0: 37 if len(targetdevs) == 0:
36 logging.info("No serial device found.") 38 logging.info("No serial device found.")
@@ -42,22 +44,22 @@ def selectserial(): @@ -42,22 +44,22 @@ def selectserial():
42 message = "Please choose a serial port to recieve data through:" 44 message = "Please choose a serial port to recieve data through:"
43 title = "Found multiple serial ports!" 45 title = "Found multiple serial ports!"
44 serialport = easygui.choicebox(message, title, targetdevs) 46 serialport = easygui.choicebox(message, title, targetdevs)
45 - if serialport == None: 47 + if serialport is None:
46 logging.info("User cancelled selection dialogue") 48 logging.info("User cancelled selection dialogue")
47 return None 49 return None
48 else: 50 else:
49 logging.info("Only found one likely serial device: " + targetdevs[0]) 51 logging.info("Only found one likely serial device: " + targetdevs[0])
50 serialport = targetdevs[0] 52 serialport = targetdevs[0]
51 - 53 +
52 try: 54 try:
53 datafeed = serial.Serial( 55 datafeed = serial.Serial(
54 - port=serialport,  
55 - baudrate = 9600,  
56 - parity=serial.PARITY_NONE,  
57 - stopbits=serial.STOPBITS_ONE,  
58 - bytesize=serial.EIGHTBITS,  
59 - timeout=1  
60 - ) 56 + port=serialport,
  57 + baudrate=9600,
  58 + parity=serial.PARITY_NONE,
  59 + stopbits=serial.STOPBITS_ONE,
  60 + bytesize=serial.EIGHTBITS,
  61 + timeout=1
  62 + )
61 63
62 logging.info("Sucessfully opened " + serialport + " as data source!") 64 logging.info("Sucessfully opened " + serialport + " as data source!")
63 return datafeed 65 return datafeed
robots/little_john/telemetry/code/monitor/version1/series.py
@@ -4,10 +4,12 @@ @@ -4,10 +4,12 @@
4 4
5 import logging 5 import logging
6 6
  7 +
7 class Series: 8 class Series:
8 def __init__(self, points=100, xlimits=(0, 100), ylimits=(0, 100), 9 def __init__(self, points=100, xlimits=(0, 100), ylimits=(0, 100),
9 xauto=False, yauto=False, 10 xauto=False, yauto=False,
10 - title="Series title", xname="x-axis name", yname="y-axis name"): 11 + title="Series title",
  12 + xname="x-axis name", yname="y-axis name"):
11 """Set up an object to store a 2D data series""" 13 """Set up an object to store a 2D data series"""
12 # Proposal: 14 # Proposal:
13 # In order to neatly handle multiple lines on the same graph 15 # In order to neatly handle multiple lines on the same graph
@@ -28,9 +30,9 @@ class Series: @@ -28,9 +30,9 @@ class Series:
28 self.points = points 30 self.points = points
29 self.xauto = xauto 31 self.xauto = xauto
30 self.yauto = yauto 32 self.yauto = yauto
31 - 33 +
32 logging.info("Created series: " + title) 34 logging.info("Created series: " + title)
33 - 35 +
34 def addpoint(self, point): 36 def addpoint(self, point):
35 """Add a point to the dataset, and remove the oldest, if necessary""" 37 """Add a point to the dataset, and remove the oldest, if necessary"""
36 self.data.append(point) 38 self.data.append(point)
@@ -43,15 +45,15 @@ class Series: @@ -43,15 +45,15 @@ class Series:
43 self.autoscale(1) 45 self.autoscale(1)
44 except: 46 except:
45 logging.error("Series autoscale failed") 47 logging.error("Series autoscale failed")
46 -  
47 - def autoscale(self, axis): # axis=0 is x, 1 is y 48 +
  49 + def autoscale(self, axis): # axis=0 is x, 1 is y
48 minval = self.data[0][axis] 50 minval = self.data[0][axis]
49 maxval = self.data[0][axis] 51 maxval = self.data[0][axis]
50 for value in self.data: 52 for value in self.data:
51 if value[axis] < minval: 53 if value[axis] < minval:
52 minval = value[axis] 54 minval = value[axis]
53 if value[axis] > maxval: 55 if value[axis] > maxval:
54 - maxval = value[axis] 56 + maxval = value[axis]
55 if axis == 0: 57 if axis == 0:
56 self.xlimits = (minval, maxval) 58 self.xlimits = (minval, maxval)
57 else: 59 else: