@@ -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