Source code for semi_cr.core.lab.station.context.static
from dataclasses import dataclass, field
from typing import Literal
import networkx as nx
from semi_cr.core.lab.station.base import (
ConfigBundle,
InstrumentSpec,
)
from semi_cr.core.lab.station.graphing.context import ConfigContext
from semi_cr.core.lab.station.graphing.static_builder import (
build_wiring_graph,
)
from semi_cr.core.lab.station.graphing.view import graph_view
from .config import build_instrument_specs
[docs]
@dataclass
class InfrastructureContext:
wiring_config: ConfigBundle
electronics_config: ConfigBundle
config: ConfigBundle = field(init=False)
graph: nx.MultiDiGraph = field(init=False)
def __post_init__(self) -> None:
self.config = ConfigBundle.combine(
self.wiring_config,
self.electronics_config,
)
self.graph = self.build_graph()
[docs]
def build_graph(self) -> nx.MultiDiGraph:
return build_wiring_graph(self.config.config)
[docs]
def view_graph(
self,
what: Literal["nodes", "edges", "both"] = "both",
include_attrs: bool = True,
):
return graph_view(
self.graph,
what=what,
include_attrs=include_attrs,
)
[docs]
@dataclass
class StaticStationContext:
"""
Description of the complete station without talking to hardware.
"""
device: ConfigContext
infrastructure: InfrastructureContext
config: ConfigBundle = field(init=False)
instruments: dict[str, InstrumentSpec] = field(init=False)
graph: nx.MultiDiGraph = field(init=False)
def __post_init__(self) -> None:
self.config = ConfigBundle.combine(
self.device.config,
self.infrastructure.config,
)
self.instruments = build_instrument_specs(
self.config.config
)
self.graph = build_wiring_graph(
self.config.config
)