Files
banban/factory_host/docs/DEVELOPMENT.md

151 lines
5.0 KiB
Markdown

# EG800 产测上位机开发与发布
## 1. 目录职责
| 目录 | 用途 | 是否提交 |
| --- | --- | --- |
| `src/` | 上位机与 FT1 协议源码 | 是 |
| `config/` | 默认发布配置 | 是 |
| `scripts/` | 音频、固件、上位机发布脚本 | 是 |
| `tests/` | 单元测试 | 是 |
| `docs/` | 工厂与开发文档 | 是 |
| `firmware/` | 默认产测与正式固件 | 是,二进制由 Git LFS 管理 |
| `vendor/` | 完整 Aboot 厂商工具 | 否,本地依赖 |
| `build/` | 中间产物、备份和开发日志 | 否 |
| `dist/` | 最终 release 目录和 ZIP | 否 |
不要在 `dist/` 保存需要长期保留的文件。`build_release.ps1` 每次发布前都会校验目标位于
`factory_host` 内,然后清空并重建目标目录。
## 2. 环境准备
在项目根目录执行:
```powershell
python -m pip install -r .\factory_host\requirements.txt
python -m pip install pyinstaller
```
完整固件构建还需要当前 EG800 SDK 的编译环境能够正常执行 `build.bat app` 和
`build.bat firmware`。
发布还要求本机存在完整厂商工具目录:
```text
factory_host/vendor/aboot-tools-2024.08.08-win-x64/
```
`vendor/` 被 Git 忽略,不能只放一个 `adownload.exe`;请保留原工具的 DLL、配置、驱动和
平台文件。发布脚本缺少该目录时会直接报错,不会生成残缺包。
## 3. 开发与测试
运行源码:
```powershell
python -B .\factory_host\src\factory_host.py
```
运行全部测试:
```powershell
python -B -m unittest discover -s .\factory_host\tests -p "test_*.py" -v
```
源码模式读取 `factory_host/config/factory_host_config.json`,日志写入
`factory_host/build/logs/`。默认相对固件路径会解析到 `factory_host/dist/firmware/`。
## 4. 更新产测音频和固件
音频源位于:
```text
audio_prompts/factory_test/customer_fs/
```
生成并验证音频文件系统:
```powershell
python -B .\factory_host\scripts\build_factory_audio_package.py
```
输出位于 `factory_host/build/audio/`。脚本会检查五个固定 MP3 的名称与格式,生成
262144 字节 `customer_fs.bin`,反向解包并逐文件核对 SHA-256。
生成产测完整固件:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\factory_host\scripts\build_factory_firmware.ps1
```
输出位于 `factory_host/build/firmware/`。脚本会临时替换 SDK 的业务
`customer_fs.bin`,完成后恢复原文件并核对哈希。恢复失败时不得继续发布。
确认新固件后,将其更新为默认产测固件:
```text
factory_host/firmware/test/EG800AKCN_11LG-FT1-factory-test.zip
```
也可以不覆盖默认文件,在发布时通过 `-FactoryFirmware` 显式选择。
## 5. 生成交付包
使用默认两份固件:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\factory_host\scripts\build_release.ps1
```
使用指定固件,路径相对于项目根目录,也支持绝对路径:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass `
-File .\factory_host\scripts\build_release.ps1 `
-FactoryFirmware "factory_host\build\firmware\EG800AKCN_11LG-FT1-factory-test.zip" `
-OfficialFirmware "factory_host\firmware\official\EG800AKCN_11LG-official-fac.zip"
```
发布脚本会:
1. 清空并重建 `factory_host/dist/`。
2. 从 `src/` 生成无控制台窗口的单文件 EXE。
3. 复制完整 Aboot 工具目录,不能只复制 `adownload.exe`。
4. 复制产测与正式固件到 `dist/firmware/`。
5. 把配置、使用说明、下载器和日志目录放入 `.runtime/`。
6. 生成包含 Git revision、文件大小和 SHA-256 的 `release_manifest.json`。
7. 生成 `EG800-Factory-Tool-Full-Package.zip`。
## 6. 发布检查
发布前至少执行:
```powershell
python -B -m unittest discover -s .\factory_host\tests -p "test_*.py" -v
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\factory_host\scripts\build_release.ps1
tar.exe -tf .\factory_host\dist\EG800-Factory-Tool-Full-Package.zip
```
ZIP 顶层只能包含:
```text
START-EG800-FACTORY-TOOL.exe
firmware/
.runtime/
```
还应在一台真实设备上验证:自动等待上电烧录、断开后才允许下一台、DBG UART 自动识别、
七项 FT1 状态、GNSS 累计数据、JSON/CSV 保存,以及产测固件和正式固件切换。
自动烧录端口枚举必须保留 USB 元数据,只接受 ASR AROM 的 `VID_2ECC/PID_3004`,并用
`location`(其次为序列号、HWID、COM 名)标识物理设备。不要把运行态的 DBG、AT、DIAG
接口交给 `adownload.exe`,否则一台设备会被误建成多个工位。
## 7. 固件替换规则
- 产测与正式固件都必须是 Aboot 可直接烧录的内层 ZIP,不要选择外层 `*-target.zip`。
- 默认文件名保持不变时无需修改配置。
- 修改文件名时同步更新 `config/factory_host_config.json`。
- 每次发布核对 `.runtime/release_manifest.json` 中的大小和 SHA-256。
- 不要把源码、`build/`、SDK 编译目录或历史日志交付给工厂。