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)
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)
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))
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')
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
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)
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,]
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
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,])
def test_setpoint(self): epics.PV = FakeEpicsPV sig = EpicsSignal('connects') sig.wait_for_connection() sig.get_setpoint() sig.get_setpoint(as_string=True)
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
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
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)
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)
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)
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()
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()
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')
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
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
def test_setpoint(): sig = EpicsSignal('connects') sig.wait_for_connection() sig.get_setpoint() sig.get_setpoint(as_string=True)
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
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
def test_setpoint(): sig = EpicsSignal('connects') sig.wait_for_connection() sig.get_setpoint() sig.get_setpoint(as_string=True)
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
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
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
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
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
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