"""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)