Subversion Repositories Projects

Rev

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

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