Rev 619 | Rev 626 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 619 | Rev 623 | ||
---|---|---|---|
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 | import sys |
5 | import sys |
6 | import os |
6 | import os |
7 | import time |
7 | import time |
8 | import thread |
8 | import thread |
9 | import ConfigParser |
9 | import ConfigParser |
10 | 10 | ||
11 | import wx |
11 | import wx |
12 | import wx.lib |
12 | import wx.lib |
13 | import wx.lib.plot |
13 | import wx.lib.plot |
14 | import wx.lib.newevent |
14 | import wx.lib.newevent |
- | 15 | import wx.lib.agw.speedmeter as speedmeter |
|
15 | 16 | ||
16 | import mkProto |
17 | import mkProto |
17 | 18 | ||
18 | 19 | ||
19 | 20 | ||
20 | CHANNEL_NAMES = ["GyroYaw", "GyroRoll", "GyroNick", "Pressure", "Batt", "AccTop", "AccRoll", "AccNick"] |
21 | CHANNEL_NAMES = ["GyroYaw", "GyroRoll", "GyroNick", "Pressure", "Batt", "AccTop", "AccRoll", "AccNick"] |
21 | FS = 11111 |
22 | FS = 11111 |
- | 23 | pi = 3.14 |
|
22 | 24 | ||
23 | # Needs Numeric or numarray or NumPy |
25 | # Needs Numeric or numarray or NumPy |
24 | try: |
26 | try: |
25 | import numpy.oldnumeric as _Numeric |
27 | import numpy.oldnumeric as _Numeric |
26 | except: |
28 | except: |
27 | try: |
29 | try: |
28 | import numarray as _Numeric #if numarray is used it is renamed Numeric |
30 | import numarray as _Numeric #if numarray is used it is renamed Numeric |
29 | except: |
31 | except: |
30 | try: |
32 | try: |
31 | import Numeric as _Numeric |
33 | import Numeric as _Numeric |
32 | except: |
34 | except: |
33 | msg= """ |
35 | msg= """ |
34 | This module requires the Numeric/numarray or NumPy module, |
36 | This module requires the Numeric/numarray or NumPy module, |
35 | which could not be imported. It probably is not installed |
37 | which could not be imported. It probably is not installed |
36 | (it's not part of the standard Python distribution). See the |
38 | (it's not part of the standard Python distribution). See the |
37 | Numeric Python site (http://numpy.scipy.org) for information on |
39 | Numeric Python site (http://numpy.scipy.org) for information on |
38 | downloading source or binaries.""" |
40 | downloading source or binaries.""" |
39 | raise ImportError, "Numeric,numarray or NumPy not found. \n" + msg |
41 | raise ImportError, "Numeric,numarray or NumPy not found. \n" + msg |
40 | 42 | ||
41 | # begin wxGlade: extracode |
43 | # begin wxGlade: extracode |
42 | # end wxGlade |
44 | # end wxGlade |
43 | 45 | ||
44 | 46 | ||
45 | # This creates a new Event class and a EVT binder function |
47 | # This creates a new Event class and a EVT binder function |
46 | (MeasStatusUpdateEvent, EVT_MEAS_STATUS_UPDATE) = wx.lib.newevent.NewEvent() |
48 | (MeasStatusUpdateEvent, EVT_MEAS_STATUS_UPDATE) = wx.lib.newevent.NewEvent() |
47 | (MeasDataEvent, EVT_MEAS_DATA) = wx.lib.newevent.NewEvent() |
49 | (MeasDataEvent, EVT_MEAS_DATA) = wx.lib.newevent.NewEvent() |
48 | 50 | ||
49 | class MeasureDialog(wx.Dialog): |
51 | class MeasureDialog(wx.Dialog): |
50 | def __init__(self, *args, **kwds): |
52 | def __init__(self, *args, **kwds): |
51 | # begin wxGlade: MeasureDialog.__init__ |
53 | # begin wxGlade: MeasureDialog.__init__ |
52 | kwds["style"] = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.THICK_FRAME |
54 | kwds["style"] = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.THICK_FRAME |
53 | wx.Dialog.__init__(self, *args, **kwds) |
55 | wx.Dialog.__init__(self, *args, **kwds) |
54 | self.text_ctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) |
56 | self.text_ctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) |
55 | self.button = wx.Button(self, -1, "STOP") |
57 | self.button = wx.Button(self, -1, "STOP") |
56 | - | ||
- | 58 | self.voltageCtrl = speedmeter.SpeedMeter(self, extrastyle=speedmeter.SM_DRAW_HAND | speedmeter.SM_DRAW_PARTIAL_SECTORS | speedmeter.SM_DRAW_MIDDLE_ICON ) |
|
- | 59 | 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) |
|
57 | self.__set_properties() |
60 | self.__set_properties() |
58 | self.__do_layout() |
61 | self.__do_layout() |
59 | 62 | ||
60 | self.Bind(wx.EVT_BUTTON, self.onButton, self.button) |
63 | self.Bind(wx.EVT_BUTTON, self.onButton, self.button) |
61 | # end wxGlade |
64 | # end wxGlade |
- | 65 | ||
- | 66 | YELLOW = wx.Colour(255, 240, 0) |
|
- | 67 | BG = wx.Colour(0x80, 0x80, 0x80) |
|
- | 68 | # Configure Voltage Ctrl |
|
- | 69 | #self.voltageCtrl.SetAngleRange(-3.14/3, 3.14/3) |
|
- | 70 | self.voltageCtrl.SetAngleRange(0,pi) |
|
- | 71 | intervals = range(0, 5) |
|
- | 72 | self.voltageCtrl.SetIntervals(intervals) |
|
- | 73 | colours = [wx.RED, wx.GREEN, wx.GREEN, YELLOW] |
|
- | 74 | self.voltageCtrl.SetIntervalColours(colours) |
|
- | 75 | ticks = ["", "", "", "", ""] |
|
- | 76 | self.voltageCtrl.SetTicks(ticks) |
|
- | 77 | self.voltageCtrl.SetTicksColour(wx.WHITE) |
|
- | 78 | self.voltageCtrl.SetHandColour(YELLOW) |
|
- | 79 | ||
- | 80 | icon = wx.Icon("fuel.ico", wx.BITMAP_TYPE_ICO) |
|
- | 81 | icon.SetWidth(24) |
|
- | 82 | icon.SetHeight(24) |
|
- | 83 | ||
- | 84 | self.voltageCtrl.SetMiddleIcon(icon) |
|
- | 85 | self.voltageCtrl.SetSpeedBackground(BG) |
|
- | 86 | self.voltageCtrl.SetArcColour(wx.WHITE) |
|
- | 87 | self.voltageCtrl.SetSpeedValue(2) |
|
- | 88 | ||
- | 89 | ||
- | 90 | # Configure Speed Ctr; |
|
- | 91 | #self.speedCtrl.SetAngleRange(-pi/6, 7*pi/6) |
|
- | 92 | self.speedCtrl.SetAngleRange(0,pi) |
|
- | 93 | intervals = range(0, 261, 20) |
|
- | 94 | self.speedCtrl.SetIntervals(intervals) |
|
- | 95 | ||
- | 96 | colours = [BG]*(len(intervals)-1) |
|
- | 97 | for i in range(5,10): |
|
- | 98 | colours[i] = wx.GREEN |
|
- | 99 | self.speedCtrl.SetIntervalColours(colours) |
|
- | 100 | ticks = [str(interval) for interval in intervals] |
|
- | 101 | self.speedCtrl.SetTicks(ticks) |
|
- | 102 | self.speedCtrl.SetTicksColour(wx.WHITE) |
|
- | 103 | self.speedCtrl.SetNumberOfSecondaryTicks(1) |
|
- | 104 | self.speedCtrl.SetTicksFont(wx.Font(7, wx.SWISS, wx.NORMAL, wx.NORMAL)) |
|
- | 105 | self.speedCtrl.SetMiddleText("Speed") |
|
- | 106 | self.speedCtrl.SetMiddleTextColour(wx.WHITE) |
|
- | 107 | self.speedCtrl.SetMiddleTextFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD)) |
|
- | 108 | self.speedCtrl.SetHandColour(YELLOW) |
|
- | 109 | self.speedCtrl.SetSpeedBackground(BG) |
|
- | 110 | self.speedCtrl.SetArcColour(wx.WHITE) |
|
- | 111 | self.speedCtrl.SetSpeedValue(0) |
|
- | 112 | ||
62 | 113 | ||
63 | self.running = True |
114 | self.running = True |
64 | self.Bind(EVT_MEAS_STATUS_UPDATE, self.OnUpdate) |
115 | self.Bind(EVT_MEAS_STATUS_UPDATE, self.OnUpdate) |
65 | self.Bind(EVT_MEAS_DATA, self.OnData) |
116 | self.Bind(EVT_MEAS_DATA, self.OnData) |
66 | # The first argument that is passed to the constructor is the parent |
117 | # The first argument that is passed to the constructor is the parent |
67 | self.app = args[0].app |
118 | self.app = args[0].app |
68 | self.error = False |
119 | self.error = False |
- | 120 | self.firstVoltage = True |
|
- | 121 | ||
69 | 122 | ||
70 | def __set_properties(self): |
123 | def __set_properties(self): |
71 | # begin wxGlade: MeasureDialog.__set_properties |
124 | # begin wxGlade: MeasureDialog.__set_properties |
72 | self.SetTitle("Measuring Status") |
125 | self.SetTitle("Measuring Status") |
73 | self.text_ctrl_1.SetMinSize((400,300)) |
126 | self.text_ctrl_1.SetMinSize((400,300)) |
- | 127 | self.voltageCtrl.SetMinSize((50,-1)) |
|
- | 128 | self.speedCtrl.SetMinSize((50,-1)) |
|
74 | # end wxGlade |
129 | # end wxGlade |
75 | 130 | ||
76 | def __do_layout(self): |
131 | def __do_layout(self): |
77 | # begin wxGlade: MeasureDialog.__do_layout |
132 | # begin wxGlade: MeasureDialog.__do_layout |
78 | sizer_1 = wx.BoxSizer(wx.HORIZONTAL) |
133 | sizer_1 = wx.BoxSizer(wx.HORIZONTAL) |
- | 134 | sizer_4 = wx.BoxSizer(wx.VERTICAL) |
|
79 | sizer_2 = wx.BoxSizer(wx.VERTICAL) |
135 | sizer_2 = wx.BoxSizer(wx.VERTICAL) |
80 | sizer_1.Add((20, 20), 0, 0, 0) |
136 | sizer_1.Add((20, 20), 0, 0, 0) |
81 | sizer_2.Add((20, 20), 0, 0, 0) |
137 | sizer_2.Add((20, 20), 0, 0, 0) |
82 | sizer_2.Add(self.text_ctrl_1, 1, wx.EXPAND, 0) |
138 | sizer_2.Add(self.text_ctrl_1, 1, wx.EXPAND, 0) |
83 | sizer_2.Add((20, 20), 0, 0, 0) |
139 | sizer_2.Add((20, 20), 0, 0, 0) |
84 | sizer_2.Add(self.button, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) |
140 | sizer_2.Add(self.button, 0, wx.ALIGN_CENTER_HORIZONTAL, 0) |
85 | sizer_2.Add((20, 20), 0, 0, 0) |
141 | sizer_2.Add((20, 20), 0, 0, 0) |
86 | sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) |
142 | sizer_1.Add(sizer_2, 1, wx.EXPAND, 0) |
87 | sizer_1.Add((20, 20), 0, 0, 0) |
143 | sizer_1.Add((20, 20), 0, 0, 0) |
- | 144 | sizer_4.Add(self.voltageCtrl, 1, wx.EXPAND, 0) |
|
- | 145 | sizer_4.Add(self.speedCtrl, 1, wx.EXPAND, 0) |
|
- | 146 | sizer_1.Add(sizer_4, 1, wx.EXPAND, 0) |
|
- | 147 | sizer_1.Add((20, 20), 0, 0, 0) |
|
88 | self.SetSizer(sizer_1) |
148 | self.SetSizer(sizer_1) |
89 | sizer_1.Fit(self) |
149 | sizer_1.Fit(self) |
90 | self.Layout() |
150 | self.Layout() |
91 | # end wxGlade |
151 | # end wxGlade |
92 | 152 | ||
93 | def OnData(self, evt): |
153 | def OnData(self, evt): |
94 | print "Received Data" |
154 | print "Received Data" |
95 | self.app.AddTest2(evt.vibTest) |
155 | self.app.AddTest2(evt.vibTest) |
96 | 156 | ||
97 | def OnUpdate(self, evt): |
157 | def OnUpdate(self, evt): |
98 | print "Status update" |
158 | print "Status update" |
99 | self.running = evt.running |
159 | self.running = evt.running |
100 | if evt.error: |
160 | if evt.error: |
101 | self.error = True; |
161 | self.error = True; |
102 | self.text_ctrl_1.WriteText("ERROR: ") |
162 | self.text_ctrl_1.WriteText("ERROR: ") |
103 | self.text_ctrl_1.SetBackgroundColour("Red") |
163 | self.text_ctrl_1.SetBackgroundColour("Red") |
104 | self.text_ctrl_1.WriteText("%s\n"%evt.msg) |
164 | self.text_ctrl_1.WriteText("%s\n"%evt.msg) |
105 | if (not self.running): |
165 | if (not self.running): |
106 | if (not self.error): |
166 | if (not self.error): |
107 | self.text_ctrl_1.SetBackgroundColour("Green") |
167 | self.text_ctrl_1.SetBackgroundColour("Green") |
108 | self.text_ctrl_1.write(" ") # so that the background is redrawn |
168 | self.text_ctrl_1.write(" ") # so that the background is redrawn |
109 | self.button.SetLabel("Close") |
169 | self.button.SetLabel("Close") |
- | 170 | ||
- | 171 | if evt.speed != None: |
|
- | 172 | self.speedCtrl.SetSpeedValue(evt.speed) |
|
- | 173 | ||
- | 174 | if evt.voltage != None: |
|
- | 175 | vmin,vmax,v = evt.voltage |
|
- | 176 | if self.firstVoltage: |
|
- | 177 | ticks = ["", "%.1f V"%vmin, "", "%.1f V"%vmax, ""] |
|
- | 178 | self.voltageCtrl.SetTicks(ticks) |
|
- | 179 | self.firstVoltage = False |
|
- | 180 | i = (v-vmin)/(vmax-vmin) # 0..1 |
|
- | 181 | i *= 2 |
|
- | 182 | i = i+1 |
|
- | 183 | i = min(max(i,0),5) |
|
- | 184 | self.voltageCtrl.SetSpeedValue(i) |
|
- | 185 | ||
110 | 186 | ||
111 | 187 | ||
112 | def onButton(self, event): # wxGlade: MeasureDialog.<event_handler> |
188 | def onButton(self, event): # wxGlade: MeasureDialog.<event_handler> |
113 | if (not self.running): |
189 | if (not self.running): |
114 | self.Destroy() |
190 | self.Destroy() |
115 | else: |
191 | else: |
116 | self.app.cancelMeasurement() |
192 | self.app.cancelMeasurement() |
117 | 193 | ||
118 | # end of class MeasureDialog |
194 | # end of class MeasureDialog |
119 | 195 | ||
120 | 196 | ||
121 | class SettingsDialog(wx.Dialog): |
197 | class SettingsDialog(wx.Dialog): |
122 | def __init__(self, *args, **kwds): |
198 | def __init__(self, *args, **kwds): |
123 | # begin wxGlade: SettingsDialog.__init__ |
199 | # begin wxGlade: SettingsDialog.__init__ |
124 | kwds["style"] = wx.DEFAULT_DIALOG_STYLE |
200 | kwds["style"] = wx.DEFAULT_DIALOG_STYLE |
125 | wx.Dialog.__init__(self, *args, **kwds) |
201 | wx.Dialog.__init__(self, *args, **kwds) |
126 | self.button_5 = wx.Button(self, wx.ID_CANCEL, "") |
202 | self.button_5 = wx.Button(self, wx.ID_CANCEL, "") |
127 | self.button_6 = wx.Button(self, wx.ID_OK, "") |
203 | self.button_6 = wx.Button(self, wx.ID_OK, "") |
128 | 204 | ||
129 | self.__set_properties() |
205 | self.__set_properties() |
130 | self.__do_layout() |
206 | self.__do_layout() |
131 | 207 | ||
132 | self.Bind(wx.EVT_BUTTON, self.onOK, self.button_6) |
208 | self.Bind(wx.EVT_BUTTON, self.onOK, self.button_6) |
133 | # end wxGlade |
209 | # end wxGlade |
134 | 210 | ||
135 | # The first argument that is passed to the constructor is the parent |
211 | # The first argument that is passed to the constructor is the parent |
136 | self.settings = args[0].app.settings |
212 | self.settings = args[0].app.settings |
137 | # Add text-boxes for all settings |
213 | # Add text-boxes for all settings |
138 | self.tb = [] |
214 | self.tb = [] |
139 | self.grid_sizer_2.SetRows(len(self.settings)) |
215 | self.grid_sizer_2.SetRows(len(self.settings)) |
140 | for setting in self.settings.iteritems(): |
216 | for setting in self.settings.iteritems(): |
141 | lb = wx.StaticText(self, -1, setting[1].descr, style=wx.ALIGN_RIGHT) |
217 | lb = wx.StaticText(self, -1, setting[1].descr, style=wx.ALIGN_RIGHT) |
142 | tb = wx.TextCtrl(self, -1, str(setting[1].value)) |
218 | tb = wx.TextCtrl(self, -1, str(setting[1].value)) |
143 | self.grid_sizer_2.Add(lb, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
219 | self.grid_sizer_2.Add(lb, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
144 | self.grid_sizer_2.Add(tb, 0, 0, 0) |
220 | self.grid_sizer_2.Add(tb, 0, 0, 0) |
145 | self.tb.append(tb) |
221 | self.tb.append(tb) |
146 | self.sizer_5.Fit(self) |
222 | self.sizer_5.Fit(self) |
147 | self.Layout() |
223 | self.Layout() |
148 | 224 | ||
149 | def __set_properties(self): |
225 | def __set_properties(self): |
150 | # begin wxGlade: SettingsDialog.__set_properties |
226 | # begin wxGlade: SettingsDialog.__set_properties |
151 | self.SetTitle("Settings") |
227 | self.SetTitle("Settings") |
152 | # end wxGlade |
228 | # end wxGlade |
153 | 229 | ||
154 | def __do_layout(self): |
230 | def __do_layout(self): |
155 | # begin wxGlade: SettingsDialog.__do_layout |
231 | # begin wxGlade: SettingsDialog.__do_layout |
156 | sizer_5 = wx.BoxSizer(wx.VERTICAL) |
232 | sizer_5 = wx.BoxSizer(wx.VERTICAL) |
157 | grid_sizer_3 = wx.GridSizer(1, 2, 0, 0) |
233 | grid_sizer_3 = wx.GridSizer(1, 2, 0, 0) |
158 | sizer_6 = wx.BoxSizer(wx.HORIZONTAL) |
234 | sizer_6 = wx.BoxSizer(wx.HORIZONTAL) |
159 | grid_sizer_2 = wx.GridSizer(1, 2, 4, 4) |
235 | grid_sizer_2 = wx.GridSizer(1, 2, 4, 4) |
160 | sizer_5.Add((20, 20), 0, 0, 0) |
236 | sizer_5.Add((20, 20), 0, 0, 0) |
161 | sizer_6.Add((20, 20), 0, 0, 0) |
237 | sizer_6.Add((20, 20), 0, 0, 0) |
162 | sizer_6.Add(grid_sizer_2, 0, 0, 0) |
238 | sizer_6.Add(grid_sizer_2, 0, 0, 0) |
163 | sizer_6.Add((20, 20), 0, 0, 0) |
239 | sizer_6.Add((20, 20), 0, 0, 0) |
164 | sizer_5.Add(sizer_6, 1, wx.EXPAND, 0) |
240 | sizer_5.Add(sizer_6, 1, wx.EXPAND, 0) |
165 | sizer_5.Add((20, 20), 0, 0, 0) |
241 | sizer_5.Add((20, 20), 0, 0, 0) |
166 | grid_sizer_3.Add(self.button_5, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) |
242 | grid_sizer_3.Add(self.button_5, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) |
167 | grid_sizer_3.Add(self.button_6, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) |
243 | grid_sizer_3.Add(self.button_6, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0) |
168 | sizer_5.Add(grid_sizer_3, 0, wx.EXPAND, 0) |
244 | sizer_5.Add(grid_sizer_3, 0, wx.EXPAND, 0) |
169 | sizer_5.Add((20, 20), 0, 0, 0) |
245 | sizer_5.Add((20, 20), 0, 0, 0) |
170 | self.SetSizer(sizer_5) |
246 | self.SetSizer(sizer_5) |
171 | sizer_5.Fit(self) |
247 | sizer_5.Fit(self) |
172 | self.Layout() |
248 | self.Layout() |
173 | # end wxGlade |
249 | # end wxGlade |
174 | 250 | ||
175 | # Store some of the items, we will need them later |
251 | # Store some of the items, we will need them later |
176 | self.grid_sizer_2 = grid_sizer_2 |
252 | self.grid_sizer_2 = grid_sizer_2 |
177 | self.sizer_5 = sizer_5 |
253 | self.sizer_5 = sizer_5 |
178 | 254 | ||
179 | 255 | ||
180 | def onOK(self, event): # wxGlade: SettingsDialog.<event_handler> |
256 | def onOK(self, event): # wxGlade: SettingsDialog.<event_handler> |
181 | print "Updating parameters" |
257 | print "Updating parameters" |
182 | try: |
258 | try: |
183 | i=0 |
259 | i=0 |
184 | for setting in self.settings.iteritems(): |
260 | for setting in self.settings.iteritems(): |
185 | print setting[0], self.tb[i].GetValue() |
261 | print setting[0], self.tb[i].GetValue() |
186 | setting[1].set(self.tb[i].GetValue()) |
262 | setting[1].set(self.tb[i].GetValue()) |
187 | i += 1 |
263 | i += 1 |
188 | event.Skip() |
264 | event.Skip() |
189 | except: |
265 | except: |
190 | wx.MessageBox("Invalid format for \"%s\" setting." % setting[1].descr) |
266 | wx.MessageBox("Invalid format for \"%s\" setting." % setting[1].descr) |
191 | 267 | ||
192 | # end of class SettingsDialog |
268 | # end of class SettingsDialog |
193 | 269 | ||
194 | 270 | ||
195 | 271 | ||
196 | class MainFrame(wx.Frame): |
272 | class MainFrame(wx.Frame): |
197 | def __init__(self, *args, **kwds): |
273 | def __init__(self, *args, **kwds): |
198 | # begin wxGlade: MainFrame.__init__ |
274 | # begin wxGlade: MainFrame.__init__ |
199 | kwds["style"] = wx.DEFAULT_FRAME_STYLE |
275 | kwds["style"] = wx.DEFAULT_FRAME_STYLE |
200 | wx.Frame.__init__(self, *args, **kwds) |
276 | wx.Frame.__init__(self, *args, **kwds) |
201 | 277 | ||
202 | # Menu Bar |
278 | # Menu Bar |
203 | self.frame_1_menubar = wx.MenuBar() |
279 | self.frame_1_menubar = wx.MenuBar() |
204 | wxglade_tmp_menu = wx.Menu() |
280 | wxglade_tmp_menu = wx.Menu() |
205 | wxglade_tmp_menu.Append(101, "Settings", "", wx.ITEM_NORMAL) |
281 | wxglade_tmp_menu.Append(101, "Settings", "", wx.ITEM_NORMAL) |
206 | wxglade_tmp_menu.AppendSeparator() |
282 | wxglade_tmp_menu.AppendSeparator() |
207 | wxglade_tmp_menu.Append(150, "Exit", "", wx.ITEM_NORMAL) |
283 | wxglade_tmp_menu.Append(150, "Exit", "", wx.ITEM_NORMAL) |
208 | self.frame_1_menubar.Append(wxglade_tmp_menu, "File") |
284 | self.frame_1_menubar.Append(wxglade_tmp_menu, "File") |
209 | wxglade_tmp_menu = wx.Menu() |
285 | wxglade_tmp_menu = wx.Menu() |
210 | wxglade_tmp_menu.Append(301, "Clear All", "", wx.ITEM_NORMAL) |
286 | wxglade_tmp_menu.Append(301, "Clear All", "", wx.ITEM_NORMAL) |
211 | wxglade_tmp_menu.Append(302, "Clear Selected", "", wx.ITEM_NORMAL) |
287 | wxglade_tmp_menu.Append(302, "Clear Selected", "", wx.ITEM_NORMAL) |
212 | wxglade_tmp_menu.AppendSeparator() |
288 | wxglade_tmp_menu.AppendSeparator() |
213 | wxglade_tmp_menu.Append(303, "Load", "", wx.ITEM_NORMAL) |
289 | wxglade_tmp_menu.Append(303, "Load", "", wx.ITEM_NORMAL) |
214 | wxglade_tmp_menu.Append(304, "Save", "", wx.ITEM_NORMAL) |
290 | wxglade_tmp_menu.Append(304, "Save", "", wx.ITEM_NORMAL) |
215 | self.frame_1_menubar.Append(wxglade_tmp_menu, "TestSet") |
291 | self.frame_1_menubar.Append(wxglade_tmp_menu, "TestSet") |
216 | wxglade_tmp_menu = wx.Menu() |
292 | wxglade_tmp_menu = wx.Menu() |
217 | self.frame_1_menubar.Append(wxglade_tmp_menu, "MK") |
293 | self.frame_1_menubar.Append(wxglade_tmp_menu, "MK") |
218 | wxglade_tmp_menu = wx.Menu() |
294 | wxglade_tmp_menu = wx.Menu() |
219 | self.frame_1_menubar.Append(wxglade_tmp_menu, "Help") |
295 | self.frame_1_menubar.Append(wxglade_tmp_menu, "Help") |
220 | self.SetMenuBar(self.frame_1_menubar) |
296 | self.SetMenuBar(self.frame_1_menubar) |
221 | # Menu Bar end |
297 | # Menu Bar end |
222 | self.Description = wx.StaticText(self, -1, "Description") |
298 | self.Description = wx.StaticText(self, -1, "Description") |
223 | self.tcDescr = wx.TextCtrl(self, -1, "Test") |
299 | self.tcDescr = wx.TextCtrl(self, -1, "Test") |
224 | self.label_37 = wx.StaticText(self, -1, "Speed(s)") |
300 | self.label_37 = wx.StaticText(self, -1, "Speed(s)") |
225 | self.tcSpeeds = wx.TextCtrl(self, -1, "100-200:10") |
301 | self.tcSpeeds = wx.TextCtrl(self, -1, "100-200:10") |
226 | self.label_35 = wx.StaticText(self, -1, "Motor(s)") |
302 | self.label_35 = wx.StaticText(self, -1, "Motor(s)") |
227 | self.tcMotors = wx.TextCtrl(self, -1, "1") |
303 | self.tcMotors = wx.TextCtrl(self, -1, "1") |
228 | self.label_38 = wx.StaticText(self, -1, "") |
304 | self.label_38 = wx.StaticText(self, -1, "") |
229 | self.text_ctrl_10 = wx.TextCtrl(self, -1, "") |
305 | self.text_ctrl_10 = wx.TextCtrl(self, -1, "") |
230 | self.label_36 = wx.StaticText(self, -1, "Channel(s)") |
306 | self.label_36 = wx.StaticText(self, -1, "Channel(s)") |
231 | self.tcChannels = wx.TextCtrl(self, -1, "6") |
307 | self.tcChannels = wx.TextCtrl(self, -1, "6") |
232 | self.label_39 = wx.StaticText(self, -1, "") |
308 | self.label_39 = wx.StaticText(self, -1, "") |
233 | self.text_ctrl_11 = wx.TextCtrl(self, -1, "") |
309 | self.text_ctrl_11 = wx.TextCtrl(self, -1, "") |
234 | self.button_4 = wx.Button(self, -1, "Start") |
310 | self.button_4 = wx.Button(self, -1, "Start") |
235 | self.GraphPanel = wx.Panel(self, -1) |
311 | self.GraphPanel = wx.Panel(self, -1) |
236 | self.label_40 = wx.StaticText(self, -1, "Graph Type ") |
312 | self.label_40 = wx.StaticText(self, -1, "Graph Type ") |
237 | self.graphTypeChoice = wx.Choice(self, -1, choices=["Raw Signal", "Filtered Signal", "Spectrum"]) |
313 | self.graphTypeChoice = wx.Choice(self, -1, choices=["Raw Signal", "Filtered Signal", "Spectrum"]) |
238 | self.label_41 = wx.StaticText(self, -1, "Y Axis Range ") |
314 | self.label_41 = wx.StaticText(self, -1, "Y Axis Range ") |
239 | self.yAxisChoice = wx.Choice(self, -1, choices=["25", "50", "100", "200"]) |
315 | self.yAxisChoice = wx.Choice(self, -1, choices=["25", "50", "100", "200"]) |
240 | self.TestListCtrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) |
316 | self.TestListCtrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER) |
241 | 317 | ||
242 | self.__set_properties() |
318 | self.__set_properties() |
243 | self.__do_layout() |
319 | self.__do_layout() |
244 | 320 | ||
245 | self.Bind(wx.EVT_MENU, self.OnSettings, id=101) |
321 | self.Bind(wx.EVT_MENU, self.OnSettings, id=101) |
246 | self.Bind(wx.EVT_MENU, self.onClear, id=301) |
322 | self.Bind(wx.EVT_MENU, self.onClear, id=301) |
247 | self.Bind(wx.EVT_MENU, self.onClearSelected, id=302) |
323 | self.Bind(wx.EVT_MENU, self.onClearSelected, id=302) |
248 | self.Bind(wx.EVT_MENU, self.OnImport, id=303) |
324 | self.Bind(wx.EVT_MENU, self.OnImport, id=303) |
249 | self.Bind(wx.EVT_MENU, self.onExport, id=304) |
325 | self.Bind(wx.EVT_MENU, self.onExport, id=304) |
250 | self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.button_4) |
326 | self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.button_4) |
251 | self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice) |
327 | self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice) |
252 | self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice) |
328 | self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice) |
253 | # end wxGlade |
329 | # end wxGlade |
254 | 330 | ||
255 | def setApp(self, app): |
331 | def setApp(self, app): |
256 | self.app = app |
332 | self.app = app |
257 | 333 | ||
258 | def __set_properties(self): |
334 | def __set_properties(self): |
259 | # begin wxGlade: MainFrame.__set_properties |
335 | # begin wxGlade: MainFrame.__set_properties |
260 | self.SetTitle("VibrationTest") |
336 | self.SetTitle("VibrationTest") |
261 | self.SetSize((850, 700)) |
337 | self.SetSize((850, 700)) |
262 | self.Description.SetMinSize((53, 13)) |
338 | self.Description.SetMinSize((53, 13)) |
263 | self.button_4.SetMinSize((80, 80)) |
339 | self.button_4.SetMinSize((80, 80)) |
264 | self.GraphPanel.SetMinSize((800,300)) |
340 | self.GraphPanel.SetMinSize((800,300)) |
265 | self.graphTypeChoice.SetSelection(0) |
341 | self.graphTypeChoice.SetSelection(0) |
266 | self.yAxisChoice.SetSelection(1) |
342 | self.yAxisChoice.SetSelection(1) |
267 | self.TestListCtrl.SetMinSize((800,300)) |
343 | self.TestListCtrl.SetMinSize((800,300)) |
268 | # end wxGlade |
344 | # end wxGlade |
269 | 345 | ||
270 | def __do_layout(self): |
346 | def __do_layout(self): |
271 | # begin wxGlade: MainFrame.__do_layout |
347 | # begin wxGlade: MainFrame.__do_layout |
272 | sizer_3 = wx.BoxSizer(wx.HORIZONTAL) |
348 | sizer_3 = wx.BoxSizer(wx.HORIZONTAL) |
273 | sizer_8 = wx.BoxSizer(wx.VERTICAL) |
349 | sizer_8 = wx.BoxSizer(wx.VERTICAL) |
274 | sizer_11 = wx.BoxSizer(wx.VERTICAL) |
350 | sizer_11 = wx.BoxSizer(wx.VERTICAL) |
275 | sizer_12 = wx.BoxSizer(wx.HORIZONTAL) |
351 | sizer_12 = wx.BoxSizer(wx.HORIZONTAL) |
276 | sizer_9 = wx.BoxSizer(wx.HORIZONTAL) |
352 | sizer_9 = wx.BoxSizer(wx.HORIZONTAL) |
277 | sizer_10 = wx.BoxSizer(wx.HORIZONTAL) |
353 | sizer_10 = wx.BoxSizer(wx.HORIZONTAL) |
278 | grid_sizer_1 = wx.GridSizer(3, 4, 4, 5) |
354 | grid_sizer_1 = wx.GridSizer(3, 4, 4, 5) |
279 | sizer_3.Add((20, 20), 0, 0, 0) |
355 | sizer_3.Add((20, 20), 0, 0, 0) |
280 | sizer_8.Add((20, 20), 0, 0, 0) |
356 | sizer_8.Add((20, 20), 0, 0, 0) |
281 | grid_sizer_1.Add(self.Description, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
357 | grid_sizer_1.Add(self.Description, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
282 | grid_sizer_1.Add(self.tcDescr, 0, 0, 0) |
358 | grid_sizer_1.Add(self.tcDescr, 0, 0, 0) |
283 | grid_sizer_1.Add(self.label_37, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
359 | grid_sizer_1.Add(self.label_37, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
284 | grid_sizer_1.Add(self.tcSpeeds, 0, 0, 0) |
360 | grid_sizer_1.Add(self.tcSpeeds, 0, 0, 0) |
285 | grid_sizer_1.Add(self.label_35, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
361 | grid_sizer_1.Add(self.label_35, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
286 | grid_sizer_1.Add(self.tcMotors, 0, 0, 0) |
362 | grid_sizer_1.Add(self.tcMotors, 0, 0, 0) |
287 | grid_sizer_1.Add(self.label_38, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
363 | grid_sizer_1.Add(self.label_38, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
288 | grid_sizer_1.Add(self.text_ctrl_10, 0, 0, 0) |
364 | grid_sizer_1.Add(self.text_ctrl_10, 0, 0, 0) |
289 | grid_sizer_1.Add(self.label_36, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
365 | grid_sizer_1.Add(self.label_36, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
290 | grid_sizer_1.Add(self.tcChannels, 0, 0, 0) |
366 | grid_sizer_1.Add(self.tcChannels, 0, 0, 0) |
291 | grid_sizer_1.Add(self.label_39, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
367 | grid_sizer_1.Add(self.label_39, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0) |
292 | grid_sizer_1.Add(self.text_ctrl_11, 0, 0, 0) |
368 | grid_sizer_1.Add(self.text_ctrl_11, 0, 0, 0) |
293 | sizer_9.Add(grid_sizer_1, 0, 0, 0) |
369 | sizer_9.Add(grid_sizer_1, 0, 0, 0) |
294 | sizer_10.Add((50, 20), 0, 0, 0) |
370 | sizer_10.Add((50, 20), 0, 0, 0) |
295 | sizer_10.Add(self.button_4, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
371 | sizer_10.Add(self.button_4, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
296 | sizer_9.Add(sizer_10, 1, wx.EXPAND, 0) |
372 | sizer_9.Add(sizer_10, 1, wx.EXPAND, 0) |
297 | sizer_8.Add(sizer_9, 0, 0, 0) |
373 | sizer_8.Add(sizer_9, 0, 0, 0) |
298 | sizer_8.Add((20, 30), 0, 0, 0) |
374 | sizer_8.Add((20, 30), 0, 0, 0) |
299 | sizer_11.Add(self.GraphPanel, 1, wx.EXPAND, 0) |
375 | sizer_11.Add(self.GraphPanel, 1, wx.EXPAND, 0) |
300 | sizer_11.Add((20, 5), 0, 0, 0) |
376 | sizer_11.Add((20, 5), 0, 0, 0) |
301 | sizer_12.Add(self.label_40, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
377 | sizer_12.Add(self.label_40, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
302 | sizer_12.Add(self.graphTypeChoice, 0, 0, 0) |
378 | sizer_12.Add(self.graphTypeChoice, 0, 0, 0) |
303 | sizer_12.Add((40, 20), 0, 0, 0) |
379 | sizer_12.Add((40, 20), 0, 0, 0) |
304 | sizer_12.Add(self.label_41, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
380 | sizer_12.Add(self.label_41, 0, wx.ALIGN_CENTER_VERTICAL, 0) |
305 | sizer_12.Add(self.yAxisChoice, 0, 0, 0) |
381 | sizer_12.Add(self.yAxisChoice, 0, 0, 0) |
306 | sizer_11.Add(sizer_12, 0, 0, 0) |
382 | sizer_11.Add(sizer_12, 0, 0, 0) |
307 | sizer_8.Add(sizer_11, 0, 0, 0) |
383 | sizer_8.Add(sizer_11, 0, 0, 0) |
308 | sizer_8.Add((20, 30), 0, 0, 0) |
384 | sizer_8.Add((20, 30), 0, 0, 0) |
309 | sizer_8.Add(self.TestListCtrl, 1, 0, 0) |
385 | sizer_8.Add(self.TestListCtrl, 1, 0, 0) |
310 | sizer_8.Add((20, 20), 0, 0, 0) |
386 | sizer_8.Add((20, 20), 0, 0, 0) |
311 | sizer_3.Add(sizer_8, 1, wx.EXPAND, 0) |
387 | sizer_3.Add(sizer_8, 1, wx.EXPAND, 0) |
312 | self.SetSizer(sizer_3) |
388 | self.SetSizer(sizer_3) |
313 | self.Layout() |
389 | self.Layout() |
314 | self.SetSize((850, 700)) |
390 | self.SetSize((850, 700)) |
315 | # end wxGlade |
391 | # end wxGlade |
316 | 392 | ||
317 | # List events |
393 | # List events |
318 | self.TestListCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnTestSelected, self.TestListCtrl) |
394 | self.TestListCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnTestSelected, self.TestListCtrl) |
319 | 395 | ||
320 | # Configure Graph |
396 | # Configure Graph |
321 | self.client = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300)) |
397 | self.client = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300)) |
322 | 398 | ||
323 | self.client.SetPointLabelFunc(self.DrawPointLabel) |
399 | self.client.SetPointLabelFunc(self.DrawPointLabel) |
324 | 400 | ||
325 | self.client.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL)) |
401 | self.client.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL)) |
326 | self.client.SetFontSizeAxis(10) |
402 | self.client.SetFontSizeAxis(10) |
327 | self.client.SetFontSizeLegend(7) |
403 | self.client.SetFontSizeLegend(7) |
328 | self.client.setLogScale((False,False)) |
404 | self.client.setLogScale((False,False)) |
329 | 405 | ||
330 | 406 | ||
331 | # Configure TestListCtrl |
407 | # Configure TestListCtrl |
332 | self.TestListCtrl.InsertColumn(0, "Description") |
408 | self.TestListCtrl.InsertColumn(0, "Description") |
333 | self.TestListCtrl.InsertColumn(1, "Voltage") |
409 | self.TestListCtrl.InsertColumn(1, "Voltage") |
334 | self.TestListCtrl.InsertColumn(2, "Speed") |
410 | self.TestListCtrl.InsertColumn(2, "Speed") |
335 | self.TestListCtrl.InsertColumn(3, "Channel") |
411 | self.TestListCtrl.InsertColumn(3, "Channel") |
336 | self.TestListCtrl.InsertColumn(4, "Vibration Value") |
412 | self.TestListCtrl.InsertColumn(4, "Vibration Value") |
337 | self.TestListCtrl.SetColumnWidth(4, 500) |
413 | self.TestListCtrl.SetColumnWidth(4, 500) |
338 | 414 | ||
339 | def DrawPointLabel(self, dc, mDataDict): |
415 | def DrawPointLabel(self, dc, mDataDict): |
340 | """This is the fuction that defines how the pointLabels are plotted |
416 | """This is the fuction that defines how the pointLabels are plotted |
341 | dc - DC that will be passed |
417 | dc - DC that will be passed |
342 | mDataDict - Dictionary of data that you want to use for the pointLabel |
418 | mDataDict - Dictionary of data that you want to use for the pointLabel |
343 | 419 | ||
344 | As an example I have decided I want a box at the curve point |
420 | As an example I have decided I want a box at the curve point |
345 | with some text information about the curve plotted below. |
421 | with some text information about the curve plotted below. |
346 | Any wxDC method can be used. |
422 | Any wxDC method can be used. |
347 | """ |
423 | """ |
348 | # ---------- |
424 | # ---------- |
349 | dc.SetPen(wx.Pen(wx.BLACK)) |
425 | dc.SetPen(wx.Pen(wx.BLACK)) |
350 | dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) ) |
426 | dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) ) |
351 | 427 | ||
352 | sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point |
428 | sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point |
353 | dc.DrawRectangle( sx-5,sy-5, 10, 10) #10by10 square centered on point |
429 | dc.DrawRectangle( sx-5,sy-5, 10, 10) #10by10 square centered on point |
354 | px,py = mDataDict["pointXY"] |
430 | px,py = mDataDict["pointXY"] |
355 | cNum = mDataDict["curveNum"] |
431 | cNum = mDataDict["curveNum"] |
356 | pntIn = mDataDict["pIndex"] |
432 | pntIn = mDataDict["pIndex"] |
357 | legend = mDataDict["legend"] |
433 | legend = mDataDict["legend"] |
358 | #make a string to display |
434 | #make a string to display |
359 | s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn) |
435 | s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn) |
360 | dc.DrawText(s, sx , sy+1) |
436 | dc.DrawText(s, sx , sy+1) |
361 | # ----------- |
437 | # ----------- |
362 | 438 | ||
363 | 439 | ||
364 | def onNewTest(self, test): |
440 | def onNewTest(self, test): |
365 | index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr) |
441 | index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr) |
366 | self.TestListCtrl.SetStringItem(index, 1, "%.1f V" %test.voltage) |
442 | self.TestListCtrl.SetStringItem(index, 1, "%.1f V" %test.voltage) |
367 | self.TestListCtrl.SetStringItem(index, 2, str(test.speed)) |
443 | self.TestListCtrl.SetStringItem(index, 2, str(test.speed)) |
368 | self.TestListCtrl.SetStringItem(index, 3, test.channel) |
444 | self.TestListCtrl.SetStringItem(index, 3, test.channel) |
369 | 445 | ||
370 | vv = int(test.getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value)) |
446 | vv = int(test.getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value)) |
371 | vvs = "|%s| (%d)" % ("----------------------------------------------------------------------------------------------------"[0:min(vv,100)], vv) |
447 | vvs = "|%s| (%d)" % ("----------------------------------------------------------------------------------------------------"[0:min(vv,100)], vv) |
372 | self.TestListCtrl.SetStringItem(index, 4, vvs) |
448 | self.TestListCtrl.SetStringItem(index, 4, vvs) |
373 | self.TestListCtrl.Select(index) |
449 | self.TestListCtrl.Select(index) |
374 | 450 | ||
375 | 451 | ||
376 | def OnTestSelected(self, event): |
452 | def OnTestSelected(self, event): |
377 | testId = event.m_itemIndex |
453 | testId = event.m_itemIndex |
378 | print "Test Selected id=%d" % (testId) |
454 | print "Test Selected id=%d" % (testId) |
379 | self.activeTestId = testId |
455 | self.activeTestId = testId |
380 | self.drawGraph() |
456 | self.drawGraph() |
381 | 457 | ||
382 | def drawGraph(self): |
458 | def drawGraph(self): |
383 | 459 | ||
384 | y = int(self.yAxisChoice.GetStringSelection()) |
460 | y = int(self.yAxisChoice.GetStringSelection()) |
385 | 461 | ||
386 | nbSelected = self.TestListCtrl.SelectedItemCount |
462 | nbSelected = self.TestListCtrl.SelectedItemCount |
387 | 463 | ||
388 | if nbSelected == 0: |
464 | if nbSelected == 0: |
389 | self.client.Clear() |
465 | self.client.Clear() |
390 | 466 | ||
391 | elif nbSelected > 1: |
467 | elif nbSelected > 1: |
392 | self.graphTypeChoice.Disable() |
468 | self.graphTypeChoice.Disable() |
393 | x = 1 |
469 | x = 1 |
394 | data = [] |
470 | data = [] |
395 | idx = self.TestListCtrl.GetFirstSelected() |
471 | idx = self.TestListCtrl.GetFirstSelected() |
396 | while idx != -1: |
472 | while idx != -1: |
397 | data.append([x,self.app.getTest(idx).getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value)]) |
473 | data.append([x,self.app.getTest(idx).getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value)]) |
398 | x += 1 |
474 | x += 1 |
399 | idx = self.TestListCtrl.GetNextSelected(idx) |
475 | idx = self.TestListCtrl.GetNextSelected(idx) |
400 | line = wx.lib.plot.PolyLine(data, legend= 'Vibrations', colour='red', width=2) |
476 | line = wx.lib.plot.PolyLine(data, legend= 'Vibrations', colour='red', width=2) |
401 | markers = wx.lib.plot.PolyMarker(data, legend= '', colour='red', marker='circle',size=2) |
477 | markers = wx.lib.plot.PolyMarker(data, legend= '', colour='red', marker='circle',size=2) |
402 | title = "Comparing tests" |
478 | title = "Comparing tests" |
403 | self.client.Draw(wx.lib.plot.PlotGraphics([line, markers], title, "Test", "Vibration Value"), xAxis=(1,max(x,10)), yAxis=(0,y)) |
479 | self.client.Draw(wx.lib.plot.PlotGraphics([line, markers], title, "Test", "Vibration Value"), xAxis=(1,max(x,10)), yAxis=(0,y)) |
404 | self.client.SetEnableGrid('Horizontal') |
480 | self.client.SetEnableGrid('Horizontal') |
405 | 481 | ||
406 | else: |
482 | else: |
407 | self.graphTypeChoice.Enable() |
483 | self.graphTypeChoice.Enable() |
408 | vibTest = self.app.getTest(self.activeTestId) |
484 | vibTest = self.app.getTest(self.activeTestId) |
409 | nb = vibTest.getDataLen() |
485 | nb = vibTest.getDataLen() |
410 | 486 | ||
411 | if self.graphTypeChoice.GetSelection() == 0: |
487 | if self.graphTypeChoice.GetSelection() == 0: |
412 | xydata = _Numeric.linspace(0,0.09*nb,2*nb) |
488 | xydata = _Numeric.linspace(0,0.09*nb,2*nb) |
413 | xydata.shape = (nb, 2) |
489 | xydata.shape = (nb, 2) |
414 | xydata[:,1] = vibTest.getRawData() |
490 | xydata[:,1] = vibTest.getRawData() |
415 | line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2) |
491 | line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2) |
416 | 492 | ||
417 | title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
493 | title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
418 | self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y)) |
494 | self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y)) |
419 | self.client.SetEnableGrid('Horizontal') |
495 | self.client.SetEnableGrid('Horizontal') |
420 | 496 | ||
421 | if self.graphTypeChoice.GetSelection() == 1: |
497 | if self.graphTypeChoice.GetSelection() == 1: |
422 | xydata = _Numeric.linspace(0,0.09*nb,2*nb) |
498 | xydata = _Numeric.linspace(0,0.09*nb,2*nb) |
423 | xydata.shape = (nb, 2) |
499 | xydata.shape = (nb, 2) |
424 | xydata[:,1] = vibTest.getFilteredData(self.app.settings["hpf"].value, self.app.settings["lpf"].value) |
500 | xydata[:,1] = vibTest.getFilteredData(self.app.settings["hpf"].value, self.app.settings["lpf"].value) |
425 | line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2) |
501 | line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2) |
426 | 502 | ||
427 | title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
503 | title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
428 | self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y)) |
504 | self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y)) |
429 | self.client.SetEnableGrid('Horizontal') |
505 | self.client.SetEnableGrid('Horizontal') |
430 | 506 | ||
431 | elif self.graphTypeChoice.GetSelection() == 2: |
507 | elif self.graphTypeChoice.GetSelection() == 2: |
432 | xydata = _Numeric.linspace(0,FS/2,nb) |
508 | xydata = _Numeric.linspace(0,FS/2,nb) |
433 | xydata.shape = (nb/2, 2) |
509 | xydata.shape = (nb/2, 2) |
434 | 510 | ||
435 | xydata[:,1] = vibTest.getSpectrum() |
511 | xydata[:,1] = vibTest.getSpectrum() |
436 | 512 | ||
437 | line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red') |
513 | line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red') |
438 | markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2) |
514 | markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2) |
439 | 515 | ||
440 | fc = self.app.settings["hpf"].value |
516 | fc = self.app.settings["hpf"].value |
441 | filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4) |
517 | filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4) |
442 | fc = self.app.settings["lpf"].value |
518 | fc = self.app.settings["lpf"].value |
443 | filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4) |
519 | filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4) |
444 | 520 | ||
445 | title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
521 | title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed) |
446 | self.client.Draw(wx.lib.plot.PlotGraphics([line,markers, filterLine1, filterLine2], title, "Freq (Hz)", "Acc"), xAxis=(0,200), yAxis= (-0,y)) |
522 | self.client.Draw(wx.lib.plot.PlotGraphics([line,markers, filterLine1, filterLine2], title, "Freq (Hz)", "Acc"), xAxis=(0,200), yAxis= (-0,y)) |
447 | self.client.SetEnableGrid(True) |
523 | self.client.SetEnableGrid(True) |
448 | 524 | ||
449 | 525 | ||
450 | def OnImport(self, event): # wxGlade: MainFrame.<event_handler> |
526 | def OnImport(self, event): # wxGlade: MainFrame.<event_handler> |
451 | dlg = wx.FileDialog( |
527 | dlg = wx.FileDialog( |
452 | self, message="Choose a file", |
528 | self, message="Choose a file", |
453 | defaultDir="%s/Data/" % os.getcwd(), |
529 | defaultDir="%s/Data/" % os.getcwd(), |
454 | defaultFile="*.txt", |
530 | defaultFile="*.txt", |
455 | wildcard="*.txt", |
531 | wildcard="*.txt", |
456 | style=wx.OPEN | wx.CHANGE_DIR |
532 | style=wx.OPEN | wx.CHANGE_DIR |
457 | ) |
533 | ) |
458 | if dlg.ShowModal() == wx.ID_OK: |
534 | if dlg.ShowModal() == wx.ID_OK: |
459 | paths = dlg.GetPaths(); |
535 | paths = dlg.GetPaths(); |
460 | self.app.loadTests(paths[0]) |
536 | self.app.loadTests(paths[0]) |
461 | dlg.Destroy() |
537 | dlg.Destroy() |
462 | 538 | ||
463 | def onExport(self, event): # wxGlade: MainFrame.<event_handler> |
539 | def onExport(self, event): # wxGlade: MainFrame.<event_handler> |
464 | dlg = wx.FileDialog( |
540 | dlg = wx.FileDialog( |
465 | self, message="Save file as ...", |
541 | self, message="Save file as ...", |
466 | defaultDir="%s/Data/" % os.getcwd(), |
542 | defaultDir="%s/Data/" % os.getcwd(), |
467 | defaultFile="*.txt", |
543 | defaultFile="*.txt", |
468 | wildcard="", |
544 | wildcard="", |
469 | style=wx.SAVE |
545 | style=wx.SAVE |
470 | ) |
546 | ) |
471 | if dlg.ShowModal() == wx.ID_OK: |
547 | if dlg.ShowModal() == wx.ID_OK: |
472 | paths = dlg.GetPaths(); |
548 | paths = dlg.GetPaths(); |
473 | self.app.saveTests(paths[0]) |
549 | self.app.saveTests(paths[0]) |
474 | dlg.Destroy() |
550 | dlg.Destroy() |
475 | 551 | ||
476 | def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler> |
552 | def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler> |
477 | self.drawGraph() |
553 | self.drawGraph() |
478 | 554 | ||
479 | def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler> |
555 | def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler> |
480 | self.drawGraph() |
556 | self.drawGraph() |
481 | 557 | ||
482 | def OnSettings(self, event): # wxGlade: MainFrame.<event_handler> |
558 | def OnSettings(self, event): # wxGlade: MainFrame.<event_handler> |
483 | dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200), |
559 | dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200), |
484 | #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME, |
560 | #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME, |
485 | style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX |
561 | style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX |
486 | ) |
562 | ) |
487 | dlg.CenterOnScreen() |
563 | dlg.CenterOnScreen() |
488 | val = dlg.ShowModal() # this does not return until the dialog is closed. |
564 | val = dlg.ShowModal() # this does not return until the dialog is closed. |
489 | dlg.Destroy() |
565 | dlg.Destroy() |
490 | self.app.onSettingsChanged() |
566 | self.app.onSettingsChanged() |
491 | 567 | ||
492 | def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler> |
568 | def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler> |
493 | # Collect measure parameters |
569 | # Collect measure parameters |
494 | mp = MeasureParameters() |
570 | mp = MeasureParameters() |
495 | mp.descr = self.tcDescr.GetValue() |
571 | mp.descr = self.tcDescr.GetValue() |
496 | mp.motors = map(int,self.tcMotors.GetValue().split(',')) |
572 | mp.motors = map(int,self.tcMotors.GetValue().split(',')) |
497 | mp.channels = map(int,self.tcChannels.GetValue().split(',')) |
573 | mp.channels = map(int,self.tcChannels.GetValue().split(',')) |
498 | s = self.tcSpeeds.GetValue() |
574 | s = self.tcSpeeds.GetValue() |
499 | if s=="test": |
575 | if s=="test": |
500 | mp.speeds = (100,100,100,100,100, 150,150,150,150,150, 200,200,200,200,200, 100,150,200, 100,150,200, 100,150,200, 100,150,200) |
576 | mp.speeds = (100,100,100,100,100, 150,150,150,150,150, 200,200,200,200,200, 100,150,200, 100,150,200, 100,150,200, 100,150,200) |
501 | elif s.count("-") == 1: |
577 | elif s.count("-") == 1: |
502 | # assume from-to:step format |
578 | # assume from-to:step format |
503 | s = s.split("-") |
579 | s = s.split("-") |
504 | if len(s) != 2: raise Exception("Invalid format") |
580 | if len(s) != 2: raise Exception("Invalid format") |
505 | s[1] = s[1].split(":") |
581 | s[1] = s[1].split(":") |
506 | if len(s[1]) != 2: raise Exception("Invalid format") |
582 | if len(s[1]) != 2: raise Exception("Invalid format") |
507 | mp.speeds = range(int(s[0]),int(s[1][0])+int(s[1][1]),int(s[1][1])) |
583 | mp.speeds = range(int(s[0]),int(s[1][0])+int(s[1][1]),int(s[1][1])) |
508 | else: |
584 | else: |
509 | mp.speeds = map(int,s.split(',')) |
585 | mp.speeds = map(int,s.split(',')) |
510 | 586 | ||
511 | 587 | ||
512 | # create the dialog that will show the satus |
588 | # create the dialog that will show the satus |
513 | dlg = MeasureDialog(self) |
589 | dlg = MeasureDialog(self) |
514 | dlg.CenterOnScreen() |
590 | dlg.CenterOnScreen() |
515 | 591 | ||
516 | # Signal the application |
592 | # Signal the application |
517 | self.app.startMeasure(mp, dlg) |
593 | self.app.startMeasure(mp, dlg) |
518 | 594 | ||
519 | # Show the dialog |
595 | # Show the dialog |
520 | val = dlg.ShowModal() # this does not return until the dialog is closed. |
596 | val = dlg.ShowModal() # this does not return until the dialog is closed. |
521 | dlg.Destroy() |
597 | dlg.Destroy() |
522 | 598 | ||
523 | def _removeTest(self, idx): |
599 | def _removeTest(self, idx): |
524 | print "Deleting test %d" % idx |
600 | print "Deleting test %d" % idx |
525 | self.app.removeTest(idx) |
601 | self.app.removeTest(idx) |
526 | self.TestListCtrl.DeleteItem(idx) |
602 | self.TestListCtrl.DeleteItem(idx) |
527 | 603 | ||
528 | 604 | ||
529 | def onClear(self, event): # wxGlade: MainFrame.<event_handler> |
605 | def onClear(self, event): # wxGlade: MainFrame.<event_handler> |
530 | print "Clear all tests" |
606 | print "Clear all tests" |
531 | for i in range(len(self.app.VibTests)-1, -1, -1): |
607 | for i in range(len(self.app.VibTests)-1, -1, -1): |
532 | self._removeTest(i) |
608 | self._removeTest(i) |
533 | self.drawGraph() |
609 | self.drawGraph() |
534 | 610 | ||
535 | 611 | ||
536 | def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler> |
612 | def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler> |
537 | while True: |
613 | while True: |
538 | idx = self.TestListCtrl.GetFirstSelected() |
614 | idx = self.TestListCtrl.GetFirstSelected() |
539 | if idx == -1: break |
615 | if idx == -1: break |
540 | self._removeTest(idx) |
616 | self._removeTest(idx) |
541 | 617 | ||
542 | 618 | ||
543 | # end of class MainFrame |
619 | # end of class MainFrame |
544 | 620 | ||
545 | class Setting: |
621 | class Setting: |
546 | def __init__(self, descr, defaultValue): |
622 | def __init__(self, descr, defaultValue): |
547 | self.descr = descr |
623 | self.descr = descr |
548 | self.value = defaultValue |
624 | self.value = defaultValue |
549 | 625 | ||
550 | def set(self, newValue): |
626 | def set(self, newValue): |
551 | if isinstance(self.value, int): |
627 | if isinstance(self.value, int): |
552 | self.value = int(newValue) |
628 | self.value = int(newValue) |
553 | else: |
629 | else: |
554 | self.value = str(newValue) |
630 | self.value = str(newValue) |
555 | 631 | ||
556 | class MeasureParameters: |
632 | class MeasureParameters: |
557 | pass |
633 | pass |
558 | 634 | ||
559 | class MeasureThread: |
635 | class MeasureThread: |
560 | def __init__(self, measureParameters, evtConsumer): |
636 | def __init__(self, measureParameters, evtConsumer): |
561 | self.mk = mkProto.MkComm() |
637 | self.mk = mkProto.MkComm() |
562 | self.param = measureParameters |
638 | self.param = measureParameters |
563 | self.evtConsumer = evtConsumer |
639 | self.evtConsumer = evtConsumer |
564 | self.cancel = False |
640 | self.cancel = False |
565 | self.running = False |
641 | self.running = False |
566 | 642 | ||
567 | def start(self): |
643 | def start(self): |
568 | thread.start_new_thread(self._run, ()) |
644 | thread.start_new_thread(self._run, ()) |
569 | 645 | ||
570 | def stop(self): |
646 | def stop(self): |
571 | self.cancel = True |
647 | self.cancel = True |
572 | 648 | ||
573 | def _testCancel(self): |
649 | def _testCancel(self): |
574 | if self.cancel: |
650 | if self.cancel: |
575 | raise Exception("Operation cancelled") |
651 | raise Exception("Operation cancelled") |
576 | 652 | ||
577 | def _sendEvent(self, msg, error=False): |
653 | def _sendEvent(self, msg=None, error=False, parVoltage=None, speed=None): |
578 | evt = MeasStatusUpdateEvent(running=self.running, msg=msg, error=error) |
654 | evt = MeasStatusUpdateEvent(running=self.running, msg=msg, error=error, voltage=parVoltage, speed=speed) |
579 | wx.PostEvent(self.evtConsumer, evt) |
655 | wx.PostEvent(self.evtConsumer, evt) |
580 | 656 | ||
581 | def _setMotorSpeed(self, speed, settlingTime): |
657 | def _setMotorSpeed(self, speed, settlingTime): |
582 | speeds = [0,0,0,0] |
658 | speeds = [0,0,0,0] |
583 | for motor in self.param.motors: |
659 | for motor in self.param.motors: |
584 | speeds[motor-1] = speed |
660 | speeds[motor-1] = speed |
585 | for i in range(int(settlingTime*10)): |
661 | for i in range(int(settlingTime*10)): |
586 | self._testCancel() |
662 | self._testCancel() |
587 | self.mk.setMotorTest(speeds) |
663 | self.mk.setMotorTest(speeds) |
588 | time.sleep(.1) |
664 | time.sleep(.1) |
589 | 665 | ||
590 | 666 | ||
591 | def _run(self): |
667 | def _run(self): |
592 | self.running = True |
668 | self.running = True |
593 | self._sendEvent("Starting test \"%s\"" % self.param.descr) |
669 | self._sendEvent("Starting test \"%s\"" % self.param.descr) |
594 | 670 | ||
595 | try: |
671 | try: |
596 | self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort) |
672 | self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort) |
597 | self.mk.open(comPort=self.param.serialPort) |
673 | self.mk.open(comPort=self.param.serialPort) |
598 | 674 | ||
599 | msg = self.mk.getVersionMsg() |
675 | msg = self.mk.getVersionMsg() |
600 | version = msg.getVersion() |
676 | version = msg.getVersion() |
601 | self._sendEvent("Version: %d.%d" % version) |
677 | self._sendEvent("Version: %d.%d" % version) |
602 | 678 | ||
603 | msg = self.mk.getDebugMsg() |
679 | msg = self.mk.getDebugMsg() |
604 | voltage = msg.getVoltage() |
680 | voltage = msg.getVoltage() |
605 | if (voltage == 0): |
681 | if (voltage == 0): |
606 | minVoltage = 0 |
682 | minVoltage = 0 |
- | 683 | maxVoltage = 1 |
|
607 | else: |
684 | else: |
608 | if (voltage > 4.2*3): |
685 | if (voltage > 4.2*3): |
609 | minVoltage = 4*3.5 |
686 | nbCells = 4 |
610 | else: |
687 | else: |
- | 688 | nbCells = 3 |
|
611 | minVoltage = 3*3.5 |
689 | minVoltage = nbCells*3.5 |
612 | - | ||
- | 690 | maxVoltage = nbCells*3.9 |
|
613 | self._sendEvent("Voltage: %2.1fV" % voltage) |
691 | self._sendEvent("Voltage: %2.1fV" % voltage) |
614 | self._sendEvent("Minimum Voltage: %2.1fV" % minVoltage) |
692 | self._sendEvent("Min/Max Voltage: %2.1fV-%2.1fV" % (minVoltage, maxVoltage), parVoltage=(minVoltage, maxVoltage, voltage)) |
- | 693 | ||
615 | 694 | ||
616 | self._sendEvent("Starting motor(s) (speed=%d)... " % self.param.motorStartupSpeed) |
695 | self._sendEvent("Starting motor(s) (speed=%d)... " % self.param.motorStartupSpeed, speed=self.param.motorStartupSpeed) |
617 | self._setMotorSpeed(self.param.motorStartupSpeed, self.param.motorStartupSettlingTime) |
696 | self._setMotorSpeed(self.param.motorStartupSpeed, self.param.motorStartupSettlingTime) |
618 | 697 | ||
619 | for speed in self.param.speeds: |
698 | for speed in self.param.speeds: |
620 | self._sendEvent("Changing motor speed to %d... " % speed) |
699 | self._sendEvent("Changing motor speed to %d... " % speed, speed=speed) |
621 | self._setMotorSpeed(speed, 1) |
700 | self._setMotorSpeed(speed, 1) |
622 | 701 | ||
623 | for channel in self.param.channels: |
702 | for channel in self.param.channels: |
624 | self._setMotorSpeed(speed, .1) |
703 | self._setMotorSpeed(speed, .1) |
625 | msg = self.mk.getDebugMsg() |
704 | msg = self.mk.getDebugMsg() |
626 | voltage = msg.getVoltage() |
705 | voltage = msg.getVoltage() |
627 | 706 | ||
628 | self._sendEvent("Getting data from channel %s" % CHANNEL_NAMES[channel]) |
707 | self._sendEvent("Getting data from channel %s" % CHANNEL_NAMES[channel], parVoltage=(minVoltage, maxVoltage, voltage)) |
629 | data = self.mk.doVibrationTest(1000, channel) |
708 | data = self.mk.doVibrationTest(1000, channel) |
630 | 709 | ||
631 | vt = VibTest(self.param.descr, voltage, self.param.motors, speed, CHANNEL_NAMES[channel], data) |
710 | vt = VibTest(self.param.descr, voltage, self.param.motors, speed, CHANNEL_NAMES[channel], data) |
632 | evt = MeasDataEvent(vibTest = vt) |
711 | evt = MeasDataEvent(vibTest = vt) |
633 | wx.PostEvent(self.evtConsumer, evt) |
712 | wx.PostEvent(self.evtConsumer, evt) |
634 | 713 | ||
635 | if voltage<minVoltage: |
714 | if voltage<minVoltage: |
636 | raise Exception("Voltage too low") |
715 | raise Exception("Voltage too low") |
637 | 716 | ||
638 | self._sendEvent("Done !") |
717 | self._sendEvent("Done !") |
639 | 718 | ||
640 | except Exception, e: |
719 | except Exception, e: |
641 | self._sendEvent("Exception \"%s\"" % e, error=True) |
720 | self._sendEvent("Exception \"%s\"" % e, error=True) |
642 | 721 | ||
643 | self.running = False |
722 | self.running = False |
644 | self._sendEvent("") |
723 | self._sendEvent("") |
645 | 724 | ||
646 | 725 | ||
647 | class VibTest: |
726 | class VibTest: |
648 | def __init__(self, descr, voltage, motor, speed, channel, rawData): |
727 | def __init__(self, descr, voltage, motor, speed, channel, rawData): |
649 | self.descr = descr |
728 | self.descr = descr |
650 | self.voltage = voltage |
729 | self.voltage = voltage |
651 | self.motor = motor |
730 | self.motor = motor |
652 | self.speed = speed |
731 | self.speed = speed |
653 | self.channel = channel |
732 | self.channel = channel |
654 | 733 | ||
655 | self.dataLen = len(rawData) |
734 | self.dataLen = len(rawData) |
656 | 735 | ||
657 | self.rawData = _Numeric.array(rawData) |
736 | self.rawData = _Numeric.array(rawData) |
658 | self.dc = self.rawData.mean() |
737 | self.dc = self.rawData.mean() |
659 | self.rawData -= self.dc |
738 | self.rawData -= self.dc |
660 | 739 | ||
661 | self.fft = _Numeric.fft.rfft(self.rawData) |
740 | self.fft = _Numeric.fft.rfft(self.rawData) |
662 | 741 | ||
663 | self.spectrum = None |
742 | self.spectrum = None |
664 | self.filteredData = None |
743 | self.filteredData = None |
665 | self.fc1 = None |
744 | self.fc1 = None |
666 | self.fc2 = None |
745 | self.fc2 = None |
667 | 746 | ||
668 | self.vibValue = None |
747 | self.vibValue = None |
669 | 748 | ||
670 | def getDescr(self): |
749 | def getDescr(self): |
671 | return self.Descr |
750 | return self.Descr |
672 | 751 | ||
673 | def getRawData(self): |
752 | def getRawData(self): |
674 | return self.rawData |
753 | return self.rawData |
675 | 754 | ||
676 | def getDataLen(self): |
755 | def getDataLen(self): |
677 | return self.dataLen |
756 | return self.dataLen |
678 | 757 | ||
679 | def getSpectrum(self): |
758 | def getSpectrum(self): |
680 | if self.spectrum == None: |
759 | if self.spectrum == None: |
681 | self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2) |
760 | self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2) |
682 | return self.spectrum |
761 | return self.spectrum |
683 | 762 | ||
684 | def getFilteredData(self, fc1, fc2): |
763 | def getFilteredData(self, fc1, fc2): |
685 | if self.fc1 != fc1 or self.fc2 != fc2: |
764 | if self.fc1 != fc1 or self.fc2 != fc2: |
686 | self.filteredData = None |
765 | self.filteredData = None |
687 | 766 | ||
688 | if self.filteredData == None: |
767 | if self.filteredData == None: |
689 | tmpfft = self.fft.copy() |
768 | tmpfft = self.fft.copy() |
690 | fc = (float(fc1))/(FS/2)*len(tmpfft) |
769 | fc = (float(fc1))/(FS/2)*len(tmpfft) |
691 | print "fc1=%d => fc=%d" % (fc1,fc) |
770 | print "fc1=%d => fc=%d" % (fc1,fc) |
692 | for i in range(0,int(fc)): |
771 | for i in range(0,int(fc)): |
693 | tmpfft[i] = 0 |
772 | tmpfft[i] = 0 |
694 | fc = (float(fc2))/(FS/2)*len(tmpfft) |
773 | fc = (float(fc2))/(FS/2)*len(tmpfft) |
695 | print "fc2=%d => fc=%d" % (fc2,fc) |
774 | print "fc2=%d => fc=%d" % (fc2,fc) |
696 | for i in range(int(fc), len(tmpfft)): |
775 | for i in range(int(fc), len(tmpfft)): |
697 | tmpfft[i] = 0 |
776 | tmpfft[i] = 0 |
698 | self.filteredData = _Numeric.fft.irfft(tmpfft) |
777 | self.filteredData = _Numeric.fft.irfft(tmpfft) |
699 | self.fc1 = fc1 |
778 | self.fc1 = fc1 |
700 | self.fc2 = fc2 |
779 | self.fc2 = fc2 |
701 | 780 | ||
702 | return self.filteredData |
781 | return self.filteredData |
703 | 782 | ||
704 | def getVibValue(self, fc1, fc2): |
783 | def getVibValue(self, fc1, fc2): |
705 | if self.fc1 != fc1 or self.fc2 != fc2: |
784 | if self.fc1 != fc1 or self.fc2 != fc2: |
706 | self.vibValue = None |
785 | self.vibValue = None |
707 | if self.vibValue == None: |
786 | if self.vibValue == None: |
708 | fd = self.getFilteredData(fc1, fc2)[100:-100]; |
787 | fd = self.getFilteredData(fc1, fc2)[100:-100]; |
709 | self.vibValue = max(fd)-min(fd) |
788 | self.vibValue = max(fd)-min(fd) |
710 | return self.vibValue |
789 | return self.vibValue |
711 | 790 | ||
712 | 791 | ||
713 | 792 | ||
714 | class App(wx.App): |
793 | class App(wx.App): |
715 | 794 | ||
716 | SETTINGSFILE = "settings.cfg" |
795 | SETTINGSFILE = "settings.cfg" |
717 | 796 | ||
718 | def __init__(self, par): |
797 | def __init__(self, par): |
719 | self.VibTests = [] |
798 | self.VibTests = [] |
720 | wx.App.__init__(self, par) |
799 | wx.App.__init__(self, par) |
721 | 800 | ||
722 | # Init settings |
801 | # Init settings |
723 | self.settings={} |
802 | self.settings={} |
724 | self.settings["serialport"] = Setting("Serial Port", "COM1") |
803 | self.settings["serialport"] = Setting("Serial Port", "COM1") |
725 | self.settings["startupspeed"] = Setting("Motor Startup Speed", 25) |
804 | self.settings["startupspeed"] = Setting("Motor Startup Speed", 25) |
726 | self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3) |
805 | self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3) |
727 | self.settings["serialport"] = Setting("Serial Port", "COM1") |
806 | self.settings["serialport"] = Setting("Serial Port", "COM1") |
728 | self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 50) |
807 | self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 50) |
729 | self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 180) |
808 | self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 180) |
730 | 809 | ||
731 | self.readSettings() |
810 | self.readSettings() |
732 | 811 | ||
733 | if len(sys.argv)>1: |
812 | if len(sys.argv)>1: |
734 | self.loadTests(sys.argv[1]) |
813 | self.loadTests(sys.argv[1]) |
735 | 814 | ||
736 | 815 | ||
737 | def readSettings(self): |
816 | def readSettings(self): |
738 | print "Reading settings" |
817 | print "Reading settings" |
739 | cp = ConfigParser.ConfigParser() |
818 | cp = ConfigParser.ConfigParser() |
740 | 819 | ||
741 | try: |
820 | try: |
742 | cp.read(App.SETTINGSFILE) |
821 | cp.read(App.SETTINGSFILE) |
743 | for setting in cp.items("DEFAULT"): |
822 | for setting in cp.items("DEFAULT"): |
744 | print " ",setting |
823 | print " ",setting |
745 | try: |
824 | try: |
746 | self.settings[setting[0]].set(setting[1]) |
825 | self.settings[setting[0]].set(setting[1]) |
747 | except: |
826 | except: |
748 | print "WARNING, unknown setting" |
827 | print "WARNING, unknown setting" |
749 | except: |
828 | except: |
750 | print "ERROR reading settingsfile" |
829 | print "ERROR reading settingsfile" |
751 | 830 | ||
752 | 831 | ||
753 | def storeSettings(self): |
832 | def storeSettings(self): |
754 | print "Storing settings" |
833 | print "Storing settings" |
755 | 834 | ||
756 | cp = ConfigParser.ConfigParser() |
835 | cp = ConfigParser.ConfigParser() |
757 | for setting in self.settings.iteritems(): |
836 | for setting in self.settings.iteritems(): |
758 | cp.set("", setting[0], setting[1].value) |
837 | cp.set("", setting[0], setting[1].value) |
759 | 838 | ||
760 | file = open(App.SETTINGSFILE, "w") |
839 | file = open(App.SETTINGSFILE, "w") |
761 | cp.write(file) |
840 | cp.write(file) |
762 | file.close() |
841 | file.close() |
763 | 842 | ||
764 | 843 | ||
765 | def onSettingsChanged(self): |
844 | def onSettingsChanged(self): |
766 | self.storeSettings() |
845 | self.storeSettings() |
767 | 846 | ||
768 | def AddTest2(self, vibTest): |
847 | def AddTest2(self, vibTest): |
769 | self.VibTests.append(vibTest) |
848 | self.VibTests.append(vibTest) |
770 | self.frame_1.onNewTest(vibTest) |
849 | self.frame_1.onNewTest(vibTest) |
771 | 850 | ||
772 | def AddTest(self, descr, voltage, motor, speed, channel, rawData): |
851 | def AddTest(self, descr, voltage, motor, speed, channel, rawData): |
773 | test = VibTest(descr, voltage, motor, speed, channel, rawData) |
852 | test = VibTest(descr, voltage, motor, speed, channel, rawData) |
774 | self.AddTest2(test) |
853 | self.AddTest2(test) |
775 | 854 | ||
776 | def removeTest(self, idx): |
855 | def removeTest(self, idx): |
777 | del(self.VibTests[idx]) |
856 | del(self.VibTests[idx]) |
778 | 857 | ||
779 | def getTest(self, testId): |
858 | def getTest(self, testId): |
780 | return self.VibTests[testId] |
859 | return self.VibTests[testId] |
781 | 860 | ||
782 | def OnInit(self): |
861 | def OnInit(self): |
783 | wx.InitAllImageHandlers() |
862 | wx.InitAllImageHandlers() |
784 | self.frame_1 = MainFrame(None, -1, "") |
863 | self.frame_1 = MainFrame(None, -1, "") |
785 | self.frame_1.setApp(self); |
864 | self.frame_1.setApp(self); |
786 | self.SetTopWindow(self.frame_1) |
865 | self.SetTopWindow(self.frame_1) |
787 | 866 | ||
788 | self.frame_1.CenterOnScreen() |
867 | self.frame_1.CenterOnScreen() |
789 | self.frame_1.Show() |
868 | self.frame_1.Show() |
790 | return 1 |
869 | return 1 |
791 | 870 | ||
792 | def saveTests(self, filePath): |
871 | def saveTests(self, filePath): |
793 | try: |
872 | try: |
794 | logfile = open(filePath, "r") |
873 | logfile = open(filePath, "r") |
795 | newFile = False |
874 | newFile = False |
796 | logfile.close() |
875 | logfile.close() |
797 | except: |
876 | except: |
798 | newFile = True |
877 | newFile = True |
799 | 878 | ||
800 | for test in self.VibTests: |
879 | for test in self.VibTests: |
801 | if newFile: |
880 | if newFile: |
802 | logfile = open(filePath, "w") |
881 | logfile = open(filePath, "w") |
803 | print "Writing result to %s ..." % filePath, |
882 | print "Writing result to %s ..." % filePath, |
804 | logfile.write("%s %d %s\n" % (test.descr, test.speed, test.channel)) |
883 | logfile.write("%s %d %s\n" % (test.descr, test.speed, test.channel)) |
805 | for value in test.rawData: |
884 | for value in test.rawData: |
806 | logfile.write("%d\n" % value) |
885 | logfile.write("%d\n" % value) |
807 | logfile.close() |
886 | logfile.close() |
808 | print "OK" |
887 | print "OK" |
809 | else: |
888 | else: |
810 | print "Appending result to %s ..." % filePath, |
889 | print "Appending result to %s ..." % filePath, |
811 | logfile = open(filePath, "r") |
890 | logfile = open(filePath, "r") |
812 | prevData = [] |
891 | prevData = [] |
813 | for line in logfile: |
892 | for line in logfile: |
814 | prevData.append(line[:-1]) |
893 | prevData.append(line[:-1]) |
815 | logfile.close() |
894 | logfile.close() |
816 | logfile = open(filePath, "w") |
895 | logfile = open(filePath, "w") |
817 | logfile.write("%s,%s %d %s\n" % (prevData[0], test.descr, test.speed, test.channel)) |
896 | logfile.write("%s,%s %d %s\n" % (prevData[0], test.descr, test.speed, test.channel)) |
818 | i = 1 |
897 | i = 1 |
819 | for value in test.rawData: |
898 | for value in test.rawData: |
820 | logfile.write("%s,%d\n" % (prevData[i], value)) |
899 | logfile.write("%s,%d\n" % (prevData[i], value)) |
821 | i += 1 |
900 | i += 1 |
822 | logfile.close() |
901 | logfile.close() |
823 | print "OK" |
902 | print "OK" |
824 | newFile = False |
903 | newFile = False |
825 | 904 | ||
826 | 905 | ||
827 | def loadTests(self, filePath): |
906 | def loadTests(self, filePath): |
828 | 907 | ||
829 | print "Importing file \"%s\"" % filePath |
908 | print "Importing file \"%s\"" % filePath |
830 | 909 | ||
831 | logfile = open(filePath, "r") |
910 | logfile = open(filePath, "r") |
832 | data = None |
911 | data = None |
833 | 912 | ||
834 | headers = (logfile.readline()[:-1]).split(',') |
913 | headers = (logfile.readline()[:-1]).split(',') |
835 | nbCols = len(headers) |
914 | nbCols = len(headers) |
836 | print "NbCols =", nbCols |
915 | print "NbCols =", nbCols |
837 | 916 | ||
838 | data = [] |
917 | data = [] |
839 | descr = [] |
918 | descr = [] |
840 | speed = [] |
919 | speed = [] |
841 | channel = [] |
920 | channel = [] |
842 | for c in range(nbCols): |
921 | for c in range(nbCols): |
843 | data.append([]) |
922 | data.append([]) |
844 | h = headers[c].split(' ') |
923 | h = headers[c].split(' ') |
845 | descr.append(h[0]); |
924 | descr.append(h[0]); |
846 | speed.append(h[1]); |
925 | speed.append(h[1]); |
847 | channel.append(h[2]); |
926 | channel.append(h[2]); |
848 | 927 | ||
849 | for line in logfile: |
928 | for line in logfile: |
850 | values = line.split(',') |
929 | values = line.split(',') |
851 | for i in range(nbCols): |
930 | for i in range(nbCols): |
852 | data[i].append(int(values[i])) |
931 | data[i].append(int(values[i])) |
853 | logfile.close() |
932 | logfile.close() |
854 | 933 | ||
855 | for c in range(nbCols): |
934 | for c in range(nbCols): |
856 | if (len(data[c]) % 2) != 0: |
935 | if (len(data[c]) % 2) != 0: |
857 | data[c].append(data[c][-1]) |
936 | data[c].append(data[c][-1]) |
858 | self.AddTest(descr[c], 0, 0, int(speed[c]), channel[c], data[c]) |
937 | self.AddTest(descr[c], 0, 0, int(speed[c]), channel[c], data[c]) |
859 | 938 | ||
860 | def startMeasure(self, measureParams, dialog): |
939 | def startMeasure(self, measureParams, dialog): |
861 | print "Start measuring" |
940 | print "Start measuring" |
862 | 941 | ||
863 | measureParams.serialPort = self.settings["serialport"].value |
942 | measureParams.serialPort = self.settings["serialport"].value |
864 | measureParams.motorStartupSpeed = self.settings["startupspeed"].value |
943 | measureParams.motorStartupSpeed = self.settings["startupspeed"].value |
865 | measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value |
944 | measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value |
866 | 945 | ||
867 | self.measureThread = MeasureThread(measureParams, dialog) |
946 | self.measureThread = MeasureThread(measureParams, dialog) |
868 | self.measureThread.start() |
947 | self.measureThread.start() |
869 | 948 | ||
870 | def cancelMeasurement(self): |
949 | def cancelMeasurement(self): |
871 | print "Measuring CANCEL" |
950 | print "Measuring CANCEL" |
872 | 951 | ||
873 | self.measureThread.stop() |
952 | self.measureThread.stop() |
874 | 953 | ||
875 | 954 | ||
876 | 955 | ||
877 | 956 | ||
878 | 957 | ||
879 | 958 | ||
880 | 959 | ||
881 | 960 | ||
882 | # end of class App |
961 | # end of class App |
883 | 962 | ||
884 | if __name__ == "__main__": |
963 | if __name__ == "__main__": |
885 | VibrationTestGui = App(0) |
964 | VibrationTestGui = App(0) |
886 | VibrationTestGui.MainLoop() |
965 | VibrationTestGui.MainLoop() |
887 | 966 |