重构UCD模块
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user