Subversion Repositories Projects

Rev

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

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