1111# #
1212#####################################################################
1313from __future__ import division , unicode_literals , print_function , absolute_import
14+ import time
1415from labscript_utils import PY2
1516if PY2 :
1617 str = unicode
1920# and labscript. The device is a PseudoclockDevice, and can be the sole device
2021# in a connection table or experiment.
2122
22-
23+ import labscript_utils .h5_lock
24+ import h5py
2325from labscript_devices import labscript_device , BLACS_tab , BLACS_worker
2426from labscript import PseudoclockDevice , Pseudoclock , ClockLine
27+ import labscript_utils .properties as properties
28+
2529
2630@labscript_device
2731class DummyPseudoclock (PseudoclockDevice ):
@@ -38,7 +42,7 @@ def __init__(self, name='dummy_pseudoclock', BLACS_connection='dummy_connection'
3842
3943 def generate_code (self , hdf5_file ):
4044 group = self .init_device_group (hdf5_file )
41-
45+ self . set_property ( 'stop_time' , self . stop_time , location = 'device_properties' )
4246
4347from blacs .device_base_class import DeviceTab , define_state , MODE_BUFFERED
4448from blacs .tab_base_classes import Worker
@@ -53,17 +57,47 @@ def initialise_workers(self):
5357
5458 @define_state (MODE_BUFFERED , True )
5559 def start_run (self , notify_queue ):
56- notify_queue .put ('done' )
60+ self .wait_until_done (notify_queue )
61+
62+ @define_state (MODE_BUFFERED ,True )
63+ def wait_until_done (self , notify_queue ):
64+ """Call check_if_done repeatedly in the worker until the shot is complete"""
65+ done = yield (self .queue_work (self .primary_worker , 'check_if_done' ))
66+ # Experiment is over. Tell the queue manager about it:
67+ if done :
68+ notify_queue .put ('done' )
69+ else :
70+ # Not actual recursion since this just queues up another call
71+ # after we return:
72+ self .wait_until_done (notify_queue )
73+
5774
5875@BLACS_worker
5976class DummyPseudoclockWorker (Worker ):
6077 def program_manual (self , values ):
6178 return {}
6279
6380 def transition_to_buffered (self , device_name , h5file , initial_values , fresh ):
81+ # get stop time:
82+ with h5py .File (h5file , 'r' ) as f :
83+ props = properties .get (f , self .device_name , 'device_properties' )
84+ self .stop_time = props .get ('stop_time' , None ) # stop_time may be absent if we are not the master pseudoclock
6485 return {}
6586
87+ def check_if_done (self ):
88+ # Wait up to 1 second for the shot to be done, returning True if it is
89+ # or False if not.
90+ if getattr (self , 'start_time' , None ) is None :
91+ self .start_time = time .time ()
92+ timeout = min (self .start_time + self .stop_time - time .time (), 1 )
93+ if timeout < 0 :
94+ return True
95+ time .sleep (timeout )
96+ return self .start_time + self .stop_time < time .time ()
97+
6698 def transition_to_manual (self ):
99+ self .start_time = None
100+ self .stop_time = None
67101 return True
68102
69103 def shutdown (self ):
0 commit comments