Commit 2c1aba27b45acaeed9ee11fe10257d64d378a112
1 parent
761c7779
Exists in
master
Updating the latest version to run on Windows
Added a couple of ifs, requires a new dependency 'platform'
Showing
1 changed file
with
61 additions
and
51 deletions
Show diff stats
robots/little_john/telemetry/code/monitor/graph_plotter_rewrite.py
| ... | ... | @@ -12,52 +12,58 @@ import pyglet |
| 12 | 12 | import serial |
| 13 | 13 | import numpy |
| 14 | 14 | import os |
| 15 | +import platform | |
| 15 | 16 | |
| 16 | 17 | from colours import * |
| 17 | - | |
| 18 | -devpatterns = ['ttyACM', 'ttyUSB', 'rfcomm'] | |
| 19 | - | |
| 20 | -alldevs = os.listdir("/dev/") | |
| 21 | -targetdevs = [] | |
| 22 | -for dev in alldevs: | |
| 23 | - for pattern in devpatterns: | |
| 24 | - if pattern in dev: | |
| 25 | - targetdevs.append(dev) | |
| 26 | - | |
| 27 | - | |
| 28 | -if len(targetdevs) == 0: | |
| 29 | - print("Sorry, no serial devices found.") | |
| 30 | - print("Exiting...") | |
| 31 | -elif len(targetdevs) > 1: | |
| 32 | - print("Found multiple serial devices: ") | |
| 33 | - for i, dev in enumerate(targetdevs): | |
| 34 | - print(" " + str(i) + ": /dev/" + dev) | |
| 35 | - while True: | |
| 36 | - try: | |
| 37 | - selection = int(input("Please enter your selection (as a digit):\n > ")) | |
| 38 | - if selection >= 0 and selection < len(targetdevs): | |
| 39 | - break | |
| 40 | - except KeyboardInterrupt: | |
| 41 | - exit() | |
| 42 | - except: | |
| 43 | - print("Choice unrecognised: please try again:") | |
| 18 | +# Who doesn't like cross platform development | |
| 19 | +if platform.system()=='Windows': | |
| 20 | + serialport='COM5' | |
| 21 | + os='Windows' | |
| 44 | 22 | else: |
| 45 | - print("Only found one likely serial device: /dev/" + dev) | |
| 46 | - selection = 0 | |
| 47 | - | |
| 48 | -serialport = "/dev/" + targetdevs[selection] | |
| 23 | + devpatterns = ['ttyACM', 'ttyUSB', 'rfcomm'] | |
| 24 | + | |
| 25 | + alldevs = os.listdir("/dev/") | |
| 26 | + targetdevs = [] | |
| 27 | + for dev in alldevs: | |
| 28 | + for pattern in devpatterns: | |
| 29 | + if pattern in dev: | |
| 30 | + targetdevs.append(dev) | |
| 31 | + | |
| 32 | + | |
| 33 | + if len(targetdevs) == 0: | |
| 34 | + print("Sorry, no serial devices found.") | |
| 35 | + print("Exiting...") | |
| 36 | + elif len(targetdevs) > 1: | |
| 37 | + print("Found multiple serial devices: ") | |
| 38 | + for i, dev in enumerate(targetdevs): | |
| 39 | + print(" " + str(i) + ": /dev/" + dev) | |
| 40 | + while True: | |
| 41 | + try: | |
| 42 | + selection = int(input("Please enter your selection (as a digit):\n > ")) | |
| 43 | + if selection >= 0 and selection < len(targetdevs): | |
| 44 | + break | |
| 45 | + except KeyboardInterrupt: | |
| 46 | + exit() | |
| 47 | + except: | |
| 48 | + print("Choice unrecognised: please try again:") | |
| 49 | + else: | |
| 50 | + print("Only found one likely serial device: /dev/" + dev) | |
| 51 | + selection = 0 | |
| 52 | + | |
| 53 | + serialport = "/dev/" + targetdevs[selection] | |
| 54 | + os='Other' | |
| 49 | 55 | |
| 50 | 56 | try: |
| 51 | - datafeed = serial.Serial( | |
| 52 | - port=serialport, | |
| 53 | - baudrate = 9600, | |
| 54 | - parity=serial.PARITY_NONE, | |
| 55 | - stopbits=serial.STOPBITS_ONE, | |
| 56 | - bytesize=serial.EIGHTBITS, | |
| 57 | - timeout=1 | |
| 58 | - ) | |
| 59 | - | |
| 60 | - print("Sucessfully opened " + serialport + " as data source!") | |
| 57 | +datafeed = serial.Serial( | |
| 58 | +port=serialport, | |
| 59 | +baudrate = 9600, | |
| 60 | +parity=serial.PARITY_NONE, | |
| 61 | +stopbits=serial.STOPBITS_ONE, | |
| 62 | +bytesize=serial.EIGHTBITS, | |
| 63 | +timeout=1 | |
| 64 | +) | |
| 65 | + | |
| 66 | +print("Sucessfully opened " + serialport + " as data source!") | |
| 61 | 67 | except Exception, e: |
| 62 | 68 | print("Failed to access " + serialport + " because:") |
| 63 | 69 | print(e) |
| ... | ... | @@ -76,7 +82,7 @@ class Series: |
| 76 | 82 | # The latter seta of points much be of like nature and share an axis |
| 77 | 83 | # (time, temperature, xaccel) |
| 78 | 84 | # would be a meaningless thing to plot on a single graph anyway |
| 79 | - | |
| 85 | + | |
| 80 | 86 | self.title = title |
| 81 | 87 | self.xname = xname |
| 82 | 88 | self.yname = yname |
| ... | ... | @@ -100,24 +106,24 @@ class Plot(pyglet.window.Window): |
| 100 | 106 | self.lines = (10, 8) |
| 101 | 107 | #self.resizable = True |
| 102 | 108 | self.set_caption(self.series.title) |
| 103 | - | |
| 109 | + | |
| 104 | 110 | def on_resize(self, width, height): |
| 105 | 111 | """Handle a resize event from the pyglet event loop""" |
| 106 | 112 | self.bounds = ((int(self.width * self.margins[0]), int(self.width * (1 - self.margins[0]))), |
| 107 | 113 | (int(self.height * self.margins[1]), int(self.height * (1 - self.margins[1])))) |
| 108 | 114 | pyglet.window.Window.on_resize(self, width, height) |
| 109 | - | |
| 115 | + | |
| 110 | 116 | def on_draw(self): |
| 111 | 117 | """Draw all the components of the graph""" |
| 112 | 118 | self.drawBackground() |
| 113 | 119 | self.drawHeading() |
| 114 | 120 | self.drawAxis(0) |
| 115 | 121 | self.drawAxis(1) |
| 116 | - | |
| 122 | + | |
| 117 | 123 | def drawBackground(self): |
| 118 | 124 | """Draw the graph background, currently a plain colour""" |
| 119 | 125 | pyglet.image.SolidColorImagePattern(WHITE).create_image(self.width, self.height).blit(0, 0) |
| 120 | - | |
| 126 | + | |
| 121 | 127 | def drawHeading(self): |
| 122 | 128 | """Draw a title for the graph (duplicated in the window titlebar, if present""" |
| 123 | 129 | heading = pyglet.text.Label(self.series.title, color=BLACK, |
| ... | ... | @@ -125,12 +131,12 @@ class Plot(pyglet.window.Window): |
| 125 | 131 | x=self.width/2, y=self.height-(self.margins[1]), |
| 126 | 132 | anchor_x='center', anchor_y='top') |
| 127 | 133 | heading.draw() |
| 128 | - | |
| 134 | + | |
| 129 | 135 | def drawLine(self): |
| 130 | 136 | for n in range(len(data) - 1): |
| 131 | 137 | a, b = data[n], data[n+1] |
| 132 | 138 | pass |
| 133 | - | |
| 139 | + | |
| 134 | 140 | def drawAxis(self, axis): # axis=0 is x, 1 is y |
| 135 | 141 | """Draw the gridlines and labels for one axis, specified in the last argument""" |
| 136 | 142 | limita = self.bounds[1-axis][1] |
| ... | ... | @@ -180,16 +186,20 @@ class Plot(pyglet.window.Window): |
| 180 | 186 | pyglet.gl.glPopMatrix() |
| 181 | 187 | |
| 182 | 188 | tag.draw() |
| 183 | - | |
| 189 | + | |
| 184 | 190 | testseries = Series() |
| 185 | 191 | |
| 186 | -plots = [] | |
| 192 | +plots = [] | |
| 187 | 193 | plots.append(Plot(testseries)) |
| 188 | 194 | |
| 189 | 195 | def pollSerial(elapsed): |
| 190 | 196 | """Check serial port for incoming data""" |
| 191 | 197 | # Note: 'elapsed' is time since last call of this function |
| 192 | - values = datafeed.readline().strip().split(", ") | |
| 198 | + # This works, but it might be better for performance to have two seperate functions, only one of which is run. | |
| 199 | + if os=='Windows': | |
| 200 | + values = datafeed.readline().strip().split(b", ") | |
| 201 | + else: | |
| 202 | + values = datafeed.readline().strip().split(", ") | |
| 193 | 203 | testseries.addpoint(values) |
| 194 | 204 | |
| 195 | 205 | # Pyglet looks after the main event loop, but this ensures that data keeps being read in | ... | ... |