133 lines
4.1 KiB
Python
133 lines
4.1 KiB
Python
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."
|
|
) |