diff --git a/controllers/camera_controller.py b/controllers/camera_controller.py index 3bd212d..ed186c0 100644 --- a/controllers/camera_controller.py +++ b/controllers/camera_controller.py @@ -1,11 +1,14 @@ -import gphoto2 as gp +# import gphoto2 as gp import numpy as np import cv2 from PySide6.QtCore import QObject, QThread, Signal from PySide6.QtGui import QImage, QPixmap - +# try: + # import gphoto2 as gp +# except: +from . import mock_gphoto as gp class CameraWorker(QObject): frameReady = Signal(QPixmap) @@ -20,7 +23,7 @@ class CameraWorker(QObject): def start_camera(self): """Uruchom kamerę i zacznij pobierać klatki""" try: - self.camera = gp.Camera() + self.camera = gp.Camera() # type: ignore self.camera.init() self.running = True self._capture_loop() @@ -81,7 +84,7 @@ class CameraController(QObject): self.worker.errorOccurred.connect(self.errorOccurred) # sygnały start/stop - self.camera_thread .started.connect(self.worker.start_camera) + self.camera_thread.started.connect(self.worker.start_camera) def start(self): """Start kamery w osobnym wątku""" diff --git a/controllers/main_controller.py b/controllers/main_controller.py index bc82411..b84a8c3 100644 --- a/controllers/main_controller.py +++ b/controllers/main_controller.py @@ -1,10 +1,11 @@ +from PySide6.QtWidgets import QPushButton from pathlib import Path from core.database import DatabaseManager from core.media import MediaRepository from ui.widgets.color_list_widget import ColorListWidget from ui.widgets.thumbnail_list_widget import ThumbnailListWidget from ui.widgets.split_view_widget import SplitView -from PySide6.QtWidgets import QPushButton +from .camera_controller import CameraController class MainController: @@ -14,6 +15,8 @@ class MainController: self.media_repo = MediaRepository(self.db) self.media_repo.sync_media() + self.camera_controller = CameraController() + self.view = view self.color_list: ColorListWidget = view.color_list_widget self.thumbnail_list: ThumbnailListWidget = view.thumbnail_widget @@ -26,6 +29,13 @@ class MainController: self.color_list.editColor.connect(self.on_edit_color) self.thumbnail_list.selectedThumbnail.connect(self.on_thumbnail_selected) + self.camera_controller.errorOccurred.connect(self.split_view.widget_start.set_info_text) + self.camera_controller.frameReady.connect(self.split_view.set_live_image) + self.split_view.widget_start.camera_start_btn.clicked.connect(self.camera_controller.start) + + def start_camera(self): + pass + def load_colors(self) -> None: colors = self.db.get_all_colors() print("Loaded colors:", colors) diff --git a/controllers/mock_gphoto.py b/controllers/mock_gphoto.py new file mode 100644 index 0000000..bbe6bc5 --- /dev/null +++ b/controllers/mock_gphoto.py @@ -0,0 +1,64 @@ +import cv2 +import numpy as np + +class GPhoto2Error(Exception): + pass + + +class CameraFileMock: + """Mock obiektu zwracanego przez gphoto2.Camera.capture_preview()""" + + def __init__(self, frame: np.ndarray): + # Kodowanie do JPEG, żeby symulować prawdziwe dane z kamery + success, buf = cv2.imencode(".jpg", frame) + if not success: + raise GPhoto2Error("Nie udało się zakodować ramki testowej.") + self._data = buf.tobytes() + + def get_data_and_size(self): + return self._data + return self._data, len(self._data) + + +class Camera: + def __init__(self): + self._frame_counter = 0 + self._running = False + + def init(self): + self._running = True + print("[my_gphoto] Kamera MOCK zainicjalizowana") + + def exit(self): + self._running = False + print("[my_gphoto] Kamera MOCK wyłączona") + + def capture_preview(self): + if not self._running: + raise GPhoto2Error("Kamera MOCK nie jest uruchomiona") + + # przykład 1: wczytaj stały obrazek z pliku + # frame = cv2.imread("test_frame.jpg") + # if frame is None: + # raise GPhoto2Error("Nie znaleziono test_frame.jpg") + + # przykład 2: wygeneruj kolorową planszę + h, w = 480, 640 + color = (self._frame_counter % 255, 100, 200) + frame = np.full((h, w, 3), color, dtype=np.uint8) + + # dodanie napisu + text = "OBRAZ TESTOWY" + font = cv2.FONT_HERSHEY_SIMPLEX + scale = 1.5 + thickness = 3 + color_text = (255, 255, 255) + + (text_w, text_h), _ = cv2.getTextSize(text, font, scale, thickness) + x = (w - text_w) // 2 + y = (h + text_h) // 2 + cv2.putText(frame, text, (x, y), font, scale, color_text, thickness, cv2.LINE_AA) + + + self._frame_counter += 1 + return CameraFileMock(frame)