Skip to content

Commit b9269d2

Browse files
committed
Proposal API
1 parent bdab4fa commit b9269d2

File tree

8 files changed

+100
-16
lines changed

8 files changed

+100
-16
lines changed

src/fastcs/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
"""
88

99
from ._version import __version__
10+
from .main import FastCS as FastCS
1011

1112
__all__ = ["__version__"]

src/fastcs/backend.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import asyncio
2+
from abc import ABC, abstractmethod
23
from collections import defaultdict
34
from collections.abc import Callable
45
from concurrent.futures import Future
@@ -12,7 +13,7 @@
1213
from .mapping import Mapping, SingleMapping
1314

1415

15-
class Backend:
16+
class Backend(ABC):
1617
def __init__(
1718
self, controller: Controller, loop: asyncio.AbstractEventLoop | None = None
1819
):
@@ -47,6 +48,12 @@ def run(self):
4748

4849
self._run()
4950

51+
def create_docs(self) -> None:
52+
self._create_docs()
53+
54+
def create_gui(self) -> None:
55+
self._create_gui()
56+
5057
def _run_initial_tasks(self):
5158
for task in self._initial_tasks:
5259
future = asyncio.run_coroutine_threadsafe(task(), self._loop)
@@ -58,8 +65,17 @@ def _start_scan_tasks(self):
5865
for task in scan_tasks:
5966
asyncio.run_coroutine_threadsafe(task(), self._loop)
6067

61-
def _run(self):
62-
raise NotImplementedError("Specific Backend must implement _run")
68+
@abstractmethod
69+
def _run(self) -> None:
70+
pass
71+
72+
@abstractmethod
73+
def _create_docs(self) -> None:
74+
pass
75+
76+
@abstractmethod
77+
def _create_gui(self) -> None:
78+
pass
6379

6480

6581
def _link_single_controller_put_tasks(single_mapping: SingleMapping) -> None:

src/fastcs/backends/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
from .asyncio_backend import AsyncioBackend
22
from .epics.backend import EpicsBackend
3+
from .epics.backend import EpicsOptions as EpicsOptions
4+
from .epics.docs import EpicsDocsOptions as EpicsDocsOptions
5+
from .epics.gui import EpicsGUIOptions as EpicsGUIOptions
6+
from .epics.ioc import EpicsIOCOptions as EpicsIOCOptions
37
from .tango.backend import TangoBackend
8+
from .tango.backend import TangoDSROptions as TangoDSROptions
9+
from .tango.backend import TangoOptions as TangoOptions
410

511
__all__ = ["EpicsBackend", "AsyncioBackend", "TangoBackend"]
Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from dataclasses import dataclass, field
2+
13
from fastcs.backend import Backend
24
from fastcs.controller import Controller
35

@@ -6,18 +8,32 @@
68
from .ioc import EpicsIOC, EpicsIOCOptions
79

810

11+
@dataclass
12+
class EpicsOptions:
13+
docs: EpicsDocsOptions = field(default_factory=EpicsDocsOptions)
14+
gui: EpicsGUIOptions = field(default_factory=EpicsGUIOptions)
15+
ioc: EpicsIOCOptions = field(default_factory=EpicsIOCOptions)
16+
17+
918
class EpicsBackend(Backend):
10-
def __init__(self, controller: Controller, pv_prefix: str = "MY-DEVICE-PREFIX"):
19+
def __init__(
20+
self, controller: Controller, options: EpicsOptions | None = None
21+
) -> None:
1122
super().__init__(controller)
1223

13-
self._pv_prefix = pv_prefix
14-
self._ioc = EpicsIOC(pv_prefix, self._mapping)
24+
if options is None:
25+
self.options = EpicsOptions()
26+
else:
27+
self.options = options
28+
29+
self._pv_prefix = self.options.ioc.pv_prefix
30+
self._ioc = EpicsIOC(self.options.ioc.pv_prefix, self._mapping)
1531

16-
def create_docs(self, options: EpicsDocsOptions | None = None) -> None:
17-
EpicsDocs(self._mapping).create_docs(options)
32+
def _create_docs(self) -> None:
33+
EpicsDocs(self._mapping).create_docs(self.options.docs)
1834

19-
def create_gui(self, options: EpicsGUIOptions | None = None) -> None:
20-
EpicsGUI(self._mapping, self._pv_prefix).create_gui(options)
35+
def _create_gui(self) -> None:
36+
EpicsGUI(self._mapping, self._pv_prefix).create_gui(self.options.gui)
2137

22-
def _run(self, options: EpicsIOCOptions | None = None):
23-
self._ioc.run(self._dispatcher, self._context, options)
38+
def _run(self):
39+
self._ioc.run(self._dispatcher, self._context, self.options.ioc)

src/fastcs/backends/epics/ioc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
@dataclass
2626
class EpicsIOCOptions:
2727
terminal: bool = True
28+
pv_prefix: str = "MY-DEVICE-PREFIX"
2829

2930

3031
class EpicsIOC:
Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,32 @@
1+
from dataclasses import dataclass, field
2+
13
from fastcs.backend import Backend
24
from fastcs.controller import Controller
35

4-
from .dsr import TangoDSR
6+
from .dsr import TangoDSR, TangoDSROptions
7+
8+
9+
@dataclass
10+
class TangoOptions:
11+
dsr: TangoDSROptions = field(default_factory=TangoDSROptions)
512

613

714
class TangoBackend(Backend):
8-
def __init__(self, controller: Controller):
15+
def __init__(self, controller: Controller, options: TangoOptions | None = None):
916
super().__init__(controller)
1017

18+
if options is None:
19+
self.options = TangoOptions()
20+
else:
21+
self.options = options
22+
1123
self._dsr = TangoDSR(self._mapping)
1224

13-
def _run(self):
14-
self._dsr.run()
25+
def _create_docs(self) -> None:
26+
raise NotImplementedError
27+
28+
def _create_gui(self) -> None:
29+
raise NotImplementedError
30+
31+
def _run(self) -> None:
32+
self._dsr.run(self.options.dsr)

src/fastcs/connections/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
from .ip_connection import IPConnection
2+
from .ip_connection import IPConnectionSettings as IPConnectionSettings
3+
from .ip_connection import StreamConnection as StreamConnection
4+
from .serial_connection import SerialConnection as SerialConnection
5+
from .serial_connection import SerialConnectionSettings as SerialConnectionSettings
26

37
__all__ = ["IPConnection"]

src/fastcs/main.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from .backends.epics.backend import EpicsBackend, EpicsOptions
2+
from .backends.tango.backend import TangoBackend, TangoOptions
3+
from .controller import Controller
4+
5+
6+
class FastCS:
7+
def __init__(self, controller: Controller, options: EpicsOptions | TangoOptions):
8+
self.backend: EpicsBackend | TangoBackend
9+
match options:
10+
case EpicsOptions():
11+
self.backend = EpicsBackend(controller, options)
12+
case TangoOptions():
13+
self.backend = TangoBackend(controller, options)
14+
15+
def create_docs(self) -> None:
16+
self.backend.create_docs()
17+
18+
def create_gui(self) -> None:
19+
self.backend.create_gui()
20+
21+
def run(self) -> None:
22+
self.backend.run()

0 commit comments

Comments
 (0)