44import enum
55import json
66from 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
1011from 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
1314from 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
5855class 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
9796class 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