@@ -258,17 +258,35 @@ async def introspect_panda(
258
258
259
259
values , all_values_dict = _create_dicts_from_changes (changes , block_dict )
260
260
261
- panda_dict = {}
262
- for (block_name , block_info ), field_info in zip (
263
- block_dict .items (), field_infos , strict = False
264
- ):
265
- panda_dict [block_name ] = _BlockAndFieldInfo (
266
- block_info = block_info , fields = field_info , values = values [block_name ]
261
+ panda_dict = {
262
+ block_name : _BlockAndFieldInfo (block_info , field_info , values [block_name ])
263
+ for (block_name , block_info ), field_info in zip (
264
+ block_dict .items (), field_infos , strict = False
267
265
)
266
+ }
268
267
269
268
return (panda_dict , all_values_dict )
270
269
271
270
271
+ def extract_label_from_metadata (block_name_number , field_name : str ):
272
+ #
273
+ # Parse *METADATA.LABEL_<block><num> into "<block>" key and
274
+ # "<block><num>:LABEL" value
275
+ if block_name_number .startswith ("*METADATA" ) and field_name .startswith ("LABEL_" ):
276
+ _ , block_name_number = field_name .split ("_" , maxsplit = 1 )
277
+
278
+ # The block is fixed with metadata, it should end with a number
279
+ # "*METADATA.LABEL_SEQ2": "NewSeqMetadataLabel",
280
+ if not block_name_number [- 1 ].isdigit ():
281
+ raise ValueError (
282
+ f"Recieved metadata for a block name { block_name_number } that "
283
+ "didn't contain a number"
284
+ )
285
+
286
+ return block_name_number
287
+ return None
288
+
289
+
272
290
def _create_dicts_from_changes (
273
291
changes : Changes , block_info_dict : dict [str , BlockInfo ]
274
292
) -> tuple [dict [str , dict [EpicsName , RecordValue ]], dict [EpicsName , RecordValue ]]:
@@ -298,22 +316,12 @@ def _store_values(
298
316
299
317
block_name_number , field_name = block_and_field_name .split ("." , maxsplit = 1 )
300
318
301
- # Parse *METADATA.LABEL_<block><num> into "<block>" key and
302
- # "<block><num>:LABEL" value
303
- if block_name_number .startswith ("*METADATA" ) and field_name .startswith (
304
- "LABEL_"
319
+ if label_block_name_number := extract_label_from_metadata (
320
+ block_name_number , field_name
305
321
):
306
- _ , block_name_number = field_name .split ("_" , maxsplit = 1 )
307
-
308
- # The block is fixed with metadata, it should end with a number
309
- # "*METADATA.LABEL_SEQ2": "NewSeqMetadataLabel",
310
- if not block_name_number [- 1 ].isdigit ():
311
- raise ValueError (
312
- f"Recieved metadata for a block name { block_name_number } that "
313
- "didn't contain a number"
314
- )
322
+ block_name_number = label_block_name_number
323
+ block_name_no_number = re .sub (r"\d*$" , "" , label_block_name_number )
315
324
316
- block_name_no_number = re .sub (r"\d*$" , "" , block_name_number )
317
325
number_of_blocks = block_info_dict [block_name_no_number ].number
318
326
319
327
if number_of_blocks == 1 :
@@ -2093,7 +2101,6 @@ async def update(
2093
2101
2094
2102
for field , value in changes .values .items ():
2095
2103
field = PandAName (field )
2096
- field = panda_to_epics_name (field )
2097
2104
2098
2105
if field not in all_records :
2099
2106
logging .error (
0 commit comments