Skip to content

Commit aef8ff5

Browse files
committed
ioc now successfully runs
Need to improve the subfield system
1 parent 02dafb4 commit aef8ff5

File tree

6 files changed

+165
-164
lines changed

6 files changed

+165
-164
lines changed

src/fastcs_pandablocks/gui.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from fastcs.backends.epics.gui import EpicsGUIOptions
22

33

4-
class PandaGUIOptions(EpicsGUIOptions):
5-
...
4+
class PandaGUIOptions(EpicsGUIOptions): ...

src/fastcs_pandablocks/panda/blocks.py

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,23 @@ def __init__(
2626

2727
for field_raw_name, field_info in raw_fields.items():
2828
field_panda_name = PandaName(field=field_raw_name)
29-
print(field_raw_name)
3029

3130
field = FIELD_TYPE_TO_FASTCS_TYPE[field_info.type][field_info.subtype](
32-
field_panda_name, field_info.description
31+
# TODO make type safe after match statment
32+
field_panda_name,
33+
field_info, # type: ignore
3334
)
3435
self.fields[field_raw_name] = field
35-
self.register_sub_controller(field_panda_name.attribute_name, field)
36+
if field.only_contains_subfields:
37+
self.register_sub_controller(field_panda_name.attribute_name, field)
38+
else:
39+
assert field.attribute_name, field
40+
setattr(
41+
self,
42+
field_panda_name.attribute_name,
43+
getattr(field, field.attribute_name),
44+
)
45+
3646

3747
class Blocks:
3848
_blocks: dict[str, dict[int | None, Block]]
@@ -51,11 +61,15 @@ def parse_introspected_data(
5161
):
5262
iterator = (
5363
range(1, block_info.number + 1)
54-
if block_info.number > 1 else iter([None,])
64+
if block_info.number > 1
65+
else iter(
66+
[
67+
None,
68+
]
69+
)
5570
)
5671
self._blocks[block_name] = {
57-
number:
58-
Block(
72+
number: Block(
5973
PandaName(block=block_name, block_number=number),
6074
block_info.number,
6175
block_info.description,
@@ -67,23 +81,20 @@ def parse_introspected_data(
6781
async def update_field_value(self, panda_name: PandaName, value: str):
6882
assert panda_name.block
6983
assert panda_name.field
70-
field = (
71-
self._blocks[panda_name.block][panda_name.block_number].fields[panda_name.field]
72-
)
84+
field = self._blocks[panda_name.block][panda_name.block_number].fields[
85+
panda_name.field
86+
]
7387
if panda_name.sub_field:
7488
field = field.sub_fields[panda_name.sub_field]
7589
await field.update_value(value)
7690

77-
def flattened_attribute_tree(
78-
self
79-
) -> Generator[tuple[str, Block], None, None]:
91+
def flattened_attribute_tree(self) -> Generator[tuple[str, Block], None, None]:
8092
for blocks in self._blocks.values():
8193
for block in blocks.values():
8294
yield (block.panda_name.attribute_name, block)
8395

8496
def __getitem__(
85-
self,
86-
name: EpicsName | PandaName
97+
self, name: EpicsName | PandaName
8798
) -> dict[int | None, Block] | Block | FieldType:
8899
if name.block is None:
89100
raise ValueError(f"Cannot find block for name {name}.")

src/fastcs_pandablocks/panda/controller.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from fastcs.controller import Controller
44
from fastcs.wrappers import scan
55

6-
from fastcs_pandablocks import DEFAULT_POLL_PERIOD
76
from fastcs_pandablocks.types import PandaName
87

98
from .blocks import Blocks
@@ -12,16 +11,16 @@
1211

1312
class PandaController(Controller):
1413
def __init__(self, hostname: str, poll_period: float) -> None:
15-
super().__init__()
1614
self._raw_panda = RawPanda(hostname)
1715
self._blocks = Blocks()
16+
self.is_connected = False
1817

19-
# TODO https://github.com/DiamondLightSource/FastCS/issues/62
20-
#self.fastcs_method = Scan(self.update(), poll_period)
21-
22-
async def initialise(self) -> None: ...
18+
super().__init__()
2319

2420
async def connect(self) -> None:
21+
if self.is_connected:
22+
return
23+
2524
await self._raw_panda.connect()
2625

2726
assert self._raw_panda.blocks
@@ -32,7 +31,17 @@ async def connect(self) -> None:
3231
for attr_name, controller in self._blocks.flattened_attribute_tree():
3332
self.register_sub_controller(attr_name, controller)
3433

35-
@scan(DEFAULT_POLL_PERIOD) # TODO https://github.com/DiamondLightSource/FastCS/issues/62
34+
self.is_connected = True
35+
36+
async def initialise(self) -> None:
37+
"""
38+
We connect in initialise since FastCS doesn't connect until
39+
it's already parsed sub controllers.
40+
"""
41+
await self.connect()
42+
43+
# TODO https://github.com/DiamondLightSource/FastCS/issues/62
44+
@scan(0.1)
3645
async def update(self):
3746
await self._raw_panda.get_changes()
3847
assert self._raw_panda.changes

0 commit comments

Comments
 (0)