Subversion Repositories Projects

Rev

Rev 718 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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