Source code for ska_mid_cbf_fhs_common.helpers.dish_id

"""Helper functions for DISH ID conversion."""

SKA_DISH_INSTANCE_MIN = 1
SKA_DISH_INSTANCE_MAX = 133
MKT_DISH_INSTANCE_MAX = 63
DISH_INSTANCE_NUM_BITS = 12
MKT_DISH_TYPE_NUM = 0
SKA_DISH_TYPE_NUM = 1
MKT_DISH_TYPE_STR = "MKT"
SKA_DISH_TYPE_STR = "SKA"
DISH_TYPE_STR_LEN = 3


[docs] def convert_dish_id_uint16_t_to_mnemonic(numerical_dish_id: int) -> str: if numerical_dish_id == 0xFFFF: return "DIDINV" # Check the dish type mnemonic dish_type_uint = (numerical_dish_id & 0xF000) >> DISH_INSTANCE_NUM_BITS if dish_type_uint not in (SKA_DISH_TYPE_NUM, MKT_DISH_TYPE_NUM): raise ValueError(f"Incorrect DISH type {dish_type_uint}. First four bits must be 0000 (MKT) or 0001 (SKA)") # Convert to DISH TYPE mnemonic dish_type_str = SKA_DISH_TYPE_STR if dish_type_uint == SKA_DISH_TYPE_NUM else MKT_DISH_TYPE_STR dish_instance_uint = numerical_dish_id & 0x0FFF # Extract number from last 12 bits and validate if dish_type_str == SKA_DISH_TYPE_STR and (dish_instance_uint < SKA_DISH_INSTANCE_MIN or dish_instance_uint > SKA_DISH_INSTANCE_MAX): raise ValueError( f"Incorrect DISH instance {dish_instance_uint}. Dish instance for SKA DISH type is {SKA_DISH_INSTANCE_MIN} to {SKA_DISH_INSTANCE_MAX} incl." ) if dish_type_str == MKT_DISH_TYPE_STR and dish_instance_uint > MKT_DISH_INSTANCE_MAX: raise ValueError(f"Incorrect DISH instance {dish_instance_uint}. Dish instance for MKT DISH type is 0 to {MKT_DISH_INSTANCE_MAX} incl.") dish_instance_str = str(dish_instance_uint) padding_length = DISH_TYPE_STR_LEN - min(DISH_TYPE_STR_LEN, len(dish_instance_str)) return dish_type_str + "0" * padding_length + dish_instance_str