Subversion Repositories Projects

Rev

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

Rev 661 Rev 683
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: 661 $
6
# Mikrokopter VibrationTest  Rev: $Rev: 683 $
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_1_copy = wx.StaticText(self, -1, "Channel(s) :", style=wx.ALIGN_RIGHT)
-
 
319
        self.gyroYawCb = wx.CheckBox(self, -1, "Gyro Yaw")
-
 
320
        self.gyroRollCb = wx.CheckBox(self, -1, "Gyro Roll")
-
 
321
        self.gyroNickCb = wx.CheckBox(self, -1, "Gyro Nick")
319
        self.accTopCb = wx.CheckBox(self, -1, "ACC Top")
322
        self.accTopCb = wx.CheckBox(self, -1, "ACC Top")
320
        self.accRollCb = wx.CheckBox(self, -1, "ACC Roll")
323
        self.accRollCb = wx.CheckBox(self, -1, "ACC Roll")
321
        self.accNickCb = wx.CheckBox(self, -1, "ACC Nick")
324
        self.accNickCb = wx.CheckBox(self, -1, "ACC Nick")
322
        self.label_3 = wx.StaticText(self, -1, "Motor(s) :", style=wx.ALIGN_RIGHT)
325
        self.label_3 = wx.StaticText(self, -1, "Motor(s) :", style=wx.ALIGN_RIGHT)
323
        self.motorsCtrl = wx.TextCtrl(self, -1, "1")
326
        self.motorsCtrl = wx.TextCtrl(self, -1, "1")
324
        self.label_4 = wx.StaticText(self, -1, "Speed(s) :")
327
        self.label_4 = wx.StaticText(self, -1, "Speed(s) :")
325
        self.speedCtrl = wx.TextCtrl(self, -1, "100-200:10")
328
        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))
329
        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)
330
        self.static_line_1 = wx.StaticLine(self, -1)
328
        self.graphCtrl = wx.lib.plot.PlotCanvas(self, size=(800,300))
331
        self.graphCtrl = wx.lib.plot.PlotCanvas(self, size=(800,300))
329
        self.label_40 = wx.StaticText(self, -1, "Graph Type ")
332
        self.label_40 = wx.StaticText(self, -1, "Graph Type ")
330
        self.graphTypeChoice = wx.Choice(self, -1, choices=["Raw Signal", "Filtered Signal", "Spectrum"])
333
        self.graphTypeChoice = wx.Choice(self, -1, choices=["Raw Signal", "Filtered Signal", "Spectrum"])
331
        self.label_41 = wx.StaticText(self, -1, "Y Axis Range ")
334
        self.label_41 = wx.StaticText(self, -1, "Y Axis Range ")
332
        self.yAxisChoice = wx.Choice(self, -1, choices=["25", "50", "75", "100", "200"])
335
        self.yAxisChoice = wx.Choice(self, -1, choices=["25", "50", "75", "100", "200"])
333
        self.copyGraphButton = wx.Button(self, -1, "Copy Graph Data")
336
        self.copyGraphButton = wx.Button(self, -1, "Copy Graph Data")
334
        self.TestListCtrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
337
        self.TestListCtrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
335
 
338
 
336
        self.__set_properties()
339
        self.__set_properties()
337
        self.__do_layout()
340
        self.__do_layout()
338
 
341
 
339
        self.Bind(wx.EVT_MENU, self.OnSettings, id=101)
342
        self.Bind(wx.EVT_MENU, self.OnSettings, id=101)
340
        self.Bind(wx.EVT_MENU, self.onExit, id=150)
343
        self.Bind(wx.EVT_MENU, self.onExit, id=150)
341
        self.Bind(wx.EVT_MENU, self.onClear, id=301)
344
        self.Bind(wx.EVT_MENU, self.onClear, id=301)
342
        self.Bind(wx.EVT_MENU, self.onClearSelected, id=302)
345
        self.Bind(wx.EVT_MENU, self.onClearSelected, id=302)
343
        self.Bind(wx.EVT_MENU, self.onSelectAll, id=310)
346
        self.Bind(wx.EVT_MENU, self.onSelectAll, id=310)
344
        self.Bind(wx.EVT_MENU, self.OnImport, id=303)
347
        self.Bind(wx.EVT_MENU, self.OnImport, id=303)
345
        self.Bind(wx.EVT_MENU, self.onExport, id=304)
348
        self.Bind(wx.EVT_MENU, self.onExport, id=304)
346
        self.Bind(wx.EVT_MENU, self.onAbout, id=1099)
349
        self.Bind(wx.EVT_MENU, self.onAbout, id=1099)
347
        self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.bitmap_button_1)
350
        self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.bitmap_button_1)
348
        self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice)
351
        self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice)
349
        self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice)
352
        self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice)
350
        self.Bind(wx.EVT_BUTTON, self.onCopyGraphData, self.copyGraphButton)
353
        self.Bind(wx.EVT_BUTTON, self.onCopyGraphData, self.copyGraphButton)
351
        # end wxGlade
354
        # end wxGlade
352
        favicon = wx.Icon('%s/Resources/60px-Procman.ico' % rootPath, wx.BITMAP_TYPE_ICO, 32, 32)
355
        favicon = wx.Icon('%s/Resources/60px-Procman.ico' % rootPath, wx.BITMAP_TYPE_ICO, 32, 32)
353
        wx.Frame.SetIcon(self, favicon)
356
        wx.Frame.SetIcon(self, favicon)
354
       
357
       
355
 
358
 
356
    def setApp(self, app):
359
    def setApp(self, app):
357
        self.app = app
360
        self.app = app
358
 
361
 
359
    def __set_properties(self):
362
    def __set_properties(self):
360
        # begin wxGlade: MainFrame.__set_properties
363
        # begin wxGlade: MainFrame.__set_properties
361
        self.SetTitle("VibrationTest")
364
        self.SetTitle("VibrationTest")
362
        self.SetSize((850, 700))
365
        self.SetSize((850, 700))
363
        self.label_1.SetMinSize((110, -1))
366
        self.label_1.SetMinSize((110, -1))
364
        self.label_1.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
367
        self.label_1.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
365
        self.descrCtrl.SetMinSize((350, -1))
368
        self.descrCtrl.SetMinSize((350, -1))
366
        self.label_2.SetMinSize((110, -1))
369
        self.label_1_copy.SetMinSize((110, -1))
367
        self.label_2.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
370
        self.label_1_copy.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
-
 
371
        self.gyroYawCb.SetMinSize((100, -1))
-
 
372
        self.gyroYawCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
-
 
373
        self.gyroRollCb.SetMinSize((100, -1))
-
 
374
        self.gyroRollCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
-
 
375
        self.gyroNickCb.SetMinSize((100, -1))
-
 
376
        self.gyroNickCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
-
 
377
        self.accTopCb.SetMinSize((100, -1))
368
        self.accTopCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
378
        self.accTopCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
-
 
379
        self.accRollCb.SetMinSize((100, -1))
369
        self.accRollCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
380
        self.accRollCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
370
        self.accRollCb.SetValue(1)
381
        self.accRollCb.SetValue(1)
-
 
382
        self.accNickCb.SetMinSize((100, -1))
371
        self.accNickCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
383
        self.accNickCb.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
372
        self.label_3.SetMinSize((110, -1))
384
        self.label_3.SetMinSize((110, -1))
373
        self.label_3.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
385
        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, ""))
386
        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")
387
        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")
388
        self.bitmap_button_1.SetToolTipString("Start Measurement")
377
        self.bitmap_button_1.SetSize(self.bitmap_button_1.GetBestSize())
389
        self.bitmap_button_1.SetSize(self.bitmap_button_1.GetBestSize())
378
        self.static_line_1.SetMinSize((800,3))
390
        self.static_line_1.SetMinSize((800,3))
379
        self.graphCtrl.SetMinSize((800,300))
391
        self.graphCtrl.SetMinSize((800,300))
380
        self.label_40.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
392
        self.label_40.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
381
        self.graphTypeChoice.SetSelection(0)
393
        self.graphTypeChoice.SetSelection(0)
382
        self.label_41.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
394
        self.label_41.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
383
        self.yAxisChoice.SetSelection(1)
395
        self.yAxisChoice.SetSelection(1)
384
        self.copyGraphButton.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
396
        self.copyGraphButton.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
385
        self.TestListCtrl.SetMinSize((800,300))
397
        self.TestListCtrl.SetMinSize((800,300))
386
        self.TestListCtrl.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
398
        self.TestListCtrl.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
387
        # end wxGlade
399
        # end wxGlade
388
 
400
 
389
    def __do_layout(self):
401
    def __do_layout(self):
390
        # begin wxGlade: MainFrame.__do_layout
402
        # begin wxGlade: MainFrame.__do_layout
391
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
403
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
392
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
404
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
393
        sizer_11 = wx.BoxSizer(wx.VERTICAL)
405
        sizer_11 = wx.BoxSizer(wx.VERTICAL)
394
        sizer_12 = wx.BoxSizer(wx.HORIZONTAL)
406
        sizer_12 = wx.BoxSizer(wx.HORIZONTAL)
395
        sizer_17 = wx.BoxSizer(wx.VERTICAL)
407
        sizer_17 = wx.BoxSizer(wx.VERTICAL)
396
        sizer_9 = wx.BoxSizer(wx.HORIZONTAL)
408
        sizer_9 = wx.BoxSizer(wx.HORIZONTAL)
397
        sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
409
        sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
398
        sizer_13 = wx.BoxSizer(wx.VERTICAL)
410
        sizer_13 = wx.BoxSizer(wx.VERTICAL)
399
        sizer_16 = wx.BoxSizer(wx.HORIZONTAL)
411
        sizer_16 = wx.BoxSizer(wx.HORIZONTAL)
400
        sizer_15 = wx.BoxSizer(wx.HORIZONTAL)
412
        sizer_10 = wx.BoxSizer(wx.HORIZONTAL)
-
 
413
        sizer_18 = wx.BoxSizer(wx.VERTICAL)
-
 
414
        sizer_20 = wx.BoxSizer(wx.HORIZONTAL)
-
 
415
        sizer_19 = wx.BoxSizer(wx.HORIZONTAL)
401
        sizer_14 = wx.BoxSizer(wx.HORIZONTAL)
416
        sizer_14 = wx.BoxSizer(wx.HORIZONTAL)
402
        sizer_3.Add((20, 20), 0, 0, 0)
417
        sizer_3.Add((20, 20), 0, 0, 0)
403
        sizer_8.Add((20, 20), 0, 0, 0)
418
        sizer_8.Add((20, 20), 0, 0, 0)
404
        sizer_14.Add(self.label_1, 0, wx.ALIGN_CENTER_VERTICAL, 0)
419
        sizer_14.Add(self.label_1, 0, wx.ALIGN_CENTER_VERTICAL, 0)
405
        sizer_14.Add((20, 20), 0, 0, 0)
420
        sizer_14.Add((20, 20), 0, 0, 0)
406
        sizer_14.Add(self.descrCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0)
421
        sizer_14.Add(self.descrCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0)
407
        sizer_13.Add(sizer_14, 1, wx.EXPAND, 0)
422
        sizer_13.Add(sizer_14, 0, 0, 0)
408
        sizer_13.Add((20, 5), 0, 0, 0)
423
        sizer_13.Add((20, 5), 0, 0, 0)
-
 
424
        sizer_10.Add(self.label_1_copy, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
-
 
425
        sizer_10.Add((20, 20), 0, 0, 0)
-
 
426
        sizer_19.Add(self.gyroYawCb, 0, wx.ALIGN_CENTER_VERTICAL, 0)
-
 
427
        sizer_19.Add((20, 20), 0, 0, 0)
409
        sizer_15.Add(self.label_2, 0, wx.ALIGN_CENTER_VERTICAL, 0)
428
        sizer_19.Add(self.gyroRollCb, 0, wx.ALIGN_CENTER_VERTICAL, 0)
410
        sizer_15.Add((20, 20), 0, 0, 0)
429
        sizer_19.Add((20, 20), 0, 0, 0)
-
 
430
        sizer_19.Add(self.gyroNickCb, 0, wx.ALIGN_CENTER_VERTICAL, 0)
-
 
431
        sizer_18.Add(sizer_19, 1, wx.EXPAND, 0)
411
        sizer_15.Add(self.accTopCb, 0, wx.ALIGN_CENTER_VERTICAL, 0)
432
        sizer_20.Add(self.accTopCb, 0, wx.ALIGN_CENTER_VERTICAL, 0)
412
        sizer_15.Add((20, 20), 0, 0, 0)
433
        sizer_20.Add((20, 20), 0, 0, 0)
413
        sizer_15.Add(self.accRollCb, 0, wx.ALIGN_CENTER_VERTICAL, 0)
434
        sizer_20.Add(self.accRollCb, 0, wx.ALIGN_CENTER_VERTICAL, 0)
414
        sizer_15.Add((20, 20), 0, 0, 0)
435
        sizer_20.Add((20, 20), 0, 0, 0)
415
        sizer_15.Add(self.accNickCb, 0, wx.ALIGN_CENTER_VERTICAL, 0)
436
        sizer_20.Add(self.accNickCb, 0, wx.ALIGN_CENTER_VERTICAL, 0)
-
 
437
        sizer_18.Add(sizer_20, 1, wx.EXPAND, 0)
-
 
438
        sizer_10.Add(sizer_18, 1, wx.EXPAND, 0)
416
        sizer_13.Add(sizer_15, 1, wx.EXPAND, 0)
439
        sizer_13.Add(sizer_10, 1, wx.EXPAND, 0)
417
        sizer_13.Add((20, 5), 0, 0, 0)
440
        sizer_13.Add((20, 5), 0, 0, 0)
418
        sizer_16.Add(self.label_3, 0, wx.ALIGN_CENTER_VERTICAL, 0)
441
        sizer_16.Add(self.label_3, 0, wx.ALIGN_CENTER_VERTICAL, 0)
419
        sizer_16.Add((20, 20), 0, 0, 0)
442
        sizer_16.Add((20, 20), 0, 0, 0)
420
        sizer_16.Add(self.motorsCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0)
443
        sizer_16.Add(self.motorsCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0)
421
        sizer_16.Add((50, 20), 0, 0, 0)
444
        sizer_16.Add((50, 20), 0, 0, 0)
422
        sizer_16.Add(self.label_4, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
445
        sizer_16.Add(self.label_4, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
423
        sizer_16.Add((20, 20), 0, 0, 0)
446
        sizer_16.Add((20, 20), 0, 0, 0)
424
        sizer_16.Add(self.speedCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0)
447
        sizer_16.Add(self.speedCtrl, 0, wx.ALIGN_CENTER_VERTICAL, 0)
425
        sizer_13.Add(sizer_16, 1, wx.EXPAND, 0)
448
        sizer_13.Add(sizer_16, 0, wx.EXPAND, 0)
426
        sizer_7.Add(sizer_13, 1, wx.EXPAND, 0)
449
        sizer_7.Add(sizer_13, 1, wx.EXPAND, 0)
427
        sizer_7.Add((20, 20), 0, 0, 0)
450
        sizer_7.Add((20, 20), 0, 0, 0)
428
        sizer_7.Add((20, 20), 0, 0, 0)
451
        sizer_7.Add((20, 20), 0, 0, 0)
429
        sizer_9.Add(sizer_7, 1, wx.EXPAND, 0)
452
        sizer_9.Add(sizer_7, 0, 0, 0)
430
        sizer_9.Add(self.bitmap_button_1, 0, 0, 0)
453
        sizer_9.Add(self.bitmap_button_1, 0, 0, 0)
431
        sizer_8.Add(sizer_9, 0, 0, 0)
454
        sizer_8.Add(sizer_9, 0, 0, 0)
432
        sizer_17.Add((20, 20), 0, 0, 0)
455
        sizer_17.Add((20, 20), 0, 0, 0)
433
        sizer_17.Add(self.static_line_1, 0, wx.EXPAND, 0)
456
        sizer_17.Add(self.static_line_1, 0, wx.EXPAND, 0)
434
        sizer_17.Add((20, 20), 0, 0, 0)
457
        sizer_17.Add((20, 20), 0, 0, 0)
435
        sizer_8.Add(sizer_17, 0, wx.EXPAND, 0)
458
        sizer_8.Add(sizer_17, 0, wx.EXPAND, 0)
436
        sizer_11.Add(self.graphCtrl, 1, wx.EXPAND, 0)
459
        sizer_11.Add(self.graphCtrl, 1, wx.EXPAND, 0)
437
        sizer_11.Add((20, 5), 0, 0, 0)
460
        sizer_11.Add((20, 5), 0, 0, 0)
438
        sizer_12.Add(self.label_40, 0, wx.ALIGN_CENTER_VERTICAL, 0)
461
        sizer_12.Add(self.label_40, 0, wx.ALIGN_CENTER_VERTICAL, 0)
439
        sizer_12.Add(self.graphTypeChoice, 0, 0, 0)
462
        sizer_12.Add(self.graphTypeChoice, 0, 0, 0)
440
        sizer_12.Add((40, 20), 0, 0, 0)
463
        sizer_12.Add((40, 20), 0, 0, 0)
441
        sizer_12.Add(self.label_41, 0, wx.ALIGN_CENTER_VERTICAL, 0)
464
        sizer_12.Add(self.label_41, 0, wx.ALIGN_CENTER_VERTICAL, 0)
442
        sizer_12.Add(self.yAxisChoice, 0, 0, 0)
465
        sizer_12.Add(self.yAxisChoice, 0, 0, 0)
443
        sizer_12.Add((80, 20), 0, 0, 0)
466
        sizer_12.Add((80, 20), 0, 0, 0)
444
        sizer_12.Add(self.copyGraphButton, 0, 0, 0)
467
        sizer_12.Add(self.copyGraphButton, 0, 0, 0)
445
        sizer_11.Add(sizer_12, 0, 0, 0)
468
        sizer_11.Add(sizer_12, 0, 0, 0)
446
        sizer_8.Add(sizer_11, 0, 0, 0)
469
        sizer_8.Add(sizer_11, 0, 0, 0)
447
        sizer_8.Add((20, 30), 0, 0, 0)
470
        sizer_8.Add((20, 30), 0, 0, 0)
448
        sizer_8.Add(self.TestListCtrl, 1, 0, 0)
471
        sizer_8.Add(self.TestListCtrl, 1, 0, 0)
449
        sizer_8.Add((20, 20), 0, 0, 0)
472
        sizer_8.Add((20, 20), 0, 0, 0)
450
        sizer_3.Add(sizer_8, 1, wx.EXPAND, 0)
473
        sizer_3.Add(sizer_8, 1, wx.EXPAND, 0)
451
        self.SetSizer(sizer_3)
474
        self.SetSizer(sizer_3)
452
        self.Layout()
475
        self.Layout()
453
        self.SetSize((850, 700))
476
        self.SetSize((850, 700))
454
        # end wxGlade
477
        # end wxGlade
455
 
478
 
456
        # List events
479
        # List events
457
        self.TestListCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnTestSelected, self.TestListCtrl)
480
        self.TestListCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnTestSelected, self.TestListCtrl)
458
 
481
 
459
        # Configure Graph
482
        # Configure Graph
460
        #self.graphCtrl = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300))
483
        #self.graphCtrl = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300))
461
       
484
       
462
        self.graphCtrl.SetPointLabelFunc(self.DrawPointLabel)
485
        self.graphCtrl.SetPointLabelFunc(self.DrawPointLabel)
463
       
486
       
464
        self.graphCtrl.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL))
487
        self.graphCtrl.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL))
465
        self.graphCtrl.SetFontSizeAxis(10)
488
        self.graphCtrl.SetFontSizeAxis(10)
466
        self.graphCtrl.SetFontSizeLegend(7)
489
        self.graphCtrl.SetFontSizeLegend(7)
467
        self.graphCtrl.setLogScale((False,False))
490
        self.graphCtrl.setLogScale((False,False))
468
 
491
 
469
 
492
 
470
        # Configure TestListCtrl
493
        # Configure TestListCtrl
471
        self.TestListCtrl.InsertColumn(0, "Description")
494
        self.TestListCtrl.InsertColumn(0, "Description")
472
        self.TestListCtrl.InsertColumn(1, "Voltage")
495
        self.TestListCtrl.InsertColumn(1, "Voltage")
473
        self.TestListCtrl.InsertColumn(2, "Speed")
496
        self.TestListCtrl.InsertColumn(2, "Speed")
474
        self.TestListCtrl.InsertColumn(3, "Channel")
497
        self.TestListCtrl.InsertColumn(3, "Channel")
475
        self.TestListCtrl.InsertColumn(4, "Vibration Value")
498
        self.TestListCtrl.InsertColumn(4, "Vibration Value")
476
        self.TestListCtrl.SetColumnWidth(4, 500)
499
        self.TestListCtrl.SetColumnWidth(4, 500)
477
 
500
 
478
    def DrawPointLabel(self, dc, mDataDict):
501
    def DrawPointLabel(self, dc, mDataDict):
479
        """This is the fuction that defines how the pointLabels are plotted
502
        """This is the fuction that defines how the pointLabels are plotted
480
            dc - DC that will be passed
503
            dc - DC that will be passed
481
            mDataDict - Dictionary of data that you want to use for the pointLabel
504
            mDataDict - Dictionary of data that you want to use for the pointLabel
482
 
505
 
483
            As an example I have decided I want a box at the curve point
506
            As an example I have decided I want a box at the curve point
484
            with some text information about the curve plotted below.
507
            with some text information about the curve plotted below.
485
            Any wxDC method can be used.
508
            Any wxDC method can be used.
486
        """
509
        """
487
        # ----------
510
        # ----------
488
        dc.SetPen(wx.Pen(wx.BLACK))
511
        dc.SetPen(wx.Pen(wx.BLACK))
489
        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )
512
        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )
490
       
513
       
491
        sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point
514
        sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point
492
        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point
515
        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point
493
        px,py = mDataDict["pointXY"]
516
        px,py = mDataDict["pointXY"]
494
        cNum = mDataDict["curveNum"]
517
        cNum = mDataDict["curveNum"]
495
        pntIn = mDataDict["pIndex"]
518
        pntIn = mDataDict["pIndex"]
496
        legend = mDataDict["legend"]
519
        legend = mDataDict["legend"]
497
        #make a string to display
520
        #make a string to display
498
        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)
521
        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)
499
        dc.DrawText(s, sx , sy+1)
522
        dc.DrawText(s, sx , sy+1)
500
        # -----------
523
        # -----------
501
 
524
 
502
 
525
 
503
    def onNewTest(self, test):
526
    def onNewTest(self, test):
504
        index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr)
527
        index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr)
505
        self._fillRowInTestList(index, test)
528
        self._fillRowInTestList(index, test)
506
        self.TestListCtrl.Select(index)
529
        self.TestListCtrl.Select(index)
507
 
530
 
508
    def _fillRowInTestList(self, index, test):
531
    def _fillRowInTestList(self, index, test):
509
        self.TestListCtrl.SetStringItem(index, 0, test.descr)
532
        self.TestListCtrl.SetStringItem(index, 0, test.descr)
510
        self.TestListCtrl.SetStringItem(index, 1, "%.1f V" %test.voltage)
533
        self.TestListCtrl.SetStringItem(index, 1, "%.1f V" %test.voltage)
511
        self.TestListCtrl.SetStringItem(index, 2, str(test.speed))
534
        self.TestListCtrl.SetStringItem(index, 2, str(test.speed))
512
        self.TestListCtrl.SetStringItem(index, 3, test.channel)
535
        self.TestListCtrl.SetStringItem(index, 3, test.channel)
513
 
536
 
514
        vv = test.getVibValue()
537
        vv = test.getVibValue()
515
        vvs = "|%s| (%.1f)" % ("----------------------------------------------------------------------------------------------------"[0:min(int(vv+1)/2,100)], vv)
538
        vvs = "|%s| (%.1f)" % ("----------------------------------------------------------------------------------------------------"[0:min(int(vv+1)/2,100)], vv)
516
        self.TestListCtrl.SetStringItem(index, 4, vvs)
539
        self.TestListCtrl.SetStringItem(index, 4, vvs)
517
 
540
 
518
    def refreshData(self):
541
    def refreshData(self):
519
        for idx in range(len(self.app.VibTests)):
542
        for idx in range(len(self.app.VibTests)):
520
            self._fillRowInTestList(idx, self.app.getTest(idx))
543
            self._fillRowInTestList(idx, self.app.getTest(idx))
521
        self.drawGraph()
544
        self.drawGraph()
522
           
545
           
523
    def OnTestSelected(self, event):
546
    def OnTestSelected(self, event):
524
         testId = event.m_itemIndex
547
         testId = event.m_itemIndex
525
         print "Test Selected id=%d" % (testId)
548
         print "Test Selected id=%d" % (testId)
526
         self.activeTestId = testId
549
         self.activeTestId = testId
527
         self.drawGraph()
550
         self.drawGraph()
528
         
551
         
529
         
552
         
530
    def orderSelectedTests(self):
553
    def orderSelectedTests(self):
531
        tests = []
554
        tests = []
532
        idx = self.TestListCtrl.GetFirstSelected()
555
        idx = self.TestListCtrl.GetFirstSelected()
533
        while idx != -1:
556
        while idx != -1:
534
            header = "%s %s"%(self.app.getTest(idx).descr,self.app.getTest(idx).channel)
557
            header = "%s %s"%(self.app.getTest(idx).descr,self.app.getTest(idx).channel)
535
            found = False
558
            found = False
536
            for t in tests:
559
            for t in tests:
537
              if t[0] == header:
560
              if t[0] == header:
538
                t.append(idx)
561
                t.append(idx)
539
                found = True
562
                found = True
540
                break
563
                break
541
            if not found:
564
            if not found:
542
                tests.append([header, idx])
565
                tests.append([header, idx])
543
            idx = self.TestListCtrl.GetNextSelected(idx)
566
            idx = self.TestListCtrl.GetNextSelected(idx)
544
        return tests
567
        return tests
545
       
568
       
546
 
569
 
547
    def drawGraph(self):
570
    def drawGraph(self):
548
         
571
         
549
         y = int(self.yAxisChoice.GetStringSelection())
572
         y = int(self.yAxisChoice.GetStringSelection())
550
 
573
 
551
         nbSelected = self.TestListCtrl.SelectedItemCount
574
         nbSelected = self.TestListCtrl.SelectedItemCount
552
 
575
 
553
         if nbSelected == 0:
576
         if nbSelected == 0:
554
              self.graphCtrl.Clear()
577
              self.graphCtrl.Clear()
555
         
578
         
556
         elif nbSelected > 1:
579
         elif nbSelected > 1:
557
             self.graphTypeChoice.Disable()
580
             self.graphTypeChoice.Disable()
558
             self.copyGraphButton.Enable()
581
             self.copyGraphButton.Enable()
559
             
582
             
560
             tests = self.orderSelectedTests()
583
             tests = self.orderSelectedTests()
561
             
584
             
562
             lines = []
585
             lines = []
563
             maxX = 0
586
             maxX = 0
564
             cCnt = 0
587
             cCnt = 0
565
             for s in tests:
588
             for s in tests:
566
               data = []
589
               data = []
567
               x=1
590
               x=1
568
               for t in s[1:]:
591
               for t in s[1:]:
569
                 data.append([x,self.app.getTest(t).getVibValue()])
592
                 data.append([x,self.app.getTest(t).getVibValue()])
570
                 x += 1
593
                 x += 1
571
               lines.append(wx.lib.plot.PolyLine(data, legend= s[0], colour=COLORS[cCnt], width=2))
594
               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))
595
               lines.append(wx.lib.plot.PolyMarker(data, legend= "", colour=COLORS[cCnt], marker='circle',size=2))
573
               maxX = max(maxX, x)
596
               maxX = max(maxX, x)
574
               cCnt += 1
597
               cCnt += 1
575
                       
598
                       
576
             title = "Comparing tests"
599
             title = "Comparing tests"
577
             self.graphCtrl.setLogScale((False,False))
600
             self.graphCtrl.setLogScale((False,False))
578
             self.graphCtrl.Draw(wx.lib.plot.PlotGraphics(lines, title, "Test", "Vibration Value"), xAxis=(1,maxX), yAxis=(0,y))
601
             self.graphCtrl.Draw(wx.lib.plot.PlotGraphics(lines, title, "Test", "Vibration Value"), xAxis=(1,maxX), yAxis=(0,y))
579
             self.graphCtrl.SetEnableGrid('Horizontal')
602
             self.graphCtrl.SetEnableGrid('Horizontal')
580
             self.graphCtrl.SetEnableLegend(True)
603
             self.graphCtrl.SetEnableLegend(True)
581
             
604
             
582
 
605
 
583
         else:
606
         else:
584
             self.graphTypeChoice.Enable()
607
             self.graphTypeChoice.Enable()
585
             self.copyGraphButton.Disable()
608
             self.copyGraphButton.Disable()
586
             vibTest = self.app.getTest(self.activeTestId)
609
             vibTest = self.app.getTest(self.activeTestId)
587
             nb = vibTest.getDataLen()
610
             nb = vibTest.getDataLen()
588
 
611
 
589
             if self.graphTypeChoice.GetSelection() == 0:
612
             if self.graphTypeChoice.GetSelection() == 0:
590
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
613
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
591
                 xydata.shape = (nb, 2)
614
                 xydata.shape = (nb, 2)
592
                 xydata[:,1] = vibTest.getRawData()
615
                 xydata[:,1] = vibTest.getRawData()
593
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
616
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
594
       
617
       
595
                 title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
618
                 title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
596
                 self.graphCtrl.setLogScale((False,False))
619
                 self.graphCtrl.setLogScale((False,False))
597
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y/2,y/2))
620
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y/2,y/2))
598
                 self.graphCtrl.SetEnableGrid('Horizontal')
621
                 self.graphCtrl.SetEnableGrid('Horizontal')
599
                 self.graphCtrl.SetEnableLegend(False)
622
                 self.graphCtrl.SetEnableLegend(False)
600
                 
623
                 
601
   
624
   
602
             if self.graphTypeChoice.GetSelection() == 1:
625
             if self.graphTypeChoice.GetSelection() == 1:
603
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
626
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
604
                 xydata.shape = (nb, 2)
627
                 xydata.shape = (nb, 2)
605
                 xydata[:,1] = vibTest.getFilteredData()
628
                 xydata[:,1] = vibTest.getFilteredData()
606
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
629
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
607
       
630
       
608
                 title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
631
                 title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
609
                 self.graphCtrl.setLogScale((False,False))
632
                 self.graphCtrl.setLogScale((False,False))
610
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y/2,y/2))
633
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y/2,y/2))
611
                 self.graphCtrl.SetEnableGrid('Horizontal')
634
                 self.graphCtrl.SetEnableGrid('Horizontal')
612
                 self.graphCtrl.SetEnableLegend(False)
635
                 self.graphCtrl.SetEnableLegend(False)
613
   
636
   
614
             elif self.graphTypeChoice.GetSelection() == 2:
637
             elif self.graphTypeChoice.GetSelection() == 2:
615
                 xydata = _Numeric.linspace(0,FS/2,nb)
638
                 xydata = _Numeric.linspace(0,FS/2,nb)
616
                 xydata.shape = (nb/2, 2)
639
                 xydata.shape = (nb/2, 2)
617
                 
640
                 
618
                 xydata[:,1] = vibTest.getSpectrum()
641
                 xydata[:,1] = vibTest.getSpectrum()
619
                 
642
                 
620
                 #print xydata
643
                 #print xydata
621
   
644
   
622
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red')
645
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red')
623
                 markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2)
646
                 markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2)
624
                 
647
                 
625
                 fc = self.app.settings["hpf"].value
648
                 fc = self.app.settings["hpf"].value
626
                 filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
649
                 filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
627
                 fc = self.app.settings["lpf"].value
650
                 fc = self.app.settings["lpf"].value
628
                 filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
651
                 filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
629
       
652
       
630
                 title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
653
                 title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
631
                 self.graphCtrl.setLogScale((True,False))
654
                 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))
655
                 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)
656
                 self.graphCtrl.SetEnableGrid(True)
634
                 self.graphCtrl.SetEnableLegend(False)
657
                 self.graphCtrl.SetEnableLegend(False)
635
                 
658
                 
636
 
659
 
637
 
660
 
638
    def OnImport(self, event): # wxGlade: MainFrame.<event_handler>
661
    def OnImport(self, event): # wxGlade: MainFrame.<event_handler>
639
        dlg = wx.FileDialog(
662
        dlg = wx.FileDialog(
640
            self, message="Choose a file",
663
            self, message="Choose a file",
641
            defaultDir="%s/Data/" % os.getcwd(),
664
            defaultDir="%s/Data/" % os.getcwd(),
642
            defaultFile=".",
665
            defaultFile=".",
643
            wildcard="Text files (*.txt)|*.txt|All files (*.*)|*.*",
666
            wildcard="Text files (*.txt)|*.txt|All files (*.*)|*.*",
644
            style=wx.OPEN | wx.CHANGE_DIR
667
            style=wx.OPEN | wx.CHANGE_DIR
645
            )
668
            )
646
        if dlg.ShowModal() == wx.ID_OK:
669
        if dlg.ShowModal() == wx.ID_OK:
647
            paths = dlg.GetPaths();
670
            paths = dlg.GetPaths();
648
            self.app.loadTests(paths[0])
671
            self.app.loadTests(paths[0])
649
        dlg.Destroy()
672
        dlg.Destroy()
650
 
673
 
651
    def onExport(self, event): # wxGlade: MainFrame.<event_handler>
674
    def onExport(self, event): # wxGlade: MainFrame.<event_handler>
652
        dlg = wx.FileDialog(
675
        dlg = wx.FileDialog(
653
              self, message="Save file as ...",
676
              self, message="Save file as ...",
654
              defaultDir="%s/Data/" % os.getcwd(),
677
              defaultDir="%s/Data/" % os.getcwd(),
655
              defaultFile=".",
678
              defaultFile=".",
656
              wildcard="Text files (*.txt)|*.txt|All files (*.*)|*.*",
679
              wildcard="Text files (*.txt)|*.txt|All files (*.*)|*.*",
657
              style=wx.SAVE
680
              style=wx.SAVE
658
              )
681
              )
659
        if dlg.ShowModal() == wx.ID_OK:
682
        if dlg.ShowModal() == wx.ID_OK:
660
            paths = dlg.GetPaths();
683
            paths = dlg.GetPaths();
661
            self.app.saveTests(paths[0])
684
            self.app.saveTests(paths[0])
662
        dlg.Destroy()
685
        dlg.Destroy()
663
 
686
 
664
    def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler>
687
    def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler>
665
        self.drawGraph()
688
        self.drawGraph()
666
 
689
 
667
    def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler>
690
    def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler>
668
        self.drawGraph()
691
        self.drawGraph()
669
 
692
 
670
    def OnSettings(self, event): # wxGlade: MainFrame.<event_handler>
693
    def OnSettings(self, event): # wxGlade: MainFrame.<event_handler>
671
        dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200),
694
        dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200),
672
                         #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME,
695
                         #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME,
673
                         style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX
696
                         style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX
674
                         )
697
                         )
675
        dlg.CenterOnScreen()
698
        dlg.CenterOnScreen()
676
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
699
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
677
        dlg.Destroy()
700
        dlg.Destroy()
678
        self.app.onSettingsChanged(True)
701
        self.app.onSettingsChanged(True)
679
 
702
 
680
    def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler>
703
    def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler>
681
        # Collect measure parameters
704
        # Collect measure parameters
682
        mp = MeasureParameters()
705
        mp = MeasureParameters()
683
        decoding = ""
706
        decoding = ""
684
       
707
       
685
        try:
708
        try:
686
          decoding = "Description"
709
          decoding = "Description"
687
          mp.descr = self.descrCtrl.GetValue()
710
          mp.descr = self.descrCtrl.GetValue()
688
 
711
 
689
          decoding = "Motor(s)"
712
          decoding = "Motor(s)"
690
          mp.motors = map(int,self.motorsCtrl.GetValue().split(','))
713
          mp.motors = map(int,self.motorsCtrl.GetValue().split(','))
691
          for motor in mp.motors:
714
          for motor in mp.motors:
692
              if (motor<1) or (motor>MOTOR_MAX):
715
              if (motor<1) or (motor>MOTOR_MAX):
693
                  raise Exception("Motor number should be between 1 and %d" % MOTOR_MAX)
716
                  raise Exception("Motor number should be between 1 and %d" % MOTOR_MAX)
694
 
717
 
695
          decoding = "Channel(s)"
718
          decoding = "Channel(s)"
696
          mp.channels = []
719
          mp.channels = []
-
 
720
          if self.gyroYawCb.IsChecked(): mp.channels.append(0)
-
 
721
          if self.gyroRollCb.IsChecked(): mp.channels.append(1)
-
 
722
          if self.gyroNickCb.IsChecked(): mp.channels.append(2)
697
          if self.accTopCb.IsChecked(): mp.channels.append(5)
723
          if self.accTopCb.IsChecked(): mp.channels.append(5)
698
          if self.accRollCb.IsChecked(): mp.channels.append(6)
724
          if self.accRollCb.IsChecked(): mp.channels.append(6)
699
          if self.accNickCb.IsChecked(): mp.channels.append(7)
725
          if self.accNickCb.IsChecked(): mp.channels.append(7)
700
 
726
 
701
          decoding = "Speed(s)"
727
          decoding = "Speed(s)"
702
          mp.speeds = []
728
          mp.speeds = []
703
          for speedTxt in self.speedCtrl.GetValue().split(","):
729
          for speedTxt in self.speedCtrl.GetValue().split(","):
704
              if speedTxt.count("-") == 1:
730
              if speedTxt.count("-") == 1:
705
                  # assume from-to:step format
731
                  # assume from-to:step format
706
                  speedTxt = speedTxt.split("-")
732
                  speedTxt = speedTxt.split("-")
707
                  if len(speedTxt) != 2: raise Exception("Invalid format")
733
                  if len(speedTxt) != 2: raise Exception("Invalid format")
708
                  speedTxt[1] = speedTxt[1].split(":")
734
                  speedTxt[1] = speedTxt[1].split(":")
709
                  if len(speedTxt[1]) != 2: raise Exception("Invalid format")
735
                  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]))
736
                  mp.speeds = range(int(speedTxt[0]),int(speedTxt[1][0])+int(speedTxt[1][1]),int(speedTxt[1][1]))
711
              else:
737
              else:
712
                  # assume s or s*n format
738
                  # assume s or s*n format
713
                  if speedTxt.count("*") == 1:
739
                  if speedTxt.count("*") == 1:
714
                      speedTxt = speedTxt.split("*")
740
                      speedTxt = speedTxt.split("*")
715
                      for i in range(int(speedTxt[0])):
741
                      for i in range(int(speedTxt[0])):
716
                        mp.speeds.append(int(speedTxt[1]))
742
                        mp.speeds.append(int(speedTxt[1]))
717
                  else:
743
                  else:
718
                      mp.speeds.append(int(speedTxt))
744
                      mp.speeds.append(int(speedTxt))
719
          for speed in mp.speeds:
745
          for speed in mp.speeds:
720
                if (speed<0) or (speed>255):
746
                if (speed<0) or (speed>255):
721
                    raise Exception("Speed values should be between 0 and 255")
747
                    raise Exception("Speed values should be between 0 and 255")
722
 
748
 
723
        except Exception,e:
749
        except Exception,e:
724
          dial = wx.MessageDialog(None, 'Invalid paramter \"%s\"\n\n%s' % (decoding, str(e)), 'Error', wx.OK |
750
          dial = wx.MessageDialog(None, 'Invalid paramter \"%s\"\n\n%s' % (decoding, str(e)), 'Error', wx.OK |
725
            wx.ICON_ERROR)
751
            wx.ICON_ERROR)
726
          dial.ShowModal()
752
          dial.ShowModal()
727
          raise e
753
          raise e
728
 
754
 
729
         
755
         
730
           
756
           
731
        print mp.descr
757
        print mp.descr
732
        print mp.motors
758
        print mp.motors
733
        print mp.channels
759
        print mp.channels
734
        print mp.speeds
760
        print mp.speeds
735
       
761
       
736
           
762
           
737
       
763
       
738
        # create the dialog that will show the satus
764
        # create the dialog that will show the satus
739
        dlg = MeasureDialog(self)
765
        dlg = MeasureDialog(self)
740
        dlg.CenterOnScreen()
766
        dlg.CenterOnScreen()
741
       
767
       
742
        # Signal the application
768
        # Signal the application
743
        self.app.startMeasure(mp, dlg)
769
        self.app.startMeasure(mp, dlg)
744
       
770
       
745
        # Show the dialog
771
        # Show the dialog
746
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
772
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
747
        dlg.Destroy()
773
        dlg.Destroy()
748
 
774
 
749
    def _removeTest(self, idx):
775
    def _removeTest(self, idx):
750
        print "Deleting test %d" % idx
776
        print "Deleting test %d" % idx
751
        self.app.removeTest(idx)
777
        self.app.removeTest(idx)
752
        self.TestListCtrl.DeleteItem(idx)
778
        self.TestListCtrl.DeleteItem(idx)
753
       
779
       
754
           
780
           
755
    def onClear(self, event): # wxGlade: MainFrame.<event_handler>
781
    def onClear(self, event): # wxGlade: MainFrame.<event_handler>
756
        dial = wx.MessageDialog(None, 'Clear ALL tests?', 'Question',
782
        dial = wx.MessageDialog(None, 'Clear ALL tests?', 'Question',
757
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
783
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
758
        if dial.ShowModal() == wx.ID_YES:
784
        if dial.ShowModal() == wx.ID_YES:
759
          print "Clear all tests"
785
          print "Clear all tests"
760
          for i in range(len(self.app.VibTests)-1, -1, -1):
786
          for i in range(len(self.app.VibTests)-1, -1, -1):
761
              self._removeTest(i)
787
              self._removeTest(i)
762
          self.drawGraph()
788
          self.drawGraph()
763
           
789
           
764
       
790
       
765
    def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler>
791
    def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler>
766
        dial = wx.MessageDialog(None, 'Clear Selected tests?', 'Question',
792
        dial = wx.MessageDialog(None, 'Clear Selected tests?', 'Question',
767
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
793
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
768
        if dial.ShowModal() == wx.ID_YES:
794
        if dial.ShowModal() == wx.ID_YES:
769
          while True:
795
          while True:
770
              idx = self.TestListCtrl.GetFirstSelected()
796
              idx = self.TestListCtrl.GetFirstSelected()
771
              if idx == -1: break
797
              if idx == -1: break
772
              self._removeTest(idx)
798
              self._removeTest(idx)
773
           
799
           
774
       
800
       
775
 
801
 
776
    def onAbout(self, event): # wxGlade: MainFrame.<event_handler>
802
    def onAbout(self, event): # wxGlade: MainFrame.<event_handler>
777
         # First we create and fill the info object
803
         # First we create and fill the info object
778
        print "about"
804
        print "about"
779
        info = wx.AboutDialogInfo()
805
        info = wx.AboutDialogInfo()
780
        info.Name = "MK Vibration Test - "
806
        info.Name = "MK Vibration Test - "
781
        info.Version = "v1.0 ($Rev: 661 $)".replace("$","")
807
        info.Version = "v1.1 (EXPERIMENTAL) ($Rev: 683 $)".replace("$","")
782
        info.Copyright = ""
808
        info.Copyright = ""
783
        info.Developers=["Frederic Goddeeris  (Frederic@rc-flight.be)"]
809
        info.Developers=["Frederic Goddeeris  (Frederic@rc-flight.be)"]
784
        info.Description = "Please consult the WIKI page for a complete description of the tool:"
810
        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")
811
        info.WebSite = ("http://www.mikrokopter.de/ucwiki/en/VibrationTest", "VibrationTest WIKI page")
786
        wx.AboutBox(info)
812
        wx.AboutBox(info)
787
       
813
       
788
       
814
       
789
    def onExit(self, event): # wxGlade: MainFrame.<event_handler>
815
    def onExit(self, event): # wxGlade: MainFrame.<event_handler>
790
        self.Close(True)
816
        self.Close(True)
791
 
817
 
792
 
818
 
793
    def onSelectAll(self, event): # wxGlade: MainFrame.<event_handler>
819
    def onSelectAll(self, event): # wxGlade: MainFrame.<event_handler>
794
        for i in xrange(self.TestListCtrl.GetItemCount()):
820
        for i in xrange(self.TestListCtrl.GetItemCount()):
795
          self.TestListCtrl.Select(i)
821
          self.TestListCtrl.Select(i)
796
 
822
 
797
    def onCopyGraphData(self, event): # wxGlade: MainFrame.<event_handler>
823
    def onCopyGraphData(self, event): # wxGlade: MainFrame.<event_handler>
798
        clipdata = wx.TextDataObject()
824
        clipdata = wx.TextDataObject()
799
        txt = ""
825
        txt = ""
800
        idx = self.TestListCtrl.GetFirstSelected()
826
        idx = self.TestListCtrl.GetFirstSelected()
801
        while idx != -1:
827
        while idx != -1:
802
             txt += ("%d\n" % self.app.getTest(idx).getVibValue())
828
             txt += ("%d\n" % self.app.getTest(idx).getVibValue())
803
             idx = self.TestListCtrl.GetNextSelected(idx)
829
             idx = self.TestListCtrl.GetNextSelected(idx)
804
        clipdata.SetText(txt)
830
        clipdata.SetText(txt)
805
        wx.TheClipboard.Open()
831
        wx.TheClipboard.Open()
806
        wx.TheClipboard.SetData(clipdata)
832
        wx.TheClipboard.SetData(clipdata)
807
        wx.TheClipboard.Close()
833
        wx.TheClipboard.Close()
808
 
834
 
809
# end of class MainFrame
835
# end of class MainFrame
810
 
836
 
811
class Setting:
837
class Setting:
812
    def __init__(self, descr, defaultValue):
838
    def __init__(self, descr, defaultValue):
813
        self.descr = descr
839
        self.descr = descr
814
        self.value = defaultValue
840
        self.value = defaultValue
815
       
841
       
816
    def set(self, newValue):
842
    def set(self, newValue):
817
        if isinstance(self.value, int):
843
        if isinstance(self.value, int):
818
            self.value = int(newValue)
844
            self.value = int(newValue)
819
        else:
845
        else:
820
            self.value = str(newValue)
846
            self.value = str(newValue)
821
 
847
 
822
class MeasureParameters:
848
class MeasureParameters:
823
      pass
849
      pass
824
 
850
 
825
class MeasureThread:
851
class MeasureThread:
826
    def __init__(self, measureParameters, evtConsumer):
852
    def __init__(self, measureParameters, evtConsumer):
827
        self.mk = mkProto.MkComm()
853
        self.mk = mkProto.MkComm()
828
        self.param = measureParameters
854
        self.param = measureParameters
829
        self.evtConsumer = evtConsumer
855
        self.evtConsumer = evtConsumer
830
        self.cancel = False
856
        self.cancel = False
831
        self.running = False
857
        self.running = False
832
       
858
       
833
    def start(self):
859
    def start(self):
834
        thread.start_new_thread(self._run, ())
860
        thread.start_new_thread(self._run, ())
835
       
861
       
836
    def stop(self):
862
    def stop(self):
837
        self.cancel = True
863
        self.cancel = True
838
 
864
 
839
    def _testCancel(self):
865
    def _testCancel(self):
840
        if self.cancel:
866
        if self.cancel:
841
            raise Exception("Operation cancelled")
867
            raise Exception("Operation cancelled")
842
               
868
               
843
    def _sendEvent(self, msg=None, error=False, parVoltage=None, speed=None):
869
    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)
870
        evt = MeasStatusUpdateEvent(running=self.running, msg=msg, error=error, voltage=parVoltage, speed=speed)
845
        wx.PostEvent(self.evtConsumer, evt)
871
        wx.PostEvent(self.evtConsumer, evt)
846
 
872
 
847
    def _setMotorSpeed(self, speed, settlingTime):
873
    def _setMotorSpeed(self, speed, settlingTime):
848
        speeds = [0]*MOTOR_MAX
874
        speeds = [0]*MOTOR_MAX
849
       
875
       
850
        for motor in self.param.motors:
876
        for motor in self.param.motors:
851
            speeds[motor-1] = speed
877
            speeds[motor-1] = speed
852
        for i in range(int(settlingTime*10)):
878
        for i in range(int(settlingTime*10)):
853
          self._testCancel()
879
          self._testCancel()
854
          self.mk.setMotorTest(speeds)
880
          self.mk.setMotorTest(speeds)
855
          time.sleep(.1)
881
          time.sleep(.1)
856
        self.currSpeed = speed
882
        self.currSpeed = speed
857
       
883
       
858
                   
884
                   
859
    def _run(self):
885
    def _run(self):
860
        self.running = True
886
        self.running = True
861
        self._sendEvent("Starting test \"%s\"" % self.param.descr)    
887
        self._sendEvent("Starting test \"%s\"" % self.param.descr)    
862
        self.currSpeed = 0
888
        self.currSpeed = 0
863
       
889
       
864
        try:
890
        try:
865
            self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort)
891
            self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort)
866
            self.mk.open(comPort=self.param.serialPort)
892
            self.mk.open(comPort=self.param.serialPort)
867
           
893
           
868
            print "Sending FC->NC forwarding",
894
            print "Sending FC->NC forwarding",
869
            self.mk.sendNCRedirectUartFromFC()
895
            self.mk.sendNCRedirectUartFromFC()
870
            print "Done"
896
            print "Done"
871
               
897
               
872
            msg = self.mk.getVersionMsg()
898
            msg = self.mk.getVersionMsg()
873
            version = msg.getVersion()
899
            version = msg.getVersion()
874
            self._sendEvent("Version: %d.%d" % version)
900
            self._sendEvent("Version: %d.%d" % version)
875
           
901
           
876
            msg = self.mk.getDebugMsg()
902
            msg = self.mk.getDebugMsg()
877
            voltage = msg.getVoltage()
903
            voltage = msg.getVoltage()
878
            if (voltage == 0):
904
            if (voltage == 0):
879
              # Board is probably fed by USB
905
              # Board is probably fed by USB
880
              minVoltage = 0
906
              minVoltage = 0
881
              maxVoltage = 1
907
              maxVoltage = 1
882
            else:
908
            else:
883
              # Determine the n umber of cells
909
              # Determine the n umber of cells
884
              if (voltage > 4.2*3):
910
              if (voltage > 4.2*3):
885
                nbCells = 4  
911
                nbCells = 4  
886
              else:
912
              else:
887
                nbCells = 3
913
                nbCells = 3
888
              # Set minimum and maximum voltages
914
              # Set minimum and maximum voltages
889
              if self.param.minVoltage > 0:
915
              if self.param.minVoltage > 0:
890
                minVoltage =  self.param.minVoltage
916
                minVoltage =  self.param.minVoltage
891
              else:
917
              else:
892
                minVoltage = nbCells*3.5  # auto
918
                minVoltage = nbCells*3.5  # auto
893
              if self.param.maxVoltage > 0:
919
              if self.param.maxVoltage > 0:
894
                maxVoltage =  self.param.maxVoltage
920
                maxVoltage =  self.param.maxVoltage
895
              else:
921
              else:
896
                maxVoltage = nbCells*3.9  
922
                maxVoltage = nbCells*3.9  
897
               
923
               
898
            self._sendEvent("Voltage: %2.1fV" % voltage)
924
            self._sendEvent("Voltage: %2.1fV" % voltage)
899
            self._sendEvent("Min/Max Voltage: %2.1fV-%2.1fV" % (minVoltage, maxVoltage), parVoltage=(minVoltage, maxVoltage, voltage))
925
            self._sendEvent("Min/Max Voltage: %2.1fV-%2.1fV" % (minVoltage, maxVoltage), parVoltage=(minVoltage, maxVoltage, voltage))
900
           
926
           
901
            self._sendEvent("Starting motor(s) (speed=%d)... " % self.param.motorStartupSpeed, speed=self.param.motorStartupSpeed)
927
            self._sendEvent("Starting motor(s) (speed=%d)... " % self.param.motorStartupSpeed, speed=self.param.motorStartupSpeed)
902
            self._setMotorSpeed(self.param.motorStartupSpeed, self.param.motorStartupSettlingTime)
928
            self._setMotorSpeed(self.param.motorStartupSpeed, self.param.motorStartupSettlingTime)
903
         
929
         
904
            for speed in self.param.speeds:
930
            for speed in self.param.speeds:
905
                if speed != self.currSpeed:
931
                if speed != self.currSpeed:
906
                    self._sendEvent("Changing motor speed to %d... " % speed, speed=speed)
932
                    self._sendEvent("Changing motor speed to %d... " % speed, speed=speed)
907
                    self._setMotorSpeed(speed, 1)
933
                    self._setMotorSpeed(speed, 1)
908
               
934
               
909
                for channel in self.param.channels:
935
                for channel in self.param.channels:
910
                    self._setMotorSpeed(speed, .1)
936
                    self._setMotorSpeed(speed, .1)
911
                    msg = self.mk.getDebugMsg()
937
                    msg = self.mk.getDebugMsg()
912
                    voltage = msg.getVoltage()
938
                    voltage = msg.getVoltage()
913
           
939
           
914
                    self._sendEvent("Getting data from channel %s" % CHANNEL_NAMES[channel], parVoltage=(minVoltage, maxVoltage, voltage))
940
                    self._sendEvent("Getting data from channel %s" % CHANNEL_NAMES[channel], parVoltage=(minVoltage, maxVoltage, voltage))
915
                    data = self.mk.doVibrationTest(1000, channel)
941
                    data = self.mk.doVibrationTest(1000, channel)
916
                   
942
                   
917
                    vt = VibTest(self.param.descr, voltage, self.param.motors, speed, CHANNEL_NAMES[channel], data)
943
                    vt = VibTest(self.param.descr, voltage, self.param.motors, speed, CHANNEL_NAMES[channel], data)
918
                    evt = MeasDataEvent(vibTest = vt)
944
                    evt = MeasDataEvent(vibTest = vt)
919
                    wx.PostEvent(self.evtConsumer, evt)
945
                    wx.PostEvent(self.evtConsumer, evt)
920
                   
946
                   
921
                    if voltage<minVoltage:
947
                    if voltage<minVoltage:
922
                        raise Exception("Voltage too low")
948
                        raise Exception("Voltage too low")
923
           
949
           
924
           
950
           
925
            self._setMotorSpeed(speed, .1)    
951
            self._setMotorSpeed(speed, .1)    
926
            time.sleep(1)
952
            time.sleep(1)
927
            msg = self.mk.getDebugMsg()
953
            msg = self.mk.getDebugMsg()
928
            voltage = msg.getVoltage()
954
            voltage = msg.getVoltage()
929
           
955
           
930
            self._sendEvent("Done !", parVoltage=(minVoltage, maxVoltage, voltage))            
956
            self._sendEvent("Done !", parVoltage=(minVoltage, maxVoltage, voltage))            
931
           
957
           
932
        except Exception, e:
958
        except Exception, e:
933
            self._sendEvent("Exception \"%s\"" % e, error=True)  
959
            self._sendEvent("Exception \"%s\"" % e, error=True)  
934
       
960
       
935
        try:        
961
        try:        
936
          self.mk.close()
962
          self.mk.close()
937
        except:
963
        except:
938
          print "Failure closing MK serial port"
964
          print "Failure closing MK serial port"
939
          pass
965
          pass
940
       
966
       
941
        self.running = False
967
        self.running = False
942
        self._sendEvent("", speed = 0)    
968
        self._sendEvent("", speed = 0)    
943
       
969
       
944
 
970
 
945
class VibTest:
971
class VibTest:
946
    useRms = True
972
    useRms = True
947
    fc1 = None
973
    fc1 = None
948
    fc2 = None
974
    fc2 = None
949
       
975
       
950
   
976
   
951
    def __init__(self, descr, voltage, motor, speed, channel, rawData):
977
    def __init__(self, descr, voltage, motor, speed, channel, rawData):
952
        self.descr = descr
978
        self.descr = descr
953
        self.voltage = voltage
979
        self.voltage = voltage
954
        self.motor = motor
980
        self.motor = motor
955
        self.speed = speed
981
        self.speed = speed
956
        self.channel = channel
982
        self.channel = channel
957
 
983
 
958
        self.dataLen = len(rawData)
984
        self.dataLen = len(rawData)
959
 
985
 
960
        self.rawData = _Numeric.array(rawData)
986
        self.rawData = _Numeric.array(rawData)
961
        self.dc = self.rawData.mean()
987
        self.dc = self.rawData.mean()
962
        self.rawData -= self.dc
988
        self.rawData -= self.dc
963
 
989
 
964
        self.fft = _Numeric.fft.rfft(self.rawData)
990
        self.fft = _Numeric.fft.rfft(self.rawData)
965
 
991
 
966
        self.spectrum = None
992
        self.spectrum = None
967
        self.filteredData = None
993
        self.filteredData = None
968
       
994
       
969
        self.vibValue = None
995
        self.vibValue = None
970
       
996
       
971
    def getDescr(self):
997
    def getDescr(self):
972
        return self.Descr
998
        return self.Descr
973
 
999
 
974
    def getRawData(self):
1000
    def getRawData(self):
975
        return self.rawData
1001
        return self.rawData
976
 
1002
 
977
    def getDataLen(self):
1003
    def getDataLen(self):
978
        return self.dataLen
1004
        return self.dataLen
979
 
1005
 
980
    def getSpectrum(self):
1006
    def getSpectrum(self):
981
        if self.spectrum == None:
1007
        if self.spectrum == None:
982
            self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2)
1008
            self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2)
983
        return self.spectrum
1009
        return self.spectrum
984
       
1010
       
985
    def refresh(self):
1011
    def refresh(self):
986
        self.filteredData = None
1012
        self.filteredData = None
987
        self.vibValue = None
1013
        self.vibValue = None
988
 
1014
 
989
    def getFilteredData(self):
1015
    def getFilteredData(self):
990
        if self.filteredData == None:
1016
        if self.filteredData == None:
991
            tmpfft = self.fft.copy()
1017
            tmpfft = self.fft.copy()
992
            fc = (float(self.fc1))/(FS/2)*len(tmpfft)
1018
            fc = (float(self.fc1))/(FS/2)*len(tmpfft)
993
            print "fc1=%d => fc=%f" % (self.fc1, fc)
1019
            print "fc1=%d => fc=%f" % (self.fc1, fc)
994
            for i in range(0,int(fc)+2):
1020
            for i in range(0,int(fc)+2):
995
                tmpfft[i] = 0
1021
                tmpfft[i] = 0
996
            fc = (float(self.fc2))/(FS/2)*len(tmpfft)
1022
            fc = (float(self.fc2))/(FS/2)*len(tmpfft)
997
            print "fc2=%d => fc=%f" % (self.fc2,fc)
1023
            print "fc2=%d => fc=%f" % (self.fc2,fc)
998
            for i in range(int(fc)+2, len(tmpfft)):
1024
            for i in range(int(fc)+2, len(tmpfft)):
999
                tmpfft[i] = 0
1025
                tmpfft[i] = 0
1000
            self.filteredData = _Numeric.fft.irfft(tmpfft)
1026
            self.filteredData = _Numeric.fft.irfft(tmpfft)
1001
           
1027
           
1002
        return self.filteredData
1028
        return self.filteredData
1003
       
1029
       
1004
    def getVibValue(self):
1030
    def getVibValue(self):
1005
      if self.vibValue == None:
1031
      if self.vibValue == None:
1006
        fd = self.getFilteredData()[100:-100];
1032
        fd = self.getFilteredData()[100:-100];
1007
        if self.useRms:
1033
        if self.useRms:
1008
            print "RMS"
1034
            print "RMS"
1009
            self.vibValue = math.sqrt(sum([x*x for x in fd])/len(fd))*2*math.sqrt(2)
1035
            self.vibValue = math.sqrt(sum([x*x for x in fd])/len(fd))*2*math.sqrt(2)
1010
        else:
1036
        else:
1011
            print "PP"
1037
            print "PP"
1012
            self.vibValue = max(fd)-min(fd)
1038
            self.vibValue = max(fd)-min(fd)
1013
      return self.vibValue
1039
      return self.vibValue
1014
 
1040
 
1015
 
1041
 
1016
 
1042
 
1017
class App(wx.App):
1043
class App(wx.App):
1018
 
1044
 
1019
    SETTINGSFILE = "settings.cfg"
1045
    SETTINGSFILE = "settings.cfg"
1020
 
1046
 
1021
    def __init__(self, par):
1047
    def __init__(self, par):
1022
        self.VibTests = []
1048
        self.VibTests = []
1023
        wx.App.__init__(self, par)
1049
        wx.App.__init__(self, par)
1024
 
1050
 
1025
        # Init settings
1051
        # Init settings
1026
        self.settings={}
1052
        self.settings={}
1027
        self.settings["serialport"] = Setting("Serial Port", "COM1")
1053
        self.settings["serialport"] = Setting("Serial Port", "COM1")
1028
        self.settings["startupspeed"] = Setting("Motor Startup Speed", 25)
1054
        self.settings["startupspeed"] = Setting("Motor Startup Speed", 25)
1029
        self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3)
1055
        self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3)
1030
        self.settings["serialport"] = Setting("Serial Port", "COM1")
1056
        self.settings["serialport"] = Setting("Serial Port", "COM1")
1031
        self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 40)
1057
        self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 40)
1032
        self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 400)
1058
        self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 400)
1033
        self.settings["calcmethod"] = Setting("Calculation Method", "rms")        
1059
        self.settings["calcmethod"] = Setting("Calculation Method", "rms")        
1034
        self.settings["minvoltage"] = Setting("Minimum Bettery Voltage (0=Automatic) (V) ", 0)
1060
        self.settings["minvoltage"] = Setting("Minimum Bettery Voltage (0=Automatic) (V) ", 0)
1035
        self.settings["maxvoltage"] = Setting("Maximum Bettery Voltage (0=Automatic) (V) ", 0)
1061
        self.settings["maxvoltage"] = Setting("Maximum Bettery Voltage (0=Automatic) (V) ", 0)
1036
 
1062
 
1037
 
1063
 
1038
        self.readSettings()
1064
        self.readSettings()
1039
 
1065
 
1040
        if len(sys.argv)>1:
1066
        if len(sys.argv)>1:
1041
            self.loadTests(sys.argv[1])
1067
            self.loadTests(sys.argv[1])
1042
 
1068
 
1043
 
1069
 
1044
    def readSettings(self):
1070
    def readSettings(self):
1045
        print "Reading settings"
1071
        print "Reading settings"
1046
        cp = ConfigParser.ConfigParser()
1072
        cp = ConfigParser.ConfigParser()
1047
 
1073
 
1048
        try:
1074
        try:
1049
            cp.read("%s/%s" % (rootPath, App.SETTINGSFILE))
1075
            cp.read("%s/%s" % (rootPath, App.SETTINGSFILE))
1050
            for setting in cp.items("DEFAULT"):
1076
            for setting in cp.items("DEFAULT"):
1051
                print " ",setting
1077
                print " ",setting
1052
                try:
1078
                try:
1053
                    self.settings[setting[0]].set(setting[1])
1079
                    self.settings[setting[0]].set(setting[1])
1054
                except:
1080
                except:
1055
                    print "WARNING, unknown setting"
1081
                    print "WARNING, unknown setting"
1056
        except:
1082
        except:
1057
            print "ERROR reading settingsfile"
1083
            print "ERROR reading settingsfile"
1058
        self.onSettingsChanged(False)
1084
        self.onSettingsChanged(False)
1059
 
1085
 
1060
    def storeSettings(self):
1086
    def storeSettings(self):
1061
        print "Storing settings"
1087
        print "Storing settings"
1062
 
1088
 
1063
        cp = ConfigParser.ConfigParser()
1089
        cp = ConfigParser.ConfigParser()
1064
        for setting in self.settings.iteritems():
1090
        for setting in self.settings.iteritems():
1065
            cp.set("", setting[0], setting[1].value)
1091
            cp.set("", setting[0], setting[1].value)
1066
 
1092
 
1067
        file = open("%s/%s" % (rootPath, App.SETTINGSFILE), "w")
1093
        file = open("%s/%s" % (rootPath, App.SETTINGSFILE), "w")
1068
        cp.write(file)
1094
        cp.write(file)
1069
        file.close()
1095
        file.close()
1070
 
1096
 
1071
 
1097
 
1072
    def onSettingsChanged(self, store):
1098
    def onSettingsChanged(self, store):
1073
        if store:
1099
        if store:
1074
            self.storeSettings()
1100
            self.storeSettings()
1075
           
1101
           
1076
        if self.settings["calcmethod"].value == "rms":
1102
        if self.settings["calcmethod"].value == "rms":
1077
            VibTest.useRms = True
1103
            VibTest.useRms = True
1078
        else:
1104
        else:
1079
            VibTest.useRms = False
1105
            VibTest.useRms = False
1080
           
1106
           
1081
        VibTest.fc1 = self.settings["hpf"].value
1107
        VibTest.fc1 = self.settings["hpf"].value
1082
        VibTest.fc2 = self.settings["lpf"].value
1108
        VibTest.fc2 = self.settings["lpf"].value
1083
       
1109
       
1084
        for test in self.VibTests:
1110
        for test in self.VibTests:
1085
            test.refresh()
1111
            test.refresh()
1086
        self.frame_1.refreshData()
1112
        self.frame_1.refreshData()
1087
     
1113
     
1088
    def AddTest2(self, vibTest):
1114
    def AddTest2(self, vibTest):
1089
        self.VibTests.append(vibTest)
1115
        self.VibTests.append(vibTest)
1090
        self.frame_1.onNewTest(vibTest)
1116
        self.frame_1.onNewTest(vibTest)
1091
         
1117
         
1092
    def AddTest(self, descr, voltage, motor, speed, channel, rawData):
1118
    def AddTest(self, descr, voltage, motor, speed, channel, rawData):
1093
        test = VibTest(descr, voltage, motor, speed, channel, rawData)
1119
        test = VibTest(descr, voltage, motor, speed, channel, rawData)
1094
        self.AddTest2(test)
1120
        self.AddTest2(test)
1095
 
1121
 
1096
    def removeTest(self, idx):
1122
    def removeTest(self, idx):
1097
        del(self.VibTests[idx])
1123
        del(self.VibTests[idx])
1098
   
1124
   
1099
    def getTest(self, testId):
1125
    def getTest(self, testId):
1100
        return self.VibTests[testId]
1126
        return self.VibTests[testId]
1101
 
1127
 
1102
    def OnInit(self):
1128
    def OnInit(self):
1103
        wx.InitAllImageHandlers()
1129
        wx.InitAllImageHandlers()
1104
        self.frame_1 = MainFrame(None, -1, "")
1130
        self.frame_1 = MainFrame(None, -1, "")
1105
        self.frame_1.setApp(self);
1131
        self.frame_1.setApp(self);
1106
        self.SetTopWindow(self.frame_1)
1132
        self.SetTopWindow(self.frame_1)
1107
 
1133
 
1108
        self.frame_1.CenterOnScreen()
1134
        self.frame_1.CenterOnScreen()
1109
        self.frame_1.Show()
1135
        self.frame_1.Show()
1110
        return 1
1136
        return 1
1111
 
1137
 
1112
    def saveTests(self, filePath):
1138
    def saveTests(self, filePath):
1113
        try:
1139
        try:
1114
          logfile = open(filePath, "r")
1140
          logfile = open(filePath, "r")
1115
          newFile = False
1141
          newFile = False
1116
          logfile.close()
1142
          logfile.close()
1117
        except:
1143
        except:
1118
          newFile = True
1144
          newFile = True
1119
         
1145
         
1120
        for test in self.VibTests:
1146
        for test in self.VibTests:
1121
          if newFile:
1147
          if newFile:
1122
            logfile = open(filePath, "w")
1148
            logfile = open(filePath, "w")
1123
            print "Writing result to %s ..." % filePath,
1149
            print "Writing result to %s ..." % filePath,
1124
            logfile.write("%s %d %s\n" % (test.descr, test.speed, test.channel))
1150
            logfile.write("%s %d %s\n" % (test.descr, test.speed, test.channel))
1125
            for value in test.rawData:
1151
            for value in test.rawData:
1126
              logfile.write("%d\n" % value)
1152
              logfile.write("%d\n" % value)
1127
            logfile.close()  
1153
            logfile.close()  
1128
            print "OK"
1154
            print "OK"
1129
          else:
1155
          else:
1130
            print "Appending result to %s ..." % filePath,
1156
            print "Appending result to %s ..." % filePath,
1131
            logfile = open(filePath, "r")
1157
            logfile = open(filePath, "r")
1132
            prevData = []
1158
            prevData = []
1133
            for line in logfile:
1159
            for line in logfile:
1134
              prevData.append(line[:-1])
1160
              prevData.append(line[:-1])
1135
            logfile.close()
1161
            logfile.close()
1136
            logfile = open(filePath, "w")
1162
            logfile = open(filePath, "w")
1137
            logfile.write("%s,%s %d %s\n" % (prevData[0], test.descr, test.speed, test.channel))
1163
            logfile.write("%s,%s %d %s\n" % (prevData[0], test.descr, test.speed, test.channel))
1138
            i = 1
1164
            i = 1
1139
            for value in test.rawData:
1165
            for value in test.rawData:
1140
              logfile.write("%s,%d\n" % (prevData[i], value))
1166
              logfile.write("%s,%d\n" % (prevData[i], value))
1141
              i += 1
1167
              i += 1
1142
            logfile.close()
1168
            logfile.close()
1143
            print "OK"
1169
            print "OK"
1144
          newFile = False
1170
          newFile = False
1145
           
1171
           
1146
           
1172
           
1147
    def loadTests(self, filePath):
1173
    def loadTests(self, filePath):
1148
       
1174
       
1149
        print "Importing file \"%s\"" % filePath
1175
        print "Importing file \"%s\"" % filePath
1150
 
1176
 
1151
        logfile = open(filePath, "r")
1177
        logfile = open(filePath, "r")
1152
        data = None
1178
        data = None
1153
 
1179
 
1154
        headers = (logfile.readline()[:-1]).split(',')
1180
        headers = (logfile.readline()[:-1]).split(',')
1155
        nbCols = len(headers)
1181
        nbCols = len(headers)
1156
        print "NbCols =", nbCols
1182
        print "NbCols =", nbCols
1157
 
1183
 
1158
        data = []
1184
        data = []
1159
        descr = []
1185
        descr = []
1160
        speed = []
1186
        speed = []
1161
        channel = []
1187
        channel = []
1162
        for c in range(nbCols):
1188
        for c in range(nbCols):
1163
            data.append([])
1189
            data.append([])
1164
            h = headers[c].split(' ')
1190
            h = headers[c].split(' ')
1165
            descr.append(h[0]);
1191
            descr.append(h[0]);
1166
            speed.append(h[1]);
1192
            speed.append(h[1]);
1167
            channel.append(h[2]);
1193
            channel.append(h[2]);
1168
 
1194
 
1169
        for line in logfile:
1195
        for line in logfile:
1170
            values = line.split(',')
1196
            values = line.split(',')
1171
            for i in range(nbCols):
1197
            for i in range(nbCols):
1172
                data[i].append(int(values[i]))
1198
                data[i].append(int(values[i]))
1173
        logfile.close()
1199
        logfile.close()
1174
 
1200
 
1175
        for c in range(nbCols):
1201
        for c in range(nbCols):
1176
            if (len(data[c]) % 2) != 0:
1202
            if (len(data[c]) % 2) != 0:
1177
                data[c].append(data[c][-1])
1203
                data[c].append(data[c][-1])
1178
            self.AddTest(descr[c], 0, 0, int(speed[c]), channel[c], data[c])
1204
            self.AddTest(descr[c], 0, 0, int(speed[c]), channel[c], data[c])
1179
           
1205
           
1180
    def startMeasure(self, measureParams, dialog):
1206
    def startMeasure(self, measureParams, dialog):
1181
        print "Start measuring"
1207
        print "Start measuring"
1182
       
1208
       
1183
        measureParams.serialPort = self.settings["serialport"].value
1209
        measureParams.serialPort = self.settings["serialport"].value
1184
        measureParams.motorStartupSpeed = self.settings["startupspeed"].value
1210
        measureParams.motorStartupSpeed = self.settings["startupspeed"].value
1185
        measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value
1211
        measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value
1186
        measureParams.minVoltage = self.settings["minvoltage"].value
1212
        measureParams.minVoltage = self.settings["minvoltage"].value
1187
        measureParams.maxVoltage = self.settings["maxvoltage"].value        
1213
        measureParams.maxVoltage = self.settings["maxvoltage"].value        
1188
       
1214
       
1189
        self.measureThread = MeasureThread(measureParams, dialog)
1215
        self.measureThread = MeasureThread(measureParams, dialog)
1190
        self.measureThread.start()
1216
        self.measureThread.start()
1191
       
1217
       
1192
    def cancelMeasurement(self):
1218
    def cancelMeasurement(self):
1193
        print "Measuring CANCEL"
1219
        print "Measuring CANCEL"
1194
       
1220
       
1195
        self.measureThread.stop()
1221
        self.measureThread.stop()
1196
       
1222
       
1197
       
1223
       
1198
       
1224
       
1199
       
1225
       
1200
       
1226
       
1201
           
1227
           
1202
 
1228
 
1203
       
1229
       
1204
# end of class App
1230
# end of class App
1205
 
1231
 
1206
if __name__ == "__main__":
1232
if __name__ == "__main__":
1207
 
1233
 
1208
    rootPath = os.path.abspath(os.path.dirname(sys.argv[0]))
1234
    rootPath = os.path.abspath(os.path.dirname(sys.argv[0]))
1209
   
1235
   
1210
    print rootPath
1236
    print rootPath
1211
 
1237
 
1212
    VibrationTestGui = App(0)
1238
    VibrationTestGui = App(0)
1213
    VibrationTestGui.MainLoop()
1239
    VibrationTestGui.MainLoop()
1214
 
1240