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