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