Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
4832525
Add Basler trigger support and timeout handling
C-Achard Jun 19, 2026
d9d3d01
Remove PYLON_CAMEMU test comment
C-Achard Jun 19, 2026
e155969
Make trigger config dialog backend-aware
C-Achard Jun 19, 2026
ef06c35
Support basler backend in trigger defaults
C-Achard Jun 19, 2026
9ccb8d8
Throttle hardware-trigger wait logs
C-Achard Jun 19, 2026
2813cc5
Enhance FakePylon and add Basler backend tests
C-Achard Jun 19, 2026
acbf23f
Throttle trigger-wait logs, mark Basler test xfail
C-Achard Jun 19, 2026
11e6b0f
Update multi_camera_controller.py
C-Achard Jun 19, 2026
fdf3584
Basler backend: add timing and FPS config
C-Achard Jun 23, 2026
0b83a64
style: apply pre-commit
C-Achard Jul 14, 2026
ea39ecd
Update basler_backend.py
C-Achard Jul 16, 2026
48df4ef
Fix multi-camera shutdown synchronization
C-Achard Jul 16, 2026
0d58b7b
Handle only PyPylon timeout errors
C-Achard Jul 16, 2026
73e4bdd
Test Basler timeout mapping for trigger reads
C-Achard Jul 16, 2026
4d99c74
Harden multi-camera shutdown lifecycle
C-Achard Jul 16, 2026
72d12ad
Do not use software as auto mode for source
C-Achard Jul 16, 2026
9cf6ef1
Preserve runtime info when clearing workers
C-Achard Jul 16, 2026
490d9b5
Stabilize Basler timeout mapping test
C-Achard Jul 16, 2026
acf9a4e
Stop injecting GenTL trigger save defaults
C-Achard Aug 11, 2026
d04bca9
Stop auto-initializing camera trigger config
C-Achard Aug 11, 2026
2e79d7b
Revise trigger config behavior tests
C-Achard Aug 11, 2026
42bbb1f
Disable CAMEMU debug setting
C-Achard Aug 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
607 changes: 580 additions & 27 deletions dlclivegui/cameras/backends/basler_backend.py

Large diffs are not rendered by default.

22 changes: 6 additions & 16 deletions dlclivegui/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,23 +225,13 @@ def set_trigger_settings(self, trigger: CameraTriggerSettings, backend: str | No
ns["trigger"] = trigger.to_properties()

def with_save_defaults(self) -> CameraSettings:
out = self.model_copy(deep=True)

backend = (out.backend or "").lower()
if backend != "gentl":
return out

if not isinstance(out.properties, dict):
out.properties = {}

ns = out.properties.setdefault("gentl", {})
if not isinstance(ns, dict):
ns = {}
out.properties["gentl"] = ns

ns.setdefault("trigger", CameraTriggerSettings().to_properties())
"""
Return a serializable deep copy.

return out
Runtime defaults (incl. TriggerSettings) are applied
when settings are read and not inserted into the saved config.
"""
return self.model_copy(deep=True)


class CameraTriggerSettings(BaseModel):
Expand Down
19 changes: 1 addition & 18 deletions dlclivegui/gui/camera_config/camera_config_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
)

from ...cameras.factory import CameraFactory, DetectedCamera, apply_detected_identity, camera_identity_key
from ...config import CameraSettings, CameraTriggerSettings, MultiCameraSettings
from ...config import CameraSettings, MultiCameraSettings
from .loaders import CameraLoadWorker, CameraProbeWorker, CameraScanState, DetectCamerasWorker
from .preview import PreviewSession, PreviewState, apply_crop, apply_rotation, resize_to_fit, to_display_pixmap
from .trigger_config_dialog import TriggerConfigDialog
Expand Down Expand Up @@ -818,21 +818,6 @@ def _on_active_camera_selected(self, row: int) -> None:
self._load_camera_to_form(cam)
self._start_probe_for_camera(cam, apply_to_requested=False)

def _ensure_default_trigger_config(self, cam: CameraSettings) -> None:
backend = (cam.backend or "").lower()
if backend != "gentl":
return

if not isinstance(cam.properties, dict):
cam.properties = {}

ns = cam.properties.setdefault("gentl", {})
if not isinstance(ns, dict):
ns = {}
cam.properties["gentl"] = ns

ns.setdefault("trigger", CameraTriggerSettings().model_dump(exclude_none=True))

def _add_selected_camera(self) -> None:
if not self._commit_pending_edits(reason="before adding a new camera"):
return
Expand Down Expand Up @@ -883,7 +868,6 @@ def _add_selected_camera(self) -> None:
properties={},
)
apply_detected_identity(new_cam, detected, backend)
self._ensure_default_trigger_config(new_cam)
self._working_settings.cameras.append(new_cam)
new_index = len(self._working_settings.cameras) - 1
new_item = QListWidgetItem(self._format_camera_label(new_cam, new_index))
Expand Down Expand Up @@ -1003,7 +987,6 @@ def _load_camera_to_form(self, cam: CameraSettings) -> None:
self.cam_crop_y0.setValue(cam.crop_y0)
self.cam_crop_x1.setValue(cam.crop_x1)
self.cam_crop_y1.setValue(cam.crop_y1)
self._ensure_default_trigger_config(cam)
self.apply_settings_btn.setEnabled(True)
self._set_detected_labels(cam)
finally:
Expand Down
Loading