Subversion Repositories Projects

Rev

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

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