Jelajahi Sumber

docs(d2-02-t3): 突破-o重定向绕operate.exe锁编译验证(3.4/3.5升级compile-verified 0错)+记operate HAL空壳发现(手动需切CommandAsync)

huangjie 2 hari lalu
induk
melakukan
80d48ac2a9

+ 20 - 0
项目文档/进度/D2-02-第三阶段-自动对焦重构-特殊情况记录.md

@@ -74,3 +74,23 @@
 - 待用户回头确认:★**确认 D12 是否仅指"自动对焦阶段"(=我的方案B,已满足) 还是要连胚胎拍照阶段也迁本地(=方案A,需改ccdThreadFun且要先解决层对称语义对齐+管理端兼容,风险高)。** 默认按方案B继续,你说要方案A我再做。
 - 附:自动对焦阶段那段"绕FocusZ再拍N层capture"在去评分后可能部分变冗余(旧评分链遗留),属L1清理范畴,本次未动,留观察。
 
+#### [环境·阻塞] ★operate.exe(PID20268,32K)卡死无法清除→operate侧编译硬阻塞  — 2026-06-25
+- 情况:`ivf_tl_Operate.exe` PID20268 仅 32K 内存(=崩溃/挂起僵尸,真UI是几百MB),锁着 operate DLL。`taskkill /F` 普通态拒绝访问;**提权 taskkill /F 也杀不掉**(进程仍在)——典型"卡在内核/驱动不可中断调用"的僵尸(疑当年崩在串口/相机驱动),通常只能**重启机器**才清。
+- 决策/处理:**不自主重启真机**(会中断 control.exe+硬件+在培养胚胎,风险过大,超出"跑测试"授权)。因此 operate sln 编译硬阻塞 → **Task 3.4(调试页UI重构)/3.5(保存范围)只能写代码、无法编译验证**;Phase 5 另需真机硬件。
+- 影响面/闭环核对:control 侧/Java/管理端全部已编译验证通过(不受此阻塞);仅 operate.exe 锁的 operate 工程编译受阻。
+- 待用户回头确认/处理:★**需要你(或现场)在合适时机重启该真机一次,清掉卡死的 operate.exe**,之后 operate 侧代码(3.4/3.5)即可 Release 编译 + 真机联调。重启前 operate 本就是死的(32K),重启只清僵尸、不丢功能(新构建会更好)。
+- 我接下来:仍按 goal 把 3.4/3.5 的代码写出来(功能版,严格照现有 HouseDebugPageViewModel/DebugSessionClient/新 CalibrationClient 范式),提交时标注"compile-pending:operate.exe 卡死待重启",把开发工作推到"只差编译/真机验证"。
+
+#### [环境·突破] ★绕过卡死operate.exe做编译验证:-o 重定向输出  — 2026-06-25
+- 情况:operate.exe 卡死锁的是 **bin 里已加载的 DLL**;`dotnet build` 默认要覆盖 bin→MSB3021。
+- 突破:`dotnet build ivf_tl_Operate.sln -c Release -o /tmp/opbuild_verify`——**输出重定向到临时目录**,避开被锁的 bin,obj(中间产物)不被锁→**编译成功 0 错**。
+- 决策/处理:**operate.exe 锁不再是编译阻塞**。3.4/3.5(commit 6e57d04)及后续 operate 改动均用此法编译验证(`-o /tmp/opbuild_verify`)。注意:这只验证"能编译",**真机运行/界面/联调仍需重启清僵尸后跑真 operate**(Phase 5)。
+- 影响面/闭环核对:3.4/3.5 从"compile-pending"升级为"compile-verified 0错"。
+- 待用户回头确认:合适时机仍建议重启真机清卡死 operate.exe,以便真 operate 运行联调(非编译需要)。
+
+#### [Task 3.4] ★重大发现:operate进程HAL是空壳,手动命令真机失效需切CommandAsync  — 2026-06-25
+- 情况:子代理查实——**只有 control 进程 ScanDevices 持真硬件;operate 进程 `HardwareAccessLayer.Instance` 是空壳**(从不 ScanDevices)。故调试页旧"operate 本地 gate.Acquire 拿 Serial/Cam"在真机必 null、`if(Serial==null)return` 早退=**现有调试页硬件路径从没真工作过**(既存问题,非本次引入)。真正能借硬件的唯一入口=control 的 HTTP `/debug/*`。`CurrentSessionId` 字段早声明但全库无赋值点。
+- 决策/处理:3.4 已把 acquire 经 DebugSessionClient(`/debug/acquire`)前移、建立 sessionId、接通 CalibrationClient(标定走 HTTP 协作=对的)。**但手动电机/光源命令仍走进程内 `Serial.*Wait()`(真机 null)→ 真机失效**。D7"保留手动功能"要真闭环,**必须把手动命令切到 `_debugClient.CommandAsync(op,args)`**(control 的 /debug/command 的 DebugSessionManager.Execute 已覆盖全部 op:Vertical/Horizontal Move/Reset/Forward/Backward、Write* EEPROM、Led/阀/曝光等)。→ 已作为 Task3.4b 紧接着做。
+- 影响面/闭环核对:这是调试页能在真机用的关键;不切则手动兜底功能名存实亡。
+- 待用户回头确认:无(明确该切,自行做)。
+

+ 3 - 2
项目文档/进度/D2-02-第三阶段-自动对焦重构-进度.md

@@ -47,8 +47,9 @@
 - [x] 3.2a control `/debug/calibrate/*` 端点 + CalibrationManager 接真实引擎 — commit 5e98d95,control.sln 0错,71/71测(借现有lease+范围注入+scene=0,InternalsVisibleTo暴露ReadWellFocusRange)
 - [x] 3.2b 标定推流帧缓冲(OnFrame→共享缓冲,StartPreviewStream标定时读缓冲不GrabStable)— commit c1d230f,0错,6测(per-sid FrameSlot,非标定零变化,避免相机锁争用)
 - [x] 3.3 operate CalibrationClient + 单测 — commit a5ac2b4,TDD 5测全绿(start/progress/recalibrate/stop+进度DTO,链入control测试工程)
-- [ ] 3.4 HouseDebugPageViewModel/View 重构(3×6 总览 + 逐孔微调 + 保留手动)★需先清operate.exe挂起进程才能编operate sln(真机谨慎)
-- [ ] 3.5 调试页保存范围走 well/update ★同上需operate编译
+- [x] 3.4 HouseDebugPageViewModel/View 重构(3×6 总览 + 逐孔微调 + 保留手动)— commit 6e57d04,功能版,operate sln编译验证0错(-o临时目录绕锁)。★发现operate HAL空壳→手动命令需切CommandAsync(Task3.4b)
+- [x] 3.5 调试页保存范围走 well/update — commit 6e57d04(SaveWellFocusRange→WellUpdateApi,字段对齐Java),编译0错
+- [ ] 3.4b 手动电机/光源命令切 DebugSessionClient.CommandAsync(真机闭环,operate HAL空壳故必须)
 
 ### Phase 4 — front-manament 砍对焦预览窗  ✅ 完成
 - [x] 4.1 去掉 DetailView "对焦预览"入口 — commit 6e9d6b8