Rev 717 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 717 | Rev 718 | ||
---|---|---|---|
1 | #!/usr/bin/env python |
1 | #!/usr/bin/env python |
2 | # -*- coding: iso-8859-15 -*- |
2 | # -*- coding: iso-8859-15 -*- |
3 | # generated by wxGlade 0.6.3 on Thu Sep 24 15:46:36 2009 |
3 | # generated by wxGlade 0.6.3 on Thu Sep 24 15:46:36 2009 |
4 | 4 | ||
5 | # |
5 | # |
6 | # Mikrokopter VibrationTest Rev: $Rev: 717 $ |
6 | # Mikrokopter VibrationTest Rev: $Rev: 718 $ |
7 | # |
7 | # |
8 | # Author: Frederic Goddeeris (frederic@rc-flight.be) |
8 | # Author: Frederic Goddeeris (frederic@rc-flight.be) |
9 | # |
9 | # |
10 | 10 | ||
11 | import sys |
11 | import sys |
12 | import os |
12 | import os |
13 | import time |
13 | import time |
14 | import thread |
14 | import thread |
15 | import ConfigParser |
15 | import ConfigParser |
16 | import math |
16 | import math |
17 | import copy |
17 | import copy |
18 | 18 | ||
19 | import wx |
19 | import wx |
20 | import wx.lib |
20 | import wx.lib |
21 | import wx.lib.plot |
21 | import wx.lib.plot |
22 | import wx.lib.newevent |
22 | import wx.lib.newevent |
23 | import wx.lib.agw.speedmeter as speedmeter |
23 | import wx.lib.agw.speedmeter as speedmeter |
24 | 24 | ||
25 | import MkProtocol |
25 | import MkProtocol |
26 | 26 | ||
27 | 27 | ||
28 | 28 | ||
29 | CHANNEL_NAMES = ["GyroYaw", "GyroRoll", "GyroNick", "Pressure", "Batt", "AccTop", "AccRoll", "AccNick"] |
29 | CHANNEL_NAMES = ["GyroYaw", "GyroRoll", "GyroNick", "Pressure", "Batt", "AccTop", "AccRoll", "AccNick"] |
30 | MOTOR_MAX = 16 |
30 | MOTOR_MAX = 16 |
31 | 31 | ||
32 | FS = 18.0 |
32 | FS = 18.0 |
33 | pi = 3.14 |
33 | pi = 3.14 |
34 | COLOR_YELLOW = wx.Colour(255, 240, 0) |
34 | COLOR_YELLOW = wx.Colour(255, 240, 0) |
35 | COLOR_BACKGROUND = wx.Colour(0x80, 0x80, 0x80) |
35 | COLOR_BACKGROUND = wx.Colour(0x80, 0x80, 0x80) |
36 | 36 | ||
37 | COLORS = [wx.RED, wx.GREEN, wx.BLUE, COLOR_YELLOW, COLOR_BACKGROUND, wx.BLACK,]*2 |
37 | COLORS = [wx.RED, wx.GREEN, wx.BLUE, COLOR_YELLOW, COLOR_BACKGROUND, wx.BLACK,]*2 |
38 | 38 | ||
39 | rootPath = "" |
39 | rootPath = "" |
40 | 40 | ||
41 | # Needs Numeric or numarray or NumPy |
41 | # Needs Numeric or numarray or NumPy |
42 | try: |
42 | try: |
43 | import numpy.oldnumeric as _Numeric |
43 | import numpy.oldnumeric as _Numeric |
44 | except: |
44 | except: |
45 | try: |
45 | try: |
46 | import numarray as _Numeric #if numarray is used it is renamed Numeric |
46 | import numarray as _Numeric #if numarray is used it is renamed Numeric |
47 | except: |
47 | except: |
48 | try: |
48 | try: |
49 | import Numeric as _Numeric |
49 | import Numeric as _Numeric |
50 | except: |
50 | except: |
51 | msg= """ |
51 | msg= """ |
52 | This module requires the Numeric/numarray or NumPy module, |
52 | This module requires the Numeric/numarray or NumPy module, |
53 | which could not be imported. It probably is not installed |
53 | which could not be imported. It probably is not installed |
54 | (it's not part of the standard Python distribution). See the |
54 | (it's not part of the standard Python distribution). See the |
55 | Numeric Python site (http://numpy.scipy.org) for information on |
55 | Numeric Python site (http://numpy.scipy.org) for information on |
56 | downloading source or binaries.""" |
56 | downloading source or binaries.""" |
57 | raise ImportError, "Numeric,numarray or NumPy not found. \n" + msg |
57 | raise ImportError, "Numeric,numarray or NumPy not found. \n" + msg |
58 | 58 | ||
59 | # begin wxGlade: extracode |
59 | # begin wxGlade: extracode |
60 | # end wxGlade |
60 | # end wxGlade |
61 | 61 | ||
62 | 62 | ||
63 | # This creates a new Event class and a EVT binder function |
63 | # This creates a new Event class and a EVT binder function |
64 | (MeasStatusUpdateEvent, EVT_MEAS_STATUS_UPDATE) = wx.lib.newevent.NewEvent() |
64 | (MeasStatusUpdateEvent, EVT_MEAS_STATUS_UPDATE) = wx.lib.newevent.NewEvent() |
65 | (MeasDataEvent, EVT_MEAS_DATA) = wx.lib.newevent.NewEvent() |
65 | (MeasDataEvent, EVT_MEAS_DATA) = wx.lib.newevent.NewEvent() |
- | 66 | ||
- | 67 | class MkSettingsDialog(wx.Frame): |
|
- | 68 | def __init__(self, *args, **kwds): |
|
- | 69 | # begin wxGlade: MkSettingsDialog.__init__ |
|
- | 70 | kwds["style"] = wx.DEFAULT_FRAME_STYLE |
|
- | 71 | wx.Frame.__init__(self, *args, **kwds) |
|
- | 72 | self.label_2 = wx.StaticText(self, -1, "Gyro-P", style=wx.ALIGN_RIGHT) |
|
- | 73 | self.slider_GyroP = wx.Slider(self, -1, 0, 0, 255, style=wx.SL_HORIZONTAL|wx.SL_LABELS) |
|
- | 74 | self.label_2_copy = wx.StaticText(self, -1, "Gyro-I", style=wx.ALIGN_RIGHT) |
|
- | 75 | self.slider_GyroI = wx.Slider(self, -1, 0, 0, 255, style=wx.SL_HORIZONTAL|wx.SL_LABELS) |
|
- | 76 | self.label_2_copy_1 = wx.StaticText(self, -1, "Gyro-D", style=wx.ALIGN_RIGHT) |
|
- | 77 | self.slider_GyroD = wx.Slider(self, -1, 0, 0, 255, style=wx.SL_HORIZONTAL|wx.SL_LABELS) |
|
- | 78 | self.label_2_copy_2 = wx.StaticText(self, -1, "Factor-I", style=wx.ALIGN_RIGHT) |
|
- | 79 | self.slider_FactorI = wx.Slider(self, -1, 0, 0, 255, style=wx.SL_HORIZONTAL|wx.SL_LABELS) |
|
- | 80 | self.label_2_copy_3 = wx.StaticText(self, -1, "", style=wx.ALIGN_RIGHT) |
|
- | 81 | self.slider_1_copy_3 = wx.Slider(self, -1, 0, 0, 255, style=wx.SL_HORIZONTAL|wx.SL_LABELS) |
|
- | 82 | self.loadButton = wx.Button(self, -1, "Load") |
|
- | 83 | self.storeButton = wx.Button(self, -1, "Store") |
|
- | 84 | ||
- | 85 | self.__set_properties() |
|
- | 86 | self.__do_layout() |
|
- | 87 | ||
- | 88 | self.Bind(wx.EVT_BUTTON, self.onLoad, self.loadButton) |
|
- | 89 | # end wxGlade |
|
- | 90 | ||
- | 91 | def __set_properties(self): |
|
- | 92 | # begin wxGlade: MkSettingsDialog.__set_properties |
|
- | 93 | self.SetTitle("MK Settings") |
|
- | 94 | self.SetSize((600, 450)) |
|
- | 95 | self.label_2.SetMinSize((80, 16)) |
|
- | 96 | self.label_2.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
|
- | 97 | self.slider_GyroP.SetMinSize((400, -1)) |
|
- | 98 | self.slider_GyroP.SetBackgroundColour(wx.Colour(128, 128, 128)) |
|
- | 99 | self.label_2_copy.SetMinSize((80, 16)) |
|
- | 100 | self.label_2_copy.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
|
- | 101 | self.slider_GyroI.SetMinSize((400, -1)) |
|
- | 102 | self.slider_GyroI.SetBackgroundColour(wx.Colour(128, 128, 128)) |
|
- | 103 | self.label_2_copy_1.SetMinSize((80, 16)) |
|
- | 104 | self.label_2_copy_1.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
|
- | 105 | self.slider_GyroD.SetMinSize((400, -1)) |
|
- | 106 | self.slider_GyroD.SetBackgroundColour(wx.Colour(128, 128, 128)) |
|
- | 107 | self.label_2_copy_2.SetMinSize((80, 16)) |
|
- | 108 | self.label_2_copy_2.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
|
- | 109 | self.slider_FactorI.SetMinSize((400, -1)) |
|
- | 110 | self.slider_FactorI.SetBackgroundColour(wx.Colour(128, 128, 128)) |
|
- | 111 | self.label_2_copy_3.SetMinSize((80, 16)) |
|
- | 112 | self.label_2_copy_3.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
|
- | 113 | self.slider_1_copy_3.SetMinSize((400, -1)) |
|
- | 114 | self.slider_1_copy_3.SetBackgroundColour(wx.Colour(128, 128, 128)) |
|
- | 115 | # end wxGlade |
|
- | 116 | ||
- | 117 | def __do_layout(self): |
|
- | 118 | # begin wxGlade: MkSettingsDialog.__do_layout |
|
- | 119 | sizer_15 = wx.BoxSizer(wx.VERTICAL) |
|
- | 120 | sizer_21 = wx.BoxSizer(wx.HORIZONTAL) |
|
- | 121 | sizer_22 = wx.BoxSizer(wx.VERTICAL) |
|
- | 122 | sizer_25 = wx.BoxSizer(wx.HORIZONTAL) |
|
- | 123 | sizer_23 = wx.BoxSizer(wx.VERTICAL) |
|
- | 124 | sizer_24_copy_3 = wx.BoxSizer(wx.HORIZONTAL) |
|
- | 125 | sizer_24_copy_2 = wx.BoxSizer(wx.HORIZONTAL) |
|
- | 126 | sizer_24_copy_1 = wx.BoxSizer(wx.HORIZONTAL) |
|
- | 127 | sizer_24_copy = wx.BoxSizer(wx.HORIZONTAL) |
|
- | 128 | sizer_24 = wx.BoxSizer(wx.HORIZONTAL) |
|
- | 129 | sizer_21.Add((20, 20), 0, 0, 0) |
|
- | 130 | sizer_22.Add((20, 20), 0, 0, 0) |
|
- | 131 | sizer_24.Add(self.label_2, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
|
- | 132 | sizer_24.Add((20, 20), 0, 0, 0) |
|
- | 133 | sizer_24.Add(self.slider_GyroP, 0, 0, 0) |
|
- | 134 | sizer_23.Add(sizer_24, 1, wx.EXPAND, 0) |
|
- | 135 | sizer_23.Add((20, 20), 0, 0, 0) |
|
- | 136 | sizer_24_copy.Add(self.label_2_copy, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
|
- | 137 | sizer_24_copy.Add((20, 20), 0, 0, 0) |
|
- | 138 | sizer_24_copy.Add(self.slider_GyroI, 0, 0, 0) |
|
- | 139 | sizer_23.Add(sizer_24_copy, 1, wx.EXPAND, 0) |
|
- | 140 | sizer_23.Add((20, 20), 0, 0, 0) |
|
- | 141 | sizer_24_copy_1.Add(self.label_2_copy_1, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
|
- | 142 | sizer_24_copy_1.Add((20, 20), 0, 0, 0) |
|
- | 143 | sizer_24_copy_1.Add(self.slider_GyroD, 0, 0, 0) |
|
- | 144 | sizer_23.Add(sizer_24_copy_1, 1, wx.EXPAND, 0) |
|
- | 145 | sizer_23.Add((20, 20), 0, 0, 0) |
|
- | 146 | sizer_24_copy_2.Add(self.label_2_copy_2, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
|
- | 147 | sizer_24_copy_2.Add((20, 20), 0, 0, 0) |
|
- | 148 | sizer_24_copy_2.Add(self.slider_FactorI, 0, 0, 0) |
|
- | 149 | sizer_23.Add(sizer_24_copy_2, 1, wx.EXPAND, 0) |
|
- | 150 | sizer_23.Add((20, 20), 0, 0, 0) |
|
- | 151 | sizer_24_copy_3.Add(self.label_2_copy_3, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
|
- | 152 | sizer_24_copy_3.Add((20, 20), 0, 0, 0) |
|
- | 153 | sizer_24_copy_3.Add(self.slider_1_copy_3, 0, 0, 0) |
|
- | 154 | sizer_23.Add(sizer_24_copy_3, 1, wx.EXPAND, 0) |
|
- | 155 | sizer_23.Add((20, 20), 0, 0, 0) |
|
- | 156 | sizer_22.Add(sizer_23, 1, wx.EXPAND, 0) |
|
- | 157 | sizer_25.Add(self.loadButton, 0, 0, 0) |
|
- | 158 | sizer_25.Add((20, 20), 0, 0, 0) |
|
- | 159 | sizer_25.Add(self.storeButton, 0, 0, 0) |
|
- | 160 | sizer_25.Add((20, 20), 0, 0, 0) |
|
- | 161 | sizer_22.Add(sizer_25, 1, wx.EXPAND, 0) |
|
- | 162 | sizer_22.Add((20, 20), 0, 0, 0) |
|
- | 163 | sizer_21.Add(sizer_22, 0, 0, 0) |
|
- | 164 | sizer_21.Add((20, 20), 0, 0, 0) |
|
- | 165 | sizer_15.Add(sizer_21, 0, 0, 0) |
|
- | 166 | self.SetSizer(sizer_15) |
|
- | 167 | self.Layout() |
|
- | 168 | self.SetSize((600, 450)) |
|
- | 169 | # end wxGlade |
|
- | 170 | ||
- | 171 | def onLoad(self, event): # wxGlade: MkSettingsDialog.<event_handler> |
|
- | 172 | print "Loading MK Settings" |
|
- | 173 | ||
- | 174 | mk = MkProtocol.MkComm() |
|
- | 175 | mk.open(comPort=self.app.settings["serialport"].value) |
|
- | 176 | ||
- | 177 | msg = mk.getSettingsMsg() |
|
- | 178 | print "Index=",msg.getIndex() |
|
- | 179 | print "Name=",msg.getName() |
|
- | 180 | ||
- | 181 | self.slider_GyroP.SetValue(msg.getSetting(SettingsMsg.IDX_STICK_P)) |
|
- | 182 | self.slider_GyroP.SetValue(msg.getSetting(SettingsMsg.IDX_STICK_I)) |
|
- | 183 | self.slider_GyroP.SetValue(msg.getSetting(SettingsMsg.IDX_STICK_D)) |
|
- | 184 | ||
- | 185 | mk.close() |
|
- | 186 | ||
- | 187 | event.Skip() |
|
- | 188 | ||
- | 189 | ||
- | 190 | def setApp(self, app): |
|
- | 191 | self.app = app |
|
- | 192 | # end of class MkSettingsDialog |
|
- | 193 | ||
- | 194 | ||
- | 195 | ||
66 | 196 | ||
67 | class MeasureDialog(wx.Dialog): |
197 | class MeasureDialog(wx.Dialog): |
68 | def __init__(self, *args, **kwds): |
198 | def __init__(self, *args, **kwds): |
69 | # begin wxGlade: MeasureDialog.__init__ |
199 | # begin wxGlade: MeasureDialog.__init__ |
70 | kwds["style"] = wx.CAPTION|wx.RESIZE_BORDER|wx.THICK_FRAME |
200 | kwds["style"] = wx.CAPTION|wx.RESIZE_BORDER|wx.THICK_FRAME |
71 | wx.Dialog.__init__(self, *args, **kwds) |
201 | wx.Dialog.__init__(self, *args, **kwds) |
72 | self.text_ctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) |
202 | self.text_ctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) |
73 | self.button = wx.Button(self, -1, "STOP") |
203 | self.button = wx.Button(self, -1, "STOP") |
74 | self.voltageCtrl = speedmeter.SpeedMeter(self, extrastyle=speedmeter.SM_DRAW_HAND | speedmeter.SM_DRAW_PARTIAL_SECTORS | speedmeter.SM_DRAW_MIDDLE_ICON ) |
204 | self.voltageCtrl = speedmeter.SpeedMeter(self, extrastyle=speedmeter.SM_DRAW_HAND | speedmeter.SM_DRAW_PARTIAL_SECTORS | speedmeter.SM_DRAW_MIDDLE_ICON ) |
75 | self.speedCtrl = speedmeter.SpeedMeter(self, extrastyle=speedmeter.SM_DRAW_HAND | speedmeter.SM_DRAW_PARTIAL_SECTORS | speedmeter.SM_DRAW_MIDDLE_TEXT | speedmeter.SM_DRAW_SECONDARY_TICKS) |
205 | self.speedCtrl = speedmeter.SpeedMeter(self, extrastyle=speedmeter.SM_DRAW_HAND | speedmeter.SM_DRAW_PARTIAL_SECTORS | speedmeter.SM_DRAW_MIDDLE_TEXT | speedmeter.SM_DRAW_SECONDARY_TICKS) |
76 | 206 | ||
77 | self.__set_properties() |
207 | self.__set_properties() |
78 | self.__do_layout() |
208 | self.__do_layout() |
79 | 209 | ||
80 | self.Bind(wx.EVT_BUTTON, self.onButton, self.button) |
210 | self.Bind(wx.EVT_BUTTON, self.onButton, self.button) |
81 | # end wxGlade |
211 | # end wxGlade |
82 | 212 | ||
83 | self.button.SetFocus() |
213 | self.button.SetFocus() |
84 | 214 | ||
85 | self.running = True |
215 | self.running = True |
86 | self.Bind(EVT_MEAS_STATUS_UPDATE, self.OnUpdate) |
216 | self.Bind(EVT_MEAS_STATUS_UPDATE, self.OnUpdate) |
87 | self.Bind(EVT_MEAS_DATA, self.OnData) |
217 | self.Bind(EVT_MEAS_DATA, self.OnData) |
88 | # The first argument that is passed to the constructor is the parent |
218 | # The first argument that is passed to the constructor is the parent |
89 | self.app = args[0].app |
219 | self.app = args[0].app |
90 | self.error = False |
220 | self.error = False |
91 | self.firstVoltage = True |
221 | self.firstVoltage = True |
92 | 222 | ||
93 | 223 | ||
94 | def __set_properties(self): |
224 | def __set_properties(self): |
95 | # begin wxGlade: MeasureDialog.__set_properties |
225 | # begin wxGlade: MeasureDialog.__set_properties |
96 | self.SetTitle("Measuring Status") |
226 | self.SetTitle("Measuring Status") |
97 | self.text_ctrl_1.SetMinSize((400,300)) |
227 | self.text_ctrl_1.SetMinSize((400,300)) |
98 | self.voltageCtrl.SetMinSize((50,-1)) |
228 | self.voltageCtrl.SetMinSize((50,-1)) |
99 | self.speedCtrl.SetMinSize((50,-1)) |
229 | self.speedCtrl.SetMinSize((50,-1)) |
100 | # end wxGlade |
230 | # end wxGlade |
101 | 231 | ||
102 | # Configure Voltage Ctrl |
232 | # Configure Voltage Ctrl |
103 | self.voltageCtrl.SetAngleRange(0,pi) |
233 | self.voltageCtrl.SetAngleRange(0,pi) |
104 | intervals = range(0, 5) |
234 | intervals = range(0, 5) |
105 | self.voltageCtrl.SetIntervals(intervals) |
235 | self.voltageCtrl.SetIntervals(intervals) |
106 | colours = [wx.RED, wx.GREEN, wx.GREEN, COLOR_YELLOW] |
236 | colours = [wx.RED, wx.GREEN, wx.GREEN, COLOR_YELLOW] |
107 | self.voltageCtrl.SetIntervalColours(colours) |
237 | self.voltageCtrl.SetIntervalColours(colours) |
108 | ticks = ["", "", "", "", ""] |
238 | ticks = ["", "", "", "", ""] |
109 | self.voltageCtrl.SetTicks(ticks) |
239 | self.voltageCtrl.SetTicks(ticks) |
110 | self.voltageCtrl.SetTicksColour(wx.WHITE) |
240 | self.voltageCtrl.SetTicksColour(wx.WHITE) |
111 | self.voltageCtrl.SetHandColour(COLOR_YELLOW) |
241 | self.voltageCtrl.SetHandColour(COLOR_YELLOW) |
112 | 242 | ||
113 | icon = wx.Icon("%s/Resources/fuel.ico" % rootPath, wx.BITMAP_TYPE_ICO) |
243 | icon = wx.Icon("%s/Resources/fuel.ico" % rootPath, wx.BITMAP_TYPE_ICO) |
114 | icon.SetWidth(24) |
244 | icon.SetWidth(24) |
115 | icon.SetHeight(24) |
245 | icon.SetHeight(24) |
116 | 246 | ||
117 | self.voltageCtrl.SetMiddleIcon(icon) |
247 | self.voltageCtrl.SetMiddleIcon(icon) |
118 | self.voltageCtrl.SetSpeedBackground(COLOR_BACKGROUND) |
248 | self.voltageCtrl.SetSpeedBackground(COLOR_BACKGROUND) |
119 | self.voltageCtrl.SetArcColour(wx.WHITE) |
249 | self.voltageCtrl.SetArcColour(wx.WHITE) |
120 | self.voltageCtrl.SetSpeedValue(2) |
250 | self.voltageCtrl.SetSpeedValue(2) |
121 | 251 | ||
122 | # Configure Speed Ctr; |
252 | # Configure Speed Ctr; |
123 | self.speedCtrl.SetAngleRange(0,pi) |
253 | self.speedCtrl.SetAngleRange(0,pi) |
124 | intervals = range(0, 261, 20) |
254 | intervals = range(0, 261, 20) |
125 | self.speedCtrl.SetIntervals(intervals) |
255 | self.speedCtrl.SetIntervals(intervals) |
126 | 256 | ||
127 | colours = [COLOR_BACKGROUND]*(len(intervals)-1) |
257 | colours = [COLOR_BACKGROUND]*(len(intervals)-1) |
128 | for i in range(5,10): |
258 | for i in range(5,10): |
129 | colours[i] = wx.GREEN |
259 | colours[i] = wx.GREEN |
130 | self.speedCtrl.SetIntervalColours(colours) |
260 | self.speedCtrl.SetIntervalColours(colours) |
131 | ticks = [str(interval) for interval in intervals] |
261 | ticks = [str(interval) for interval in intervals] |
132 | self.speedCtrl.SetTicks(ticks) |
262 | self.speedCtrl.SetTicks(ticks) |
133 | self.speedCtrl.SetTicksColour(wx.WHITE) |
263 | self.speedCtrl.SetTicksColour(wx.WHITE) |
134 | self.speedCtrl.SetNumberOfSecondaryTicks(1) |
264 | self.speedCtrl.SetNumberOfSecondaryTicks(1) |
135 | self.speedCtrl.SetTicksFont(wx.Font(7, wx.SWISS, wx.NORMAL, wx.NORMAL)) |
265 | self.speedCtrl.SetTicksFont(wx.Font(7, wx.SWISS, wx.NORMAL, wx.NORMAL)) |
136 | self.speedCtrl.SetMiddleText("Speed") |
266 | self.speedCtrl.SetMiddleText("Speed") |
137 | self.speedCtrl.SetMiddleTextColour(wx.WHITE) |
267 | self.speedCtrl.SetMiddleTextColour(wx.WHITE) |
138 | self.speedCtrl.SetMiddleTextFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD)) |
268 | self.speedCtrl.SetMiddleTextFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD)) |
139 | self.speedCtrl.SetHandColour(COLOR_YELLOW) |
269 | self.speedCtrl.SetHandColour(COLOR_YELLOW) |
140 | self.speedCtrl.SetSpeedBackground(COLOR_BACKGROUND) |
270 | self.speedCtrl.SetSpeedBackground(COLOR_BACKGROUND) |
141 | self.speedCtrl.SetArcColour(wx.WHITE) |
271 | self.speedCtrl.SetArcColour(wx.WHITE) |
142 | self.speedCtrl.SetSpeedValue(0) |
272 | self.speedCtrl.SetSpeedValue(0) |
143 | 273 | ||
144 | 274 | ||
145 | def __do_layout(self): |
275 | def __do_layout(self): |
146 | # begin wxGlade: MeasureDialog.__do_layout |
276 | # begin wxGlade: MeasureDialog.__do_layout |
147 | sizer_1 = wx.BoxSizer(wx.HORIZONTAL) |
277 | sizer_1 = wx.BoxSizer(wx.HORIZONTAL) |
148 | sizer_4 = wx.BoxSizer(wx.VERTICAL) |
278 | sizer_4 = wx.BoxSizer(wx.VERTICAL) |
149 | sizer_2 = wx.BoxSizer(wx.VERTICAL) |
279 | sizer_2 = wx.BoxSizer(wx.VERTICAL) |
150 | sizer_1.Add((20, 20), 0, 0, 0) |
280 | sizer_1.Add((20, 20), 0, 0, 0) |
151 | sizer_2.Add((20, 20), 0, 0, 0) |
281 | sizer_2.Add((20, 20), 0, 0, 0) |
152 | sizer_2.Add(self.text_ctrl_1, 1, wx.EXPAND, 0) |
282 | sizer_2.Add(self.text_ctrl_1, 1, wx.EXPAND, 0) |
153 | sizer_2.Add((20, 20), 0, 0, 0) |
283 | sizer_2.Add((20, 20), 0, 0, 0) |
154 | sizer_2.Add(self.button, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) |
284 | sizer_2.Add(self.button, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) |
155 | sizer_2.Add((20, 20), 0, 0, 0) |
285 | sizer_2.Add((20, 20), 0, 0, 0) |
156 | sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) |
286 | sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) |
157 | sizer_1.Add((20, 20), 0, 0, 0) |
287 | sizer_1.Add((20, 20), 0, 0, 0) |
158 | sizer_4.Add(self.voltageCtrl, 1, wx.EXPAND, 0) |
288 | sizer_4.Add(self.voltageCtrl, 1, wx.EXPAND, 0) |
159 | sizer_4.Add(self.speedCtrl, 1, wx.EXPAND, 0) |
289 | sizer_4.Add(self.speedCtrl, 1, wx.EXPAND, 0) |
160 | sizer_1.Add(sizer_4, 1, wx.EXPAND, 0) |
290 | sizer_1.Add(sizer_4, 1, wx.EXPAND, 0) |
161 | sizer_1.Add((20, 20), 0, 0, 0) |
291 | sizer_1.Add((20, 20), 0, 0, 0) |
162 | self.SetSizer(sizer_1) |
292 | self.SetSizer(sizer_1) |
163 | sizer_1.Fit(self) |
293 | sizer_1.Fit(self) |
164 | self.Layout() |
294 | self.Layout() |
165 | # end wxGlade |
295 | # end wxGlade |
166 | 296 | ||
167 | def OnData(self, evt): |
297 | def OnData(self, evt): |
168 | print "Received Data" |
298 | print "Received Data" |
169 | self.app.AddTest2(evt.vibTest) |
299 | self.app.AddTest2(evt.vibTest) |
170 | 300 | ||
171 | def OnUpdate(self, evt): |
301 | def OnUpdate(self, evt): |
172 | print "Status update" |
302 | print "Status update" |
173 | self.running = evt.running |
303 | self.running = evt.running |
174 | if evt.error: |
304 | if evt.error: |
175 | self.error = True; |
305 | self.error = True; |
176 | self.text_ctrl_1.WriteText("ERROR: ") |
306 | self.text_ctrl_1.WriteText("ERROR: ") |
177 | self.text_ctrl_1.SetBackgroundColour("Red") |
307 | self.text_ctrl_1.SetBackgroundColour("Red") |
178 | self.text_ctrl_1.WriteText("%s\n"%evt.msg) |
308 | self.text_ctrl_1.WriteText("%s\n"%evt.msg) |
179 | if (not self.running): |
309 | if (not self.running): |
180 | if (not self.error): |
310 | if (not self.error): |
181 | self.text_ctrl_1.SetBackgroundColour("Green") |
311 | self.text_ctrl_1.SetBackgroundColour("Green") |
182 | self.text_ctrl_1.write(" ") # so that the background is redrawn |
312 | self.text_ctrl_1.write(" ") # so that the background is redrawn |
183 | self.button.SetLabel("Close") |
313 | self.button.SetLabel("Close") |
184 | 314 | ||
185 | if evt.speed != None: |
315 | if evt.speed != None: |
186 | self.speedCtrl.SetSpeedValue(evt.speed) |
316 | self.speedCtrl.SetSpeedValue(evt.speed) |
187 | 317 | ||
188 | if evt.voltage != None: |
318 | if evt.voltage != None: |
189 | vmin,vmax,v = evt.voltage |
319 | vmin,vmax,v = evt.voltage |
190 | if self.firstVoltage: |
320 | if self.firstVoltage: |
191 | ticks = ["", "%.1f V"%vmin, "", "%.1f V"%vmax, ""] |
321 | ticks = ["", "%.1f V"%vmin, "", "%.1f V"%vmax, ""] |
192 | self.voltageCtrl.SetTicks(ticks) |
322 | self.voltageCtrl.SetTicks(ticks) |
193 | self.firstVoltage = False |
323 | self.firstVoltage = False |
194 | i = (v-vmin)/(vmax-vmin) # 0..1 |
324 | i = (v-vmin)/(vmax-vmin) # 0..1 |
195 | i *= 2 |
325 | i *= 2 |
196 | i = i+1 |
326 | i = i+1 |
197 | i = min(max(i,0),4) |
327 | i = min(max(i,0),4) |
198 | self.voltageCtrl.SetSpeedValue(i) |
328 | self.voltageCtrl.SetSpeedValue(i) |
199 | 329 | ||
200 | 330 | ||
201 | 331 | ||
202 | def onButton(self, event): # wxGlade: MeasureDialog.<event_handler> |
332 | def onButton(self, event): # wxGlade: MeasureDialog.<event_handler> |
203 | if (not self.running): |
333 | if (not self.running): |
204 | self.Destroy() |
334 | self.Destroy() |
205 | else: |
335 | else: |
206 | self.app.cancelMeasurement() |
336 | self.app.cancelMeasurement() |
207 | 337 | ||
208 | # end of class MeasureDialog |
338 | # end of class MeasureDialog |
209 | 339 | ||
210 | 340 | ||
211 | class SettingsDialog(wx.Dialog): |
341 | class SettingsDialog(wx.Dialog): |
212 | def __init__(self, *args, **kwds): |
342 | def __init__(self, *args, **kwds): |
213 | # begin wxGlade: SettingsDialog.__init__ |
343 | # begin wxGlade: SettingsDialog.__init__ |
214 | kwds["style"] = wx.DEFAULT_DIALOG_STYLE |
344 | kwds["style"] = wx.DEFAULT_DIALOG_STYLE |
215 | wx.Dialog.__init__(self, *args, **kwds) |
345 | wx.Dialog.__init__(self, *args, **kwds) |
216 | self.button_5 = wx.Button(self, wx.ID_CANCEL, "") |
346 | self.button_5 = wx.Button(self, wx.ID_CANCEL, "") |
217 | self.button_6 = wx.Button(self, wx.ID_OK, "") |
347 | self.button_6 = wx.Button(self, wx.ID_OK, "") |
218 | 348 | ||
219 | self.__set_properties() |
349 | self.__set_properties() |
220 | self.__do_layout() |
350 | self.__do_layout() |
221 | 351 | ||
222 | self.Bind(wx.EVT_BUTTON, self.onOK, self.button_6) |
352 | self.Bind(wx.EVT_BUTTON, self.onOK, self.button_6) |
223 | # end wxGlade |
353 | # end wxGlade |
224 | 354 | ||
225 | # The first argument that is passed to the constructor is the parent |
355 | # The first argument that is passed to the constructor is the parent |
226 | self.settings = args[0].app.settings |
356 | self.settings = args[0].app.settings |
227 | # Add text-boxes for all settings |
357 | # Add text-boxes for all settings |
228 | self.tb = [] |
358 | self.tb = [] |
229 | self.grid_sizer_2.SetRows(len(self.settings)) |
359 | self.grid_sizer_2.SetRows(len(self.settings)) |
230 | for setting in self.settings.iteritems(): |
360 | for setting in self.settings.iteritems(): |
231 | lb = wx.StaticText(self, -1, setting[1].descr, style=wx.ALIGN_RIGHT) |
361 | lb = wx.StaticText(self, -1, setting[1].descr, style=wx.ALIGN_RIGHT) |
232 | tb = wx.TextCtrl(self, -1, str(setting[1].value)) |
362 | tb = wx.TextCtrl(self, -1, str(setting[1].value)) |
233 | self.grid_sizer_2.Add(lb, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
363 | self.grid_sizer_2.Add(lb, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
234 | self.grid_sizer_2.Add(tb, 0, 0, 0) |
364 | self.grid_sizer_2.Add(tb, 0, 0, 0) |
235 | self.tb.append(tb) |
365 | self.tb.append(tb) |
236 | self.sizer_5.Fit(self) |
366 | self.sizer_5.Fit(self) |
237 | self.Layout() |
367 | self.Layout() |
238 | 368 | ||
239 | def __set_properties(self): |
369 | def __set_properties(self): |
240 | # begin wxGlade: SettingsDialog.__set_properties |
370 | # begin wxGlade: SettingsDialog.__set_properties |
241 | self.SetTitle("Settings") |
371 | self.SetTitle("Settings") |
242 | # end wxGlade |
372 | # end wxGlade |
243 | 373 | ||
244 | def __do_layout(self): |
374 | def __do_layout(self): |
245 | # begin wxGlade: SettingsDialog.__do_layout |
375 | # begin wxGlade: SettingsDialog.__do_layout |
246 | sizer_5 = wx.BoxSizer(wx.VERTICAL) |
376 | sizer_5 = wx.BoxSizer(wx.VERTICAL) |
247 | grid_sizer_3 = wx.GridSizer(1, 2, 0, 0) |
377 | grid_sizer_3 = wx.GridSizer(1, 2, 0, 0) |
248 | sizer_6 = wx.BoxSizer(wx.HORIZONTAL) |
378 | sizer_6 = wx.BoxSizer(wx.HORIZONTAL) |
249 | grid_sizer_2 = wx.GridSizer(1, 2, 4, 4) |
379 | grid_sizer_2 = wx.GridSizer(1, 2, 4, 4) |
250 | sizer_5.Add((20, 20), 0, 0, 0) |
380 | sizer_5.Add((20, 20), 0, 0, 0) |
251 | sizer_6.Add((20, 20), 0, 0, 0) |
381 | sizer_6.Add((20, 20), 0, 0, 0) |
252 | sizer_6.Add(grid_sizer_2, 0, 0, 0) |
382 | sizer_6.Add(grid_sizer_2, 0, 0, 0) |
253 | sizer_6.Add((20, 20), 0, 0, 0) |
383 | sizer_6.Add((20, 20), 0, 0, 0) |
254 | sizer_5.Add(sizer_6, 1, wx.EXPAND, 0) |
384 | sizer_5.Add(sizer_6, 1, wx.EXPAND, 0) |
255 | sizer_5.Add((20, 20), 0, 0, 0) |
385 | sizer_5.Add((20, 20), 0, 0, 0) |
256 | grid_sizer_3.Add(self.button_5, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) |
386 | grid_sizer_3.Add(self.button_5, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) |
257 | grid_sizer_3.Add(self.button_6, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) |
387 | grid_sizer_3.Add(self.button_6, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) |
258 | sizer_5.Add(grid_sizer_3, 0, wx.EXPAND, 0) |
388 | sizer_5.Add(grid_sizer_3, 0, wx.EXPAND, 0) |
259 | sizer_5.Add((20, 20), 0, 0, 0) |
389 | sizer_5.Add((20, 20), 0, 0, 0) |
260 | self.SetSizer(sizer_5) |
390 | self.SetSizer(sizer_5) |
261 | sizer_5.Fit(self) |
391 | sizer_5.Fit(self) |
262 | self.Layout() |
392 | self.Layout() |
263 | # end wxGlade |
393 | # end wxGlade |
264 | 394 | ||
265 | # Store some of the items, we will need them later |
395 | # Store some of the items, we will need them later |
266 | self.grid_sizer_2 = grid_sizer_2 |
396 | self.grid_sizer_2 = grid_sizer_2 |
267 | self.sizer_5 = sizer_5 |
397 | self.sizer_5 = sizer_5 |
268 | 398 | ||
269 | 399 | ||
270 | def onOK(self, event): # wxGlade: SettingsDialog.<event_handler> |
400 | def onOK(self, event): # wxGlade: SettingsDialog.<event_handler> |
271 | print "Updating parameters" |
401 | print "Updating parameters" |
272 | try: |
402 | try: |
273 | i=0 |
403 | i=0 |
274 | for setting in self.settings.iteritems(): |
404 | for setting in self.settings.iteritems(): |
275 | print setting[0], self.tb[i].GetValue() |
405 | print setting[0], self.tb[i].GetValue() |
276 | setting[1].set(self.tb[i].GetValue()) |
406 | setting[1].set(self.tb[i].GetValue()) |
277 | i += 1 |
407 | i += 1 |
278 | event.Skip() |
408 | event.Skip() |
279 | except: |
409 | except: |
280 | wx.MessageBox("Invalid format for \"%s\" setting." % setting[1].descr) |
410 | wx.MessageBox("Invalid format for \"%s\" setting." % setting[1].descr) |
281 | 411 | ||
282 | # end of class SettingsDialog |
412 | # end of class SettingsDialog |
283 | 413 | ||
284 | 414 | ||
285 | 415 | ||
286 | class MainFrame(wx.Frame): |
416 | class MainFrame(wx.Frame): |
287 | def __init__(self, *args, **kwds): |
417 | def __init__(self, *args, **kwds): |
288 | # begin wxGlade: MainFrame.__init__ |
418 | # begin wxGlade: MainFrame.__init__ |
289 | kwds["style"] = wx.DEFAULT_FRAME_STYLE |
419 | kwds["style"] = wx.DEFAULT_FRAME_STYLE |
290 | wx.Frame.__init__(self, *args, **kwds) |
420 | wx.Frame.__init__(self, *args, **kwds) |
291 | 421 | ||
292 | # Menu Bar |
422 | # Menu Bar |
293 | self.frame_1_menubar = wx.MenuBar() |
423 | self.frame_1_menubar = wx.MenuBar() |
294 | wxglade_tmp_menu = wx.Menu() |
424 | wxglade_tmp_menu = wx.Menu() |
295 | wxglade_tmp_menu.Append(101, "Settings", "", wx.ITEM_NORMAL) |
425 | wxglade_tmp_menu.Append(101, "Settings", "", wx.ITEM_NORMAL) |
296 | wxglade_tmp_menu.AppendSeparator() |
426 | wxglade_tmp_menu.AppendSeparator() |
297 | wxglade_tmp_menu.Append(150, "Exit", "", wx.ITEM_NORMAL) |
427 | wxglade_tmp_menu.Append(150, "Exit", "", wx.ITEM_NORMAL) |
298 | self.frame_1_menubar.Append(wxglade_tmp_menu, "&File") |
428 | self.frame_1_menubar.Append(wxglade_tmp_menu, "&File") |
299 | wxglade_tmp_menu = wx.Menu() |
429 | wxglade_tmp_menu = wx.Menu() |
300 | wxglade_tmp_menu.Append(301, "Delete All\tAlt+D", "", wx.ITEM_NORMAL) |
430 | wxglade_tmp_menu.Append(301, "Delete All\tAlt+D", "", wx.ITEM_NORMAL) |
301 | wxglade_tmp_menu.Append(302, "Delete Selected\tCtrl+D", "", wx.ITEM_NORMAL) |
431 | wxglade_tmp_menu.Append(302, "Delete Selected\tCtrl+D", "", wx.ITEM_NORMAL) |
302 | wxglade_tmp_menu.AppendSeparator() |
432 | wxglade_tmp_menu.AppendSeparator() |
303 | wxglade_tmp_menu.Append(310, "Select All\tCtrl+A", "", wx.ITEM_NORMAL) |
433 | wxglade_tmp_menu.Append(310, "Select All\tCtrl+A", "", wx.ITEM_NORMAL) |
304 | wxglade_tmp_menu.AppendSeparator() |
434 | wxglade_tmp_menu.AppendSeparator() |
305 | wxglade_tmp_menu.Append(303, "Load\tCtrl+L", "", wx.ITEM_NORMAL) |
435 | wxglade_tmp_menu.Append(303, "Load\tCtrl+L", "", wx.ITEM_NORMAL) |
306 | wxglade_tmp_menu.Append(304, "Save\tCtrl+S", "", wx.ITEM_NORMAL) |
436 | wxglade_tmp_menu.Append(304, "Save\tCtrl+S", "", wx.ITEM_NORMAL) |
307 | self.frame_1_menubar.Append(wxglade_tmp_menu, "TestSet") |
437 | self.frame_1_menubar.Append(wxglade_tmp_menu, "TestSet") |
308 | wxglade_tmp_menu = wx.Menu() |
438 | wxglade_tmp_menu = wx.Menu() |
309 | wxglade_tmp_menu.Append(401, "Flash VibTest FC software", "", wx.ITEM_NORMAL) |
439 | wxglade_tmp_menu.Append(401, "Flash VibTest FC software", "", wx.ITEM_NORMAL) |
310 | wxglade_tmp_menu.Append(402, "Restore original FC software", "", wx.ITEM_NORMAL) |
440 | wxglade_tmp_menu.Append(402, "Restore original FC software", "", wx.ITEM_NORMAL) |
311 | self.frame_1_menubar.Append(wxglade_tmp_menu, "MK") |
441 | self.frame_1_menubar.Append(wxglade_tmp_menu, "MK") |
312 | wxglade_tmp_menu = wx.Menu() |
442 | wxglade_tmp_menu = wx.Menu() |
313 | wxglade_tmp_menu.Append(1099, "About", "", wx.ITEM_NORMAL) |
443 | wxglade_tmp_menu.Append(1099, "About", "", wx.ITEM_NORMAL) |
314 | self.frame_1_menubar.Append(wxglade_tmp_menu, "Help") |
444 | self.frame_1_menubar.Append(wxglade_tmp_menu, "Help") |
315 | self.SetMenuBar(self.frame_1_menubar) |
445 | self.SetMenuBar(self.frame_1_menubar) |
316 | # Menu Bar end |
446 | # Menu Bar end |
317 | self.label_1 = wx.StaticText(self, -1, "Test Description :", style=wx.ALIGN_RIGHT) |
447 | self.label_1 = wx.StaticText(self, -1, "Test Description :", style=wx.ALIGN_RIGHT) |
318 | self.descrCtrl = wx.TextCtrl(self, -1, "N/A") |
448 | self.descrCtrl = wx.TextCtrl(self, -1, "N/A") |
319 | self.label_1_copy = wx.StaticText(self, -1, "Channel(s) :", style=wx.ALIGN_RIGHT) |
449 | self.label_1_copy = wx.StaticText(self, -1, "Channel(s) :", style=wx.ALIGN_RIGHT) |
320 | self.gyroYawCb = wx.CheckBox(self, -1, "Gyro Yaw") |
450 | self.gyroYawCb = wx.CheckBox(self, -1, "Gyro Yaw") |
321 | self.gyroRollCb = wx.CheckBox(self, -1, "Gyro Roll") |
451 | self.gyroRollCb = wx.CheckBox(self, -1, "Gyro Roll") |
322 | self.gyroNickCb = wx.CheckBox(self, -1, "Gyro Nick") |
452 | self.gyroNickCb = wx.CheckBox(self, -1, "Gyro Nick") |
323 | self.accTopCb = wx.CheckBox(self, -1, "ACC Top") |
453 | self.accTopCb = wx.CheckBox(self, -1, "ACC Top") |
324 | self.accRollCb = wx.CheckBox(self, -1, "ACC Roll") |
454 | self.accRollCb = wx.CheckBox(self, -1, "ACC Roll") |
325 | self.accNickCb = wx.CheckBox(self, -1, "ACC Nick") |
455 | self.accNickCb = wx.CheckBox(self, -1, "ACC Nick") |
326 | self.label_3 = wx.StaticText(self, -1, "Motor(s) :", style=wx.ALIGN_RIGHT) |
456 | self.label_3 = wx.StaticText(self, -1, "Motor(s) :", style=wx.ALIGN_RIGHT) |
327 | self.motorsCtrl = wx.TextCtrl(self, -1, "1") |
457 | self.motorsCtrl = wx.TextCtrl(self, -1, "1") |
328 | self.label_4 = wx.StaticText(self, -1, "Speed(s) :") |
458 | self.label_4 = wx.StaticText(self, -1, "Speed(s) :") |
329 | self.speedCtrl = wx.TextCtrl(self, -1, "100-200:10") |
459 | self.speedCtrl = wx.TextCtrl(self, -1, "100-200:10") |
330 | self.bitmap_button_1 = wx.BitmapButton(self, -1, wx.Bitmap("Resources\\Fairytale_player_play.png", wx.BITMAP_TYPE_ANY)) |
460 | self.bitmap_button_1 = wx.BitmapButton(self, -1, wx.Bitmap("Resources\\Fairytale_player_play.png", wx.BITMAP_TYPE_ANY)) |
331 | self.static_line_1 = wx.StaticLine(self, -1) |
461 | self.static_line_1 = wx.StaticLine(self, -1) |
332 | self.graphCtrl = wx.lib.plot.PlotCanvas(self, size=(800,300)) |
462 | self.graphCtrl = wx.lib.plot.PlotCanvas(self, size=(800,300)) |
333 | self.label_40 = wx.StaticText(self, -1, "Graph Type ") |
463 | self.label_40 = wx.StaticText(self, -1, "Graph Type ") |
334 | self.graphTypeChoice = wx.Choice(self, -1, choices=["Raw Signal", "Filtered Signal", "Spectrum"]) |
464 | self.graphTypeChoice = wx.Choice(self, -1, choices=["Raw Signal", "Filtered Signal", "Spectrum"]) |
335 | self.label_41 = wx.StaticText(self, -1, "Y Axis Range ") |
465 | self.label_41 = wx.StaticText(self, -1, "Y Axis Range ") |
336 | self.yAxisChoice = wx.Choice(self, -1, choices=["10", "25", "50", "75", "100", "200", "500", "1000", "2000"]) |
466 | self.yAxisChoice = wx.Choice(self, -1, choices=["10", "25", "50", "75", "100", "200", "500", "1000", "2000"]) |
337 | self.copyGraphButton = wx.Button(self, -1, "Copy Graph Data") |
467 | self.copyGraphButton = wx.Button(self, -1, "Copy Graph Data") |
338 | self.TestListCtrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) |
468 | self.TestListCtrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) |
339 | 469 | ||
340 | self.__set_properties() |
470 | self.__set_properties() |
341 | self.__do_layout() |
471 | self.__do_layout() |
342 | 472 | ||
343 | self.Bind(wx.EVT_MENU, self.OnSettings, id=101) |
473 | self.Bind(wx.EVT_MENU, self.OnSettings, id=101) |
344 | self.Bind(wx.EVT_MENU, self.onExit, id=150) |
474 | self.Bind(wx.EVT_MENU, self.onExit, id=150) |
345 | self.Bind(wx.EVT_MENU, self.onClear, id=301) |
475 | self.Bind(wx.EVT_MENU, self.onClear, id=301) |
346 | self.Bind(wx.EVT_MENU, self.onClearSelected, id=302) |
476 | self.Bind(wx.EVT_MENU, self.onClearSelected, id=302) |
347 | self.Bind(wx.EVT_MENU, self.onSelectAll, id=310) |
477 | self.Bind(wx.EVT_MENU, self.onSelectAll, id=310) |
348 | self.Bind(wx.EVT_MENU, self.OnImport, id=303) |
478 | self.Bind(wx.EVT_MENU, self.OnImport, id=303) |
349 | self.Bind(wx.EVT_MENU, self.onExport, id=304) |
479 | self.Bind(wx.EVT_MENU, self.onExport, id=304) |
350 | self.Bind(wx.EVT_MENU, self.onAbout, id=1099) |
480 | self.Bind(wx.EVT_MENU, self.onAbout, id=1099) |
351 | self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.bitmap_button_1) |
481 | self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.bitmap_button_1) |
352 | self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice) |
482 | self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice) |
353 | self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice) |
483 | self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice) |
354 | self.Bind(wx.EVT_BUTTON, self.onCopyGraphData, self.copyGraphButton) |
484 | self.Bind(wx.EVT_BUTTON, self.onCopyGraphData, self.copyGraphButton) |
355 | # end wxGlade |
485 | # end wxGlade |
356 | favicon = wx.Icon('%s/Resources/60px-Procman.ico' % rootPath, wx.BITMAP_TYPE_ICO, 32, 32) |
486 | favicon = wx.Icon('%s/Resources/60px-Procman.ico' % rootPath, wx.BITMAP_TYPE_ICO, 32, 32) |
357 | wx.Frame.SetIcon(self, favicon) |
487 | wx.Frame.SetIcon(self, favicon) |
358 | self.graphCtrl.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) |
488 | self.graphCtrl.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) |
359 | self.measureState = 0 |
489 | self.measureState = 0 |
360 | 490 | ||
361 | 491 | ||
362 | def setApp(self, app): |
492 | def setApp(self, app): |
363 | self.app = app |
493 | self.app = app |
364 | 494 | ||
365 | def __set_properties(self): |
495 | def __set_properties(self): |
366 | # begin wxGlade: MainFrame.__set_properties |
496 | # begin wxGlade: MainFrame.__set_properties |
367 | self.SetTitle("VibrationTest") |
497 | self.SetTitle("VibrationTest") |
368 | self.SetSize((850, 700)) |
498 | self.SetSize((850, 700)) |
369 | self.label_1.SetMinSize((110, -1)) |
499 | self.label_1.SetMinSize((110, -1)) |
370 | self.label_1.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
500 | self.label_1.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
371 | self.descrCtrl.SetMinSize((350, -1)) |
501 | self.descrCtrl.SetMinSize((350, -1)) |
372 | self.label_1_copy.SetMinSize((110, -1)) |
502 | self.label_1_copy.SetMinSize((110, -1)) |
373 | self.label_1_copy.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
503 | self.label_1_copy.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
374 | self.gyroYawCb.SetMinSize((100, -1)) |
504 | self.gyroYawCb.SetMinSize((100, -1)) |
375 | self.gyroYawCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
505 | self.gyroYawCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
376 | self.gyroRollCb.SetMinSize((100, -1)) |
506 | self.gyroRollCb.SetMinSize((100, -1)) |
377 | self.gyroRollCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
507 | self.gyroRollCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
378 | self.gyroNickCb.SetMinSize((100, -1)) |
508 | self.gyroNickCb.SetMinSize((100, -1)) |
379 | self.gyroNickCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
509 | self.gyroNickCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
380 | self.accTopCb.SetMinSize((100, -1)) |
510 | self.accTopCb.SetMinSize((100, -1)) |
381 | self.accTopCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
511 | self.accTopCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
382 | self.accRollCb.SetMinSize((100, -1)) |
512 | self.accRollCb.SetMinSize((100, -1)) |
383 | self.accRollCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
513 | self.accRollCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
384 | self.accRollCb.SetValue(1) |
514 | self.accRollCb.SetValue(1) |
385 | self.accNickCb.SetMinSize((100, -1)) |
515 | self.accNickCb.SetMinSize((100, -1)) |
386 | self.accNickCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
516 | self.accNickCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
387 | self.label_3.SetMinSize((110, -1)) |
517 | self.label_3.SetMinSize((110, -1)) |
388 | self.label_3.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
518 | self.label_3.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
389 | self.label_4.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
519 | self.label_4.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
390 | self.speedCtrl.SetToolTipString("e.g. \n 100 \n 100,150 \n 100-200:10 \n 50,100-200:10 \n 5*100,5*200") |
520 | self.speedCtrl.SetToolTipString("e.g. \n 100 \n 100,150 \n 100-200:10 \n 50,100-200:10 \n 5*100,5*200") |
391 | self.bitmap_button_1.SetToolTipString("Start Measurement") |
521 | self.bitmap_button_1.SetToolTipString("Start Measurement") |
392 | self.bitmap_button_1.SetSize(self.bitmap_button_1.GetBestSize()) |
522 | self.bitmap_button_1.SetSize(self.bitmap_button_1.GetBestSize()) |
393 | self.static_line_1.SetMinSize((800,3)) |
523 | self.static_line_1.SetMinSize((800,3)) |
394 | self.graphCtrl.SetMinSize((800,300)) |
524 | self.graphCtrl.SetMinSize((800,300)) |
395 | self.label_40.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
525 | self.label_40.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
396 | self.graphTypeChoice.SetSelection(0) |
526 | self.graphTypeChoice.SetSelection(0) |
397 | self.label_41.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
527 | self.label_41.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
398 | self.yAxisChoice.SetSelection(1) |
528 | self.yAxisChoice.SetSelection(1) |
399 | self.copyGraphButton.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
529 | self.copyGraphButton.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
400 | self.TestListCtrl.SetMinSize((800,300)) |
530 | self.TestListCtrl.SetMinSize((800,300)) |
401 | self.TestListCtrl.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
531 | self.TestListCtrl.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) |
402 | # end wxGlade |
532 | # end wxGlade |
403 | 533 | ||
404 | def __do_layout(self): |
534 | def __do_layout(self): |
405 | # begin wxGlade: MainFrame.__do_layout |
535 | # begin wxGlade: MainFrame.__do_layout |
406 | sizer_3 = wx.BoxSizer(wx.HORIZONTAL) |
536 | sizer_3 = wx.BoxSizer(wx.HORIZONTAL) |
407 | sizer_8 = wx.BoxSizer(wx.VERTICAL) |
537 | sizer_8 = wx.BoxSizer(wx.VERTICAL) |
408 | sizer_11 = wx.BoxSizer(wx.VERTICAL) |
538 | sizer_11 = wx.BoxSizer(wx.VERTICAL) |
409 | sizer_12 = wx.BoxSizer(wx.HORIZONTAL) |
539 | sizer_12 = wx.BoxSizer(wx.HORIZONTAL) |
410 | sizer_17 = wx.BoxSizer(wx.VERTICAL) |
540 | sizer_17 = wx.BoxSizer(wx.VERTICAL) |
411 | sizer_9 = wx.BoxSizer(wx.HORIZONTAL) |
541 | sizer_9 = wx.BoxSizer(wx.HORIZONTAL) |
412 | sizer_7 = wx.BoxSizer(wx.HORIZONTAL) |
542 | sizer_7 = wx.BoxSizer(wx.HORIZONTAL) |
413 | sizer_13 = wx.BoxSizer(wx.VERTICAL) |
543 | sizer_13 = wx.BoxSizer(wx.VERTICAL) |
414 | sizer_16 = wx.BoxSizer(wx.HORIZONTAL) |
544 | sizer_16 = wx.BoxSizer(wx.HORIZONTAL) |
415 | sizer_10 = wx.BoxSizer(wx.HORIZONTAL) |
545 | sizer_10 = wx.BoxSizer(wx.HORIZONTAL) |
416 | sizer_18 = wx.BoxSizer(wx.VERTICAL) |
546 | sizer_18 = wx.BoxSizer(wx.VERTICAL) |
417 | sizer_20 = wx.BoxSizer(wx.HORIZONTAL) |
547 | sizer_20 = wx.BoxSizer(wx.HORIZONTAL) |
418 | sizer_19 = wx.BoxSizer(wx.HORIZONTAL) |
548 | sizer_19 = wx.BoxSizer(wx.HORIZONTAL) |
419 | sizer_14 = wx.BoxSizer(wx.HORIZONTAL) |
549 | sizer_14 = wx.BoxSizer(wx.HORIZONTAL) |
420 | sizer_3.Add((20, 20), 0, 0, 0) |
550 | sizer_3.Add((20, 20), 0, 0, 0) |
421 | sizer_8.Add((20, 20), 0, 0, 0) |
551 | sizer_8.Add((20, 20), 0, 0, 0) |
422 | sizer_14.Add(self.label_1, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
552 | sizer_14.Add(self.label_1, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
423 | sizer_14.Add((20, 20), 0, 0, 0) |
553 | sizer_14.Add((20, 20), 0, 0, 0) |
424 | sizer_14.Add(self.descrCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
554 | sizer_14.Add(self.descrCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
425 | sizer_13.Add(sizer_14, 0, 0, 0) |
555 | sizer_13.Add(sizer_14, 0, 0, 0) |
426 | sizer_13.Add((20, 5), 0, 0, 0) |
556 | sizer_13.Add((20, 5), 0, 0, 0) |
427 | sizer_10.Add(self.label_1_copy, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
557 | sizer_10.Add(self.label_1_copy, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
428 | sizer_10.Add((20, 20), 0, 0, 0) |
558 | sizer_10.Add((20, 20), 0, 0, 0) |
429 | sizer_19.Add(self.gyroYawCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
559 | sizer_19.Add(self.gyroYawCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
430 | sizer_19.Add((20, 20), 0, 0, 0) |
560 | sizer_19.Add((20, 20), 0, 0, 0) |
431 | sizer_19.Add(self.gyroRollCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
561 | sizer_19.Add(self.gyroRollCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
432 | sizer_19.Add((20, 20), 0, 0, 0) |
562 | sizer_19.Add((20, 20), 0, 0, 0) |
433 | sizer_19.Add(self.gyroNickCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
563 | sizer_19.Add(self.gyroNickCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
434 | sizer_18.Add(sizer_19, 1, wx.EXPAND, 0) |
564 | sizer_18.Add(sizer_19, 1, wx.EXPAND, 0) |
435 | sizer_20.Add(self.accTopCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
565 | sizer_20.Add(self.accTopCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
436 | sizer_20.Add((20, 20), 0, 0, 0) |
566 | sizer_20.Add((20, 20), 0, 0, 0) |
437 | sizer_20.Add(self.accRollCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
567 | sizer_20.Add(self.accRollCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
438 | sizer_20.Add((20, 20), 0, 0, 0) |
568 | sizer_20.Add((20, 20), 0, 0, 0) |
439 | sizer_20.Add(self.accNickCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
569 | sizer_20.Add(self.accNickCb, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
440 | sizer_18.Add(sizer_20, 1, wx.EXPAND, 0) |
570 | sizer_18.Add(sizer_20, 1, wx.EXPAND, 0) |
441 | sizer_10.Add(sizer_18, 1, wx.EXPAND, 0) |
571 | sizer_10.Add(sizer_18, 1, wx.EXPAND, 0) |
442 | sizer_13.Add(sizer_10, 1, wx.EXPAND, 0) |
572 | sizer_13.Add(sizer_10, 1, wx.EXPAND, 0) |
443 | sizer_13.Add((20, 5), 0, 0, 0) |
573 | sizer_13.Add((20, 5), 0, 0, 0) |
444 | sizer_16.Add(self.label_3, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
574 | sizer_16.Add(self.label_3, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
445 | sizer_16.Add((20, 20), 0, 0, 0) |
575 | sizer_16.Add((20, 20), 0, 0, 0) |
446 | sizer_16.Add(self.motorsCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
576 | sizer_16.Add(self.motorsCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
447 | sizer_16.Add((50, 20), 0, 0, 0) |
577 | sizer_16.Add((50, 20), 0, 0, 0) |
448 | sizer_16.Add(self.label_4, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
578 | sizer_16.Add(self.label_4, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
449 | sizer_16.Add((20, 20), 0, 0, 0) |
579 | sizer_16.Add((20, 20), 0, 0, 0) |
450 | sizer_16.Add(self.speedCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
580 | sizer_16.Add(self.speedCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
451 | sizer_13.Add(sizer_16, 0, wx.EXPAND, 0) |
581 | sizer_13.Add(sizer_16, 0, wx.EXPAND, 0) |
452 | sizer_7.Add(sizer_13, 1, wx.EXPAND, 0) |
582 | sizer_7.Add(sizer_13, 1, wx.EXPAND, 0) |
453 | sizer_7.Add((20, 20), 0, 0, 0) |
583 | sizer_7.Add((20, 20), 0, 0, 0) |
454 | sizer_7.Add((20, 20), 0, 0, 0) |
584 | sizer_7.Add((20, 20), 0, 0, 0) |
455 | sizer_9.Add(sizer_7, 0, 0, 0) |
585 | sizer_9.Add(sizer_7, 0, 0, 0) |
456 | sizer_9.Add(self.bitmap_button_1, 0, 0, 0) |
586 | sizer_9.Add(self.bitmap_button_1, 0, 0, 0) |
457 | sizer_8.Add(sizer_9, 0, 0, 0) |
587 | sizer_8.Add(sizer_9, 0, 0, 0) |
458 | sizer_17.Add((20, 20), 0, 0, 0) |
588 | sizer_17.Add((20, 20), 0, 0, 0) |
459 | sizer_17.Add(self.static_line_1, 0, wx.EXPAND, 0) |
589 | sizer_17.Add(self.static_line_1, 0, wx.EXPAND, 0) |
460 | sizer_17.Add((20, 20), 0, 0, 0) |
590 | sizer_17.Add((20, 20), 0, 0, 0) |
461 | sizer_8.Add(sizer_17, 0, wx.EXPAND, 0) |
591 | sizer_8.Add(sizer_17, 0, wx.EXPAND, 0) |
462 | sizer_11.Add(self.graphCtrl, 1, wx.EXPAND, 0) |
592 | sizer_11.Add(self.graphCtrl, 1, wx.EXPAND, 0) |
463 | sizer_11.Add((20, 5), 0, 0, 0) |
593 | sizer_11.Add((20, 5), 0, 0, 0) |
464 | sizer_12.Add(self.label_40, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
594 | sizer_12.Add(self.label_40, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
465 | sizer_12.Add(self.graphTypeChoice, 0, 0, 0) |
595 | sizer_12.Add(self.graphTypeChoice, 0, 0, 0) |
466 | sizer_12.Add((40, 20), 0, 0, 0) |
596 | sizer_12.Add((40, 20), 0, 0, 0) |
467 | sizer_12.Add(self.label_41, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
597 | sizer_12.Add(self.label_41, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
468 | sizer_12.Add(self.yAxisChoice, 0, 0, 0) |
598 | sizer_12.Add(self.yAxisChoice, 0, 0, 0) |
469 | sizer_12.Add((80, 20), 0, 0, 0) |
599 | sizer_12.Add((80, 20), 0, 0, 0) |
470 | sizer_12.Add(self.copyGraphButton, 0, 0, 0) |
600 | sizer_12.Add(self.copyGraphButton, 0, 0, 0) |
471 | sizer_11.Add(sizer_12, 0, 0, 0) |
601 | sizer_11.Add(sizer_12, 0, 0, 0) |
472 | sizer_8.Add(sizer_11, 0, 0, 0) |
602 | sizer_8.Add(sizer_11, 0, 0, 0) |
473 | sizer_8.Add((20, 30), 0, 0, 0) |
603 | sizer_8.Add((20, 30), 0, 0, 0) |
474 | sizer_8.Add(self.TestListCtrl, 1, 0, 0) |
604 | sizer_8.Add(self.TestListCtrl, 1, 0, 0) |
475 | sizer_8.Add((20, 20), 0, 0, 0) |
605 | sizer_8.Add((20, 20), 0, 0, 0) |
476 | sizer_3.Add(sizer_8, 1, wx.EXPAND, 0) |
606 | sizer_3.Add(sizer_8, 1, wx.EXPAND, 0) |
477 | self.SetSizer(sizer_3) |
607 | self.SetSizer(sizer_3) |
478 | self.Layout() |
608 | self.Layout() |
479 | self.SetSize((850, 700)) |
609 | self.SetSize((850, 700)) |
480 | # end wxGlade |
610 | # end wxGlade |
481 | 611 | ||
482 | # List events |
612 | # List events |
483 | self.TestListCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnTestSelected, self.TestListCtrl) |
613 | self.TestListCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnTestSelected, self.TestListCtrl) |
484 | 614 | ||
485 | # Configure Graph |
615 | # Configure Graph |
486 | #self.graphCtrl = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300)) |
616 | #self.graphCtrl = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300)) |
487 | 617 | ||
488 | self.graphCtrl.SetPointLabelFunc(self.DrawPointLabel) |
618 | self.graphCtrl.SetPointLabelFunc(self.DrawPointLabel) |
489 | 619 | ||
490 | self.graphCtrl.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL)) |
620 | self.graphCtrl.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL)) |
491 | self.graphCtrl.SetFontSizeAxis(10) |
621 | self.graphCtrl.SetFontSizeAxis(10) |
492 | self.graphCtrl.SetFontSizeLegend(7) |
622 | self.graphCtrl.SetFontSizeLegend(7) |
493 | self.graphCtrl.setLogScale((False,False)) |
623 | self.graphCtrl.setLogScale((False,False)) |
494 | 624 | ||
495 | 625 | ||
496 | # Configure TestListCtrl |
626 | # Configure TestListCtrl |
497 | self.TestListCtrl.InsertColumn(0, "Description") |
627 | self.TestListCtrl.InsertColumn(0, "Description") |
498 | self.TestListCtrl.InsertColumn(1, "Voltage") |
628 | self.TestListCtrl.InsertColumn(1, "Voltage") |
499 | self.TestListCtrl.InsertColumn(2, "Speed") |
629 | self.TestListCtrl.InsertColumn(2, "Speed") |
500 | self.TestListCtrl.InsertColumn(3, "Channel") |
630 | self.TestListCtrl.InsertColumn(3, "Channel") |
501 | self.TestListCtrl.InsertColumn(4, "Vibration Value") |
631 | self.TestListCtrl.InsertColumn(4, "Vibration Value") |
502 | self.TestListCtrl.SetColumnWidth(4, 500) |
632 | self.TestListCtrl.SetColumnWidth(4, 500) |
503 | 633 | ||
504 | def DrawPointLabel(self, dc, mDataDict): |
634 | def DrawPointLabel(self, dc, mDataDict): |
505 | """This is the fuction that defines how the pointLabels are plotted |
635 | """This is the fuction that defines how the pointLabels are plotted |
506 | dc - DC that will be passed |
636 | dc - DC that will be passed |
507 | mDataDict - Dictionary of data that you want to use for the pointLabel |
637 | mDataDict - Dictionary of data that you want to use for the pointLabel |
508 | 638 | ||
509 | As an example I have decided I want a box at the curve point |
639 | As an example I have decided I want a box at the curve point |
510 | with some text information about the curve plotted below. |
640 | with some text information about the curve plotted below. |
511 | Any wxDC method can be used. |
641 | Any wxDC method can be used. |
512 | """ |
642 | """ |
513 | # ---------- |
643 | # ---------- |
514 | dc.SetPen(wx.Pen(wx.BLACK)) |
644 | dc.SetPen(wx.Pen(wx.BLACK)) |
515 | dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) ) |
645 | dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) ) |
516 | 646 | ||
517 | sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point |
647 | sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point |
518 | dc.DrawRectangle( sx-5,sy-5, 10, 10) #10by10 square centered on point |
648 | dc.DrawRectangle( sx-5,sy-5, 10, 10) #10by10 square centered on point |
519 | px,py = mDataDict["pointXY"] |
649 | px,py = mDataDict["pointXY"] |
520 | cNum = mDataDict["curveNum"] |
650 | cNum = mDataDict["curveNum"] |
521 | pntIn = mDataDict["pIndex"] |
651 | pntIn = mDataDict["pIndex"] |
522 | legend = mDataDict["legend"] |
652 | legend = mDataDict["legend"] |
523 | #make a string to display |
653 | #make a string to display |
524 | s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn) |
654 | s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn) |
525 | dc.DrawText(s, sx , sy+1) |
655 | dc.DrawText(s, sx , sy+1) |
526 | # ----------- |
656 | # ----------- |
527 | 657 | ||
528 | 658 | ||
529 | def onNewTest(self, test): |
659 | def onNewTest(self, test): |
530 | index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr) |
660 | index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr) |
531 | self._fillRowInTestList(index, test) |
661 | self._fillRowInTestList(index, test) |
532 | self.TestListCtrl.Select(index) |
662 | self.TestListCtrl.Select(index) |
533 | 663 | ||
534 | def _fillRowInTestList(self, index, test): |
664 | def _fillRowInTestList(self, index, test): |
535 | self.TestListCtrl.SetStringItem(index, 0, test.descr) |
665 | self.TestListCtrl.SetStringItem(index, 0, test.descr) |
536 | self.TestListCtrl.SetStringItem(index, 1, "%.1f V" %test.voltage) |
666 | self.TestListCtrl.SetStringItem(index, 1, "%.1f V" %test.voltage) |
537 | self.TestListCtrl.SetStringItem(index, 2, str(test.speed)) |
667 | self.TestListCtrl.SetStringItem(index, 2, str(test.speed)) |
538 | self.TestListCtrl.SetStringItem(index, 3, test.channel) |
668 | self.TestListCtrl.SetStringItem(index, 3, test.channel) |
539 | 669 | ||
540 | vv = test.getVibValue() |
670 | vv = test.getVibValue() |
541 | vvs = "|%s| (%.1f)" % ("----------------------------------------------------------------------------------------------------"[0:min(int(vv+1)/2,100)], vv) |
671 | vvs = "|%s| (%.1f)" % ("----------------------------------------------------------------------------------------------------"[0:min(int(vv+1)/2,100)], vv) |
542 | self.TestListCtrl.SetStringItem(index, 4, vvs) |
672 | self.TestListCtrl.SetStringItem(index, 4, vvs) |
543 | 673 | ||
544 | def refreshData(self): |
674 | def refreshData(self): |
545 | for idx in range(len(self.app.VibTests)): |
675 | for idx in range(len(self.app.VibTests)): |
546 | self._fillRowInTestList(idx, self.app.getTest(idx)) |
676 | self._fillRowInTestList(idx, self.app.getTest(idx)) |
547 | self.drawGraph() |
677 | self.drawGraph() |
548 | 678 | ||
549 | def OnTestSelected(self, event): |
679 | def OnTestSelected(self, event): |
550 | testId = event.m_itemIndex |
680 | testId = event.m_itemIndex |
551 | print "Test Selected id=%d" % (testId) |
681 | print "Test Selected id=%d" % (testId) |
552 | self.activeTestId = testId |
682 | self.activeTestId = testId |
553 | self.drawGraph() |
683 | self.drawGraph() |
554 | 684 | ||
555 | 685 | ||
556 | def orderSelectedTests(self): |
686 | def orderSelectedTests(self): |
557 | tests = [] |
687 | tests = [] |
558 | idx = self.TestListCtrl.GetFirstSelected() |
688 | idx = self.TestListCtrl.GetFirstSelected() |
559 | while idx != -1: |
689 | while idx != -1: |
560 | header = "%s %s"%(self.app.getTest(idx).descr,self.app.getTest(idx).channel) |
690 | header = "%s %s"%(self.app.getTest(idx).descr,self.app.getTest(idx).channel) |
561 | found = False |
691 | found = False |
562 | for t in tests: |
692 | for t in tests: |
563 | if t[0] == header: |
693 | if t[0] == header: |
564 | t.append(idx) |
694 | t.append(idx) |
565 | found = True |
695 | found = True |
566 | break |
696 | break |
567 | if not found: |
697 | if not found: |
568 | tests.append([header, idx]) |
698 | tests.append([header, idx]) |
569 | idx = self.TestListCtrl.GetNextSelected(idx) |
699 | idx = self.TestListCtrl.GetNextSelected(idx) |
570 | return tests |
700 | return tests |
571 | 701 | ||
572 | def OnMouseLeftDown(self,event): |
702 | def OnMouseLeftDown(self,event): |
573 | x,y = self.graphCtrl._getXY(event) |
703 | x,y = self.graphCtrl._getXY(event) |
574 | s= "Left Mouse Down at Point: (%.4f, %.4f)" % (x,y) |
704 | s= "Left Mouse Down at Point: (%.4f, %.4f)" % (x,y) |
575 | print s |
705 | print s |
576 | if self.measureState == 0: |
706 | if self.measureState == 0: |
577 | self.measureX1 = x |
707 | self.measureX1 = x |
578 | self.measureState += 1 |
708 | self.measureState += 1 |
579 | elif self.measureState == 1: |
709 | elif self.measureState == 1: |
580 | dx = x-self.measureX1 |
710 | dx = x-self.measureX1 |
581 | rpm = 60.0*1000/dx |
711 | rpm = 60.0*1000/dx |
582 | s = "Time-Difference: %.1fms\n"%dx |
712 | s = "Time-Difference: %.1fms\n"%dx |
583 | for i in range(1,8): |
713 | for i in range(1,8): |
584 | s += "\n%dT -> %d RPM" %(i,rpm*i) |
714 | s += "\n%dT -> %d RPM" %(i,rpm*i) |
585 | dial = wx.MessageDialog(None, s, 'RPM Measurement', wx.OK ) |
715 | dial = wx.MessageDialog(None, s, 'RPM Measurement', wx.OK ) |
586 | dial.ShowModal() |
716 | dial.ShowModal() |
587 | 717 | ||
588 | self.measureState = 0 |
718 | self.measureState = 0 |
589 | 719 | ||
590 | 720 | ||
591 | 721 | ||
592 | def drawGraph(self): |
722 | def drawGraph(self): |
593 | 723 | ||
594 | y = int(self.yAxisChoice.GetStringSelection()) |
724 | y = int(self.yAxisChoice.GetStringSelection()) |
595 | 725 | ||
596 | nbSelected = self.TestListCtrl.SelectedItemCount |
726 | nbSelected = self.TestListCtrl.SelectedItemCount |
597 | 727 | ||
598 | if nbSelected == 0: |
728 | if nbSelected == 0: |
599 | self.graphCtrl.Clear() |
729 | self.graphCtrl.Clear() |
600 | 730 | ||
601 | elif nbSelected > 1: |
731 | elif nbSelected > 1: |
602 | self.graphTypeChoice.Disable() |
732 | self.graphTypeChoice.Disable() |
603 | self.copyGraphButton.Enable() |
733 | self.copyGraphButton.Enable() |
604 | 734 | ||
605 | tests = self.orderSelectedTests() |
735 | tests = self.orderSelectedTests() |
606 | 736 | ||
607 | lines = [] |
737 | lines = [] |
608 | maxX = 0 |
738 | maxX = 0 |
609 | cCnt = 0 |
739 | cCnt = 0 |
610 | for s in tests: |
740 | for s in tests: |
611 | data = [] |
741 | data = [] |
612 | x=1 |
742 | x=1 |
613 | for t in s[1:]: |
743 | for t in s[1:]: |
614 | data.append([x,self.app.getTest(t).getVibValue()]) |
744 | data.append([x,self.app.getTest(t).getVibValue()]) |
615 | x += 1 |
745 | x += 1 |
616 | lines.append(wx.lib.plot.PolyLine(data, legend= s[0], colour=COLORS[cCnt], width=2)) |
746 | lines.append(wx.lib.plot.PolyLine(data, legend= s[0], colour=COLORS[cCnt], width=2)) |
617 | lines.append(wx.lib.plot.PolyMarker(data, legend= "", colour=COLORS[cCnt], marker='circle',size=2)) |
747 | lines.append(wx.lib.plot.PolyMarker(data, legend= "", colour=COLORS[cCnt], marker='circle',size=2)) |
618 | maxX = max(maxX, x) |
748 | maxX = max(maxX, x) |
619 | cCnt += 1 |
749 | cCnt += 1 |
620 | 750 | ||
621 | title = "Comparing tests" |
751 | title = "Comparing tests" |
622 | self.graphCtrl.setLogScale((False,False)) |
752 | self.graphCtrl.setLogScale((False,False)) |
623 | self.graphCtrl.Draw(wx.lib.plot.PlotGraphics(lines, title, "Test", "Vibration Value"), xAxis=(1,maxX), yAxis=(0,y)) |
753 | self.graphCtrl.Draw(wx.lib.plot.PlotGraphics(lines, title, "Test", "Vibration Value"), xAxis=(1,maxX), yAxis=(0,y)) |
624 | self.graphCtrl.SetEnableGrid('Horizontal') |
754 | self.graphCtrl.SetEnableGrid('Horizontal') |
625 | self.graphCtrl.SetEnableLegend(True) |
755 | self.graphCtrl.SetEnableLegend(True) |
626 | 756 | ||
627 | 757 | ||
628 | else: |
758 | else: |
629 | self.graphTypeChoice.Enable() |
759 | self.graphTypeChoice.Enable() |
630 | self.copyGraphButton.Disable() |
760 | self.copyGraphButton.Disable() |
631 | vibTest = self.app.getTest(self.activeTestId) |
761 | vibTest = self.app.getTest(self.activeTestId) |
632 | nb = vibTest.getDataLen() |
762 | nb = vibTest.getDataLen() |
633 | 763 | ||
634 | if self.graphTypeChoice.GetSelection() == 0: |
764 | if self.graphTypeChoice.GetSelection() == 0: |
635 | xydata = _Numeric.linspace(0,(1/FS)*nb,2*nb) |
765 | xydata = _Numeric.linspace(0,(1/FS)*nb,2*nb) |
636 | xydata.shape = (nb, 2) |
766 | xydata.shape = (nb, 2) |
637 | xydata[:,1] = vibTest.getRawData() |
767 | xydata[:,1] = vibTest.getRawData() |
638 | line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2) |
768 | line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2) |
639 | 769 | ||
640 | title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
770 | title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
641 | self.graphCtrl.setLogScale((False,False)) |
771 | self.graphCtrl.setLogScale((False,False)) |
642 | self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (s)", "Angle"), yAxis= (-y/2,y/2)) |
772 | self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (s)", "Angle"), yAxis= (-y/2,y/2)) |
643 | self.graphCtrl.SetEnableGrid('Horizontal') |
773 | self.graphCtrl.SetEnableGrid('Horizontal') |
644 | self.graphCtrl.SetEnableLegend(False) |
774 | self.graphCtrl.SetEnableLegend(False) |
645 | 775 | ||
646 | 776 | ||
647 | if self.graphTypeChoice.GetSelection() == 1: |
777 | if self.graphTypeChoice.GetSelection() == 1: |
648 | xydata = _Numeric.linspace(0,(1/FS)*nb,2*nb) |
778 | xydata = _Numeric.linspace(0,(1/FS)*nb,2*nb) |
649 | xydata.shape = (nb, 2) |
779 | xydata.shape = (nb, 2) |
650 | xydata[:,1] = vibTest.getFilteredData() |
780 | xydata[:,1] = vibTest.getFilteredData() |
651 | line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2) |
781 | line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2) |
652 | 782 | ||
653 | title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
783 | title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
654 | self.graphCtrl.setLogScale((False,False)) |
784 | self.graphCtrl.setLogScale((False,False)) |
655 | self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (s)", "Angle"), yAxis= (-y/2,y/2)) |
785 | self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (s)", "Angle"), yAxis= (-y/2,y/2)) |
656 | self.graphCtrl.SetEnableGrid('Horizontal') |
786 | self.graphCtrl.SetEnableGrid('Horizontal') |
657 | self.graphCtrl.SetEnableLegend(False) |
787 | self.graphCtrl.SetEnableLegend(False) |
658 | 788 | ||
659 | elif self.graphTypeChoice.GetSelection() == 2: |
789 | elif self.graphTypeChoice.GetSelection() == 2: |
660 | xydata = _Numeric.linspace(0,FS/2,nb) |
790 | xydata = _Numeric.linspace(0,FS/2,nb) |
661 | xydata.shape = (nb/2, 2) |
791 | xydata.shape = (nb/2, 2) |
662 | 792 | ||
663 | xydata[:,1] = vibTest.getSpectrum() |
793 | xydata[:,1] = vibTest.getSpectrum() |
664 | 794 | ||
665 | #print xydata |
795 | #print xydata |
666 | 796 | ||
667 | line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red') |
797 | line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red') |
668 | markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2) |
798 | markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2) |
669 | 799 | ||
670 | fc = self.app.settings["hpf"].value |
800 | fc = self.app.settings["hpf"].value |
671 | filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4) |
801 | filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4) |
672 | fc = self.app.settings["lpf"].value |
802 | fc = self.app.settings["lpf"].value |
673 | filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4) |
803 | filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4) |
674 | 804 | ||
675 | title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
805 | title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
676 | self.graphCtrl.setLogScale((True,False)) |
806 | self.graphCtrl.setLogScale((True,False)) |
677 | self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line,markers, filterLine1, filterLine2], title, "Freq (Hz)", "Acc"), xAxis=(0.1,20), yAxis= (0,y)) |
807 | self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line,markers, filterLine1, filterLine2], title, "Freq (Hz)", "Acc"), xAxis=(0.1,20), yAxis= (0,y)) |
678 | self.graphCtrl.SetEnableGrid(True) |
808 | self.graphCtrl.SetEnableGrid(True) |
679 | self.graphCtrl.SetEnableLegend(False) |
809 | self.graphCtrl.SetEnableLegend(False) |
680 | 810 | ||
681 | 811 | ||
682 | 812 | ||
683 | def OnImport(self, event): # wxGlade: MainFrame.<event_handler> |
813 | def OnImport(self, event): # wxGlade: MainFrame.<event_handler> |
684 | dlg = wx.FileDialog( |
814 | dlg = wx.FileDialog( |
685 | self, message="Choose a file", |
815 | self, message="Choose a file", |
686 | defaultDir="%s/Data/" % os.getcwd(), |
816 | defaultDir="%s/Data/" % os.getcwd(), |
687 | defaultFile=".", |
817 | defaultFile=".", |
688 | wildcard="Text files (*.txt)|*.txt|All files (*.*)|*.*", |
818 | wildcard="Text files (*.txt)|*.txt|All files (*.*)|*.*", |
689 | style=wx.OPEN | wx.CHANGE_DIR |
819 | style=wx.OPEN | wx.CHANGE_DIR |
690 | ) |
820 | ) |
691 | if dlg.ShowModal() == wx.ID_OK: |
821 | if dlg.ShowModal() == wx.ID_OK: |
692 | paths = dlg.GetPaths(); |
822 | paths = dlg.GetPaths(); |
693 | self.app.loadTests(paths[0]) |
823 | self.app.loadTests(paths[0]) |
694 | dlg.Destroy() |
824 | dlg.Destroy() |
695 | 825 | ||
696 | def onExport(self, event): # wxGlade: MainFrame.<event_handler> |
826 | def onExport(self, event): # wxGlade: MainFrame.<event_handler> |
697 | dlg = wx.FileDialog( |
827 | dlg = wx.FileDialog( |
698 | self, message="Save file as ...", |
828 | self, message="Save file as ...", |
699 | defaultDir="%s/Data/" % os.getcwd(), |
829 | defaultDir="%s/Data/" % os.getcwd(), |
700 | defaultFile=".", |
830 | defaultFile=".", |
701 | wildcard="Text files (*.txt)|*.txt|All files (*.*)|*.*", |
831 | wildcard="Text files (*.txt)|*.txt|All files (*.*)|*.*", |
702 | style=wx.SAVE |
832 | style=wx.SAVE |
703 | ) |
833 | ) |
704 | if dlg.ShowModal() == wx.ID_OK: |
834 | if dlg.ShowModal() == wx.ID_OK: |
705 | paths = dlg.GetPaths(); |
835 | paths = dlg.GetPaths(); |
706 | self.app.saveTests(paths[0]) |
836 | self.app.saveTests(paths[0]) |
707 | dlg.Destroy() |
837 | dlg.Destroy() |
708 | 838 | ||
709 | def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler> |
839 | def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler> |
710 | self.drawGraph() |
840 | self.drawGraph() |
711 | 841 | ||
712 | def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler> |
842 | def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler> |
713 | self.drawGraph() |
843 | self.drawGraph() |
714 | 844 | ||
715 | def OnSettings(self, event): # wxGlade: MainFrame.<event_handler> |
845 | def OnSettings(self, event): # wxGlade: MainFrame.<event_handler> |
716 | dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200), |
846 | dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200), |
717 | #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME, |
847 | #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME, |
718 | style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX |
848 | style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX |
719 | ) |
849 | ) |
720 | dlg.CenterOnScreen() |
850 | dlg.CenterOnScreen() |
721 | val = dlg.ShowModal() # this does not return until the dialog is closed. |
851 | val = dlg.ShowModal() # this does not return until the dialog is closed. |
722 | dlg.Destroy() |
852 | dlg.Destroy() |
723 | self.app.onSettingsChanged(True) |
853 | self.app.onSettingsChanged(True) |
724 | 854 | ||
725 | def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler> |
855 | def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler> |
726 | # Collect measure parameters |
856 | # Collect measure parameters |
727 | mp = MeasureParameters() |
857 | mp = MeasureParameters() |
728 | decoding = "" |
858 | decoding = "" |
729 | 859 | ||
730 | try: |
860 | try: |
731 | decoding = "Description" |
861 | decoding = "Description" |
732 | mp.descr = self.descrCtrl.GetValue() |
862 | mp.descr = self.descrCtrl.GetValue() |
733 | 863 | ||
734 | decoding = "Motor(s)" |
864 | decoding = "Motor(s)" |
735 | mp.motors = map(int,self.motorsCtrl.GetValue().split(',')) |
865 | mp.motors = map(int,self.motorsCtrl.GetValue().split(',')) |
736 | for motor in mp.motors: |
866 | for motor in mp.motors: |
737 | if (motor<1) or (motor>MOTOR_MAX): |
867 | if (motor<1) or (motor>MOTOR_MAX): |
738 | raise Exception("Motor number should be between 1 and %d" % MOTOR_MAX) |
868 | raise Exception("Motor number should be between 1 and %d" % MOTOR_MAX) |
739 | 869 | ||
740 | decoding = "Channel(s)" |
870 | decoding = "Channel(s)" |
741 | mp.channels = [] |
871 | mp.channels = [] |
742 | if self.gyroYawCb.IsChecked(): mp.channels.append(0) |
872 | if self.gyroYawCb.IsChecked(): mp.channels.append(0) |
743 | if self.gyroRollCb.IsChecked(): mp.channels.append(1) |
873 | if self.gyroRollCb.IsChecked(): mp.channels.append(1) |
744 | if self.gyroNickCb.IsChecked(): mp.channels.append(2) |
874 | if self.gyroNickCb.IsChecked(): mp.channels.append(2) |
745 | if self.accTopCb.IsChecked(): mp.channels.append(5) |
875 | if self.accTopCb.IsChecked(): mp.channels.append(5) |
746 | if self.accRollCb.IsChecked(): mp.channels.append(6) |
876 | if self.accRollCb.IsChecked(): mp.channels.append(6) |
747 | if self.accNickCb.IsChecked(): mp.channels.append(7) |
877 | if self.accNickCb.IsChecked(): mp.channels.append(7) |
748 | 878 | ||
749 | decoding = "Speed(s)" |
879 | decoding = "Speed(s)" |
750 | mp.speeds = [] |
880 | mp.speeds = [] |
751 | for speedTxt in self.speedCtrl.GetValue().split(","): |
881 | for speedTxt in self.speedCtrl.GetValue().split(","): |
752 | if speedTxt.count("-") == 1: |
882 | if speedTxt.count("-") == 1: |
753 | # assume from-to:step format |
883 | # assume from-to:step format |
754 | speedTxt = speedTxt.split("-") |
884 | speedTxt = speedTxt.split("-") |
755 | if len(speedTxt) != 2: raise Exception("Invalid format") |
885 | if len(speedTxt) != 2: raise Exception("Invalid format") |
756 | speedTxt[1] = speedTxt[1].split(":") |
886 | speedTxt[1] = speedTxt[1].split(":") |
757 | if len(speedTxt[1]) != 2: raise Exception("Invalid format") |
887 | if len(speedTxt[1]) != 2: raise Exception("Invalid format") |
758 | mp.speeds = range(int(speedTxt[0]),int(speedTxt[1][0])+int(speedTxt[1][1]),int(speedTxt[1][1])) |
888 | mp.speeds = range(int(speedTxt[0]),int(speedTxt[1][0])+int(speedTxt[1][1]),int(speedTxt[1][1])) |
759 | else: |
889 | else: |
760 | # assume s or s*n format |
890 | # assume s or s*n format |
761 | if speedTxt.count("*") == 1: |
891 | if speedTxt.count("*") == 1: |
762 | speedTxt = speedTxt.split("*") |
892 | speedTxt = speedTxt.split("*") |
763 | for i in range(int(speedTxt[0])): |
893 | for i in range(int(speedTxt[0])): |
764 | mp.speeds.append(int(speedTxt[1])) |
894 | mp.speeds.append(int(speedTxt[1])) |
765 | else: |
895 | else: |
766 | mp.speeds.append(int(speedTxt)) |
896 | mp.speeds.append(int(speedTxt)) |
767 | for speed in mp.speeds: |
897 | for speed in mp.speeds: |
768 | if (speed<0) or (speed>255): |
898 | if (speed<0) or (speed>255): |
769 | raise Exception("Speed values should be between 0 and 255") |
899 | raise Exception("Speed values should be between 0 and 255") |
770 | 900 | ||
771 | except Exception,e: |
901 | except Exception,e: |
772 | dial = wx.MessageDialog(None, 'Invalid paramter \"%s\"\n\n%s' % (decoding, str(e)), 'Error', wx.OK | |
902 | dial = wx.MessageDialog(None, 'Invalid paramter \"%s\"\n\n%s' % (decoding, str(e)), 'Error', wx.OK | |
773 | wx.ICON_ERROR) |
903 | wx.ICON_ERROR) |
774 | dial.ShowModal() |
904 | dial.ShowModal() |
775 | raise e |
905 | raise e |
776 | 906 | ||
777 | 907 | ||
778 | 908 | ||
779 | print mp.descr |
909 | print mp.descr |
780 | print mp.motors |
910 | print mp.motors |
781 | print mp.channels |
911 | print mp.channels |
782 | print mp.speeds |
912 | print mp.speeds |
783 | 913 | ||
784 | 914 | ||
785 | 915 | ||
786 | # create the dialog that will show the satus |
916 | # create the dialog that will show the satus |
787 | dlg = MeasureDialog(self) |
917 | dlg = MeasureDialog(self) |
788 | dlg.CenterOnScreen() |
918 | dlg.CenterOnScreen() |
789 | 919 | ||
790 | # Signal the application |
920 | # Signal the application |
791 | self.app.startMeasure(mp, dlg) |
921 | self.app.startMeasure(mp, dlg) |
792 | 922 | ||
793 | # Show the dialog |
923 | # Show the dialog |
794 | val = dlg.ShowModal() # this does not return until the dialog is closed. |
924 | val = dlg.ShowModal() # this does not return until the dialog is closed. |
795 | dlg.Destroy() |
925 | dlg.Destroy() |
796 | 926 | ||
797 | def _removeTest(self, idx): |
927 | def _removeTest(self, idx): |
798 | print "Deleting test %d" % idx |
928 | print "Deleting test %d" % idx |
799 | self.app.removeTest(idx) |
929 | self.app.removeTest(idx) |
800 | self.TestListCtrl.DeleteItem(idx) |
930 | self.TestListCtrl.DeleteItem(idx) |
801 | 931 | ||
802 | 932 | ||
803 | def onClear(self, event): # wxGlade: MainFrame.<event_handler> |
933 | def onClear(self, event): # wxGlade: MainFrame.<event_handler> |
804 | dial = wx.MessageDialog(None, 'Clear ALL tests?', 'Question', |
934 | dial = wx.MessageDialog(None, 'Clear ALL tests?', 'Question', |
805 | wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) |
935 | wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) |
806 | if dial.ShowModal() == wx.ID_YES: |
936 | if dial.ShowModal() == wx.ID_YES: |
807 | print "Clear all tests" |
937 | print "Clear all tests" |
808 | for i in range(len(self.app.VibTests)-1, -1, -1): |
938 | for i in range(len(self.app.VibTests)-1, -1, -1): |
809 | self._removeTest(i) |
939 | self._removeTest(i) |
810 | self.drawGraph() |
940 | self.drawGraph() |
811 | 941 | ||
812 | 942 | ||
813 | def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler> |
943 | def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler> |
814 | dial = wx.MessageDialog(None, 'Clear Selected tests?', 'Question', |
944 | dial = wx.MessageDialog(None, 'Clear Selected tests?', 'Question', |
815 | wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) |
945 | wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) |
816 | if dial.ShowModal() == wx.ID_YES: |
946 | if dial.ShowModal() == wx.ID_YES: |
817 | while True: |
947 | while True: |
818 | idx = self.TestListCtrl.GetFirstSelected() |
948 | idx = self.TestListCtrl.GetFirstSelected() |
819 | if idx == -1: break |
949 | if idx == -1: break |
820 | self._removeTest(idx) |
950 | self._removeTest(idx) |
821 | 951 | ||
822 | 952 | ||
823 | 953 | ||
824 | def onAbout(self, event): # wxGlade: MainFrame.<event_handler> |
954 | def onAbout(self, event): # wxGlade: MainFrame.<event_handler> |
825 | # First we create and fill the info object |
955 | # First we create and fill the info object |
826 | print "about" |
956 | print "about" |
827 | info = wx.AboutDialogInfo() |
957 | info = wx.AboutDialogInfo() |
828 | info.Name = "MK Vibration Test - " |
958 | info.Name = "MK Vibration Test - " |
829 | info.Version = "v1.2 ($Rev: 717 $)".replace("$","") |
959 | info.Version = "v1.2 ($Rev: 718 $)".replace("$","") |
830 | info.Copyright = "" |
960 | info.Copyright = "" |
831 | info.Developers=["Frederic Goddeeris (Frederic@rc-flight.be)"] |
961 | info.Developers=["Frederic Goddeeris (Frederic@rc-flight.be)"] |
832 | info.Description = "Please consult the WIKI page for a complete description of the tool:" |
962 | info.Description = "Please consult the WIKI page for a complete description of the tool:" |
833 | info.WebSite = ("http://www.mikrokopter.de/ucwiki/en/VibrationTest", "VibrationTest WIKI page") |
963 | info.WebSite = ("http://www.mikrokopter.de/ucwiki/en/VibrationTest", "VibrationTest WIKI page") |
834 | wx.AboutBox(info) |
964 | wx.AboutBox(info) |
835 | 965 | ||
836 | 966 | ||
837 | def onExit(self, event): # wxGlade: MainFrame.<event_handler> |
967 | def onExit(self, event): # wxGlade: MainFrame.<event_handler> |
838 | self.Close(True) |
968 | self.Close(True) |
839 | 969 | ||
840 | 970 | ||
841 | def onSelectAll(self, event): # wxGlade: MainFrame.<event_handler> |
971 | def onSelectAll(self, event): # wxGlade: MainFrame.<event_handler> |
842 | for i in xrange(self.TestListCtrl.GetItemCount()): |
972 | for i in xrange(self.TestListCtrl.GetItemCount()): |
843 | self.TestListCtrl.Select(i) |
973 | self.TestListCtrl.Select(i) |
844 | 974 | ||
845 | def onCopyGraphData(self, event): # wxGlade: MainFrame.<event_handler> |
975 | def onCopyGraphData(self, event): # wxGlade: MainFrame.<event_handler> |
846 | clipdata = wx.TextDataObject() |
976 | clipdata = wx.TextDataObject() |
847 | txt = "" |
977 | txt = "" |
848 | idx = self.TestListCtrl.GetFirstSelected() |
978 | idx = self.TestListCtrl.GetFirstSelected() |
849 | while idx != -1: |
979 | while idx != -1: |
850 | txt += ("%d\n" % self.app.getTest(idx).getVibValue()) |
980 | txt += ("%d\n" % self.app.getTest(idx).getVibValue()) |
851 | idx = self.TestListCtrl.GetNextSelected(idx) |
981 | idx = self.TestListCtrl.GetNextSelected(idx) |
852 | clipdata.SetText(txt) |
982 | clipdata.SetText(txt) |
853 | wx.TheClipboard.Open() |
983 | wx.TheClipboard.Open() |
854 | wx.TheClipboard.SetData(clipdata) |
984 | wx.TheClipboard.SetData(clipdata) |
855 | wx.TheClipboard.Close() |
985 | wx.TheClipboard.Close() |
856 | 986 | ||
857 | # end of class MainFrame |
987 | # end of class MainFrame |
858 | 988 | ||
859 | class Setting: |
989 | class Setting: |
860 | def __init__(self, descr, defaultValue): |
990 | def __init__(self, descr, defaultValue): |
861 | self.descr = descr |
991 | self.descr = descr |
862 | self.value = defaultValue |
992 | self.value = defaultValue |
863 | 993 | ||
864 | def set(self, newValue): |
994 | def set(self, newValue): |
865 | if isinstance(self.value, int): |
995 | if isinstance(self.value, int): |
866 | self.value = int(newValue) |
996 | self.value = int(newValue) |
867 | else: |
997 | else: |
868 | self.value = str(newValue) |
998 | self.value = str(newValue) |
869 | 999 | ||
870 | class MeasureParameters: |
1000 | class MeasureParameters: |
871 | pass |
1001 | pass |
872 | 1002 | ||
873 | class MeasureThread: |
1003 | class MeasureThread: |
874 | def __init__(self, measureParameters, evtConsumer): |
1004 | def __init__(self, measureParameters, evtConsumer): |
875 | self.mk = MkProtocol.MkComm() |
1005 | self.mk = MkProtocol.MkComm() |
876 | self.param = measureParameters |
1006 | self.param = measureParameters |
877 | self.evtConsumer = evtConsumer |
1007 | self.evtConsumer = evtConsumer |
878 | self.cancel = False |
1008 | self.cancel = False |
879 | self.running = False |
1009 | self.running = False |
880 | 1010 | ||
881 | def start(self): |
1011 | def start(self): |
882 | thread.start_new_thread(self._run, ()) |
1012 | thread.start_new_thread(self._run, ()) |
883 | 1013 | ||
884 | def stop(self): |
1014 | def stop(self): |
885 | self.cancel = True |
1015 | self.cancel = True |
886 | 1016 | ||
887 | def _testCancel(self): |
1017 | def _testCancel(self): |
888 | if self.cancel: |
1018 | if self.cancel: |
889 | raise Exception("Operation cancelled") |
1019 | raise Exception("Operation cancelled") |
890 | 1020 | ||
891 | def _sendEvent(self, msg=None, error=False, parVoltage=None, speed=None): |
1021 | def _sendEvent(self, msg=None, error=False, parVoltage=None, speed=None): |
892 | evt = MeasStatusUpdateEvent(running=self.running, msg=msg, error=error, voltage=parVoltage, speed=speed) |
1022 | evt = MeasStatusUpdateEvent(running=self.running, msg=msg, error=error, voltage=parVoltage, speed=speed) |
893 | wx.PostEvent(self.evtConsumer, evt) |
1023 | wx.PostEvent(self.evtConsumer, evt) |
894 | 1024 | ||
895 | # def _setMotorSpeed(self, speed, settlingTime): |
1025 | # def _setMotorSpeed(self, speed, settlingTime): |
896 | # speeds = [0]*MOTOR_MAX |
1026 | # speeds = [0]*MOTOR_MAX |
897 | # |
1027 | # |
898 | # for motor in self.param.motors: |
1028 | # for motor in self.param.motors: |
899 | # speeds[motor-1] = speed |
1029 | # speeds[motor-1] = speed |
900 | # for i in range(int(settlingTime*10)): |
1030 | # for i in range(int(settlingTime*10)): |
901 | # self._testCancel() |
1031 | # self._testCancel() |
902 | # self.mk.setMotorTest(speeds) |
1032 | # self.mk.setMotorTest(speeds) |
903 | # time.sleep(.1) |
1033 | # time.sleep(.1) |
904 | # self.currSpeed = speed |
1034 | # self.currSpeed = speed |
905 | 1035 | ||
906 | 1036 | ||
907 | def _run(self): |
1037 | def _run(self): |
908 | self.running = True |
1038 | self.running = True |
909 | self._sendEvent("Starting test \"%s\"" % self.param.descr) |
1039 | self._sendEvent("Starting test \"%s\"" % self.param.descr) |
910 | self.currSpeed = 0 |
1040 | self.currSpeed = 0 |
911 | 1041 | ||
912 | try: |
1042 | try: |
913 | self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort) |
1043 | self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort) |
914 | self.mk.open(comPort=self.param.serialPort) |
1044 | self.mk.open(comPort=self.param.serialPort) |
915 | 1045 | ||
916 | # print "Sending FC->NC forwarding", |
1046 | # print "Sending FC->NC forwarding", |
917 | # self.mk.sendNCRedirectUartFromFC() |
1047 | # self.mk.sendNCRedirectUartFromFC() |
918 | # print "Done" |
1048 | # print "Done" |
919 | 1049 | ||
920 | msg = self.mk.getVersionMsg() |
1050 | msg = self.mk.getVersionMsg() |
921 | version = msg.getVersion() |
1051 | version = msg.getVersion() |
922 | self._sendEvent("Version: %d.%d" % version) |
1052 | self._sendEvent("Version: %d.%d" % version) |
923 | 1053 | ||
924 | msg = self.mk.getDebugMsg() |
1054 | msg = self.mk.getDebugMsg() |
925 | voltage = msg.getVoltage() |
1055 | voltage = msg.getVoltage() |
926 | if (voltage == 0): |
1056 | if (voltage == 0): |
927 | # Board is probably fed by USB |
1057 | # Board is probably fed by USB |
928 | minVoltage = 0 |
1058 | minVoltage = 0 |
929 | maxVoltage = 1 |
1059 | maxVoltage = 1 |
930 | else: |
1060 | else: |
931 | # Determine the n umber of cells |
1061 | # Determine the n umber of cells |
932 | if (voltage > 4.2*3): |
1062 | if (voltage > 4.2*3): |
933 | nbCells = 4 |
1063 | nbCells = 4 |
934 | else: |
1064 | else: |
935 | nbCells = 3 |
1065 | nbCells = 3 |
936 | # Set minimum and maximum voltages |
1066 | # Set minimum and maximum voltages |
937 | if self.param.minVoltage > 0: |
1067 | if self.param.minVoltage > 0: |
938 | minVoltage = self.param.minVoltage |
1068 | minVoltage = self.param.minVoltage |
939 | else: |
1069 | else: |
940 | minVoltage = nbCells*3 # auto |
1070 | minVoltage = nbCells*3 # auto |
941 | if self.param.maxVoltage > 0: |
1071 | if self.param.maxVoltage > 0: |
942 | maxVoltage = self.param.maxVoltage |
1072 | maxVoltage = self.param.maxVoltage |
943 | else: |
1073 | else: |
944 | maxVoltage = nbCells*4 |
1074 | maxVoltage = nbCells*4 |
945 | 1075 | ||
946 | self._sendEvent("Voltage: %2.1fV" % voltage) |
1076 | self._sendEvent("Voltage: %2.1fV" % voltage) |
947 | self._sendEvent("Min/Max Voltage: %2.1fV-%2.1fV" % (minVoltage, maxVoltage), parVoltage=(minVoltage, maxVoltage, voltage)) |
1077 | self._sendEvent("Min/Max Voltage: %2.1fV-%2.1fV" % (minVoltage, maxVoltage), parVoltage=(minVoltage, maxVoltage, voltage)) |
948 | 1078 | ||
949 | msg = self.mk.getDebugMsg() |
1079 | msg = self.mk.getDebugMsg() |
950 | voltage = msg.getVoltage() |
1080 | voltage = msg.getVoltage() |
951 | 1081 | ||
952 | for I in self.param.speeds: |
1082 | for I in self.param.speeds: |
953 | self._sendEvent("TestSettings I=%d" % I) |
1083 | self._sendEvent("TestSettings I=%d" % I) |
954 | orgSetting = self.mk.getSettingsMsg() |
1084 | orgSetting = self.mk.getSettingsMsg() |
955 | testSettings = copy.deepcopy(orgSetting) |
1085 | testSettings = copy.deepcopy(orgSetting) |
956 | 1086 | ||
957 | # testSettings.setSetting(MkProtocol.SettingsMsg.IDX_GYRO_P, I) |
1087 | # testSettings.setSetting(MkProtocol.SettingsMsg.IDX_GYRO_P, I) |
958 | # testSettings.setSetting(MkProtocol.SettingsMsg.IDX_GYRO_I, 65) |
1088 | # testSettings.setSetting(MkProtocol.SettingsMsg.IDX_GYRO_I, 65) |
959 | 1089 | ||
960 | testSettings.setSetting(MkProtocol.SettingsMsg.IDX_GYRO_P, 0) |
1090 | testSettings.setSetting(MkProtocol.SettingsMsg.IDX_GYRO_P, 0) |
961 | testSettings.setSetting(MkProtocol.SettingsMsg.IDX_GYRO_I, I) |
1091 | testSettings.setSetting(MkProtocol.SettingsMsg.IDX_GYRO_I, I) |
962 | 1092 | ||
963 | self.mk.sendSettings(testSettings.getSettings()) |
1093 | self.mk.sendSettings(testSettings.getSettings()) |
964 | 1094 | ||
965 | #time.sleep(3) |
1095 | #time.sleep(3) |
966 | 1096 | ||
967 | ## DISTURB |
1097 | ## DISTURB |
968 | msg = MkProtocol.MkMsg(address=2, cmd='f', data=[7, 50]) |
1098 | msg = MkProtocol.MkMsg(address=2, cmd='f', data=[7, 50]) |
969 | self.mk.sendMsg(msg) |
1099 | self.mk.sendMsg(msg) |
970 | time.sleep(.1) |
1100 | time.sleep(.1) |
971 | 1101 | ||
972 | #data = self.mk.doVibrationTest(1000, channel) |
1102 | #data = self.mk.doVibrationTest(1000, channel) |
973 | messages = self.mk.recordDbgMsg(0.05, 20*5) |
1103 | messages = self.mk.recordDbgMsg(0.05, 20*5) |
974 | data = [] |
1104 | data = [] |
975 | for msg in messages: |
1105 | for msg in messages: |
976 | data.append(msg.getAngleRoll()) |
1106 | data.append(msg.getAngleRoll()) |
977 | print data |
1107 | print data |
978 | 1108 | ||
979 | vt = VibTest(self.param.descr, voltage, self.param.motors, I, "AngleRoll", data) |
1109 | vt = VibTest(self.param.descr, voltage, self.param.motors, I, "AngleRoll", data) |
980 | evt = MeasDataEvent(vibTest = vt) |
1110 | evt = MeasDataEvent(vibTest = vt) |
981 | wx.PostEvent(self.evtConsumer, evt) |
1111 | wx.PostEvent(self.evtConsumer, evt) |
982 | 1112 | ||
983 | self._sendEvent("Original Settings") |
1113 | self._sendEvent("Original Settings") |
984 | self.mk.sendSettings(orgSetting.getSettings()) |
1114 | self.mk.sendSettings(orgSetting.getSettings()) |
985 | time.sleep(1) |
1115 | time.sleep(1) |
986 | 1116 | ||
987 | if voltage<minVoltage: |
1117 | if voltage<minVoltage: |
988 | raise Exception("Voltage too low") |
1118 | raise Exception("Voltage too low") |
989 | 1119 | ||
990 | self._sendEvent("Done !", parVoltage=(minVoltage, maxVoltage, voltage)) |
1120 | self._sendEvent("Done !", parVoltage=(minVoltage, maxVoltage, voltage)) |
991 | 1121 | ||
992 | except Exception, e: |
1122 | except Exception, e: |
993 | self._sendEvent("Exception \"%s\"" % e, error=True) |
1123 | self._sendEvent("Exception \"%s\"" % e, error=True) |
994 | 1124 | ||
995 | try: |
1125 | try: |
996 | self.mk.close() |
1126 | self.mk.close() |
997 | except: |
1127 | except: |
998 | print "Failure closing MK serial port" |
1128 | print "Failure closing MK serial port" |
999 | pass |
1129 | pass |
1000 | 1130 | ||
1001 | self.running = False |
1131 | self.running = False |
1002 | self._sendEvent("", speed = 0) |
1132 | self._sendEvent("", speed = 0) |
1003 | 1133 | ||
1004 | 1134 | ||
1005 | class VibTest: |
1135 | class VibTest: |
1006 | useRms = True |
1136 | useRms = True |
1007 | fc1 = None |
1137 | fc1 = None |
1008 | fc2 = None |
1138 | fc2 = None |
1009 | 1139 | ||
1010 | 1140 | ||
1011 | def __init__(self, descr, voltage, motor, speed, channel, rawData): |
1141 | def __init__(self, descr, voltage, motor, speed, channel, rawData): |
1012 | self.descr = descr |
1142 | self.descr = descr |
1013 | self.voltage = voltage |
1143 | self.voltage = voltage |
1014 | self.motor = motor |
1144 | self.motor = motor |
1015 | self.speed = speed |
1145 | self.speed = speed |
1016 | self.channel = channel |
1146 | self.channel = channel |
1017 | 1147 | ||
1018 | self.dataLen = len(rawData) |
1148 | self.dataLen = len(rawData) |
1019 | 1149 | ||
1020 | self.rawData = _Numeric.array(rawData) |
1150 | self.rawData = _Numeric.array(rawData) |
1021 | self.dc = self.rawData.mean() |
1151 | self.dc = self.rawData.mean() |
1022 | self.rawData -= self.dc |
1152 | self.rawData -= self.dc |
1023 | 1153 | ||
1024 | self.fft = _Numeric.fft.rfft(self.rawData) |
1154 | self.fft = _Numeric.fft.rfft(self.rawData) |
1025 | 1155 | ||
1026 | self.spectrum = None |
1156 | self.spectrum = None |
1027 | self.filteredData = None |
1157 | self.filteredData = None |
1028 | 1158 | ||
1029 | self.vibValue = None |
1159 | self.vibValue = None |
1030 | 1160 | ||
1031 | def getDescr(self): |
1161 | def getDescr(self): |
1032 | return self.Descr |
1162 | return self.Descr |
1033 | 1163 | ||
1034 | def getRawData(self): |
1164 | def getRawData(self): |
1035 | return self.rawData |
1165 | return self.rawData |
1036 | 1166 | ||
1037 | def getDataLen(self): |
1167 | def getDataLen(self): |
1038 | return self.dataLen |
1168 | return self.dataLen |
1039 | 1169 | ||
1040 | def getSpectrum(self): |
1170 | def getSpectrum(self): |
1041 | if self.spectrum == None: |
1171 | if self.spectrum == None: |
1042 | self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2) |
1172 | self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2) |
1043 | return self.spectrum |
1173 | return self.spectrum |
1044 | 1174 | ||
1045 | def refresh(self): |
1175 | def refresh(self): |
1046 | self.filteredData = None |
1176 | self.filteredData = None |
1047 | self.vibValue = None |
1177 | self.vibValue = None |
1048 | 1178 | ||
1049 | def getFilteredData(self): |
1179 | def getFilteredData(self): |
1050 | if self.filteredData == None: |
1180 | if self.filteredData == None: |
1051 | tmpfft = self.fft.copy() |
1181 | tmpfft = self.fft.copy() |
1052 | fc = (float(self.fc1))/(FS/2)*len(tmpfft) |
1182 | fc = (float(self.fc1))/(FS/2)*len(tmpfft) |
1053 | print "fc1=%d => fc=%f" % (self.fc1, fc) |
1183 | print "fc1=%d => fc=%f" % (self.fc1, fc) |
1054 | for i in range(0,int(fc)+2): |
1184 | for i in range(0,int(fc)+2): |
1055 | tmpfft[i] = 0 |
1185 | tmpfft[i] = 0 |
1056 | fc = (float(self.fc2))/(FS/2)*len(tmpfft) |
1186 | fc = (float(self.fc2))/(FS/2)*len(tmpfft) |
1057 | print "fc2=%d => fc=%f" % (self.fc2,fc) |
1187 | print "fc2=%d => fc=%f" % (self.fc2,fc) |
1058 | for i in range(int(fc)+2, len(tmpfft)): |
1188 | for i in range(int(fc)+2, len(tmpfft)): |
1059 | tmpfft[i] = 0 |
1189 | tmpfft[i] = 0 |
1060 | self.filteredData = _Numeric.fft.irfft(tmpfft) |
1190 | self.filteredData = _Numeric.fft.irfft(tmpfft) |
1061 | 1191 | ||
1062 | return self.filteredData |
1192 | return self.filteredData |
1063 | 1193 | ||
1064 | def getVibValue(self): |
1194 | def getVibValue(self): |
1065 | if self.vibValue == None: |
1195 | if self.vibValue == None: |
1066 | fd = self.getRawData() |
1196 | fd = self.getRawData() |
1067 | #fd = self.getFilteredData()[100:-100]; |
1197 | #fd = self.getFilteredData()[100:-100]; |
1068 | if self.useRms: |
1198 | if self.useRms: |
1069 | print "RMS" |
1199 | print "RMS" |
1070 | self.vibValue = math.sqrt(sum([x*x for x in fd])/len(fd))*2*math.sqrt(2) |
1200 | self.vibValue = math.sqrt(sum([x*x for x in fd])/len(fd))*2*math.sqrt(2) |
1071 | else: |
1201 | else: |
1072 | print "PP" |
1202 | print "PP" |
1073 | self.vibValue = max(fd)-min(fd) |
1203 | self.vibValue = max(fd)-min(fd) |
1074 | return self.vibValue |
1204 | return self.vibValue |
1075 | 1205 | ||
1076 | 1206 | ||
1077 | 1207 | ||
1078 | class App(wx.App): |
1208 | class App(wx.App): |
1079 | 1209 | ||
1080 | SETTINGSFILE = "settings.cfg" |
1210 | SETTINGSFILE = "settings.cfg" |
1081 | 1211 | ||
1082 | def __init__(self, par): |
1212 | def __init__(self, par): |
1083 | self.VibTests = [] |
1213 | self.VibTests = [] |
1084 | wx.App.__init__(self, par) |
1214 | wx.App.__init__(self, par) |
1085 | 1215 | ||
1086 | # Init settings |
1216 | # Init settings |
1087 | self.settings={} |
1217 | self.settings={} |
1088 | self.settings["serialport"] = Setting("Serial Port", "COM1") |
1218 | self.settings["serialport"] = Setting("Serial Port", "COM1") |
1089 | self.settings["startupspeed"] = Setting("Motor Startup Speed", 25) |
1219 | self.settings["startupspeed"] = Setting("Motor Startup Speed", 25) |
1090 | self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3) |
1220 | self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3) |
1091 | self.settings["serialport"] = Setting("Serial Port", "COM1") |
1221 | self.settings["serialport"] = Setting("Serial Port", "COM1") |
1092 | self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 40) |
1222 | self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 40) |
1093 | self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 400) |
1223 | self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 400) |
1094 | self.settings["calcmethod"] = Setting("Calculation Method", "rms") |
1224 | self.settings["calcmethod"] = Setting("Calculation Method", "rms") |
1095 | self.settings["minvoltage"] = Setting("Minimum Bettery Voltage (0=Automatic) (V) ", 0) |
1225 | self.settings["minvoltage"] = Setting("Minimum Bettery Voltage (0=Automatic) (V) ", 0) |
1096 | self.settings["maxvoltage"] = Setting("Maximum Bettery Voltage (0=Automatic) (V) ", 0) |
1226 | self.settings["maxvoltage"] = Setting("Maximum Bettery Voltage (0=Automatic) (V) ", 0) |
1097 | 1227 | ||
1098 | 1228 | ||
1099 | self.readSettings() |
1229 | self.readSettings() |
1100 | 1230 | ||
1101 | if len(sys.argv)>1: |
1231 | if len(sys.argv)>1: |
1102 | self.loadTests(sys.argv[1]) |
1232 | self.loadTests(sys.argv[1]) |
1103 | 1233 | ||
1104 | 1234 | ||
1105 | def readSettings(self): |
1235 | def readSettings(self): |
1106 | print "Reading settings" |
1236 | print "Reading settings" |
1107 | cp = ConfigParser.ConfigParser() |
1237 | cp = ConfigParser.ConfigParser() |
1108 | 1238 | ||
1109 | try: |
1239 | try: |
1110 | cp.read("%s/%s" % (rootPath, App.SETTINGSFILE)) |
1240 | cp.read("%s/%s" % (rootPath, App.SETTINGSFILE)) |
1111 | for setting in cp.items("DEFAULT"): |
1241 | for setting in cp.items("DEFAULT"): |
1112 | print " ",setting |
1242 | print " ",setting |
1113 | try: |
1243 | try: |
1114 | self.settings[setting[0]].set(setting[1]) |
1244 | self.settings[setting[0]].set(setting[1]) |
1115 | except: |
1245 | except: |
1116 | print "WARNING, unknown setting" |
1246 | print "WARNING, unknown setting" |
1117 | except: |
1247 | except: |
1118 | print "ERROR reading settingsfile" |
1248 | print "ERROR reading settingsfile" |
1119 | self.onSettingsChanged(False) |
1249 | self.onSettingsChanged(False) |
1120 | 1250 | ||
1121 | def storeSettings(self): |
1251 | def storeSettings(self): |
1122 | print "Storing settings" |
1252 | print "Storing settings" |
1123 | 1253 | ||
1124 | cp = ConfigParser.ConfigParser() |
1254 | cp = ConfigParser.ConfigParser() |
1125 | for setting in self.settings.iteritems(): |
1255 | for setting in self.settings.iteritems(): |
1126 | cp.set("", setting[0], setting[1].value) |
1256 | cp.set("", setting[0], setting[1].value) |
1127 | 1257 | ||
1128 | file = open("%s/%s" % (rootPath, App.SETTINGSFILE), "w") |
1258 | file = open("%s/%s" % (rootPath, App.SETTINGSFILE), "w") |
1129 | cp.write(file) |
1259 | cp.write(file) |
1130 | file.close() |
1260 | file.close() |
1131 | 1261 | ||
1132 | 1262 | ||
1133 | def onSettingsChanged(self, store): |
1263 | def onSettingsChanged(self, store): |
1134 | if store: |
1264 | if store: |
1135 | self.storeSettings() |
1265 | self.storeSettings() |
1136 | 1266 | ||
1137 | if self.settings["calcmethod"].value == "rms": |
1267 | if self.settings["calcmethod"].value == "rms": |
1138 | VibTest.useRms = True |
1268 | VibTest.useRms = True |
1139 | else: |
1269 | else: |
1140 | VibTest.useRms = False |
1270 | VibTest.useRms = False |
1141 | 1271 | ||
1142 | VibTest.fc1 = self.settings["hpf"].value |
1272 | VibTest.fc1 = self.settings["hpf"].value |
1143 | VibTest.fc2 = self.settings["lpf"].value |
1273 | VibTest.fc2 = self.settings["lpf"].value |
1144 | 1274 | ||
1145 | for test in self.VibTests: |
1275 | for test in self.VibTests: |
1146 | test.refresh() |
1276 | test.refresh() |
1147 | self.frame_1.refreshData() |
1277 | self.frame_1.refreshData() |
1148 | 1278 | ||
1149 | def AddTest2(self, vibTest): |
1279 | def AddTest2(self, vibTest): |
1150 | self.VibTests.append(vibTest) |
1280 | self.VibTests.append(vibTest) |
1151 | self.frame_1.onNewTest(vibTest) |
1281 | self.frame_1.onNewTest(vibTest) |
1152 | 1282 | ||
1153 | def AddTest(self, descr, voltage, motor, speed, channel, rawData): |
1283 | def AddTest(self, descr, voltage, motor, speed, channel, rawData): |
1154 | test = VibTest(descr, voltage, motor, speed, channel, rawData) |
1284 | test = VibTest(descr, voltage, motor, speed, channel, rawData) |
1155 | self.AddTest2(test) |
1285 | self.AddTest2(test) |
1156 | 1286 | ||
1157 | def removeTest(self, idx): |
1287 | def removeTest(self, idx): |
1158 | del(self.VibTests[idx]) |
1288 | del(self.VibTests[idx]) |
1159 | 1289 | ||
1160 | def getTest(self, testId): |
1290 | def getTest(self, testId): |
1161 | return self.VibTests[testId] |
1291 | return self.VibTests[testId] |
1162 | 1292 | ||
1163 | def OnInit(self): |
1293 | def OnInit(self): |
1164 | wx.InitAllImageHandlers() |
1294 | wx.InitAllImageHandlers() |
- | 1295 | ||
1165 | self.frame_1 = MainFrame(None, -1, "") |
1296 | self.frame_1 = MainFrame(None, -1, "") |
1166 | self.frame_1.setApp(self); |
1297 | self.frame_1.setApp(self) |
1167 | self.SetTopWindow(self.frame_1) |
1298 | self.SetTopWindow(self.frame_1) |
1168 | - | ||
1169 | self.frame_1.CenterOnScreen() |
1299 | self.frame_1.CenterOnScreen() |
1170 | self.frame_1.Show() |
1300 | self.frame_1.Show() |
- | 1301 | ||
- | 1302 | self.mkSettingsFrame = MkSettingsDialog(None, -1, "") |
|
- | 1303 | self.mkSettingsFrame.setApp(self); |
|
- | 1304 | self.mkSettingsFrame.Show() |
|
- | 1305 | ||
1171 | return 1 |
1306 | return 1 |
1172 | 1307 | ||
1173 | def saveTests(self, filePath): |
1308 | def saveTests(self, filePath): |
1174 | try: |
1309 | try: |
1175 | logfile = open(filePath, "r") |
1310 | logfile = open(filePath, "r") |
1176 | newFile = False |
1311 | newFile = False |
1177 | logfile.close() |
1312 | logfile.close() |
1178 | except: |
1313 | except: |
1179 | newFile = True |
1314 | newFile = True |
1180 | 1315 | ||
1181 | for test in self.VibTests: |
1316 | for test in self.VibTests: |
1182 | if newFile: |
1317 | if newFile: |
1183 | logfile = open(filePath, "w") |
1318 | logfile = open(filePath, "w") |
1184 | print "Writing result to %s ..." % filePath, |
1319 | print "Writing result to %s ..." % filePath, |
1185 | logfile.write("%s %d %s\n" % (test.descr, test.speed, test.channel)) |
1320 | logfile.write("%s %d %s\n" % (test.descr, test.speed, test.channel)) |
1186 | for value in test.rawData: |
1321 | for value in test.rawData: |
1187 | logfile.write("%d\n" % value) |
1322 | logfile.write("%d\n" % value) |
1188 | logfile.close() |
1323 | logfile.close() |
1189 | print "OK" |
1324 | print "OK" |
1190 | else: |
1325 | else: |
1191 | print "Appending result to %s ..." % filePath, |
1326 | print "Appending result to %s ..." % filePath, |
1192 | logfile = open(filePath, "r") |
1327 | logfile = open(filePath, "r") |
1193 | prevData = [] |
1328 | prevData = [] |
1194 | for line in logfile: |
1329 | for line in logfile: |
1195 | prevData.append(line[:-1]) |
1330 | prevData.append(line[:-1]) |
1196 | logfile.close() |
1331 | logfile.close() |
1197 | logfile = open(filePath, "w") |
1332 | logfile = open(filePath, "w") |
1198 | logfile.write("%s,%s %d %s\n" % (prevData[0], test.descr, test.speed, test.channel)) |
1333 | logfile.write("%s,%s %d %s\n" % (prevData[0], test.descr, test.speed, test.channel)) |
1199 | i = 1 |
1334 | i = 1 |
1200 | for value in test.rawData: |
1335 | for value in test.rawData: |
1201 | logfile.write("%s,%d\n" % (prevData[i], value)) |
1336 | logfile.write("%s,%d\n" % (prevData[i], value)) |
1202 | i += 1 |
1337 | i += 1 |
1203 | logfile.close() |
1338 | logfile.close() |
1204 | print "OK" |
1339 | print "OK" |
1205 | newFile = False |
1340 | newFile = False |
1206 | 1341 | ||
1207 | 1342 | ||
1208 | def loadTests(self, filePath): |
1343 | def loadTests(self, filePath): |
1209 | 1344 | ||
1210 | print "Importing file \"%s\"" % filePath |
1345 | print "Importing file \"%s\"" % filePath |
1211 | 1346 | ||
1212 | logfile = open(filePath, "r") |
1347 | logfile = open(filePath, "r") |
1213 | data = None |
1348 | data = None |
1214 | 1349 | ||
1215 | headers = (logfile.readline()[:-1]).split(',') |
1350 | headers = (logfile.readline()[:-1]).split(',') |
1216 | nbCols = len(headers) |
1351 | nbCols = len(headers) |
1217 | print "NbCols =", nbCols |
1352 | print "NbCols =", nbCols |
1218 | 1353 | ||
1219 | data = [] |
1354 | data = [] |
1220 | descr = [] |
1355 | descr = [] |
1221 | speed = [] |
1356 | speed = [] |
1222 | channel = [] |
1357 | channel = [] |
1223 | for c in range(nbCols): |
1358 | for c in range(nbCols): |
1224 | data.append([]) |
1359 | data.append([]) |
1225 | h = headers[c].split(' ') |
1360 | h = headers[c].split(' ') |
1226 | descr.append(h[0]); |
1361 | descr.append(h[0]); |
1227 | speed.append(h[1]); |
1362 | speed.append(h[1]); |
1228 | channel.append(h[2]); |
1363 | channel.append(h[2]); |
1229 | 1364 | ||
1230 | for line in logfile: |
1365 | for line in logfile: |
1231 | values = line.split(',') |
1366 | values = line.split(',') |
1232 | for i in range(nbCols): |
1367 | for i in range(nbCols): |
1233 | data[i].append(int(values[i])) |
1368 | data[i].append(int(values[i])) |
1234 | logfile.close() |
1369 | logfile.close() |
1235 | 1370 | ||
1236 | for c in range(nbCols): |
1371 | for c in range(nbCols): |
1237 | if (len(data[c]) % 2) != 0: |
1372 | if (len(data[c]) % 2) != 0: |
1238 | data[c].append(data[c][-1]) |
1373 | data[c].append(data[c][-1]) |
1239 | self.AddTest(descr[c], 0, 0, int(speed[c]), channel[c], data[c]) |
1374 | self.AddTest(descr[c], 0, 0, int(speed[c]), channel[c], data[c]) |
1240 | 1375 | ||
1241 | def startMeasure(self, measureParams, dialog): |
1376 | def startMeasure(self, measureParams, dialog): |
1242 | print "Start measuring" |
1377 | print "Start measuring" |
1243 | 1378 | ||
1244 | measureParams.serialPort = self.settings["serialport"].value |
1379 | measureParams.serialPort = self.settings["serialport"].value |
1245 | measureParams.motorStartupSpeed = self.settings["startupspeed"].value |
1380 | measureParams.motorStartupSpeed = self.settings["startupspeed"].value |
1246 | measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value |
1381 | measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value |
1247 | measureParams.minVoltage = self.settings["minvoltage"].value |
1382 | measureParams.minVoltage = self.settings["minvoltage"].value |
1248 | measureParams.maxVoltage = self.settings["maxvoltage"].value |
1383 | measureParams.maxVoltage = self.settings["maxvoltage"].value |
1249 | 1384 | ||
1250 | self.measureThread = MeasureThread(measureParams, dialog) |
1385 | self.measureThread = MeasureThread(measureParams, dialog) |
1251 | self.measureThread.start() |
1386 | self.measureThread.start() |
1252 | 1387 | ||
1253 | def cancelMeasurement(self): |
1388 | def cancelMeasurement(self): |
1254 | print "Measuring CANCEL" |
1389 | print "Measuring CANCEL" |
1255 | 1390 | ||
1256 | self.measureThread.stop() |
1391 | self.measureThread.stop() |
1257 | 1392 | ||
1258 | 1393 | ||
1259 | 1394 | ||
1260 | 1395 | ||
1261 | 1396 | ||
1262 | 1397 | ||
1263 | 1398 | ||
1264 | 1399 | ||
1265 | # end of class App |
1400 | # end of class App |
1266 | 1401 | ||
1267 | if __name__ == "__main__": |
1402 | if __name__ == "__main__": |
1268 | 1403 | ||
1269 | rootPath = os.path.abspath(os.path.dirname(sys.argv[0])) |
1404 | rootPath = os.path.abspath(os.path.dirname(sys.argv[0])) |
1270 | 1405 | ||
1271 | print rootPath |
1406 | print rootPath |
1272 | 1407 | ||
1273 | VibrationTestGui = App(0) |
1408 | VibrationTestGui = App(0) |
1274 | VibrationTestGui.MainLoop() |
1409 | VibrationTestGui.MainLoop() |
1275 | 1410 |