SW/ControlSW/Archive/Dirigent/1219BeforeGit/Infrastructure/WorkingGas.py

import time
from .psw_gw_instek import GWInstekPSW
from .tpg262_gnome232 import TPG262GNOME232


def write2file(fname, value):
    with open(fname, 'w') as f:
        f.write(str(value))


def fill_chamber(target_pressure, eps=0.1, start_v=10,
                 interval=0.5, proportional_const=1e-1, derivative_const=1e-1,
                 max_time=60, fail_pressure=200,
                 psw_address='192.168.2.75', gauge_address='192.168.2.246',
                 verbose=False):
    psw = GWInstekPSW(psw_address)
    gauge = TPG262GNOME232(gauge_address)
    v = start_v
    psw.set_voltage(v)
    psw.set_output(True)
    last_p = p = 0
    start_t = time.time()
    while True:
    #for x in range(10):    
        last_p = p
        p = gauge.get_pressure(1) * 1e3  # to mPa
        write2file('/dev/shm/pressure_chamber_mPa', p)
        if p > fail_pressure:
            psv.set_output(False)
            raise RuntimeError('pressure {} over limit {}'.format(p, fail_pressure))
        elapsed = time.time() - start_t
        if elapsed > max_time:
            raise RuntimeError('did not converge, maintaining pressure {}'.format(p))
        err = target_pressure - p
        change = p - last_p
        if abs(err) < eps and abs(change)/interval < eps:
            if verbose:
                print('reached pressure {} with error {} and change {} in {} seconds '.format(p, err, change, elapsed))
            break
        v += proportional_const * err - derivative_const * change / interval
        psw.set_voltage(v)
        if verbose:
            print('pressure {}, setting voltage {}'.format(p, v))
        time.sleep(interval)


def close_valve(psw_address='192.168.2.75'):
    psw = GWInstekPSW(psw_address)
    psw.set_output(False)