Subversion Repositories Projects

Rev

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

Rev 627 Rev 628
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),5)
186
            i = min(max(i,0),5)
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.Description = wx.StaticText(self, -1, "Description")
307
        self.tcDescr = wx.TextCtrl(self, -1, "Test")
307
        self.tcDescr = wx.TextCtrl(self, -1, "Test")
308
        self.label_37 = wx.StaticText(self, -1, "Speed(s)")
308
        self.label_37 = wx.StaticText(self, -1, "Speed(s)")
309
        self.tcSpeeds = wx.TextCtrl(self, -1, "100-200:10")
309
        self.tcSpeeds = wx.TextCtrl(self, -1, "100-200:10")
310
        self.label_35 = wx.StaticText(self, -1, "Motor(s)")
310
        self.label_35 = wx.StaticText(self, -1, "Motor(s)")
311
        self.tcMotors = wx.TextCtrl(self, -1, "1")
311
        self.tcMotors = wx.TextCtrl(self, -1, "1")
312
        self.label_38 = wx.StaticText(self, -1, "")
312
        self.label_38 = wx.StaticText(self, -1, "")
313
        self.panel_2 = wx.Panel(self, -1)
313
        self.panel_2 = wx.Panel(self, -1)
314
        self.label_36 = wx.StaticText(self, -1, "Channel(s)")
314
        self.label_36 = wx.StaticText(self, -1, "Channel(s)")
315
        self.tcChannels = wx.TextCtrl(self, -1, "6")
315
        self.tcChannels = wx.TextCtrl(self, -1, "6")
316
        self.label_39 = wx.StaticText(self, -1, "")
316
        self.label_39 = wx.StaticText(self, -1, "")
317
        self.panel_3 = wx.Panel(self, -1)
317
        self.panel_3 = wx.Panel(self, -1)
318
        self.button_4 = wx.Button(self, -1, "Measure")
318
        self.button_4 = wx.Button(self, -1, "Measure")
319
        self.graphCtrl = wx.lib.plot.PlotCanvas(self, size=(800,300))
319
        self.graphCtrl = wx.lib.plot.PlotCanvas(self, size=(800,300))
320
        self.label_40 = wx.StaticText(self, -1, "Graph Type ")
320
        self.label_40 = wx.StaticText(self, -1, "Graph Type ")
321
        self.graphTypeChoice = wx.Choice(self, -1, choices=["Raw Signal", "Filtered Signal", "Spectrum"])
321
        self.graphTypeChoice = wx.Choice(self, -1, choices=["Raw Signal", "Filtered Signal", "Spectrum"])
322
        self.label_41 = wx.StaticText(self, -1, "Y Axis Range ")
322
        self.label_41 = wx.StaticText(self, -1, "Y Axis Range ")
323
        self.yAxisChoice = wx.Choice(self, -1, choices=["25", "50", "100", "200"])
323
        self.yAxisChoice = wx.Choice(self, -1, choices=["25", "50", "100", "200"])
324
        self.copyGraphButton = wx.Button(self, -1, "Copy Graph Data")
324
        self.copyGraphButton = wx.Button(self, -1, "Copy Graph Data")
325
        self.TestListCtrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
325
        self.TestListCtrl = wx.ListCtrl(self, -1, style=wx.LC_REPORT|wx.SUNKEN_BORDER)
326
 
326
 
327
        self.__set_properties()
327
        self.__set_properties()
328
        self.__do_layout()
328
        self.__do_layout()
329
 
329
 
330
        self.Bind(wx.EVT_MENU, self.OnSettings, id=101)
330
        self.Bind(wx.EVT_MENU, self.OnSettings, id=101)
331
        self.Bind(wx.EVT_MENU, self.onExit, id=150)
331
        self.Bind(wx.EVT_MENU, self.onExit, id=150)
332
        self.Bind(wx.EVT_MENU, self.onClear, id=301)
332
        self.Bind(wx.EVT_MENU, self.onClear, id=301)
333
        self.Bind(wx.EVT_MENU, self.onClearSelected, id=302)
333
        self.Bind(wx.EVT_MENU, self.onClearSelected, id=302)
334
        self.Bind(wx.EVT_MENU, self.onSelectAll, id=310)
334
        self.Bind(wx.EVT_MENU, self.onSelectAll, id=310)
335
        self.Bind(wx.EVT_MENU, self.OnImport, id=303)
335
        self.Bind(wx.EVT_MENU, self.OnImport, id=303)
336
        self.Bind(wx.EVT_MENU, self.onExport, id=304)
336
        self.Bind(wx.EVT_MENU, self.onExport, id=304)
337
        self.Bind(wx.EVT_MENU, self.onAbout, id=1099)
337
        self.Bind(wx.EVT_MENU, self.onAbout, id=1099)
338
        self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.button_4)
338
        self.Bind(wx.EVT_BUTTON, self.onStartMeasure, self.button_4)
339
        self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice)
339
        self.Bind(wx.EVT_CHOICE, self.onGraphTypeChange, self.graphTypeChoice)
340
        self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice)
340
        self.Bind(wx.EVT_CHOICE, self.onYAxisChange, self.yAxisChoice)
341
        self.Bind(wx.EVT_BUTTON, self.onCopyGraphData, self.copyGraphButton)
341
        self.Bind(wx.EVT_BUTTON, self.onCopyGraphData, self.copyGraphButton)
342
        # end wxGlade
342
        # end wxGlade
343
        favicon = wx.Icon('%s/Resources/60px-Procman.ico' % rootPath, wx.BITMAP_TYPE_ICO, 32, 32)
343
        favicon = wx.Icon('%s/Resources/60px-Procman.ico' % rootPath, wx.BITMAP_TYPE_ICO, 32, 32)
344
        wx.Frame.SetIcon(self, favicon)
344
        wx.Frame.SetIcon(self, favicon)
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.Description.SetMinSize((53, 13))
353
        self.Description.SetMinSize((53, 13))
354
        self.button_4.SetMinSize((80, 80))
354
        self.button_4.SetMinSize((80, 80))
355
        self.graphCtrl.SetMinSize((800,300))
355
        self.graphCtrl.SetMinSize((800,300))
356
        self.graphTypeChoice.SetSelection(0)
356
        self.graphTypeChoice.SetSelection(0)
357
        self.yAxisChoice.SetSelection(1)
357
        self.yAxisChoice.SetSelection(1)
358
        self.TestListCtrl.SetMinSize((800,300))
358
        self.TestListCtrl.SetMinSize((800,300))
359
        # end wxGlade
359
        # end wxGlade
360
 
360
 
361
    def __do_layout(self):
361
    def __do_layout(self):
362
        # begin wxGlade: MainFrame.__do_layout
362
        # begin wxGlade: MainFrame.__do_layout
363
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
363
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
364
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
364
        sizer_8 = wx.BoxSizer(wx.VERTICAL)
365
        sizer_11 = wx.BoxSizer(wx.VERTICAL)
365
        sizer_11 = wx.BoxSizer(wx.VERTICAL)
366
        sizer_12 = wx.BoxSizer(wx.HORIZONTAL)
366
        sizer_12 = wx.BoxSizer(wx.HORIZONTAL)
367
        sizer_9 = wx.BoxSizer(wx.HORIZONTAL)
367
        sizer_9 = wx.BoxSizer(wx.HORIZONTAL)
368
        sizer_10 = wx.BoxSizer(wx.HORIZONTAL)
368
        sizer_10 = wx.BoxSizer(wx.HORIZONTAL)
369
        grid_sizer_1 = wx.GridSizer(3, 4, 4, 5)
369
        grid_sizer_1 = wx.GridSizer(3, 4, 4, 5)
370
        sizer_3.Add((20, 20), 0, 0, 0)
370
        sizer_3.Add((20, 20), 0, 0, 0)
371
        sizer_8.Add((20, 20), 0, 0, 0)
371
        sizer_8.Add((20, 20), 0, 0, 0)
372
        grid_sizer_1.Add(self.Description, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
372
        grid_sizer_1.Add(self.Description, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
373
        grid_sizer_1.Add(self.tcDescr, 0, 0, 0)
373
        grid_sizer_1.Add(self.tcDescr, 0, 0, 0)
374
        grid_sizer_1.Add(self.label_37, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
374
        grid_sizer_1.Add(self.label_37, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
375
        grid_sizer_1.Add(self.tcSpeeds, 0, 0, 0)
375
        grid_sizer_1.Add(self.tcSpeeds, 0, 0, 0)
376
        grid_sizer_1.Add(self.label_35, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
376
        grid_sizer_1.Add(self.label_35, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
377
        grid_sizer_1.Add(self.tcMotors, 0, 0, 0)
377
        grid_sizer_1.Add(self.tcMotors, 0, 0, 0)
378
        grid_sizer_1.Add(self.label_38, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
378
        grid_sizer_1.Add(self.label_38, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
379
        grid_sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
379
        grid_sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
380
        grid_sizer_1.Add(self.label_36, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
380
        grid_sizer_1.Add(self.label_36, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
381
        grid_sizer_1.Add(self.tcChannels, 0, 0, 0)
381
        grid_sizer_1.Add(self.tcChannels, 0, 0, 0)
382
        grid_sizer_1.Add(self.label_39, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
382
        grid_sizer_1.Add(self.label_39, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
383
        grid_sizer_1.Add(self.panel_3, 1, wx.EXPAND, 0)
383
        grid_sizer_1.Add(self.panel_3, 1, wx.EXPAND, 0)
384
        sizer_9.Add(grid_sizer_1, 0, 0, 0)
384
        sizer_9.Add(grid_sizer_1, 0, 0, 0)
385
        sizer_10.Add((50, 20), 0, 0, 0)
385
        sizer_10.Add((50, 20), 0, 0, 0)
386
        sizer_10.Add(self.button_4, 0, wx.ALIGN_CENTER_VERTICAL, 0)
386
        sizer_10.Add(self.button_4, 0, wx.ALIGN_CENTER_VERTICAL, 0)
387
        sizer_9.Add(sizer_10, 1, wx.EXPAND, 0)
387
        sizer_9.Add(sizer_10, 1, wx.EXPAND, 0)
388
        sizer_8.Add(sizer_9, 0, 0, 0)
388
        sizer_8.Add(sizer_9, 0, 0, 0)
389
        sizer_8.Add((20, 30), 0, 0, 0)
389
        sizer_8.Add((20, 30), 0, 0, 0)
390
        sizer_11.Add(self.graphCtrl, 1, wx.EXPAND, 0)
390
        sizer_11.Add(self.graphCtrl, 1, wx.EXPAND, 0)
391
        sizer_11.Add((20, 5), 0, 0, 0)
391
        sizer_11.Add((20, 5), 0, 0, 0)
392
        sizer_12.Add(self.label_40, 0, wx.ALIGN_CENTER_VERTICAL, 0)
392
        sizer_12.Add(self.label_40, 0, wx.ALIGN_CENTER_VERTICAL, 0)
393
        sizer_12.Add(self.graphTypeChoice, 0, 0, 0)
393
        sizer_12.Add(self.graphTypeChoice, 0, 0, 0)
394
        sizer_12.Add((40, 20), 0, 0, 0)
394
        sizer_12.Add((40, 20), 0, 0, 0)
395
        sizer_12.Add(self.label_41, 0, wx.ALIGN_CENTER_VERTICAL, 0)
395
        sizer_12.Add(self.label_41, 0, wx.ALIGN_CENTER_VERTICAL, 0)
396
        sizer_12.Add(self.yAxisChoice, 0, 0, 0)
396
        sizer_12.Add(self.yAxisChoice, 0, 0, 0)
397
        sizer_12.Add((80, 20), 0, 0, 0)
397
        sizer_12.Add((80, 20), 0, 0, 0)
398
        sizer_12.Add(self.copyGraphButton, 0, 0, 0)
398
        sizer_12.Add(self.copyGraphButton, 0, 0, 0)
399
        sizer_11.Add(sizer_12, 0, 0, 0)
399
        sizer_11.Add(sizer_12, 0, 0, 0)
400
        sizer_8.Add(sizer_11, 0, 0, 0)
400
        sizer_8.Add(sizer_11, 0, 0, 0)
401
        sizer_8.Add((20, 30), 0, 0, 0)
401
        sizer_8.Add((20, 30), 0, 0, 0)
402
        sizer_8.Add(self.TestListCtrl, 1, 0, 0)
402
        sizer_8.Add(self.TestListCtrl, 1, 0, 0)
403
        sizer_8.Add((20, 20), 0, 0, 0)
403
        sizer_8.Add((20, 20), 0, 0, 0)
404
        sizer_3.Add(sizer_8, 1, wx.EXPAND, 0)
404
        sizer_3.Add(sizer_8, 1, wx.EXPAND, 0)
405
        self.SetSizer(sizer_3)
405
        self.SetSizer(sizer_3)
406
        self.Layout()
406
        self.Layout()
407
        self.SetSize((850, 700))
407
        self.SetSize((850, 700))
408
        # end wxGlade
408
        # end wxGlade
409
 
409
 
410
        # List events
410
        # List events
411
        self.TestListCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnTestSelected, self.TestListCtrl)
411
        self.TestListCtrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnTestSelected, self.TestListCtrl)
412
 
412
 
413
        # Configure Graph
413
        # Configure Graph
414
        #self.graphCtrl = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300))
414
        #self.graphCtrl = wx.lib.plot.PlotCanvas(self.GraphPanel, size=(800,300))
415
       
415
       
416
        self.graphCtrl.SetPointLabelFunc(self.DrawPointLabel)
416
        self.graphCtrl.SetPointLabelFunc(self.DrawPointLabel)
417
       
417
       
418
        self.graphCtrl.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL))
418
        self.graphCtrl.SetFont(wx.Font(10,wx.SWISS,wx.NORMAL,wx.NORMAL))
419
        self.graphCtrl.SetFontSizeAxis(10)
419
        self.graphCtrl.SetFontSizeAxis(10)
420
        self.graphCtrl.SetFontSizeLegend(7)
420
        self.graphCtrl.SetFontSizeLegend(7)
421
        self.graphCtrl.setLogScale((False,False))
421
        self.graphCtrl.setLogScale((False,False))
422
 
422
 
423
 
423
 
424
        # Configure TestListCtrl
424
        # Configure TestListCtrl
425
        self.TestListCtrl.InsertColumn(0, "Description")
425
        self.TestListCtrl.InsertColumn(0, "Description")
426
        self.TestListCtrl.InsertColumn(1, "Voltage")
426
        self.TestListCtrl.InsertColumn(1, "Voltage")
427
        self.TestListCtrl.InsertColumn(2, "Speed")
427
        self.TestListCtrl.InsertColumn(2, "Speed")
428
        self.TestListCtrl.InsertColumn(3, "Channel")
428
        self.TestListCtrl.InsertColumn(3, "Channel")
429
        self.TestListCtrl.InsertColumn(4, "Vibration Value")
429
        self.TestListCtrl.InsertColumn(4, "Vibration Value")
430
        self.TestListCtrl.SetColumnWidth(4, 500)
430
        self.TestListCtrl.SetColumnWidth(4, 500)
431
 
431
 
432
    def DrawPointLabel(self, dc, mDataDict):
432
    def DrawPointLabel(self, dc, mDataDict):
433
        """This is the fuction that defines how the pointLabels are plotted
433
        """This is the fuction that defines how the pointLabels are plotted
434
            dc - DC that will be passed
434
            dc - DC that will be passed
435
            mDataDict - Dictionary of data that you want to use for the pointLabel
435
            mDataDict - Dictionary of data that you want to use for the pointLabel
436
 
436
 
437
            As an example I have decided I want a box at the curve point
437
            As an example I have decided I want a box at the curve point
438
            with some text information about the curve plotted below.
438
            with some text information about the curve plotted below.
439
            Any wxDC method can be used.
439
            Any wxDC method can be used.
440
        """
440
        """
441
        # ----------
441
        # ----------
442
        dc.SetPen(wx.Pen(wx.BLACK))
442
        dc.SetPen(wx.Pen(wx.BLACK))
443
        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )
443
        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )
444
       
444
       
445
        sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point
445
        sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point
446
        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point
446
        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point
447
        px,py = mDataDict["pointXY"]
447
        px,py = mDataDict["pointXY"]
448
        cNum = mDataDict["curveNum"]
448
        cNum = mDataDict["curveNum"]
449
        pntIn = mDataDict["pIndex"]
449
        pntIn = mDataDict["pIndex"]
450
        legend = mDataDict["legend"]
450
        legend = mDataDict["legend"]
451
        #make a string to display
451
        #make a string to display
452
        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)
452
        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)
453
        dc.DrawText(s, sx , sy+1)
453
        dc.DrawText(s, sx , sy+1)
454
        # -----------
454
        # -----------
455
 
455
 
456
 
456
 
457
    def onNewTest(self, test):
457
    def onNewTest(self, test):
458
        index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr)
458
        index = self.TestListCtrl.InsertStringItem(sys.maxint, test.descr)
459
        self.TestListCtrl.SetStringItem(index, 1, "%.1f V" %test.voltage)
459
        self.TestListCtrl.SetStringItem(index, 1, "%.1f V" %test.voltage)
460
        self.TestListCtrl.SetStringItem(index, 2, str(test.speed))
460
        self.TestListCtrl.SetStringItem(index, 2, str(test.speed))
461
        self.TestListCtrl.SetStringItem(index, 3, test.channel)
461
        self.TestListCtrl.SetStringItem(index, 3, test.channel)
462
 
462
 
463
        vv = int(test.getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value))
463
        vv = int(test.getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value))
464
        vvs = "|%s| (%d)" % ("----------------------------------------------------------------------------------------------------"[0:min(vv,100)], vv)
464
        vvs = "|%s| (%d)" % ("----------------------------------------------------------------------------------------------------"[0:min(vv,100)], vv)
465
        self.TestListCtrl.SetStringItem(index, 4, vvs)
465
        self.TestListCtrl.SetStringItem(index, 4, vvs)
466
        self.TestListCtrl.Select(index)
466
        self.TestListCtrl.Select(index)
467
 
467
 
468
 
468
 
469
    def OnTestSelected(self, event):
469
    def OnTestSelected(self, event):
470
         testId = event.m_itemIndex
470
         testId = event.m_itemIndex
471
         print "Test Selected id=%d" % (testId)
471
         print "Test Selected id=%d" % (testId)
472
         self.activeTestId = testId
472
         self.activeTestId = testId
473
         self.drawGraph()
473
         self.drawGraph()
474
 
474
 
475
    def drawGraph(self):
475
    def drawGraph(self):
476
         
476
         
477
         y = int(self.yAxisChoice.GetStringSelection())
477
         y = int(self.yAxisChoice.GetStringSelection())
478
 
478
 
479
         nbSelected = self.TestListCtrl.SelectedItemCount
479
         nbSelected = self.TestListCtrl.SelectedItemCount
480
 
480
 
481
         if nbSelected == 0:
481
         if nbSelected == 0:
482
              self.graphCtrl.Clear()
482
              self.graphCtrl.Clear()
483
         
483
         
484
         elif nbSelected > 1:
484
         elif nbSelected > 1:
485
             self.graphTypeChoice.Disable()
485
             self.graphTypeChoice.Disable()
486
             self.copyGraphButton.Enable()
486
             self.copyGraphButton.Enable()
487
             x = 1
487
             x = 1
488
             data = []
488
             data = []
489
             idx = self.TestListCtrl.GetFirstSelected()
489
             idx = self.TestListCtrl.GetFirstSelected()
490
             while idx != -1:
490
             while idx != -1:
491
                 data.append([x,self.app.getTest(idx).getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value)])
491
                 data.append([x,self.app.getTest(idx).getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value)])
492
                 x += 1
492
                 x += 1
493
                 idx = self.TestListCtrl.GetNextSelected(idx)
493
                 idx = self.TestListCtrl.GetNextSelected(idx)
494
             line = wx.lib.plot.PolyLine(data, legend= 'Vibrations', colour='red', width=2)
494
             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)
495
             markers = wx.lib.plot.PolyMarker(data, legend= '', colour='red', marker='circle',size=2)
496
             title = "Comparing tests"
496
             title = "Comparing tests"
497
             self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line, markers], title, "Test", "Vibration Value"), xAxis=(1,max(x,10)), yAxis=(0,y))
497
             self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line, markers], title, "Test", "Vibration Value"), xAxis=(1,max(x,10)), yAxis=(0,y))
498
             self.graphCtrl.SetEnableGrid('Horizontal')
498
             self.graphCtrl.SetEnableGrid('Horizontal')
499
 
499
 
500
         else:
500
         else:
501
             self.graphTypeChoice.Enable()
501
             self.graphTypeChoice.Enable()
502
             self.copyGraphButton.Disable()
502
             self.copyGraphButton.Disable()
503
             vibTest = self.app.getTest(self.activeTestId)
503
             vibTest = self.app.getTest(self.activeTestId)
504
             nb = vibTest.getDataLen()
504
             nb = vibTest.getDataLen()
505
 
505
 
506
             if self.graphTypeChoice.GetSelection() == 0:
506
             if self.graphTypeChoice.GetSelection() == 0:
507
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
507
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
508
                 xydata.shape = (nb, 2)
508
                 xydata.shape = (nb, 2)
509
                 xydata[:,1] = vibTest.getRawData()
509
                 xydata[:,1] = vibTest.getRawData()
510
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
510
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
511
       
511
       
512
                 title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
512
                 title = "Raw Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
513
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
513
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
514
                 self.graphCtrl.SetEnableGrid('Horizontal')
514
                 self.graphCtrl.SetEnableGrid('Horizontal')
515
   
515
   
516
             if self.graphTypeChoice.GetSelection() == 1:
516
             if self.graphTypeChoice.GetSelection() == 1:
517
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
517
                 xydata = _Numeric.linspace(0,0.09*nb,2*nb)
518
                 xydata.shape = (nb, 2)
518
                 xydata.shape = (nb, 2)
519
                 xydata[:,1] = vibTest.getFilteredData(self.app.settings["hpf"].value, self.app.settings["lpf"].value)
519
                 xydata[:,1] = vibTest.getFilteredData(self.app.settings["hpf"].value, self.app.settings["lpf"].value)
520
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
520
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Raw Data', colour='red', width=2)
521
       
521
       
522
                 title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
522
                 title = "Filtered Signal: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
523
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
523
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line], title, "Time (ms)", "Acc"), yAxis= (-y,y))
524
                 self.graphCtrl.SetEnableGrid('Horizontal')
524
                 self.graphCtrl.SetEnableGrid('Horizontal')
525
   
525
   
526
             elif self.graphTypeChoice.GetSelection() == 2:
526
             elif self.graphTypeChoice.GetSelection() == 2:
527
                 xydata = _Numeric.linspace(0,FS/2,nb)
527
                 xydata = _Numeric.linspace(0,FS/2,nb)
528
                 xydata.shape = (nb/2, 2)
528
                 xydata.shape = (nb/2, 2)
529
                 
529
                 
530
                 xydata[:,1] = vibTest.getSpectrum()
530
                 xydata[:,1] = vibTest.getSpectrum()
531
   
531
   
532
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red')
532
                 line = wx.lib.plot.PolyLine(xydata, legend= 'Spectrum', colour='red')
533
                 markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2)
533
                 markers = wx.lib.plot.PolyMarker(xydata, legend= '', colour='red', marker='circle',size=2)
534
                 
534
                 
535
                 fc = self.app.settings["hpf"].value
535
                 fc = self.app.settings["hpf"].value
536
                 filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
536
                 filterLine1 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
537
                 fc = self.app.settings["lpf"].value
537
                 fc = self.app.settings["lpf"].value
538
                 filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
538
                 filterLine2 = wx.lib.plot.PolyLine(((fc,0),(fc,y)), legend='HP Filter', colour='Black', width=4)
539
       
539
       
540
                 title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
540
                 title = "Spectrum: %s %s %d" %(vibTest.descr, vibTest.channel, vibTest.speed)
541
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line,markers, filterLine1, filterLine2], title, "Freq (Hz)", "Acc"), xAxis=(0,200), yAxis= (-0,y))
541
                 self.graphCtrl.Draw(wx.lib.plot.PlotGraphics([line,markers, filterLine1, filterLine2], title, "Freq (Hz)", "Acc"), xAxis=(0,200), yAxis= (-0,y))
542
                 self.graphCtrl.SetEnableGrid(True)
542
                 self.graphCtrl.SetEnableGrid(True)
543
 
543
 
544
 
544
 
545
    def OnImport(self, event): # wxGlade: MainFrame.<event_handler>
545
    def OnImport(self, event): # wxGlade: MainFrame.<event_handler>
546
        dlg = wx.FileDialog(
546
        dlg = wx.FileDialog(
547
            self, message="Choose a file",
547
            self, message="Choose a file",
548
            defaultDir="%s/Data/" % os.getcwd(),
548
            defaultDir="%s/Data/" % os.getcwd(),
549
            defaultFile="*.txt",
549
            defaultFile="*.txt",
550
            wildcard="*.txt",
550
            wildcard="*.txt",
551
            style=wx.OPEN | wx.CHANGE_DIR
551
            style=wx.OPEN | wx.CHANGE_DIR
552
            )
552
            )
553
        if dlg.ShowModal() == wx.ID_OK:
553
        if dlg.ShowModal() == wx.ID_OK:
554
            paths = dlg.GetPaths();
554
            paths = dlg.GetPaths();
555
            self.app.loadTests(paths[0])
555
            self.app.loadTests(paths[0])
556
        dlg.Destroy()
556
        dlg.Destroy()
557
 
557
 
558
    def onExport(self, event): # wxGlade: MainFrame.<event_handler>
558
    def onExport(self, event): # wxGlade: MainFrame.<event_handler>
559
        dlg = wx.FileDialog(
559
        dlg = wx.FileDialog(
560
              self, message="Save file as ...",
560
              self, message="Save file as ...",
561
              defaultDir="%s/Data/" % os.getcwd(),
561
              defaultDir="%s/Data/" % os.getcwd(),
562
              defaultFile="*.txt",
562
              defaultFile="*.txt",
563
              wildcard="",
563
              wildcard="",
564
              style=wx.SAVE
564
              style=wx.SAVE
565
              )
565
              )
566
        if dlg.ShowModal() == wx.ID_OK:
566
        if dlg.ShowModal() == wx.ID_OK:
567
            paths = dlg.GetPaths();
567
            paths = dlg.GetPaths();
568
            self.app.saveTests(paths[0])
568
            self.app.saveTests(paths[0])
569
        dlg.Destroy()
569
        dlg.Destroy()
570
 
570
 
571
    def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler>
571
    def onYAxisChange(self, event): # wxGlade: MainFrame.<event_handler>
572
        self.drawGraph()
572
        self.drawGraph()
573
 
573
 
574
    def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler>
574
    def onGraphTypeChange(self, event): # wxGlade: MainFrame.<event_handler>
575
        self.drawGraph()
575
        self.drawGraph()
576
 
576
 
577
    def OnSettings(self, event): # wxGlade: MainFrame.<event_handler>
577
    def OnSettings(self, event): # wxGlade: MainFrame.<event_handler>
578
        dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200),
578
        dlg = SettingsDialog(self, -1, "Sample Dialog", size=(350, 200),
579
                         #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME,
579
                         #style=wx.CAPTION | wx.SYSTEM_MENU | wx.THICK_FRAME,
580
                         style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX
580
                         style=wx.DEFAULT_DIALOG_STYLE, # & ~wx.CLOSE_BOX
581
                         )
581
                         )
582
        dlg.CenterOnScreen()
582
        dlg.CenterOnScreen()
583
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
583
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
584
        dlg.Destroy()
584
        dlg.Destroy()
585
        self.app.onSettingsChanged()
585
        self.app.onSettingsChanged()
586
 
586
 
587
    def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler>
587
    def onStartMeasure(self, event): # wxGlade: MainFrame.<event_handler>
588
        # Collect measure parameters
588
        # Collect measure parameters
589
        mp = MeasureParameters()
589
        mp = MeasureParameters()
590
        mp.descr = self.tcDescr.GetValue()
590
        mp.descr = self.tcDescr.GetValue()
591
        mp.motors = map(int,self.tcMotors.GetValue().split(','))
591
        mp.motors = map(int,self.tcMotors.GetValue().split(','))
592
        mp.channels = map(int,self.tcChannels.GetValue().split(','))
592
        mp.channels = map(int,self.tcChannels.GetValue().split(','))
593
        s = self.tcSpeeds.GetValue()
593
        s = self.tcSpeeds.GetValue()
594
        if s=="test":
594
        if s=="test":
595
          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)
595
          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)
596
        elif s.count("-") == 1:
596
        elif s.count("-") == 1:
597
            # assume from-to:step format
597
            # assume from-to:step format
598
            s = s.split("-")
598
            s = s.split("-")
599
            if len(s) != 2: raise Exception("Invalid format")
599
            if len(s) != 2: raise Exception("Invalid format")
600
            s[1] = s[1].split(":")
600
            s[1] = s[1].split(":")
601
            if len(s[1]) != 2: raise Exception("Invalid format")
601
            if len(s[1]) != 2: raise Exception("Invalid format")
602
            mp.speeds = range(int(s[0]),int(s[1][0])+int(s[1][1]),int(s[1][1]))
602
            mp.speeds = range(int(s[0]),int(s[1][0])+int(s[1][1]),int(s[1][1]))
603
        else:
603
        else:
604
            mp.speeds = map(int,s.split(','))
604
            mp.speeds = map(int,s.split(','))
605
           
605
           
606
       
606
       
607
        # create the dialog that will show the satus
607
        # create the dialog that will show the satus
608
        dlg = MeasureDialog(self)
608
        dlg = MeasureDialog(self)
609
        dlg.CenterOnScreen()
609
        dlg.CenterOnScreen()
610
       
610
       
611
        # Signal the application
611
        # Signal the application
612
        self.app.startMeasure(mp, dlg)
612
        self.app.startMeasure(mp, dlg)
613
       
613
       
614
        # Show the dialog
614
        # Show the dialog
615
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
615
        val = dlg.ShowModal()  # this does not return until the dialog is closed.
616
        dlg.Destroy()
616
        dlg.Destroy()
617
 
617
 
618
    def _removeTest(self, idx):
618
    def _removeTest(self, idx):
619
        print "Deleting test %d" % idx
619
        print "Deleting test %d" % idx
620
        self.app.removeTest(idx)
620
        self.app.removeTest(idx)
621
        self.TestListCtrl.DeleteItem(idx)
621
        self.TestListCtrl.DeleteItem(idx)
622
       
622
       
623
           
623
           
624
    def onClear(self, event): # wxGlade: MainFrame.<event_handler>
624
    def onClear(self, event): # wxGlade: MainFrame.<event_handler>
625
        print "Clear all tests"
625
        print "Clear all tests"
626
        for i in range(len(self.app.VibTests)-1, -1, -1):
626
        for i in range(len(self.app.VibTests)-1, -1, -1):
627
            self._removeTest(i)
627
            self._removeTest(i)
628
        self.drawGraph()
628
        self.drawGraph()
629
           
629
           
630
       
630
       
631
    def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler>
631
    def onClearSelected(self, event): # wxGlade: MainFrame.<event_handler>
632
        while True:
632
        while True:
633
            idx = self.TestListCtrl.GetFirstSelected()
633
            idx = self.TestListCtrl.GetFirstSelected()
634
            if idx == -1: break
634
            if idx == -1: break
635
            self._removeTest(idx)
635
            self._removeTest(idx)
636
           
636
           
637
       
637
       
638
 
638
 
639
    def onAbout(self, event): # wxGlade: MainFrame.<event_handler>
639
    def onAbout(self, event): # wxGlade: MainFrame.<event_handler>
640
         # First we create and fill the info object
640
         # First we create and fill the info object
641
        print "about"
641
        print "about"
642
        info = wx.AboutDialogInfo()
642
        info = wx.AboutDialogInfo()
643
        info.Name = "MK Vibration Test"
643
        info.Name = "MK Vibration Test"
644
        info.Version = "0.2"
644
        info.Version = "0.2"
645
        info.Copyright = ""
645
        info.Copyright = ""
646
        info.Developers=["Frederic Goddeeris"]
646
        info.Developers=["Frederic Goddeeris"]
647
        info.Description = "Please consult the WIKI page for a complete description of the tool:"
647
        info.Description = "Please consult the WIKI page for a complete description of the tool:"
648
        info.WebSite = ("http://www.mikrokopter.de/ucwiki/en/VibrationTest", "VibrationTest WIKI page")
648
        info.WebSite = ("http://www.mikrokopter.de/ucwiki/en/VibrationTest", "VibrationTest WIKI page")
649
        wx.AboutBox(info)
649
        wx.AboutBox(info)
650
       
650
       
651
       
651
       
652
    def onExit(self, event): # wxGlade: MainFrame.<event_handler>
652
    def onExit(self, event): # wxGlade: MainFrame.<event_handler>
653
        self.Close(True)
653
        self.Close(True)
654
 
654
 
655
 
655
 
656
    def onSelectAll(self, event): # wxGlade: MainFrame.<event_handler>
656
    def onSelectAll(self, event): # wxGlade: MainFrame.<event_handler>
657
        for i in xrange(self.TestListCtrl.GetItemCount()):
657
        for i in xrange(self.TestListCtrl.GetItemCount()):
658
          self.TestListCtrl.Select(i)
658
          self.TestListCtrl.Select(i)
659
 
659
 
660
    def onCopyGraphData(self, event): # wxGlade: MainFrame.<event_handler>
660
    def onCopyGraphData(self, event): # wxGlade: MainFrame.<event_handler>
661
        clipdata = wx.TextDataObject()
661
        clipdata = wx.TextDataObject()
662
        txt = ""
662
        txt = ""
663
        idx = self.TestListCtrl.GetFirstSelected()
663
        idx = self.TestListCtrl.GetFirstSelected()
664
        while idx != -1:
664
        while idx != -1:
665
             txt += ("%d\n" % self.app.getTest(idx).getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value))
665
             txt += ("%d\n" % self.app.getTest(idx).getVibValue(self.app.settings["hpf"].value, self.app.settings["lpf"].value))
666
             idx = self.TestListCtrl.GetNextSelected(idx)
666
             idx = self.TestListCtrl.GetNextSelected(idx)
667
        clipdata.SetText(txt)
667
        clipdata.SetText(txt)
668
        wx.TheClipboard.Open()
668
        wx.TheClipboard.Open()
669
        wx.TheClipboard.SetData(clipdata)
669
        wx.TheClipboard.SetData(clipdata)
670
        wx.TheClipboard.Close()
670
        wx.TheClipboard.Close()
671
 
671
 
672
# end of class MainFrame
672
# end of class MainFrame
673
 
673
 
674
class Setting:
674
class Setting:
675
    def __init__(self, descr, defaultValue):
675
    def __init__(self, descr, defaultValue):
676
        self.descr = descr
676
        self.descr = descr
677
        self.value = defaultValue
677
        self.value = defaultValue
678
       
678
       
679
    def set(self, newValue):
679
    def set(self, newValue):
680
        if isinstance(self.value, int):
680
        if isinstance(self.value, int):
681
            self.value = int(newValue)
681
            self.value = int(newValue)
682
        else:
682
        else:
683
            self.value = str(newValue)
683
            self.value = str(newValue)
684
 
684
 
685
class MeasureParameters:
685
class MeasureParameters:
686
      pass
686
      pass
687
 
687
 
688
class MeasureThread:
688
class MeasureThread:
689
    def __init__(self, measureParameters, evtConsumer):
689
    def __init__(self, measureParameters, evtConsumer):
690
        self.mk = mkProto.MkComm()
690
        self.mk = mkProto.MkComm()
691
        self.param = measureParameters
691
        self.param = measureParameters
692
        self.evtConsumer = evtConsumer
692
        self.evtConsumer = evtConsumer
693
        self.cancel = False
693
        self.cancel = False
694
        self.running = False
694
        self.running = False
695
       
695
       
696
    def start(self):
696
    def start(self):
697
        thread.start_new_thread(self._run, ())
697
        thread.start_new_thread(self._run, ())
698
       
698
       
699
    def stop(self):
699
    def stop(self):
700
        self.cancel = True
700
        self.cancel = True
701
 
701
 
702
    def _testCancel(self):
702
    def _testCancel(self):
703
        if self.cancel:
703
        if self.cancel:
704
            raise Exception("Operation cancelled")
704
            raise Exception("Operation cancelled")
705
               
705
               
706
    def _sendEvent(self, msg=None, error=False, parVoltage=None, speed=None):
706
    def _sendEvent(self, msg=None, error=False, parVoltage=None, speed=None):
707
        evt = MeasStatusUpdateEvent(running=self.running, msg=msg, error=error, voltage=parVoltage, speed=speed)
707
        evt = MeasStatusUpdateEvent(running=self.running, msg=msg, error=error, voltage=parVoltage, speed=speed)
708
        wx.PostEvent(self.evtConsumer, evt)
708
        wx.PostEvent(self.evtConsumer, evt)
709
 
709
 
710
    def _setMotorSpeed(self, speed, settlingTime):
710
    def _setMotorSpeed(self, speed, settlingTime):
711
        speeds = [0,0,0,0]
711
        speeds = [0,0,0,0]
712
        for motor in self.param.motors:
712
        for motor in self.param.motors:
713
            speeds[motor-1] = speed
713
            speeds[motor-1] = speed
714
        for i in range(int(settlingTime*10)):
714
        for i in range(int(settlingTime*10)):
715
          self._testCancel()
715
          self._testCancel()
716
          self.mk.setMotorTest(speeds)
716
          self.mk.setMotorTest(speeds)
717
          time.sleep(.1)
717
          time.sleep(.1)
718
       
718
       
719
                   
719
                   
720
    def _run(self):
720
    def _run(self):
721
        self.running = True
721
        self.running = True
722
        self._sendEvent("Starting test \"%s\"" % self.param.descr)    
722
        self._sendEvent("Starting test \"%s\"" % self.param.descr)    
723
 
723
 
724
        try:
724
        try:
725
            self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort)
725
            self._sendEvent("Opening SerialPort \"%s\"" % self.param.serialPort)
726
            self.mk.open(comPort=self.param.serialPort)
726
            self.mk.open(comPort=self.param.serialPort)
727
               
727
               
728
            msg = self.mk.getVersionMsg()
728
            msg = self.mk.getVersionMsg()
729
            version = msg.getVersion()
729
            version = msg.getVersion()
730
            self._sendEvent("Version: %d.%d" % version)
730
            self._sendEvent("Version: %d.%d" % version)
731
           
731
           
732
            msg = self.mk.getDebugMsg()
732
            msg = self.mk.getDebugMsg()
733
            voltage = msg.getVoltage()
733
            voltage = msg.getVoltage()
734
            if (voltage == 0):
734
            if (voltage == 0):
-
 
735
              # Board is probably fed by USB
735
              minVoltage = 0
736
              minVoltage = 0
736
              maxVoltage = 1
737
              maxVoltage = 1
737
            else:
738
            else:
-
 
739
              # Determine the n umber of cells
738
              if (voltage > 4.2*3):
740
              if (voltage > 4.2*3):
739
                nbCells = 4  
741
                nbCells = 4  
740
              else:
742
              else:
741
                nbCells = 3
743
                nbCells = 3
-
 
744
              # Set minimum and maximum voltages
-
 
745
              if self.param.minVoltage > 0:
-
 
746
                minVoltage =  self.param.minVoltage
-
 
747
              else:
742
              minVoltage = nbCells*3.5
748
                minVoltage = nbCells*3.5  # auto
-
 
749
              if self.param.maxVoltage > 0:
-
 
750
                maxVoltage =  self.param.maxVoltage
-
 
751
              else:
743
              maxVoltage = nbCells*3.9  
752
                maxVoltage = nbCells*3.9  
-
 
753
               
744
            self._sendEvent("Voltage: %2.1fV" % voltage)
754
            self._sendEvent("Voltage: %2.1fV" % voltage)
745
            self._sendEvent("Min/Max Voltage: %2.1fV-%2.1fV" % (minVoltage, maxVoltage), parVoltage=(minVoltage, maxVoltage, voltage))
755
            self._sendEvent("Min/Max Voltage: %2.1fV-%2.1fV" % (minVoltage, maxVoltage), parVoltage=(minVoltage, maxVoltage, voltage))
746
           
-
 
747
         
756
           
748
            self._sendEvent("Starting motor(s) (speed=%d)... " % self.param.motorStartupSpeed, speed=self.param.motorStartupSpeed)
757
            self._sendEvent("Starting motor(s) (speed=%d)... " % self.param.motorStartupSpeed, speed=self.param.motorStartupSpeed)
749
            self._setMotorSpeed(self.param.motorStartupSpeed, self.param.motorStartupSettlingTime)
758
            self._setMotorSpeed(self.param.motorStartupSpeed, self.param.motorStartupSettlingTime)
750
         
759
         
751
            for speed in self.param.speeds:
760
            for speed in self.param.speeds:
752
                self._sendEvent("Changing motor speed to %d... " % speed, speed=speed)
761
                self._sendEvent("Changing motor speed to %d... " % speed, speed=speed)
753
                self._setMotorSpeed(speed, 1)
762
                self._setMotorSpeed(speed, 1)
754
               
763
               
755
                for channel in self.param.channels:
764
                for channel in self.param.channels:
756
                    self._setMotorSpeed(speed, .1)
765
                    self._setMotorSpeed(speed, .1)
757
                    msg = self.mk.getDebugMsg()
766
                    msg = self.mk.getDebugMsg()
758
                    voltage = msg.getVoltage()
767
                    voltage = msg.getVoltage()
759
           
768
           
760
                    self._sendEvent("Getting data from channel %s" % CHANNEL_NAMES[channel], parVoltage=(minVoltage, maxVoltage, voltage))
769
                    self._sendEvent("Getting data from channel %s" % CHANNEL_NAMES[channel], parVoltage=(minVoltage, maxVoltage, voltage))
761
                    data = self.mk.doVibrationTest(1000, channel)
770
                    data = self.mk.doVibrationTest(1000, channel)
762
                   
771
                   
763
                    vt = VibTest(self.param.descr, voltage, self.param.motors, speed, CHANNEL_NAMES[channel], data)
772
                    vt = VibTest(self.param.descr, voltage, self.param.motors, speed, CHANNEL_NAMES[channel], data)
764
                    evt = MeasDataEvent(vibTest = vt)
773
                    evt = MeasDataEvent(vibTest = vt)
765
                    wx.PostEvent(self.evtConsumer, evt)
774
                    wx.PostEvent(self.evtConsumer, evt)
766
                   
775
                   
767
                    if voltage<minVoltage:
776
                    if voltage<minVoltage:
768
                        raise Exception("Voltage too low")
777
                        raise Exception("Voltage too low")
769
                   
778
                   
770
            self._sendEvent("Done !")            
779
            self._sendEvent("Done !")            
771
       
780
       
772
        except Exception, e:
781
        except Exception, e:
773
            self._sendEvent("Exception \"%s\"" % e, error=True)  
782
            self._sendEvent("Exception \"%s\"" % e, error=True)  
774
               
783
               
775
        self.running = False
784
        self.running = False
776
        self._sendEvent("")    
785
        self._sendEvent("")    
777
       
786
       
778
 
787
 
779
class VibTest:
788
class VibTest:
780
    def __init__(self, descr, voltage, motor, speed, channel, rawData):
789
    def __init__(self, descr, voltage, motor, speed, channel, rawData):
781
        self.descr = descr
790
        self.descr = descr
782
        self.voltage = voltage
791
        self.voltage = voltage
783
        self.motor = motor
792
        self.motor = motor
784
        self.speed = speed
793
        self.speed = speed
785
        self.channel = channel
794
        self.channel = channel
786
 
795
 
787
        self.dataLen = len(rawData)
796
        self.dataLen = len(rawData)
788
 
797
 
789
        self.rawData = _Numeric.array(rawData)
798
        self.rawData = _Numeric.array(rawData)
790
        self.dc = self.rawData.mean()
799
        self.dc = self.rawData.mean()
791
        self.rawData -= self.dc
800
        self.rawData -= self.dc
792
 
801
 
793
        self.fft = _Numeric.fft.rfft(self.rawData)
802
        self.fft = _Numeric.fft.rfft(self.rawData)
794
 
803
 
795
        self.spectrum = None
804
        self.spectrum = None
796
        self.filteredData = None
805
        self.filteredData = None
797
        self.fc1 = None
806
        self.fc1 = None
798
        self.fc2 = None
807
        self.fc2 = None
799
       
808
       
800
        self.vibValue = None
809
        self.vibValue = None
801
       
810
       
802
    def getDescr(self):
811
    def getDescr(self):
803
        return self.Descr
812
        return self.Descr
804
 
813
 
805
    def getRawData(self):
814
    def getRawData(self):
806
        return self.rawData
815
        return self.rawData
807
 
816
 
808
    def getDataLen(self):
817
    def getDataLen(self):
809
        return self.dataLen
818
        return self.dataLen
810
 
819
 
811
    def getSpectrum(self):
820
    def getSpectrum(self):
812
        if self.spectrum == None:
821
        if self.spectrum == None:
813
            self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2)
822
            self.spectrum = _Numeric.absolute(self.fft[1:self.dataLen/2+1]) / (self.dataLen/2)
814
        return self.spectrum
823
        return self.spectrum
815
 
824
 
816
    def getFilteredData(self, fc1, fc2):
825
    def getFilteredData(self, fc1, fc2):
817
        if self.fc1 != fc1 or self.fc2 != fc2:
826
        if self.fc1 != fc1 or self.fc2 != fc2:
818
            self.filteredData = None  
827
            self.filteredData = None  
819
           
828
           
820
        if self.filteredData == None:
829
        if self.filteredData == None:
821
            tmpfft = self.fft.copy()
830
            tmpfft = self.fft.copy()
822
            fc = (float(fc1))/(FS/2)*len(tmpfft)
831
            fc = (float(fc1))/(FS/2)*len(tmpfft)
823
            print "fc1=%d => fc=%d" % (fc1,fc)
832
            print "fc1=%d => fc=%d" % (fc1,fc)
824
            for i in range(0,int(fc)):
833
            for i in range(0,int(fc)):
825
                tmpfft[i] = 0
834
                tmpfft[i] = 0
826
            fc = (float(fc2))/(FS/2)*len(tmpfft)
835
            fc = (float(fc2))/(FS/2)*len(tmpfft)
827
            print "fc2=%d => fc=%d" % (fc2,fc)
836
            print "fc2=%d => fc=%d" % (fc2,fc)
828
            for i in range(int(fc), len(tmpfft)):
837
            for i in range(int(fc), len(tmpfft)):
829
                tmpfft[i] = 0
838
                tmpfft[i] = 0
830
            self.filteredData = _Numeric.fft.irfft(tmpfft)
839
            self.filteredData = _Numeric.fft.irfft(tmpfft)
831
            self.fc1 = fc1
840
            self.fc1 = fc1
832
            self.fc2 = fc2
841
            self.fc2 = fc2
833
           
842
           
834
        return self.filteredData
843
        return self.filteredData
835
       
844
       
836
    def getVibValue(self, fc1, fc2):
845
    def getVibValue(self, fc1, fc2):
837
      if self.fc1 != fc1 or self.fc2 != fc2:
846
      if self.fc1 != fc1 or self.fc2 != fc2:
838
        self.vibValue = None  
847
        self.vibValue = None  
839
      if self.vibValue == None:
848
      if self.vibValue == None:
840
        fd = self.getFilteredData(fc1, fc2)[100:-100];
849
        fd = self.getFilteredData(fc1, fc2)[100:-100];
841
        self.vibValue = max(fd)-min(fd)
850
        self.vibValue = max(fd)-min(fd)
842
      return self.vibValue
851
      return self.vibValue
843
 
852
 
844
 
853
 
845
 
854
 
846
class App(wx.App):
855
class App(wx.App):
847
 
856
 
848
    SETTINGSFILE = "settings.cfg"
857
    SETTINGSFILE = "settings.cfg"
849
 
858
 
850
    def __init__(self, par):
859
    def __init__(self, par):
851
        self.VibTests = []
860
        self.VibTests = []
852
        wx.App.__init__(self, par)
861
        wx.App.__init__(self, par)
853
 
862
 
854
        # Init settings
863
        # Init settings
855
        self.settings={}
864
        self.settings={}
856
        self.settings["serialport"] = Setting("Serial Port", "COM1")
865
        self.settings["serialport"] = Setting("Serial Port", "COM1")
857
        self.settings["startupspeed"] = Setting("Motor Startup Speed", 25)
866
        self.settings["startupspeed"] = Setting("Motor Startup Speed", 25)
858
        self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3)
867
        self.settings["startupsettling"] = Setting("Motor Startup Setting time (s)", 3)
859
        self.settings["serialport"] = Setting("Serial Port", "COM1")
868
        self.settings["serialport"] = Setting("Serial Port", "COM1")
860
        self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 50)
869
        self.settings["hpf"] = Setting("HP Filter cutoff (Hz)", 50)
861
        self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 180)
870
        self.settings["lpf"] = Setting("LP Filter cutoff (Hz)", 180)
-
 
871
        self.settings["minvoltage"] = Setting("Minimum Bettery Voltage (0=Automatic) (V) ", 0)
-
 
872
        self.settings["maxvoltage"] = Setting("Maximum Bettery Voltage (0=Automatic) (V) ", 0)
-
 
873
 
862
 
874
 
863
        self.readSettings()
875
        self.readSettings()
864
 
876
 
865
        if len(sys.argv)>1:
877
        if len(sys.argv)>1:
866
            self.loadTests(sys.argv[1])
878
            self.loadTests(sys.argv[1])
867
 
879
 
868
 
880
 
869
    def readSettings(self):
881
    def readSettings(self):
870
        print "Reading settings"
882
        print "Reading settings"
871
        cp = ConfigParser.ConfigParser()
883
        cp = ConfigParser.ConfigParser()
872
 
884
 
873
        try:
885
        try:
874
            cp.read(App.SETTINGSFILE)
886
            cp.read(App.SETTINGSFILE)
875
            for setting in cp.items("DEFAULT"):
887
            for setting in cp.items("DEFAULT"):
876
                print " ",setting
888
                print " ",setting
877
                try:
889
                try:
878
                    self.settings[setting[0]].set(setting[1])
890
                    self.settings[setting[0]].set(setting[1])
879
                except:
891
                except:
880
                    print "WARNING, unknown setting"
892
                    print "WARNING, unknown setting"
881
        except:
893
        except:
882
            print "ERROR reading settingsfile"
894
            print "ERROR reading settingsfile"
883
 
895
 
884
 
896
 
885
    def storeSettings(self):
897
    def storeSettings(self):
886
        print "Storing settings"
898
        print "Storing settings"
887
 
899
 
888
        cp = ConfigParser.ConfigParser()
900
        cp = ConfigParser.ConfigParser()
889
        for setting in self.settings.iteritems():
901
        for setting in self.settings.iteritems():
890
            cp.set("", setting[0], setting[1].value)
902
            cp.set("", setting[0], setting[1].value)
891
 
903
 
892
        file = open(App.SETTINGSFILE, "w")
904
        file = open(App.SETTINGSFILE, "w")
893
        cp.write(file)
905
        cp.write(file)
894
        file.close()
906
        file.close()
895
 
907
 
896
 
908
 
897
    def onSettingsChanged(self):
909
    def onSettingsChanged(self):
898
        self.storeSettings()
910
        self.storeSettings()
899
     
911
     
900
    def AddTest2(self, vibTest):
912
    def AddTest2(self, vibTest):
901
        self.VibTests.append(vibTest)
913
        self.VibTests.append(vibTest)
902
        self.frame_1.onNewTest(vibTest)
914
        self.frame_1.onNewTest(vibTest)
903
         
915
         
904
    def AddTest(self, descr, voltage, motor, speed, channel, rawData):
916
    def AddTest(self, descr, voltage, motor, speed, channel, rawData):
905
        test = VibTest(descr, voltage, motor, speed, channel, rawData)
917
        test = VibTest(descr, voltage, motor, speed, channel, rawData)
906
        self.AddTest2(test)
918
        self.AddTest2(test)
907
 
919
 
908
    def removeTest(self, idx):
920
    def removeTest(self, idx):
909
        del(self.VibTests[idx])
921
        del(self.VibTests[idx])
910
   
922
   
911
    def getTest(self, testId):
923
    def getTest(self, testId):
912
        return self.VibTests[testId]
924
        return self.VibTests[testId]
913
 
925
 
914
    def OnInit(self):
926
    def OnInit(self):
915
        wx.InitAllImageHandlers()
927
        wx.InitAllImageHandlers()
916
        self.frame_1 = MainFrame(None, -1, "")
928
        self.frame_1 = MainFrame(None, -1, "")
917
        self.frame_1.setApp(self);
929
        self.frame_1.setApp(self);
918
        self.SetTopWindow(self.frame_1)
930
        self.SetTopWindow(self.frame_1)
919
 
931
 
920
        self.frame_1.CenterOnScreen()
932
        self.frame_1.CenterOnScreen()
921
        self.frame_1.Show()
933
        self.frame_1.Show()
922
        return 1
934
        return 1
923
 
935
 
924
    def saveTests(self, filePath):
936
    def saveTests(self, filePath):
925
        try:
937
        try:
926
          logfile = open(filePath, "r")
938
          logfile = open(filePath, "r")
927
          newFile = False
939
          newFile = False
928
          logfile.close()
940
          logfile.close()
929
        except:
941
        except:
930
          newFile = True
942
          newFile = True
931
         
943
         
932
        for test in self.VibTests:
944
        for test in self.VibTests:
933
          if newFile:
945
          if newFile:
934
            logfile = open(filePath, "w")
946
            logfile = open(filePath, "w")
935
            print "Writing result to %s ..." % filePath,
947
            print "Writing result to %s ..." % filePath,
936
            logfile.write("%s %d %s\n" % (test.descr, test.speed, test.channel))
948
            logfile.write("%s %d %s\n" % (test.descr, test.speed, test.channel))
937
            for value in test.rawData:
949
            for value in test.rawData:
938
              logfile.write("%d\n" % value)
950
              logfile.write("%d\n" % value)
939
            logfile.close()  
951
            logfile.close()  
940
            print "OK"
952
            print "OK"
941
          else:
953
          else:
942
            print "Appending result to %s ..." % filePath,
954
            print "Appending result to %s ..." % filePath,
943
            logfile = open(filePath, "r")
955
            logfile = open(filePath, "r")
944
            prevData = []
956
            prevData = []
945
            for line in logfile:
957
            for line in logfile:
946
              prevData.append(line[:-1])
958
              prevData.append(line[:-1])
947
            logfile.close()
959
            logfile.close()
948
            logfile = open(filePath, "w")
960
            logfile = open(filePath, "w")
949
            logfile.write("%s,%s %d %s\n" % (prevData[0], test.descr, test.speed, test.channel))
961
            logfile.write("%s,%s %d %s\n" % (prevData[0], test.descr, test.speed, test.channel))
950
            i = 1
962
            i = 1
951
            for value in test.rawData:
963
            for value in test.rawData:
952
              logfile.write("%s,%d\n" % (prevData[i], value))
964
              logfile.write("%s,%d\n" % (prevData[i], value))
953
              i += 1
965
              i += 1
954
            logfile.close()
966
            logfile.close()
955
            print "OK"
967
            print "OK"
956
          newFile = False
968
          newFile = False
957
           
969
           
958
           
970
           
959
    def loadTests(self, filePath):
971
    def loadTests(self, filePath):
960
       
972
       
961
        print "Importing file \"%s\"" % filePath
973
        print "Importing file \"%s\"" % filePath
962
 
974
 
963
        logfile = open(filePath, "r")
975
        logfile = open(filePath, "r")
964
        data = None
976
        data = None
965
 
977
 
966
        headers = (logfile.readline()[:-1]).split(',')
978
        headers = (logfile.readline()[:-1]).split(',')
967
        nbCols = len(headers)
979
        nbCols = len(headers)
968
        print "NbCols =", nbCols
980
        print "NbCols =", nbCols
969
 
981
 
970
        data = []
982
        data = []
971
        descr = []
983
        descr = []
972
        speed = []
984
        speed = []
973
        channel = []
985
        channel = []
974
        for c in range(nbCols):
986
        for c in range(nbCols):
975
            data.append([])
987
            data.append([])
976
            h = headers[c].split(' ')
988
            h = headers[c].split(' ')
977
            descr.append(h[0]);
989
            descr.append(h[0]);
978
            speed.append(h[1]);
990
            speed.append(h[1]);
979
            channel.append(h[2]);
991
            channel.append(h[2]);
980
 
992
 
981
        for line in logfile:
993
        for line in logfile:
982
            values = line.split(',')
994
            values = line.split(',')
983
            for i in range(nbCols):
995
            for i in range(nbCols):
984
                data[i].append(int(values[i]))
996
                data[i].append(int(values[i]))
985
        logfile.close()
997
        logfile.close()
986
 
998
 
987
        for c in range(nbCols):
999
        for c in range(nbCols):
988
            if (len(data[c]) % 2) != 0:
1000
            if (len(data[c]) % 2) != 0:
989
                data[c].append(data[c][-1])
1001
                data[c].append(data[c][-1])
990
            self.AddTest(descr[c], 0, 0, int(speed[c]), channel[c], data[c])
1002
            self.AddTest(descr[c], 0, 0, int(speed[c]), channel[c], data[c])
991
           
1003
           
992
    def startMeasure(self, measureParams, dialog):
1004
    def startMeasure(self, measureParams, dialog):
993
        print "Start measuring"
1005
        print "Start measuring"
994
       
1006
       
995
        measureParams.serialPort = self.settings["serialport"].value
1007
        measureParams.serialPort = self.settings["serialport"].value
996
        measureParams.motorStartupSpeed = self.settings["startupspeed"].value
1008
        measureParams.motorStartupSpeed = self.settings["startupspeed"].value
997
        measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value
1009
        measureParams.motorStartupSettlingTime = self.settings["startupsettling"].value
-
 
1010
        measureParams.minVoltage = self.settings["minvoltage"].value
-
 
1011
        measureParams.maxVoltage = self.settings["maxvoltage"].value        
998
       
1012
       
999
        self.measureThread = MeasureThread(measureParams, dialog)
1013
        self.measureThread = MeasureThread(measureParams, dialog)
1000
        self.measureThread.start()
1014
        self.measureThread.start()
1001
       
1015
       
1002
    def cancelMeasurement(self):
1016
    def cancelMeasurement(self):
1003
        print "Measuring CANCEL"
1017
        print "Measuring CANCEL"
1004
       
1018
       
1005
        self.measureThread.stop()
1019
        self.measureThread.stop()
1006
       
1020
       
1007
       
1021
       
1008
       
1022
       
1009
       
1023
       
1010
       
1024
       
1011
           
1025
           
1012
 
1026
 
1013
       
1027
       
1014
# end of class App
1028
# end of class App
1015
 
1029
 
1016
if __name__ == "__main__":
1030
if __name__ == "__main__":
1017
 
1031
 
1018
    rootPath = os.path.abspath(os.path.dirname(sys.argv[0]))
1032
    rootPath = os.path.abspath(os.path.dirname(sys.argv[0]))
1019
   
1033
   
1020
    print rootPath
1034
    print rootPath
1021
 
1035
 
1022
    VibrationTestGui = App(0)
1036
    VibrationTestGui = App(0)
1023
    VibrationTestGui.MainLoop()
1037
    VibrationTestGui.MainLoop()
1024
 
1038