From c2d1aa6fe3f90fe4c14816dfa01a9dbb5f390ed9 Mon Sep 17 00:00:00 2001 From: cnc Date: Sat, 30 May 2026 10:10:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E6=8E=A8=E8=BF=9B=EF=BC=9A?= =?UTF-8?q?=E7=94=A8LinuxCNC=E9=85=8D=E7=BD=AE=E7=94=9F=E6=88=90switchkins?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结论:M428/M429/M430 的配置匹配测试已从手写列表改为由 LinuxCNC INI/MACHINE/KINEMATICS/HALFILE 生成,native 与 source-link 验证通过。 --- check-linuxcnc-switchkins-remap-table.sh | 6 +- core/tests/cnc_sim_api_smoke.cpp | 59 +--------------- ...linuxcnc_switchkins_remap_config_cases.inc | 67 ++++++++++++++++++ generate-linuxcnc-switchkins-remap-table.sh | 70 ++++++++++++++++++- 4 files changed, 141 insertions(+), 61 deletions(-) create mode 100644 core/tests/linuxcnc_switchkins_remap_config_cases.inc diff --git a/check-linuxcnc-switchkins-remap-table.sh b/check-linuxcnc-switchkins-remap-table.sh index 7ec6324..f0540ed 100755 --- a/check-linuxcnc-switchkins-remap-table.sh +++ b/check-linuxcnc-switchkins-remap-table.sh @@ -7,7 +7,11 @@ linuxcnc_root=${LINUXCNC_ROOT:-../linuxcnc} manifest=${1:-linuxcnc-kinematics-source-files.txt} generated_table=$(mktemp "${TMPDIR:-/tmp}/linuxcnc_switchkins_remap_table.XXXXXX.inc") -trap 'rm -f "$generated_table"' EXIT +generated_cases=$(mktemp "${TMPDIR:-/tmp}/linuxcnc_switchkins_remap_config_cases.XXXXXX.inc") +trap 'rm -f "$generated_table" "$generated_cases"' EXIT LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh "$manifest" > "$generated_table" diff -u core/src/linuxcnc_switchkins_remap_table.inc "$generated_table" + +LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --config-cases "$manifest" > "$generated_cases" +diff -u core/tests/linuxcnc_switchkins_remap_config_cases.inc "$generated_cases" diff --git a/core/tests/cnc_sim_api_smoke.cpp b/core/tests/cnc_sim_api_smoke.cpp index 49d1bfd..cf4b770 100644 --- a/core/tests/cnc_sim_api_smoke.cpp +++ b/core/tests/cnc_sim_api_smoke.cpp @@ -11321,64 +11321,7 @@ int main() { int m430_type; }; const SourceBackedConfigCase source_cases[] = { - {"config", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, - {"config", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, - {"config", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, - {"config", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, - {"config", - "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", - 0, - 1, - 2}, - {"config", - "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", - 0, - 1, - 2}, - {"config", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, - {"config", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, - {"config", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, - {"config", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, - {"config", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, - {"config", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, - {"config", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, - {"config", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, - {"config", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, - {"config", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, - {"machine", "Sim-5Axis Bridge Mill (xyzbcw)", 0, 1, 2}, - {"machine", "sim-xyzab-tdr-kins (switchkins)", 1, 0, -1}, - {"machine", "sim-xyzac-trt-kins (switchkins)", 1, 0, 2}, - {"machine", "sim-xyzbc-trt-kins (switchkins)", 1, 0, 2}, - {"machine", "xyzacb-trsrn (switchkins)", 0, 1, 2}, - {"machine", "xyzbca-trsrn (switchkins)", 0, 1, 2}, - {"machine", "hexapod (switchkins)", 0, 1, 2}, - {"machine", "melfa (mm)", 0, 1, 2}, - {"machine", "millturn (mm)", 0, 1, -1}, - {"machine", "PUMA (pumakins,switchkins)", 0, 1, 2}, - {"machine", "puma_cube.ini (pumakins)", 0, 1, 2}, - {"machine", "puma560 (switchkins) (inch)", 0, 1, 2}, - {"machine", "SCARA (genserkins,switchkins)", 0, 1, 2}, - {"kinematics", "5axiskins", 0, 1, 2}, - {"kinematics", "xyzab_tdr_kins", 1, 0, -1}, - {"kinematics", "xyzac-trt-kins sparm=identityfirst", 1, 0, 2}, - {"kinematics", "xyzbc-trt-kins sparm=identityfirst", 1, 0, 2}, - {"kinematics", "xyzacb_trsrn", 0, 1, 2}, - {"kinematics", "xyzbca_trsrn", 0, 1, 2}, - {"kinematics", "genhexkins", 0, 1, 2}, - {"kinematics", "genserkins", 0, 1, 2}, - {"kinematics", "millturn", 0, 1, -1}, - {"kinematics", "pumakins", 0, 1, 2}, - {"kinematics", "scarakins coordinates=xyzcab", 0, 1, 2}, - {"halfile", "5axisgui.hal", 0, 1, 2}, - {"halfile", "5axisgui", 0, 1, 2}, - {"halfile", "kinematics.hal", 0, 1, 2}, - {"hal_file", "melfa_dh.hal", 0, 1, 2}, - {"hal_file", "melfa_dh", 0, 1, 2}, - {"hal_file", "millturn.hal", 0, 1, -1}, - {"halfile", "puma_dh.hal", 0, 1, 2}, - {"halfile", "puma_dh", 0, 1, 2}, - {"halfile", "puma560_dh.hal", 0, 1, 2}, - {"halfile", "puma560_dh", 0, 1, 2}, +#include "linuxcnc_switchkins_remap_config_cases.inc" }; for (const SourceBackedConfigCase &source_case : source_cases) { const std::string json = std::string("{\"backend\":\"smoke\",\"") + diff --git a/core/tests/linuxcnc_switchkins_remap_config_cases.inc b/core/tests/linuxcnc_switchkins_remap_config_cases.inc new file mode 100644 index 0000000..657e03a --- /dev/null +++ b/core/tests/linuxcnc_switchkins_remap_config_cases.inc @@ -0,0 +1,67 @@ +// Generated by ./generate-linuxcnc-switchkins-remap-table.sh --config-cases. +// Source: LinuxCNC INI config path, MACHINE, KINEMATICS, and non-LIB HALFILE entries +// for M428/M429/M430 remap # assignments. + {"config", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, + {"machine", "Sim-5Axis Bridge Mill (xyzbcw)", 0, 1, 2}, + {"kinematics", "5axiskins coordinates=xyzbcwy", 0, 1, 2}, + {"halfile", "5axisgui.hal", 0, 1, 2}, + {"halfile", "5axisgui", 0, 1, 2}, + {"hal_file", "5axisgui.hal", 0, 1, 2}, + {"hal_file", "5axisgui", 0, 1, 2}, + {"config", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, + {"machine", "sim-xyzab-tdr-kins (switchkins)", 1, 0, -1}, + {"kinematics", "xyzab_tdr_kins", 1, 0, -1}, + {"config", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, + {"machine", "sim-xyzac-trt-kins (switchkins)", 1, 0, 2}, + {"kinematics", "xyzac-trt-kins sparm=identityfirst", 1, 0, 2}, + {"config", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, + {"machine", "sim-xyzbc-trt-kins (switchkins)", 1, 0, 2}, + {"kinematics", "xyzbc-trt-kins sparm=identityfirst", 1, 0, 2}, + {"config", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, + {"machine", "xyzacb-trsrn (switchkins)", 0, 1, 2}, + {"kinematics", "xyzacb_trsrn", 0, 1, 2}, + {"config", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, + {"machine", "xyzbca-trsrn (switchkins)", 0, 1, 2}, + {"kinematics", "xyzbca_trsrn", 0, 1, 2}, + {"config", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, + {"machine", "hexapod (switchkins)", 0, 1, 2}, + {"kinematics", "genhexkins", 0, 1, 2}, + {"halfile", "kinematics.hal", 0, 1, 2}, + {"halfile", "kinematics", 0, 1, 2}, + {"hal_file", "kinematics.hal", 0, 1, 2}, + {"hal_file", "kinematics", 0, 1, 2}, + {"config", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, + {"machine", "melfa (mm)", 0, 1, 2}, + {"kinematics", "genserkins", 0, 1, 2}, + {"halfile", "melfa_dh.hal", 0, 1, 2}, + {"halfile", "melfa_dh", 0, 1, 2}, + {"hal_file", "melfa_dh.hal", 0, 1, 2}, + {"hal_file", "melfa_dh", 0, 1, 2}, + {"config", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, + {"machine", "millturn (mm)", 0, 1, -1}, + {"kinematics", "millturn", 0, 1, -1}, + {"halfile", "millturn.hal", 0, 1, -1}, + {"halfile", "millturn", 0, 1, -1}, + {"hal_file", "millturn.hal", 0, 1, -1}, + {"hal_file", "millturn", 0, 1, -1}, + {"config", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, + {"machine", "PUMA (pumakins,switchkins)", 0, 1, 2}, + {"kinematics", "pumakins", 0, 1, 2}, + {"halfile", "puma_dh.hal", 0, 1, 2}, + {"halfile", "puma_dh", 0, 1, 2}, + {"hal_file", "puma_dh.hal", 0, 1, 2}, + {"hal_file", "puma_dh", 0, 1, 2}, + {"config", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, + {"machine", "puma_cube.ini (pumakins)", 0, 1, 2}, + {"config", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, + {"machine", "puma560 (switchkins) (inch)", 0, 1, 2}, + {"halfile", "puma560_dh.hal", 0, 1, 2}, + {"halfile", "puma560_dh", 0, 1, 2}, + {"hal_file", "puma560_dh.hal", 0, 1, 2}, + {"hal_file", "puma560_dh", 0, 1, 2}, + {"config", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, + {"config", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, + {"machine", "SCARA (genserkins,switchkins)", 0, 1, 2}, + {"kinematics", "scarakins coordinates=xyzcab", 0, 1, 2}, + {"config", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, + {"config", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, diff --git a/generate-linuxcnc-switchkins-remap-table.sh b/generate-linuxcnc-switchkins-remap-table.sh index 05969dc..a35ac73 100755 --- a/generate-linuxcnc-switchkins-remap-table.sh +++ b/generate-linuxcnc-switchkins-remap-table.sh @@ -4,6 +4,11 @@ set -euo pipefail cd "$(dirname "$0")" linuxcnc_root=${LINUXCNC_ROOT:-../linuxcnc} +mode=table +if [[ "${1:-}" == "--config-cases" ]]; then + mode=config-cases + shift +fi manifest=${1:-linuxcnc-kinematics-source-files.txt} if [[ ! -d "$linuxcnc_root" ]]; then @@ -117,8 +122,15 @@ json_compact_string() { printf '%s' "$value" | normalize_alias | sed 's/\\/\\\\/g; s/"/\\"/g' } +cpp_string() { + local value=$1 + printf '%s' "$value" | sed 's/\\/\\\\/g; s/"/\\"/g' +} + declare -A seen_aliases=() +declare -A seen_cases=() entries=() +case_entries=() add_alias() { local alias=$1 @@ -141,6 +153,24 @@ add_alias() { entries+=(" {\"$alias\", $m428, $m429, $m430},") } +add_case() { + local field=$1 + local value=$2 + local m428=$3 + local m429=$4 + local m430=$5 + [[ -n "$value" ]] || return 0 + + local types="$m428,$m429,$m430" + local key="$field|$value|$types" + [[ -z "${seen_cases[$key]:-}" ]] || return 0 + + seen_cases[$key]=1 + field=$(cpp_string "$field") + value=$(cpp_string "$value") + case_entries+=(" {\"$field\", \"$value\", $m428, $m429, $m430},") +} + add_machine_aliases() { local machine=$1 local m428=$2 @@ -181,6 +211,24 @@ add_halfile_aliases() { add_alias "${hal_base%.hal}" "$m428" "$m429" "$m430" } +add_halfile_cases() { + local halfile=$1 + local m428=$2 + local m429=$3 + local m430=$4 + [[ -n "$halfile" ]] || return 0 + [[ "$halfile" == LIB:* ]] && return 0 + + local hal_base=${halfile##*/} + local hal_stem=${hal_base%.hal} + add_case "halfile" "$halfile" "$m428" "$m429" "$m430" + add_case "halfile" "$hal_base" "$m428" "$m429" "$m430" + add_case "halfile" "$hal_stem" "$m428" "$m429" "$m430" + add_case "hal_file" "$halfile" "$m428" "$m429" "$m430" + add_case "hal_file" "$hal_base" "$m428" "$m429" "$m430" + add_case "hal_file" "$hal_stem" "$m428" "$m429" "$m430" +} + while IFS=: read -r group path _note; do [[ "$group" == "config" && "$path" == *.ini ]] || continue @@ -207,6 +255,10 @@ while IFS=: read -r group path _note; do config_base=${path##*/} config_stem=${config_base%.ini} + add_case "config" "$path" "$m428" "$m429" "$m430" + add_case "machine" "$machine" "$m428" "$m429" "$m430" + add_case "kinematics" "$kinematics" "$m428" "$m429" "$m430" + add_alias "$path" "$m428" "$m429" "$m430" add_alias "$config_dir" "$m428" "$m429" "$m430" add_alias "${config_dir##*/}" "$m428" "$m429" "$m430" @@ -214,6 +266,7 @@ while IFS=: read -r group path _note; do add_machine_aliases "$machine" "$m428" "$m429" "$m430" add_kinematics_aliases "$kinematics" "$m428" "$m429" "$m430" while IFS= read -r halfile; do + add_halfile_cases "$halfile" "$m428" "$m429" "$m430" add_halfile_aliases "$halfile" "$m428" "$m429" "$m430" done <<<"$halfiles" @@ -229,10 +282,23 @@ while IFS=: read -r group path _note; do done done <"$manifest" -cat <<'EOF' +if [[ "$mode" == table ]]; then + cat <<'EOF' // Generated by ./generate-linuxcnc-switchkins-remap-table.sh. // Source: LinuxCNC INI MACHINE/KINEMATICS/HALFILE/SUBROUTINE_PATH/REMAP entries and // adjacent remap_subs/{428,429,430}remap.ngc # assignments. EOF -printf '%s\n' "${entries[@]}" + printf '%s\n' "${entries[@]}" +elif [[ "$mode" == config-cases ]]; then + cat <<'EOF' +// Generated by ./generate-linuxcnc-switchkins-remap-table.sh --config-cases. +// Source: LinuxCNC INI config path, MACHINE, KINEMATICS, and non-LIB HALFILE entries +// for M428/M429/M430 remap # assignments. +EOF + + printf '%s\n' "${case_entries[@]}" +else + echo "unknown switchkins remap table generator mode: $mode" >&2 + exit 1 +fi