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