229 lines
6.8 KiB
Python
229 lines
6.8 KiB
Python
|
|
"""Local Dimming 测试逻辑(Step 4 重构)。
|
|||
|
|
|
|||
|
|
从 pqAutomationApp.PQAutomationApp 中搬迁。每个函数第一行 `self = app`
|
|||
|
|
以保留原有 `self.xxx` 属性访问不变。
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import threading
|
|||
|
|
import tkinter as tk
|
|||
|
|
from tkinter import filedialog, messagebox
|
|||
|
|
|
|||
|
|
def start_local_dimming_test(app):
|
|||
|
|
"""开始 Local Dimming 测试"""
|
|||
|
|
self = app
|
|||
|
|
# 检查设备连接
|
|||
|
|
if not self.ca or not self.ucd.status:
|
|||
|
|
messagebox.showerror("错误", "请先连接 CA410 和 UCD323")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
# 禁用按钮
|
|||
|
|
self.ld_start_btn.config(state=tk.DISABLED)
|
|||
|
|
self.ld_stop_btn.config(state=tk.NORMAL)
|
|||
|
|
self.ld_save_btn.config(state=tk.DISABLED)
|
|||
|
|
|
|||
|
|
# 清空结果
|
|||
|
|
for item in self.ld_tree.get_children():
|
|||
|
|
self.ld_tree.delete(item)
|
|||
|
|
|
|||
|
|
# 获取配置
|
|||
|
|
wait_time = float(self.ld_wait_time_var.get())
|
|||
|
|
|
|||
|
|
# 在新线程中执行测试
|
|||
|
|
def run_test():
|
|||
|
|
from utils.local_dimming_test import LocalDimmingTest, LocalDimmingController
|
|||
|
|
|
|||
|
|
# 从设备当前 timing 获取分辨率
|
|||
|
|
ld_ctrl = LocalDimmingController(self.ucd)
|
|||
|
|
cur_w, cur_h = ld_ctrl.get_current_resolution()
|
|||
|
|
resolution = f"{cur_w}x{cur_h}"
|
|||
|
|
|
|||
|
|
ld_test = LocalDimmingTest(
|
|||
|
|
self.ucd,
|
|||
|
|
self.ca,
|
|||
|
|
log_callback=self.log_gui.log,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
ld_test.wait_time = wait_time
|
|||
|
|
|
|||
|
|
results = ld_test.run_test(resolution=resolution)
|
|||
|
|
|
|||
|
|
# 保存到实例变量
|
|||
|
|
self.ld_test_instance = ld_test
|
|||
|
|
self.ld_test_results = results
|
|||
|
|
|
|||
|
|
# 更新结果显示
|
|||
|
|
self.root.after(0, lambda: self.update_ld_results(results))
|
|||
|
|
|
|||
|
|
# 清理临时文件
|
|||
|
|
ld_test.cleanup()
|
|||
|
|
|
|||
|
|
# 恢复按钮状态
|
|||
|
|
self.root.after(0, lambda: self.ld_start_btn.config(state=tk.NORMAL))
|
|||
|
|
self.root.after(0, lambda: self.ld_stop_btn.config(state=tk.DISABLED))
|
|||
|
|
self.root.after(0, lambda: self.ld_save_btn.config(state=tk.NORMAL))
|
|||
|
|
|
|||
|
|
threading.Thread(target=run_test, daemon=True).start()
|
|||
|
|
|
|||
|
|
|
|||
|
|
def update_ld_results(app, results):
|
|||
|
|
"""更新 Local Dimming 结果显示"""
|
|||
|
|
self = app
|
|||
|
|
for percentage, x, y, lv, X, Y, Z in results:
|
|||
|
|
self.ld_tree.insert(
|
|||
|
|
"",
|
|||
|
|
tk.END,
|
|||
|
|
values=(f"{percentage}%", f"{lv:.2f}", f"{x:.4f}", f"{y:.4f}"),
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def stop_local_dimming_test(app):
|
|||
|
|
"""停止 Local Dimming 测试"""
|
|||
|
|
self = app
|
|||
|
|
if hasattr(self, "ld_test_instance"):
|
|||
|
|
self.ld_test_instance.stop()
|
|||
|
|
|
|||
|
|
|
|||
|
|
def send_ld_window(app, percentage):
|
|||
|
|
"""发送指定百分比的窗口"""
|
|||
|
|
self = app
|
|||
|
|
if not self.ucd.status:
|
|||
|
|
messagebox.showwarning("警告", "请先连接 UCD323 设备")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
self.log_gui.log(f"🔆 发送 {percentage}% 窗口...")
|
|||
|
|
|
|||
|
|
# 记录当前百分比(用于测量)
|
|||
|
|
self.current_ld_percentage = percentage
|
|||
|
|
|
|||
|
|
def send():
|
|||
|
|
from utils.local_dimming_test import LocalDimmingController
|
|||
|
|
|
|||
|
|
ld_controller = LocalDimmingController(self.ucd)
|
|||
|
|
|
|||
|
|
# 从设备当前 timing 获取分辨率
|
|||
|
|
width, height = ld_controller.get_current_resolution()
|
|||
|
|
|
|||
|
|
# 生成并发送图片
|
|||
|
|
success = ld_controller.send_window_pattern_with_resolution(
|
|||
|
|
percentage, width, height
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if success:
|
|||
|
|
self.root.after(
|
|||
|
|
0, lambda: self.log_gui.log(f"✅ {percentage}% 窗口已发送")
|
|||
|
|
)
|
|||
|
|
else:
|
|||
|
|
self.root.after(
|
|||
|
|
0, lambda: self.log_gui.log(f"❌ {percentage}% 窗口发送失败")
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
threading.Thread(target=send, daemon=True).start()
|
|||
|
|
|
|||
|
|
|
|||
|
|
def measure_ld_luminance(app):
|
|||
|
|
"""测量当前亮度"""
|
|||
|
|
self = app
|
|||
|
|
if not self.ca:
|
|||
|
|
messagebox.showwarning("警告", "请先连接 CA410 色度计")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
if self.current_ld_percentage is None:
|
|||
|
|
messagebox.showinfo("提示", "请先发送一个窗口图案")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
self.log_gui.log("📏 正在采集亮度...")
|
|||
|
|
|
|||
|
|
def measure():
|
|||
|
|
try:
|
|||
|
|
x, y, lv, X, Y, Z = self.ca.readAllDisplay()
|
|||
|
|
|
|||
|
|
if lv is not None:
|
|||
|
|
import datetime
|
|||
|
|
|
|||
|
|
timestamp = datetime.datetime.now().strftime("%H:%M:%S")
|
|||
|
|
|
|||
|
|
# 更新显示
|
|||
|
|
self.root.after(
|
|||
|
|
0,
|
|||
|
|
lambda: self.ld_result_label.config(
|
|||
|
|
text=f"亮度: {lv:.2f} cd/m² | x: {x:.4f} | y: {y:.4f}"
|
|||
|
|
),
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 添加到表格
|
|||
|
|
self.root.after(
|
|||
|
|
0,
|
|||
|
|
lambda: self.ld_tree.insert(
|
|||
|
|
"",
|
|||
|
|
tk.END,
|
|||
|
|
values=(
|
|||
|
|
f"{self.current_ld_percentage}%",
|
|||
|
|
f"{lv:.2f}",
|
|||
|
|
f"{x:.4f}",
|
|||
|
|
f"{y:.4f}",
|
|||
|
|
timestamp,
|
|||
|
|
),
|
|||
|
|
),
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
self.root.after(
|
|||
|
|
0, lambda: self.log_gui.log(f"✅ 采集完成: {lv:.2f} cd/m²")
|
|||
|
|
)
|
|||
|
|
else:
|
|||
|
|
self.root.after(0, lambda: self.log_gui.log("❌ 采集失败"))
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
self.root.after(0, lambda: self.log_gui.log(f"❌ 采集异常: {str(e)}"))
|
|||
|
|
|
|||
|
|
threading.Thread(target=measure, daemon=True).start()
|
|||
|
|
|
|||
|
|
|
|||
|
|
def clear_ld_records(app):
|
|||
|
|
"""清空测试记录"""
|
|||
|
|
self = app
|
|||
|
|
for item in self.ld_tree.get_children():
|
|||
|
|
self.ld_tree.delete(item)
|
|||
|
|
self.ld_result_label.config(text="亮度: -- cd/m² | x: -- | y: --")
|
|||
|
|
self.current_ld_percentage = None
|
|||
|
|
self.log_gui.log("🗑️ 测试记录已清空")
|
|||
|
|
|
|||
|
|
|
|||
|
|
def save_local_dimming_results(app):
|
|||
|
|
"""保存 Local Dimming 结果"""
|
|||
|
|
self = app
|
|||
|
|
from tkinter import filedialog
|
|||
|
|
import csv
|
|||
|
|
import datetime
|
|||
|
|
|
|||
|
|
if len(self.ld_tree.get_children()) == 0:
|
|||
|
|
messagebox.showinfo("提示", "没有可保存的数据")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
default_name = f"LocalDimming_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
|
|||
|
|
|
|||
|
|
save_path = filedialog.asksaveasfilename(
|
|||
|
|
title="保存测试结果",
|
|||
|
|
initialfile=default_name,
|
|||
|
|
defaultextension=".csv",
|
|||
|
|
filetypes=[("CSV 文件", "*.csv"), ("所有文件", "*.*")],
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if not save_path:
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
with open(save_path, "w", newline="", encoding="utf-8-sig") as f:
|
|||
|
|
writer = csv.writer(f)
|
|||
|
|
writer.writerow(["窗口百分比", "亮度 (cd/m²)", "x", "y", "时间"])
|
|||
|
|
|
|||
|
|
for item in self.ld_tree.get_children():
|
|||
|
|
values = self.ld_tree.item(item, "values")
|
|||
|
|
writer.writerow(values)
|
|||
|
|
|
|||
|
|
self.log_gui.log(f"✓ 测试结果已保存: {save_path}")
|
|||
|
|
messagebox.showinfo("成功", f"测试结果已保存到:\n{save_path}")
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
self.log_gui.log(f"❌ 保存失败: {str(e)}")
|
|||
|
|
messagebox.showerror("错误", f"保存失败: {str(e)}")
|