"""MeaVis tasks for threading."""
import logging
import threading
import time
import meavis._detail.debug
[docs]def setup_and_acquire(meavis_item):
"""Set meavis_item handler if required."""
if meavis_item._meavis_handler:
meavis_item._meavis_lock.acquire()
return meavis_item._meavis_lock
if meavis_item._meavis_initialiser:
initialiser = meavis_item._meavis_initialiser
initialiser._meavis_lock.acquire()
if not initialiser._meavis_handler:
constructor = initialiser._meavis_constructor
if not constructor._meavis_handler:
constructor._meavis_handler = constructor.create()
logging.getLogger("meavis").info(
"Create handler of {} [{}] with {{{}}}.".format(
constructor._meavis_name,
constructor._meavis_hash,
", ".join(
"{}: {}".format(key, value)
for key, value in constructor._meavis_kwargs.items()
),
)
)
meavis._detail.debug.channel_notexist(initialiser)
initialiser._meavis_handler = initialiser.initialise(
constructor._meavis_handler, initialiser._meavis_channel
)
logging.getLogger("meavis").info(
"Initialise channel {} on handler of {} with {{{}}}.".format(
initialiser._meavis_channel,
initialiser._meavis_name,
", ".join(
"{}: {}".format(key, value)
for key, value in initialiser._meavis_kwargs.items()
),
)
)
meavis_item._meavis_handler = initialiser._meavis_handler
meavis_item._meavis_lock = initialiser._meavis_lock
else:
meavis_item._meavis_handler = meavis_item
meavis_item._meavis_lock = threading.Lock()
meavis_item._meavis_lock.acquire()
return meavis_item._meavis_lock
[docs]def settle(parameter, sample, lock_in, lock_out, delay=True):
"""Settle a parameter."""
lock_in.acquire()
lock_instrument = setup_and_acquire(parameter)
parameter.apply(parameter._meavis_handler, sample)
parameter._meavis_current = sample
logging.getLogger("meavis").info(
"Set {} to {}{}.".format(
parameter._meavis_name,
sample,
""
if parameter._meavis_unit is None
else " {}".format(parameter._meavis_unit),
)
)
lock_instrument.release()
lock_out.release()
if delay:
time.sleep(parameter._meavis_delay)
with lock_instrument:
cond_is_settle = parameter.is_settled(parameter._meavis_handler)
while not cond_is_settle:
with lock_instrument:
cond_is_settle = parameter.is_settled(parameter._meavis_handler)
if delay:
time.sleep(parameter._meavis_delay)
[docs]def trigger_wait(measurement, lock_in, lock_out, lock_barrier):
"""Trigger & wait for a measurement."""
lock_in.acquire()
lock_instrument = setup_and_acquire(measurement)
measurement.trigger(measurement._meavis_handler)
if hasattr(measurement, "_meavis_name"):
logging.getLogger("meavis").info(
"Trigger {}, waiting for data.".format(measurement._meavis_name)
)
if not measurement._meavis_invasive:
lock_out.release()
lock_instrument.release()
lock_barrier.acquire()
with lock_instrument:
measurement.wait(measurement._meavis_handler)
if measurement._meavis_invasive:
lock_out.release()