Subversion Repositories Projects

Rev

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

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