def test_fakepv(): pvname = 'fakepv_nowaythisexists' * 10 info = dict(called=False) def conn(**kwargs): info['conn'] = True info['conn_kw'] = kwargs def value_cb(**kwargs): info['value'] = True info['value_kw'] = kwargs cl = get_cl() pv = cl.get_pv(pvname, callback=value_cb, connection_callback=conn) if not pv.wait_for_connection(): raise ValueError('should return True on connection') assert pv.pvname == pvname pv._update_rate = 0.5 time.sleep(0.2) assert info['conn'] assert info['value'] assert info['value_kw']['value'] == pv.value
def move(self, *args, **kwargs): status = super(Motor, self).move(*args, **kwargs) def statusmonitor_thread(): thisthread = self._status_threads[-1] try: while True: time.sleep(.01) # check if within threshold if abs( self.user_readback.get(use_monitor=False) - self.user_setpoint.get()) < .0001: success = True break except TimeoutError: # logger.debug('automonitor(%r, %s) timed out', self.name) success = False except Exception as ex: # logger.debug('automonitor(%r, %s) failed', self.name, exc_info=ex) success = False finally: status._finished(success=success) self._status_threads.remove(thisthread) del thisthread statusthread = get_cl().thread_class(target=statusmonitor_thread) self._status_threads.append(statusthread) statusthread.daemon = True statusthread.start() return status
def test_pv_form(): from ophyd import get_cl o_ps = pytest.importorskip('ophyd._pyepics_shim') cl = get_cl() assert cl.pv_form in ('native', 'time') versions = ('3.2.3', '3.2.3rc1', '3.2.3-gABCD', 'unknown') for version in versions: assert o_ps.get_pv_form(version) in ('native', 'time')
def test_pv_form(self): from ophyd import get_cl o_ps = pytest.importorskip('ophyd._pyepics_shim') cl = get_cl() self.assertIn(cl.pv_form, ('native', 'time')) versions = ('3.2.3', '3.2.3rc1', '3.2.3-gABCD', 'unknown') for version in versions: self.assertIn(o_ps.get_pv_form(version), ('native', 'time'))
def test_pvpositioner_with_fake_motor(fake_motor_ioc): def callback(sub_type=None, timestamp=None, value=None, **kwargs): logger.info('[callback] [%s] (type=%s) value=%s', timestamp, sub_type, value) def done_moving(value=0.0, **kwargs): logger.info('Done moving %s', kwargs) cl = get_cl() # ensure we start at 0 for this simple test cl.caput(fake_motor_ioc.pvs['setpoint'], 0) cl.caput(fake_motor_ioc.pvs['actuate'], 1) time.sleep(0.5) class MyPositioner(PVPositioner): '''Setpoint, readback, no put completion. No done pv.''' setpoint = Cpt(EpicsSignal, fake_motor_ioc.pvs['setpoint']) readback = Cpt(EpicsSignalRO, fake_motor_ioc.pvs['readback']) actuate = Cpt(EpicsSignal, fake_motor_ioc.pvs['actuate']) stop_signal = Cpt(EpicsSignal, fake_motor_ioc.pvs['stop']) done = Cpt(EpicsSignal, fake_motor_ioc.pvs['moving']) actuate_value = 1 stop_value = 1 done_value = 0 pos = MyPositioner('', name='pv_pos_fake_mtr') print('fake mtr', pos.describe()) pos.wait_for_connection() pos.subscribe(callback, event_type=pos.SUB_DONE) pos.subscribe(callback, event_type=pos.SUB_READBACK) logger.info('---- test #1 ----') logger.info('--> move to 1') pos.move(1, timeout=5) assert pos.position == 1 logger.info('--> move to 0') pos.move(0, timeout=5) assert pos.position == 0 logger.info('---- test #2 ----') logger.info('--> move to 1') pos.move(1, wait=False) time.sleep(0.5) logger.info('--> stop') pos.stop() logger.info('--> sleep') time.sleep(1) logger.info('--> move to 0') pos.move(0, wait=False, moved_cb=done_moving) logger.info('--> post-move request, moving=%s', pos.moving) time.sleep(2) pos.read() repr(pos) str(pos)
def test_epicssignal_pv_reuse(cleanup, pvname, count): signals = [EpicsSignal(pvname, name='sig') for i in range(count)] for sig in signals: cleanup.add(sig) sig.wait_for_connection() assert sig.connected assert sig.get() is not None if get_cl().name == 'pyepics': assert len(set(id(sig._read_pv) for sig in signals)) == 1
def test_many_connect(ad_prefix, cleanup): import ophyd pytest.skipif( ophyd.get_cl().name == 'pyepics', "This is exposing race conditions in pyepics which " "cause segfaults.") import gc fs = DummyFS() class FS_hdf(HDF5Plugin, FileStoreHDF5, FileStoreIterativeWrite): pass class MyDetector(SingleTrigger, SimDetector): hdf1 = Cpt(FS_hdf, 'HDF1:', write_path_template='', read_path_template='', root='/', reg=fs) try: from caproto.threading import client except ImportError: # caproto unavailable on python 3.5 pass else: if client.SEARCH_MAX_DATAGRAM_BYTES > 1450: # old caproto compatibility - later versions lower to standardish # MTU-levels client.SEARCH_MAX_DATAGRAM_BYTES = 1450 def tester(): det = MyDetector(ad_prefix, name='det') print('made detector') try: print('*' * 25) print('about to murder socket') det.cam.acquire._read_pv._caproto_pv.circuit_manager._disconnected( ) print('murdered socket') print('*' * 25) except AttributeError: # must be pyepics pass det.destroy() del det gc.collect() for j in range(5): print(j) tester()
def wrapped(*args, **kwargs): cl = get_cl() get_pv_backup = cl.get_pv def _fake_get_pv(pvname, form='time', connect=False, context=False, timout=5.0, **kw): return FakeEpicsWaveform(pvname, form=form, **kw) cl.get_pv = _fake_get_pv try: return fcn(*args, **kwargs) finally: cl.get_pv = get_pv_backup _cleanup_fake_pvs()
def test_pvpositioner_with_fake_motor(self): def callback(sub_type=None, timestamp=None, value=None, **kwargs): logger.info('[callback] [%s] (type=%s) value=%s', timestamp, sub_type, value) def done_moving(value=0.0, **kwargs): logger.info('Done moving %s', kwargs) cl = get_cl() # ensure we start at 0 for this simple test fm = self.fake_motor cl.caput(fm['setpoint'], 0.05) time.sleep(0.5) cl.caput(fm['actuate'], 1) time.sleep(0.5) cl.caput(fm['setpoint'], 0) time.sleep(0.5) cl.caput(fm['actuate'], 1) time.sleep(0.5) class MyPositioner(PVPositioner): '''Setpoint, readback, no put completion. No done pv.''' setpoint = C(EpicsSignal, fm['setpoint']) readback = C(EpicsSignalRO, fm['readback']) actuate = C(EpicsSignal, fm['actuate']) stop_signal = C(EpicsSignal, fm['stop']) done = C(EpicsSignal, fm['moving']) actuate_value = 1 stop_value = 1 done_value = 1 pos = MyPositioner('', name='pv_pos_fake_mtr') print('fake mtr', pos.describe()) pos.wait_for_connection() pos.subscribe(callback, event_type=pos.SUB_DONE) pos.subscribe(callback, event_type=pos.SUB_READBACK) logger.info('---- test #1 ----') logger.info('--> move to 1') pos.move(1, timeout=5) self.assertEqual(pos.position, 1) logger.info('--> move to 0') pos.move(0, timeout=5) self.assertEqual(pos.position, 0) logger.info('---- test #2 ----') logger.info('--> move to 1') pos.move(1, wait=False) time.sleep(0.5) logger.info('--> stop') pos.stop() logger.info('--> sleep') time.sleep(1) logger.info('--> move to 0') pos.move(0, wait=False, moved_cb=done_moving) logger.info('--> post-move request, moving=%s', pos.moving) time.sleep(2) pos.read() repr(pos) str(pos)
def get_dispatcher(self): return ophyd.get_cl().get_dispatcher()
def get_dispatcher(): """Get the ophyd-configured dispatcher (pyepics_shim, etc.).""" return ophyd.get_cl().get_dispatcher()