Subversion Repositories Projects

Rev

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