Skip to content

Commit d30a777

Browse files
Merged in cbillington/labscript_devices/DummyPseudoclock (pull request #46)
Make DummyPseudoclock respect stop_time
2 parents e37a39e + 359c537 commit d30a777

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

DummyPseudoclock.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# #
1212
#####################################################################
1313
from __future__ import division, unicode_literals, print_function, absolute_import
14+
import time
1415
from labscript_utils import PY2
1516
if PY2:
1617
str = unicode
@@ -19,9 +20,12 @@
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
2325
from labscript_devices import labscript_device, BLACS_tab, BLACS_worker
2426
from labscript import PseudoclockDevice, Pseudoclock, ClockLine
27+
import labscript_utils.properties as properties
28+
2529

2630
@labscript_device
2731
class 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

4347
from blacs.device_base_class import DeviceTab, define_state, MODE_BUFFERED
4448
from 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
5976
class 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

Comments
 (0)