重构UCD模块

This commit is contained in:
xinzhu.yin
2026-06-11 15:53:41 +08:00
parent 38222ff002
commit cc7218411c
11 changed files with 395 additions and 188 deletions

View File

@@ -54,9 +54,10 @@ class UCDController:
self._close_device_object(temp_dev)
raise role_error
pg, _ = self.get_tx_modules()
pg, ag = self.get_tx_modules()
self.timing_manager = pg.timing_manager
self.color_info = UniTAP.ColorInfo()
self._stop_audio_output(ag)
self.status = True
return True
@@ -82,6 +83,10 @@ class UCDController:
"""关闭设备"""
try:
if self.dev:
try:
self._stop_audio_output()
except Exception:
pass
self._close_device_object(self.dev)
self._reset_state()
@@ -152,6 +157,28 @@ class UCDController:
return self.role.dptx.pg, self.role.dptx.ag
raise ValueError(f"不支持的接口类型: {interface}")
def _stop_audio_output(self, ag=None) -> None:
"""关闭 HDMI/DP 音频发生器。PQ 测试仅需视频图案,避免电视持续输出测试音。"""
if not self.status or not self.role:
return
try:
if ag is None:
_, ag = self.get_tx_modules()
ag.stop_generate()
log.info("UCDController._stop_audio_output done")
except Exception:
log.exception("UCDController._stop_audio_output failed")
def _apply_pg_output(self, pg) -> bool:
"""提交 PG 输出,并确保音频发生器处于关闭状态。"""
try:
ok = bool(pg.apply())
except Exception:
log.exception("UCDController._apply_pg_output pg.apply failed")
return False
self._stop_audio_output()
return ok
def _resolve_timing(self, pg=None):
"""优先从 current_timing 读取 timing必要时回退到 TX 模块。"""
if self.current_timing is not None:
@@ -253,9 +280,9 @@ class UCDController:
self.apply_pattern()
pg, _ = self.get_tx_modules()
log.info("UCDController.run calling pg.apply()")
pg.apply()
log.info("UCDController.run done")
return True
ok = self._apply_pg_output(pg)
log.info("UCDController.run done ok=%s", ok)
return ok
def send_image_pattern(self, image_path):
"""发送图片 Pattern依赖当前 timing/color_info 状态)。"""
@@ -264,10 +291,11 @@ class UCDController:
try:
pg, _ = self.get_tx_modules()
self.apply_video_mode()
# 仅切换图案,不重复 set_vm重复 apply video mode 会触发电视 HDMI 重锁发声。
if getattr(self, "_last_sent_config", None) is None:
self.apply_video_mode()
pg.set_pattern(pattern=image_path)
pg.apply()
return True
return self._apply_pg_output(pg)
except Exception:
return False
@@ -323,6 +351,9 @@ class UCDController:
current_dynamic_range = self.color_info.dynamic_range
color_format = UCDEnum.ColorInfo.get_color_format(cf)
if color_format is None:
fmt_key = UCDEnum.SignalFormat.OutputFormat.get_format_key(cf)
color_format = UCDEnum.ColorInfo.get_color_format(fmt_key)
if color_format is None:
return False
@@ -369,12 +400,17 @@ class UCDController:
self.color_info.dynamic_range,
self.color_info.bpc,
)
if not self.format_changed:
log.info("UCDController.set_video_mode skipped pg.set_vm(): config unchanged")
return True
video_mode = UniTAP.VideoMode(
timing=self.current_timing, color_info=self.color_info
)
pg, _ = self.get_tx_modules()
log.info("UCDController.set_video_mode calling pg.set_vm()")
pg.set_vm(vm=video_mode)
self._stop_audio_output()
log.info("UCDController.set_video_mode done")
self._last_sent_config = current_config
return True