继续推进:用LinuxCNC配置生成switchkins测试

结论:M428/M429/M430 的配置匹配测试已从手写列表改为由 LinuxCNC INI/MACHINE/KINEMATICS/HALFILE 生成,native 与 source-link 验证通过。
This commit is contained in:
cnc
2026-05-30 10:10:49 +08:00
parent de273bf830
commit c2d1aa6fe3
4 changed files with 141 additions and 61 deletions

View File

@@ -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"

View File

@@ -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\",\"") +

View File

@@ -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 #<kinstype> 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},

View File

@@ -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 #<kinstype> 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 #<kinstype> assignments.
EOF
printf '%s\n' "${case_entries[@]}"
else
echo "unknown switchkins remap table generator mode: $mode" >&2
exit 1
fi