Subversion Repositories Projects

Rev

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

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