Source code for Cameras.CameraCreator

# -*- coding: utf-8 -*- 

"""
Define camera_creator : the Builder / factory that create the Camera object 
"""

from .Config import camerasConfigs
from .CameraClassDef import CameraClass

#make lists of cameras driver and model from camerasConfigs
driverList = []
modelList = []
for camConfig in camerasConfigs :
    if not type(camConfig)==dict :
        driverList.append('None')
        modelList.append('None')
    elif ('driver' in camConfig)  and ('model' in camConfig) :
        driverList.append(camConfig['driver'])
        modelList.append(camConfig['model'])
    elif ('driver' in camConfig) :
        driverList.append(camConfig['driver'])
        modelList.append('None') 
    elif ('model' in camConfig) :
        driverList.append('None')
        modelList.append(camConfig['model'])
    else :
        driverList.append('None')
        modelList.append('None') 

# try to import drivers for all cameras listed in camerasConfigs 
# we do this here rather than on the fly to avoid the import cost at runtime
loadedDriversList = []
unavailableDriversList = []
cameraClassNameList = ['None']*len(camerasConfigs)
for icam in range(len(camerasConfigs)) :
    if driverList[icam] == 'None' or driverList[icam] in unavailableDriversList :
        if icam != 0 :
            print('ERROR ! : Camera number '+str(icam)+' : Config missing driver or driver unvailable')
    elif driverList[icam] in loadedDriversList and hasattr(eval(driverList[icam]),modelList[icam]+'Class') :
        # child class for specific model already loaded in previous import, use generic driver class
        cameraClassNameList[icam] = driverList[icam]+'.'+modelList[icam]+'Class'
    elif driverList[icam] in loadedDriversList and not(hasattr(eval(driverList[icam]),modelList[icam]+'Class')) :
        # no child class for specific model, use generic driver class
        cameraClassNameList[icam] = driverList[icam]+'.'+driverList[icam]+'Class'
        if modelList[icam] == 'None' and icam != 0 :
            print('WARNING ! : Camera number '+str(icam)+' : Config missing model')
    else :
        #try loading the driver
        try : 
            exec('from . import '+driverList[icam])
            loadedDriversList.append(driverList[icam])
            if hasattr(eval(driverList[icam]),modelList[icam]+'Class')  : 
                # if class exist for model
                cameraClassNameList[icam] = driverList[icam]+'.'+modelList[icam]+'Class'
            else : 
                # no child class for specific model, use generic driver class
                cameraClassNameList[icam] = driverList[icam]+'.'+driverList[icam]+'Class'
                if modelList[icam] == 'None' and icam != 0:
                    print('WARNING ! : Camera number '+str(icam)+' : Config missing model')
                elif  icam != 0 : 
                    print("""Advice : Camera number """+str(icam)+""" does not have a model-specific driver. 
        Loading generic driver class """+str(driverList[icam])+""" instead.
        If using several camera models from a same manufacturer, 
        define model-specific class (a child class) handling initialization differences.""")
        except :
            unavailableDriversList.append(driverList[icam])
            print('ERROR ! : Camera number '+str(icam)+' : Config driver '+ driverList[icam] +'  misspelled or not implemented')



[docs] def create_Camera(cameraNumber, triggerMode=0, exposurems=1., gaindB=0., camROI=None, loadDefault = False): """Builder / factory that create the Camera object With the right specific class (interface with parent class CameraClass) depending on the camera model as defined by the info in Config.camerasConfigs Args: cameraNumber (int) : index of camera in camerasConfigs list Keyword Args: triggerMode=0 (int) : 0 for hardware/external, 1 for software/internal exposurems=1. (float) : Exposition duration (exposure) in ms. gaindB=0. (float) : hardware gain of the camera in dB. camROI=None (None or [int]*4) : Camera region of interest to read from sensor [x offset , y offset , x size , y size ] (binning is not implemented) loadDefault = False (bool): Decide if default values from cameraConfigs should be set at creation Return: Camera object (interface CameraClass) """ # if out of range or 0 => 0 and empty base camera object if cameraNumber > (len(camerasConfigs)-1) or cameraNumber < 0 \ or camerasConfigs[cameraNumber] == None or cameraNumber == 0 : if cameraNumber != 0 : print('WARNING ! : No camera configured for the number '+ str(cameraNumber)+' \n Create empty base camera object') #Create empty base camera object if camera number does not match a config Camera = CameraClass(0) # if driver not defined properly => 0 and empty base camera object elif cameraClassNameList[cameraNumber] == 'None' : print('ERROR ! :Camera '+ str(cameraNumber)+' driver class not defined \n Create empty base camera object') #Create empty base camera object if camera number does not match a config Camera = CameraClass(0) # initialize camera normally else : Camera = eval(cameraClassNameList[cameraNumber])(cameraNumber, triggerMode=triggerMode, exposurems=exposurems, gaindB=gaindB, camROI=camROI, loadDefault=loadDefault) if not(Camera.cameraDriverInstalled) or not(Camera.cameraConnected) : print('ERROR ! : Camera '+ str(cameraNumber)+' is not connected or driver not installed \n Create empty base camera object') Camera = CameraClass(0) return Camera