import time from oak_fcc3_manager import OakFcc3Manager class OakFcc3Service: def __init__(self, timeout=10, **kwargs): self.timeout = timeout self.manager = OakFcc3Manager(**kwargs) self.connected = False def connect(self): self.connected = True return {"ok": True, "backend": "oak_fcc3", "connected": True} def disconnect(self): self.stop() self.connected = False return {"ok": True, "connected": False} def ping(self): return { "ok": True, "backend": "oak_fcc3", "msg": "pong", "ts": time.time(), } def get_status(self): status = self.manager.get_status() active_ids = [c["id"] for c in status.get("cameras", [])] status.update({ "ok": True, "connected": self.connected, "active_camera_ids": active_ids, "camera_count_active": len(active_ids), }) return status def get_config(self): return { "ok": True, "fps": self.manager.fps, "width": self.manager.width, "height": self.manager.height, "frame_type": self.manager.frame_type, "output_dtype": self.manager.output_dtype, "capture_mode": self.manager.capture_mode, "raw_policy": self.manager.raw_policy, "sync_mode": getattr(self.manager, "sync_mode", "best"), "sync_tolerance_ms": self.manager.sync_tolerance_ms, } def set_fps(self, fps): self._ensure_stopped_for_config() self.manager.fps = int(fps) return {"ok": True, "fps": self.manager.fps} def set_resolution(self, width, height): self._ensure_stopped_for_config() self.manager.width = int(width) self.manager.height = int(height) self.manager.size = (self.manager.width, self.manager.height) return { "ok": True, "width": self.manager.width, "height": self.manager.height, } def set_capture_mode(self, mode): self._ensure_stopped_for_config() mode = str(mode).upper() if mode not in ("AUTO", "SINGLE", "DOUBLE", "TRIPLE"): raise ValueError(f"capture_mode inválido: {mode}") self.manager.capture_mode = mode return {"ok": True, "capture_mode": self.manager.capture_mode} def set_frame_type(self, frame_type): self._ensure_stopped_for_config() frame_type = str(frame_type).upper() if frame_type not in ("RAW_BRUTO", "RGB", "MULTISPEC"): raise ValueError(f"frame_type inválido: {frame_type}") self.manager.frame_type = frame_type return {"ok": True, "frame_type": self.manager.frame_type} def set_output_dtype(self, dtype): self._ensure_stopped_for_config() dtype = str(dtype).lower() if dtype not in ("uint8", "uint16", "float32"): raise ValueError(f"output_dtype inválido: {dtype}") self.manager.output_dtype = dtype return {"ok": True, "output_dtype": self.manager.output_dtype} def begin(self, frame_type=None, output_dtype=None, capture_mode=None): if frame_type is not None: self.set_frame_type(frame_type) if output_dtype is not None: self.set_output_dtype(output_dtype) if capture_mode is not None: self.set_capture_mode(capture_mode) self.manager.start() return { "ok": True, "started": True, "status": self.get_status(), } def capture_frame(self, timeout=None): if timeout is None: timeout = self.timeout frame, meta = self.manager.get_next_frame(timeout=timeout) return frame, meta def stop(self): self.manager.stop() return {"ok": True, "stopped": True} def _ensure_stopped_for_config(self): if self.manager.running: raise RuntimeError( "Configuração estrutural só pode ser alterada com o manager parado. " "Chame stop() antes." )