Subversion Repositories Projects

Rev

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

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