From 22d09695691e710902368816e0239a71af07b925 Mon Sep 17 00:00:00 2001 From: hulk Date: Fri, 11 Sep 2026 00:40:48 +0800 Subject: [PATCH] =?UTF-8?q?chore(HDMI-Tool):=20package=5Frelease=20?= =?UTF-8?q?=E5=B9=B3=E9=93=BA=E5=A4=8D=E5=88=B6=E5=9B=BE=E6=A1=88/?= =?UTF-8?q?=E8=AF=B4=E6=98=8E=E5=88=B0=20release/=20=E2=80=94=20=E4=B8=8E?= =?UTF-8?q?=20zip=20=E5=86=85=E5=AE=B9=E4=B8=80=E8=87=B4,=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=E5=BC=80=E7=AE=B1=E5=8D=B3=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HDMI-Tool/AGENTS.md | 11 +- HDMI-Tool/README.md | 1 + HDMI-Tool/release/README.md | 224 +++++++++++++++++++++++++ HDMI-Tool/release/bw_checker_sweep.png | Bin 0 -> 2615 bytes HDMI-Tool/release/bw_star.png | Bin 0 -> 8044 bytes HDMI-Tool/release/bw_sweep.png | Bin 0 -> 1808 bytes HDMI-Tool/release/bw_testcard.png | Bin 0 -> 2506 bytes HDMI-Tool/release/bw_zoneplate.png | Bin 0 -> 10416 bytes HDMI-Tool/release/solid_000055.png | Bin 0 -> 2788 bytes HDMI-Tool/release/solid_0000AA.png | Bin 0 -> 2788 bytes HDMI-Tool/release/solid_0000FF.png | Bin 0 -> 2786 bytes HDMI-Tool/release/solid_005500.png | Bin 0 -> 2787 bytes HDMI-Tool/release/solid_00AA00.png | Bin 0 -> 2787 bytes HDMI-Tool/release/solid_00FF00.png | Bin 0 -> 2786 bytes HDMI-Tool/release/solid_550000.png | Bin 0 -> 2787 bytes HDMI-Tool/release/solid_AA0000.png | Bin 0 -> 2787 bytes HDMI-Tool/release/solid_F00000.png | Bin 0 -> 2787 bytes HDMI-Tool/release/solid_FF0000.png | Bin 0 -> 2785 bytes HDMI-Tool/src/package_release.py | 31 ++-- 19 files changed, 251 insertions(+), 16 deletions(-) create mode 100644 HDMI-Tool/release/README.md create mode 100644 HDMI-Tool/release/bw_checker_sweep.png create mode 100644 HDMI-Tool/release/bw_star.png create mode 100644 HDMI-Tool/release/bw_sweep.png create mode 100644 HDMI-Tool/release/bw_testcard.png create mode 100644 HDMI-Tool/release/bw_zoneplate.png create mode 100644 HDMI-Tool/release/solid_000055.png create mode 100644 HDMI-Tool/release/solid_0000AA.png create mode 100644 HDMI-Tool/release/solid_0000FF.png create mode 100644 HDMI-Tool/release/solid_005500.png create mode 100644 HDMI-Tool/release/solid_00AA00.png create mode 100644 HDMI-Tool/release/solid_00FF00.png create mode 100644 HDMI-Tool/release/solid_550000.png create mode 100644 HDMI-Tool/release/solid_AA0000.png create mode 100644 HDMI-Tool/release/solid_F00000.png create mode 100644 HDMI-Tool/release/solid_FF0000.png diff --git a/HDMI-Tool/AGENTS.md b/HDMI-Tool/AGENTS.md index 8b44e4f..8d9cf72 100644 --- a/HDMI-Tool/AGENTS.md +++ b/HDMI-Tool/AGENTS.md @@ -19,8 +19,10 @@ HDMI-Tool 工作在两端:HDMI **源端**(PC 显卡侧,EDID/分辨率/图 HDMI-Tool/ ├── src/ 源代码区 —— 只有这里可以手改(logos/ 改图标源后重跑 make_ico.py) ├── assets/ 生成资产区 —— gen_*.py 的产物(PNG 图案),可随时再生成,改动需提交 -├── release/ 产物区 —— 机器生成,禁止手改:HDMI-Tool.exe(入库)、 -│ pattern_slots.json(exe 运行配置,入库)、*.zip(gitignore,只上传 Release) +├── release/ 产物区 —— 机器生成,禁止手改:HDMI-Tool.exe、pattern_slots.json、 +│ bw/solid 图案(package_release.py 从 assets/ 平铺复制来,均入库)、 +│ *.zip(gitignore,只上传 Release)。release/ 本身=完整可直接运行的 +│ 发布文件夹(exe+附属平铺),内容与 zip 一致 ├── README.md 人类文档 └── AGENTS.md 本文 ``` @@ -36,7 +38,7 @@ HDMI-Tool/ | `src/dlpc_rs485.py` | 光机 RS485 协议模块: 帧构造/增量解析/译码表/预设命令/串口线程(DLPC485) | | `src/selftest_rs485.py` | 光机协议自检(对照上游实测帧向量, 无硬件回归, 改协议代码后必跑) | | `src/build_exe.py` | PyInstaller 打包 → `release/HDMI-Tool.exe`(onefile/noconsole,内嵌图标+pyserial) | -| `src/package_release.py` | exe+图案+说明 → `release/HDMI-Tool-v-win64.zip`(校验栏位引用完整性) | +| `src/package_release.py` | 复制图案到 release/(平铺) → `release/HDMI-Tool-v-win64.zip`(校验栏位引用完整性; release/ 与 zip 内容一致) | | `src/publish_gitea.py` | 建/复用 Gitea Release 并上传 zip(tag 默认取 zip 文件名) | | `src/hdmi_source.ps1/.bat` | 独立 PowerShell 命令行工具(自包含,与 GUI 无代码共享) | | `src/gen_bw_patterns.py` | 生成 `assets/bw_*.png` ×5(640x360 黑白,需 Pillow) | @@ -103,7 +105,8 @@ python publish_gitea.py HDMI-Tool-v<版本>-win64.zip --replace --insecure # 发布约定: - tag/release 命名 `HDMI-Tool-vX.Y.Z`,zip 命名 `HDMI-Tool-vX.Y.Z-win64.zip`(publish_gitea.py 依赖此命名从文件名推 tag); -- **exe 与 pattern_slots.json 改动跟随源码提交入库;zip 永不入库**(.gitignore 已挡); +- **exe、pattern_slots.json 与 release/ 下平铺的图案 png 改动跟随源码/资产生成提交入库; + zip 永不入库**(.gitignore 已挡); - publish_gitea.py 幂等:release 已存在则复用,同名资产默认跳过,`--replace` 删旧重传; - token 读环境变量 `GITEA_TOKEN`:本机已用 setx 持久化为用户级变量(新开的会话/终端自动 继承,值不入库;在 setx 之前启动的进程读不到,需重开终端),急用时也可临时传 `--token`; diff --git a/HDMI-Tool/README.md b/HDMI-Tool/README.md index c16a791..a2aa0aa 100644 --- a/HDMI-Tool/README.md +++ b/HDMI-Tool/README.md @@ -192,6 +192,7 @@ HDMI-Tool/ ├── release/ # 构建与发布产物(机器生成区, 不手改) │ ├── HDMI-Tool.exe # 打包单文件版(改动跟随源码提交入库) │ ├── pattern_slots.json # exe 运行配置(栏位预置 + 串口记忆) +│ ├── *.png / README.md # 附属文件平铺副本(由 package_release.py 从 assets/ 同步) │ └── *.zip # 发布包(不入库, 上传 Gitea Release) ├── README.md # 本说明 └── AGENTS.md # 面向 AI/Agent 的工程档案(结构/约定/构建规程) diff --git a/HDMI-Tool/release/README.md b/HDMI-Tool/release/README.md new file mode 100644 index 0000000..c16a791 --- /dev/null +++ b/HDMI-Tool/release/README.md @@ -0,0 +1,224 @@ +# HDMI-Tool — HDMI 源端调试 + 光机控制工具 + +> LT8619C(HDMI→RGB888)→ DLPC3421 投影转接板调试配套的 PC 端工具: +> HDMI **源端**(EDID 查看、分辨率切换、纯色/测试图案投屏)+ **光机控制** +> (RS485 直连板上 GD32 网关,开关光机/设光强/查温度电流)。 +> +> - **只想用工具**:到 [Gitea Releases](https://gitea.hulk.wang/hulk/LT8619C_Debug_Tools/releases) +> 下载 `HDMI-Tool-vX.Y.Z-win64.zip`,解压双击 `HDMI-Tool.exe` 即可(Windows 10/11 x64,免安装、无需 Python)。 +> - **要改代码/重新打包**:见 §8、§9。 +> +> 更新:2026-09-11 + +--- + +## 1. 功能总览 + +| 功能 | 说明 | +|---|---| +| EDID 查看 | 枚举各显示输出口,从注册表读取 EDID 原始数据,按 EDID 1.4/CEA-861 解算:厂商/型号/尺寸/Gamma/输入类型/支持模式(DTD/已建立/标准/CEA-VIC)/首选时序完整参数/校验和 | +| EDID 逐字节解析 | "EDID 原始数据"框右上"逐字节解析"按钮:按偏移逐字段展开基础块与 CTA-861 扩展块,每字段附原始字节 hex;命令行等价 `--edid-fields` | +| 分辨率切换 | "分辨率"下拉列出显卡按该屏 EDID 提供的全部模式;**应用**=临时切换(不写注册表,重启/恢复即还原),**恢复**=回到本次会话切改前的模式 | +| 测试图案投屏 | 全屏投到所选显示器,测试卡区域可选 `640x360 / 800x600 / full 铺满`;内置 纯红/纯绿/纯蓝/黑白棋盘格/网格线 + R/G/B 三行 55/AA/FF 纯色值按钮 + 3 个自定义图片栏位 | +| 光机控制 | RS485 → 板载 GD32E230 网关 → DLPC3421:开关光机(可定时)、设光强、查电流/温度/版本、TEC 控制、软件重启;收发日志带协议译码(见 §5) | +| 智能显示拓扑 | 仅当检测到转接板(EDID 厂商 "XLS")接入但未进入桌面(Windows 卡在"仅电脑屏幕")时才强制扩展把它拉回;你主动选的"仅第二屏幕"等拓扑不会被改动 | +| 命令行模式 | 全部功能可脚本化调用,供自动化测试(见 §6、§7) | +| 波形分析脚本 | 逻辑分析仪 CSV 波形按占空比签名分段,输出行结构/占空比/消隐明细(见 §7.3) | + +## 2. 下载与安装 + +1. 打开 [Releases 页面](https://gitea.hulk.wang/hulk/LT8619C_Debug_Tools/releases),取最新的 + `HDMI-Tool-vX.Y.Z-win64.zip`; +2. 解压到**任意可写目录**(自定义图片与栏位配置会写到 exe 旁边); +3. 双击 `HDMI-Tool.exe`。首次启动比脚本慢一两秒(onefile 解压),属正常现象。 + +包内包含: + +``` +HDMI-Tool/ +├── HDMI-Tool.exe 主程序(单文件自包含, 光机控制的 pyserial 已内置) +├── pattern_slots.json 预置自定义栏位 + 串口记忆 +├── bw_*.png ×5 640x360 黑白测试图 +├── solid_*.png ×10 800x600 纯色测试图 +└── README.md 本说明 +``` + +## 3. GUI 使用 + +主窗口自上而下四块区域: + +``` +┌ 显示器: [ ... ▼] [刷新] ┐ +├ 分辨率: [800x600@60 ▼] [应用] [恢复] ├ 显示器/EDID +│ 支持的模式(EDID 解算) | EDID 信息 ┘ +├ 测试图案 — 图案按钮 / R,G,B 0x55,0xAA,0xFF / 测试卡区域 / 自定义栏位 ┐ +├ 光机控制 — 串口 [连接] / 开关光机 / 光强 / 命令下拉 / 自定义命令 ┘ 投屏+光机 +│ └ 收发日志(带协议译码与原始 hex) +└ EDID 原始数据 — hex dump [逐字节解析] ┘ +``` + +1. 顶部显示器下拉选择目标屏(多屏时注意别选成主屏),"刷新"重新枚举; +2. **切分辨率**:选模式 → "应用";测完点"恢复"; +3. **投测试图**:先选**测试卡区域**(640x360 / 800x600 / full)→ 点图案按钮全屏投放, + 按 **ESC** 或点击退出;R/G/B 三行纯色按钮(55/AA/FF)用于 RGB 位交换类测试 + (55 与 AA 互为字节镜像对,FF 全高基准);自定义图片点"⚙"配置(图片自动复制到 exe 旁); +4. 区域与自定义栏位配置自动保存在 exe 旁的 `pattern_slots.json`。 + +## 4. 典型测试场景 + +``` +1. HDMI 接转接板 → 启动 HDMI-Tool → 刷新 → 选中板卡显示器 +2. 板卡 shadow EDID 首选 640x360@60 → 测试卡区域选 640x360(与光机面板原生 1:1) +3. "光机控制"连接串口 → M999 查版本确认链路通 → M730S0 开光机 +4. 点 R/G/B 行纯色按钮投图 → 目视/逻辑分析仪核对 RGB888 输出 + - 纯红/绿/蓝:验证通道映射(R=D[23:16], G=D[15:8], B=D[7:0]) + - 55/AA 对:验证位交换(0x606E)——图像应为 50% 灰阶占空比 +5. M731S100 设光强 → M732 查电流读回复核 → M730S1 关光机 +``` + +寄存器语义(0x606E 位交换 / 0x606D 整组顺序)与光机协议的判读基线见上游主仓库 +[LT8619C_DLPC3421_HDMI](https://gitea.hulk.wang/hulk/LT8619C_DLPC3421_HDMI) 的 `doc/architecture/`。 + +## 5. 光机控制(RS485 → GD32 网关 → DLPC3421) + +物理链路:PC 经 **USB-RS485 转换器**接板卡 A/B 端子,板上 GD32E230 做 RS485→I2C 网关 +控制 DLPC3421(I2C 地址 0x1B)。串口参数 **115200, 8N1**,协议细节以上游固件仓 +`protocols.md` 为准:命令帧 `D5 01 LEN CRC`、响应帧 `B5 TYPE LEN CRC`, +CRC 为第 2 字节起累加和取低 8 位。 + +GUI"光机控制"区:选串口 → 连接 → 点快捷按钮或命令下拉/自定义输入发送;日志区实时显示 +`→ 命令` / `← 译码结果 (原始 hex)`,错误自动附释义(如 `err:3(I2C NACK)`)。 + +| 命令 | 功能 | 响应示例 | +|---|---|---| +| `M730S0` / `M730S1` | 开 / 关光机 | `ok` | +| `M730S0T2000` | 开光机并定时 2000ms 自动关(≤32700) | `ok`(期间 M737 延迟应答) | +| `M731S100` | 设光强 54-800(RGB 同值,写后读回复核) | `ok` / `err:R..G..B..` | +| `M732` | 查三路电流设置值(0-65535) | `okR110G110B110` | +| `M201` / `M202` | 查 DMD / LAMP 温度(0.1°C) | `okTL:246` = 24.6°C | +| `M999` | 查固件版本 | `okv20.0.0.1` | +| `M737` | 查投光是否结束(投光中延迟应答) | `ok` | +| `M7S0` / `M7S1` | TEC 自动控温开 / 关(注意 S0=开) | `ok` | +| `M8S330` | TEC 凝露点 33.0°C(200-350,0.1°C) | `ok` / `err:OL` | +| `M1` | 协议握手 | `ok` | +| `M888` | 软件重启 | `ok` 后 100ms 复位 | + +注意:**DLPC3421 启动完成前 M730/M731/M732 被就绪门禁拒绝**(回 0xFF),上电后稍等几秒再发。 + +命令行等价(源码方式): + +``` +python hdmi_gui.py --port COM9 --dlpc-cmd M730S0 --dlpc-cmd M999 + 逐条发送并打印译码响应 +``` + +## 6. 命令行模式(hdmi_gui.py) + +exe 版无控制台,`--dump/--edid-fields` 的输出不可见(`--dlpc-cmd` 仍可执行,靠退出码判断), +调试请用源码方式: + +``` +python hdmi_gui.py --dump 控制台输出 EDID 解算 +python hdmi_gui.py --edid-fields 控制台输出 EDID 逐字节字段解析表 +python hdmi_gui.py --test-pattern Blue --area 800x600 --seconds 5 + 出图 5 秒自动退出 +python hdmi_gui.py --test-pattern Custom1 投自定义栏位 1 +python hdmi_gui.py --port COM9 --dlpc-cmd M730S0 RS485 发光机命令(可多次) +python hdmi_gui.py --seconds 5 GUI 冒烟测试, 5 秒自动关 + --test-pattern {Red,Green,Blue,Checker,Grid,Custom1..3} + --area {640x360,800x600,full} --monitor N --seconds S + --port COMx --baud 115200 --dlpc-cmd CMD(可重复; 任一命令失败退出码 1) +``` + +## 7. 辅助脚本(src/ 下) + +### 7.1 hdmi_source.bat / .ps1 — 源端命令行工具 + +与 GUI 互补,适合脚本串联: + +``` +tools\hdmi_source.bat -List 枚举显示器与支持分辨率(验证 EDID) +tools\hdmi_source.bat -Monitor 1 -Mode 800x600 切模式 +tools\hdmi_source.bat -Mode 800x600 -Pattern -Restore + 切模式→出图案→退出后自动恢复 +``` + +### 7.2 gen_bw_patterns.py / gen_solid_colors.py — 测试图生成 + +需 Pillow(`py -m pip install pillow`)。重新生成 `assets/` 下全部图案: + +- `gen_bw_patterns.py` → 640x360 黑白图 ×5: + `bw_star.png` 西门子星(极限分辨率)、`bw_sweep.png` 频率扫描条纹(24px→3px)、 + `bw_checker_sweep.png` 渐变棋盘(2→32px)、`bw_zoneplate.png` 波带片(各向混叠)、 + `bw_testcard.png` 综合测试卡(灰阶/刻度/细棋盘/线宽组); +- `gen_solid_colors.py` → 800x600 纯色图 ×10(R/G/B 各 55/AA/FF + 三原色), + 与 GUI 内置纯色按钮同源,供自定义栏位或其他工具加载。 + +### 7.3 la_wave_analyzer.py / la_wave_analyzer3.py — 逻辑分析仪波形判读 + +分析 Kingst VIS 导出的边沿流 CSV(列:`Time[s], 通道A, 通道B[, 通道C]`, +10ns 分辨率),按 50ms 窗口占空比签名自动分段,输出每段的签名(FF/55/AA/00)、 +时长、行周期/有效区宽度/消隐(按 40MHz 像素时钟折算): + +``` +python la_wave_analyzer.py # 2 通道(默认判读 B 口 D0/D1) +python la_wave_analyzer3.py # 3 通道(RGB 三组同拍, ch8/9/10) +``` + +### 7.4 selftest_rs485.py — 光机协议自检(无硬件) + +对照上游 `protocols.md` 实测帧向量回归帧构造/解析/译码:`python selftest_rs485.py`, +全部通过退出码 0。改 `dlpc_rs485.py` 后必须跑一遍。 + +## 8. 目录结构与从源码运行 + +``` +HDMI-Tool/ +├── src/ # 源代码(人工维护区) +│ ├── hdmi_gui.py # 主程序:GUI + 命令行(标准库; pyserial/Pillow 可选) +│ ├── dlpc_rs485.py # 光机 RS485 协议与串口链路(帧/解析/译码/线程) +│ ├── selftest_rs485.py # 光机协议自检(无硬件回归) +│ ├── build_exe.py # PyInstaller 打包 → release/ +│ ├── package_release.py # 组装发布 zip(exe+图案+说明) +│ ├── publish_gitea.py # 上传到 Gitea Release +│ ├── hdmi_source.ps1/.bat # 源端分辨率/图案命令行工具 +│ ├── gen_bw_patterns.py # 生成 assets/bw_*.png +│ ├── gen_solid_colors.py # 生成 assets/solid_*.png +│ ├── la_wave_analyzer*.py # 逻辑分析仪 CSV 波形判读 +│ └── logos/ # 图标源(svg/png/ico + make_ico.py) +├── assets/ # 生成的测试图案(gen_*.py 产物, 随发布包分发) +│ ├── bw_*.png ×5 # 640x360 黑白系列 +│ └── solid_*.png ×10 # 800x600 纯色系列 +├── release/ # 构建与发布产物(机器生成区, 不手改) +│ ├── HDMI-Tool.exe # 打包单文件版(改动跟随源码提交入库) +│ ├── pattern_slots.json # exe 运行配置(栏位预置 + 串口记忆) +│ └── *.zip # 发布包(不入库, 上传 Gitea Release) +├── README.md # 本说明 +└── AGENTS.md # 面向 AI/Agent 的工程档案(结构/约定/构建规程) +``` + +从源码运行:`python src/hdmi_gui.py`,需 Python ≥3.10,标准库即可跑 EDID/投屏; +光机控制需 pyserial(`py -m pip install pyserial`),自定义图片要 JPG/BMP/WebP 需可选 Pillow。 + +## 9. 构建与发布 + +```powershell +cd src +python selftest_rs485.py # 光机协议回归(改 dlpc_rs485.py 后必跑) +python build_exe.py # 打包 → ../release/HDMI-Tool.exe(自动装 PyInstaller; 内置 pyserial) +python build_exe.py --debug # 额外出一个带控制台的调试变体(--dump 可见输出) +python package_release.py 0.2.0 # 组装 release/HDMI-Tool-v0.2.0-win64.zip +python publish_gitea.py HDMI-Tool-v0.2.0-win64.zip --insecure # 上传 Gitea Release(需 GITEA_TOKEN) +``` + +## 10. 注意事项 / FAQ + +- **光机没反应排查**:① 串口/波特率(115200 8N1)与 A/B 接线;② 先发 `M999` 验证链路; + ③ 开光机回 0xFF 是 DLPC 就绪门禁——上电后等几秒;④ USB-RS485 转换器半双工, + 发送时板上回包不会回环(正常); +- **exe 放只读目录会怎样**:自定义图片与 `pattern_slots.json` 写在 exe 旁边,只读目录会导致配置存不下; +- **重新打包后图标没变**:Windows 图标缓存,`ie4uinit -show` 或改个名即可; +- **多屏序号**:切分辨率前先确认显示器序号(GUI 下拉框与 `hdmi_source.bat -List` 输出一致); +- **残留进程**:修改源码重新打包前先结束残留的 HDMI-Tool 进程(`build_exe.py` 会自动 taskkill); +- **改 logo**:改 `src/logos/logo_ph_orange.svg` → `python src/logos/make_ico.py` → 重新打包; +- **配置互不影响**:exe 与源码脚本各自按所在目录保存 `pattern_slots.json`,两份安装互不干扰。 diff --git a/HDMI-Tool/release/bw_checker_sweep.png b/HDMI-Tool/release/bw_checker_sweep.png new file mode 100644 index 0000000000000000000000000000000000000000..24fcfe3cf9c9b3d14252b220f383db2d3c0dc2d3 GIT binary patch literal 2615 zcmb`JeNad{Q;#`#+I@_=_a5fEo;BoI*E4y|r@p6dar)=h0z!HYCHAAU zQPn=w*usFWt@qCZfJQypK5^w)k*^V7G?&#T!Rb5t(+dZTEKP}`aU_kjGd%ViQLUwg z#>2Dmnc~{KW|lN7X(qnAwHxPEpZbiY9ev#>=%fRd^`w~k$?L_X3hnE>?12ZFK$o=^yBR6F(yA4Nrtwg&h(}luoJ%GsR}i-{+U% zNxH%ioiR=z(JFW5XPHJ0lIjJj&NB9wowXV{@F|=)YF83H*XhCc&zQQyo@Rm0`J}v7 z!Jy$wkWs5LJBMlfQqA*B|Rp@ze zy=6rIf=v^RY77cRy9P|`!>w~Z37CramG}8epTBfQ17n;hs;rxpnZ80Y1MrCoQ3fp( zZ_@LBhz9)NipH3o(f;`kF>@35W^QCOtMp+yu7lQ~Pc{D(F7A_#*)^!A50?_N@$k;$ zikY9k{e1dV`y+(cq1BP2v`g8FYYDz|pn0;{g~_T*XKxw;y=n3fKl5z3C_rLU@Jedg z@v`&uMECxop@~m7d(D}im65#zlkw$bZ(r{f8(wAvR2-EP##Vn6w6^X1T~6RL$0Mjm zmQB~NjJWZGPA36w>u%SFtM*@TD%ck39r6mEvjMT;I>xUMrEf|c-t|5_hvtZAa!J~^ z>Gj#s!^LbVm>Ss5&DnuoxN#%3PD$(8D3<=2KHs%=^69)$V)Lb@#SU=+ITi@O}c zO(e048_VMm>T=|S^uPyxNF6Cm{}R5Xn#J7wUK+N;nJ?NtR$tN!Q~Lbdi> zWbYodcK-#kmf*RoW!3&rz^R%PQ#}qxe_{KHag>XJ`&@Vip7R~j;h2l|PKs1Xo_?M@ zj_^uuO@SoQhjX~p_$I> zmnffXwhanm4MHtRN;y}wG~ZBRXud;G=X_Rd0KHaDfR6nW88T>OFo#`}I*DHcAi~w< z{~mW++PD#k{f7;#i;Kp#5vY$ng$q+$unqD>O_LkA*%C^_$8YyR$uXwv3JF%FK6mlA zBDx&2$k3L1voS&ea*{|w(W6`@9UuBQEc#_7#x}8L1GhK|-9SFhlm*+~t(GXSVx1<> zzBSA`RL}w2P4=6is#ArdCKp^}$$g_NX+zV_(UO;c7c+st!Kcg7Yv9Hu$PeDUGAnz!g#Uif@7J}ezCq{zZqi4Ivb`-*L|X8P+jlvX-HV?r{1G158%z-H Hrf~latsCf6 literal 0 HcmV?d00001 diff --git a/HDMI-Tool/release/bw_star.png b/HDMI-Tool/release/bw_star.png new file mode 100644 index 0000000000000000000000000000000000000000..de2e9d8376ff04529e07582741a4efa2915d5771 GIT binary patch literal 8044 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 literal 0 HcmV?d00001 diff --git a/HDMI-Tool/release/bw_sweep.png b/HDMI-Tool/release/bw_sweep.png new file mode 100644 index 0000000000000000000000000000000000000000..6e9a59aeb368df889cfbccb5bd53b3560fa7881d GIT binary patch literal 1808 zcmeHH|3A}t9RG|(2s$$Jc~q|T5DwY$t&;O4TGGtS96bmjh8fEaeL;0ngsoaf zhRJCxPQI*b^^ke!i)6l)FLRr1+05k2cGIKoy8qyQxS!sS$Mf}gJYTQJ`}yU3fZstw z{jK@{02q27@(ct3EiwRrPOjGgz`Kx5g#e)Q+S}9ZXj+AspKuaGFz3!;hl(7;mTq?| z;b0v6Zg=a2tBv+89HNs*G3Vy5Oa|U6gNWbXK1U)^3tl*`*vyNy{_9>!rM%mF8lX+^q!EQ|5 zOA^Rib`P^(N*ZfmYIH@K%v!VJB%UwTi+XP0t3 zP#6oyI-AZDp5)@-&J0D*SX#p4MO$^9aajEjd}uYVw~{Bk)!67mo83xECAiA63bX2B zC;$e;PXVW8jbp7WXo*!1W$xy0P^^Wi8+Jr-Ps(X_?0gC1)@Bi_jWM7fKo&b|)opKy ze}lB^B%~S+D^pQp?-!h!mh)Q1vg4;`%FMN0{80+M0CHRxaQ(NfRqB=Dl-;WW0ow3I z_S+qlW1QoLFY5B%s^xC;AH0fe&*)SweqU+>GWqUr&5me&dzkF0clm$tlZpQm9|Box z3IG_-I|^N>sLRj7vgY2^+#=~B2Au+sOH-7Dmt`(75onRotFErOvOZ)$O47Y0Yp$w! zsuwdcaY^dx+RSfLEza7VMvZ_}!nvhq%P0i(UL1 zK0Md1_obcnvgHb~>f!L%&CUe#eM7_^AHtZt*spEbQQU&04mbDH#eWddwQr?yv2lIq z?S8|V;Ssa*b5@rMus+5laZvtHE=R23^Xu&39Xqdcs^eibjJ2p>{S%lMYyAgY+H@pD zViKCf;Y*Rhis3vz!Nm#rvNcz-iYJK#cx~jidWM~gPAc^VNr%Z`Q3p)Z3x&uIc4IED z^D1oT?WZSJHbGRPP>`OS_RBdF%a4ixorT<_T{*kB-#m-i^11guS>}^y2$O4*&`56t z&eRI>WzN7K3F1Rd@0dio?Z7=Wu>L1_A4iD5Yxu7solJ2LFIfF+ME(i4N6Sq^H|@6f zi(TO%nlM|At%H7s*I0VGgA>6Yb`-&lZ)+M^1MJM#?FXkrd`ktIm}^cvevGPZGU;TA zgK;$H0YG?2y3wJ_0`kx48?=FYGPZ&B6ATeH6VvCsPMZhR{HIGBXHpvwpuCt&*_N_?FkDk8i%$YfF=AHTDp6~bEbMO7!d%oY#=iCHyGa~_B30@Eg zBw%7}XbA$b;Xxptp6T=JEw;sG7cS$}Tc;eYIcHyq}X^kPGT?6SU ziJD;TNlK?ca7QX(bG&yxm!3g;LQms1qx6KIeSF<%rGFnvtzbL7m? z^Hvfr<|wAs4kTsI$wHZ_$xL~`Gz4vZYM8(k~enO2o+uokHuwYmQ%2%1* z;#Npsbars^Y!_dj(BIK1F6Vm>Cq4mg1l1#>i$>dsLgoUsk?;Lxptn*z z{muHS{*GhmcD%en0enR@RA_Mcp%P|7x!F(Ps+nZT!UAt_@~JFW>fB(Uyn%-kE;wznfq; zrFoLtEH$RxBtxHKy78l4VAtl6IM1#cLhzNgibei8QuBPg2g7ci)INjLxM8-UI`_)e zJ8X&E?lMcw0Lkk3*M>A+Y6^u>zD`=(z@BMw8uM{@Ro$&9!jJH8oxk>Ewu^qMLqizTo8LqW*N2~z>M6y|rZzN6eQ&M%)?!n4 zRl774auTI1&|--9Hn#ef6FK?_;U&nxmRB{+5A>!wRWqb$i48+6*t~N!Et0%g;p?Ln zBBV^oouKwDbN5H7^F_Ae>LY^h$>`GSunh|%0hEba$~PbK1h7~+si?()CT1uOD}N{p zj7^H4B>9V#pE$?Sm3-`PJz$80(`(7#$RjtW7|%Z>dmg=96&Qy2lAHzp_2>S{)BjU$ zv^)nFV77qCKH>iZ=KNDYzx~!zT2R=e7PJO96?i-jDEc>m))lgFLK)T)&&%mZ;u<(} zck2t~9U)Wz@Bp8a{x4PR4%EkV00x}qhsmGx;xDECS6%*}=qeF5cEFUXM559$zoRY& zHM^*p&8%x>sP71dKMpc*fK%$Nifo*%6{wHiaH!=@!yApf>B!*TI>*lclyD3$KnEU#cvV)V3Rbn4iJ$EEF~$kWS+0zSPb1@pyv9t|L60IAj%v4D z;EQMq-3=HISi+5j*lTeNv!DaVkuu@c&eT%UkPrH7x_8bN!RNSr*ixP22bF}i7nKe{ zhMUfXNrH1*E#GL18sk6sQHlZ`g|H8+9q?na%8@?O&6LJSi%OEydMlx@7`f_rc#igg zYQj{$J1yRXOGa1fv617GY&kTU`&a~|&%KEyvS@?kM-ICLq&etSl zGYm#ANJvGoxV6+fb{_VYPHn+QQo^k2+;-D$>y!ufiBe+)AF*$unC_qA-Dio_q6v0VI@ zhy`lwaVnNH7(17&%_|hxK)mdF7C1Ux(X#?ym}GqhAj$lI9ko~nkg0B7h!Q~GTDBte z5RZTRVC+!mO}70njh2rAq!0+5IwxI$0s{GuW?0*VDsw7HR{+HhmtFtlyx_)VII@qm zkJy=b45m;P^^E^coeR(kf#?EILmgvo$(eFY*u4uVVrJF}7Cji~05#v@rj`cqp;DwZrGV&#tNPI1E zIjfg`T|GWZq3RFu>#fDFcWux{t+HT`UNGWz`}(m6i(ILGu7kznla$3A!cee1?|S^R qO}K#(KQ1(%OO9Q8N1~{3z_uzyhOOv4_jjWEOPa|=Gs7x_s4MPh^Q8vp6B-E<| z6fT7U4jfOZ!^shFjGA91bUPy)m`BQ?H6s)u8O2``e$q*+!aNB#g*`RBfAD@b21z?1 z9~wuW2cHZ$UW6Hdr3=*z`Bl2{Cz6c8ervc7^~h2~M}3O~V;pFnlf7wGOtumXooEIU z3&6n%px;9r!(Rw~>(S@>Wf6jdmQjAO0MGpr39uc6^#;;41P3#ad;m`3Prncle!@9b zxsXIOnj=Kn>I$U;#ok5|k$Mmw4(K-k^%P6R5) z@}Y^T8vvsj2poXT1Y|n?z}ZU|^g3P80|*>XspDxu&d)RP6SE~8PveB7R^d!f4J_p4tQ(6 z8GxNO9l->oj6Y$aOzsd`4L;a3$v6B^$^I2QhCp*v)WK9n+e{V4gZ}`i6QCtQT9&OB z@OK}U7WmBrALxNl2wDnt1di>}i=c9q0)HhTY6@J*K!OuM0Dm_9T@RgbAj@p*mD)j` zn%+HbCK5_S@_C4K@QVRk2rv+Um*5ZlHS4p&Lj2j@h*Bh|7G^jQ55n@HBqGGl4G0X;CM|s z546v6j}LY1AHr1x%05R`JP0e3LCJwo#-9v$AwbEAeS1a%@V#lbdYrzL+r*yea5~K;IhYWOrJ5kODs#5G6n`0|^FT zWdbN%#aKbC6o=ojR^kvm?pjtk(2G8-+FtP zllI&2j}xHc(QKaBVhn$+^!Lzf>9%Vw zlOWWS#z}ZpBTRwri|N*Cj+_Fw1>jluGuZElNi1(K86-g2>Iw9{5G(p+`xh5Ago$RP~fRvO(3SL1Zddu zCV*-D39gh&LD3gPRJ;-?4H2Jfyz9gf=u89kQ%)WN=M0|*=h$rNKn}n+(KC?o%u4)K z;8%P{4y{fa1O?UE2sB1bSNSwyP~dnlzL+i@$f6M*C&_#Y{_tN|g{m#jN@HfI>AmzQ z0;Q%5YVb(wqJit<#q=xzb_HN$uqpCfh;DT0z6hu}QXuFm-j`#L_B03KJO!S00>sPh z0IXEir_y=)6VHBD>jWQem6Up}qK?2+A_4^AV7U&jXLd$#8rX(E(NS)%`WDIUjBrdq zU^EENp}_C9GlF77@%K0FjBsH6MCnP;916UCC#07EjSM7itaH z56KW5)GUQqB4Pz$H4o{c!0w$9jz|FZQ-N;$S-#ew4{%0e4NnX2E5xB5gq2D&c1Ab? z1b9D&0Ge@Kg-hM(h_B=sx; z-NhJWc(fi2Q{biKAKgcR0F4<0PW+wtGvIdw#hL5`?Xf{sLg(F;iS_c&vZ11Sc0BiW z=C{G$CvMJfhkDuN;6Db`Q;-w^b_8JeuI<2Ig#CWK)aE}vgK0rcAVC?>5zDwU2-}S^ z5F;F%Qwb01;m8KxiHW~!IiNd%qQhkEmsfAh2h?wNP%~6e>Nw2gaBg! zxC4LB?oE{4o#+_!T#ZB!UQU6R&53kFDFQT-c_#pa6F{%w;A2gGm3DC;ctBO~&Tvy< zD-RjYWGK*Tczkmr*^V!82BMuc1MrAHu?^pLbE3mTV0an`<{_v6SV1-?lEg$KPJlxd zW&WF*0D|~?ocu6{ELL!|3e!L<4~bIXwbY*(+(NK9U;M0y-XUNHBA=vI{6!zYn=R4j z!}16W1mW=%+BFvB3|NVq6XC<*5};nicL*mS82$L*z~giFJlzwIwXk! z!)q`-1Q-p#t@z8rkFV0cJ=P&;J4)0LgvV34AxBqYuFnI)9&ZgU5@0ZJB=E<{_TZM% z_vlYqy|wN0-;_*^AJ@>8D|(VY(Ec}oK#xn=FQ~$ z<0<$9;aAut2Chmp1%bYEb3C#X7}6BBXA4d#s{|{`DGs|x*q5HEPO6@iT zdi~r-fuR`Ou|1nx4&F*}`~giW&|lZf!j1n%Rs_r zG-GM{Yu}#D)gh&-t5|Aii~_YLh@}#0hKe8i16EUz`|*4N%;FDtHnbCcs7<041kR*D zZL9&a0=!7u83B_5cS!`OG=2vDyw>%j4>U}2HCHd5hy+GpE*2i%AJAU{T#mn~8zs08 zV;^EIR}Wi^fqQ$Tz_v7Gv;6^M0XXRI2kj4d40^ajxt22qQGavx2fWs_@6JX7lq!$f zoWq~#Z8rK4HzZc^)GDiiofLR2W#8M`&=+{!FafT_-@;9b8ny>Ka0D))K+A$vw|j%i zi3C{3pS?fou~JL~QXPS)FUeAj0(Bc^J7#TA*-C(V0CxKnApfiWTKpwQkX?(a1)z6* zCtB|zX^3IS3c=QZp_AY+0md>otuTncN45wwUr>?s5hb^f$`lxM=#+^YRN}*-O-b_v z*b;!h$qtpwtq6<;;UooOX^88PB?b&fU|387jAkIs_&c)l-(G-)NBUW}T}5Ch56Mi> z6$!>*>4|8d1>qFLI1^mJ^4b!_A5XiNsyn2zpnX?HcO?a$R#r8KGu0hZ-8o>AQ$PJR z5MVm1n};rv4+x4L$=)`8op7` z6xbC7f6L*A8D+U%$*F4|YDWVFD)1`26H*W<0xSJo3cxx1P1`NYe;Mi!t91oo@pLW? zX_JRHDVGIYADM%{AFxTeCh-C2kHPvT<)R;?k^L!%)(}&>2Y(ATDW8JC!tWug(hzwv zdp=9R?iyfW2|9(pW4`ntFqMbMYk^P5m-}hEN@_8_0o;N0tGgT-}BdI zXBVP-BXE@fA=wOnrBx4KLKL_t21~NXcS2SWpx&gv^*bTQ%oyw%CzJvG#5yS=A~FP6 z#ozIqP%8qVvQW1tB#4)Pf>S`COlXb6=yEI5H}nGhwM~ynZJ6{ToAu(ESuB@GXTQ#U z`FET`Z{A(XE(gYInE?qz;F^Prmw>ZA{IOR=GZAbZAxpWh)QK#i8<;p@^CI zrKGeZx~vj_@$@&ob84UlY0aojE;_4RMVV>Ai1|DyJ&+1_92$WY+ZF)=ZBp@PTl!N! zxqDIIV_k=00aulZKdXDajKtt-M@j;Is%s6KH{8wr_$%$5g;pl5zOUL&fm7y9)lYRn zE$PgI2A^kEm!ePM3D&Uj9sj89=z}>@3bmo;<70)eM5lo92n?nmJ^^O& zH|1l6Z3rY&14%=oF}Pt8sQ5V(Imk!#N;$3s3T(^AU%4$QtAtuw-fInGt-$Ma7M;;0G_SZ6x#1s%-KiAcAH#l|S@0cfD2&9yEI0ox#oR|b^Z2%Zh zbd!$z<-idoz?978fhCQmsyW;M0tVCCpU<^+3$?65^I`&A@VVB-6v&an zBq-qsoJ30duhC)2AkdZY4}Q&8n$AMnk`R9iI5#kW1o%AuQV3*B4Jt&$Ux?}ApSBNH zr{tmakf*(Ec2(4G9nV7E4_149IYYRg0@=6W$Kd)TF#o~osBHPeTPXmq0~ z$PCzcwbm4{5P>KBRMu{BtvAm5vW8{`6hr{>q#Oim2ap5DX5C=|T+J|Cra-dH_s8J7 zN-+d7o&~3JkliEn^AT?Mn2L^QI19PTX?S^jE&@lDG66n;hUkpnqrjE(6n$jk>;mifF}`>Q;%2L1sjR%!zC2}#$C|<5qLWS z3{&7{F*rWvYydFX#AP|i%%tWy{^g0bmkmJ;I%hBmZtSwq6fk5cMu1Poe{Q9~wcXx> zmw)EoHQ18~Q3z}@Wt{hHNm8QwrJ4HUMuA;&*+kA@K(lpe@Ay!q2Xz4f(l0TNS5e?b zy`IENPZk{b9i-+UTINe4;nJ{{0wITMTwEs0O49m7mIS~$jA&}bMEm*%!@*eRXV#Cf z@biNcZC{N6D^Q(&gZ3-`;HB$d%9HR@dP&|)eFK`)CcI-$OUkrjg=t7Z^a zB`5Kx!f*i}b#fVyD`3Zd2k~W#M;quTH@I=kVu*R>#q^RmmlWx)fNn6bM%4M4i{C@e z*t0NpS^4rO5eGeC;t{87%qrsyBZj&ekS0uCI;VhDAGzE%um$>&m)aySW+yYw$NnMM z?|!OTEB8~@zzoOS>i_wWT>>D^AQdlJr)`$#aeBg~6H!YT{9M}`?RVUQbd!E=^Olbq zXBlwKvOR;8!;>+uFy!krJdW=x!!b?AMf&fQfrntQIKxj%TW zc}u!LL5tS`cbo_9Hl5{TKUpzuYZsz-?BxXmu;UH5%P5^2HFU~2Z84SDq7f5~@}3OH z8z;g0aWQY422bp*4SoyWH3y+xDTikoUoGd;+^`=NO&Qj0LBbEaJ0so4-)}r-J-IkR zc+ajXznlJ(L-0iD9`|i2@L@S0dA|LXZ!X-XJAnb;d;RAMwOc$B+|}?4U{>sw@-q)% zFMm9ld(1RQ4GO$y4oD?6qxQ?S*)FOLNvAALLK+!r_qREAYzwz5HprU=zw)SP0DPm{ zE4`v1>Se%J9+h*;M}Ojl|Cwar$9?F7h(qE04+xz*ioX7l5xkDlY(Ec~o8i zzVfKN0DR?9c>(y!qw)gqmA?>xtA2m{8NUwm5A$=8mjM@!#Lu`NdgTS+D}OZrx7~tj zYoSeTtp(uUGv2Sv!@|=H_{v`{=QrDN_dCBG^w7Id9Ww8QwU+^3c~mq2zAFZ=^ooM0 zmjPdSRL(7D66^QlX{tBFCV$`V-voeMQZs75^Mq^{)rO=UfQfwt^~0$`t8VfBi)!2y zlX}cFNDT@!hXG$+`nkgG799Xa?xuZLv0mwxK3u$6@S=PDjSCe3M!q}}G5GVp{_>5! zsl#oSBHuMSpB|eXp)g_Kw;E+y{W)Vo%>KzLL8|BaST}d|DfV_v0N?e(u+?_Zg)n0Nil^cDono*iU#d0D0%A zfw^iP#-1x_?hl%4-jXg*aFGEUehlViw|;4S_$M^L5^5U7w2AW@ysI@O4F(O>0f1Sc zvY&}bu^dYW496P+}(H@aKT+g?-abyu8j@LO>2;-y#L!ATpR4hhp?wf z3jjIM@%%VFMHoD_MzMrJxXDLm%(xqX@JjTor|c$8nfM74k2qapHu2=53at%7a8&4# zw+MnH7*VHZE`ASj0a#iH>`JJ%SWM%e+~CGBiy`J*vt5r_ou*F$RUMkbYB9DX)ePdQ zz8rghpx6JJegT@?;^16;aWsEuDAeGTn_pOC;}{mwU4*pLZrWTV z@$%1AubaY%5zAj%QLE3&9k*P0d(03rfn1uQf9h{8A7y$j}VOEY+Zw%fIfl>Tz7J(za z3|O7fvk;_frX3u*4tUYzZ0e7|Zz0aqBNcV7U^ght*Y0P5o&`v3i!nK?Nc~G1HJPnTx`{Q*u25SxQJoAGH^lUR&tK38JLAjoQuz)<2^vsLtlvIsUU=o3|Am|!qxtecS zx03DZRq_GA?kohlOFQQly!q-+-+Bm_+Y+?ZFxCpZ&cyXNaX-5dqr~6<1)@P1K;VR* z%Ch()R}myYI0E~NFv@YT*VqrioR|b|C0PWvlb~;p*EFO>B2z$H_k0FN-a?E@ftnf1 znCC#T-8u4rF@}xV1gI8yJ-r0!LnA6l2s|-}$KbTjlu@l}*N{{UQM3ZmL(vG_GToQu z6M%3Q5}gE^CR%@qZ}cPZpd<$IdaPN%Ri)x$3IhM8RUy|40IQS0GRwE$&9+Wp8}Tp(12s5+zm!hB z3iPXMW(xQlfZVdCqg6J~AYxGJEvwK&1+R=^S#W6*7;dn36@io}x{&nbZ`fSJU#M5C^Nnm7#LI60axJI_ z*tuhd$-M}C3WD5=zbF9)HMKEL8t2+NV0eWqk%puk>e6ykbPDT5^R70Wf^06w`K)}jfV7>xSuihJj11+@Mqtt*Wv$P(9 z0Q^XiNH1*gv^jq*Vk<5HpPJ(%d#NhI{<4j_@*0dkGwVoQXtZXN^9#h2wEVe zHmn&TK(U`A7izaQ5`m>GctQ-0uf(8Ek#5rv2(I=NFo@PA9Dj~ZX9vThRzb`KfN%_s zrXigaXg5Xd3@&yYXFwRJM4Aae7wwx40>n}fw<(u{{{R?_!Kf5gVlH9@;SvJz=7c~P zQl>`y#eM^kn**Fd3}6vhT!^m6U}PmGLV=<7MGzS4++VnIkOioqE#QcvgePnff~B_%a&)#^$GHpe?cs)c}QwLb!ACvqS>i7}|*d9B$BXrW%1Sa-tWV zi@_BNOb6i@2Nve-|I%G0OCjAhqMZrAX#xbr#|ujUyeP)+mp~dK8TVJC&5|kt8&b!V z&_w(JCHP2OylG?Ziv%+3VT2r~Dn8MB45C1{FowWqAZR%)$KO~#T7v^G739ip01U_A zNCszA0rHT@a&#Dh>mg`5WT}E{QMG_)dBJ-^s1l68e?C|pjls@R;Ako{&BzB~`O-}Y z9xKI!A43(20a&+mIn|MZNTz-tydSLo(v4u6)zB?Op@z|!YhSqHM6 zhBQ(jmcdaDfnHxtg`j7g!~KoKbtq&nUS$uGZ(E1*;j!d(db24BnMqZ)t% zBQO^WA0I1(W3aOlGo(ot1qOp~69Rn*_G8eu$&>Nt1YkjN7&&dM0kd)h_P!NoaH(C< z5$Og@NEU&B*Io=F)>x_PDwZ0WBR~iVNCeJ(stanx3JL_8q#+QQH8)`pvcqZoS;fr+ z2>Fzy_^Ga18e+DGJA<%8MPecP>&bU2v9QaU;ZCrZ_ zI`p9$!G-?ZbM8YmW6x&8G`o&0<(m>R0Yo#9Rsz(GpDs~GR$_FI6wgESmU&|@HL`^S zF9xrYGs0`|r<^x45SReNX)Epboe)0=no4(*RGf4P)+P zSPvX21a1aF3x0L{g#vH~0a_vQ$vM$`=6OzCOhO@^`n0z+?LVtWCGcMK%82>|`UJ%i(~nE*Xx z{i8n|SJ)x-s~FoMRepR>-68d+j_i=i#@bjg!1kuc6!PQYFFgUY&e2Q)lsBk6$`lyO zLzI(XA_8&Xj{8#{Q+KF@deS(F458Gj$Qq2cGlDUTR9bVtIa-3S?$AYGAQyQKf@HuC znf}4}Q_d#?aGn5Z!3LE;9^w$cmWY@L#7NMB;A#w79vP!Q7=L)0XU)14l`sL$-Jo)i z@s^gzOK<0SZ)SsHGs>jzAlNYcOd0;hFf$ z2ViY{5d!3W_Xmt2P%)zTQ=V-4miq(Jpm*2M9m=(wG4T9F%Xi%$P;MWVz_|!iI@DRD zn~6csHp@*LE7|x1`p;>Hs@6?_p8%Xsfo2fas+JI_Ku|n88-u|9Y=>O0AAjOmgDK_^ z;B9}v`4pHA0CMAop#h#;QWfv@+P7!(QvsH%x{5c`02t8zpG<(n2vl2(Fhv!FXmwT^BUJ9iUoHUK zt&I?1ZFekg4#Kk#Sb|`DyP2n3Kua} zXduDeHYXyf!k}f91HBl;pF7*S92$_L;^ssEJv!x5tNc_rioiGocix z24O`42*gP6;oXUHdlRvzhv850nF+vmg&YB1HzyJj=BpQb)(K}#`9#D zUlJe)oAm++bi=TA9mvN6yFiF-4MR$0SM$CmrPX#45JAxmz@krC6au`$O+T=yP|MJT zB_op!wLY@uG&UQEDu!yddyh#j*jKgs!^a;qGU|BBGeF~LJdl+218vT!ArQ+yrXx^? zP=MlsFzm3*#{>8S2++n~3{zKIQ3_Nu;;9I<<~(DuqGTyofY@h`5oN0@X5r5n{SX1l zmHQ|#j6iMjHxGev$aD%FtMM03K!O1{7*xfrIiv$QrEy~~*5x7@>Y0d>iUc=CSpQNw z;F+b_-w=Mg@Tb`j4XR}0;zc^Jc1DQgA6{!ENQ#iiAaJy_{l*9_TO%AsIo6N*Nj(57 z%|g(!U}uD(ra|fQ&Dey%AOsg<(DcS4{Mzvs48Zpj3IGfdA@=KmRCMBJ<{^F4Kpl3M zD;VPL?O5p&8)i%9gPA6fr>6H!5B|Jih7ogv&$rqc;o7e$68xb%BTz5?gm&pgQ2Ay% zBeWoJ2*WK9?0zFSWSUX?=%qT&Hefis6o(;8I2&s_C;W&?x=cK zso*a(0n|hWhL{K5Oa6N+?h|`J<^kp*LdImq<9H?l3fF91p@G5~9BIye`B zR?HcT6(vi#fW$^~geY5GF$;gr=o`2h4(Sl}wy}Z#9h^orGx$n29sfoZ zAAv^I4kr|Vbr@YyAz;tXXx#Zi0*Z)=h^jL%aIN-qaSW-L^Y(_JAcFx9 z^TsVQr{{Zl{+Zy&^x)_D^k=*b40EOP7#S2cFfdff=`b|RIKafv!8ytp4TRB@Kv6Cb zh+tsYT?x!qNle@f3Ti`!;gG<{@aEaU(NbWvC>*T@Msoo;7Yx<1YzP&*Bi^aYzB2x3 XXJvh{Yr%bB>y^RN)z4*}Q$iB}so}d2 literal 0 HcmV?d00001 diff --git a/HDMI-Tool/release/solid_0000AA.png b/HDMI-Tool/release/solid_0000AA.png new file mode 100644 index 0000000000000000000000000000000000000000..5a4bf499f8de43b9cb9a91aba8feed8fb7186ab0 GIT binary patch literal 2788 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i0*Z)=h^jL%aIN-qaSW-L^Y(_JAcFx9 z^TsWICW@qb{+Zy&^x)_D^k=*b40EOP7#S2cFfdff=`b|RIKafv!8ytp4TRB@Kv6Cb zh+tsYT?x!qNle@f3Ti`!;gG<{@aEaU(NbWvC>*T@Msoo;7Yx<1YzP&*Bi^aYzB1l) XW{tAb{|RizGB9|$`njxgN@xNA)djiF literal 0 HcmV?d00001 diff --git a/HDMI-Tool/release/solid_0000FF.png b/HDMI-Tool/release/solid_0000FF.png new file mode 100644 index 0000000000000000000000000000000000000000..87d7f56891c555f2562b32c2f54072211efb20ce GIT binary patch literal 2786 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i0*Z)=h^jL%aIN%oaSW-L^Y(_JAcFx9 z^TsWIEVrxFols!>@aMVlXEuh0bG+Lb7z8317;O2)7#w^O7#WVRj50<8VKgOBlnXd? z7#i-{0JD{0BP)Y|@Q`6BY+zt0`#f3-j24BX)xc;jfaHRqT9yr=Vt2$l_42Qs|5?}X U@=nSFwp|%KUHx3vIVCg!0Pmp!5&!@I literal 0 HcmV?d00001 diff --git a/HDMI-Tool/release/solid_005500.png b/HDMI-Tool/release/solid_005500.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3f9164175168f25bf3209078597e29431434e1 GIT binary patch literal 2787 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i0*Z)=h^jL%aINxmaSW-L^Y(_JAcFx9 z^TsVQr{{Zl{+Zy&^x)_D^m_~p0=u3{05x$lC_F#N#L&U1!_Y9}z$jxh5Jpo1CAom1 zk(FV?Y<6I_Qrp15kOazKLxaI0#&94{ZnP8_Eec1gfzez5&ILoZEE___?nrlPLX`ZE XJFKi9($k*-8?OwWu6{1-oD!Mi0*Z)=h^jL%aINxmaSW-L^Y(_JAcFx9 z^TsWICW@qb{+Zy&^x)_D^m_~p0=u3{05x$lC_F#N#L&U1!_Y9}z$jxh5Jpo1CAom1 zk(FV?Y<6I_Qrp15kOazKLxaI0#&94{ZnP8_Eec1gfzez5&ILoZEE___?nrlPLX`Z? Xx2#c*%gtqhjaLRwS3j3^P6i0*Z)=h^jL%aIN%oaSW-L^Y(_JAcFx9 z^TsWIEVrxFols!>@aMU4J_7^C-69?ahDKI~37-=f8IG`sF*x{)GDZVoG$l}!3mOhE zG2A%Y%*r4j9Kpa~2+UtYgu%qkkYLU~S_+I7g`?HLXf6Qff+1U$4WVLpq&wAME&r~6 Wtm_$8`fvc-t_+^8elF{r5}E*7;Q=@R literal 0 HcmV?d00001 diff --git a/HDMI-Tool/release/solid_550000.png b/HDMI-Tool/release/solid_550000.png new file mode 100644 index 0000000000000000000000000000000000000000..efcd1b20a24526df3e87a6b73a378776b303551c GIT binary patch literal 2787 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i0*Z)=h^jL%aINxmaSW-L^Y(_JAcFx9 z^TsVQr{{Zl{+Zy&^x)_D=e!IIOJ}cRWKh_^z>p=U!_Y9}024z8=O|+|5Jpo1MY%vA zf`MUoB`{khF>x~}s0|s0Ljohin`Z|{OM%g%aI_j2%?03GFjUL3Ayn*+c&9G=%J|ce Wl{MdDVF9r5%HZkh=d#Wzp$P!jd%2?k literal 0 HcmV?d00001 diff --git a/HDMI-Tool/release/solid_AA0000.png b/HDMI-Tool/release/solid_AA0000.png new file mode 100644 index 0000000000000000000000000000000000000000..7be3495248696b360bd2b7898a543fa856c24ebc GIT binary patch literal 2787 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i0*Z)=h^jL%aINxmaSW-L^Y(_JAcFx9 z^TsWICW@qb{+Zy&^x)_D=e!IIOJ}cRWKh_^z>p=U!_Y9}024z8=O|+|5Jpo1MY%vA zf`MUoB`{khF>x~}s0|s0Ljohin`Z|{OM%g%aI_j2%?03GFjUL3Ayn*+c&9G=%6Mx! WYm{E?^ip8smBG{1&t;ucLK6TZ*1B{6 literal 0 HcmV?d00001 diff --git a/HDMI-Tool/release/solid_F00000.png b/HDMI-Tool/release/solid_F00000.png new file mode 100644 index 0000000000000000000000000000000000000000..1e417223e4776da923e3b30e50e6d168d55b388d GIT binary patch literal 2787 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i0*Z)=h^jL%aINxmaSW-L^Y(_JAcFx9 z^TsWI4vIN>{+Zy&^x)_D=e!IIOJ}cRWKh_^z>p=U!_Y9}024z8=O|+|5Jpo1MY%vA zf`MUoB`{khF>x~}s0|s0Ljohin`Z|{OM%g%aI_j2%?03GFjUL3Ayn*+c&9G=%J{C2 Wb-{vsnQ~y`mBG{1&t;ucLK6VVcDla+ literal 0 HcmV?d00001 diff --git a/HDMI-Tool/release/solid_FF0000.png b/HDMI-Tool/release/solid_FF0000.png new file mode 100644 index 0000000000000000000000000000000000000000..8f5a718e6d6c2edf678e0f16ce879bbee7a60272 GIT binary patch literal 2785 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>i0*Z)=h^jL%aINrkaSW-L^Y(_JAcFx9 z^TsWIEVrxFols!>@aOqwHim{vzSkKT1R@w1O!>ta9DEWO8IG`wGDZVoG$l}!3pjKb z8t&Qvvz1{ZD}#XWkYOlnU|=ZwJX#8j7KNkLz-TUjpO@~_>0S=Zma TY_uQPbY<{#^>bP0l+XkKk?#Wr literal 0 HcmV?d00001 diff --git a/HDMI-Tool/src/package_release.py b/HDMI-Tool/src/package_release.py index abeaf0e..90a15de 100644 --- a/HDMI-Tool/src/package_release.py +++ b/HDMI-Tool/src/package_release.py @@ -1,9 +1,12 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -组装 HDMI-Tool 发布包: exe + 附属资产 → 一个 zip(解压即用) +组装 HDMI-Tool 发布包: exe + 附属资产 → 一个文件夹 + 一个 zip(解压即用) ================================================================ -发布内容(zip 解压后根目录为 HDMI-Tool/, 与 exe 运行目录结构一致): +先把 assets/ 的图案复制进 release/(与 exe 平铺), 使 release/ 本身就是 +可直接使用的完整文件夹; 再原样压成 zip —— 两者内容始终一致。 + +zip 解压后根目录为 HDMI-Tool/, 与 exe 运行目录结构一致: HDMI-Tool.exe 主程序(先运行 build_exe.py 打包) pattern_slots.json 预置自定义栏位(指向前 3 张 bw 图案) bw_*.png 640x360 黑白测试图 ×5(自定义栏位用) @@ -18,6 +21,7 @@ import os import re +import shutil import subprocess import sys import zipfile @@ -54,22 +58,25 @@ def main(): # 依 pattern_slots.json 校验栏位引用的图片都在 assets/ 里 slot_files = re.findall(r'"file":\s*"([^"]+)"', open(slots, encoding='utf-8').read()) - for f in slot_files: - if not os.path.exists(os.path.join(ASSETS, f)): - sys.exit(f'pattern_slots.json 引用的 {f} 不在 assets/ 中') - patterns = sorted(p for g in PATTERN_GLOBS for p in os.listdir(ASSETS) if re.fullmatch(g.replace('*', '.*'), p)) + for f in slot_files: + if f not in patterns: + sys.exit(f'pattern_slots.json 引用的 {f} 不在 assets/ 中') + + # 图案复制进 release/, 与 exe 平铺 -> release/ 即完整可用的发布文件夹 + for p in patterns: + shutil.copy2(os.path.join(ASSETS, p), os.path.join(RELEASE, p)) + shutil.copy2(readme, os.path.join(RELEASE, 'README.md')) + zip_name = f'HDMI-Tool-v{version}-win64.zip' zip_path = os.path.join(RELEASE, zip_name) with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as z: - for src, arc in ([(exe, 'HDMI-Tool.exe'), (slots, 'pattern_slots.json'), - (readme, 'README.md')] - + [(os.path.join(ASSETS, p), p) for p in patterns]): - z.write(src, f'HDMI-Tool/{arc}') - print(f'发布包: {zip_path} ({os.path.getsize(zip_path) / 1024 / 1024:.1f} MB)') - print('内容: HDMI-Tool.exe, pattern_slots.json, README.md +', f'{len(patterns)} 张图案') + for p in ['HDMI-Tool.exe', 'pattern_slots.json', 'README.md'] + patterns: + z.write(os.path.join(RELEASE, p), f'HDMI-Tool/{p}') + print(f'发布文件夹: {RELEASE} (exe+配置+说明+{len(patterns)} 张图案, 平铺即用)') + print(f'发布包: {zip_path} ({os.path.getsize(zip_path) / 1024 / 1024:.1f} MB)') print('下一步上传: python publish_gitea.py', zip_name)