print('Gotcha!') subject.clean_up() """ import logging from airtrack.src.camera.base import AirtrackCamera from airtrack.src.errors import on_error_raise from airtrack.src.errors import AirtrackCameraError from airtrack.src.errors import AirtrackSubjectError logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) handle_camera_error = on_error_raise( AirtrackSubjectError, logger, catch_error=AirtrackCameraError) class AirtrackSubject: """Airtrack subject information interface.""" def __init__(self): self._camera = AirtrackCamera() @handle_camera_error def is_inside_lane(self): """Query subject for being inside or outside the airtable lane. :return: ``True`` if the subject is inside the lane, otherwise ``False``
from airtrack.src.definitions import AirtrackActuatorState from airtrack.src.errors import AirtrackActuatorError from airtrack.src.errors import on_error_raise from pybpodapi.protocol import Bpod if AIRTRACK_ACTUATOR_PUSH_TIMEOUT > AIRTRACK_MAX_ACTUATOR_TIMEOUT or \ AIRTRACK_ACTUATOR_AT_REST_TIMEOUT > AIRTRACK_MAX_ACTUATOR_TIMEOUT: raise AirtrackActuatorError( 'Actuator push or at rest timeouts exceed maximum of' f'{AIRTRACK_MAX_ACTUATOR_TIMEOUT} sec.') logger = utils.create_logger(__name__) handle_error = on_error_raise(AirtrackActuatorError, logger) class AirtrackActuator: """Airtrack linear actuator interface.""" LOW = 0 HIGH = 255 STATE = AirtrackActuatorState def __init__(self, bpod): """ :keyword bpod: A pybpod Bpod object :type bpod: :class:``pybpodapi.protocol.Bpod`` """ self._bpod = bpod self._current_state = self.STATE.AT_REST
break ac.close() """ from airtrack.src import utils from airtrack.src.camera.pixy import PixyCam from airtrack.src.definitions import AirtrackCameraObject from airtrack.src.errors import on_error_raise from airtrack.src.errors import PixyCamError from airtrack.src.errors import AirtrackCameraError logger = utils.create_logger(__name__) handle_pixy_error = on_error_raise( AirtrackCameraError, logger, catch_error=PixyCamError) class AirtrackCamera: """Airtrack camera interface.""" def __init__(self): self._pixy_cam = PixyCam() @handle_pixy_error def _find_signature(self, signature): return self._pixy_cam.find_targets( [signature]) def _find_object(self, object_enum):
""" import atexit import itertools from airtrack.src import utils from airtrack.src.sma import AirtrackStateMachine from airtrack.src.subject import AirtrackSubject from airtrack.src.errors import on_error_raise from airtrack.src.errors import AirtrackError from pybpodapi.protocol import Bpod logger = utils.create_logger(__name__) handle_error = on_error_raise(AirtrackError, logger) class Airtrack: """Airtrack system interface.""" def __init__(self): self.__bpod = None self._bpod_closed = True self._subject = AirtrackSubject() # Register exit handler atexit.register(self.close) @property def _bpod(self): if self.__bpod is None: self._create_bpod()
from airtrack.settings import AIRTRACK_STATE_TIMER from airtrack.src import utils from airtrack.src.actuator import AirtrackActuator from airtrack.src.definitions import AirtrackState as State from airtrack.src.errors import on_error_raise from airtrack.src.errors import AirtrackStateMachineError from pybpodapi.protocol import Bpod from pybpodapi.protocol import StateMachine logger = utils.create_logger(__name__) handle_error = on_error_raise(AirtrackStateMachineError, logger) UNBOUND_CALLBACK_ATTR_NAME = 'unbound_callback' def callback(state): def decorator(func): def wrapper(self): logger.debug(f'Calling {state} callback') return func(self, state) setattr(state, UNBOUND_CALLBACK_ATTR_NAME, wrapper) return wrapper return decorator class AirtrackStateMachine(StateMachine):