Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 36 additions & 9 deletions src/pyvcam/__main__.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
6 changes: 6 additions & 0 deletions src/pyvcam/driver.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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]

Expand Down Expand Up @@ -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:
Expand Down