From 362c8a2977cc25125fb5c2ef02abe0582786e9e3 Mon Sep 17 00:00:00 2001 From: appleb_m Date: Fri, 22 May 2026 15:23:03 +0200 Subject: [PATCH] DAQ: added runtime protocols --- src/aare/daq/operations/common/runtime.py | 95 +++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/aare/daq/operations/common/runtime.py diff --git a/src/aare/daq/operations/common/runtime.py b/src/aare/daq/operations/common/runtime.py new file mode 100644 index 00000000..9f8df901 --- /dev/null +++ b/src/aare/daq/operations/common/runtime.py @@ -0,0 +1,95 @@ +from dataclasses import dataclass +from typing import Protocol + +from aare.common.models import DAQStatusModel, SampleShortInfo +from aare.common.sample_geometry import SampleGeometryModel +from aare.daq.config import BeamlineStateEnum + +from aare.daq.operations.screenshot.service import ScreenshotService + + +class SampleProvider(Protocol): + @property + def sample(self) -> SampleShortInfo | None: ... + + +class SampleGeometryProvider(Protocol): + @property + def sample_geometry(self) -> SampleGeometryModel: ... + + +class StatusProvider(Protocol): + @property + def status(self) -> DAQStatusModel: ... + + +class StateSetter(Protocol): + def set_state(self, target: BeamlineStateEnum) -> None: ... + + +class SmargonTraceAppender(Protocol): + def append_smargon_trace(self, *, sample_id: int | None, event: str) -> None: ... + + +class PredictionGetter(Protocol): + def get_predictions(self): ... + + +class FaceDetectionProgressReporter(Protocol): + def emit_progress(self, payload: dict) -> None: ... + + +@dataclass +class DAQRuntimeState: + sample_provider: SampleProvider + sample_geometry_provider: SampleGeometryProvider + status_provider: StatusProvider + + @property + def sample(self) -> SampleShortInfo | None: + return self.sample_provider.sample + + @property + def sample_geometry(self) -> SampleGeometryModel: + return self.sample_geometry_provider.sample_geometry + + @property + def status(self) -> DAQStatusModel: + return self.status_provider.status + + +@dataclass +class StateController: + setter: StateSetter + + def set_state(self, target: BeamlineStateEnum) -> None: + self.setter.set_state(target) + + +@dataclass +class TraceWriter: + appender: SmargonTraceAppender + + def append_smargon_trace(self, *, sample_id: int | None, event: str) -> None: + self.appender.append_smargon_trace(sample_id=sample_id, event=event) + + +@dataclass +class PredictionProvider: + getter: PredictionGetter + + def get_predictions(self): + return self.getter.get_predictions() + + +@dataclass +class FaceDetectionProgressEmitter: + reporter: FaceDetectionProgressReporter + + def emit_progress(self, payload: dict) -> None: + self.reporter.emit_progress(payload) + + +@dataclass +class OperationServices: + screenshots: ScreenshotService \ No newline at end of file