修改摸底测试功能、修改pattern控制逻辑

This commit is contained in:
xinzhu.yin
2026-05-13 17:17:13 +08:00
parent 9a52e34f2b
commit 0513f810bd
13 changed files with 479 additions and 3067 deletions

View File

@@ -16,6 +16,7 @@ class UCDController:
self.config = None
self.color_mode = None
self.status = False
self.current_interface = "HDMI"
self.current_timing = None
self.current_pattern = None
@@ -42,12 +43,14 @@ class UCDController:
try:
self.role = temp_dev.select_role(UniTAP.dev.UCD323.HDMISource)
self.dev = temp_dev
self.current_interface = "HDMI"
except Exception as role_error:
self._close_device_object(temp_dev)
raise role_error
self.timing_manager = self.role.hdtx.pg.timing_manager
pg, _ = self.get_tx_modules()
self.timing_manager = pg.timing_manager
self.color_mode = UniTAP.ColorInfo()
self.status = True
@@ -72,6 +75,7 @@ class UCDController:
self.current_pattern_param = None
self.current_pattern_params = None
self.current_pattern_index = 0
self.current_interface = "HDMI"
self.lUniTAP = None
@@ -94,6 +98,7 @@ class UCDController:
self.current_pattern_param = None
self.current_pattern_params = None
self.current_pattern_index = 0
self.current_interface = "HDMI"
try:
self.lUniTAP = None
@@ -139,10 +144,51 @@ class UCDController:
self.current_pattern_param = None
self.current_pattern_params = None
self.current_pattern_index = 0
self.current_interface = "HDMI"
except Exception as e:
pass
def get_tx_modules(self):
"""根据当前接口返回 (pg, ag) 模块。"""
if not self.role:
raise RuntimeError("UCD 未打开,无法获取 TX 模块")
interface = getattr(self, "current_interface", None)
if interface in (None, "HDMI"):
return self.role.hdtx.pg, self.role.hdtx.ag
if interface in ("DP", "Type-C"):
return self.role.dptx.pg, self.role.dptx.ag
raise ValueError(f"不支持的接口类型: {interface}")
def _resolve_timing(self, pg=None):
"""优先从 current_timing 读取 timing必要时回退到 TX 模块。"""
if self.current_timing is not None:
return self.current_timing
if pg is not None:
get_vm = getattr(pg, "get_vm", None)
if callable(get_vm):
try:
vm = get_vm()
return getattr(vm, "timing", None)
except Exception:
pass
return None
def get_current_resolution(self, default=(3840, 2160)):
"""从当前 timing 获取 (width, height),失败时返回 default。"""
try:
pg, _ = self.get_tx_modules()
timing = self._resolve_timing(pg)
if timing and hasattr(timing, "h_active") and hasattr(timing, "v_active"):
return timing.h_active, timing.v_active
except Exception:
pass
return default
def _cleanup(self):
"""清理设备资源"""
try:
@@ -161,6 +207,9 @@ class UCDController:
self.config = config
test_type = self.config.current_test_type
pg, _ = self.get_tx_modules()
self.timing_manager = pg.timing_manager
if test_type == "hdr_movie":
color_format_str = self.config.current_test_types[test_type]["color_format"]
color_format = UCDEnum.ColorInfo.get_color_format(color_format_str)
@@ -197,9 +246,58 @@ class UCDController:
"""运行设备"""
self.apply_video_mode()
self.apply_pattern()
self.role.hdtx.pg.apply()
pg, _ = self.get_tx_modules()
pg.apply()
return True
def send_image_pattern(self, image_path):
"""发送图片 Pattern依赖当前 timing/color_mode 状态)。"""
if not self.status or not self.role:
return False
try:
pg, _ = self.get_tx_modules()
self.apply_video_mode()
pg.set_pattern(pattern=image_path)
pg.apply()
return True
except Exception:
return False
def send_solid_rgb_pattern(self, rgb):
"""发送纯色 RGB Pattern依赖当前 timing/color_mode 状态)。"""
if not self.status or not self.role:
return False
try:
self.current_pattern = UCDEnum.VideoPatternInfo.get_video_pattern("solidcolor")
if self.current_pattern is None:
return False
return self.send_current_pattern_params(list(rgb))
except Exception:
return False
def send_current_pattern_params(self, pattern_params):
"""发送当前已配置的 pattern并可附带当前 pattern 参数。"""
if not self.status or not self.role:
return False
try:
if self.current_pattern is None:
return False
if pattern_params is not None and not self.set_pattern(
self.current_pattern,
pattern_params,
):
return False
self.run()
return True
except Exception:
return False
def set_color_mode(self, cf, bpc, cm):
"""设置颜色模式"""
current_dynamic_range = None
@@ -246,7 +344,8 @@ class UCDController:
video_mode = UniTAP.VideoMode(
timing=self.current_timing, color_info=self.color_mode
)
self.role.hdtx.pg.set_vm(vm=video_mode)
pg, _ = self.get_tx_modules()
pg.set_vm(vm=video_mode)
return True
def set_pattern(self, pattern, pattern_params=None):
@@ -292,10 +391,11 @@ class UCDController:
def apply_pattern(self):
"""应用当前pattern"""
if self.current_pattern:
self.role.hdtx.pg.set_pattern(self.current_pattern)
pg, _ = self.get_tx_modules()
pg.set_pattern(self.current_pattern)
if self.current_pattern_param:
self.role.hdtx.pg.set_pattern_params(self.current_pattern_param)
pg.set_pattern_params(self.current_pattern_param)
return True
return False