Source code for mxcubecore.HardwareObjects.QtLimaVideo
#
# Project name: MXCuBE
# https://github.com/mxcube
#
# This file is part of MXCuBE software.
#
# MXCuBE is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# MXCuBE is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with MXCuBE. If not, see <http://www.gnu.org/licenses/>.
"""
[Name]
QtLimaVideo
[Description]
HwObj used to grab images via LImA library or Lima Tango server.
[Configuration]
See example below. To select between "Library" or "Tango" simply
use and configure the field <address> (for Library)
or <tangoname> (for Tango)
in the XML file.
Example Hardware Object XML file :
==================================
<object class="QtLimaVideo">
<type>basler</type>
<encoding>yuv422p</encoding>
<address>84.89.227.6</address>
<gain>0.5</gain>
<exposure>0.01</exposure>
<mirror>(False, False)</mirror>
<interval>30</interval>
</object>
"""
from mxcubecore.HardwareObjects.abstract.AbstractVideoDevice import AbstractVideoDevice
try:
from Lima import Core
except Exception:
pass
try:
from Lima import Prosilica
except ImportError as e:
pass
try:
from Lima import Basler
except ImportError as e:
pass
[docs]class QtLimaVideo(AbstractVideoDevice):
"""
Descript. :
"""
def __init__(self, name):
"""
Descript. :
"""
AbstractVideoDevice.__init__(self, name)
self.cam_address = None
# LIMA access
self.camera = None
self.interface = None
self.control = None
self.video = None
self.master_mode = True
[docs] def init(self):
self.cam_address = self.get_property("address")
self.cam_type = self.get_property("type").lower()
if self.cam_type == "prosilica":
self.camera = Prosilica.Camera(self.cam_address, self.master_mode, False)
self.interface = Prosilica.Interface(self.camera)
elif self.cam_type == "basler":
self.log.info("Connecting to camera with address %s" % self.cam_address)
self.camera = Basler.Camera(self.cam_address)
self.interface = Basler.Interface(self.camera)
self.control = Core.CtControl(self.interface)
self.video = self.control.video()
AbstractVideoDevice.init(self)
[docs] def set_cam_encoding(self, cam_encoding):
if cam_encoding == "yuv422p":
self.video.setMode(Core.YUV422)
elif cam_encoding == "y8":
self.video.setMode(Core.Y8)
AbstractVideoDevice.set_cam_encoding(self, cam_encoding)
""" Overloading of AbstractVideoDevice methods """
[docs] def get_raw_image_size(self):
if self.cam_type == "prosilica":
return list(self.camera.getMaxWidthHeight())
elif self.cam_type == "basler":
width = self.camera.getRoi().getSize().get_width()
height = self.camera.getRoi().getSize().get_height()
return [width, height]
else:
return [None, None]
[docs] def get_image(self):
image = self.video.getLastImage()
if image.frameNumber() > -1:
raw_buffer = image.buffer()
return raw_buffer, image.width(), image.height()
else:
return None, None, None
[docs] def set_exposure_time(self, exposure_time_value):
if self.master_mode:
self.video.setExposure(exposure_time_value)
[docs] def set_video_live(self, flag):
if flag is True:
self.video.startLive()
else:
self.video.stopLive()
""" END Overloading of AbstractVideoDevice methods """
def test_hwo(hwo):
print(("Image dimensions: %s" % hwo.get_image_dimensions()))
print(("Live Mode: %s" % hwo.get_video_live()))