Rev 609 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
552 | fredericg | 1 | #! /usr/bin/env python |
2 | |||
3 | # |
||
4 | # Mikrokopter Vibration Test |
||
5 | # |
||
6 | # Author: FredericG |
||
7 | # |
||
8 | |||
9 | |||
10 | import mkProto |
||
11 | import time |
||
12 | import traceback |
||
13 | import getopt |
||
14 | import sys |
||
15 | |||
565 | FredericG | 16 | CHECK_VERSION = False |
552 | fredericg | 17 | |
18 | CHANNEL_NAMES = ["GyroYaw", "GyroRoll", "GyroNick", "Pressure", "Batt", "AccTop", "AccRoll", "AccNick"] |
||
19 | |||
20 | def usage(): |
||
21 | print |
||
22 | print "VibrationTest.py COMPORT MOTORS SPEEDS CHANNELS [-m MINSPEED] [-s NBSAMPLES] [-n NAME] [-d FILENAME] [-v]" |
||
23 | print " COMPORT Serial port to use. e.g. COM4" |
||
24 | print " MOTORS Motors to activate during test. Multiple motors can be used at the same time. e.g. 1,2,3,4" |
||
554 | FredericG | 25 | print " SPEEDS Indicates at what speeds the motors need to be tested. " |
26 | print " Format 1: e.g. 50,110,140 Tests at speeds 50, 110 and 140" |
||
27 | print " Format 2: e.g. 100-200:50 Tests at speeds 100, 150 and 200" |
||
552 | fredericg | 28 | print " CHANNELS Channels to monitor. e.g. 5,6,7" |
554 | FredericG | 29 | for i,channelName in enumerate(CHANNEL_NAMES): |
552 | fredericg | 30 | print " Channel %d = %s" % (i, channelName) |
31 | print " -m MINSPEED Minimum speed of the motor(s)" |
||
32 | print " -s NBSAMPLES Number of samples" |
||
33 | print " -n NAME Name of the test" |
||
34 | print " -d FILENAME File to which the measured values will be logged in" |
||
35 | print " -v Verbose" |
||
36 | print |
||
554 | FredericG | 37 | |
38 | def exit_usage(): |
||
39 | usage() |
||
40 | sys.exit(2) |
||
552 | fredericg | 41 | |
42 | if __name__ == '__main__': |
||
43 | |||
44 | #print sys.argv |
||
45 | if len(sys.argv)<5: |
||
554 | FredericG | 46 | exit_usage() |
552 | fredericg | 47 | |
48 | parComPort = sys.argv[1] |
||
49 | parMotors = sys.argv[2].split(',') |
||
50 | parChannels = sys.argv[4].split(',') |
||
554 | FredericG | 51 | |
52 | par = sys.argv[3] |
||
53 | if par.count("-") == 1: |
||
54 | # assume from-to:step format |
||
55 | par = par.split("-") |
||
56 | if len(par) != 2: |
||
57 | exit_usage() |
||
58 | |||
59 | par[1] = par[1].split(":") |
||
60 | if len(par[1]) != 2: |
||
61 | exit_usage() |
||
552 | fredericg | 62 | |
554 | FredericG | 63 | parSpeeds = range(int(par[0]),int(par[1][0])+int(par[1][1]),int(par[1][1])) |
64 | |||
65 | else: |
||
66 | parSpeeds = par.split(',') |
||
67 | |||
552 | fredericg | 68 | try: |
69 | opts, args = getopt.getopt(sys.argv[5:], "s:n:d:m:v") |
||
70 | except Exception, err: |
||
71 | print str(err) # will print something like "option -a not recognized" |
||
72 | usage() |
||
73 | sys.exit(2) |
||
74 | |||
75 | parVerbose = False |
||
76 | parFileName = None |
||
77 | parNbSamples = 400 |
||
78 | parMinSpeed = 25 |
||
79 | parTestName = "" |
||
80 | |||
81 | for o, a in opts: |
||
82 | if o == "-v": |
||
83 | parVerbose = True |
||
84 | elif o == "-d": |
||
85 | parFileName = a |
||
86 | elif o == "-s": |
||
87 | parNbSamples = int(a) |
||
88 | elif o == "-m": |
||
89 | parMinSpeed = int(a) |
||
90 | elif o == "-n": |
||
91 | parTestName = a |
||
92 | |||
93 | else: |
||
94 | assert False, "unhandled option %s" % (o) |
||
95 | |||
96 | if parVerbose: |
||
97 | print "comPort =", parComPort |
||
98 | print "motors =", parMotors |
||
99 | print "minSpeed =", parMinSpeed |
||
100 | print "speeds =", parSpeeds |
||
101 | print "channels =", parChannels |
||
102 | print "nbSamples=", parNbSamples |
||
103 | print "fileName =", parFileName |
||
104 | print "testName =", parTestName |
||
105 | |||
106 | |||
107 | try: |
||
108 | parMotors = map(int, parMotors) |
||
109 | parSpeeds = map(int, parSpeeds) |
||
110 | parChannels = map(int, parChannels) |
||
111 | |||
112 | |||
113 | if parVerbose: |
||
114 | print "Opening comPort... " |
||
115 | mk = mkProto.MkComm() |
||
116 | mk.open(comPort=parComPort) |
||
117 | |||
564 | FredericG | 118 | time.sleep(.1) |
552 | fredericg | 119 | msg = mk.getVersionMsg() |
556 | FredericG | 120 | version = msg.getVersion() |
552 | fredericg | 121 | if parVerbose: |
556 | FredericG | 122 | print "Version: %d.%d" % version |
565 | FredericG | 123 | if CHECK_VERSION and version != (0,74): |
556 | FredericG | 124 | print "INVALID VERSION", version |
125 | sys.exit(2) |
||
552 | fredericg | 126 | |
556 | FredericG | 127 | |
552 | fredericg | 128 | msg = mk.getDebugMsg() |
556 | FredericG | 129 | voltage = msg.getVoltage() |
564 | FredericG | 130 | if (voltage == 0): |
131 | minVoltage = 0 |
||
552 | fredericg | 132 | else: |
564 | FredericG | 133 | if (voltage > 4.2*3): |
134 | minVoltage = 4*3.5 |
||
135 | else: |
||
136 | minVoltage = 3*3.5 |
||
552 | fredericg | 137 | |
138 | if parVerbose: |
||
139 | print "Voltage: %2.1fV" % msg.getVoltage() |
||
140 | print "Minimum Voltage: %2.1fV" % minVoltage |
||
141 | |||
142 | motorStartSpeeds = [0,0,0,0] |
||
143 | |||
144 | if parVerbose: |
||
145 | print "Starting motor(s) (speed=%d)... " % (parMinSpeed), |
||
569 | FredericG | 146 | |
147 | for motor in parMotors: |
||
148 | motorStartSpeeds[motor-1] = parMinSpeed |
||
149 | for i in range(10): |
||
552 | fredericg | 150 | mk.setMotorTest(motorStartSpeeds) |
569 | FredericG | 151 | time.sleep(.1) |
552 | fredericg | 152 | |
153 | if parVerbose: |
||
154 | print "OK" |
||
155 | |||
156 | for speed in parSpeeds: |
||
157 | if len(parChannels)>1: |
||
158 | print |
||
159 | |||
160 | if parVerbose: |
||
161 | print "Setting speed to %3d ..." % speed |
||
162 | motorSpeeds = [0,0,0,0] |
||
163 | for motor in parMotors: |
||
164 | motorSpeeds[motor-1] = speed |
||
165 | for i in range(0,10): |
||
166 | time.sleep(.1) |
||
167 | mk.setMotorTest(motorSpeeds) |
||
564 | FredericG | 168 | |
552 | fredericg | 169 | for channel in parChannels: |
609 | FredericG | 170 | mk.setMotorTest(motorSpeeds) |
171 | |||
552 | fredericg | 172 | channelName = CHANNEL_NAMES[channel] |
173 | if parVerbose: |
||
174 | print "Getting data... " , |
||
175 | data = mk.doVibrationTest(motorSpeeds, parNbSamples, channel) |
||
556 | FredericG | 176 | #data = (0,1,2) |
553 | FredericG | 177 | minval = min(data[1:]) |
178 | maxval = max(data[1:]) |
||
556 | FredericG | 179 | #if (maxval-minval)>100: print data |
180 | time.sleep(.1) |
||
552 | fredericg | 181 | msg = mk.getDebugMsg() |
182 | voltage = msg.getVoltage() |
||
183 | |||
184 | if voltage<minVoltage: |
||
185 | print "VOLTAGE TOO LOW, TEST ABORTED" |
||
186 | sys.exit(2) |
||
564 | FredericG | 187 | |
556 | FredericG | 188 | pp = maxval-minval; |
189 | print "%10s Speed=%3d U=%2.1fV Channel=%-10s Min=%3d Max=%3d pp=%3d" % (parTestName, speed, voltage, channelName, minval, maxval, pp), |
||
190 | print "*"*(min(pp,200)/5) |
||
552 | fredericg | 191 | |
192 | if parFileName != None: |
||
193 | try: |
||
194 | logfile = open(parFileName, "r") |
||
195 | newFile = False |
||
196 | except: |
||
197 | newFile = True |
||
198 | |||
199 | if newFile: |
||
200 | logfile = open(parFileName, "w") |
||
201 | if parVerbose: |
||
202 | print "Writing result to %s ..." % parFileName, |
||
203 | logfile.write("%s %d %s\n" % (parTestName, speed, channelName)) |
||
204 | for value in data[1:]: |
||
205 | logfile.write("%d\n" % value) |
||
206 | logfile.close() |
||
207 | if parVerbose: |
||
208 | print "OK" |
||
209 | else: |
||
210 | if parVerbose: |
||
211 | print "Appending result to %s ..." % parFileName, |
||
212 | prevData = [] |
||
213 | for line in logfile: |
||
214 | prevData.append(line[:-1]) |
||
215 | logfile.close() |
||
216 | logfile = open(parFileName, "w") |
||
217 | logfile.write("%s,%s %d %s\n" % (prevData[0], parTestName, speed, channelName)) |
||
218 | i = 1 |
||
219 | for value in data[1:]: |
||
220 | logfile.write("%s,%d\n" % (prevData[i], value)) |
||
221 | i += 1 |
||
222 | logfile.close() |
||
223 | if parVerbose: |
||
224 | print "OK" |
||
564 | FredericG | 225 | |
226 | mk.close() |
||
227 | |||
552 | fredericg | 228 | except Exception,e: |
229 | print |
||
230 | print "== ERROR ==: \"%s\"" % e |
||
231 | if parVerbose: |
||
232 | print |
||
233 | print "Traceback:" |
||
234 | traceback.print_exc() |
||
235 | print |
||
236 | raw_input("Press ENTER, the application will close") |
||
564 | FredericG | 237 | print |
238 |