Author SHA1 Message Date
hulk e902503807 chore: 仓库更名 LT8619C_Debug_Tools → HW-Debug-Tools
- Gitea 仓库已改名(旧地址自动重定向),git remote 同步更新
2026-09-28 10:01:16 +08:00
hulk 108ff64624 feat: 图标改为家族版式绿色款(同 FlashTool 色系)并重打包
- 黑底/绿色圆角框 rgb(0,200,120)/框内黑字 Serial + 白字 Mate, 与 DLPilot/EDID-Viewer/FlashTool 同版式
2026-09-28 09:37:54 +08:00
hulk 9810809fd9 docs(agent): 记录 SerialMate v0.1.0 已推送并发布 Release 2026-09-27 18:58:44 +08:00
hulk d133906d32 feat: 新增 SerialMate 串口调试助手 v0.1.0
- 协议帧构成令牌序列可定制(包头/板ID/LEN口径/5种CRC x 3种覆盖), 默认兼容 DLPilot 光机协议
2026-09-27 18:52:54 +08:00
hulk d5566714ff docs: 关闭 0x606E 0x40/0x80 位交换实测待办(用户确认现状符合预期);M305 自测向量降为低优先 2026-09-25 02:12:25 +08:00
hulk f90ac0d8e9 docs(agent): 记录画面镜像新需求 —— DLPC3421 14h 原生支持横/纵独立翻转,含 39h 命名陷阱警示 2026-09-25 02:08:44 +08:00
hulk 7d15d31d74 docs: agent 文档体系按用户级默认工作约定重整为开发需求与进度管理 2026-09-25 01:48:18 +08:00
hulk 4dddcd00c9 docs(I2C-Inject): 标记暂停开发 —— 代码与固件保留备查,根 README 同步状态 2026-09-25 01:41:43 +08:00
hulk 51b560d840 docs: 根 README 补充 EDID-Viewer(工具一览/环境/目录/发布流程) 2026-09-25 01:40:17 +08:00
hulk 68d70497d4 feat(EDID-Viewer): v0.1.0 入库 — Fluent EDID 查看器,目录对齐 DLPilot
- src/ 人写代码:main.py(Fluent 界面、Light/Dark/dark1/dark2/跟随系统主题、
  关于按钮;主题三件套 = setTheme + QPalette/应用级 QSS + DWM 标题栏,
  修复 Light 下窗口背景/页签/标题栏仍为系统深色的问题)、edid.py
  (EDID/CTA/HDMI/HDR 解析)、windows_edid.py(WMI 只读)、theme.py、
  test_edid.py(9 项解析测试,含随机畸形数据无崩溃检查)
- assets/ 图标与生成脚本;release/ 交付:EDID-Viewer.exe(onefile 63.7MB,
  启动/图标/主题已验证)+ README,与 DLPilot/release 同约定 exe 直接入库
- 流水线对齐 DLPilot:src/build_exe.py(spec 由脚本生成不入库,剔除 PATH 上
  Poppler/Conda 版本化 ICU,避免 QtCore 报 WinError 127)→
  package_release.py(组装 EDID-Viewer-v*-win64.zip,zip 只上传 Gitea)→
  publish_gitea.py(token 走 GITEA_TOKEN,自签证书 --insecure)
- agent.md 更名 AGENTS.md(DLPilot 双文档约定:README 给人 / AGENTS.md 给
  Agent);根 .gitignore 增加 EDID-viewer/release/*.zip
- validation/ 保留 EDID 本机/合成样本与窗口截图、关于对话框自检脚本
2026-09-24 22:34:02 +08:00
hulk 74b64dcfd5 feat(DLPilot): v0.4.0 — PySide6-Fluent-Widgets UI and Light theme 2026-09-24 19:09:24 +08:00
hulk cf61916a9a 落盘agent.md文件 2026-09-20 00:26:02 +08:00
hulk e3544239af fix(DLPilot): 二进制载荷日志行以 hex 展示 —— 修复复制被 NUL 截断 2026-09-18 15:32:34 +08:00
hulk 6c56fac5dc chore(DLPilot): v0.3.6 打包(M305 功率检测三步序列 + 功率 W 两位小数显示) 2026-09-18 15:16:42 +08:00
hulk 9b29b6afd6 feat(DLPilot): M305 实测负载功率对接(功率检测三步序列) 2026-09-18 15:10:14 +08:00
hulk 30bc224710 feat(DLPilot): v0.3.5 — 电源读数框等长自适应 + 最大化卡顿治理 2026-09-18 01:23:45 +08:00
hulk 3f36ead3fe fix(DLPilot): 修复电源自检卡死 —— 帧路由引用未定义变量 payload 2026-09-18 01:17:08 +08:00
hulk e87bf14aaa fix(DLPilot): 单实例锁 + 串口占用提示 —— 修复'断不开'的实际根源 2026-09-18 01:13:05 +08:00
hulk c8ea5be031 fix(DLPilot): 串口卡死与序列互相干扰修复 2026-09-18 01:08:51 +08:00
hulk 2b7d103312 feat(DLPilot): 功率检测读数暂不计算功率值(待固件功率命令返回), 占位显示 2026-09-18 01:04:27 +08:00
hulk 9585fae947 feat(DLPilot): 电源自检补全 FPDO 挡位判定; 功率检测实现 2026-09-18 00:58:42 +08:00
hulk 8e6107b490 feat(DLPilot): M303/M304 SQ52205 电源实测协议对接(规则先行, 按钮后续排版) 2026-09-18 00:41:09 +08:00
hulk 9772a2bf83 fix(DLPilot): 电源自检误把成功帧判为错误(实机 M301 回包 payload='PD' 无 ok 前缀, 改按 TYPE 译码分类) 2026-09-17 11:16:11 +08:00
hulk cd14ed2ca4 chore: gitignore 源码模式运行时配置 src/pattern_slots.json 2026-09-17 10:46:09 +08:00
hulk 4cc418f863 feat(DLPilot): 新增电源检查卡(PD 自检序列 M301/M302 状态位 + FPDO, 功率检测占位); 窗口加高; 版本 0.3.4 打包 2026-09-17 10:43:31 +08:00
hulk 040b628d54 chore(DLPilot): v0.3.3 打包(修复 USB 拔出后重连失效) 2026-09-17 10:17:56 +08:00
hulk 51e2f1c51c fix(DLPilot): 串口设备拔出后同参数重连无响应(掉线分支同步清 _open_key); 版本 0.3.3 2026-09-17 10:17:52 +08:00
hulk 8497b1979a chore: 移除临时诊断脚本 2026-09-14 15:44:27 +08:00
hulk 05e4f3ae92 chore(DLPilot): v0.3.2 打包(exe 含标题栏版本号, 停止测试图像更名) 2026-09-14 15:44:04 +08:00
hulk 059ce6a540 feat(DLPilot): 标题栏显示版本号(与关于弹窗同源 APP_VERSION) 2026-09-14 15:37:10 +08:00
hulk b167ce3401 feat(DLPilot): '停止投屏'更名'停止测试图像'; 版本 0.3.2; 清理残余 HDMI-Tool 引用 2026-09-14 15:30:58 +08:00
hulk a6721415a6 chore: 文件夹更名 HDMI-Tool -> DLPilot(路径与文档此前已对齐) 2026-09-14 15:25:05 +08:00
hulk f0f8073afc fix(DLPilot): publish_gitea 请求自动重试(实例 TLS 间歇性 SSL EOF) 2026-09-14 15:12:16 +08:00
hulk 3f35ad2c21 feat(DLPilot): '恢复桌面'更名'停止投屏'; 版本 0.3.1 2026-09-14 15:02:54 +08:00
hulk c1a5712f76 fix(DLPilot): 投屏退出体验 — 替换语义 + 一键恢复桌面 2026-09-14 14:55:30 +08:00
hulk 8e8811a4a0 merge: DLPilot v0.3.0 — CustomTkinter 双栏界面重构 + 光机串口参数化 + TEC 控制 2026-09-12 03:45:46 +08:00
hulk b70cf102fd feat(DLPilot): 图标更新为 DLP/Pilot 双行设计; 图案栏位两排各 5 个等宽 2026-09-12 03:28:52 +08:00
hulk b36dd3911f style(DLPilot): 关于弹窗补作者/硬件正式命名; 卡片标题行垂直居中 2026-09-12 03:21:20 +08:00
hulk cda1e72f17 feat(DLPilot): 关于按钮 + 外观默认 System + 校准图案行压缩 2026-09-12 03:15:07 +08:00
hulk 744fbfd298 feat: 产品更名 DLPilot(3D 光固化光机调试台) + 按标记调整界面 2026-09-12 03:05:32 +08:00
hulk 90433064ec fix(HDMI-Tool): 下拉菜单配色统一为深色主题 2026-09-12 02:36:46 +08:00
hulk 68c7909922 style(HDMI-Tool): 按用户标记统一左列高度与温度实时显示 2026-09-12 02:19:51 +08:00
hulk e131646156 feat(HDMI-Tool): 光机串口参数可选(默认8-N-1) + TEC 控制与温度读取 2026-09-12 02:07:26 +08:00
hulk 96df14caea chore(HDMI-Tool): exe 重新打包(串口下拉贯通+8-N-1 参数标注) 2026-09-12 01:50:51 +08:00
hulk d92156e0cd style(HDMI-Tool): 串口下拉贯通卡片宽度; 参数行补全 8-N-1(板卡固件固定标注) 2026-09-12 01:50:15 +08:00
hulk f549ddf48b style(HDMI-Tool): 按用户标记微调 CTk 界面 2026-09-12 01:42:01 +08:00
hulk 84838e3e74 feat(HDMI-Tool): CustomTkinter 双栏仪表盘界面重构(feature/ctk-ui) 2026-09-12 01:30:50 +08:00
hulk 1a9927d9bb feat(HDMI-Tool): 光机串口下拉显示设备描述, CH344 多路口可辨 2026-09-11 00:46:03 +08:00
hulk 22d0969569 chore(HDMI-Tool): package_release 平铺复制图案/说明到 release/ — 与 zip 内容一致, 文件夹开箱即用 2026-09-11 00:40:48 +08:00
hulk d9ecff4e49 fix(HDMI-Tool): 启动拓扑改智能判定 — 仅转接板(XLS)未激活时强制扩展, 家里仅第二屏零打扰 2026-09-11 00:37:48 +08:00
hulk 2459b33162 feat(HDMI-Tool): v0.2.0 集成光机控制(RS485→GD32网关→DLPC3421) — 本地提交, 待验证后再推送发布 2026-09-11 00:25:28 +08:00
hulk efaf4d658f docs(HDMI-Tool): AGENTS.md 记录本机已持久化 GITEA_TOKEN 用户级环境变量 2026-09-10 23:55:10 +08:00
hulk a14e3e7621 fix(HDMI-Tool): publish_gitea 兼容 assets 纯数组返回; 文档补记本实例需 --insecure 2026-09-10 23:51:39 +08:00
hulk a1f6fdd34a refactor(HDMI-Tool): 划分 src/assets/release 三区目录, 补齐人读/AI 读双文档与发布流水线 2026-09-10 23:44:56 +08:00
hulk 0977b275ee feat: HDMI-Tool 启动时强制扩展显示拓扑 + 收录波形/注入脚本 2026-09-10 19:47:39 +08:00
hulk 736b43efe4 feat(I2C-Inject): 归档 RP2040 固件到 mcu-rp2040 并补齐说明 2026-09-03 17:33:17 +08:00
hulk d0cefeebf3 feat: HDMI-Tool 与 I2C-Inject 首版工具集 2026-09-03 17:24:33 +08:00
9 changed files with 28 additions and 191 deletions
+6 -56
View File
@@ -92,13 +92,6 @@ DLPilot/
五卡(显示器/模式/EDID 信息/测试图案/hex),右列光机五卡(串口/数据/电源/命令/滑条),
支持的模式和 EDID 信息默认折叠;顶栏 Dark/Light/System 切换。Light/Dark 同时更新
Fluent 主题、Qt 调色板、容器样式与 Windows DWM 标题栏,勿只调用 setTheme。
**fluent 控件的自定义样式禁止直接 setStyleSheet**:setTheme 会用库自带 qss 重刷全部
已注册控件,直写样式随之丢失(v0.4.0 swatch 丢底色的根因)。须走
`setCustomStyleSheet(控件, lightQss, darkQss)`(qss 需覆盖 hover/pressed/disabled 态,
否则悬停瞬间被自带态样式盖回);仅 PushButton 等无 themeChanged 钩子的控件可幸存。
FluentLabelBase 系(StrongBodyLabel 等)例外:其 setTextColor 在每次切主题时整体重写
自定义槽,任何 setCustomStyleSheet 都会被冲掉——字号等改用 QFont(自带 label.qss 无
font-size 规则,QFont 不会被冲)。RGB swatch 底色回归测试见 selftest_theme.py。
PD 协议成功显示绿色,FPDO 仍独立判定。打包必须收集 `qfluentwidgets` 资源,并加入 Windows 系统 `icuuc.dll`,否则 QtCore 可能被其它 ICU DLL 解析失败。
## 4. 领域语义(测试值都有含义,勿"顺手改")
@@ -162,9 +155,6 @@ python publish_gitea.py ../release/DLPilot-v<版本>-win64.zip --replace --insec
- GUI 与 hdmi_source.ps1 各自独立实现显示器枚举,行为可能微差(GUI 与 `-List` 序号一致,
但与"设置"面板序号无保证);多屏操作前先确认序号;
- `pattern_slots.json` 兼容两种历史格式,写出只写新格式(详见 §3.11);
- `--seconds` 冒烟在已有 DLPilot 实例(含用户开着的 exe)运行时会"挂起":run_gui
检测到单实例互斥后弹模态框等点击。无头验证改用直启 `App(5)` 的等效脚本,或先关实例;
重打包同理——build_exe.py 会 taskkill 同名进程,等于替用户关掉开着的实例;
- 旧版 `app_gui.py` 仅保留作历史对照,当前入口使用 `app_fluent.py`;新增或修改界面时
应遵循 PySide6-Fluent-Widgets 的控件和 Qt 布局,不要把旧版 CustomTkinter 依赖带回入口。
@@ -172,14 +162,12 @@ python publish_gitea.py ../release/DLPilot-v<版本>-win64.zip --replace --insec
1. `python -m compileall -q src`(在 DLPilot/ 下) —— 全模块可编译;
2. `python selftest_rs485.py` —— 光机协议回归(改 dlpc_rs485.py 后必跑,向量来自上游 protocols.md);
3. `python selftest_theme.py` —— 主题切换回归(改 app_fluent.py 涉及样式/主题后必跑;
离屏渲染,Dark/Light 往返后校验 swatch 底色样式与渲染像素、标题字号);
4. `python hdmi_gui.py --seconds 5` —— GUI 冒烟(自动开关);
5. `python hdmi_gui.py --test-pattern Checker --area 800x600 --seconds 3` —— 投图链路;
6. `python hdmi_gui.py --dump` —— EDID 解算不抛异常;
7. `python hdmi_gui.py --dlpc-cmd M999`(不带 --port)—— 应明确报错而非崩溃(无硬件时的优雅降级);
8. `python build_exe.py` → 双击 release/DLPilot.exe 确认图标/双栏布局/投图/光机区渲染;
9. `python package_release.py <版本>` —— 不报"引用图片缺失"即栏位完整性 OK。
3. `python hdmi_gui.py --seconds 5` —— GUI 冒烟(自动开关);
4. `python hdmi_gui.py --test-pattern Checker --area 800x600 --seconds 3` —— 投图链路;
5. `python hdmi_gui.py --dump` —— EDID 解算不抛异常;
6. `python hdmi_gui.py --dlpc-cmd M999`(不带 --port)—— 应明确报错而非崩溃(无硬件时的优雅降级);
7. `python build_exe.py` → 双击 release/DLPilot.exe 确认图标/双栏布局/投图/光机区渲染;
8. `python package_release.py <版本>` —— 不报"引用图片缺失"即栏位完整性 OK。
## 8. v0.4.0 进度记录(2026-09-24)
@@ -192,41 +180,3 @@ python publish_gitea.py ../release/DLPilot-v<版本>-win64.zip --replace --insec
发布使用仓库预置配置,临时打包后恢复本机文件。
- 关联动态:EDID-Viewer 已于 2026-09-25 从本工具的"源端 EDID 查看"需求独立成工具
入库并发布 v0.1.0,与本目录无代码共享;I2C-Inject 已标记暂停开发(详见根 `agent.md`)。
## 9. v0.4.0 后修复记录
- 2026-09-28 修复"切换 Light 后 R/G/B hex 按钮底色丢失、切回 Dark 也不恢复":根因是
fluent 控件直接 `setStyleSheet` 的自定义样式在 `setTheme` 时被库重刷的自带 qss 整体
覆盖(任何方向的切换都会丢,非 Light 特有)。swatch 改走 `setCustomStyleSheet`(qss
覆盖 hover/pressed/disabled 态),同病的顶栏标题 24px 字号改用 QFont(FluentLabelBase
的自定义槽被库的 setTextColor 每次切主题重写,见 §3.12)。新增 `src/selftest_theme.py`
离屏回归(样式表存活 + 渲染像素比对),本次验证:compileall / selftest_rs485 /
selftest_theme / GUI 冒烟全部通过。
- 2026-09-28 以 v0.4.1 重新打包:APP_VERSION → 0.4.1,`build_exe.py` 生成新
release/DLPilot.exe(67.1 MB,exe `--seconds 5` 定时退出冒烟 exit 0),按 §8 约定
临时还原预置 pattern_slots.json 后 `package_release.py 0.4.1` 生成
`DLPilot-v0.4.1-win64.zip`(66.8 MB,zip 内为预置 COM15 配置,本机 COM5 运行态
已还原未入库)。Gitea Release 已发布:tag `DLPilot-v0.4.1` 指向提交 `62b325c`
(源码+exe+文档同一提交),资产 `DLPilot-v0.4.1-win64.zip`(66.8 MB),
https://gitea.hulk.wang/hulk/HW-Debug-Tools/releases/tag/DLPilot-v0.4.1 。
发布说明用 --notes-file 传入(内置 DEFAULT_NOTES 模板还是 v0.1.0 旧内容,下次
发布记得先写说明文件)。
- 2026-09-28 第二修:"串口未选/选错点连接后窗口被拉长、刷新按钮够不到"。根因:
pyserial 原始异常串(`could not open port '': FileNotFoundError...`)整段塞进
状态 BodyLabel,QLabel 不换行时最小宽度=整行文本宽,把右列参数行最小宽度撑爆。
三层修复:①`_dlpc_toggle` 空串口直接短提示返回(不再先写 SERIAL_CFG/save_slots
再 open——旧代码这顺序还会把本机串口记忆覆写成空串,本机 COM5 记忆即这样丢失过,
已手工修回);②dlpc_rs485 open 失败消息分类为短提示(被占用/不存在/其它),
完整异常改走 on_event 进收发日志;③`lbl_dlpc_st.setWordWrap(True)` 兜底。
验证:compileall / selftest_rs485 ALL PASS / 离屏断言(空串口提示、长文本下标签
最小宽度<300 可换行)/ GUI 冒烟 / 新 exe `--seconds 5` exit 0;v0.4.1 exe(15:05)
与 zip 均已用该修复重打。
- 2026-09-28 v0.4.2 两处 UI 小修:①"串口数据 · 收发日志"卡的"清空"按钮原本自占
一行(_card 的标题行是独立 row,按钮行加在其下),与标题错位且多占一行高度——
`_card()` 增加 `trailing` 参数把按钮并入标题行右端;②v0.4.0 fluent 重写把旧版
app_gui.py 光机命令卡首行的快捷按钮排(开光机/关光机/查版本/软件重启/开TEC/
关TEC/TEC33.0°C)整行丢失,开/关光机只能走预设下拉——本次按旧版排布原样恢复,
位于电流行与预设行之间(命令直发 `_dlpc_send`,无新增协议逻辑)。
验证:compileall / selftest_rs485 / selftest_theme ALL PASS;离屏渲染断言"清空"
与标题垂直中心差 0px、7 个快捷按钮齐全;真实桌面冒烟 exit 0。APP_VERSION → 0.4.2
并重打包。
Binary file not shown.
+10 -33
View File
@@ -52,8 +52,7 @@ from PySide6.QtWidgets import (
)
from qfluentwidgets import (
BodyLabel, CardWidget, ComboBox, LineEdit, PlainTextEdit,
PrimaryPushButton, PushButton, Slider, StrongBodyLabel, Theme,
setCustomStyleSheet, setTheme,
PrimaryPushButton, PushButton, Slider, StrongBodyLabel, Theme, setTheme,
)
import config
@@ -63,7 +62,7 @@ import edid_parse
import patterns
APP_NAME = "DLPilot"
APP_VERSION = "0.4.2"
APP_VERSION = "0.4.0"
REPO_URL = "https://gitea.hulk.wang/hulk/HW-Debug-Tools"
MONO = QFont("Consolas", 10)
CHIP_IDLE = "#666666"
@@ -210,7 +209,7 @@ class App(QMainWindow):
button.clicked.connect(callback)
return button
def _card(self, title, parent, trailing=None):
def _card(self, title, parent):
card = CardWidget(parent)
layout = QVBoxLayout(card)
layout.setContentsMargins(14, 12, 14, 14)
@@ -218,8 +217,6 @@ class App(QMainWindow):
row = QHBoxLayout()
row.addWidget(StrongBodyLabel(title, card))
row.addStretch(1)
if trailing is not None:
row.addWidget(trailing)
layout.addLayout(row)
return card, layout
@@ -269,12 +266,7 @@ class App(QMainWindow):
outer.setSpacing(12)
header = QHBoxLayout()
title = StrongBodyLabel("DLPilot", root)
# 标题字号走 QFont:FluentLabelBase 在每次主题切换时会用自带的颜色规则
# 重写自定义 qss 槽,setStyleSheet/setCustomStyleSheet 写的字号都会被冲掉
title_font = title.font()
title_font.setPixelSize(24)
title_font.setBold(True)
title.setFont(title_font)
title.setStyleSheet("font-size: 24px; font-weight: 700;")
header.addWidget(title)
header.addWidget(BodyLabel("EDID · 测试图案 · RS485 光机控制", root))
header.addStretch(1)
@@ -363,13 +355,7 @@ class App(QMainWindow):
row.addWidget(BodyLabel(f"{channel}: 0x", card))
for label, color in items:
button = PushButton(label, card)
# fluent 控件的样式须走 setCustomStyleSheet:直接 setStyleSheet 的内容
# 会在 setTheme 时被库重刷的自带 qss 冲掉;且须覆盖 hover/pressed 态,
# 否则悬停瞬间底色仍会被自带态样式盖回
fg = 'black' if color == '#00FF00' else 'white'
qss = ("PushButton, PushButton:hover, PushButton:pressed, "
f"PushButton:disabled {{ background-color: {color}; color: {fg}; border: none; }}")
setCustomStyleSheet(button, qss, qss)
button.setStyleSheet(f"PushButton {{ background: {color}; color: {'black' if color == '#00FF00' else 'white'}; }}")
button.clicked.connect(lambda checked=False, c=color: self._show_solid(c))
row.addWidget(button)
row.addStretch(1)
@@ -428,16 +414,16 @@ class App(QMainWindow):
setattr(self, attr, combo)
params.addWidget(combo)
self.lbl_dlpc_st = BodyLabel("未连接", card)
# 状态标签允许换行兜底: 任何长错误串都不得撑大参数行最小宽度(否则窗口拉长,
# 刷新/连接按钮被挤出可视区)
self.lbl_dlpc_st.setWordWrap(True)
params.addWidget(self.lbl_dlpc_st)
params.addStretch(1)
body.addLayout(params)
layout.addWidget(card)
card, body = self._card("串口数据 · 收发日志(译码 + 原始 hex)", self,
trailing=self._button("清空", self._dlpc_clear))
card, body = self._card("串口数据 · 收发日志(译码 + 原始 hex)", self)
row = QHBoxLayout()
row.addStretch(1)
row.addWidget(self._button("清空", self._dlpc_clear))
body.addLayout(row)
self.txt_dlpc = self._text()
self.txt_dlpc.setMinimumHeight(230)
body.addWidget(self.txt_dlpc)
@@ -471,14 +457,6 @@ class App(QMainWindow):
row.addStretch(1)
row.addWidget(self._button("查电流", self._query_current))
body.addLayout(row)
# 快捷命令行: v0.4.0 重写时从旧版 app_gui.py 丢失, 开关光机等一发命令
# 不应只能走预设下拉
quick = QHBoxLayout()
for name, cmd in (("开光机", "M730S0"), ("关光机", "M730S1"), ("查版本", "M999"),
("软件重启", "M888"), ("开TEC", "M7S0"), ("关TEC", "M7S1"),
("TEC33.0°C", "M8S330")):
quick.addWidget(self._button(name, lambda checked=False, c=cmd: self._dlpc_send(c)))
body.addLayout(quick)
preset_row = QHBoxLayout()
self._dlpc_presets = [(n, cmd) for n, cmd, _ in dlpc_rs485.PRESETS]
self.cbo_dlpc_cmd = ComboBox(card)
@@ -792,7 +770,6 @@ class App(QMainWindow):
def _dlpc_toggle(self):
if self.dlpc.is_connected(): self.dlpc.close(); self._serial_reset_state(); return
port = self._dlpc_selected_port()
if not port: self.lbl_dlpc_st.setText('未选择串口,请先选择或刷新'); return
try: baud, bytesize, stopbits = int(self.cbo_baud.currentText()), int(self.cbo_databits.currentText()), int(self.cbo_stopbits.currentText())
except ValueError: self.lbl_dlpc_st.setText("串口参数非法"); return
parity = self.cbo_parity.currentText()[:1] or 'N'; config.SERIAL_CFG.update(port=port, baud=baud, bytesize=bytesize, parity=parity, stopbits=stopbits); config.save_slots(self.slots, self.cbo_area.currentText()); self.dlpc.open(port, baud, bytesize=bytesize, parity=parity, stopbits=stopbits)
+5 -13
View File
@@ -326,19 +326,11 @@ class DLPC485:
self.ser = None
with self._lock:
self._target = None
blob = str(e) + repr(e)
if 'PermissionError' in blob or '拒绝访问' in blob \
or 'Access is denied' in blob:
hint = '串口被占用(串口助手/另一实例?)'
elif 'FileNotFoundError' in blob or '找不到指定的' in blob \
or 'No such file' in blob:
hint = '串口不存在,请刷新后重选'
else:
hint = '无法打开,详情见日志'
# 状态标签只放短提示(长异常串会撑爆参数行把窗口拉长),
# 完整异常走 on_event 进收发日志
self.on_status(f'连接失败: {hint}')
self.on_event(f'连接失败: {e!r}')
et = str(e)
if 'PermissionError' in repr(e) or '拒绝访问' in et \
or 'Access is denied' in et:
et += '(串口被占用: 检查串口助手/另一个本工具实例)'
self.on_status(f'连接失败: {et}')
if self.ser is not None:
try:
item = None
-82
View File
@@ -1,82 +0,0 @@
# coding: utf-8
"""主题切换回归自检(无窗口, 离屏渲染)。
背景: fluent 控件直接 setStyleSheet 的样式会在 setTheme 时被库重刷的自带 qss 冲掉
(v0.4.0 RGB swatch 按钮切主题丢底色的根因)。swatch 改走 setCustomStyleSheet、
标题字号走 QFont 后,本测试保证:
1. Dark -> Light -> Dark -> Light 往返后 9 个 swatch 按钮样式表仍带底色;
2. Light 下实际渲染出的按钮中心像素 = swatch 色值(不只样式表字符串存在);
3. 标题 24px 加粗(QFont)在往返后不变。
运行: python selftest_theme.py (依赖 PySide6-Fluent-Widgets)
"""
import os
import sys
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from PySide6.QtGui import QColor
from PySide6.QtWidgets import QApplication
from qfluentwidgets import PushButton, StrongBodyLabel, Theme, setTheme
import app_fluent
import patterns
def check_style_sheet(win, app):
swatches = [b for b in win.findChildren(PushButton) if b.text() in {"55", "AA", "FF"}]
assert len(swatches) == 9, f"expect 9 swatch buttons, got {len(swatches)}"
title = [l for l in win.findChildren(StrongBodyLabel) if l.text() == "DLPilot"]
assert len(title) == 1, "title label not found"
colored = sum(1 for b in swatches if "background-color: #" in b.styleSheet())
f = title[0].font()
print(f" swatch 样式表带底色: {colored}/9, 标题 24px 粗体: "
f"{f.pixelSize() == 24 and f.bold()}")
return colored == 9 and f.pixelSize() == 24 and f.bold()
def check_rendered_pixel(win, app):
"""Light 主题下逐个渲染 swatch,与目标色一致的像素须占明显多数(背景为主,
中心处是文字字形,不能只采单点)。"""
ok = True
for channel, items in patterns.SOLID_ROWS:
for label, color in items:
button = next(b for b in win.findChildren(PushButton)
if b.text() == label and f"background-color: {color}" in b.styleSheet())
image = button.grab().toImage()
target = QColor(color)
total, matched = image.width() * image.height(), 0
for y in range(image.height()):
for x in range(image.width()):
if image.pixelColor(x, y) == target:
matched += 1
ratio = matched / total
same = ratio >= 0.2
ok &= same
if not same:
print(f" 渲染不符: {channel}/{label} 期望 {color} 仅占 {ratio:.0%}")
print(f" Light 下渲染像素比对: {'一致' if ok else '存在偏差'}")
return ok
def main():
app = QApplication.instance() or QApplication(sys.argv)
setTheme(Theme.AUTO)
win = app_fluent.App(0)
passed = True
for step, theme in (("初始 Dark", Theme.DARK), ("切 Light", Theme.LIGHT),
("切回 Dark", Theme.DARK), ("再切 Light", Theme.LIGHT)):
setTheme(theme)
app.processEvents()
print(f"[{step}]")
passed &= check_style_sheet(win, app)
if theme == Theme.LIGHT:
passed &= check_rendered_pixel(win, app)
win.close()
print("ALL PASS" if passed else "FAILED")
return 0 if passed else 1
if __name__ == "__main__":
sys.exit(main())
Binary file not shown.
Binary file not shown.
+7 -7
View File
@@ -6,12 +6,12 @@
## 工具一览
| 图标 | 工具 | 用途 | 获取 |
|---|---|---|---|
| <img src="DLPilot/src/logos/logo_dlpilot.png" width="64" alt="DLPilot 图标"/> | [DLPilot](DLPilot/) | HDMI 源端(EDID 查看/逐字节解析、分辨率切换、纯色与测试图案全屏投屏)+ 光机控制(RS485→GD32 网关→DLPC3421:开关光机/设光强/查温度电流) | 到 [Releases](https://gitea.hulk.wang/hulk/HW-Debug-Tools/releases) 下 `DLPilot-vX.Y.Z-win64.zip`,解压即用;详见 [DLPilot/README.md](DLPilot/README.md) |
| <img src="EDID-viewer/assets/edid-viewer.png" width="64" alt="EDID-Viewer 图标"/> | [EDID-viewer](EDID-viewer/) | Windows 显示器 EDID 只读查看器:活动设备或离线文件的厂家/序列号/分辨率时序、CTA/HDMI/音频/HDR 能力、校验诊断;BIN/HEX 导入,BIN/JSON 报告导出 | 到 [Releases](https://gitea.hulk.wang/hulk/HW-Debug-Tools/releases) 下 `EDID-Viewer-vX.Y.Z-win64.zip`,解压即用;详见 [EDID-viewer/README.md](EDID-viewer/README.md) |
| <img src="SerialMate/assets/serial-mate.png" width="64" alt="SerialMate 图标"/> | [SerialMate](SerialMate/) | RS485/串口调试助手:收发 + 协议包解析(帧构成令牌序列/包头/板ID/LEN口径/CRC 全可定制,默认兼容 DLPilot 光机协议)、板型档案一键切换协议参数与命令预设、payload 字符串/HEX 显示、4 通道曲线(弹窗独立、时间窗滑笔回看、悬停读值、暂停渲染)、发送框输入 payload 自动包装组帧(`/` 分隔多条)、HEX 直发与周期发送 | 到 [Releases](https://gitea.hulk.wang/hulk/HW-Debug-Tools/releases) 下 `SerialMate-vX.Y.Z-win64.zip`,解压即用;详见 [SerialMate/README.md](SerialMate/README.md) |
| <img src="I2C-Inject/logos/logo_i2c_orange.png" width="64" alt="I2C-Inject 图标"/> | [I2C-Inject](I2C-Inject/) | ⏸ **暂停开发**:LT8619C 寄存器在线读写(RP2040 注入器在 demo 板 I2C 总线上择机注入,避让主控轮询,写后自动读回校验)。代码与固件保留备查 | 暂不提供发布;状态与原理详见 [I2C-Inject/README.md](I2C-Inject/README.md) |
| 工具 | 用途 | 获取 |
|---|---|---|
| [DLPilot](DLPilot/) | HDMI 源端(EDID 查看/逐字节解析、分辨率切换、纯色与测试图案全屏投屏)+ 光机控制(RS485→GD32 网关→DLPC3421:开关光机/设光强/查温度电流) | 到 [Releases](https://gitea.hulk.wang/hulk/HW-Debug-Tools/releases) 下 `DLPilot-vX.Y.Z-win64.zip`,解压即用;详见 [DLPilot/README.md](DLPilot/README.md) |
| [EDID-viewer](EDID-viewer/) | Windows 显示器 EDID 只读查看器:活动设备或离线文件的厂家/序列号/分辨率时序、CTA/HDMI/音频/HDR 能力、校验诊断;BIN/HEX 导入,BIN/JSON 报告导出 | 到 [Releases](https://gitea.hulk.wang/hulk/HW-Debug-Tools/releases) 下 `EDID-Viewer-vX.Y.Z-win64.zip`,解压即用;详见 [EDID-viewer/README.md](EDID-viewer/README.md) |
| [SerialMate](SerialMate/) | RS485/串口调试助手:收发 + 协议包解析(帧构成令牌序列/包头/板ID/LEN口径/CRC 全可定制,默认兼容 DLPilot 光机协议)、板型档案一键切换协议参数与命令预设、payload 字符串/HEX 显示、4 通道曲线(弹窗独立、时间窗滑笔回看、悬停读值、暂停渲染)、发送框输入 payload 自动包装组帧(`/` 分隔多条)、HEX 直发与周期发送 | 到 [Releases](https://gitea.hulk.wang/hulk/HW-Debug-Tools/releases) 下 `SerialMate-vX.Y.Z-win64.zip`,解压即用;详见 [SerialMate/README.md](SerialMate/README.md) |
| [I2C-Inject](I2C-Inject/) | ⏸ **暂停开发**:LT8619C 寄存器在线读写(RP2040 注入器在 demo 板 I2C 总线上择机注入,避让主控轮询,写后自动读回校验)。代码与固件保留备查 | 暂不提供发布;状态与原理详见 [I2C-Inject/README.md](I2C-Inject/README.md) |
## 环境要求
@@ -70,4 +70,4 @@ python publish_gitea.py <工具>-v<版本>-win64.zip --insecure # 上传 Gite
- 源码与打包产物(exe、pattern_slots.json)均入库;发布 zip 不入库,只上传 Gitea Release
- 两件工具的寄存器语义(0x606E 位交换 / 0x606D 整组顺序)均经 demo 板逻辑分析仪
双色交叉实测,过程数据与规程存于上游主仓库 `doc/architecture/`
- 更新:2026-09-28
- 更新:2026-09-27
Binary file not shown.