feat(firmware): support rocking-horse workbench delivery
This commit is contained in:
@@ -1,5 +1,15 @@
|
||||
# Web Console
|
||||
|
||||
## 座椅固件开发工作台
|
||||
|
||||
“开发指令”支持输入“增加动态木马功能”,也可点击位于位置控制、座椅通风、座椅加热之后的
|
||||
“+ 动态木马”快捷按钮。木马模式会自动加入位置控制依赖,基于当前时间控制基线生成
|
||||
“时间控制+位置控制+动态木马”固件,并沿用代码生成、IAR 编译、验证、打包和发布流程。
|
||||
可同时选择通风、加热等能力。固件使用已有木马标定参数及停止、超时保护。
|
||||
|
||||
发布后的产物可下载,并通过该行的“通知车端”按钮发送现有协议的 3 帧发布通知;
|
||||
通知仅提示有可用固件,不会自动升级或启动座椅。未选择木马的工作台任务关闭木马编译开关。
|
||||
|
||||
## 宠物卡片与 NFC 上报
|
||||
|
||||
主页“宠物卡片”区域支持创建多张宠物卡片。`pet_name` 与 `action` 可在卡片中编辑,
|
||||
|
||||
@@ -176,7 +176,7 @@ textarea {
|
||||
outline: none;
|
||||
}
|
||||
textarea:focus { border-color: #79a4f4; box-shadow: 0 0 0 3px rgba(40, 105, 232, .1); background: #fff; }
|
||||
.prompt-templates { display: flex; gap: 6px; overflow: hidden; }
|
||||
.prompt-templates { display: flex; flex-wrap: wrap; gap: 6px; }
|
||||
.prompt-templates button {
|
||||
min-width: 0;
|
||||
padding: 5px 8px;
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
<title>座椅固件开发工作台 · 511 工程</title>
|
||||
<link rel="icon" href="/icons/app-icon-192.png" />
|
||||
<script src="/firmware-workbench-theme.js?v=1"></script>
|
||||
<link rel="stylesheet" href="/firmware-workbench.css?v=7" />
|
||||
<link rel="stylesheet" href="/firmware-workbench.css?v=8" />
|
||||
<script src="/vendor/lucide/0.468.0/lucide.min.js" defer></script>
|
||||
<script src="/firmware-workbench.js?v=4" defer></script>
|
||||
<script src="/firmware-workbench.js?v=5" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="shell">
|
||||
@@ -48,6 +48,7 @@
|
||||
<button type="button" data-prompt="增加支持座椅位置参数控制的能力">+ 位置控制</button>
|
||||
<button type="button" data-prompt="增加座椅通风功能">+ 座椅通风</button>
|
||||
<button type="button" data-prompt="增加座椅加热功能">+ 座椅加热</button>
|
||||
<button type="button" data-prompt="增加动态木马功能">+ 动态木马</button>
|
||||
</div>
|
||||
<div class="capability-brief" aria-label="固件能力升级范围">
|
||||
<div><span>当前基线</span><strong id="baselineCapabilities">时间控制</strong></div>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
publish: "cloud-upload",
|
||||
};
|
||||
const ACTIVE_STATES = new Set(["waiting", "running", "pending_confirmation"]);
|
||||
const CAPABILITY_ORDER = ["时间控制", "位置控制", "座椅通风", "座椅加热"];
|
||||
const CAPABILITY_ORDER = ["时间控制", "位置控制", "座椅通风", "座椅加热", "动态木马"];
|
||||
const FALLBACK_BASELINES = {
|
||||
time_only: ["时间控制"],
|
||||
};
|
||||
@@ -112,8 +112,11 @@
|
||||
"位置控制": ["位置", "position"],
|
||||
"座椅通风": ["通风", "vent"],
|
||||
"座椅加热": ["加热", "heater", "heat"],
|
||||
"动态木马": ["木马", "rocking_horse", "rocking horse", "rocking-horse"],
|
||||
};
|
||||
return CAPABILITY_ORDER.filter((capability) => aliases[capability].some((alias) => lowered.includes(alias)));
|
||||
const requested = CAPABILITY_ORDER.filter((capability) => aliases[capability].some((alias) => lowered.includes(alias)));
|
||||
if (requested.includes("动态木马") && !requested.includes("位置控制")) requested.push("位置控制");
|
||||
return CAPABILITY_ORDER.filter((capability) => requested.includes(capability));
|
||||
}
|
||||
|
||||
function updateCapabilityPreview(task = null) {
|
||||
@@ -126,6 +129,7 @@
|
||||
: CAPABILITY_ORDER.filter((item) => baseline.includes(item) || parseInstructionCapabilities(ui.instruction.value).includes(item));
|
||||
ui.baselineCapabilities.textContent = baseline.join("+");
|
||||
ui.targetCapabilities.textContent = (target?.length ? target : baseline).join("+");
|
||||
ui.targetCapabilities.title = ui.targetCapabilities.textContent;
|
||||
}
|
||||
|
||||
function formatDate(value) {
|
||||
@@ -247,7 +251,7 @@
|
||||
return;
|
||||
}
|
||||
ui.inspector.innerHTML = task.file_changes?.length
|
||||
? task.file_changes.map((change) => `<div class="change-item"><span class="change-type">${change.type === "added" ? "新增" : "修改"}</span><div class="change-copy"><strong>${escapeHtml(change.path)}</strong><span>${escapeHtml(change.summary)}</span></div></div>`).join("")
|
||||
? task.file_changes.map((change) => `<div class="change-item"><span class="change-type">${change.type === "added" ? "新增" : change.type === "retained" ? "复用" : "修改"}</span><div class="change-copy"><strong>${escapeHtml(change.path)}</strong><span>${escapeHtml(change.summary)}</span></div></div>`).join("")
|
||||
: `<div class="empty-inline">尚无文件变更</div>`;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const CACHE_VERSION = "cognitive-agent-pad-v334-video-media";
|
||||
const CACHE_VERSION = "cognitive-agent-pad-v335-firmware-rocking-horse";
|
||||
const SHELL_CACHE = `${CACHE_VERSION}-shell`;
|
||||
const RUNTIME_CACHE = `${CACHE_VERSION}-runtime`;
|
||||
const APP_SHELL = [
|
||||
@@ -27,8 +27,8 @@ const APP_SHELL = [
|
||||
"/firmware-workbench-entry.js?v=3",
|
||||
"/firmware-workbench.html",
|
||||
"/firmware-workbench-theme.js?v=1",
|
||||
"/firmware-workbench.css?v=7",
|
||||
"/firmware-workbench.js?v=4",
|
||||
"/firmware-workbench.css?v=8",
|
||||
"/firmware-workbench.js?v=5",
|
||||
"/assets/pets/self-extension-cat.png?v=3",
|
||||
"/assets/pets/self-extension-cat-entrance.png?v=3",
|
||||
"/manifest.webmanifest",
|
||||
|
||||
Reference in New Issue
Block a user