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