47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
"""Native single-device LibreVNA service used by acquisition and device-limit queries."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
|
|
from python_app.hardware_full.librevna_backends import NativeLibreVnaBackend
|
|
from python_app.hardware_full.librevna_driver.models import SweepResult
|
|
from python_app.models.run_config_model import RadarSweepModel
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class LibreVnaService:
|
|
"""Provide the native single-device API; factories select mock acquisition."""
|
|
|
|
serial: str | None = None
|
|
strict_protocol_version: int = 14
|
|
backend_mode: str = "auto"
|
|
_backend: NativeLibreVnaBackend = field(init=False, repr=False)
|
|
|
|
def __post_init__(self) -> None:
|
|
if self.backend_mode.strip().lower() not in {"auto", "native"}:
|
|
raise ValueError(f"Unsupported native LibreVNA backend mode: {self.backend_mode}")
|
|
self._backend = NativeLibreVnaBackend(self.serial, self.strict_protocol_version)
|
|
|
|
def open(self) -> None:
|
|
self._backend.open()
|
|
|
|
def close(self) -> None:
|
|
self._backend.close()
|
|
|
|
def configure(self, sweep: RadarSweepModel) -> None:
|
|
self._backend.configure(sweep)
|
|
|
|
def read_device_limits(self) -> dict[str, float | int]:
|
|
opened_here = not self._backend.is_open
|
|
try:
|
|
if opened_here:
|
|
self.open()
|
|
return self._backend.read_device_limits()
|
|
finally:
|
|
if opened_here:
|
|
self.close()
|
|
|
|
def acquire(self) -> SweepResult:
|
|
return self._backend.acquire()
|