Subversion Repositories Projects

Rev

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

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