Subversion Repositories Projects

Rev

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

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