Source code for csaxs_bec.devices.ids_cameras.base_integration.utils

"""Utility functions and classes for IDS cameras using the pyueye library."""

from bec_lib.logger import bec_logger

logger = bec_logger.logger

try:
    from pyueye import ueye
except ImportError as exc:
    logger.warning(f"The pyueye library is not properly installed : {exc}")
    ueye = None

if ueye is not None:
    error_codes = {
        ueye.IS_NO_SUCCESS: "No success",
        ueye.IS_SUCCESS: "Success",
        ueye.IS_INVALID_CAMERA_HANDLE: "Invalid camera handle",
        ueye.IS_INVALID_HANDLE: "Invalid handle",
        ueye.IS_IO_REQUEST_FAILED: "IO request failed",
        ueye.IS_CANT_OPEN_DEVICE: "Cannot open device",
        ueye.IS_CANT_CLOSE_DEVICE: "Cannot close device",
        ueye.IS_CANT_SETUP_MEMORY: "Cannot setup memory",
        ueye.IS_NO_HWND_FOR_ERROR_REPORT: "No HWND for error report",
        ueye.IS_ERROR_MESSAGE_NOT_CREATED: "Error message not created",
        ueye.IS_ERROR_STRING_NOT_FOUND: "Error string not found",
        ueye.IS_HOOK_NOT_CREATED: "Hook not created",
        ueye.IS_TIMER_NOT_CREATED: "Timer not created",
        ueye.IS_CANT_OPEN_REGISTRY: "Cannot open registry",
        ueye.IS_CANT_READ_REGISTRY: "Cannot read registry",
        ueye.IS_CANT_VALIDATE_BOARD: "Cannot validate board",
        ueye.IS_CANT_GIVE_BOARD_ACCESS: "Cannot give board access",
        ueye.IS_NO_IMAGE_MEM_ALLOCATED: "No image memory allocated",
        ueye.IS_CANT_CLEANUP_MEMORY: "Cannot clean up memory",
        ueye.IS_CANT_COMMUNICATE_WITH_DRIVER: "Cannot communicate with driver",
        ueye.IS_FUNCTION_NOT_SUPPORTED_YET: "Function not supported yet",
        ueye.IS_OPERATING_SYSTEM_NOT_SUPPORTED: "Operating system not supported",
        ueye.IS_INVALID_VIDEO_IN: "Invalid video input",
        ueye.IS_INVALID_IMG_SIZE: "Invalid image size",
        ueye.IS_INVALID_ADDRESS: "Invalid address",
        ueye.IS_INVALID_VIDEO_MODE: "Invalid video mode",
        ueye.IS_INVALID_AGC_MODE: "Invalid AGC mode",
        ueye.IS_INVALID_GAMMA_MODE: "Invalid gamma mode",
        ueye.IS_INVALID_SYNC_LEVEL: "Invalid sync level",
        ueye.IS_INVALID_CBARS_MODE: "Invalid color bars mode",
        ueye.IS_INVALID_COLOR_MODE: "Invalid color mode",
        ueye.IS_INVALID_SCALE_FACTOR: "Invalid scale factor",
        ueye.IS_INVALID_IMAGE_SIZE: "Invalid image size",
        ueye.IS_INVALID_IMAGE_POS: "Invalid image position",
        ueye.IS_INVALID_CAPTURE_MODE: "Invalid capture mode",
        ueye.IS_INVALID_RISC_PROGRAM: "Invalid RISC program",
        ueye.IS_INVALID_BRIGHTNESS: "Invalid brightness",
        ueye.IS_INVALID_CONTRAST: "Invalid contrast",
        ueye.IS_INVALID_SATURATION_U: "Invalid saturation U",
        ueye.IS_INVALID_SATURATION_V: "Invalid saturation V",
        ueye.IS_INVALID_HUE: "Invalid hue",
        ueye.IS_INVALID_HOR_FILTER_STEP: "Invalid horizontal filter step",
        ueye.IS_INVALID_VERT_FILTER_STEP: "Invalid vertical filter step",
        ueye.IS_INVALID_EEPROM_READ_ADDRESS: "Invalid EEPROM read address",
        ueye.IS_INVALID_EEPROM_WRITE_ADDRESS: "Invalid EEPROM write address",
        ueye.IS_INVALID_EEPROM_READ_LENGTH: "Invalid EEPROM read length",
        ueye.IS_INVALID_EEPROM_WRITE_LENGTH: "Invalid EEPROM write length",
        ueye.IS_INVALID_BOARD_INFO_POINTER: "Invalid board info pointer",
        ueye.IS_INVALID_DISPLAY_MODE: "Invalid display mode",
        ueye.IS_INVALID_ERR_REP_MODE: "Invalid error report mode",
        ueye.IS_INVALID_BITS_PIXEL: "Invalid bits per pixel",
        ueye.IS_INVALID_MEMORY_POINTER: "Invalid memory pointer",
        ueye.IS_FILE_WRITE_OPEN_ERROR: "File write open error",
        ueye.IS_FILE_READ_OPEN_ERROR: "File read open error",
        ueye.IS_FILE_READ_INVALID_BMP_ID: "File read invalid BMP ID",
        ueye.IS_FILE_READ_INVALID_BMP_SIZE: "File read invalid BMP size",
        ueye.IS_FILE_READ_INVALID_BIT_COUNT: "File read invalid bit count",
        ueye.IS_WRONG_KERNEL_VERSION: "Wrong kernel version",
        ueye.IS_RISC_INVALID_XLENGTH: "RISC invalid X length",
        ueye.IS_RISC_INVALID_YLENGTH: "RISC invalid Y length",
        ueye.IS_RISC_EXCEED_IMG_SIZE: "RISC exceed image size",
        ueye.IS_DD_MAIN_FAILED: "DirectDraw main surface failed",
        ueye.IS_DD_PRIMSURFACE_FAILED: "DirectDraw primary surface failed",
        ueye.IS_DD_SCRN_SIZE_NOT_SUPPORTED: "Screen size not supported",
        ueye.IS_DD_CLIPPER_FAILED: "Clipper failed",
        ueye.IS_DD_CLIPPER_HWND_FAILED: "Clipper HWND failed",
        ueye.IS_DD_CLIPPER_CONNECT_FAILED: "Clipper connect failed",
        ueye.IS_DD_BACKSURFACE_FAILED: "Backsurface failed",
        ueye.IS_DD_BACKSURFACE_IN_SYSMEM: "Backsurface in system memory",
        ueye.IS_DD_MDL_MALLOC_ERR: "Memory malloc error",
        ueye.IS_DD_MDL_SIZE_ERR: "Memory size error",
        ueye.IS_DD_CLIP_NO_CHANGE: "Clip no change",
        ueye.IS_DD_PRIMMEM_NULL: "Primary memory null",
        ueye.IS_DD_BACKMEM_NULL: "Back memory null",
        ueye.IS_DD_BACKOVLMEM_NULL: "Back overlay memory null",
        ueye.IS_DD_OVERLAYSURFACE_FAILED: "Overlay surface failed",
        ueye.IS_DD_OVERLAYSURFACE_IN_SYSMEM: "Overlay surface in system memory",
        ueye.IS_DD_OVERLAY_NOT_ALLOWED: "Overlay not allowed",
        ueye.IS_DD_OVERLAY_COLKEY_ERR: "Overlay color key error",
        ueye.IS_DD_OVERLAY_NOT_ENABLED: "Overlay not enabled",
        ueye.IS_DD_GET_DC_ERROR: "Get DC error",
        ueye.IS_DD_DDRAW_DLL_NOT_LOADED: "DirectDraw DLL not loaded",
        ueye.IS_DD_THREAD_NOT_CREATED: "DirectDraw thread not created",
        ueye.IS_DD_CANT_GET_CAPS: "Cannot get capabilities",
        ueye.IS_DD_NO_OVERLAYSURFACE: "No overlay surface",
        ueye.IS_DD_NO_OVERLAYSTRETCH: "No overlay stretch",
        ueye.IS_DD_CANT_CREATE_OVERLAYSURFACE: "Cannot create overlay surface",
        ueye.IS_DD_CANT_UPDATE_OVERLAYSURFACE: "Cannot update overlay surface",
        ueye.IS_DD_INVALID_STRETCH: "Invalid stretch",
        ueye.IS_EV_INVALID_EVENT_NUMBER: "Invalid event number",
        ueye.IS_INVALID_MODE: "Invalid mode",
        ueye.IS_CANT_FIND_HOOK: "Cannot find hook",
        ueye.IS_CANT_GET_HOOK_PROC_ADDR: "Cannot get hook procedure address",
        ueye.IS_CANT_CHAIN_HOOK_PROC: "Cannot chain hook procedure",
        ueye.IS_CANT_SETUP_WND_PROC: "Cannot setup window procedure",
        ueye.IS_HWND_NULL: "HWND is null",
        ueye.IS_INVALID_UPDATE_MODE: "Invalid update mode",
        ueye.IS_NO_ACTIVE_IMG_MEM: "No active image memory",
        ueye.IS_CANT_INIT_EVENT: "Cannot initialize event",
        ueye.IS_FUNC_NOT_AVAIL_IN_OS: "Function not available in OS",
        ueye.IS_CAMERA_NOT_CONNECTED: "Camera not connected",
        ueye.IS_SEQUENCE_LIST_EMPTY: "Sequence list empty",
        ueye.IS_CANT_ADD_TO_SEQUENCE: "Cannot add to sequence",
        ueye.IS_LOW_OF_SEQUENCE_RISC_MEM: "Low sequence RISC memory",
        ueye.IS_IMGMEM2FREE_USED_IN_SEQ: "Image memory to free used in sequence",
        ueye.IS_IMGMEM_NOT_IN_SEQUENCE_LIST: "Image memory not in sequence list",
        ueye.IS_SEQUENCE_BUF_ALREADY_LOCKED: "Sequence buffer already locked",
        ueye.IS_INVALID_DEVICE_ID: "Invalid device ID",
        ueye.IS_INVALID_BOARD_ID: "Invalid board ID",
        ueye.IS_ALL_DEVICES_BUSY: "All devices busy",
        ueye.IS_HOOK_BUSY: "Hook busy",
        ueye.IS_TIMED_OUT: "Timed out",
        ueye.IS_NULL_POINTER: "Null pointer",
        ueye.IS_WRONG_HOOK_VERSION: "Wrong hook version",
        ueye.IS_INVALID_PARAMETER: "Invalid parameter",
        ueye.IS_NOT_ALLOWED: "Not allowed",
        ueye.IS_OUT_OF_MEMORY: "Out of memory",
        ueye.IS_INVALID_WHILE_LIVE: "Invalid while live",
        ueye.IS_ACCESS_VIOLATION: "Access violation",
        ueye.IS_UNKNOWN_ROP_EFFECT: "Unknown ROP effect",
        ueye.IS_INVALID_RENDER_MODE: "Invalid render mode",
        ueye.IS_INVALID_THREAD_CONTEXT: "Invalid thread context",
        ueye.IS_NO_HARDWARE_INSTALLED: "No hardware installed",
        ueye.IS_INVALID_WATCHDOG_TIME: "Invalid watchdog time",
        ueye.IS_INVALID_WATCHDOG_MODE: "Invalid watchdog mode",
        ueye.IS_INVALID_PASSTHROUGH_IN: "Invalid passthrough input",
        ueye.IS_ERROR_SETTING_PASSTHROUGH_IN: "Error setting passthrough input",
        ueye.IS_FAILURE_ON_SETTING_WATCHDOG: "Failure setting watchdog",
        ueye.IS_NO_USB20: "No USB 2.0",
        ueye.IS_CAPTURE_RUNNING: "Capture running",
        ueye.IS_MEMORY_BOARD_ACTIVATED: "Memory board activated",
        ueye.IS_MEMORY_BOARD_DEACTIVATED: "Memory board deactivated",
        ueye.IS_NO_MEMORY_BOARD_CONNECTED: "No memory board connected",
        ueye.IS_TOO_LESS_MEMORY: "Too little memory",
        ueye.IS_IMAGE_NOT_PRESENT: "Image not present",
        ueye.IS_MEMORY_MODE_RUNNING: "Memory mode running",
        ueye.IS_MEMORYBOARD_DISABLED: "Memoryboard disabled",
        ueye.IS_TRIGGER_ACTIVATED: "Trigger activated",
        ueye.IS_WRONG_KEY: "Wrong key",
        ueye.IS_CRC_ERROR: "CRC error",
        ueye.IS_NOT_YET_RELEASED: "Not yet released",
        ueye.IS_NOT_CALIBRATED: "Not calibrated",  # already present
        ueye.IS_WAITING_FOR_KERNEL: "Waiting for kernel",
        ueye.IS_NOT_SUPPORTED: "Not supported",  # already present
        ueye.IS_TRIGGER_NOT_ACTIVATED: "Trigger not activated",
        ueye.IS_OPERATION_ABORTED: "Operation aborted",
        ueye.IS_BAD_STRUCTURE_SIZE: "Bad structure size",
        ueye.IS_INVALID_BUFFER_SIZE: "Invalid buffer size",
        ueye.IS_INVALID_PIXEL_CLOCK: "Invalid pixel clock",
        ueye.IS_INVALID_EXPOSURE_TIME: "Invalid exposure time",
        ueye.IS_AUTO_EXPOSURE_RUNNING: "Auto exposure running",
        ueye.IS_CANNOT_CREATE_BB_SURF: "Cannot create BB surface",
        ueye.IS_CANNOT_CREATE_BB_MIX: "Cannot create BB mix",
        ueye.IS_BB_OVLMEM_NULL: "BB overlay memory null",
        ueye.IS_CANNOT_CREATE_BB_OVL: "Cannot create BB overlay",
        ueye.IS_NOT_SUPP_IN_OVL_SURF_MODE: "Not supported in overlay surface mode",
        ueye.IS_INVALID_SURFACE: "Invalid surface",
        ueye.IS_SURFACE_LOST: "Surface lost",
        ueye.IS_RELEASE_BB_OVL_DC: "Release BB overlay DC",
        ueye.IS_BB_TIMER_NOT_CREATED: "BB timer not created",
        ueye.IS_BB_OVL_NOT_EN: "BB overlay not enabled",
        ueye.IS_ONLY_IN_BB_MODE: "Only in BB mode",
        ueye.IS_INVALID_COLOR_FORMAT: "Invalid color format",
        ueye.IS_INVALID_WB_BINNING_MODE: "Invalid WB binning mode",
        ueye.IS_INVALID_I2C_DEVICE_ADDRESS: "Invalid I²C device address",
        ueye.IS_COULD_NOT_CONVERT: "Could not convert",
        ueye.IS_TRANSFER_ERROR: "Transfer error",  # already present
        ueye.IS_PARAMETER_SET_NOT_PRESENT: "Parameter set not present",
        ueye.IS_INVALID_CAMERA_TYPE: "Invalid camera type",
        ueye.IS_INVALID_HOST_IP_HIBYTE: "Invalid host IP high byte",
        ueye.IS_CM_NOT_SUPP_IN_CURR_DISPLAYMODE: "Color matrix not supported in current display mode",
        ueye.IS_NO_IR_FILTER: "No IR filter",
        ueye.IS_STARTER_FW_UPLOAD_NEEDED: "Starter firmware upload needed",
        ueye.IS_DR_LIBRARY_NOT_FOUND: "Driver library not found",
        ueye.IS_DR_DEVICE_OUT_OF_MEMORY: "Driver device out of memory",
        ueye.IS_DR_CANNOT_CREATE_SURFACE: "Driver cannot create surface",
        ueye.IS_DR_CANNOT_CREATE_VERTEX_BUFFER: "Driver cannot create vertex buffer",
        ueye.IS_DR_CANNOT_CREATE_TEXTURE: "Driver cannot create texture",
        ueye.IS_DR_CANNOT_LOCK_OVERLAY_SURFACE: "Driver cannot lock overlay surface",
        ueye.IS_DR_CANNOT_UNLOCK_OVERLAY_SURFACE: "Driver cannot unlock overlay surface",
        ueye.IS_DR_CANNOT_GET_OVERLAY_DC: "Driver cannot get overlay DC",
        ueye.IS_DR_CANNOT_RELEASE_OVERLAY_DC: "Driver cannot release overlay DC",
        ueye.IS_DR_DEVICE_CAPS_INSUFFICIENT: "Driver device capabilities insufficient",
        ueye.IS_INCOMPATIBLE_SETTING: "Incompatible setting",
        ueye.IS_DR_NOT_ALLOWED_WHILE_DC_IS_ACTIVE: "Driver not allowed while DC is active",
        ueye.IS_DEVICE_ALREADY_PAIRED: "Device already paired",
        ueye.IS_SUBNETMASK_MISMATCH: "Subnet mask mismatch",
        ueye.IS_SUBNET_MISMATCH: "Subnet mismatch",
        ueye.IS_INVALID_IP_CONFIGURATION: "Invalid IP configuration",
        ueye.IS_DEVICE_NOT_COMPATIBLE: "Device not compatible",
        ueye.IS_NETWORK_FRAME_SIZE_INCOMPATIBLE: "Network frame size incompatible",
        ueye.IS_NETWORK_CONFIGURATION_INVALID: "Network configuration invalid",
        ueye.IS_ERROR_CPU_IDLE_STATES_CONFIGURATION: "CPU idle states configuration error",
        ueye.IS_DEVICE_BUSY: "Device busy",
        ueye.IS_SENSOR_INITIALIZATION_FAILED: "Sensor initialization failed",
        ueye.IS_IMAGE_BUFFER_NOT_DWORD_ALIGNED: "Image buffer not DWORD aligned",
        ueye.IS_SEQ_BUFFER_IS_LOCKED: "Sequence buffer is locked",
        ueye.IS_FILE_PATH_DOES_NOT_EXIST: "File path does not exist",
        ueye.IS_INVALID_WINDOW_HANDLE: "Invalid window handle",
        ueye.IS_INVALID_IMAGE_PARAMETER: "Invalid image parameter",
        ueye.IS_NO_SUCH_DEVICE: "No such device",
        ueye.IS_DEVICE_IN_USE: "Device in use",
    }

    bits_per_pixel = {
        ueye.IS_CM_SENSOR_RAW8: 8,
        ueye.IS_CM_SENSOR_RAW10: 16,
        ueye.IS_CM_SENSOR_RAW12: 16,
        ueye.IS_CM_SENSOR_RAW16: 16,
        ueye.IS_CM_MONO8: 8,
        ueye.IS_CM_RGB8_PACKED: 24,
        ueye.IS_CM_BGR8_PACKED: 24,
        ueye.IS_CM_RGBA8_PACKED: 32,
        ueye.IS_CM_BGRA8_PACKED: 32,
        ueye.IS_CM_BGR10_PACKED: 32,
        ueye.IS_CM_RGB10_PACKED: 32,
        ueye.IS_CM_BGRA12_UNPACKED: 64,
        ueye.IS_CM_BGR12_UNPACKED: 48,
        ueye.IS_CM_BGRY8_PACKED: 32,
        ueye.IS_CM_BGR565_PACKED: 16,
        ueye.IS_CM_BGR5_PACKED: 16,
        ueye.IS_CM_UYVY_PACKED: 16,
        ueye.IS_CM_UYVY_MONO_PACKED: 16,
        ueye.IS_CM_UYVY_BAYER_PACKED: 16,
        ueye.IS_CM_CBYCRY_PACKED: 16,
    }
else:
    error_codes = {}
    bits_per_pixel = {}


[docs] def get_bits_per_pixel(color_mode): """ Returns the number of bits per pixel for the given color mode. """ if color_mode not in bits_per_pixel: raise UEyeException(f"Unknown color mode: {color_mode}") return bits_per_pixel[color_mode]
[docs] class UEyeException(Exception): """Custom exception for uEye errors.""" def __init__(self, error_code, called_from: str | None = None): self.error_code = error_code self.called_from = called_from if called_from is not None else "" def __str__(self): if self.error_code in error_codes: return f"Exception: {error_codes[self.error_code]} raised in {self.called_from}." else: for att, val in ueye.__dict__.items(): if ( att[0:2] == "IS" and val == self.error_code and ("FAILED" in att or "INVALID" in att or "ERROR" in att or "NOT" in att) ): return f"Exception: {str(self.error_code)} ({att} ? <value> {val}) raised in {self.called_from}." return f"Exception: {str(self.error_code)} raised in {self.called_from}."
[docs] def check_error(error_code, called_from: str | None = None): """ Check an error code, and raise an error if adequate. """ if error_code != ueye.IS_SUCCESS: called_from = called_from if called_from is not None else "" raise UEyeException(error_code, called_from)