Skip to content

Commit c696a97

Browse files
committed
refactor: amend pva structure to add intermediate ControllerVector level
1 parent 09c9842 commit c696a97

File tree

2 files changed

+24
-35
lines changed

2 files changed

+24
-35
lines changed

src/fastcs/transport/epics/ca/ioc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ def _add_sub_controller_pvi_info(pv_prefix: str, parent: ControllerAPI):
114114
for child in parent.sub_apis.values():
115115
child_pvi = f"{controller_pv_prefix(pv_prefix, child)}:PVI"
116116
child_name = (
117-
f"{child.path[-2]}{child.path[-1]}" # Parent name + child idx
117+
f"__{child.path[-1]}" # Sub-Controller of ControllerVector
118118
if isinstance(child.path[-1], int)
119-
else str(child.path[-1]) # Child name
119+
else str(child.path[-1])
120120
)
121121

122122
_add_pvi_info(child_pvi, parent_pvi, child_name.lower())

src/fastcs/transport/epics/pva/pvi_tree.py

Lines changed: 22 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -69,54 +69,44 @@ def get_recursively(self, *args: str) -> "PviDevice":
6969
d = d[arg]
7070
return d
7171

72-
def _get_signal_infos(self) -> dict[str, _PviSignalInfo]:
73-
device_signal_infos: dict[str, _PviSignalInfo] = {}
72+
def _get_signal_infos(
73+
self,
74+
) -> dict[str, tuple[_PviSignalInfo, ControllerAPI | None]]:
75+
device_signal_infos: dict[str, tuple[_PviSignalInfo, ControllerAPI | None]] = {}
7476

7577
for sub_device_name, sub_device in self.items():
7678
if sub_device:
77-
device_signal_infos[f"{sub_device_name}:PVI"] = _PviSignalInfo(
78-
pv=f"{sub_device.pv_prefix}:PVI", access="d"
79+
device_signal_infos[f"{sub_device_name}:PVI"] = (
80+
_PviSignalInfo(pv=f"{sub_device.pv_prefix}:PVI", access="d"),
81+
sub_device.controller_api,
7982
)
8083
if sub_device.device_signal_info:
81-
device_signal_infos[sub_device_name] = sub_device.device_signal_info
84+
device_signal_infos[sub_device_name] = (
85+
sub_device.device_signal_info,
86+
sub_device.controller_api,
87+
)
8288

8389
return device_signal_infos
8490

8591
def _make_p4p_raw_value(self) -> dict:
8692
p4p_raw_value = defaultdict(dict)
87-
for pv_leaf, signal_info in self._get_signal_infos().items():
93+
for pv_leaf, signal_info_and_api in self._get_signal_infos().items():
94+
# Sub-controller api returned if current item is a Controller
95+
signal_info, sub_controller_api = signal_info_and_api
8896
stripped_leaf = pv_leaf.removesuffix(":PVI")
89-
is_controller = stripped_leaf != pv_leaf
90-
if is_controller and self.controller_api and not stripped_leaf.isdigit():
91-
sub_api = self.controller_api.sub_apis[stripped_leaf]
92-
# Check if sub-device has sub-devices with numeric names
93-
vector_children = [
94-
child for child in sub_api.sub_apis.keys() if isinstance(child, int)
95-
]
96-
# Sub-device is a ControllerVector
97-
if vector_children:
98-
# Check if ControllerVector has a 'd' entry
99-
if (
100-
signal_info.access
101-
not in p4p_raw_value[_pascal_to_snake(stripped_leaf)]
102-
):
103-
p4p_raw_value[_pascal_to_snake(stripped_leaf)][
104-
signal_info.access
105-
] = {}
106-
# Group entries for all vector children
107-
for vector_child in vector_children:
108-
p4p_raw_value[_pascal_to_snake(stripped_leaf)][
109-
signal_info.access
110-
][
111-
f"v{vector_child}"
112-
] = f"{signal_info.pv.removesuffix(':PVI')}:{vector_child}:PVI"
113-
# Sub-device is a Controller
97+
# Add Controller entry
98+
if sub_controller_api:
99+
# Sub-device of a ControllerVector
100+
if isinstance(sub_controller_api.path[-1], int):
101+
p4p_raw_value[f"__{int(stripped_leaf)}"][signal_info.access] = (
102+
signal_info.pv
103+
)
114104
else:
115105
p4p_raw_value[_pascal_to_snake(stripped_leaf)][
116106
signal_info.access
117107
] = signal_info.pv
118108
# Add attribute entry
119-
elif not is_controller:
109+
else:
120110
attr_pvi_name = f"{stripped_leaf}"
121111
p4p_raw_value[attr_pvi_name][signal_info.access] = signal_info.pv
122112

@@ -209,7 +199,6 @@ def add_sub_device(
209199
if ":" not in device_pv:
210200
assert device_pv == self._pvi_tree_root.pv_prefix
211201
self._pvi_tree_root.description = description
212-
self._pvi_tree_root.controller_api = controller_api
213202
else:
214203
self._pvi_tree_root.get_recursively(
215204
*device_pv.split(":")[1:] # To remove the prefix

0 commit comments

Comments
 (0)