Commit 8cff766ab8488f4f7fd32bcfb831c7b23fed6266

Authored by Hugo Stephens
1 parent 2c1aba27
Exists in master

Added port selection for windows

multiple serial case on windows not tested, but 'should' work. 

changed to sys.exit()  mostly out of personal preference - may help to avoid error - see comment l133
robots/little_john/telemetry/code/monitor/graph_plotter_rewrite.py
... ... @@ -8,67 +8,86 @@
8 8  
9 9 import pyglet
10 10 #import math
11   -#import time
  11 +import time
12 12 import serial
13 13 import numpy
14 14 import os
15 15 import platform
  16 +import sys
16 17  
17 18 from colours import *
18 19 # Who doesn't like cross platform development
  20 +#if platform.system()=='Windows':
  21 +# targetdevs='COM5'
  22 +# os='Windows'
  23 +
  24 +devpatterns = ['ttyACM', 'ttyUSB', 'rfcomm']
  25 +targetdevs = []
19 26 if platform.system()=='Windows':
20   - serialport='COM5'
21   - os='Windows'
  27 + com_ports = ['COM%s' % (i + 1) for i in range(256)]
  28 + for port in com_ports:
  29 + try:
  30 + s = serial.Serial(port)
  31 + s.close()
  32 + targetdevs.append(port)
  33 + except (OSError, serial.SerialException):
  34 + pass
  35 + os='Windows' #may be useful
22 36 else:
23   - devpatterns = ['ttyACM', 'ttyUSB', 'rfcomm']
24   -
25 37 alldevs = os.listdir("/dev/")
26 38 targetdevs = []
27 39 for dev in alldevs:
28 40 for pattern in devpatterns:
29 41 if pattern in dev:
30 42 targetdevs.append(dev)
  43 + os='Other' #may be useful
31 44  
32 45  
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:")
  46 +if len(targetdevs) == 0:
  47 + print("Sorry, no serial devices found.")
  48 + print("Exiting...")
  49 + time.sleep(2)
  50 + sys.exit()
  51 +elif len(targetdevs) > 1:
  52 + print("Found multiple serial devices: ")
  53 + for i, dev in enumerate(targetdevs):
  54 + print(" " + str(i) + ": /dev/" + dev)
  55 + while True:
  56 + try:
  57 + selection = int(input("Please enter your selection (as a digit):\n > "))
  58 + if selection >= 0 and selection < len(targetdevs):
  59 + break
  60 + except KeyboardInterrupt:
  61 + sys.exit()
  62 + except:
  63 + print("Choice unrecognised: please try again:")
  64 +else:
  65 + if os=='Windows':
  66 + print("Only found one likely serial device: " + targetdevs[0])
  67 + selection = 0
49 68 else:
50 69 print("Only found one likely serial device: /dev/" + dev)
51   - selection = 0
52   -
  70 +if os=='Windows':
  71 + serialport=targetdevs[selection]
  72 +else:
53 73 serialport = "/dev/" + targetdevs[selection]
54   - os='Other'
55 74  
56 75 try:
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!")
67   -except Exception, e:
  76 + datafeed = serial.Serial(
  77 + port=serialport,
  78 + baudrate = 9600,
  79 + parity=serial.PARITY_NONE,
  80 + stopbits=serial.STOPBITS_ONE,
  81 + bytesize=serial.EIGHTBITS,
  82 + timeout=1
  83 + )
  84 +
  85 + print("Sucessfully opened " + serialport + " as data source!")
  86 +except Exception as e:
68 87 print("Failed to access " + serialport + " because:")
69 88 print(e)
70 89 print("Exiting...")
71   - exit()
  90 + sys.exit()
72 91  
73 92 class Series:
74 93 def __init__(self, points=100, title="Series title", xname="x-axis name", yname="y-axis name"):
... ... @@ -111,6 +130,7 @@ class Plot(pyglet.window.Window):
111 130 """Handle a resize event from the pyglet event loop"""
112 131 self.bounds = ((int(self.width * self.margins[0]), int(self.width * (1 - self.margins[0]))),
113 132 (int(self.height * self.margins[1]), int(self.height * (1 - self.margins[1]))))
  133 + # 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
114 134 pyglet.window.Window.on_resize(self, width, height)
115 135  
116 136 def on_draw(self):
... ...