12 KiB
StandardScene 插件化拆分 — 会话14 交接摘要
用途:供其他 AI 会话快速读取上下文,继续推进 StandardScene 大改或 SimpleLite 内核改造。
工作目录:E:\Work\Core\Simple-FR\StandardSence
主交付物:StandardScene拆分计划.md(v2,已落盘)
上游设计:E:\Work\Core\Simple-FR\配置向导与导航场景插件化设计.md(第 5 节 StandardScene 拆分、第 11.3 节 Phase C)
新宿主 API 文档:E:\Work\Core\Simple-FR\Simple\SimpleLite\Docs\MIGU-API.md
整理时间:2026-06-09
1. 本会话做了什么
| 阶段 | 内容 | 状态 |
|---|---|---|
| 启动 | 用户要求用 wuxianChat 建立「会话14」 | 曾尝试 MCP,一度因执行后端不可用失败 |
| 精读代码 | 对 StandardSence 约 110 个 .cs 做逐模块走查(车型、Mission、设备、WebApi、VDA5050 等) |
✅ 完成 |
| 产出 v1 计划 | 写入 StandardScene拆分计划.md:目录规划、功能归属矩阵、抽离清单、技术难点、分阶段路线 |
✅ 完成 |
| 用户评审反馈 | 宿主改 SimpleLite、net8.0、设备独立 dll+热插拔、删除 FactoryTest/松灵、WebApi 暂留后期废弃 | ✅ 已纳入 |
| 阅读 SimpleLite | 确认 SimpleLite.csproj = net8.0 / CycleGUI / EmbedIO;阅读 MIGU-API 做 WebApi 迁移索引 |
✅ 完成 |
| 产出 v2 计划 | 全文更新 StandardScene拆分计划.md |
✅ 完成 |
| 代码改动 | 无(本会话仅分析与文档,未改业务代码) | — |
2. 用户原始诉求(按时间)
2.1 第一轮
整个仓库需要大改。参考
配置向导与导航场景插件化设计.md中关于 StandardScene 的「导航场景插件化」部分;精细化读当前代码,抽离标准功能,做好仓库目录规划与功能规划,先把 plan 做出来到 StandardScene 本地 md 文件。
2.2 第二轮(评审反馈,已写入 v2)
- 设备驱动需要独立 dll,并且支持热卸载和加载。
- StandardScene 依赖
SimpleLite.dll,老SimpleComposer废弃(另一个 AI 对话窗口正在改相关引用)。 - 目标框架统一
net8.0(WinForms 场景需net8.0-windows的说明在评审中被修正:SimpleLite 本身是纯net8.0+ CycleGUI,故 StandardScene 应去 WinForms)。 FactoryTest、松灵残留不纳入 Core,直接删除。WebApi.cs是针对老平台的 Nancy 接口:整理后暂时保留在 Core,后期废弃,改用 SimpleLite 接口能力(MIGU-API.md);此版本先保留。
2.3 第三轮
把以上会话整理成 md 文件,分享给另一个会话读取。
→ 即本文档。
3. 核心结论(另一会话必须知道的)
3.1 架构修正:导航 ≠ 车型
上游设计隐含「按车型/导航整包切 dll」,与代码事实不符:
- 导航由 轨道/站点 fields + TrackCoder 决定,与车型正交。
- 例:
Kiva同一类上同时挂 磁导航 coder、二维码 coder、激光避障 coder(非 SLAM 定位)。 - 正确拆法:
StandardScene.Core保留车型本体 + 任务/充电/互锁等;导航能力抽到Magnetic/QrCode/Laser等 dll,以可插拔 coder 形式挂载。
3.2 激光:避障 vs 导航定位
| 能力 | 代表 | 归属 |
|---|---|---|
| 激光避障 | LidarArea、SwitchLidarArea、各车型通用 |
Core |
| 激光 SLAM 定位/地图 | LidarMap、getLidarMap、拉 127.0.0.1:4321 |
Laser dll |
3.3 三个正交维度
- 导航:磁 / 二维码 / 激光(SLAM)
- 车型:Kiva、叉车、多舵轮顶升、机械臂、仿真车等
- 设备驱动:充电桩(FL/MuXing/PCB)、门(Modbus)、按钮盒(Leeg/Azowie)
设备驱动必须 独立 Devices.* dll + 热插拔(SimpleLite /plugins + collectible ALC)。
3.4 VDA5050
CarTypes/VDACar/是完整 MQTT 协议栈,建议独立StandardScene.Protocol.VDA5050dll。- 耦合点:
ArmCar引用VDA5050SiteField,拆分时需解耦。
3.5 宿主与框架(v2 已定)
| 项 | 旧 | 新 |
|---|---|---|
| 宿主 | SimpleComposer.exe (.NET 4.8) |
SimpleLite (net8.0) |
| 契约 | RefSimpleCore.dll + Composer 程序集 |
SimpleCore + SimpleLite |
| UI | WinForms(大量窗体) | CycleGUI / 平台 Web(去 WinForms) |
| 对外 API | WebApi.cs (Nancy 1.4.5) |
暂留 Core;后期 EmbedIO(MIGU-API) |
SimpleLite 事实(来自 SimpleLite.csproj):TargetFramework=net8.0,OutputType=Exe,UI 用 CycleGUI,WebApi 用 EmbedIO,引用 SimpleCore。
3.6 老 WebApi 处置
WebApi.cs~123KB,40+ 端点,与导航弱相关(导航相关主要是QrMap、getLidarMap)。- 本版:整理为
WebApi.Core.cs暂留 Core,标[Obsolete]/ deprecated。 - 后期:按
StandardScene拆分计划.md§4.7 映射到 SimpleLite/api/sl/projection/*。 - 缺口:二维码地图下发、激光 SLAM 取图在 MIGU-API 暂无直接对应,迁移前需在 SimpleLite 或场景插件侧补接口。
3.7 必须删除的文件(不进 Core/Customer)
| 文件 | 原因 |
|---|---|
FactoryTest.cs |
产测专用 |
根目录 SongLingDeliveryViewer.Designer.cs |
松灵客户残留,无主文件、未编入 csproj |
根目录 MultiWheelLifterCar.cs |
与 CarTypes/MultiWheelLifterCar.cs 重名死文件,未编入 csproj |
CarTypes/UselessCar.cs |
[CarType] 已注释,测试残留 |
4. 目标 dll 结构(摘要)
StandardScene.Core/ net8.0 基座(alwaysLoad)
StandardScene.Magnetic/ 磁导航
StandardScene.QrCode/ 二维码导航 + SyncQrMap
StandardScene.Laser/ SLAM / LidarMap
StandardScene.Protocol.VDA5050/ VDA5050 MQTT 栈
StandardScene.Devices.Charge/ 充电桩驱动(热插拔)
StandardScene.Devices.Door/ 门控驱动(热插拔)
StandardScene.Devices.ButtonBox/ 按钮盒驱动(热插拔)
各可激活导航/设备 dll 配 scene.json,对接 SimpleLite POST /api/sl/projection/scenes/apply 与 active-scenes.json。
详细文件级归属矩阵见 StandardScene拆分计划.md §4,勿在本摘要重复展开。
5. 可抽离的重复代码(C0 优先)
| 重复项 | 现状位置 | 目标 |
|---|---|---|
| 磁循迹器 | Kiva.AllCarMagTrackCoder + MultiWheelLifterCar.MagTrackCoder |
合并为 Magnetic.MagneticTrackCoder |
newReset / newTrafficReset |
Kiva、Forklift、MultiWheelLifterCar 各一份 | 上提 StandardCarBase |
SetDisplayInfo、远程急停/复位 HTTP |
多车型雷同 | Core 基类默认实现 |
GetCarStatus |
Commons 与 MultiWheelForkLifter 各一份 | 统一 Commons |
| 避障/IO/纠偏 coder 模板 | 各车型粘贴 | Core 通用 coder 模板集 |
6. 技术难点(需与内核会话协同)
6.1 TrackCoder 运行期注册(最关键)
- 现状:
[TemplateTrackCoderSettings]/[ProgramTrackCoderSettings]编译期硬绑定在车型类上。 - 目标:导航 dll 加载时为车型注册 coder,卸载时移除。
- 方案:优先在
SimpleCore增加 coder 注册表;导航 dll 在INavigationProfile.OnActivate注册。 - 兜底:Core 暂保留全量 coder,导航 dll 只承载 API/地图/清单(保证不回归)。
6.2 net4.8 → net8.0 + 去 WinForms
- 引用从
SimpleComposer.exe切到SimpleLite/SimpleCore。 - 命名空间
SimpleComposer.RCS→SimpleLite.RCS等(另一会话进行中)。 - 所有 WinForms 窗体迁 CycleGUI 或平台 Web;
MessageBox改 CycleGUI 弹窗。 - 涉及窗体:
DeliveryViewer、LoopViewer、TrafficInterlockViewer、VehicleMonitor、各Charge/*Form、DoorMonitor、ButtonBoxManager、VDACar/TextViewer等。
6.3 热插拔清理
设备/导航 dll 卸载前须 OnDeactivate:清理 coder 注册、MQTT/TCP 连接、全局回调;配合 collectible ALC,确保无存活 Car/Mission 实例。
7. 分阶段实施(当前均未启动代码)
| 阶段 | 内容 | 状态 |
|---|---|---|
| C0 | 删除残留 + 去重沉淀 + 命名空间收敛 + 与 SimpleCore 内核对齐 | ⬜ 待启动 |
| C1 | 新建 StandardScene.Core(net8.0),换宿主,去 WinForms,整理 WebApi.Core |
⬜ |
| C2 | Magnetic / QrCode / Laser 三导航 dll | ⬜ |
| C3 | Devices.Charge / Door / ButtonBox(热插拔) | ⬜ |
| C4 | Protocol.VDA5050 | ⬜ |
| C5 | 联调 + WebApi 迁 SimpleLite + 文档收尾 | ⬜ |
8. 待确认项(评审未拍板)
- SimpleCore 是否提供 TrackCoder 运行期注册 API?(决定 C2 用注册表还是兜底方案)
- UI 迁移节奏:一次性迁 CycleGUI,还是按 dll 分批;哪些仅保留平台 Web?
- VDA5050 是否确认独立 dll?(计划推荐独立)
- 二维码地图下发 / 激光 SLAM 取图 在 SimpleLite 侧由谁补接口、何时补?
- 是否存在车型仅支持单一导航的硬约束?
9. 跨会话分工(重要)
| 会话/方向 | 负责内容 | 与本计划关系 |
|---|---|---|
| 本会话(会话14) | StandardScene 代码精读 + 拆分计划 v1/v2 | 主文档已落盘 |
| 另一 AI 会话(用户提及) | SimpleLite / SimpleCore 引用改造、SimpleComposer → SimpleLite 命名空间与程序集引用 |
StandardScene C1 依赖其进度 |
| 平台 / 配置向导 | WizardController、data/config-deployment.json |
通过 /scenes/apply 驱动插件加载 |
协作接口建议:
- StandardScene 侧等待:SimpleCore 的 coder 注册表、插件生命周期(OnActivate/OnDeactivate)、Collectible ALC 约定。
- 内核侧等待:StandardScene 的 scene.json 清单、NavKind 枚举、各 dll 的 provides 字段(见拆分计划 §9)。
10. 关键文件索引
| 路径 | 说明 |
|---|---|
E:\Work\Core\Simple-FR\StandardSence\StandardScene拆分计划.md |
主计划(v2),含归属矩阵、§4.7 WebApi 迁移表、分阶段、风险 |
E:\Work\Core\Simple-FR\StandardSence\StandardScene会话14交接摘要.md |
本文档,会话级交接 |
E:\Work\Core\Simple-FR\配置向导与导航场景插件化设计.md |
上游框架设计 |
E:\Work\Core\Simple-FR\Simple\SimpleLite\Docs\MIGU-API.md |
SimpleLite 新 API(WebApi 迁移目标) |
E:\Work\Core\Simple-FR\Simple\SimpleLite\SimpleLite.csproj |
宿主:net8.0 / CycleGUI / EmbedIO |
E:\Work\Core\Simple-FR\StandardSence\StandardScene.csproj |
现状:net4.8 单体插件 |
E:\Work\Core\Simple-FR\StandardSence\Commons.cs |
插件契约、CustomOperationsBeforeLoading、NoReflectionApi |
E:\Work\Core\Simple-FR\StandardSence\WebApi.cs |
老 Nancy API(待 deprecated) |
E:\Work\Core\Simple-FR\StandardSence\CarTypes\Kiva.cs |
导航与车型耦合的典型样本 |
E:\Work\Core\Simple-FR\StandardSence\CarTypes\BasicFields.cs |
TagValue 等轨道/站点字段定义 |
11. 给下一会话的推荐起手式
若继续 StandardScene 实施:
- 先读
StandardScene拆分计划.md§0(TL;DR)和 §4(归属矩阵)。 - 从 C0 开始:删除 §3.7 所列文件;合并磁循迹器;提取
StandardCarBase;AMRScene1命名空间收敛。 - 与 SimpleLite 改造会话对齐:引用是否已可编译、coder 注册表 API 是否就绪。
- 不要在未确认前大规模改 WebApi 或 WinForms——C1 才系统性处理。
若继续 SimpleLite / SimpleCore 改造:
- 优先落实 TrackCoder 运行期注册、插件 OnActivate/OnDeactivate、/plugins 热卸载 与 StandardScene 计划 §7 对齐。
- 评估 MIGU-API 是否需补 QrMap、getLidarMap 等价端点。
- 确认
SimpleComposer.RCS→SimpleLite.RCS迁移范围,避免 StandardScene 引用断裂。
12. 变更记录
| 版本 | 日期 | 说明 |
|---|---|---|
| v1 | 2026-06-09 | 初版拆分计划(代码精读结论) |
| v2 | 2026-06-09 | 纳入 SimpleLite/net8.0/去 WinForms、设备热插拔、删除项、WebApi 暂留+迁移索引 |
| 交接摘要 | 2026-06-09 | 本会话整理,供跨会话阅读 |
本文档为会话级摘要;实施细节、完整类级归属与 WebApi 端点映射以 StandardScene拆分计划.md 为准。