<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki2.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=MDCS%E8%B7%A8%E5%88%87%E9%9D%A2%E7%BA%A6%E5%AE%9A</id>
	<title>MDCS跨切面约定 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki2.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=MDCS%E8%B7%A8%E5%88%87%E9%9D%A2%E7%BA%A6%E5%AE%9A"/>
	<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=MDCS%E8%B7%A8%E5%88%87%E9%9D%A2%E7%BA%A6%E5%AE%9A&amp;action=history"/>
	<updated>2026-05-16T16:53:35Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki2.lessokaji.com/index.php?title=MDCS%E8%B7%A8%E5%88%87%E9%9D%A2%E7%BA%A6%E5%AE%9A&amp;diff=1041&amp;oldid=prev</id>
		<title>Artheru：​Initial bilingual draft (auto-published)</title>
		<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=MDCS%E8%B7%A8%E5%88%87%E9%9D%A2%E7%BA%A6%E5%AE%9A&amp;diff=1041&amp;oldid=prev"/>
		<updated>2026-05-16T14:00:19Z</updated>

		<summary type="html">&lt;p&gt;Initial bilingual draft (auto-published)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 概述 / Overview ==&lt;br /&gt;
本页汇总 MDCS 平台 ''跨子系统''的约定 —— 命名、线程、错误处理、版本、文件布局。新加入团队或修改核心代码前先读这里。&lt;br /&gt;
&lt;br /&gt;
This page collects MDCS-wide ''cross-cutting conventions'' — naming, threading, error handling, versioning, file layout. Read this before joining the team or modifying core code.&lt;br /&gt;
&lt;br /&gt;
== 命名约定 / Naming conventions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 实体 / Entity !! 约定 / Convention !! 例 / Example&lt;br /&gt;
|-&lt;br /&gt;
| Medulla 插件入口类 / Medulla plugin entry || `MainIOObject`（严格大小写）|| `LidarController.MainIOObject`&lt;br /&gt;
|-&lt;br /&gt;
| 插件文件夹（一方）|| `D:\src\M2\OfficialPlugins\&amp;lt;VendorModel&amp;gt;\` || `OfficialPlugins\LidarController\`&lt;br /&gt;
|-&lt;br /&gt;
| 引用程序集 / Reference DLL || `Ref&amp;lt;Name&amp;gt;.dll` || `RefMedullaCore.dll`&lt;br /&gt;
|-&lt;br /&gt;
| Simple 车型类 / Simple car class || 用 `[CarType]` 属性，类名任意 || `[CarType] public class LB14 : ClumsyCar`&lt;br /&gt;
|-&lt;br /&gt;
| DObject 槽名 / DObject slot name || `&amp;lt;Producer&amp;gt;&amp;lt;Tag&amp;gt;` || `MedullaCartLowerIO&amp;lt;tag&amp;gt;`&lt;br /&gt;
|-&lt;br /&gt;
| Wiki 页 / Wiki page || 现有约定 ：`开发手册 - ...`, `使用手册 - ...`, `XXX适配案例`, `XXX技术概述` || `开发手册 - SimpleComposer界面开发 - CAD工具`&lt;br /&gt;
|-&lt;br /&gt;
| 上下位 IO 字段 / IO field || 上位 `*Cmd`，下位 `*Est`（或更具体的 `*OK`, `*Pct` 等）|| `vCmd`, `vEst`, `batteryPercent`&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 线程约定 / Threading conventions ==&lt;br /&gt;
* '''LadderLogic''' 每个 `[UseLadderLogic]` 类自己的线程；threads 共享 CartDefinition 字段，自行同步。&lt;br /&gt;
* '''DriveTask''' 每个 Movement 自己的线程（`ThreadPriority.AboveNormal`）。&lt;br /&gt;
* '''DObject `Wait()`''' 阻塞当前线程；要并行多源就开多线程。&lt;br /&gt;
* '''CycleGUI Draw 调用''' 从任意线程都安全（内部 marshall 到 UI 线程）。&lt;br /&gt;
* '''SimpleComposer Nancy 处理器''' 在 Nancy 线程池跑；不要长阻塞。&lt;br /&gt;
* '''Tasks''' 多用 `async`/`await`；尽量避免 `Task.Run`（除非 explicit 后台计算）。&lt;br /&gt;
&lt;br /&gt;
* LadderLogic, DriveTask each have own thread.&lt;br /&gt;
* DObject `Wait()` is blocking; parallelise across sources via worker threads.&lt;br /&gt;
* CycleGUI Draw is thread-safe.&lt;br /&gt;
* Nancy handlers run on Nancy's thread pool; no long blocks.&lt;br /&gt;
* Use `async/await`; avoid `Task.Run` unless explicit background work.&lt;br /&gt;
&lt;br /&gt;
== 错误处理三层 / 3-layer error model ==&lt;br /&gt;
=== Layer 1 — 插件级 / Plugin-level ===&lt;br /&gt;
`[UseLadderLogic(resume = true)]`（默认）捕获 `Operation()` 异常并在 `resumeRetryDelay` 后重试。日常 ''可恢复''错误用这一层。&lt;br /&gt;
&lt;br /&gt;
The default `resume = true` catches LadderLogic exceptions + retries after `resumeRetryDelay`. Use for routine recoverable errors.&lt;br /&gt;
&lt;br /&gt;
=== Layer 2 — 进程级 / Process-level ===&lt;br /&gt;
`Hedingben.ToastText(message, source)` 把异常呈现给操作工。逻辑能继续但人需要知道时用。&lt;br /&gt;
&lt;br /&gt;
`Hedingben.ToastText` surfaces errors as UI toasts. Use when logic can proceed but the human should know.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
catch (Exception e)&lt;br /&gt;
{&lt;br /&gt;
    Hedingben.ToastText($&amp;quot;Failed: {e.Message}&amp;quot;, $&amp;quot;{Name}:ERR&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Layer 3 — 看门狗级 / Watchdog-level ===&lt;br /&gt;
Wawa（[[Special:MyLanguage/看门狗Wawa使用说明|看门狗Wawa使用说明]]）是进程监控；进程崩了会重启。对应&amp;quot;世界着火&amp;quot;级别的错误 —— 让它 `throw`，让 watchdog 接手。&lt;br /&gt;
&lt;br /&gt;
Wawa is the process watchdog. For &amp;quot;the world is on fire&amp;quot; — `throw` and let the watchdog restart.&lt;br /&gt;
&lt;br /&gt;
=== 选层 / Picking the right layer ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 情况 / Situation !! 用哪层 / Use&lt;br /&gt;
|-&lt;br /&gt;
| PLC 通讯偶尔超时 || Layer 1（resume + 重试）&lt;br /&gt;
|-&lt;br /&gt;
| 雷达连接断开 || Layer 1（重连循环）+ Layer 2（toast）&lt;br /&gt;
|-&lt;br /&gt;
| 关键传感器永久失效 || Layer 2（toast）+ 把 `eStop = true`&lt;br /&gt;
|-&lt;br /&gt;
| 内存溢出 / panic || Layer 3（throw → watchdog 重启）&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
不要 ''同时''做三层 —— 选最合适的。&lt;br /&gt;
Don't do all three; pick the right one.&lt;br /&gt;
&lt;br /&gt;
== 版本与助记词 / Versioning ==&lt;br /&gt;
每次修改编译产物 ：&lt;br /&gt;
Every modification of a compiled artefact:&lt;br /&gt;
&lt;br /&gt;
* `AssemblyInformationalVersion` 加 ''单词助记词'' ：`1.4.0+kindling`&lt;br /&gt;
* 下次改 ：`1.4.1+lantern`&lt;br /&gt;
* 助记词 ''单一''单词；不要 hyphen / 空格&lt;br /&gt;
&lt;br /&gt;
或用 `[ReplaceWithCompileInfo]` —— LessokajiWeaver 自动注入时间戳 + git hash。&lt;br /&gt;
Or `[ReplaceWithCompileInfo]` — auto-inject timestamp + git hash.&lt;br /&gt;
&lt;br /&gt;
目的 ：现场调试时区分两个数字看起来一样的二进制。&lt;br /&gt;
Purpose: visually disambiguate field binaries with same number.&lt;br /&gt;
&lt;br /&gt;
== 文件 / 路径 约定 / Path conventions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 用途 / Use !! 约定路径 / Convention&lt;br /&gt;
|-&lt;br /&gt;
| 临时工作文件 / 草稿 || `D:\src\ai-deck\&amp;lt;project&amp;gt;\` （非 repo 根；可丢弃）&lt;br /&gt;
|-&lt;br /&gt;
| 项目级开发日志 || `D:\src\&amp;lt;repo&amp;gt;\DEV_LOG.md`（仓库根；append-only）&lt;br /&gt;
|-&lt;br /&gt;
| 插件 csproj 引用 / HintPath || `..\tools\Ref&amp;lt;Name&amp;gt;.dll`&lt;br /&gt;
|-&lt;br /&gt;
| 部署时 plugin 位置 || `medulla/plugins/&amp;lt;vendor&amp;gt;/&amp;lt;plugin&amp;gt;.dll`，`simplecomposer/plugins/`&lt;br /&gt;
|-&lt;br /&gt;
| startup 脚本 || `startup.iocmd`（Medulla CWD）&lt;br /&gt;
|-&lt;br /&gt;
| SLAM 地图文件 || `*.2dlm` / `*.gtex` / `*.gtm` / `*.memslam` / `tagmap.json`&lt;br /&gt;
|-&lt;br /&gt;
| DObject 录制 || `.dorec`&lt;br /&gt;
|-&lt;br /&gt;
| 日志 / Logs || `logs/&amp;lt;YYYY-MM-DD&amp;gt;.log`（DLog）+ `hedingben.log`&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DEV_LOG.md ==&lt;br /&gt;
仓库根 `DEV_LOG.md` 是 ''append-only''的开发日志 ：&lt;br /&gt;
The `DEV_LOG.md` at each repo root is the '''append-only''' dev log:&lt;br /&gt;
&lt;br /&gt;
* 每条新条目追加到末尾，绝不修改旧条目。&lt;br /&gt;
* 重要发现用前缀 ：`【发现】 / 【注意】 / 【灵感】`&lt;br /&gt;
* 编译产物的版本助记词也记在这里。&lt;br /&gt;
&lt;br /&gt;
DEV_LOG 的目的是让 ''下一个读者''（也许 6 个月后的自己）能复原当时的判断。&lt;br /&gt;
DEV_LOG's goal: the next reader (maybe you in 6 months) can reconstruct the decisions.&lt;br /&gt;
&lt;br /&gt;
== 注释风格 / Comment style ==&lt;br /&gt;
* '''头部注释稀疏''' —— 代码应自解释。&lt;br /&gt;
* '''中文注释常见'''于领域特定处（运动学、标定、传感）。&lt;br /&gt;
* '''关键代码用 ''发现''标记''' —— 文件里也用 `// 【发现】 ...` 提醒后续读者。&lt;br /&gt;
&lt;br /&gt;
* Header comments sparse — code should be self-evident.&lt;br /&gt;
* Chinese comments are normal in domain-specific spots.&lt;br /&gt;
* `// 【发现】 ...` flags for important inline notes.&lt;br /&gt;
&lt;br /&gt;
== 测试纪律 / Testing discipline ==&lt;br /&gt;
* 单元测试稀疏；机器人代码本质上靠 ''集成''测试。&lt;br /&gt;
* `D:\src\Fundamentals\Test\` 覆盖 DObject + DLog（最关键基础）。&lt;br /&gt;
* 多数&amp;quot;测试&amp;quot;通过 `[MovementTest]` / `[IOObjectUtility]` UI 按钮跑。&lt;br /&gt;
* '''改 DObject 后必跑 Fundamentals 单元测试''' —— IPC bug 灾难性。&lt;br /&gt;
* '''改 *Core 后跑仿真车 SimpleComposer 集成测试'''。&lt;br /&gt;
&lt;br /&gt;
== 文档 / Documentation ==&lt;br /&gt;
* '''Wiki 是事实标准'''；代码注释 / DEV_LOG 是 ''临时记''。&lt;br /&gt;
* 公共 API 改动必同时 update wiki。&lt;br /&gt;
* 私下试验在 `ai-deck/`，不要污染 wiki。&lt;br /&gt;
&lt;br /&gt;
== Git 约定 / Git ==&lt;br /&gt;
* Branch 名 ：`feature/&amp;lt;short-name&amp;gt;`, `fix/&amp;lt;issue&amp;gt;`, `release/&amp;lt;version&amp;gt;`&lt;br /&gt;
* Commit 消息含助记词与一句话变更摘要&lt;br /&gt;
* PR / MR 描述含 ：变更动机 + 关键决策 + 测试方法&lt;br /&gt;
&lt;br /&gt;
== License / 许可 ==&lt;br /&gt;
* 客户机器绑定 license 由 `auth.lessokaji.com` 签发；`LessokajiProtect.dll` 在 Fundamentals。&lt;br /&gt;
* 开发机用 ''dev license''（无限期但带水印）。&lt;br /&gt;
* 不要在源码里 hardcode license / serial。&lt;br /&gt;
&lt;br /&gt;
== 相关页面 / See also ==&lt;br /&gt;
* [[Special:MyLanguage/MDCS仓库布局与构建链|MDCS仓库布局与构建链]]&lt;br /&gt;
* [[Special:MyLanguage/插件契约与打包约定|插件契约与打包约定]]&lt;br /&gt;
* [[Special:MyLanguage/插件开发清单|插件开发清单]]&lt;br /&gt;
* [[Special:MyLanguage/核心开发指南|核心开发指南]]&lt;br /&gt;
* [[Special:MyLanguage/看门狗Wawa使用说明|看门狗Wawa使用说明]]&lt;br /&gt;
* [[Special:MyLanguage/通用约定|通用约定]] — 已有的&amp;quot;通用约定&amp;quot;页（业务侧）&lt;br /&gt;
&lt;br /&gt;
[[Category:二次开发相关说明]]&lt;br /&gt;
[[Category:开发手册]]&lt;br /&gt;
[[Category:通识和入门教学]]&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
</feed>