ZXCLI f41668d5d1 android: 修正 7x7 细节增强的混叠系数(原实现把增益乘了两遍,画面满噪点)
官方 FilterDetailEnhancement_Simple 把「增益缩放后」的 k = strength*gain*2>>8 只
传给 map(决定阈值与 divisor 下限),混叠系数用的是**原始 strength**。本移植最初
两处都用 k,等于把细节再乘一遍增益:真机 level 2 满屏噪点。改为原始 strength 后
HF 能量与关闭档基本相同(0.47-0.51 vs 0.46-0.47),边缘仍被增强。

细节校正:
- 一个有用的推论:每档的边缘强度其实与档位无关(化简为 128/gain),档位只决定
  哪些窗口通过对比度阈值——所以调高档位是"纳入更多弱对比区域",不是"推得更狠"。
  据此把档位从 0-4 扩到 0/1/2/3/4/6/8(官方 MAG_SetDetailEnhancement 钳 0..32)。
- 官方 App 自身不调用 SetDetailEnhancement(jadx 全量搜索无此符号),SetEX 是数码
  变焦 ROI 与增强无关;故无法据此对齐官方默认档,保持用户可见设置、默认关闭。

测试:
- 新增 blendUsesTheRawStrengthNotTheGainScaledOne 黄金值用例(推导写在注释里),
  把 bug 改回去会立刻失败(已实测验证)。
- 原 gainScalesTheEffect 改为 gainDoesNotAmplifyNoiseOnAFlatField + gainBelowOneIsANoOp,
  因为修正后增益不再缩放混叠幅度。98 项测试全绿。

顺带修复(同一轮真机复现):
- no_device 死锁:首次 connect 撞上相机重枚举时停在「无相机」,且紧随其后的
  ATTACHED 广播被 800ms 防抖丢弃 → 永久无画面。防抖/退避改为延后重试,no_device
  也安排 1.5s 重试(scheduleRetry 单槽位、最新优先)。
- 手机平放时加速度计 x/y≈0,迟滞逻辑保留旧姿态角导致 OSD 文字整体转 90°;
  改为 tilt<4m/s² 判定平放、姿态归零。
- 录像帧缺 max/min 标记:probesAsMarks() 现在一并返回,录像与实时画面一致。

真机(小米 22041211AC/Android12/MIUI):15.1fps 稳定、单帧 6-9ms(开增强 11ms)、
拍照与分析页标记一致且各只有一个 min/max、设置跨冷启动持久化、
屏幕熄灭时渲染停止无空转(CPU 3.7%)。
2026-09-12 05:04:50 +08:00
2026-09-06 20:41:41 +08:00

MAG160C 热像仪统一工程

MAG160C 热像仪(160×12015fpsUSB VID 0x833C)的逆向工程与双端实现: C 参考实现Linux/Windows,源自官方 PC SDK 逆向)与安卓统一 App Kotlin + Compose,适配 Android 16,整合官方 4 个 App 的功能)。

从这里开始(新接手者阅读顺序)

  1. docs/android_app/HANDOFF_DEVELOPMENT.md — 安卓 App 总交接(必读)
  2. docs/android_app/session_state.md — 会话心跳与待办(最新进度)
  3. analysis/README.md — 逆向工程总目录索引(Linux/Windows/Android 三条线)
  4. analysis/magcx_official_flow.md权威 USB 协议结论(官方源码逐行核对版)
  5. analysis/protocol_spec.md — 早期 PC 端协议逆向(硬件验证记录)
  6. csdk/README.md — C SDK 文档(构建/API/工具/测试)

仓库结构

路径 用途
android/ 安卓统一 AppKotlin + ComposeGradle 工程,package com.mag160c.thermal):实时预览、拍照 MDT、录像、媒体库、离线分析、PDF 报告、任务巡检、设置
csdk/ 纯 C SDK(官方管线 C 复刻:渲染/温度/IR 会话/FFC 调度,见 csdk/README.md
analysis/ 逆向工程总目录(Linux/Windows/Android 三条 SDK 线的解包产物与结论,见 analysis/README.md
IR_Camera_SDK-1.0.1/ 原厂 Windows/Android/Linux SDK 原始包
app/ 官方安卓 APK 存档(普通版/专业版/ThermoScope/demo
build-artifacts/ 构建产物(安卓 APK、PC demo3、DDT 标定数据)
docs/android_app/ 安卓 App 交接文档(HANDOFF / session_state / 逆向功能总表)
vendor-docs/ 厂商资料
tools/ 会话恢复脚本

快速入口

安卓 App(构建/测试)

cd C:\Project\MAG160C\android
$env:JAVA_HOME = "C:\Tools\jdk-21"
.\gradlew.bat :app:assembleDebug test --no-daemon
# 产物:build-artifacts\mag160c-app-debug.apk

C 管线复刻 demo3

gcc -O2 -w -DMAG160C_STATIC -I"csdk\third_party\libusb\win64" -I"csdk\include" -I"csdk\src" `
    -o build-artifacts\mag160c_demo3.exe csdk\tools\mag160c_demo3.c `
    csdk\src\mag160c_display.c csdk\src\mag160c_error.c `
    csdk\third_party\libusb\win64\libusb-1.0.x64.a -lgdi32 -luser32
Start-Process "build-artifacts\mag160c_demo3.exe" -WorkingDirectory "build-artifacts"

硬件

  • 设备:MAG160C 热像仪机芯,160×120 @15fps
  • USBVID 0x833C PID 0x0001;端点 0x03 命令 / 0x82 响应 / 0x81 图像流 / 0x84 标定文件 / 0x05 标定上传
  • 协议细节:analysis/magcx_official_flow.md(权威)

里程碑

  • 2026-08:官方 PC SDKlibmagcore/CoreSDKLib)逆向 + C 管线逐像素复刻(demo3)
  • 2026-09-06~09:安卓 App(纯 Kotlin,无 NDK):渲染管线移植(逐字节验证)、 USB 层(官方协议 Java 源码逐行复刻)、相机式 UI、拍照/录像/媒体库/分析/PDF
  • 2026-09-10:真机联调打通(根因:USB 命令字节序反转,已修复并用单测锁死); 官方 App 全量解包入库(jadx + Ghidra

仓库说明

仓库包含官方 SDK、反编译产物、二进制样本和抓帧数据。部分内容可能受原厂许可 限制,仅用于本项目的互操作性研究和设备调试。

S
Description
No description provided
Readme
1.1 GiB
Languages
C 43%
Assembly 11.2%
Python 10%
Java 9.3%
C++ 6.9%
Other 19.4%