推进 INI 面板 UI 会话描述 helper
This commit is contained in:
61
text10.txt
61
text10.txt
@@ -793,3 +793,64 @@ host_wasm_opfs_browser_smokes=ok
|
|||||||
`SESSION_SNAPSHOT_ID`、`SESSION_SNAPSHOT_FILENAME` 与 G-code fallback metadata 整理成
|
`SESSION_SNAPSHOT_ID`、`SESSION_SNAPSHOT_FILENAME` 与 G-code fallback metadata 整理成
|
||||||
一个小的 UI session descriptor/helper,减少按钮 handler 间重复拼接 snapshot label、
|
一个小的 UI session descriptor/helper,减少按钮 handler 间重复拼接 snapshot label、
|
||||||
G-code OPFS path 和默认 program source 的逻辑。仍不解析或改写任何 CNC 语义。
|
G-code OPFS path 和默认 program source 的逻辑。仍不解析或改写任何 CNC 语义。
|
||||||
|
|
||||||
|
十、2026-06-14 继续执行记录:INI panel UI session descriptor helper
|
||||||
|
|
||||||
|
本轮继续沿 OPFS/session/UI boundary 推进,把 INI panel 内部的 session snapshot 常量与
|
||||||
|
默认 G-code metadata 收敛成一个小的 UI session descriptor/helper,减少按钮 handler
|
||||||
|
之间重复拼接。
|
||||||
|
|
||||||
|
完成内容:
|
||||||
|
|
||||||
|
- 在 `wasm-port/runtime/ui/ini-panel/app.js` 新增 `UI_SESSION` descriptor:
|
||||||
|
- `snapshotId`;
|
||||||
|
- `snapshotFilename`;
|
||||||
|
- `defaultGcodeFilename`;
|
||||||
|
- `gcodeWasmPath`;
|
||||||
|
- 新增 `sessionSnapshotLabel(...)`,统一生成
|
||||||
|
`ui-machine-session/ui-machine-session.json` 形式的 UI label;
|
||||||
|
- 新增 `defaultGcodeOpfsPath()`,统一生成默认 G-code OPFS path;
|
||||||
|
- `save-session-snapshot`、`restore-session-snapshot`、`restore-load-session` 的日志与
|
||||||
|
字段回填改为复用 descriptor/helper;
|
||||||
|
- `Run G-code` 的 default fallback 与 WASM target path 改为复用 descriptor;
|
||||||
|
- 保持现有 UI 文本、按钮行为、snapshot id/filename、G-code filename、WASM path 和
|
||||||
|
OPFS path 不变;
|
||||||
|
- 未改变 G-code 文本内容、OPFS file-service、machine-session bridge、interpreter run
|
||||||
|
API、canonical-event 解析或 LinuxCNC-owned runtime semantics。
|
||||||
|
|
||||||
|
验证已通过:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git diff --check
|
||||||
|
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
|
||||||
|
wasm-port/tests/opfs/node/verify_file_service.sh
|
||||||
|
wasm-port/tools/verify_vendor_sync.sh
|
||||||
|
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
|
||||||
|
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
|
||||||
|
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
|
||||||
|
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
|
||||||
|
wasm-port/tests/host/verify_host_smokes.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
关键输出:
|
||||||
|
|
||||||
|
```text
|
||||||
|
browser_ini_opfs_smoke=ok
|
||||||
|
opfs_file_service_node_smoke=ok
|
||||||
|
vendor sync up to date
|
||||||
|
standalone CNC semantics guard complete
|
||||||
|
interp_wasm_node_smoke=ok
|
||||||
|
sim_configs_wasm_node_inventory_executed=28
|
||||||
|
sim_configs_wasm_node_inventory_passed=28
|
||||||
|
sim_configs_wasm_node_inventory_skipped=131
|
||||||
|
sim_configs_wasm_node_inventory_unexpected_fail=0
|
||||||
|
browser_interp_smoke=ok
|
||||||
|
host_wasm_opfs_browser_smokes=ok
|
||||||
|
```
|
||||||
|
|
||||||
|
下一步建议:
|
||||||
|
|
||||||
|
继续沿 OPFS/session/UI boundary 推进。优先让 `Save Session Snapshot` 的 metadata 使用
|
||||||
|
同一个 `UI_SESSION` descriptor 生成,例如补充 snapshot label、default G-code OPFS path
|
||||||
|
和 UI workflow source,方便后续恢复/审计用户会话;并在 browser smoke 中验证 metadata
|
||||||
|
可从 saved snapshot round trip 读回。仍不解析或改写任何 CNC 语义。
|
||||||
|
|||||||
@@ -49,8 +49,12 @@ const SESSION_WASM_FILES = {
|
|||||||
};
|
};
|
||||||
const GCODE_FILENAME = "ui-session.ngc";
|
const GCODE_FILENAME = "ui-session.ngc";
|
||||||
const GCODE_WASM_FILE = "/work/ui-session.ngc";
|
const GCODE_WASM_FILE = "/work/ui-session.ngc";
|
||||||
const SESSION_SNAPSHOT_ID = "ui-machine-session";
|
const UI_SESSION = {
|
||||||
const SESSION_SNAPSHOT_FILENAME = "ui-machine-session.json";
|
snapshotId: "ui-machine-session",
|
||||||
|
snapshotFilename: "ui-machine-session.json",
|
||||||
|
defaultGcodeFilename: GCODE_FILENAME,
|
||||||
|
gcodeWasmPath: GCODE_WASM_FILE,
|
||||||
|
};
|
||||||
const DEFAULT_TOOL_TABLE = "T2 P7 Z3.125 D1.5 I12 J34 Q4 ;ui session tool\n";
|
const DEFAULT_TOOL_TABLE = "T2 P7 Z3.125 D1.5 I12 J34 Q4 ;ui session tool\n";
|
||||||
const DEFAULT_PARAMETERS = [
|
const DEFAULT_PARAMETERS = [
|
||||||
"5161 0.0",
|
"5161 0.0",
|
||||||
@@ -312,10 +316,19 @@ function syncEditorToWasmFs() {
|
|||||||
requireIniSdk().writeTextFile(WASM_FILE, editor.value);
|
requireIniSdk().writeTextFile(WASM_FILE, editor.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sessionSnapshotLabel(snapshot = UI_SESSION) {
|
||||||
|
const sessionId = typeof snapshot === "string" ? snapshot : snapshot.snapshotId ?? snapshot.sessionId;
|
||||||
|
return `${sessionId}/${UI_SESSION.snapshotFilename}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function defaultGcodeOpfsPath() {
|
||||||
|
return `linuxcnc/gcode/${UI_SESSION.defaultGcodeFilename}`;
|
||||||
|
}
|
||||||
|
|
||||||
async function loadSelectedGcodeProgram() {
|
async function loadSelectedGcodeProgram() {
|
||||||
const opfsPath = restoredSessionSnapshot?.payload?.files?.gcode;
|
const opfsPath = restoredSessionSnapshot?.payload?.files?.gcode;
|
||||||
let filename = GCODE_FILENAME;
|
let filename = UI_SESSION.defaultGcodeFilename;
|
||||||
let selectedOpfsPath = `linuxcnc/gcode/${GCODE_FILENAME}`;
|
let selectedOpfsPath = defaultGcodeOpfsPath();
|
||||||
let source = "default";
|
let source = "default";
|
||||||
if (typeof opfsPath === "string") {
|
if (typeof opfsPath === "string") {
|
||||||
try {
|
try {
|
||||||
@@ -323,23 +336,23 @@ async function loadSelectedGcodeProgram() {
|
|||||||
selectedOpfsPath = opfsPath;
|
selectedOpfsPath = opfsPath;
|
||||||
source = "snapshot";
|
source = "snapshot";
|
||||||
} catch {
|
} catch {
|
||||||
filename = GCODE_FILENAME;
|
filename = UI_SESSION.defaultGcodeFilename;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
filename,
|
filename,
|
||||||
opfsPath: selectedOpfsPath,
|
opfsPath: selectedOpfsPath,
|
||||||
source,
|
source,
|
||||||
wasmPath: GCODE_WASM_FILE,
|
wasmPath: UI_SESSION.gcodeWasmPath,
|
||||||
text: await loadGcodeProgram(filename),
|
text: await loadGcodeProgram(filename),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async function restoreSessionSnapshotToEditor() {
|
async function restoreSessionSnapshotToEditor() {
|
||||||
const snapshot = await loadMachineSessionSnapshot(
|
const snapshot = await loadMachineSessionSnapshot(
|
||||||
SESSION_SNAPSHOT_ID,
|
UI_SESSION.snapshotId,
|
||||||
MACHINE_ID,
|
MACHINE_ID,
|
||||||
{ filename: SESSION_SNAPSHOT_FILENAME },
|
{ filename: UI_SESSION.snapshotFilename },
|
||||||
);
|
);
|
||||||
const files = await loadMachineTextFiles(MACHINE_ID);
|
const files = await loadMachineTextFiles(MACHINE_ID);
|
||||||
editor.value = files.ini;
|
editor.value = files.ini;
|
||||||
@@ -347,7 +360,7 @@ async function restoreSessionSnapshotToEditor() {
|
|||||||
setField("sessionParameters", snapshot.payload.files.parameters);
|
setField("sessionParameters", snapshot.payload.files.parameters);
|
||||||
setField("sessionToolTable", snapshot.payload.files.toolTable);
|
setField("sessionToolTable", snapshot.payload.files.toolTable);
|
||||||
setField("sessionGcode", snapshot.payload.files.gcode);
|
setField("sessionGcode", snapshot.payload.files.gcode);
|
||||||
setField("sessionSnapshot", `${snapshot.sessionId}/${SESSION_SNAPSHOT_FILENAME}`);
|
setField("sessionSnapshot", sessionSnapshotLabel(snapshot.sessionId));
|
||||||
restoredSessionSnapshot = snapshot;
|
restoredSessionSnapshot = snapshot;
|
||||||
return snapshot;
|
return snapshot;
|
||||||
}
|
}
|
||||||
@@ -466,7 +479,7 @@ document.getElementById("save-machine-files").addEventListener("click", async ()
|
|||||||
toolTable: DEFAULT_TOOL_TABLE,
|
toolTable: DEFAULT_TOOL_TABLE,
|
||||||
parameters: DEFAULT_PARAMETERS,
|
parameters: DEFAULT_PARAMETERS,
|
||||||
});
|
});
|
||||||
const gcodePath = await saveGcodeProgram(GCODE_FILENAME, DEFAULT_GCODE);
|
const gcodePath = await saveGcodeProgram(UI_SESSION.defaultGcodeFilename, DEFAULT_GCODE);
|
||||||
setLog(
|
setLog(
|
||||||
[
|
[
|
||||||
"Saved machine text files to OPFS.",
|
"Saved machine text files to OPFS.",
|
||||||
@@ -488,13 +501,13 @@ document.getElementById("save-session-snapshot").addEventListener("click", async
|
|||||||
toolTable: DEFAULT_TOOL_TABLE,
|
toolTable: DEFAULT_TOOL_TABLE,
|
||||||
parameters: DEFAULT_PARAMETERS,
|
parameters: DEFAULT_PARAMETERS,
|
||||||
});
|
});
|
||||||
await saveGcodeProgram(GCODE_FILENAME, DEFAULT_GCODE);
|
await saveGcodeProgram(UI_SESSION.defaultGcodeFilename, DEFAULT_GCODE);
|
||||||
const snapshot = await saveMachineSessionSnapshot(
|
const snapshot = await saveMachineSessionSnapshot(
|
||||||
SESSION_SNAPSHOT_ID,
|
UI_SESSION.snapshotId,
|
||||||
MACHINE_ID,
|
MACHINE_ID,
|
||||||
{
|
{
|
||||||
filename: SESSION_SNAPSHOT_FILENAME,
|
filename: UI_SESSION.snapshotFilename,
|
||||||
gcodeFilename: GCODE_FILENAME,
|
gcodeFilename: UI_SESSION.defaultGcodeFilename,
|
||||||
metadata: { source: "ini-panel" },
|
metadata: { source: "ini-panel" },
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
@@ -502,11 +515,11 @@ document.getElementById("save-session-snapshot").addEventListener("click", async
|
|||||||
setField("sessionParameters", snapshot.payload.files.parameters);
|
setField("sessionParameters", snapshot.payload.files.parameters);
|
||||||
setField("sessionToolTable", snapshot.payload.files.toolTable);
|
setField("sessionToolTable", snapshot.payload.files.toolTable);
|
||||||
setField("sessionGcode", snapshot.payload.files.gcode);
|
setField("sessionGcode", snapshot.payload.files.gcode);
|
||||||
setField("sessionSnapshot", `${SESSION_SNAPSHOT_ID}/${SESSION_SNAPSHOT_FILENAME}`);
|
setField("sessionSnapshot", sessionSnapshotLabel(UI_SESSION));
|
||||||
setLog(
|
setLog(
|
||||||
[
|
[
|
||||||
"Saved machine session snapshot to OPFS.",
|
"Saved machine session snapshot to OPFS.",
|
||||||
`Snapshot: ${SESSION_SNAPSHOT_ID}/${SESSION_SNAPSHOT_FILENAME}`,
|
`Snapshot: ${sessionSnapshotLabel(UI_SESSION)}`,
|
||||||
`INI: ${snapshot.payload.files.ini}`,
|
`INI: ${snapshot.payload.files.ini}`,
|
||||||
`Parameter file: ${snapshot.payload.files.parameters}`,
|
`Parameter file: ${snapshot.payload.files.parameters}`,
|
||||||
`Tool table file: ${snapshot.payload.files.toolTable}`,
|
`Tool table file: ${snapshot.payload.files.toolTable}`,
|
||||||
@@ -524,7 +537,7 @@ document.getElementById("restore-session-snapshot").addEventListener("click", as
|
|||||||
setLog(
|
setLog(
|
||||||
[
|
[
|
||||||
"Restored machine session snapshot from OPFS.",
|
"Restored machine session snapshot from OPFS.",
|
||||||
`Snapshot: ${snapshot.sessionId}/${SESSION_SNAPSHOT_FILENAME}`,
|
`Snapshot: ${sessionSnapshotLabel(snapshot.sessionId)}`,
|
||||||
`INI: ${snapshot.payload.files.ini}`,
|
`INI: ${snapshot.payload.files.ini}`,
|
||||||
`Parameter file: ${snapshot.payload.files.parameters}`,
|
`Parameter file: ${snapshot.payload.files.parameters}`,
|
||||||
`Tool table file: ${snapshot.payload.files.toolTable}`,
|
`Tool table file: ${snapshot.payload.files.toolTable}`,
|
||||||
@@ -562,7 +575,7 @@ document.getElementById("restore-load-session").addEventListener("click", async
|
|||||||
setLog(
|
setLog(
|
||||||
[
|
[
|
||||||
"Restored and loaded machine session snapshot.",
|
"Restored and loaded machine session snapshot.",
|
||||||
`Snapshot: ${snapshot.sessionId}/${SESSION_SNAPSHOT_FILENAME}`,
|
`Snapshot: ${sessionSnapshotLabel(snapshot.sessionId)}`,
|
||||||
`INI: ${loadedSession.ini.opfsPath} -> ${loadedSession.ini.wasmPath}`,
|
`INI: ${loadedSession.ini.opfsPath} -> ${loadedSession.ini.wasmPath}`,
|
||||||
`Parameter file: ${loadedSession.parameters.opfsPath} -> ${loadedSession.parameters.wasmPath}`,
|
`Parameter file: ${loadedSession.parameters.opfsPath} -> ${loadedSession.parameters.wasmPath}`,
|
||||||
`Parameters: ${loadedSession.parameters.result.trim()}`,
|
`Parameters: ${loadedSession.parameters.result.trim()}`,
|
||||||
|
|||||||
Reference in New Issue
Block a user