Subversion Repositories Projects

Rev

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

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