|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
3 | 3 | from dataclasses import dataclass |
| 4 | +from pathlib import Path |
4 | 5 | from typing import Any |
5 | 6 |
|
6 | 7 | from fastcs.attributes import AttrHandlerRW, AttrR, AttrRW, AttrW |
7 | 8 | from fastcs.connections import IPConnection, IPConnectionSettings |
8 | | -from fastcs.controller import BaseController, Controller, SubController |
9 | | -from fastcs.datatypes import Float, Int, String |
| 9 | +from fastcs.controller import BaseController, Controller |
| 10 | +from fastcs.datatypes import Float, String |
10 | 11 | from fastcs.launch import FastCS |
11 | 12 | from fastcs.transport.epics.ca.options import EpicsCAOptions |
12 | | -from fastcs.transport.epics.options import EpicsIOCOptions |
| 13 | +from fastcs.transport.epics.options import EpicsGUIOptions, EpicsIOCOptions |
13 | 14 |
|
14 | 15 |
|
15 | 16 | @dataclass |
16 | 17 | class TemperatureControllerHandler(AttrHandlerRW): |
17 | 18 | command_name: str |
18 | 19 | update_period: float | None = 0.2 |
19 | | - _controller: TemperatureController | TemperatureRampController | None = None |
| 20 | + _controller: TemperatureController | None = None |
20 | 21 |
|
21 | 22 | async def initialise(self, controller: BaseController): |
22 | | - assert isinstance(controller, TemperatureController | TemperatureRampController) |
| 23 | + assert isinstance(controller, TemperatureController) |
23 | 24 | self._controller = controller |
24 | 25 |
|
25 | 26 | @property |
26 | | - def controller(self) -> TemperatureController | TemperatureRampController: |
| 27 | + def controller(self) -> TemperatureController: |
27 | 28 | if self._controller is None: |
28 | 29 | raise RuntimeError("Handler not initialised") |
29 | 30 |
|
30 | 31 | return self._controller |
31 | 32 |
|
32 | 33 | async def update(self, attr: AttrR): |
33 | 34 | response = await self.controller.connection.send_query( |
34 | | - f"{self.command_name}{self.controller.suffix}?\r\n" |
| 35 | + f"{self.command_name}?\r\n" |
35 | 36 | ) |
36 | 37 | value = response.strip("\r\n") |
37 | 38 |
|
38 | 39 | await attr.set(attr.dtype(value)) |
39 | 40 |
|
40 | 41 | async def put(self, attr: AttrW, value: Any): |
41 | 42 | await self.controller.connection.send_command( |
42 | | - f"{self.command_name}{self.controller.suffix}={value}\r\n" |
| 43 | + f"{self.command_name}={attr.dtype(value)}\r\n" |
43 | 44 | ) |
44 | 45 |
|
45 | 46 |
|
46 | | -class TemperatureRampController(SubController): |
47 | | - start = AttrRW(Int(), handler=TemperatureControllerHandler("S")) |
48 | | - end = AttrRW(Int(), handler=TemperatureControllerHandler("E")) |
49 | | - |
50 | | - def __init__(self, index: int, connection: IPConnection): |
51 | | - self.suffix = f"{index:02d}" |
52 | | - |
53 | | - super().__init__(f"Ramp{self.suffix}") |
54 | | - |
55 | | - self.connection = connection |
56 | | - |
57 | | - |
58 | 47 | class TemperatureController(Controller): |
59 | 48 | device_id = AttrR(String(), handler=TemperatureControllerHandler("ID")) |
60 | 49 | power = AttrR(Float(), handler=TemperatureControllerHandler("P")) |
61 | 50 | ramp_rate = AttrRW(Float(), handler=TemperatureControllerHandler("R")) |
62 | 51 |
|
63 | | - suffix = "" |
64 | | - |
65 | | - def __init__(self, ramp_count: int, settings: IPConnectionSettings): |
| 52 | + def __init__(self, settings: IPConnectionSettings): |
66 | 53 | super().__init__() |
67 | 54 |
|
68 | 55 | self._ip_settings = settings |
69 | 56 | self.connection = IPConnection() |
70 | 57 |
|
71 | | - self._ramp_controllers: list[TemperatureRampController] = [] |
72 | | - for idx in range(1, ramp_count + 1): |
73 | | - ramp_controller = TemperatureRampController(idx, self.connection) |
74 | | - self._ramp_controllers.append(ramp_controller) |
75 | | - self.register_sub_controller(f"R{idx}", ramp_controller) |
76 | | - |
77 | 58 | async def connect(self): |
78 | 59 | await self.connection.connect(self._ip_settings) |
79 | 60 |
|
80 | 61 |
|
81 | | -epics_options = EpicsCAOptions(ca_ioc=EpicsIOCOptions(pv_prefix="DEMO")) |
| 62 | +gui_options = EpicsGUIOptions( |
| 63 | + output_path=Path(".") / "demo.bob", title="Demo Temperature Controller" |
| 64 | +) |
| 65 | +epics_options = EpicsCAOptions( |
| 66 | + gui=gui_options, |
| 67 | + ca_ioc=EpicsIOCOptions(pv_prefix="DEMO"), |
| 68 | +) |
82 | 69 | connection_settings = IPConnectionSettings("localhost", 25565) |
83 | | -fastcs = FastCS(TemperatureController(4, connection_settings), [epics_options]) |
| 70 | +fastcs = FastCS(TemperatureController(connection_settings), [epics_options]) |
| 71 | + |
| 72 | +fastcs.create_gui() |
84 | 73 |
|
85 | 74 | # fastcs.run() # Commented as this will block |
0 commit comments