#!/usr/bin/python
from e_series import e_series

#http://www.mikrocontroller.net/topic/331314

#Thevenin-Aequiv. zu Spannungsteiler aus R1=R6=10k mit R3=R4=0
Vx=2.5
Rx=5000.0

#list with the differences of consecutive list elements
def listdiff(t):
    return [j-i for i, j in zip(t[:-1], t[1:])]

#value of two parallel resistors
def par(a, b):
    return (a * b) / (a + b)

#factor of voltage divider
def vdiv(top, bottom):
    return bottom / (top + bottom)

# Lin. ueberlagerung der Spannungen von Schaltern und Spgsteiler
# fuer einen Schalterzustand
# ra = R2, rb = R5
def voltage(sa, sb, ra, rb):
    if sa == None and sb == None:
        return Vx
    if sa == None:
        return Vx * vdiv(Rx, rb) + sb * vdiv(rb, Rx)
    if sb == None:
        return Vx * vdiv(Rx, ra) + sa * vdiv(ra, Rx)
    return Vx * vdiv(Rx, par(ra, rb)) + sa * vdiv(ra, par(rb, Rx)) + sb * vdiv(rb, par(Rx, ra))

# alle moeglichen Schaltzustaende. None heisst offen
def switch_states():
    for a in [0.0, None, 5.0]:
        for b in [0.0, None, 5.0]:
            yield a, b

# list mit allen Spannungswerten am ADC, die bei den Widerstaenden ra und rb moeglich sind
def all_voltages(ra, rb):
    t = list()
    for sa, sb in switch_states():
        t.append(voltage(sa, sb, ra, rb))
    return t

# kleinste Spannungsdifferenz
def smallest_voltagediff(ra, rb):
    vs = all_voltages(ra, rb)
    vs.sort()
    diffs = listdiff(vs)
    return min(diffs)

if __name__ == '__main__':
    a = list()
    # 100R bis 220k sollten reichen:
    for ra in e_series(96, 100.0, 220000.0, adj = True):
        for rb in e_series(96, ra, 220000.0, adj = True):
            a.append([ra, rb, smallest_voltagediff(ra, rb)])
    # die groesste kleinste spannungsdifferenz suchen:
    best_res = max(a, key=lambda el: el[2])
    print best_res
