Subversion Repositories Projects

Rev

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

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