39 lines
1.4 KiB
Python
39 lines
1.4 KiB
Python
from __future__ import annotations
|
|
from dataclasses import dataclass
|
|
|
|
from pygui.backend.models.frame import Frame
|
|
from pygui.backend.models.frame_stats import Stats, compute_stats
|
|
from pygui.backend.models.stability_detector import StabilityDetector
|
|
from pygui.backend.models.threshold_classifier import ThresholdConfig, classify, resolve_bounds
|
|
|
|
@dataclass(frozen=True)
|
|
class SessionUpdate:
|
|
seq: int
|
|
values: list[float]
|
|
bands: list[str]
|
|
stats: Stats
|
|
state: str
|
|
target: float
|
|
margin: float
|
|
|
|
class SessionModel:
|
|
def __init__(self, thresholds: ThresholdConfig | None = None) -> None:
|
|
self._config = thresholds or ThresholdConfig()
|
|
self._stability = StabilityDetector()
|
|
|
|
def set_thresholds(self, config: ThresholdConfig) -> None:
|
|
self._config = config
|
|
|
|
def reset(self) -> None:
|
|
self._stability.reset()
|
|
|
|
def process(self, frame: Frame) -> SessionUpdate:
|
|
stats = compute_stats(frame.values)
|
|
target, margin = resolve_bounds(frame.values, self._config)
|
|
bands = [classify(v, target, margin)for v in frame.values]
|
|
# State always track the user's process set_point, even in auto-color mode.
|
|
state = self._stability.update(stats.avg, frame.time, self._config.set_point)
|
|
return SessionUpdate(
|
|
seq=frame.seq, values=frame.values, bands=bands,
|
|
stats=stats, state=state, target=target, margin=margin,
|
|
) |