aboutsummaryrefslogtreecommitdiff
path: root/bin/dac-scale.py
blob: d57f8c94937755f7eba888b5a855ad993fced345 (plain)
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
#!/usr/bin/env python

#
# Calculates DAC values and Vref values from a list of raw intensity values
# Usage: dac-scale.py 5,11,18,25,...,370474,384985,400000
# Output: #defines suitable for use in hw/*/anduril.h
# Assumptions:
# - DAC data range is 0 to 1023
# - DAC Vrefs are 1.024V and 2.5V
# - HDR is available and has 2 steps
# - HDR channel ratio is "highest_ramp_value / 2500"
#
# Output values thus have 4 "engine gears":
# - HDR low , 1.024V Vref
# - HDR low , 2.5  V Vref
# - HDR high, 1.024V Vref
# - HDR high, 2.5  V Vref
#

def main(args):
    max_pwm = 1023
    raw_pwm = [int(x) for x in args[0].split(',')]
    ratio = raw_pwm[-1] / 2500.0
    cooked = [[]]

    def limit(p):
        return min(max_pwm, int(p))

    phase = 0
    for raw in raw_pwm:
        if 0 == phase:
            if raw <= 1023:
                cooked[-1].append(limit(raw))
            else:
                phase += 1
                cooked.append([])
        if 1 == phase:
            if raw <= int(2500):
                cooked[-1].append(limit(raw * 1.024 / 2.5))
            else:
                phase += 1
                cooked.append([])
        if 2 == phase:
            if raw <= int(1024 * ratio):
                cooked[-1].append(limit(raw / ratio))
            else:
                phase += 1
                cooked.append([])
        if 3 == phase:
            cooked[-1].append(limit(raw * 1.024 / 2.5 / ratio))

    # "gear change" boundaries
    b1 =      len(cooked[0])
    b2 = b1 + len(cooked[1])
    b3 = b2 + len(cooked[2])
    b4 = b3 + len(cooked[3])

    #print(','.join(['%4i' % n for n in cooked]))

    def fmt_pwms(l):
        return ','.join(['%4i' % n for n in l])

    def fmt_tops(v, l):
        return ','.join([' %s' % v for n in l])

    lines = []

    lines.append('// top level for each "gear": %i %i %i %i' % (b1, b2, b3, b4))

    lines.append('#define PWM1_LEVELS \\')
    lines.append('        ' + fmt_pwms(cooked[0]) + ', \\')
    lines.append('        ' + fmt_pwms(cooked[1]) + ', \\')
    lines.append('        ' + fmt_pwms(cooked[2]) + ', \\')
    lines.append('        ' + fmt_pwms(cooked[3]))
    lines.append('#define PWM2_LEVELS \\')
    lines.append('        ' + fmt_tops('V10', cooked[0]) + ', \\')
    lines.append('        ' + fmt_tops('V25', cooked[1]) + ', \\')
    lines.append('        ' + fmt_tops('V10', cooked[2]) + ', \\')
    lines.append('        ' + fmt_tops('V25', cooked[3]))

    lines.append('#define MAX_1x7135           %3i' % b2)
    lines.append('#define HDR_ENABLE_LEVEL_MIN %3i' % (b2+1))

    print('\n'.join(lines))

if __name__ == "__main__":
    import sys
    main(sys.argv[1:])