Subversion Repositories Projects

Rev

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

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