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