diff --git a/src/pyvcam/__main__.py b/src/pyvcam/__main__.py old mode 100644 new mode 100755 index ca19631..20c1908 --- a/src/pyvcam/__main__.py +++ b/src/pyvcam/__main__.py @@ -2,7 +2,8 @@ """ __main__.py -Implement ARTIQ Network Device Support Package (NDSP) to support Teledyne PrimeBSI camera integration into ARTIQ experiment. +Implement ARTIQ Network Device Support Package (NDSP) to support Teledyne Prime BSI camera integration +into ARTIQ experiment. Kevin Chen 2023-02-24 @@ -13,32 +14,58 @@ from sipyco.pc_rpc import simple_server_loop from sipyco import common_args import argparse -import logging +import logging, logging.config from pyvcam.driver import PyVCAM -logger = logging.getLogger(__name__) +logger = logging.getLogger('pyvcam') +logger.setLevel(logging.DEBUG) +logger.propagate = False # prevents logging output flooding console -def get_argparser(): - parser = argparse.ArgumentParser(description="""PyVCAM controller. Use this controller to drive the Teledyne PrimeBSI camera. - See documentation at https://github.com/Photometrics/PyVCAM""") +# create file handler which logs even debug messages +fh = logging.FileHandler('logfile.log') +fh.setLevel(logging.DEBUG) + +# create console handler with a higher log level +ch = logging.StreamHandler() +ch.setLevel(logging.DEBUG) + +# create formatter and add it to the handlers +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +fh.setFormatter(formatter) +ch.setFormatter(formatter) + +# add the handlers to the logger +logger.addHandler(fh) +logger.addHandler(ch) + + +def get_argparser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description="""PyVCAM controller. Use this controller to drive the + Teledyne Prime BSI camera. See documentation at https://github.com/quantumion/PyVCAM""") common_args.simple_network_args(parser, 3249) common_args.verbosity_args(parser) return parser -def main(): + +def main() -> None: args = get_argparser().parse_args() common_args.init_logger_from_args(args) + logger.info('Creating an instance of PyVCAM') camera = PyVCAM() + logger.info('PyVCAM created. Opening camera...') try: camera.open() - logger.info('PyVCAM open.') + logger.info('Camera open.') simple_server_loop({"pyvcam": camera}, common_args.bind_address_from_args(args), args.port) + except RuntimeError: + logger.exception('Connection refused. Check camera status') finally: camera.close() - logger.info('PyVCAM closed.') + logger.info('Camera closed.') del camera + if __name__ == "__main__": main() diff --git a/src/pyvcam/driver.py b/src/pyvcam/driver.py index 815003a..54e9d8b 100644 --- a/src/pyvcam/driver.py +++ b/src/pyvcam/driver.py @@ -14,6 +14,9 @@ from pyvcam.camera import Camera from pyvcam import constants as const from typing import NoReturn +import logging + +module_logger = logging.getLogger('pyvcam.driver') class PyVCAM: @@ -27,6 +30,8 @@ def __init__(self) -> None: Creates camera object. **NOTE**: This does not open the camera. User has to call :func:`open` either in controller or experiment. """ + self.logger = logging.getLogger('pyvcam.driver.PyVCAM') + self.logger.info('Creating an instance of PyVCAM') pvc.init_pvcam() self.cam = [cam for cam in Camera.detect_camera()][0] @@ -56,6 +61,7 @@ def open(self) -> None: :return: None :raise RuntimeError: If call to PVCAM fails (e.g. Camera is already open). """ + self.logger.info('Opening camera') self.cam.open() def close(self) -> None: