From 23e67bb6cd2d831333b0cc78d9155921ddd81353 Mon Sep 17 00:00:00 2001 From: cnc Date: Sat, 6 Jun 2026 12:58:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=89=E6=BA=90=E9=AA=8C=E8=AF=81=E9=9D=9E?= =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E5=88=80=E8=A1=A8=E4=BF=9D=E5=AD=98=E8=BE=B9?= =?UTF-8?q?=E7=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 源依据:LinuxCNC src/emc/tooldata/tooldata_common.cc 的 tooldata_save() 在 DB_NOTUSED 下按 is_random_toolchanger 选择起始 pocket;非随机换刀器从 pocket 1 开始写出,跳过 spindle pocket 0。 结论:wasm-safe tooldata_common standalone probe 增加非随机保存断言,确认 pocket 0 的 spindle-only 数据不会写入普通刀表,同时 pocket 1 的真实刀具仍会保存,减少 tooldata_common/mmap 后端替换风险。 检查:./test-linuxcnc-wasm-tooldata-common-link.sh;./test-native.sh;./test-linuxcnc-source-link.sh。 --- .../tooldata/tooldata_common_probe_main.cc | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/core/wasm_shims/tooldata/tooldata_common_probe_main.cc b/core/wasm_shims/tooldata/tooldata_common_probe_main.cc index 2d5b9eb..354b8d2 100644 --- a/core/wasm_shims/tooldata/tooldata_common_probe_main.cc +++ b/core/wasm_shims/tooldata/tooldata_common_probe_main.cc @@ -123,6 +123,47 @@ int main() { nonrandom_spindle.offset.tran.z != 4.25) { return 20; } + CANON_TOOL_TABLE spindle_only = tooldata_entry_init(); + spindle_only.toolno = 99; + spindle_only.pocketno = 0; + spindle_only.offset.tran.z = 9.0; + if (tooldata_put(spindle_only, 0) != IDX_OK) { + return 21; + } + CANON_TOOL_TABLE saved_nonspindle = tooldata_entry_init(); + saved_nonspindle.toolno = 7; + saved_nonspindle.pocketno = 5; + saved_nonspindle.offset.tran.z = 4.25; + if (tooldata_put(saved_nonspindle, 1) == IDX_FAIL) { + return 26; + } + std::string nonrandom_save_template = make_temp_template("cnc_tooldata_common_nonrandom_save_XXXXXX"); + std::vector nonrandom_save_path(nonrandom_save_template.begin(), nonrandom_save_template.end()); + nonrandom_save_path.push_back('\0'); + const int nonrandom_save_fd = mkstemp(nonrandom_save_path.data()); + if (nonrandom_save_fd < 0) { + return 22; + } + close(nonrandom_save_fd); + // LinuxCNC source basis: src/emc/tooldata/tooldata_common.cc saves + // nonrandom tool tables starting at pocket 1, so spindle pocket 0 is not + // emitted unless DB_ACTIVE selects the one-entry spindle save path. + if (tooldata_save(nonrandom_save_path.data()) != 0) { + std::remove(nonrandom_save_path.data()); + return 23; + } + FILE *nonrandom_save_fp = std::fopen(nonrandom_save_path.data(), "r"); + if (!nonrandom_save_fp) { + std::remove(nonrandom_save_path.data()); + return 24; + } + char nonrandom_saved[CANON_TOOL_ENTRY_LEN * 2] = {}; + std::fread(nonrandom_saved, 1, sizeof(nonrandom_saved) - 1, nonrandom_save_fp); + std::fclose(nonrandom_save_fp); + std::remove(nonrandom_save_path.data()); + if (std::strstr(nonrandom_saved, "T99") || !std::strstr(nonrandom_saved, "T7")) { + return 25; + } tooldata_init(true); tooldata_set_db(DB_ACTIVE);