refacot: change name from CameraManager to CameraController. Add set_camera nad cleanup code.

This commit is contained in:
2025-09-30 18:58:56 +02:00
parent e2c8352c44
commit 196eff7fd8

View File

@@ -1,37 +1,50 @@
from PySide6.QtCore import QObject, QThread, QTimer, Signal, Slot from PySide6.QtCore import QObject, QThread, QTimer, Signal, Slot, QMutex, QMutexLocker
from PySide6.QtGui import QImage, QPixmap from PySide6.QtGui import QImage, QPixmap
import cv2 import cv2
from .base_camera import BaseCamera from .base_camera import BaseCamera
class CameraManager(QThread): class CameraController(QThread):
frame_ready = Signal(QPixmap) frame_ready = Signal(QPixmap)
photo_ready = Signal(QPixmap) photo_ready = Signal(QPixmap)
error_occurred = Signal(str) error_occurred = Signal(str)
_enable_timer = Signal(bool)
def __init__(self, camera: BaseCamera, fps: int = 15, parent: QObject | None = None) -> None:
def __init__(self, parent: QObject | None = None) -> None:
super().__init__(parent) super().__init__(parent)
self.camera = camera self.camera = None
self.fps = fps
self.timer = None self.timer = None
self.fps = 15
self.is_streaming = False self.is_streaming = False
self.is_connected = False self.is_connected = False
self.timer = QTimer() self._camera_mutex = QMutex()
self.timer.setInterval(int(1000 / self.fps))
self.timer.timeout.connect(self._update_frame)
self.start() self.start()
def run(self) -> None: def run(self) -> None:
# self.timer = QTimer() self.timer = QTimer()
# self.timer.setInterval(int(1000 / self.fps)) self.timer.timeout.connect(self._update_frame)
# self.timer.timeout.connect(self._update_frame) self._enable_timer.connect(self._set_timer)
self.exec() self.exec()
def stop(self):
self.stop_camera()
self.quit()
self.wait()
def set_camera(self, camera: BaseCamera, fps: int = 15) -> None:
with QMutexLocker(self._camera_mutex):
self.stop_stream()
self.stop_camera()
self.camera = camera
self.fps = fps
def start_camera(self) -> None: def start_camera(self) -> None:
if self.is_connected: if self.camera is None or self.is_connected:
return return
if self.camera.connect(): if self.camera.connect():
@@ -41,12 +54,14 @@ class CameraManager(QThread):
self.error_occurred.emit(self.camera.get_error_msg()) self.error_occurred.emit(self.camera.get_error_msg())
def stop_camera(self) -> None: def stop_camera(self) -> None:
self.is_streaming = False if self.is_streaming:
self.is_connected = False self.stop_stream()
if self.timer:
self.timer.stop() if self.camera is not None:
self.camera.disconnect() self.camera.disconnect()
self.is_connected = False
def start_stream(self): def start_stream(self):
if not self.is_connected: if not self.is_connected:
return return
@@ -56,16 +71,22 @@ class CameraManager(QThread):
if self.timer: if self.timer:
self.is_streaming = True self.is_streaming = True
self.timer.start() # self.timer.start()
self._enable_timer.emit(True)
def stop_stream(self) -> None: def stop_stream(self) -> None:
if self.is_streaming: if self.is_streaming:
self.is_streaming = False self.is_streaming = False
if self.timer: if self.timer:
self.timer.stop() # self.timer.stop()
self._enable_timer.emit(False)
def _update_frame(self) -> None: def _update_frame(self) -> None:
if not self.is_streaming or not self.is_connected: with QMutexLocker(self._camera_mutex):
if self.camera is None or not self.is_connected:
return
if not self.is_streaming:
return return
ret, frame = self.camera.get_frame() ret, frame = self.camera.get_frame()
@@ -82,7 +103,13 @@ class CameraManager(QThread):
self.frame_ready.emit(pixmap) self.frame_ready.emit(pixmap)
def stop(self): def _set_timer(self, enable: bool):
self.stop_camera() if not self.timer:
self.quit() return
self.wait()
if enable:
self.timer.setInterval(int(1000 / self.fps))
self.timer.start()
else:
self.timer.stop()