File: eval.py

package info (click to toggle)
frama-c 20161101%2Bsilicon%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 42,324 kB
  • ctags: 35,695
  • sloc: ml: 200,142; ansic: 31,465; makefile: 2,334; sh: 1,643; lisp: 259; python: 85; asm: 26
file content (90 lines) | stat: -rw-r--r-- 3,519 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import sys
import math

testcase = [ [ [  50000, "moveto",  15 ],
               [  70000, "moveto", -55 ],
               [ 100000, "moveto",  30 ],
               [ 160000, "shutoff",  0 ] ],
             [ [  30000, "moveto",  25 ],
               [  50000, "moveby", -70 ],
               [ 160000, "moveto", -20 ],
               [ 180000, "shutoff",  0 ] ],
             [ [  60000, "moveto", -30 ],
               [ 100000, "moveto",  30 ],
               [ 140000, "moveto", -10 ],
               [ 180000, "shutoff",  0 ] ],
             [ [  60000, "moveto",  20 ],
               [ 100000, "moveto", -20 ],
               [ 110000, "moveto",  20 ] ] ]

def checkSpeed(time, angleDiff, timeDiff):
    if timeDiff != 0:
        speed = float(angleDiff) / (timeDiff / 1000.0)
        if math.fabs(angleDiff) > 6.0 and math.fabs(speed) < 1.0:
            print "%d: TOO SLOW / TARGET NOT REACHED!" % time
            return False
    return True

if __name__ == '__main__':
    if len (sys.argv) != 2:
        print >>sys.stderr, "usage: python " + sys.argv[0] + " <testcase_number>\n"
    
    tc = int(sys.argv[1])
    pos = 0
    header = None
    cmd = None
    lastVoltage = 0.0
    lastAngle = 0.0
    lastTime = 0.0
    startAngle = 0.0
    voltageStableCounter = 0
    targetReached = False#
    errorCount = 0
    index = {}
    for line in sys.stdin.readlines():
        line = line.strip("\n")
        if header == None:
            header = line.split()
            for i in range(0, len(header)):
                index[header[i]] = i
        else:
            data = line.split()
            time = int(data[index["time(ms)"]])
            voltage = float(data[index["engineVoltage"]])
            angle = float(data[index["legAngle"]])
            angleValid = int(data[index["legAngleValid"]]) == 1
            isActive = int(data[index["isActive"]]) == 1
            if pos < len(testcase[tc]) and time >= testcase[tc][pos][0]:
                if not targetReached and cmd != None:
                    if not checkSpeed(time, cmd[2]-startAngle, time-cmd[0]):
                        errorCount += 1
                cmd = testcase[tc][pos]
                if cmd[1] == "moveby":
                    cmd[1] = "moveto"
                    cmd[2] = testcase[tc][pos-1][2] + cmd[2]
                pos += 1
                targetReached = False
                startAngle = angle
            moves = math.fabs(angle - lastAngle) > 0.1
            voltageZero = math.fabs(voltage - lastVoltage) < 0.1
            if voltageZero:
                voltageStableCounter += 1
            else:
                voltageStableCounter = 0
            voltageDiff = math.fabs(voltage - lastVoltage)
            if cmd != None and math.fabs(voltageDiff) > 2.0:
                print "%d: VOLTAGE JUMP!" % time
                errorCount += 1
            if cmd != None and voltageStableCounter >= 5 and not moves and not targetReached:
                if math.fabs(angle - cmd[2]) < 0.5:
                    targetReached = True
                    if not checkSpeed(time, cmd[2] - startAngle, time - cmd[0]):
                        errorCount += 1
            lastAngle = angle
            lastVoltage = voltage
            lastTime = time
    if not targetReached and cmd != None:
        if not checkSpeed(time, time-cmd[0], cmd[2]-startAngle):
            errorCount += 1

    print "found %d error(s)" % (errorCount)