"""LCENJ, CC0-1.0: hypothetical INA169 calculations, no device access.
Run with Python 3.10+. These checks do not validate a physical sensor.
"""
from math import isclose, pi

def output_voltage(current_a, shunt_ohm, load_ohm=10_000):
    return current_a * shunt_ohm * load_ohm / 1_000

def current_from_voltage(voltage_v, shunt_ohm, load_ohm=10_000):
    return voltage_v * 1_000 / (shunt_ohm * load_ohm)

def exercise():
    supply_v, load_ohm, shunt_ohm = 5.0, 490.0, 10.0
    current_a = supply_v / (load_ohm + shunt_ohm)
    drop_v = current_a * shunt_ohm
    out_v = output_voltage(current_a, shunt_ohm)
    assert isclose(current_a, .010)
    assert isclose(drop_v, .100)
    assert isclose(supply_v - drop_v, 4.900)
    assert isclose(out_v, 1.000)
    assert isclose(current_a ** 2 * shunt_ohm, .001)
    assert isclose(current_from_voltage(out_v, shunt_ohm), current_a)
    parallel_ohm = 1 / (1 / 10 + 1 / 1)
    indicated_a = current_from_voltage(output_voltage(.100, parallel_ohm), 1)
    assert isclose(parallel_ohm, 10 / 11)
    assert isclose(indicated_a, 1 / 11)
    assert isclose(3.5 ** 2 * .1, 1.225)
    step_a = current_from_voltage(5 / 1023, shunt_ohm)
    raw_205_a = current_from_voltage(205 * 5 / 1023, shunt_ohm)
    assert 48.8e-6 < step_a < 49e-6
    assert format(raw_205_a, '.3f') == '0.010'
    tau_s = 10_000 * 100e-9
    cutoff_hz = 1 / (2 * pi * tau_s)
    assert isclose(tau_s, .001)
    assert 159 < cutoff_hz < 160
    return {'current_A': current_a, 'shunt_drop_V': drop_v,
            'output_V': out_v, 'parallel_shunt_ohm': parallel_ohm,
            'indicated_for_actual_100mA_A': indicated_a,
            'endpoint_model_step_A': step_a, 'raw_205_A': raw_205_a,
            'proposed_filter_tau_s': tau_s, 'proposed_filter_cutoff_Hz': cutoff_hz}

if __name__ == '__main__':
    import json
    print(json.dumps({'hypothetical_calculations_passed': True,
                      'hardware_test': False, 'results': exercise()}, indent=2))
