diff --git a/src/app.py b/src/app.py index 7d867d2..3b9e85c 100644 --- a/src/app.py +++ b/src/app.py @@ -1,3 +1,4 @@ +import logging from collections.abc import Generator from datetime import UTC, datetime from typing import Any @@ -9,6 +10,9 @@ from src.camera import camera app = Flask(__name__) +logging.basicConfig(level=logging.INFO) + + @app.get("/heartbeat") def heartbeat() -> tuple[Response, int]: return ( diff --git a/src/camera.py b/src/camera.py index 234f8d8..61687d3 100644 --- a/src/camera.py +++ b/src/camera.py @@ -54,22 +54,25 @@ class Camera: def _capture_loop(self) -> None: assert self._picam is not None - # warm up — let the sensor settle self._stop_event.wait(0.5) - logger.info("Capture loop started") + logger.info("Capture loop: starting") while not self._stop_event.is_set(): try: - # capture raw numpy array then encode to JPEG manually + logger.info("Capture loop: attempting capture_array") array = self._picam.capture_array("main") + logger.info(f"Capture loop: got array {array.shape}") buffer = io.BytesIO() img = Image.fromarray(array) img.save(buffer, format="JPEG", quality=85) + frame = buffer.getvalue() + logger.info(f"Capture loop: encoded JPEG {len(frame)} bytes") with self._lock: - self._frame = buffer.getvalue() - self._frame_event.set() # signal first frame is ready + self._frame = frame + self._frame_event.set() + logger.info("Capture loop: frame event set") except Exception as e: - logger.error(f"Capture error: {e}") + logger.error(f"Capture loop ERROR: {e}", exc_info=True) self._stop_event.wait(0.1) def stop(self) -> None: