Subversion Repositories Projects

Rev

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

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