# coding: utf-8
from typing import Optional, Tuple
import numpy as np
import logging
from warnings import warn
from . import BaslerIronmanCameraLink
from ..._global import OptionalModule
try:
from . import clModule as Cl
except (ModuleNotFoundError, ImportError):
Cl = OptionalModule("clModule")
format_to_num = {'8 bits': 0,
'10 bits': 1,
'12 bits': 2}
num_to_format = {val: key for key, val in format_to_num.items()}
[docs]
class JaiGO5000CPMCL8Bits(BaslerIronmanCameraLink):
"""This class can drive a JAI GO-5000C-PMCL camera in 8 bits mode, through a
Basler microEnable 5 Ironman AD8 PoCL acquisition board.
It is a child of the
:class:`~crappy.camera.cameralink.BaslerIronmanCameraLink` Camera. The only
difference is that it can only run in 8 bits mode, and gives access to more
camera settings in Crappy. It is subclassed by the
:class:`~crappy.camera.cameralink.JaiGO5000CPMCL` Camera, that allows driving
the same hardware but in 10 and 12 bits mode.
Warning:
This Camera relies on a custom-written C library that hasn't been tested in
a long time. It might not be functional anymore. This Camera also requires
proprietary drivers to be installed.
.. versionadded:: 1.4.0
.. versionchanged:: 2.0.0 renamed from *Jai8* to *JaiGO5000CPMCL8Bits*
.. versionremoved:: 2.1.0
"""
[docs]
def __init__(self) -> None:
"""Adds various settings to the Camera."""
warn(f"Starting from version 2.1.0, {type(self).__name__} will be "
f"deprecated and removed from Crappy. Please contact the maintainers "
f"if you still use this Camera.", FutureWarning)
super().__init__()
self.add_scale_setting('width', 1, 2560, self._get_w, self._set_w, 2560)
self.add_scale_setting('height', 1, 2048, self._get_h, self._set_h, 2048)
self.add_scale_setting('exposure', 10, 800000, self._get_exp,
self._set_exp)
[docs]
def open(self,
config_file: Optional[str] = None,
camera_type: str = 'FullAreaGray8',
**kwargs) -> None:
"""Opens the connection to the camera using the parent class' method, and
sets the image format to 8 bits.
Args:
config_file: Path to the configuration file for the camera, as a
:obj:`str`. Allows setting various parameters at once, and to store
them in a persistent way.
camera_type: The type of camera to drive, as a :obj:`str`.
**kwargs: All the settings to set on the camera.
.. versionadded:: 1.5.10
explicitly listing the *config_file* and *camera_type* arguments
"""
super().open(config_file=config_file,
camera_type=camera_type,
**kwargs)
self.log(logging.DEBUG, "Writing b'TAGM=5\\r\\n' to the camera")
self._cap.serialWrite('TAGM=5\r\n') # (default)
self._set_format('8 bits') # Set camera to 8 bits
self._cap.set(Cl.FG_CAMERA_LINK_CAMTYP, 208) # Set the input to 8 bits
self._cap.set(Cl.FG_SENSORREADOUT, 0) # Sets the correct framegrabber mode
def _set_w(self, val: int) -> None:
self.stopAcq()
super()._set_w(val)
self.log(logging.DEBUG, f"Writing b'WTC={val}\\r\\n' to the camera")
self._cap.serialWrite('WTC={}\r\n'.format(val))
self.startAcq()
def _set_h(self, val: int) -> None:
self.stopAcq()
super()._set_h(val)
self.log(logging.DEBUG, f"Writing b'HTL={val}\\r\\n' to the camera")
self._cap.serialWrite('HTL={}\r\n'.format(val))
self.startAcq()
def _get_format(self) -> str:
self.log(logging.DEBUG, "Writing b'BA?\\r\\n' to the camera")
r = self._cap.serialWrite('BA?\r\n')
return num_to_format[int(r[3])]
def _set_format(self, val: str) -> None:
self.log(logging.DEBUG, f"Writing b'BA={format_to_num[val]}\\r\\n' "
f"to the camera")
self._cap.serialWrite('BA={}\r\n'.format(format_to_num[val]))
def _set_exp(self, val: int) -> None:
self.log(logging.DEBUG, f"Writing b'RE={val}\\r\\n' to the camera")
self._cap.serialWrite('PE={}\r\n'.format(val))
def _get_exp(self) -> int:
self.log(logging.DEBUG, "Writing b'PE?\\r\\n' to the camera")
return int(self._cap.serialWrite('PE?\r\n').strip()[3:])
[docs]
class JaiGO5000CPMCL(JaiGO5000CPMCL8Bits):
"""This class can drive a JAI GO-5000C-PMCL camera in 10 or 12 bits mode,
through a Basler microEnable 5 Ironman AD8 PoCL acquisition board.
It is a child of the :class:`~crappy.camera.cameralink.JaiGO5000CPMCL8Bits`
Camera. The only difference with its parent class is that it sets the 10 or
12 bits mode on the camera, and modifies the acquired image before returning
it.
Warning:
This Camera relies on a custom-written C library that hasn't been tested in
a long time. It might not be functional anymore. This Camera also requires
proprietary drivers to be installed.
.. versionadded:: 1.4.0
.. versionchanged:: 2.0.0 renamed from *Jai* to *JaiGO5000CPMCL*
.. versionremoved:: 2.1.0
"""
[docs]
def __init__(self) -> None:
"""Adds the data_format settings to the Camera."""
warn(f"Starting from version 2.1.0, {type(self).__name__} will be "
f"deprecated and removed from Crappy. Please contact the maintainers "
f"if you still use this Camera.", FutureWarning)
super().__init__()
self.add_choice_setting('data_format', ('10 bits', '12 bits'),
self._get_format, self._set_format, '12 bits')
[docs]
def open(self,
camera_type: str = 'MediumAreaGray16',
**kwargs) -> None:
"""Opens the connection to the camera using the parent class' method, and
sets the image format to 12 bits.
Args:
camera_type: The type of camera to drive, as a :obj:`str`.
**kwargs: All the settings to set on the camera.
.. versionadded:: 1.5.10 explicitly listing the *camera_type* argument
"""
super().open(camera_type=camera_type, **kwargs)
# dual tap (default does not allow 12 bits)
self.log(logging.DEBUG, "Writing b'TAGM=1\\r\\n' to the camera")
self._cap.serialWrite('TAGM=1\r\n')
self._set_format('12 bits') # 12 bits
self._cap.set(Cl.FG_CAMERA_LINK_CAMTYP, 212) # Set the input to 12 bits
self._cap.set(Cl.FG_SENSORREADOUT, 7) # Sets the correct framegrabber mode
[docs]
def get_image(self) -> Tuple[float, np.ndarray]:
"""Grabs a frame using the parent class' method, and returns if after
shifting bits."""
t, frame = super().get_image()
return t, frame >> 4