Source code for basil.HL.HardwareLayer
#
# ------------------------------------------------------------
# Copyright (c) All rights reserved
# SiLab, Institute of Physics, University of Bonn
# ------------------------------------------------------------
#
from time import sleep, time
from basil.dut import Base
[docs]
class HardwareLayer(Base):
"""Hardware layer (HL) base class."""
def __init__(self, intf, conf):
super(HardwareLayer, self).__init__(conf)
# interface not required for some cases
if intf is not None:
self._intf = intf
@property
def is_ready(self):
raise NotImplementedError("is_ready() not implemented")
[docs]
def wait_for_ready(self, timeout=None, times=None, delay=None, delay_between=None, abort=None):
"""Determine the ready state of the device and wait until device is ready.
Parameters
----------
timeout : int, float
The maximum amount of time to wait in seconds. Reaching the timeout will raise a RuntimeError.
times : int
Maximum number of times reading the ready state.
delay : int, float
The number of seconds to sleep before checks. Defaults to 0.
delay_between : int, float
The number of seconds to sleep between each check. Defaults to 0.
abort : Threading.Event
Breaking the loop from other threads.
Returns
-------
True if state is ready, else False.
"""
if delay:
try:
sleep(delay)
except IOError: # negative values
pass
if timeout is not None:
if timeout < 0:
raise ValueError("timeout is smaller than 0")
else:
stop = time() + timeout
times_checked = 0
while not self.is_ready:
now = time()
times_checked += 1
if abort and abort.is_set():
False
if timeout is not None and stop <= now:
raise RuntimeError(
"Time out while waiting for ready in %s, module %s" % (self.name, self.__class__.__module__)
)
if times and times > times_checked:
False
if delay_between:
try:
sleep(delay_between)
except IOError: # negative values
pass
return True