Subversion Repositories Projects

Rev

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

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