android: phase Z wrap-up (docs, release build, camera feature optional, APK)
This commit is contained in:
@@ -2,8 +2,13 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<uses-feature android:name="android.hardware.usb.host" android:required="true" />
|
||||
<!-- Visible-light PIP overlay (Phase E): optional, requested at runtime -->
|
||||
<!-- Visible-light PIP overlay (Phase E): optional, requested at runtime.
|
||||
The explicit camera/camera.any entries keep the CAMERA permission from
|
||||
implying a REQUIRED camera feature — PIP is optional, so a device
|
||||
without a camera must still be able to run the thermal app. -->
|
||||
<uses-feature android:name="android.hardware.camera.any" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.camera" android:required="false" />
|
||||
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
<!-- LAN remote preview (Phase F): host broadcasts on UDP 47510, streams on TCP 47511 -->
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
|
||||
Binary file not shown.
@@ -61,27 +61,44 @@ android/app/src/main/kotlin/com/mag160c/thermal/
|
||||
├─ ui/UiInsets.kt 单例:底部导航高度 px(渲染器用它留白)
|
||||
├─ ui/theme/Theme.kt M3 动态取色(Android12+)
|
||||
├─ ui/live/ ★实时画面(最核心)
|
||||
│ ├─ LiveViewModel.kt 状态机/演示模式/多点测温/追踪开关/拍照/录像/inset上报
|
||||
│ ├─ LiveScreen.kt 稳定单分支相机布局:顶栏4控制项+底部快门区(相册/拍照/录像)+SurfaceView
|
||||
│ ├─ LiveViewModel.kt 状态机/多点测温/追踪开关/拍照/录像/inset上报/PIP状态/
|
||||
│ │ 远程服务端开关+rawHook→RemoteHost
|
||||
│ ├─ LiveScreen.kt 稳定单分支相机布局:顶栏5控制项(FFC/变倍/追踪/调色板/画中画)
|
||||
│ │ +底部快门区(相册/拍照/录像)+SurfaceView+PIP浮层
|
||||
│ ├─ PipCameraView.kt 可见光PIP相机引擎(Camera2最小实现,异常只记日志)
|
||||
│ └─ LiveRenderer.kt SurfaceView 软件渲染:图像恒90°旋转(3:4竖)钉在竖屏框架固定区域,
|
||||
│ 文字恒屏幕水平;色标条/圆圈标记/中心温OSD
|
||||
├─ ui/gallery/ 相册页(MediaStore DCIM/MAG160C 扫描 + 内嵌JPEG缩略图 + 运行时媒体权限)
|
||||
├─ ui/analyze/ MDT 离线分析(缩放/调色板重渲染/备注回写/PDF报告)
|
||||
├─ ui/settings/ 设置页(默认调色板/发射率/报警温度/语言/关于,SharedPreferences私有)
|
||||
├─ ui/analyze/ MDT 离线分析(缩放/调色板重渲染/温度条+点击测温/备注回写/PDF报告)
|
||||
├─ ui/settings/ 设置页(默认调色板/发射率/报警温度/语言/云同步/远程预览两行/关于)
|
||||
├─ ui/remote/ 远程预览客户端(Phase F)
|
||||
│ ├─ RemoteClientListScreen.kt 主机列表(UDP发现/手动IP/重新扫描)
|
||||
│ ├─ RemoteViewerViewModel.kt 本地管线渲染远端原始帧(调色板/变倍本地化)
|
||||
│ ├─ RemoteViewerScreen.kt 查看页(与实时页同构图,快门区换成红色"断开")
|
||||
│ └─ RemoteRendererHost.kt 与 LiveRenderer 同构图的渲染器(LiveRenderer 已冻结)
|
||||
├─ net/ 网络互连(Phase F,纯 java.net,可 JVM 单测)
|
||||
│ ├─ RemoteContract.kt 端口/魔数/JSON data/帧封包与流式重组 FramePacketReader
|
||||
│ ├─ RemoteHost.kt 服务端:UDP 47510 广播 + TCP 47511 单客户端流
|
||||
│ └─ RemoteClient.kt 客户端:发现(去重3s) + 连接/行模式→帧模式/10s判死
|
||||
├─ cloud/CloudApi.kt 云接口占位(Retrofit,opt-in 默认关闭,api() 未开启即抛异常)
|
||||
├─ media/
|
||||
│ ├─ Mdt.kt MDT 容器格式(JPG + DDT段[info块+原始帧] + 152B Tail)
|
||||
│ ├─ Mdt.kt MDT 容器格式(JPG + DDT段[info块+原始帧] + 152B Tail)+ parse
|
||||
│ ├─ PhotoSaver.kt MediaStore 保存(DCIM/MAG160C,无权限也可写自有文件)
|
||||
│ ├─ Mp4Recorder.kt MP4录像(Surface 输入 H.264,MediaCodec+MediaMuxer)
|
||||
│ ├─ DebugLog.kt 现场调试日志(落盘 DCIM→Download→私有目录 + logcat 镜像)
|
||||
│ └─ PdfReport.kt PDF 巡检报告(PdfDocument)
|
||||
├─ usb/
|
||||
│ ├─ UsbTransport.kt UsbManager 枚举(VID 0x833C)/权限/claim/EP
|
||||
│ ├─ MagProtocol.kt 命令码 0x6BB6B6xx、响应 0x5BB5B5xx
|
||||
│ └─ IrSession.kt 连接/启动流/读线程→FrameStream→RenderPipeline→回调;FFC回调
|
||||
│ ├─ MagProtocol.kt 命令码 0x6BB6B6xx(小端)/响应 0x5BB5B5xx
|
||||
│ └─ IrSession.kt 连接/启动流/读线程→FrameStream→RenderPipeline→回调;
|
||||
│ FFC回调;rawHook(远程预览)/recorderHook(录像);
|
||||
│ deviceLifetimeMs(675);cali缓存MD5对照
|
||||
├─ core/
|
||||
│ ├─ OfficialTables.kt 自动生成:PALETTE256_ARGB(官方铁虹)/T2E(646)/T2E274/E2T
|
||||
│ ├─ Palettes.kt 12调色板(铁虹=官方,其余标准曲线近似)
|
||||
│ ├─ VendorPalettes.kt 官方运行时时序生成器的移植结果(11/12 精确表,生成物)
|
||||
│ ├─ Palettes.kt 12调色板(0..10=官方精确表,11 红热=近似)
|
||||
│ ├─ RenderPipeline.kt ★官方渲染管线 Kotlin 移植(与C参考逐字节一致)
|
||||
│ ├─ TempMath.kt 温度换算(counts→毫度,T2E)
|
||||
│ ├─ TempMath.kt 温度换算(counts→毫度,T2E)+ tempMapFromPixels(MDT温度图)
|
||||
│ └─ FrameStream.kt 流帧重组(0x1BB1B11B 搜索)
|
||||
└─ task/TaskParser.kt 任务巡检 sqlite/xml 解析
|
||||
assets/mag160c.ddt 官方 DDT 标定文件(1.8MB,渲染必需)
|
||||
@@ -180,12 +197,31 @@ git -C C:\Project\MAG160C commit -m "android: ..."
|
||||
## 7. 当前状态与待办
|
||||
|
||||
**已完成**:核心管线移植(字节级验证)、USB 层、实时画面(相机式布局:
|
||||
顶栏4控制项 FFC/变倍/追踪/调色板 + 底部快门区 相册/拍照/录像 + 底导航)、
|
||||
顶栏5控制项 FFC/变倍/追踪/调色板/画中画 + 底部快门区 相册/拍照/录像 + 底导航)、
|
||||
图标文字按物理持机朝向补偿旋转(加速度计)、拍照 MDT 容器→MediaStore、
|
||||
MP4 录像、媒体库、离线分析查看器、PDF 报告、任务解析、设置页、Android16 沉浸
|
||||
(状态栏隐藏+竖屏锁定+挖孔安全区)、乱码多次修复。
|
||||
MP4 录像、媒体库、离线分析(含温度条+点击测温)、PDF 报告、任务解析、设置页、
|
||||
Android16 沉浸(状态栏隐藏+竖屏锁定+挖孔安全区)、乱码多次修复。
|
||||
(演示模式 2026-09-09 按用户要求撤下,见 §4.3。)
|
||||
|
||||
**执行计划 2026-09-10 七阶段全部落地**(docs/android_app/execution_plan.md):
|
||||
- Phase A:GetLifeTime(675) 查询→`deviceLifetimeMs` + 心跳 stats 带 lifetime;
|
||||
cali 缓存与内置 DDT 的 MD5 一致性日志;真机自检清单
|
||||
`docs/android_app/real_device_checklist.md`(24 步,含预期日志行)。
|
||||
- Phase B:`Mdt.parse` 返回 `MdtFile`(jpg 按 FFD9 裁尾、text 去 NUL 填充、
|
||||
framePixels 齐全);`TempMath.tempMapFromPixels` 毫度图;分析页温度条
|
||||
(中心/最低/最高)+ 点击测温探针。**注意:分析页图像按原生横向绘制,
|
||||
探针映射是直接映射,不要照抄实时页的 90° 逆映射。**
|
||||
- Phase C:厂商调色板——结论是 **libcxsdk.so 无静态表**,全部由
|
||||
`CFunctions::SetColorPalette` 运行时算术生成;移植该函数后 11/12 个表
|
||||
已达官方精确(0..10,铁虹与官方表 256/256 一致),索引 11 红热保留近似。
|
||||
详见 `analysis/sdk_re/android_app/palette_extraction_findings.md`。
|
||||
- Phase D:云模块占位(Retrofit 2.11.0,`AppSettings.cloudEnabled` 默认 false,
|
||||
`CloudClient.api()` 未开启即 check 抛异常——**不允许静默联网**)。
|
||||
- Phase E:可见光 PIP(Camera2 最小实现,三档尺寸、可拖动、双击关闭;
|
||||
相机任何异常只记 `[pip]` 日志并收窗,绝不影响热像主画面)。
|
||||
- Phase F:局域网远程预览(UDP 47510 发现 + TCP 47511 控制与原始帧流,
|
||||
**客户端本地管线渲染**,调色板/变倍不过网;单测含真实 TCP loopback 端到端)。
|
||||
|
||||
**布局约定(最终,勿回退)**:
|
||||
- Activity **锁定竖屏**(`portrait`),构图钉死手机竖屏框架:顶栏/热像区域/快门区/底导航
|
||||
绝对位置永不随手机物理旋转变化(屏显方向永远对应镜头方向)。
|
||||
@@ -194,12 +230,16 @@ MP4 录像、媒体库、离线分析查看器、PDF 报告、任务解析、设
|
||||
- 顶栏 `uiTopPx` 必须挂在 `safeDrawing` inset **之前**(包含挖孔安全区,否则真机热像
|
||||
顶端被顶栏盖住);`uiBottomPx` = 底导航高 + 快门区高。
|
||||
|
||||
**待办**(记录在 session_state.md):
|
||||
1. 真机 USB 实测:温度绝对值标定、FFC/录像/MDT 保存端到端。
|
||||
2. 网络互连远程预览(用户需求:UDP 自动发现 + 手动内网 IP 连另一台插热像仪的手机)。
|
||||
3. 离线 MDT 温度解码(ConvertResponse2Temperature + 标定参数)。
|
||||
4. 厂商 12 调色板精确提取(运行时抓取或逆向)。
|
||||
5. 可见光 PIP 融合、云模块(预留结构)。
|
||||
**禁改清单**(详见 execution_plan.md §0,改前先读):Manifest 的
|
||||
`screenOrientation="portrait"`、`MagProtocol` 命令字节序(MagProtocolTest 锁定)、
|
||||
`IrSession` 握手序列、`LiveRenderer` 构图逻辑、`analysis/` 目录。
|
||||
|
||||
**待办**:
|
||||
1. 真机 USB 实测:温度绝对值标定、FFC/录像/MDT 保存端到端——照
|
||||
`docs/android_app/real_device_checklist.md` 24 步走。
|
||||
2. 红热调色板(索引 11)精确表:官方 APK 的预览图是占位副本,需真机抓帧反推。
|
||||
3. 双机远程预览实测(清单第 16-24 步)。
|
||||
4. 云服务真实接口对接(当前仅占位,需账号与接口文档)。
|
||||
|
||||
## 8. 文件路径速查
|
||||
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# MAG160C 执行计划 —— session_state 剩余待办(为无视觉执行模型编写)
|
||||
|
||||
> **执行状态(2026-09-10)**:Phase A / B / C / D / E / F / Z **全部完成**,
|
||||
> 每阶段一个 commit(A=06c1f30 B=656d419 C=b7a928e D=c34940e E=f8b3200
|
||||
> F=512508e),44 个单测全绿,debug+release 双构建通过,APK 已更新。
|
||||
> 唯一未完成项为**真机实测**(需用户配合,清单见
|
||||
> `docs/android_app/real_device_checklist.md`)与红热调色板精确表(材料不足)。
|
||||
> 详细记录与诚实记录的限制见 `docs/android_app/session_state.md`。
|
||||
|
||||
> 本文件写给**没有视觉能力的执行模型**。所有 UI 位置已由主模型用精确 dp/颜色/
|
||||
> 对齐方式定义,照抄即可,不要自行发明布局。所有协议字节已由官方反编译源码
|
||||
> 确认(见 `analysis/magcx_official_flow.md`),不要修改协议常量。
|
||||
|
||||
@@ -376,14 +376,16 @@
|
||||
`Controller::PushFrame` 输入=整帧缓冲(28B头+像素+28B尾),与本管线一致。
|
||||
- 预期:66b/66c/66f 全部有响应 → cali 下载(首次)→ 流出帧。
|
||||
|
||||
## 待办
|
||||
## 待办(2026-09-10 更新:执行计划 A→F 已全部完成)
|
||||
|
||||
- 真机USB实测(温度绝对值标定、FFC/录像/MDT保存端到端)——进行中:
|
||||
自检清单位于 docs/android_app/real_device_checklist.md(Phase A3 产出)
|
||||
- 网络互连远程预览(用户需求:UDP自动发现+手动IP)
|
||||
- 离线MDT温度解码(ConvertResponse2Temperature+标定参数,待真机文件对照)
|
||||
- 厂商12调色板精确提取(需运行时抓取)
|
||||
- 可见光PIP融合、云模块(预留结构)
|
||||
- **真机实测**(唯一未完成的主线):照 `docs/android_app/real_device_checklist.md`
|
||||
24 步走一遍——1-12 单机(USB 出流/FFC/拍照/录像/媒体库/分析页温度条/PDF)、
|
||||
13-15 可见光 PIP、16-24 双机远程预览。每步都有预期 DebugLog 原文可对照。
|
||||
- 红热调色板(索引 11)精确表:官方 APK 预览图为占位副本,需真机抓帧反推。
|
||||
- 云端点对接:当前为占位接口,需账号与接口文档。
|
||||
- 任务巡检 UI(TaskParser 已就绪,尚无界面)——沿自早期计划,未列入本轮范围。
|
||||
- 旧的"网络互连/离线MDT解码/调色板提取/PIP/云模块"五项**已在本轮全部实现**
|
||||
(见下方阶段表),此处不再重复。
|
||||
|
||||
## 执行计划进度(2026-09-10,docs/android_app/execution_plan.md)
|
||||
|
||||
@@ -439,8 +441,41 @@
|
||||
单测 44 个全绿,含 **loopback 端到端测试**(真实 TCP:hello→welcome→
|
||||
start→stream-start→5 帧逐字节往返→ffc→stop→stream-stop)与粘包/截断/
|
||||
坏长度/重同步用例。debug+release 双构建通过。真机双机步骤写入清单第 16-24 步。
|
||||
- [ ] Phase Z:收尾(文档/全量构建/APK)
|
||||
- [x] Phase Z(2026-09-10):收尾完成。docs 更新(本文件 + HANDOFF_DEVELOPMENT
|
||||
§3 结构表加入 net/ cloud/ ui/remote/ 与 VendorPalettes/PipCameraView,
|
||||
§7 状态与待办重写 + 禁改清单);全量 `assembleDebug test`(44 单测全绿)
|
||||
+ `assembleRelease`(R8)通过;APK 已覆盖提交
|
||||
(build-artifacts/mag160c-app-debug.apk,12.66MB,md5 76ff4e12…);
|
||||
dex 抽查 10 个新增中文串 UTF-8 正确、无 GBK 乱码;APK 校验:
|
||||
screenOrientation=portrait 保持、camera/camera.any 均为 required=false
|
||||
(CAMERA 权限原本会让相机变必需,已显式声明为可选)。
|
||||
**未 push**(按用户指令)。
|
||||
|
||||
## 本轮(2026-09-10 执行计划 A→F)总结
|
||||
|
||||
七个阶段全部落地,每阶段一次 commit:
|
||||
|
||||
| 阶段 | commit | 内容 |
|
||||
|---|---|---|
|
||||
| A | 06c1f30 | lifetime 查询 + cali MD5 对照 + 真机自检清单 |
|
||||
| B | 656d419 | MDT 温度解码 + 分析页温度条/测温探针 |
|
||||
| C | b7a928e | 厂商调色板提取(11/12 精确表) |
|
||||
| D | c34940e | 云模块脚手架(opt-in 默认关) |
|
||||
| E | f8b3200 | 可见光 PIP 叠加(Camera2,三档可拖) |
|
||||
| F | 512508e | 局域网远程预览(UDP 发现 + 原始帧 TCP,客户端渲染) |
|
||||
|
||||
测试:29(D 结束)→ 44(F 结束),含真实 TCP loopback 端到端用例。
|
||||
|
||||
**留给用户的实测**:`docs/android_app/real_device_checklist.md` 共 24 步
|
||||
(1-12 单机 USB/拍照/录像/分析;13-15 PIP;16-24 双机远程预览),
|
||||
每步标注预期 DebugLog 原文。
|
||||
|
||||
**已知未完成项(诚实记录)**:
|
||||
1. 红热调色板(索引 11)仍是近似——官方 APK 预览图是白热的占位副本,
|
||||
生成的 case12/13 对任何预览覆盖率 ≤6%,不猜测;需真机抓帧反推。
|
||||
2. 全部真机验证(温度绝对值、PIP 相机、双机远程、MDT 温度条)需用户配合;
|
||||
本机无模拟器(SDK 无 emulator 组件)、无连接设备,只能保证编译与单测。
|
||||
3. 云端点为占位,需账号与接口文档才能对接。
|
||||
|
||||
## 里程碑日志
|
||||
|
||||
|
||||
Reference in New Issue
Block a user