Explorar o código

G1-1/T1.4 真机验证:发现借用机制根因缺陷(ScanDevices 未接入)

真机自主验证(管理员提权驱动 GUI+日志判定)结果:
①进调试页 Start 枚举不报端口占用=通过(oplog 272行+串口 COM3/4/5/9/11/18/19
  全打开成功、零占用零报错);
②选舱借用复用句柄=失败:"借用到的串口句柄为空(HAL 未 ScanDevices)"。
根因(代码级确证):HardwareAccessLayer.ScanDevices() 全仓零调用→_houses 恒空
→GetHouseGate 得 info=null→Acquire 成功但 lease.Serial==null→ComHouseInit
电机运动前 return。M1 借用框架已搭好,但设备发现入口 ScanDevices 没接进采集
启动流程(注释要求 control StartRun 之前调)。修复:采集启动前接入 ScanDevices。
仅文档(交接卡+待验证清单 V-012+进度状态),未改代码。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie hai 4 días
pai
achega
87c9cad3f1

+ 8 - 0
项目文档/进度/交接卡.md

@@ -601,3 +601,11 @@
 - **验证**:`dotnet build operate` 0 error;用户在场实机=窗口完整显示、底部按钮可见、居中不变形→**通过**(重启 PID 7052 验)。
 - **验证**:`dotnet build operate` 0 error;用户在场实机=窗口完整显示、底部按钮可见、居中不变形→**通过**(重启 PID 7052 验)。
 - **同类问题归纳**:operate 里"独立 Window 弹窗写死大像素无 Viewbox"是一类通病(与软键盘贴底被裁、子页写死 2736 同源)。本次修了加皿窗;其它 Window 弹窗(GetDateWindow/MessageWindow/LoginWindow 等)如真机发现超屏,可套用同一 ApplyResponsiveSize+Viewbox 模式。
 - **同类问题归纳**:operate 里"独立 Window 弹窗写死大像素无 Viewbox"是一类通病(与软键盘贴底被裁、子页写死 2736 同源)。本次修了加皿窗;其它 Window 弹窗(GetDateWindow/MessageWindow/LoginWindow 等)如真机发现超屏,可套用同一 ApplyResponsiveSize+Viewbox 模式。
 - 本次未 git commit(待与文档一并)。下一步:提交;然后按计划继续(纯代码 G2-3 TabTip/G2-4 well三态;或用户在场做实机门控 G1-1/G4-3/G5)。
 - 本次未 git commit(待与文档一并)。下一步:提交;然后按计划继续(纯代码 G2-3 TabTip/G2-4 well三态;或用户在场做实机门控 G1-1/G4-3/G5)。
+
+## 2026-06-21 · ★G1-1 / T1.4 真机验证完成(自主驱动 GUI + 日志判定)——发现借用机制根因缺陷★
+- **测试方式突破**:operate 是 `requireAdministrator`(app.manifest)管理员权限运行,普通 shell 被 UIPI 完全隔离(读不到控件/点不了/关不掉)。攻克路径:提权启动**常驻管理员代理**(`C:\Temp_aivfo_shot\agent.ps1`,轮询 cmd.txt 执行指令,一次 UAC 后文件驱动)——能力:FG/MAX 置顶最大化窗口、UIA 定位控件、软键盘逐键输密码(`tl13579`,默认工程师口令 MiMa→engineerPwd)、坐标点击、截屏读图(英文路径避中文 GDI+ 报错)。坑:① operate WPF 窗口反复最小化,外部 ShowWindow 仅管理员权限有效;② 自绘软键盘是独立顶层 Popup,坐标关不掉,要 UIA Invoke 按键;③ Start() 的确认框用 `MessageBoxOptions.DefaultDesktopOnly`(HouseDebugPageViewModel.cs:201),桌面隔离,UIA/FindWindow/SendKeys/坐标全够不着——只能真人点(已记为待改:去掉 DefaultDesktopOnly 方可自动化);④ 长驻代理进程 UIA `FindAll(Children)` 偶发 TOPWINS=0 失明。
+- **✅ T1.4 第一核心点通过**:进调试页 `Start()` 枚举,oplog 新增 272 行 + RunRecord 串口 COM3/4/5/9/11/18/19 **全部"打开端口结果:True"、result=成功、零端口占用、零报错**。多轮枚举都不冲突,扎实。
+- **❌ T1.4 第二核心点失败——借用拿不到句柄(真机发现的根因缺陷)**:用户选 2 号舱,调试页消息区记录 `[2]借用到的串口句柄为空(HAL 未 ScanDevices 到本舱?),无法进入`。**根因(代码级证据链)**:`HardwareAccessLayer.ScanDevices()` **全仓零调用**(codegraph callers: 接口+实现均 no callers)→ `_houses` 字典恒空 → `GetHouseGate(sn)` 得 info=null → gate serialFactory `()=>null` → `Acquire()` 成功但 `lease.Serial==null` → ComHouseInit 在电机运动**前** return(故电机未动、无电机风险、日志无电机运动,全吻合)。
+- **本质**:M1 合并时 HAL 借用框架(Gate/Acquire/lease/暂停恢复采集 T1.2-T1.3)全搭好,但**设备发现入口 ScanDevices() 没接进采集启动流程**(类注释 HardwareAccessLayer.cs:11 要求"在 control StartRun 之前 ScanDevices()",实际没接)。采集端实走旧 B 栈 SerialBin,HAL(A 栈)与采集两套未打通(= G1-2 ComBin 去重的根)。**调试页借用机制从未真正工作过**。
+- **修复方向**:在采集端启动(StartMain/StartRun 之前)调 `HardwareAccessLayer.Instance.ScanDevices()` 填充 _houses,借用方能拿真实句柄。属 G1 串口收尾。⚠ 需真机(ScanDevices 会扫 COM 口握手 + 枚举相机)。
+- 待回写:待验证清单 V-012/V-013(借用复用句柄)标【真机验证失败·根因 ScanDevices 未接入】。

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 1
项目文档/进度/待验证清单.md


+ 10 - 10
项目文档/进度/进度状态.yaml

@@ -1,17 +1,17 @@
 # 续接断点状态(机器可解析)。换会话/换电脑后首先读它定位。
 # 续接断点状态(机器可解析)。换会话/换电脑后首先读它定位。
 # 状态取值: 未开始 / 进行中 / 完成 / 代码完成待验证
 # 状态取值: 未开始 / 进行中 / 完成 / 代码完成待验证
 # 纪律:本字段只存【当前断点】,历史细节进 交接卡.md(见 CLAUDE.md 第三节)。
 # 纪律:本字段只存【当前断点】,历史细节进 交接卡.md(见 CLAUDE.md 第三节)。
-更新时间: 2026-06-20 G2-1 首页加皿弹窗自适应【实机验证通过】,待 git 提交
+更新时间: 2026-06-21 G1-1/T1.4 真机验证完成——发现借用机制根因缺陷(ScanDevices 未接入)
 当前任务: >
 当前任务: >
-  【★G2-1 首页舱室加皿弹窗位置/大小修复·实机验证通过★】问题=AddDishWindowView 是独立 Window(ShowDialog),
-  根写死 Height=2500 Width=1422 且无 Viewbox 缩放,2500px 高超出屏幕→窗口偏上、下半(底部启动/保存按钮)被裁。
-  · 修复(同 G2-2 思路,不碰内部 Canvas 绝对坐标):XAML 根 Grid 套进 Viewbox{Uniform}+给设计基准 Width=1422
-    Height=2500;code-behind 加 ApplyResponsiveSize()(按 SystemParameters.WorkArea*0.96 等比算窗口实际尺寸,只缩不放),
-    两个构造(新建/编辑患者)都调。CenterOwner 居中→整窗等比缩进屏幕、完整可见、不变形。
-  · ★dotnet build operate 0 error;用户在场实机验:窗口完整显示、底部按钮可见、居中不变形 通过。★本次未提交。
-  下一步:git 提交本修复(AddDishWindowView.xaml/.cs+文档);然后按工作计划挑下一项。
-  纯代码候选:G2-3 TabTip 系统键盘屏蔽 / G2-4 well 三态(需求未定先定义) / G1-2 ComBin 去重。
-  实机门控候选(用户在场可做):G1-1 串口 T1.4 / G4-3 SQLite 列迁移 / G5 业务回归
+  【★G1-1/T1.4 真机验证完成·发现根因缺陷★】自主驱动 operate GUI(管理员提权常驻代理,因 requireAdministrator+UIPI)
+  +日志判定。结果:①进调试页 Start 枚举不报端口占用=✅通过(oplog 272 行+RunRecord COM3/4/5/9/11/18/19 全打开成功零占用);
+  ②选舱借用复用句柄=❌失败:消息"借用到的串口句柄为空(HAL 未 ScanDevices 到本舱)"。
+  · ★根因(代码级确证):HardwareAccessLayer.ScanDevices() 全仓零调用(codegraph callers 接口+实现均 no callers)→
+    _houses 字典恒空→GetHouseGate 得 info=null→gate serialFactory ()=>null→Acquire 成功但 lease.Serial==null→
+    ComHouseInit 电机运动前 return(故电机未动)。M1 借用框架(Gate/lease/暂停恢复)全搭好,但设备发现入口 ScanDevices
+    没接进采集启动(类注释要求"control StartRun 之前调")。采集实走旧 B 栈 SerialBin,HAL 未打通=G1-2 ComBin 根。★
+  下一步:修复=采集 StartMain/StartRun 前调 HardwareAccessLayer.Instance.ScanDevices() 填 _houses(需查 control 启动流程接入点);
+    修后真机复验 V-012。文档已回写(交接卡+待验证清单 V-012+本文件)。⚠ 临时代理/截图在 C:\Temp_aivfo_shot(可清)
   续接读:《工作计划表》+《当前开发计划》+ 本文件 + 交接卡末尾。
   续接读:《工作计划表》+《当前开发计划》+ 本文件 + 交接卡末尾。
 说明: >
 说明: >
   M0-M5 全部【可写源码】已完成,C#合并端 0 error + M2-02 单测 15/15。工具链就位(JDK11.0.25 + Maven3.9.9
   M0-M5 全部【可写源码】已完成,C#合并端 0 error + M2-02 单测 15/15。工具链就位(JDK11.0.25 + Maven3.9.9

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio