agrobot_base/Python/OAK/datasets/oak-fcc-3/oak_fcc3_service.py

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."
)