Skip to content

Commit 5fdb5e7

Browse files
author
James Souter
committed
update demo controller to use AttributeIO/Ref
1 parent d4c9167 commit 5fdb5e7

File tree

1 file changed

+36
-33
lines changed

1 file changed

+36
-33
lines changed

src/fastcs/demo/controllers.py

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@
44
import enum
55
import json
66
from dataclasses import dataclass
7-
from typing import Any
87

9-
from fastcs.attributes import AttrHandlerRW, AttrR, AttrRW, AttrW
8+
from fastcs.attribute_io import AttributeIO
9+
from fastcs.attribute_io_ref import AttributeIORef
10+
from fastcs.attributes import AttrR, AttrRW, AttrW
1011
from fastcs.connections import IPConnection, IPConnectionSettings
11-
from fastcs.controller import BaseController, Controller, SubController
12-
from fastcs.datatypes import Enum, Float, Int
12+
from fastcs.controller import Controller, SubController
13+
from fastcs.datatypes import Enum, Float, Int, T
1314
from fastcs.wrappers import command, scan
1415

1516

@@ -24,47 +25,45 @@ class TemperatureControllerSettings:
2425
ip_settings: IPConnectionSettings
2526

2627

27-
@dataclass
28-
class TemperatureControllerHandler(AttrHandlerRW):
28+
@dataclass(kw_only=True)
29+
class TemperatureControllerAttributeIORef(AttributeIORef):
2930
name: str
3031
update_period: float | None = 0.2
31-
_controller: TemperatureController | TemperatureRampController | None = None
32-
33-
async def initialise(self, controller: BaseController):
34-
assert isinstance(controller, TemperatureController | TemperatureRampController)
35-
self._controller = controller
3632

37-
@property
38-
def controller(self) -> TemperatureController | TemperatureRampController:
39-
if self._controller is None:
40-
raise RuntimeError("Handler not initialised")
4133

42-
return self._controller
34+
class TemperatureControllerAttributeIO(
35+
AttributeIO[T, TemperatureControllerAttributeIORef]
36+
):
37+
def __init__(self, connection: IPConnection, suffix: str):
38+
self._connection = connection
39+
self.suffix = suffix
4340

44-
async def put(self, attr: AttrW, value: Any) -> None:
45-
await self.controller.connection.send_command(
46-
f"{self.name}{self.controller.suffix}={attr.dtype(value)}\r\n"
41+
async def send(self, attr: AttrW[T], value: T) -> None:
42+
await self._connection.send_command(
43+
f"{attr.io_ref.name}{self.suffix}={attr.dtype(value)}\r\n"
4744
)
4845

49-
async def update(self, attr: AttrR) -> None:
46+
async def update(self, attr: AttrR[T]) -> None:
5047
response = await self.controller.connection.send_query(
51-
f"{self.name}{self.controller.suffix}?\r\n"
48+
f"{attr.io_ref.name}{self.suffix}?\r\n"
5249
)
5350
response = response.strip("\r\n")
5451

5552
await attr.set(attr.dtype(response))
5653

5754

5855
class TemperatureController(Controller):
59-
ramp_rate = AttrRW(Float(), handler=TemperatureControllerHandler("R"))
60-
power = AttrR(Float(), handler=TemperatureControllerHandler("P"))
56+
ramp_rate = AttrRW(Float(), io_ref=TemperatureControllerAttributeIORef(name="R"))
57+
power = AttrR(Float(), io_ref=TemperatureControllerAttributeIORef(name="P"))
6158

6259
def __init__(self, settings: TemperatureControllerSettings) -> None:
63-
super().__init__()
64-
60+
self.connection = IPConnection()
6561
self.suffix = ""
62+
super().__init__(
63+
ios=[TemperatureControllerAttributeIO(self.connection, self.suffix)]
64+
)
65+
6666
self._settings = settings
67-
self.connection = IPConnection()
6867

6968
self._ramp_controllers: list[TemperatureRampController] = []
7069
for index in range(1, settings.num_ramp_controllers + 1):
@@ -95,14 +94,18 @@ async def update_voltages(self):
9594

9695

9796
class TemperatureRampController(SubController):
98-
start = AttrRW(Int(), handler=TemperatureControllerHandler("S"))
99-
end = AttrRW(Int(), handler=TemperatureControllerHandler("E"))
100-
enabled = AttrRW(Enum(OnOffEnum), handler=TemperatureControllerHandler("N"))
101-
target = AttrR(Float(prec=3), handler=TemperatureControllerHandler("T"))
102-
actual = AttrR(Float(prec=3), handler=TemperatureControllerHandler("A"))
97+
start = AttrRW(Int(), io_ref=TemperatureControllerAttributeIORef(name="S"))
98+
end = AttrRW(Int(), io_ref=TemperatureControllerAttributeIORef(name="E"))
99+
enabled = AttrRW(
100+
Enum(OnOffEnum), io_ref=TemperatureControllerAttributeIORef(name="N")
101+
)
102+
target = AttrR(Float(prec=3), io_ref=TemperatureControllerAttributeIORef(name="T"))
103+
actual = AttrR(Float(prec=3), io_ref=TemperatureControllerAttributeIORef(name="A"))
103104
voltage = AttrR(Float(prec=3))
104105

105106
def __init__(self, index: int, conn: IPConnection) -> None:
106-
self.suffix = f"{index:02d}"
107-
super().__init__(f"Ramp{self.suffix}")
107+
suffix = f"{index:02d}"
108+
super().__init__(
109+
f"Ramp{self.suffix}", ios=[TemperatureControllerAttributeIO(conn, suffix)]
110+
)
108111
self.connection = conn

0 commit comments

Comments
 (0)