更新UCD-API库及文档

This commit is contained in:
xinzhu.yin
2026-07-02 17:16:18 +08:00
parent a500751d85
commit 9fa811a9eb
290 changed files with 9558 additions and 2306 deletions

View File

@@ -142,45 +142,25 @@ class DUTTests:
- Make report after testing `make_report`.
- Run test from file `run_from_file` - Not implemented. Will be added later.
"""
__DEFAULT_TEST_PARAMETERS = None
def __init__(self, dev_io: DeviceIO):
self.__io = dev_io
self.__opf_device = None
self.__results = []
self.__default_parameters = {}
self.__test_groups = {}
self.__parser = Parser()
self.__io.set_test_config(0)
cfp_path = os.path.join(os.path.dirname(__file__), 'cfg')
files = os.listdir(cfp_path)
for file in files:
try:
if not os.path.isfile(os.path.join(cfp_path, file)):
continue
with open(os.path.join(cfp_path, file), encoding='UTF-8') as cfg_json:
json_obj = json.load(cfg_json)
item_group = MergedTestGroups(int(json_obj.get('id'), 16))
group_type = MERGED_GROUP_PARAMS_TYPE.get(item_group, None)
if group_type is None:
continue
group_parameters_dict = {}
for parameter in json_obj.get('descriptions'):
group_parameters_dict[parameter["id"]] = parameter
self.__default_parameters[group_type] = group_type(group_parameters_dict)
except ValueError:
logging.info(
f"[UniTAP] Failed to load {os.path.join(cfp_path, file)}.\n Value {int(json_obj.get('id'), 16)} is missing in MergedTestGroups.")
test_list = self.__io.get_test_list()
for test in test_list:
test_id = test[0] & 0xFFFF
group_id = TestGroupId(test[0] >> 16)
try:
group_id = TestGroupId(test[0] >> 16)
except BaseException as e:
logging.info(e)
continue
name = test[2]
if test[2].find(' / ') != -1:
@@ -201,6 +181,49 @@ class DUTTests:
self.__test_groups[group_id]._add_new_test(Test(name=test_name, test_id=test_id))
@staticmethod
def __enumerate_and_get_default_test_parameters():
if DUTTests.__DEFAULT_TEST_PARAMETERS is None:
DUTTests.__DEFAULT_TEST_PARAMETERS = {}
cfp_path = os.path.join(os.path.dirname(__file__), 'cfg')
files = os.listdir(cfp_path)
for file in files:
try:
if not os.path.isfile(os.path.join(cfp_path, file)):
continue
with open(os.path.join(cfp_path, file), encoding='UTF-8') as cfg_json:
json_obj = json.load(cfg_json)
item_group = MergedTestGroups(int(json_obj.get('id'), 16))
group_type = MERGED_GROUP_PARAMS_TYPE.get(item_group, None)
if group_type is None:
continue
group_parameters_dict = {}
for parameter in json_obj.get('descriptions'):
group_parameters_dict[parameter["id"]] = parameter
DUTTests.__DEFAULT_TEST_PARAMETERS[group_type] = group_type(group_parameters_dict)
except ValueError:
logging.info(
f"[UniTAP] Failed to load {os.path.join(cfp_path, file)}.\n Value {int(json_obj.get('id'), 16)} is missing in MergedTestGroups.")
return DUTTests.__DEFAULT_TEST_PARAMETERS
@staticmethod
def __is_dsc_parameters_changed(param: Dp21SourceDUTTestParam):
assert isinstance(param, Dp21SourceDUTTestParam)
result = []
dsc_vm_params = vars(param.dsc_video_modes)
for key in dsc_vm_params:
vm_param_dict = vars(dsc_vm_params[key])
result.append(any(vm_param_dict[param_key].is_modified for param_key in vm_param_dict))
return any(result)
def run(self, group_id: TestGroupId, test_id: int, params: Optional[DUTTestParameters] = None,
print_fw_logs: bool = True, test_delay: int = 0) -> SubTestResultObject:
"""
@@ -234,8 +257,11 @@ class DUTTests:
if params is not None:
params_list = get_param_list(params)
if isinstance(params, Dp21SourceDUTTestParam) and not params.dsc_video_modes._Dp21AvailableDscVideoModes__is_config_changed:
logging.warning("Detected that used didn't change new DSC config. Copy setting from video config.")
#
# Backward compatibility with old config
#
if isinstance(params, Dp21SourceDUTTestParam):
dsc_dp2_ci_remapper = {
"TSI_DP20_SRCCTS_DSC_VMT_1920_1080_30": "TSI_DP20_SRCCTS_VMT_1920_1080_30",
"TSI_DP20_SRCCTS_DSC_VMT_1920_1080_60": "TSI_DP20_SRCCTS_VMT_1920_1080_60",
@@ -259,27 +285,33 @@ class DUTTests:
"TSI_DP20_SRCCTS_DSC_VMT_10240_4320_60": "TSI_DP20_SRCCTS_VMT_10240_4320_60"
}
for key in dsc_dp2_ci_remapper.keys():
dst = next((obj for obj in params_list if obj.config_id_name == key), None)
src = next((obj for obj in params_list if obj.config_id_name == dsc_dp2_ci_remapper[key]), None)
if not DUTTests.__is_dsc_parameters_changed(params):
logging.warn("Detected that user didn't change new DSC config. Copy setting from video config.")
if dst.default_value != src.default_value:
logging.warn(f"DSC Config missmatch detected. Apply workaround: {key}:{hex(dst.default_value)}; {dsc_dp2_ci_remapper[key]}:{hex(src.default_value)}")
dst.default_value = src.default_value
for key in dsc_dp2_ci_remapper.keys():
dst = next((obj for obj in params_list if obj.config_id_name == key), None)
src = next((obj for obj in params_list if obj.config_id_name == dsc_dp2_ci_remapper[key]), None)
if dst.default_value != src.default_value:
logging.warn(
f"DSC Config missmatch detected. Apply workaround: {key}:{hex(dst.default_value)}; {dsc_dp2_ci_remapper[key]}:{hex(src.default_value)}")
dst.default_value = src.default_value
else:
logging.warn(f"DSC Config modification detected. Skip workaround.")
else:
params_list = self.__default_parameters[merged_group_id]
params_list = DUTTests.__enumerate_and_get_default_test_parameters()[merged_group_id]
for item in params_list:
if group_id == TestGroupId.AUDIO_TEST and item.config_id_name == "TSI_REF1_FRAME_DATA":
if isinstance(item.default_value, str) and os.path.exists(item.default_value):
image_data = read_image_file(item.default_value)
image_data, file_extension = read_image_file(item.default_value)
if len(image_data) > 0:
item.default_value = uicl_image_preparation(image_data, params)
# It is assumed that the bin file already contains prepared data,
# otherwise there is no way to determine whether additional conversion is required.
item.default_value = uicl_image_preparation(image_data, params, file_extension == ".bin")
elif isinstance(item, bytearray):
# TODO: add 'bytearray' support
item.default_value = uicl_image_preparation(item.default_value, params)
item.default_value = uicl_image_preparation(item.default_value, params, False)
self.__io.set(item.config_id, item.default_value, dict_types.get(item.value_type),
item.data_length)
@@ -315,41 +347,51 @@ class DUTTests:
result_obj.test_delay = test_delay
self.__results.append(result_obj)
time.sleep(test_delay)
return copy.deepcopy(self.__results[-1])
def get_params_from_file(self, path: str) -> Tuple[TestGroupId, int, DUTTestParameters]:
@staticmethod
def get_params_from_file(path: str) -> Tuple[TestGroupId, int, DUTTestParameters]:
"""
Get test parameters from transferred file: td or json (not cdf).
Args:
path ('str') - full path to config file
"""
self.__parser.set_file_name(path)
group_id = self.__parser.detect_group()
test_id = self.__parser.detect_test()
parser = Parser()
parser.set_file_name(path)
group_id = parser.detect_group()
test_id = parser.detect_test()
group_type = group_params_dict.get(group_id)
params = self.__parser.parse(self.get_default_parameters(group_type))
params = parser.parse(DUTTests.get_default_parameters(group_type))
return group_id, test_id, params
# TODO - add support parsing '.td' (other test groups) file extension
def get_params_from_cdf_file(self, path: str) -> DUTTestParameters:
@staticmethod
def get_params_from_cdf_file(path: str) -> DUTTestParameters:
"""
Get test parameters from transferred file: json (cdf).
Args:
path ('str') - full path to config file
"""
self.__parser.set_file_name(path)
group_id = self.__parser.detect_merged_group()
parser = Parser()
parser.set_file_name(path)
group_id = parser.detect_merged_group()
group_type = MERGED_GROUP_PARAMS_TYPE.get(group_id)
params = self.__parser.parse(self.get_default_parameters(group_type))
params = parser.parse(DUTTests.get_default_parameters(group_type))
return params
def get_default_parameters(self, group_type: Type[DUTTestParameters]) -> DUTTestParameters:
@staticmethod
def get_default_parameters(group_type: Type[DUTTestParameters]) -> DUTTestParameters:
"""
Get predefined (default) parameters of test group.
@@ -359,9 +401,9 @@ class DUTTests:
Returns:
object of `DUTTestParameters` type
"""
for group_id in self.__default_parameters.keys():
if isinstance(self.__default_parameters.get(group_id), group_type):
return copy.deepcopy(self.__default_parameters.get(group_id))
for group_id in DUTTests.__enumerate_and_get_default_test_parameters().keys():
if isinstance(DUTTests.__enumerate_and_get_default_test_parameters().get(group_id), group_type):
return copy.deepcopy(DUTTests.__enumerate_and_get_default_test_parameters().get(group_id))
raise ValueError(f"Group {group_type} is not available.")
def number_tests_in_group(self, group_id: TestGroupId) -> int: