예제 #1
0
def test_epicssignal_set(put_complete):
    sim_pv = EpicsSignal(write_pv='XF:31IDA-OP{Tbl-Ax:X1}Mtr.VAL',
                         read_pv='XF:31IDA-OP{Tbl-Ax:X1}Mtr.RBV',
                         put_complete=put_complete)
    sim_pv.wait_for_connection()

    logging.getLogger('ophyd.signal').setLevel(logging.DEBUG)
    logging.getLogger('ophyd.utils.epics_pvs').setLevel(logging.DEBUG)
    print('tolerance=', sim_pv.tolerance)
    assert sim_pv.tolerance is not None

    start_pos = sim_pv.get()

    # move to +0.2 and check the status object
    target = sim_pv.get() + 0.2
    st = sim_pv.set(target, timeout=1, settle_time=0.001)
    wait(st, timeout=5)
    assert st.done
    assert st.success
    print('status 1', st)
    assert abs(target - sim_pv.get()) < 0.05

    # move back to -0.2, forcing a timeout with a low value
    target = sim_pv.get() - 0.2
    st = sim_pv.set(target, timeout=1e-6)
    time.sleep(0.1)
    print('status 2', st)
    assert st.done
    assert not st.success

    # keep the axis in position
    st = sim_pv.set(start_pos)
    wait(st, timeout=5)
예제 #2
0
    def test_epicssignal_readwrite(self):
        epics.PV = FakeEpicsPV

        signal = EpicsSignal('readpv', write_pv='writepv')
        signal.wait_for_connection()

        self.assertEquals(signal.setpoint_pvname, 'writepv')
        self.assertEquals(signal.pvname, 'readpv')
        signal.value

        signal._update_rate = 2
        time.sleep(0.2)

        value = 10
        signal.value = value
        signal.setpoint = value
        self.assertEquals(signal.setpoint, value)
        signal.setpoint_ts

        signal.limits
        signal.precision
        signal.timestamp

        signal.read()
        signal.describe()
        signal.read_configuration()
        signal.describe_configuration()

        eval(repr(signal))
        time.sleep(0.2)
예제 #3
0
def test_epicssignal_get_in_callback(cleanup, fake_motor_ioc):
    pvs = fake_motor_ioc.pvs
    sig = EpicsSignal(write_pv=pvs['setpoint'], read_pv=pvs['readback'],
                      name='motor')
    cleanup.add(sig)

    called = []

    def generic_sub(sub_type, **kwargs):
        called.append((sub_type, sig.get(), sig.get_setpoint()))

    for event_type in (sig.SUB_VALUE, sig.SUB_META,
                       sig.SUB_SETPOINT, sig.SUB_SETPOINT_META):
        sig.subscribe(generic_sub, event_type=event_type)

    sig.wait_for_connection()

    sig.put(1, wait=True)
    sig.put(2, wait=True)
    time.sleep(0.5)

    print(called)
    # Arbitrary threshold, but if @klauer screwed something up again, this will
    # blow up
    assert len(called) < 20
    print('total', len(called))
예제 #4
0
def test_epicssignal_readwrite_limits():
    signal = EpicsSignal('readpv', write_pv='readpv', limits=True)

    signal.wait_for_connection()
    signal.check_value((signal.low_limit + signal.high_limit) / 2)

    try:
        signal.check_value(None)
    except ValueError:
        pass
    else:
        raise ValueError('value=None')

    try:
        signal.check_value(signal.low_limit - 1)
    except ValueError:
        pass
    else:
        raise ValueError('lower limit %s' % (signal.limits, ))

    try:
        signal.check_value(signal.high_limit + 1)
    except ValueError:
        pass
    else:
        raise ValueError('upper limit')
예제 #5
0
def test_epicssignal_sub_setpoint(cleanup, fake_motor_ioc):
    pvs = fake_motor_ioc.pvs
    pv = EpicsSignal(write_pv=pvs['setpoint'], read_pv=pvs['readback'],
                     name='pv')
    cleanup.add(pv)

    setpoint_called = []
    setpoint_meta_called = []

    def sub_setpoint(old_value, value, **kwargs):
        setpoint_called.append((old_value, value))

    def sub_setpoint_meta(timestamp, **kwargs):
        setpoint_meta_called.append(timestamp)

    pv.subscribe(sub_setpoint, event_type=pv.SUB_SETPOINT)
    pv.subscribe(sub_setpoint_meta, event_type=pv.SUB_SETPOINT_META)

    pv.wait_for_connection()

    pv.put(1, wait=True)
    pv.put(2, wait=True)
    time.sleep(0.5)

    assert len(setpoint_called) >= 3
    assert len(setpoint_meta_called) >= 3
예제 #6
0
def test_epicssignal_readwrite():
    signal = EpicsSignal('readpv', write_pv='writepv')

    signal.wait_for_connection()
    assert signal.setpoint_pvname == 'writepv'
    assert signal.pvname == 'readpv'
    signal.value

    signal._update_rate = 2
    time.sleep(0.2)

    value = 10
    signal.value = value
    signal.setpoint = value
    assert signal.setpoint == value
    signal.setpoint_ts

    signal.limits
    signal.precision
    signal.timestamp

    signal.read()
    signal.describe()
    signal.read_configuration()
    signal.describe_configuration()

    eval(repr(signal))
    time.sleep(0.2)
예제 #7
0
def test_describe():
    sig = EpicsSignal('my_pv')
    sig._write_pv.enum_strs = ('enum1', 'enum2')
    sig.wait_for_connection()

    sig.put(1)
    desc = sig.describe()['my_pv']
    assert desc['dtype'] == 'integer'
    assert desc['shape'] == []
    assert 'precision' in desc
    assert 'enum_strs' in desc
    assert 'upper_ctrl_limit' in desc
    assert 'lower_ctrl_limit' in desc

    sig.put('foo')
    desc = sig.describe()['my_pv']
    assert desc['dtype'] == 'string'
    assert desc['shape'] == []

    sig.put(3.14)
    desc = sig.describe()['my_pv']
    assert desc['dtype'] == 'number'
    assert desc['shape'] == []

    import numpy as np
    sig.put(np.array([1,]))
    desc = sig.describe()['my_pv']
    assert desc['dtype'] == 'array'
    assert desc['shape'] == [1,]
예제 #8
0
def pair_signal(cleanup, signal_test_ioc):
    sig = EpicsSignal(read_pv=signal_test_ioc.pvs['pair_rbv'],
                      write_pv=signal_test_ioc.pvs['pair_set'],
                      name='pair')
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #9
0
    def test_describe(self):
        epics.PV = FakeEpicsPV
        sig = EpicsSignal('my_pv')
        sig._write_pv.enum_strs = ('enum1', 'enum2')
        sig.wait_for_connection()

        sig.put(1)
        desc = sig.describe()['my_pv']
        self.assertEquals(desc['dtype'], 'integer')
        self.assertEquals(desc['shape'], [])
        self.assertIn('precision', desc)
        self.assertIn('enum_strs', desc)
        self.assertIn('upper_ctrl_limit', desc)
        self.assertIn('lower_ctrl_limit', desc)

        sig.put('foo')
        desc = sig.describe()['my_pv']
        self.assertEquals(desc['dtype'], 'string')
        self.assertEquals(desc['shape'], [])

        sig.put(3.14)
        desc = sig.describe()['my_pv']
        self.assertEquals(desc['dtype'], 'number')
        self.assertEquals(desc['shape'], [])

        import numpy as np
        sig.put(np.array([1,]))
        desc = sig.describe()['my_pv']
        self.assertEquals(desc['dtype'], 'array')
        self.assertEquals(desc['shape'], [1,])
예제 #10
0
    def test_setpoint(self):
        epics.PV = FakeEpicsPV
        sig = EpicsSignal('connects')
        sig.wait_for_connection()

        sig.get_setpoint()
        sig.get_setpoint(as_string=True)
예제 #11
0
def test_epicssignal_waveform():
    def update_cb(value=None, **kwargs):
        assert value in FakeEpicsWaveform.strings

    signal = EpicsSignal('readpv', string=True)

    signal.wait_for_connection()

    signal.subscribe(update_cb, event_type=signal.SUB_VALUE)
    assert signal.value in FakeEpicsWaveform.strings
예제 #12
0
def test_enum_strs():
    sig = EpicsSignal('connects')
    sig.wait_for_connection()

    enums = ['enum_strs']

    # hack this onto the FakeEpicsPV
    sig._read_pv.enum_strs = enums

    assert sig.enum_strs == enums
예제 #13
0
    def test_epicssignal_waveform(self):
        epics.PV = FakeEpicsWaveform

        def update_cb(value=None, **kwargs):
            self.assertIn(value, FakeEpicsWaveform.strings)

        signal = EpicsSignal('readpv', string=True)
        signal.wait_for_connection()

        signal.subscribe(update_cb)
        self.assertIn(signal.value, FakeEpicsWaveform.strings)
예제 #14
0
def test_epicssignal_waveform(cleanup, signal_test_ioc):
    def update_cb(value=None, **kwargs):
        assert len(value) > 1

    signal = EpicsSignal(signal_test_ioc.pvs['waveform'], string=True)
    cleanup.add(signal)
    signal.wait_for_connection()

    sub = signal.subscribe(update_cb, event_type=signal.SUB_VALUE)
    assert len(signal.value) > 1
    signal.unsubscribe(sub)
예제 #15
0
    def test_enum_strs(self):
        epics.PV = FakeEpicsPV
        sig = EpicsSignal('connects')
        sig.wait_for_connection()

        enums = ['enum_strs']

        # hack this onto the FakeEpicsPV
        sig._read_pv.enum_strs = enums

        self.assertEquals(sig.enum_strs, enums)
예제 #16
0
def test_no_connection(cleanup, signal_test_ioc):
    sig = EpicsSignal('does_not_connect')
    cleanup.add(sig)

    with pytest.raises(TimeoutError):
        sig.wait_for_connection()

    sig = EpicsSignal('does_not_connect')
    cleanup.add(sig)

    with pytest.raises(TimeoutError):
        sig.put(0.0)

    with pytest.raises(TimeoutError):
        sig.get()

    sig = EpicsSignal(signal_test_ioc.pvs['read_only'], write_pv='does_not_connect')
    cleanup.add(sig)
    with pytest.raises(TimeoutError):
        sig.wait_for_connection()
예제 #17
0
def test_no_connection(cleanup, signal_test_ioc):
    sig = EpicsSignal('does_not_connect')
    cleanup.add(sig)

    with pytest.raises(TimeoutError):
        sig.wait_for_connection()

    sig = EpicsSignal('does_not_connect')
    cleanup.add(sig)

    with pytest.raises(TimeoutError):
        sig.put(0.0)

    with pytest.raises(TimeoutError):
        sig.get()

    sig = EpicsSignal(signal_test_ioc.pvs['read_only'],
                      write_pv='does_not_connect')
    cleanup.add(sig)
    with pytest.raises(TimeoutError):
        sig.wait_for_connection()
예제 #18
0
def test_enum_strs(cleanup, signal_test_ioc):
    sig = EpicsSignal(signal_test_ioc.pvs['bool_enum'])
    cleanup.add(sig)
    sig.wait_for_connection()

    assert sig.enum_strs == ('Off', 'On')
예제 #19
0
def alarm_status_signal(cleanup, signal_test_ioc):
    sig = EpicsSignal(signal_test_ioc.pvs['alarm_status'], name='alarm_status')
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #20
0
def bool_enum_signal(cleanup, signal_test_ioc):
    sig = EpicsSignal(signal_test_ioc.pvs['bool_enum'], name='bool_enum')
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #21
0
def test_setpoint():
    sig = EpicsSignal('connects')
    sig.wait_for_connection()

    sig.get_setpoint()
    sig.get_setpoint(as_string=True)
예제 #22
0
def motor_pair_signal(cleanup, motor):
    sig = EpicsSignal(write_pv=motor.user_setpoint.pvname,
                      read_pv=motor.user_readback.pvname)
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #23
0
def rw_signal(cleanup, signal_test_ioc):
    sig = EpicsSignal(signal_test_ioc.pvs['read_write'], name='read_write')
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #24
0
def test_setpoint():
    sig = EpicsSignal('connects')
    sig.wait_for_connection()

    sig.get_setpoint()
    sig.get_setpoint(as_string=True)
예제 #25
0
def set_severity_signal(cleanup, signal_test_ioc):
    sig = EpicsSignal(signal_test_ioc.pvs['set_severity'], name='set_severity')
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #26
0
def alarm_status_signal(cleanup, signal_test_ioc):
    sig = EpicsSignal(signal_test_ioc.pvs['alarm_status'], name='alarm_status')
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #27
0
def set_severity_signal(cleanup, signal_test_ioc):
    sig = EpicsSignal(signal_test_ioc.pvs['set_severity'], name='set_severity')
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #28
0
def motor_pair_signal(cleanup, motor):
    sig = EpicsSignal(write_pv=motor.user_setpoint.pvname,
                      read_pv=motor.user_readback.pvname)
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #29
0
def rw_signal(cleanup, signal_test_ioc):
    sig = EpicsSignal(signal_test_ioc.pvs['read_write'], name='read_write')
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig
예제 #30
0
def bool_enum_signal(cleanup, signal_test_ioc):
    sig = EpicsSignal(signal_test_ioc.pvs['bool_enum'], name='bool_enum')
    cleanup.add(sig)
    sig.wait_for_connection()
    return sig