Subversion Repositories Projects

Rev

Rev 616 | Rev 623 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 616 Rev 619
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.AppendSeparator()
207
        wxglade_tmp_menu.Append(150, "Exit", "", wx.ITEM_NORMAL)
207
        wxglade_tmp_menu.Append(150, "Exit", "", wx.ITEM_NORMAL)
208
        self.frame_1_menubar.Append(wxglade_tmp_menu, "File")
208
        self.frame_1_menubar.Append(wxglade_tmp_menu, "File")
209
        wxglade_tmp_menu = wx.Menu()
209
        wxglade_tmp_menu = wx.Menu()
210
        wxglade_tmp_menu.Append(301, "Clear All", "", 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)
211
        wxglade_tmp_menu.Append(302, "Clear Selected", "", wx.ITEM_NORMAL)
212
        wxglade_tmp_menu.AppendSeparator()
212
        wxglade_tmp_menu.AppendSeparator()
213
        wxglade_tmp_menu.Append(303, "Load", "", wx.ITEM_NORMAL)
213
        wxglade_tmp_menu.Append(303, "Load", "", wx.ITEM_NORMAL)
214
        wxglade_tmp_menu.Append(304, "Save", "", wx.ITEM_NORMAL)
214
        wxglade_tmp_menu.Append(304, "Save", "", wx.ITEM_NORMAL)
215
        self.frame_1_menubar.Append(wxglade_tmp_menu, "TestSet")
215
        self.frame_1_menubar.Append(wxglade_tmp_menu, "TestSet")
216
        wxglade_tmp_menu = wx.Menu()
216
        wxglade_tmp_menu = wx.Menu()
217
        self.frame_1_menubar.Append(wxglade_tmp_menu, "MK")
217
        self.frame_1_menubar.Append(wxglade_tmp_menu, "MK")
218
        wxglade_tmp_menu = wx.Menu()
218
        wxglade_tmp_menu = wx.Menu()
219
        self.frame_1_menubar.Append(wxglade_tmp_menu, "Help")
219
        self.frame_1_menubar.Append(wxglade_tmp_menu, "Help")
220
        self.SetMenuBar(self.frame_1_menubar)
220
        self.SetMenuBar(self.frame_1_menubar)
221
        # Menu Bar end
221
        # Menu Bar end
222
        self.Description = wx.StaticText(self, -1, "Description")
222
        self.Description = wx.StaticText(self, -1, "Description")
223
        self.tcDescr = wx.TextCtrl(self, -1, "Test")
223
        self.tcDescr = wx.TextCtrl(self, -1, "Test")
224
        self.label_37 = wx.StaticText(self, -1, "Speed(s)")
224
        self.label_37 = wx.StaticText(self, -1, "Speed(s)")
225
        self.tcSpeeds = wx.TextCtrl(self, -1, "100-200:10")
225
        self.tcSpeeds = wx.TextCtrl(self, -1, "100-200:10")
226
        self.label_35 = wx.StaticText(self, -1, "Motor(s)")
226
        self.label_35 = wx.StaticText(self, -1, "Motor(s)")
227
        self.tcMotors = wx.TextCtrl(self, -1, "1")
227
        self.tcMotors = wx.TextCtrl(self, -1, "1")
228
        self.label_38 = wx.StaticText(self, -1, "")
228
        self.label_38 = wx.StaticText(self, -1, "")
229
        self.text_ctrl_10 = wx.TextCtrl(self, -1, "")
229
        self.text_ctrl_10 = wx.TextCtrl(self, -1, "")
230
        self.label_36 = wx.StaticText(self, -1, "Channel(s)")
230
        self.label_36 = wx.StaticText(self, -1, "Channel(s)")
231
        self.tcChannels = wx.TextCtrl(self, -1, "6")
231
        self.tcChannels = wx.TextCtrl(self, -1, "6")
232
        self.label_39 = wx.StaticText(self, -1, "")
232
        self.label_39 = wx.StaticText(self, -1, "")
233
        self.text_ctrl_11 = wx.TextCtrl(self, -1, "")
233
        self.text_ctrl_11 = wx.TextCtrl(self, -1, "")
234
        self.button_4 = wx.Button(self, -1, "Start")
234
        self.button_4 = wx.Button(self, -1, "Start")
235
        self.GraphPanel = wx.Panel(self, -1)
235
        self.GraphPanel = wx.Panel(self, -1)
236
        self.label_40 = wx.StaticText(self, -1, "Graph Type ")
236
        self.label_40 = wx.StaticText(self, -1, "Graph Type ")
237
        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"])
238
        self.label_41 = wx.StaticText(self, -1, "Y Axis Range ")
238
        self.label_41 = wx.StaticText(self, -1, "Y Axis Range ")
239
        self.yAxisChoice = wx.Choice(self, -1, choices=["25", "50", "100", "200"])
239
        self.yAxisChoice = wx.Choice(self, -1, choices=["25", "50", "100", "200"])
240
        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)
241
 
241
 
242
        self.__set_properties()
242
        self.__set_properties()
243
        self.__do_layout()
243
        self.__do_layout()
244
 
244
 
245
        self.Bind(wx.EVT_MENU, self.OnSettings, id=101)
245
        self.Bind(wx.EVT_MENU, self.OnSettings, id=101)
246
        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)
247
        self.Bind(wx.EVT_MENU, self.onClearSelected, id=302)
248
        self.Bind(wx.EVT_MENU, self.OnImport, id=303)
248
        self.Bind(wx.EVT_MENU, self.OnImport, id=303)
249
        self.Bind(wx.EVT_MENU, self.onExport, id=304)
249
        self.Bind(wx.EVT_MENU, self.onExport, id=304)
250
        self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.button_4)
250
        self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.button_4)
251
        self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice)
251
        self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice)
252
        self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice)
252
        self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice)
253
        # end wxGlade
253
        # end wxGlade
254
 
254
 
255
    def setApp(self, app):
255
    def setApp(self, app):
256
        self.app = app
256
        self.app = app
257
 
257
 
258
    def __set_properties(self):
258
    def __set_properties(self):
259
        # begin wxGlade: MainFrame.__set_properties
259
        # begin wxGlade: MainFrame.__set_properties
260
        self.SetTitle("VibrationTest")
260
        self.SetTitle("VibrationTest")
261
        self.SetSize((850, 700))
261
        self.SetSize((850, 700))
262
        self.Description.SetMinSize((53, 13))
262
        self.Description.SetMinSize((53, 13))
263
        self.button_4.SetMinSize((80, 80))
263
        self.button_4.SetMinSize((80, 80))
264
        self.GraphPanel.SetMinSize((800,300))
264
        self.GraphPanel.SetMinSize((800,300))
265
        self.graphTypeChoice.SetSelection(0)
265
        self.graphTypeChoice.SetSelection(0)
266
        self.yAxisChoice.SetSelection(1)
266
        self.yAxisChoice.SetSelection(1)
267
        self.TestListCtrl.SetMinSize((800,300))
267
        self.TestListCtrl.SetMinSize((800,300))
268
        # end wxGlade
268
        # end wxGlade
269
 
269
 
270
    def __do_layout(self):
270
    def __do_layout(self):
271
        # begin wxGlade: MainFrame.__do_layout
271
        # begin wxGlade: MainFrame.__do_layout
272
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
272
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
273
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
273
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
274
        sizer_11 = wx.BoxSizer(wx.VERTICAL)
274
        sizer_11 = wx.BoxSizer(wx.VERTICAL)
275
        sizer_12 = wx.BoxSizer(wx.HORIZONTAL)
275
        sizer_12 = wx.BoxSizer(wx.HORIZONTAL)
276
        sizer_9 = wx.BoxSizer(wx.HORIZONTAL)
276
        sizer_9 = wx.BoxSizer(wx.HORIZONTAL)
277
        sizer_10 = wx.BoxSizer(wx.HORIZONTAL)
277
        sizer_10 = wx.BoxSizer(wx.HORIZONTAL)
278
        grid_sizer_1 = wx.GridSizer(3, 4, 4, 5)
278
        grid_sizer_1 = wx.GridSizer(3, 4, 4, 5)
279
        sizer_3.Add((20, 20), 0, 0, 0)
279
        sizer_3.Add((20, 20), 0, 0, 0)
280
        sizer_8.Add((20, 20), 0, 0, 0)
280
        sizer_8.Add((20, 20), 0, 0, 0)
281
        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)
282
        grid_sizer_1.Add(self.tcDescr, 0, 0, 0)
282
        grid_sizer_1.Add(self.tcDescr, 0, 0, 0)
283
        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)
284
        grid_sizer_1.Add(self.tcSpeeds, 0, 0, 0)
284
        grid_sizer_1.Add(self.tcSpeeds, 0, 0, 0)
285
        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)
286
        grid_sizer_1.Add(self.tcMotors, 0, 0, 0)
286
        grid_sizer_1.Add(self.tcMotors, 0, 0, 0)
287
        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)
288
        grid_sizer_1.Add(self.text_ctrl_10, 0, 0, 0)
288
        grid_sizer_1.Add(self.text_ctrl_10, 0, 0, 0)
289
        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)
290
        grid_sizer_1.Add(self.tcChannels, 0, 0, 0)
290
        grid_sizer_1.Add(self.tcChannels, 0, 0, 0)
291
        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)
292
        grid_sizer_1.Add(self.text_ctrl_11, 0, 0, 0)
292
        grid_sizer_1.Add(self.text_ctrl_11, 0, 0, 0)
293
        sizer_9.Add(grid_sizer_1, 0, 0, 0)
293
        sizer_9.Add(grid_sizer_1, 0, 0, 0)
294
        sizer_10.Add((50, 20), 0, 0, 0)
294
        sizer_10.Add((50, 20), 0, 0, 0)
295
        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)
296
        sizer_9.Add(sizer_10, 1, wx.EXPAND, 0)
296
        sizer_9.Add(sizer_10, 1, wx.EXPAND, 0)
297
        sizer_8.Add(sizer_9, 0, 0, 0)
297
        sizer_8.Add(sizer_9, 0, 0, 0)
298
        sizer_8.Add((20, 30), 0, 0, 0)
298
        sizer_8.Add((20, 30), 0, 0, 0)
299
        sizer_11.Add(self.GraphPanel, 1, wx.EXPAND, 0)
299
        sizer_11.Add(self.GraphPanel, 1, wx.EXPAND, 0)
300
        sizer_11.Add((20, 5), 0, 0, 0)
300
        sizer_11.Add((20, 5), 0, 0, 0)
301
        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)
302
        sizer_12.Add(self.graphTypeChoice, 0, 0, 0)
302
        sizer_12.Add(self.graphTypeChoice, 0, 0, 0)
303
        sizer_12.Add((40, 20), 0, 0, 0)
303
        sizer_12.Add((40, 20), 0, 0, 0)
304
        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)
305
        sizer_12.Add(self.yAxisChoice, 0, 0, 0)
305
        sizer_12.Add(self.yAxisChoice, 0, 0, 0)
306
        sizer_11.Add(sizer_12, 0, 0, 0)
306
        sizer_11.Add(sizer_12, 0, 0, 0)
307
        sizer_8.Add(sizer_11, 0, 0, 0)
307
        sizer_8.Add(sizer_11, 0, 0, 0)
308
        sizer_8.Add((20, 30), 0, 0, 0)
308
        sizer_8.Add((20, 30), 0, 0, 0)
309
        sizer_8.Add(self.TestListCtrl, 1, 0, 0)
309
        sizer_8.Add(self.TestListCtrl, 1, 0, 0)
310
        sizer_8.Add((20, 20), 0, 0, 0)
310
        sizer_8.Add((20, 20), 0, 0, 0)
311
        sizer_3.Add(sizer_8, 1, wx.EXPAND, 0)
311
        sizer_3.Add(sizer_8, 1, wx.EXPAND, 0)
312
        self.SetSizer(sizer_3)
312
        self.SetSizer(sizer_3)
313
        self.Layout()
313
        self.Layout()
314
        self.SetSize((850, 700))
314
        self.SetSize((850, 700))
315
        # end wxGlade
315
        # end wxGlade
316
 
316
 
317
        # List events
317
        # List events
318
        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)
319
 
319
 
320
        # Configure Graph
320
        # Configure Graph
321
        self.client = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300))
321
        self.client = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300))
322
       
322
       
323
        self.client.SetPointLabelFunc(self.DrawPointLabel)
323
        self.client.SetPointLabelFunc(self.DrawPointLabel)
324
       
324
       
325
        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))
326
        self.client.SetFontSizeAxis(10)
326
        self.client.SetFontSizeAxis(10)
327
        self.client.SetFontSizeLegend(7)
327
        self.client.SetFontSizeLegend(7)
328
        self.client.setLogScale((False,False))
328
        self.client.setLogScale((False,False))
329
 
329
 
330
 
330
 
331
        # Configure TestListCtrl
331
        # Configure TestListCtrl
332
        self.TestListCtrl.InsertColumn(0, "Description")
332
        self.TestListCtrl.InsertColumn(0, "Description")
-
 
333
        self.TestListCtrl.InsertColumn(1, "Voltage")
333
        self.TestListCtrl.InsertColumn(1, "Speed")
334
        self.TestListCtrl.InsertColumn(2, "Speed")
334
        self.TestListCtrl.InsertColumn(2, "Channel")
335
        self.TestListCtrl.InsertColumn(3, "Channel")
335
        self.TestListCtrl.InsertColumn(3, "Vibration Value")
336
        self.TestListCtrl.InsertColumn(4, "Vibration Value")
336
        self.TestListCtrl.SetColumnWidth(3, 500)
337
        self.TestListCtrl.SetColumnWidth(4, 500)
337
 
338
 
338
    def DrawPointLabel(self, dc, mDataDict):
339
    def DrawPointLabel(self, dc, mDataDict):
339
        """This is the fuction that defines how the pointLabels are plotted
340
        """This is the fuction that defines how the pointLabels are plotted
340
            dc - DC that will be passed
341
            dc - DC that will be passed
341
            mDataDict - Dictionary of data that you want to use for the pointLabel
342
            mDataDict - Dictionary of data that you want to use for the pointLabel
342
 
343
 
343
            As an example I have decided I want a box at the curve point
344
            As an example I have decided I want a box at the curve point
344
            with some text information about the curve plotted below.
345
            with some text information about the curve plotted below.
345
            Any wxDC method can be used.
346
            Any wxDC method can be used.
346
        """
347
        """
347
        # ----------
348
        # ----------
348
        dc.SetPen(wx.Pen(wx.BLACK))
349
        dc.SetPen(wx.Pen(wx.BLACK))
349
        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )
350
        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )
350
       
351
       
351
        sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point
352
        sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point
352
        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point
353
        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point
353
        px,py = mDataDict["pointXY"]
354
        px,py = mDataDict["pointXY"]
354
        cNum = mDataDict["curveNum"]
355
        cNum = mDataDict["curveNum"]
355
        pntIn = mDataDict["pIndex"]
356
        pntIn = mDataDict["pIndex"]
356
        legend = mDataDict["legend"]
357
        legend = mDataDict["legend"]
357
        #make a string to display
358
        #make a string to display
358
        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)
359
        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)
359
        dc.DrawText(s, sx , sy+1)
360
        dc.DrawText(s, sx , sy+1)
360
        # -----------
361
        # -----------
361
 
362
 
362
 
363
 
363
    def onNewTest(self, test):
364
    def onNewTest(self, test):
364
        index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr)
365
        index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr)
-
 
366
        self.TestListCtrl.SetStringItem(index, 1, "%.1f V" %test.voltage)
365
        self.TestListCtrl.SetStringItem(index, 1, str(test.speed))
367
        self.TestListCtrl.SetStringItem(index, 2, str(test.speed))
366
        self.TestListCtrl.SetStringItem(index, 2, test.channel)
368
        self.TestListCtrl.SetStringItem(index, 3, test.channel)
367
 
369
 
368
        vv = int(test.getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value))
370
        vv = int(test.getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value))
369
        vvs = "|%s| (%d)" % ("----------------------------------------------------------------------------------------------------"[0:min(vv,100)], vv)
371
        vvs = "|%s| (%d)" % ("----------------------------------------------------------------------------------------------------"[0:min(vv,100)], vv)
370
        self.TestListCtrl.SetStringItem(index, 3, vvs)
372
        self.TestListCtrl.SetStringItem(index, 4, vvs)
371
        self.TestListCtrl.Select(index)
373
        self.TestListCtrl.Select(index)
372
 
374
 
373
 
375
 
374
    def OnTestSelected(self, event):
376
    def OnTestSelected(self, event):
375
         testId = event.m_itemIndex
377
         testId = event.m_itemIndex
376
         print "Test Selected id=%d" % (testId)
378
         print "Test Selected id=%d" % (testId)
377
         self.activeTestId = testId
379
         self.activeTestId = testId
378
         self.drawGraph()
380
         self.drawGraph()
379
 
381
 
380
    def drawGraph(self):
382
    def drawGraph(self):
381
         
383
         
382
         y = int(self.yAxisChoice.GetStringSelection())
384
         y = int(self.yAxisChoice.GetStringSelection())
383
 
385
 
384
         nbSelected = self.TestListCtrl.SelectedItemCount
386
         nbSelected = self.TestListCtrl.SelectedItemCount
385
 
387
 
386
         if nbSelected == 0:
388
         if nbSelected == 0:
387
              self.client.Clear()
389
              self.client.Clear()
388
         
390
         
389
         elif nbSelected > 1:
391
         elif nbSelected > 1:
390
             self.graphTypeChoice.Disable()
392
             self.graphTypeChoice.Disable()
391
             x = 1
393
             x = 1
392
             data = []
394
             data = []
393
             idx = self.TestListCtrl.GetFirstSelected()
395
             idx = self.TestListCtrl.GetFirstSelected()
394
             while idx != -1:
396
             while idx != -1:
395
                 data.append([x,self.app.getTest(idx).getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value)])
397
                 data.append([x,self.app.getTest(idx).getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value)])
396
                 x += 1
398
                 x += 1
397
                 idx = self.TestListCtrl.GetNextSelected(idx)
399
                 idx = self.TestListCtrl.GetNextSelected(idx)
398
             line = wx.lib.plot.PolyLine(data, legend= 'Vibrations', colour='red', width=2)
400
             line = wx.lib.plot.PolyLine(data, legend= 'Vibrations', colour='red', width=2)
399
             markers = wx.lib.plot.PolyMarker(data, legend= '', colour='red', marker='circle',size=2)
401
             markers = wx.lib.plot.PolyMarker(data, legend= '', colour='red', marker='circle',size=2)
400
             title = "Comparing tests"
402
             title = "Comparing tests"
401
             self.client.Draw(wx.lib.plot.PlotGraphics([line, markers], title, "Test", "Vibration Value"), xAxis=(1,max(x,10)), yAxis=(0,y))
403
             self.client.Draw(wx.lib.plot.PlotGraphics([line, markers], title, "Test", "Vibration Value"), xAxis=(1,max(x,10)), yAxis=(0,y))
402
             self.client.SetEnableGrid('Horizontal')
404
             self.client.SetEnableGrid('Horizontal')
403
 
405
 
404
         else:
406
         else:
405
             self.graphTypeChoice.Enable()
407
             self.graphTypeChoice.Enable()
406
             vibTest = self.app.getTest(self.activeTestId)
408
             vibTest = self.app.getTest(self.activeTestId)
407
             nb = vibTest.getDataLen()
409
             nb = vibTest.getDataLen()
408
 
410
 
409
             if self.graphTypeChoice.GetSelection() == 0:
411
             if self.graphTypeChoice.GetSelection() == 0:
410
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
412
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
411
                 xydata.shape = (nb, 2)
413
                 xydata.shape = (nb, 2)
412
                 xydata[:,1] = vibTest.getRawData()
414
                 xydata[:,1] = vibTest.getRawData()
413
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
415
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
414
       
416
       
415
                 title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
417
                 title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
416
                 self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
418
                 self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
417
                 self.client.SetEnableGrid('Horizontal')
419
                 self.client.SetEnableGrid('Horizontal')
418
   
420
   
419
             if self.graphTypeChoice.GetSelection() == 1:
421
             if self.graphTypeChoice.GetSelection() == 1:
420
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
422
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
421
                 xydata.shape = (nb, 2)
423
                 xydata.shape = (nb, 2)
422
                 xydata[:,1] = vibTest.getFilteredData(self.app.settings["hpf"].value, self.app.settings["lpf"].value)
424
                 xydata[:,1] = vibTest.getFilteredData(self.app.settings["hpf"].value, self.app.settings["lpf"].value)
423
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
425
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
424
       
426
       
425
                 title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
427
                 title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
426
                 self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
428
                 self.client.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
427
                 self.client.SetEnableGrid('Horizontal')
429
                 self.client.SetEnableGrid('Horizontal')
428
   
430
   
429
             elif self.graphTypeChoice.GetSelection() == 2:
431
             elif self.graphTypeChoice.GetSelection() == 2:
430
                 xydata = _Numeric.linspace(0,FS/2,nb)
432
                 xydata = _Numeric.linspace(0,FS/2,nb)
431
                 xydata.shape = (nb/2, 2)
433
                 xydata.shape = (nb/2, 2)
432
                 
434
                 
433
                 xydata[:,1] = vibTest.getSpectrum()
435
                 xydata[:,1] = vibTest.getSpectrum()
434
   
436
   
435
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red')
437
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red')
436
                 markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2)
438
                 markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2)
437
                 
439
                 
438
                 fc = self.app.settings["hpf"].value
440
                 fc = self.app.settings["hpf"].value
439
                 filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
441
                 filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
440
                 fc = self.app.settings["lpf"].value
442
                 fc = self.app.settings["lpf"].value
441
                 filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
443
                 filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
442
       
444
       
443
                 title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
445
                 title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
444
                 self.client.Draw(wx.lib.plot.PlotGraphics([line,markers, filterLine1, filterLine2], title, "Freq (Hz)", "Acc"), xAxis=(0,200), yAxis= (-0,y))
446
                 self.client.Draw(wx.lib.plot.PlotGraphics([line,markers, filterLine1, filterLine2], title, "Freq (Hz)", "Acc"), xAxis=(0,200), yAxis= (-0,y))
445
                 self.client.SetEnableGrid(True)
447
                 self.client.SetEnableGrid(True)
446
 
448
 
447
 
449
 
448
    def OnImport(self, event): # wxGlade: MainFrame.<event_handler>
450
    def OnImport(self, event): # wxGlade: MainFrame.<event_handler>
449
        dlg = wx.FileDialog(
451
        dlg = wx.FileDialog(
450
            self, message="Choose a file",
452
            self, message="Choose a file",
451
            defaultDir=os.getcwd(),
453
            defaultDir="%s/Data/" % os.getcwd(),
452
            defaultFile="*.txt",
454
            defaultFile="*.txt",
453
            wildcard="",
455
            wildcard="*.txt",
454
            style=wx.OPEN | wx.CHANGE_DIR
456
            style=wx.OPEN | wx.CHANGE_DIR
455
            )
457
            )
456
        if dlg.ShowModal() == wx.ID_OK:
458
        if dlg.ShowModal() == wx.ID_OK:
457
            paths = dlg.GetPaths();
459
            paths = dlg.GetPaths();
458
            self.app.Import(paths[0])
460
            self.app.loadTests(paths[0])
-
 
461
        dlg.Destroy()
-
 
462
 
-
 
463
    def onExport(self, event): # wxGlade: MainFrame.<event_handler>
-
 
464
        dlg = wx.FileDialog(
-
 
465
              self, message="Save file as ...",
-
 
466
              defaultDir="%s/Data/" % os.getcwd(),
-
 
467
              defaultFile="*.txt",
-
 
468
              wildcard="",
-
 
469
              style=wx.SAVE
-
 
470
              )
-
 
471
        if dlg.ShowModal() == wx.ID_OK:
-
 
472
            paths = dlg.GetPaths();
-
 
473
            self.app.saveTests(paths[0])
459
        dlg.Destroy()
474
        dlg.Destroy()
460
 
475
 
461
    def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler>
476
    def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler>
462
        self.drawGraph()
477
        self.drawGraph()
463
 
478
 
464
    def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler>
479
    def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler>
465
        self.drawGraph()
480
        self.drawGraph()
466
 
481
 
467
    def OnSettings(self, event): # wxGlade: MainFrame.<event_handler>
482
    def OnSettings(self, event): # wxGlade: MainFrame.<event_handler>
468
        dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200),
483
        dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200),
469
                         #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME,
484
                         #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME,
470
                         style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX
485
                         style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX
471
                         )
486
                         )
472
        dlg.CenterOnScreen()
487
        dlg.CenterOnScreen()
473
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
488
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
474
        dlg.Destroy()
489
        dlg.Destroy()
475
        self.app.onSettingsChanged()
490
        self.app.onSettingsChanged()
476
 
491
 
477
    def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler>
492
    def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler>
478
        # Collect measure parameters
493
        # Collect measure parameters
479
        mp = MeasureParameters()
494
        mp = MeasureParameters()
480
        mp.descr = self.tcDescr.GetValue()
495
        mp.descr = self.tcDescr.GetValue()
481
        mp.motors = map(int,self.tcMotors.GetValue().split(','))
496
        mp.motors = map(int,self.tcMotors.GetValue().split(','))
482
        mp.channels = map(int,self.tcChannels.GetValue().split(','))
497
        mp.channels = map(int,self.tcChannels.GetValue().split(','))
483
        s = self.tcSpeeds.GetValue()
498
        s = self.tcSpeeds.GetValue()
-
 
499
        if s=="test":
-
 
500
          mp.speeds = (100,100,100,100,100, 150,150,150,150,150, 200,200,200,200,200, 100,150,200, 100,150,200, 100,150,200, 100,150,200)
484
        if s.count("-") == 1:
501
        elif s.count("-") == 1:
485
            # assume from-to:step format
502
            # assume from-to:step format
486
            s = s.split("-")
503
            s = s.split("-")
487
            if len(s) != 2: raise Exception("Invalid format")
504
            if len(s) != 2: raise Exception("Invalid format")
488
            s[1] = s[1].split(":")
505
            s[1] = s[1].split(":")
489
            if len(s[1]) != 2: raise Exception("Invalid format")
506
            if len(s[1]) != 2: raise Exception("Invalid format")
490
            mp.speeds = range(int(s[0]),int(s[1][0])+int(s[1][1]),int(s[1][1]))
507
            mp.speeds = range(int(s[0]),int(s[1][0])+int(s[1][1]),int(s[1][1]))
491
        else:
508
        else:
492
            mp.speeds = map(int,s.split(','))
509
            mp.speeds = map(int,s.split(','))
493
           
510
           
494
       
511
       
495
        # create the dialog that will show the satus
512
        # create the dialog that will show the satus
496
        dlg = MeasureDialog(self)
513
        dlg = MeasureDialog(self)
497
        dlg.CenterOnScreen()
514
        dlg.CenterOnScreen()
498
       
515
       
499
        # Signal the application
516
        # Signal the application
500
        self.app.startMeasure(mp, dlg)
517
        self.app.startMeasure(mp, dlg)
501
       
518
       
502
        # Show the dialog
519
        # Show the dialog
503
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
520
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
504
        dlg.Destroy()
521
        dlg.Destroy()
505
 
522
 
506
    def _removeTest(self, idx):
523
    def _removeTest(self, idx):
507
        print "Deleting test %d" % idx
524
        print "Deleting test %d" % idx
508
        self.app.removeTest(idx)
525
        self.app.removeTest(idx)
509
        self.TestListCtrl.DeleteItem(idx)
526
        self.TestListCtrl.DeleteItem(idx)
510
       
527
       
511
           
528
           
512
    def onClear(self, event): # wxGlade: MainFrame.<event_handler>
529
    def onClear(self, event): # wxGlade: MainFrame.<event_handler>
513
        print "Clear all tests"
530
        print "Clear all tests"
514
        for i in range(len(self.app.VibTests)-1, -1, -1):
531
        for i in range(len(self.app.VibTests)-1, -1, -1):
515
            self._removeTest(i)
532
            self._removeTest(i)
516
        self.drawGraph()
533
        self.drawGraph()
517
           
534
           
518
       
535
       
519
    def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler>
536
    def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler>
520
        while True:
537
        while True:
521
            idx = self.TestListCtrl.GetFirstSelected()
538
            idx = self.TestListCtrl.GetFirstSelected()
522
            if idx == -1: break
539
            if idx == -1: break
523
            self._removeTest(idx)
540
            self._removeTest(idx)
524
           
-
 
525
    def onExport(self, event): # wxGlade: MainFrame.<event_handler>
-
 
526
        print "Event handler `onExport' not implemented"
-
 
527
        event.Skip()
541
           
528
 
542
   
529
# end of class MainFrame
543
# end of class MainFrame
530
 
544
 
531
class Setting:
545
class Setting:
532
    def __init__(self, descr, defaultValue):
546
    def __init__(self, descr, defaultValue):
533
        self.descr = descr
547
        self.descr = descr
534
        self.value = defaultValue
548
        self.value = defaultValue
535
       
549
       
536
    def set(self, newValue):
550
    def set(self, newValue):
537
        if isinstance(self.value, int):
551
        if isinstance(self.value, int):
538
            self.value = int(newValue)
552
            self.value = int(newValue)
539
        else:
553
        else:
540
            self.value = str(newValue)
554
            self.value = str(newValue)
541
 
555
 
542
class MeasureParameters:
556
class MeasureParameters:
543
      pass
557
      pass
544
 
558
 
545
class MeasureThread:
559
class MeasureThread:
546
    def __init__(self, measureParameters, evtConsumer):
560
    def __init__(self, measureParameters, evtConsumer):
547
        self.mk = mkProto.MkComm()
561
        self.mk = mkProto.MkComm()
548
        self.param = measureParameters
562
        self.param = measureParameters
549
        self.evtConsumer = evtConsumer
563
        self.evtConsumer = evtConsumer
550
        self.cancel = False
564
        self.cancel = False
551
        self.running = False
565
        self.running = False
552
       
566
       
553
    def start(self):
567
    def start(self):
554
        thread.start_new_thread(self._run, ())
568
        thread.start_new_thread(self._run, ())
555
       
569
       
556
    def stop(self):
570
    def stop(self):
557
        self.cancel = True
571
        self.cancel = True
558
 
572
 
559
    def _testCancel(self):
573
    def _testCancel(self):
560
        if self.cancel:
574
        if self.cancel:
561
            raise Exception("Operation cancelled")
575
            raise Exception("Operation cancelled")
562
               
576
               
563
    def _sendEvent(self, msg, error=False):
577
    def _sendEvent(self, msg, error=False):
564
        evt = MeasStatusUpdateEvent(running=self.running, msg=msg, error=error)
578
        evt = MeasStatusUpdateEvent(running=self.running, msg=msg, error=error)
565
        wx.PostEvent(self.evtConsumer, evt)
579
        wx.PostEvent(self.evtConsumer, evt)
566
 
580
 
567
    def _setMotorSpeed(self, speed, settlingTime):
581
    def _setMotorSpeed(self, speed, settlingTime):
568
        speeds = [0,0,0,0]
582
        speeds = [0,0,0,0]
569
        for motor in self.param.motors:
583
        for motor in self.param.motors:
570
            speeds[motor-1] = speed
584
            speeds[motor-1] = speed
571
        for i in range(int(settlingTime*10)):
585
        for i in range(int(settlingTime*10)):
572
          self._testCancel()
586
          self._testCancel()
573
          self.mk.setMotorTest(speeds)
587
          self.mk.setMotorTest(speeds)
574
          time.sleep(.1)
588
          time.sleep(.1)
575
       
589
       
576
                   
590
                   
577
    def _run(self):
591
    def _run(self):
578
        self.running = True
592
        self.running = True
579
        self._sendEvent("Starting test \"%s\"" % self.param.descr)    
593
        self._sendEvent("Starting test \"%s\"" % self.param.descr)    
580
 
594
 
581
        try:
595
        try:
582
            self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort)
596
            self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort)
583
            self.mk.open(comPort=self.param.serialPort)
597
            self.mk.open(comPort=self.param.serialPort)
584
               
598
               
585
            msg = self.mk.getVersionMsg()
599
            msg = self.mk.getVersionMsg()
586
            version = msg.getVersion()
600
            version = msg.getVersion()
587
            self._sendEvent("Version: %d.%d" % version)
601
            self._sendEvent("Version: %d.%d" % version)
588
           
602
           
589
            msg = self.mk.getDebugMsg()
603
            msg = self.mk.getDebugMsg()
590
            voltage = msg.getVoltage()
604
            voltage = msg.getVoltage()
591
            if (voltage == 0):
605
            if (voltage == 0):
592
              minVoltage = 0
606
              minVoltage = 0
593
            else:
607
            else:
594
              if (voltage > 4.2*3):
608
              if (voltage > 4.2*3):
595
                minVoltage = 4*3.5
609
                minVoltage = 4*3.5
596
              else:
610
              else:
597
                minVoltage = 3*3.5
611
                minVoltage = 3*3.5
598
 
612
 
599
            self._sendEvent("Voltage: %2.1fV" % voltage)
613
            self._sendEvent("Voltage: %2.1fV" % voltage)
600
            self._sendEvent("Minimum Voltage: %2.1fV" % minVoltage)
614
            self._sendEvent("Minimum Voltage: %2.1fV" % minVoltage)
601
         
615
         
602
            self._sendEvent("Starting motor(s) (speed=%d)... " % self.param.motorStartupSpeed)
616
            self._sendEvent("Starting motor(s) (speed=%d)... " % self.param.motorStartupSpeed)
603
            self._setMotorSpeed(self.param.motorStartupSpeed, self.param.motorStartupSettlingTime)
617
            self._setMotorSpeed(self.param.motorStartupSpeed, self.param.motorStartupSettlingTime)
604
         
618
         
605
            for speed in self.param.speeds:
619
            for speed in self.param.speeds:
606
                self._sendEvent("Changing motor speed to %d... " % speed)
620
                self._sendEvent("Changing motor speed to %d... " % speed)
607
                self._setMotorSpeed(speed, 1)
621
                self._setMotorSpeed(speed, 1)
608
               
622
               
609
                for channel in self.param.channels:
623
                for channel in self.param.channels:
610
                    self._setMotorSpeed(speed, .1)
624
                    self._setMotorSpeed(speed, .1)
-
 
625
                    msg = self.mk.getDebugMsg()
-
 
626
                    voltage = msg.getVoltage()
-
 
627
           
611
                    self._sendEvent("Getting data from channel %s" % CHANNEL_NAMES[channel])
628
                    self._sendEvent("Getting data from channel %s" % CHANNEL_NAMES[channel])
612
                    data = self.mk.doVibrationTest(1000, channel)
629
                    data = self.mk.doVibrationTest(1000, channel)
613
                   
630
                   
614
                    vt = VibTest(self.param.descr, self.param.motors, speed, CHANNEL_NAMES[channel], data)
631
                    vt = VibTest(self.param.descr, voltage, self.param.motors, speed, CHANNEL_NAMES[channel], data)
615
                    evt = MeasDataEvent(vibTest = vt)
632
                    evt = MeasDataEvent(vibTest = vt)
616
                    wx.PostEvent(self.evtConsumer, evt)
633
                    wx.PostEvent(self.evtConsumer, evt)
-
 
634
                   
-
 
635
                    if voltage<minVoltage:
-
 
636
                        raise Exception("Voltage too low")
617
                   
637
                   
618
            self._sendEvent("Done !")            
638
            self._sendEvent("Done !")            
619
       
639
       
620
        except Exception, e:
640
        except Exception, e:
621
            self._sendEvent("Exception \"%s\"" % e, error=True)  
641
            self._sendEvent("Exception \"%s\"" % e, error=True)  
622
               
642
               
623
        self.running = False
643
        self.running = False
624
        self._sendEvent("")    
644
        self._sendEvent("")    
625
       
645
       
626
 
646
 
627
class VibTest:
647
class VibTest:
628
    def __init__(self, descr, motor, speed, channel, rawData):
648
    def __init__(self, descr, voltage, motor, speed, channel, rawData):
629
        self.descr = descr
649
        self.descr = descr
-
 
650
        self.voltage = voltage
630
        self.motor = motor
651
        self.motor = motor
631
        self.speed = speed
652
        self.speed = speed
632
        self.channel = channel
653
        self.channel = channel
633
 
654
 
634
        self.dataLen = len(rawData)
655
        self.dataLen = len(rawData)
635
 
656
 
636
        self.rawData = _Numeric.array(rawData)
657
        self.rawData = _Numeric.array(rawData)
637
        self.dc = self.rawData.mean()
658
        self.dc = self.rawData.mean()
638
        self.rawData -= self.dc
659
        self.rawData -= self.dc
639
 
660
 
640
        self.fft = _Numeric.fft.rfft(self.rawData)
661
        self.fft = _Numeric.fft.rfft(self.rawData)
641
 
662
 
642
        self.spectrum = None
663
        self.spectrum = None
643
        self.filteredData = None
664
        self.filteredData = None
644
        self.fc1 = None
665
        self.fc1 = None
645
        self.fc2 = None
666
        self.fc2 = None
646
       
667
       
647
        self.vibValue = None
668
        self.vibValue = None
648
       
669
       
649
    def getDescr(self):
670
    def getDescr(self):
650
        return self.Descr
671
        return self.Descr
651
 
672
 
652
    def getRawData(self):
673
    def getRawData(self):
653
        return self.rawData
674
        return self.rawData
654
 
675
 
655
    def getDataLen(self):
676
    def getDataLen(self):
656
        return self.dataLen
677
        return self.dataLen
657
 
678
 
658
    def getSpectrum(self):
679
    def getSpectrum(self):
659
        if self.spectrum == None:
680
        if self.spectrum == None:
660
            self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2)
681
            self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2)
661
        return self.spectrum
682
        return self.spectrum
662
 
683
 
663
    def getFilteredData(self, fc1, fc2):
684
    def getFilteredData(self, fc1, fc2):
664
        if self.fc1 != fc1 or self.fc2 != fc2:
685
        if self.fc1 != fc1 or self.fc2 != fc2:
665
            self.filteredData = None  
686
            self.filteredData = None  
666
           
687
           
667
        if self.filteredData == None:
688
        if self.filteredData == None:
668
            tmpfft = self.fft.copy()
689
            tmpfft = self.fft.copy()
669
            fc = (float(fc1))/(FS/2)*len(tmpfft)
690
            fc = (float(fc1))/(FS/2)*len(tmpfft)
670
            print "fc1=%d => fc=%d" % (fc1,fc)
691
            print "fc1=%d => fc=%d" % (fc1,fc)
671
            for i in range(0,int(fc)):
692
            for i in range(0,int(fc)):
672
                tmpfft[i] = 0
693
                tmpfft[i] = 0
673
            fc = (float(fc2))/(FS/2)*len(tmpfft)
694
            fc = (float(fc2))/(FS/2)*len(tmpfft)
674
            print "fc2=%d => fc=%d" % (fc2,fc)
695
            print "fc2=%d => fc=%d" % (fc2,fc)
675
            for i in range(int(fc), len(tmpfft)):
696
            for i in range(int(fc), len(tmpfft)):
676
                tmpfft[i] = 0
697
                tmpfft[i] = 0
677
            self.filteredData = _Numeric.fft.irfft(tmpfft)
698
            self.filteredData = _Numeric.fft.irfft(tmpfft)
678
            self.fc1 = fc1
699
            self.fc1 = fc1
679
            self.fc2 = fc2
700
            self.fc2 = fc2
680
           
701
           
681
        return self.filteredData
702
        return self.filteredData
682
       
703
       
683
    def getVibValue(self, fc1, fc2):
704
    def getVibValue(self, fc1, fc2):
684
      if self.fc1 != fc1 or self.fc2 != fc2:
705
      if self.fc1 != fc1 or self.fc2 != fc2:
685
        self.vibValue = None  
706
        self.vibValue = None  
686
      if self.vibValue == None:
707
      if self.vibValue == None:
687
        fd = self.getFilteredData(fc1, fc2)[100:-100];
708
        fd = self.getFilteredData(fc1, fc2)[100:-100];
688
        self.vibValue = max(fd)-min(fd)
709
        self.vibValue = max(fd)-min(fd)
689
      return self.vibValue
710
      return self.vibValue
690
 
711
 
691
 
712
 
692
 
713
 
693
class App(wx.App):
714
class App(wx.App):
694
 
715
 
695
    SETTINGSFILE = "settings.cfg"
716
    SETTINGSFILE = "settings.cfg"
696
 
717
 
697
    def __init__(self, par):
718
    def __init__(self, par):
698
        self.VibTests = []
719
        self.VibTests = []
699
        wx.App.__init__(self, par)
720
        wx.App.__init__(self, par)
700
 
721
 
701
        # Init settings
722
        # Init settings
702
        self.settings={}
723
        self.settings={}
703
        self.settings["serialport"] = Setting("Serial Port", "COM1")
724
        self.settings["serialport"] = Setting("Serial Port", "COM1")
704
        self.settings["startupspeed"] = Setting("Motor Startup Speed", 25)
725
        self.settings["startupspeed"] = Setting("Motor Startup Speed", 25)
705
        self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3)
726
        self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3)
706
        self.settings["serialport"] = Setting("Serial Port", "COM1")
727
        self.settings["serialport"] = Setting("Serial Port", "COM1")
707
        self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 50)
728
        self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 50)
708
        self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 180)
729
        self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 180)
709
 
730
 
710
        self.readSettings()
731
        self.readSettings()
711
 
732
 
712
        if len(sys.argv)>1:
733
        if len(sys.argv)>1:
713
            self.Import(sys.argv[1])
734
            self.loadTests(sys.argv[1])
714
 
735
 
715
 
736
 
716
    def readSettings(self):
737
    def readSettings(self):
717
        print "Reading settings"
738
        print "Reading settings"
718
        cp = ConfigParser.ConfigParser()
739
        cp = ConfigParser.ConfigParser()
719
 
740
 
720
        try:
741
        try:
721
            cp.read(App.SETTINGSFILE)
742
            cp.read(App.SETTINGSFILE)
722
            for setting in cp.items("DEFAULT"):
743
            for setting in cp.items("DEFAULT"):
723
                print " ",setting
744
                print " ",setting
724
                try:
745
                try:
725
                    self.settings[setting[0]].set(setting[1])
746
                    self.settings[setting[0]].set(setting[1])
726
                except:
747
                except:
727
                    print "WARNING, unknown setting"
748
                    print "WARNING, unknown setting"
728
        except:
749
        except:
729
            print "ERROR reading settingsfile"
750
            print "ERROR reading settingsfile"
730
 
751
 
731
 
752
 
732
    def storeSettings(self):
753
    def storeSettings(self):
733
        print "Storing settings"
754
        print "Storing settings"
734
 
755
 
735
        cp = ConfigParser.ConfigParser()
756
        cp = ConfigParser.ConfigParser()
736
        for setting in self.settings.iteritems():
757
        for setting in self.settings.iteritems():
737
            cp.set("", setting[0], setting[1].value)
758
            cp.set("", setting[0], setting[1].value)
738
 
759
 
739
        file = open(App.SETTINGSFILE, "w")
760
        file = open(App.SETTINGSFILE, "w")
740
        cp.write(file)
761
        cp.write(file)
741
        file.close()
762
        file.close()
742
 
763
 
743
 
764
 
744
    def onSettingsChanged(self):
765
    def onSettingsChanged(self):
745
        self.storeSettings()
766
        self.storeSettings()
746
     
767
     
747
    def AddTest2(self, vibTest):
768
    def AddTest2(self, vibTest):
748
        self.VibTests.append(vibTest)
769
        self.VibTests.append(vibTest)
749
        self.frame_1.onNewTest(vibTest)
770
        self.frame_1.onNewTest(vibTest)
750
         
771
         
751
    def AddTest(self, descr, motor, speed, channel, rawData):
772
    def AddTest(self, descr, voltage, motor, speed, channel, rawData):
752
        test = VibTest(descr, motor, speed, channel, rawData)
773
        test = VibTest(descr, voltage, motor, speed, channel, rawData)
753
        self.AddTest2(test)
774
        self.AddTest2(test)
754
 
775
 
755
    def removeTest(self, idx):
776
    def removeTest(self, idx):
756
        del(self.VibTests[idx])
777
        del(self.VibTests[idx])
757
   
778
   
758
    def getTest(self, testId):
779
    def getTest(self, testId):
759
        return self.VibTests[testId]
780
        return self.VibTests[testId]
760
 
781
 
761
    def OnInit(self):
782
    def OnInit(self):
762
        wx.InitAllImageHandlers()
783
        wx.InitAllImageHandlers()
763
        self.frame_1 = MainFrame(None, -1, "")
784
        self.frame_1 = MainFrame(None, -1, "")
764
        self.frame_1.setApp(self);
785
        self.frame_1.setApp(self);
765
        self.SetTopWindow(self.frame_1)
786
        self.SetTopWindow(self.frame_1)
766
 
787
 
767
        self.frame_1.CenterOnScreen()
788
        self.frame_1.CenterOnScreen()
768
        self.frame_1.Show()
789
        self.frame_1.Show()
769
        return 1
790
        return 1
770
 
791
 
-
 
792
    def saveTests(self, filePath):
-
 
793
        try:
-
 
794
          logfile = open(filePath, "r")
-
 
795
          newFile = False
-
 
796
          logfile.close()
-
 
797
        except:
-
 
798
          newFile = True
-
 
799
         
-
 
800
        for test in self.VibTests:
-
 
801
          if newFile:
-
 
802
            logfile = open(filePath, "w")
-
 
803
            print "Writing result to %s ..." % filePath,
-
 
804
            logfile.write("%s %d %s\n" % (test.descr, test.speed, test.channel))
-
 
805
            for value in test.rawData:
-
 
806
              logfile.write("%d\n" % value)
-
 
807
            logfile.close()  
-
 
808
            print "OK"
-
 
809
          else:
-
 
810
            print "Appending result to %s ..." % filePath,
-
 
811
            logfile = open(filePath, "r")
-
 
812
            prevData = []
-
 
813
            for line in logfile:
-
 
814
              prevData.append(line[:-1])
-
 
815
            logfile.close()
-
 
816
            logfile = open(filePath, "w")
-
 
817
            logfile.write("%s,%s %d %s\n" % (prevData[0], test.descr, test.speed, test.channel))
-
 
818
            i = 1
-
 
819
            for value in test.rawData:
-
 
820
              logfile.write("%s,%d\n" % (prevData[i], value))
-
 
821
              i += 1
-
 
822
            logfile.close()
-
 
823
            print "OK"
-
 
824
          newFile = False
-
 
825
           
-
 
826
           
771
    def Import(self, filePath):
827
    def loadTests(self, filePath):
772
       
828
       
773
        print "Importing file \"%s\"" % filePath
829
        print "Importing file \"%s\"" % filePath
774
 
830
 
775
        logfile = open(filePath, "r")
831
        logfile = open(filePath, "r")
776
        data = None
832
        data = None
777
 
833
 
778
        headers = (logfile.readline()).split(',')
834
        headers = (logfile.readline()[:-1]).split(',')
779
        nbCols = len(headers)
835
        nbCols = len(headers)
780
        print "NbCols =", nbCols
836
        print "NbCols =", nbCols
781
 
837
 
782
        data = []
838
        data = []
783
        descr = []
839
        descr = []
784
        speed = []
840
        speed = []
785
        channel = []
841
        channel = []
786
        for c in range(nbCols):
842
        for c in range(nbCols):
787
            data.append([])
843
            data.append([])
788
            h = headers[c].split(' ')
844
            h = headers[c].split(' ')
789
            descr.append(h[0]);
845
            descr.append(h[0]);
790
            speed.append(h[1]);
846
            speed.append(h[1]);
791
            channel.append(h[2]);
847
            channel.append(h[2]);
792
 
848
 
793
        for line in logfile:
849
        for line in logfile:
794
            values = line.split(',')
850
            values = line.split(',')
795
            for i in range(nbCols):
851
            for i in range(nbCols):
796
                data[i].append(int(values[i]))
852
                data[i].append(int(values[i]))
797
        logfile.close()
853
        logfile.close()
798
 
854
 
799
        for c in range(nbCols):
855
        for c in range(nbCols):
800
            if (len(data[c]) % 2) != 0:
856
            if (len(data[c]) % 2) != 0:
801
                data[c].append(data[c][-1])
857
                data[c].append(data[c][-1])
802
            self.AddTest(descr[c], 0, int(speed[c]), channel[c], data[c])
858
            self.AddTest(descr[c], 0, 0, int(speed[c]), channel[c], data[c])
803
           
859
           
804
    def startMeasure(self, measureParams, dialog):
860
    def startMeasure(self, measureParams, dialog):
805
        print "Start measuring"
861
        print "Start measuring"
806
       
862
       
807
        measureParams.serialPort = self.settings["serialport"].value
863
        measureParams.serialPort = self.settings["serialport"].value
808
        measureParams.motorStartupSpeed = self.settings["startupspeed"].value
864
        measureParams.motorStartupSpeed = self.settings["startupspeed"].value
809
        measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value
865
        measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value
810
       
866
       
811
        self.measureThread = MeasureThread(measureParams, dialog)
867
        self.measureThread = MeasureThread(measureParams, dialog)
812
        self.measureThread.start()
868
        self.measureThread.start()
813
       
869
       
814
    def cancelMeasurement(self):
870
    def cancelMeasurement(self):
815
        print "Measuring CANCEL"
871
        print "Measuring CANCEL"
816
       
872
       
817
        self.measureThread.stop()
873
        self.measureThread.stop()
818
       
874
       
819
       
875
       
820
       
876
       
821
       
877
       
822
       
878
       
823
           
879
           
824
 
880
 
825
       
881
       
826
# end of class App
882
# end of class App
827
 
883
 
828
if __name__ == "__main__":
884
if __name__ == "__main__":
829
    VibrationTestGui = App(0)
885
    VibrationTestGui = App(0)
830
    VibrationTestGui.MainLoop()
886
    VibrationTestGui.MainLoop()
831
 
887