From 3cc759012138dfbb67e8c463ef791af24ff4a66a Mon Sep 17 00:00:00 2001 From: cnc Date: Wed, 3 Jun 2026 17:00:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=82=E8=80=83=E6=89=80=E6=9C=89=E5=88=86?= =?UTF-8?q?=E7=BB=84=EF=BC=9A=E9=94=81=E5=AE=9Aloadusr=E8=B5=84=E4=BA=A7?= =?UTF-8?q?=E6=B8=85=E5=8D=95=E6=A0=A1=E9=AA=8C=EF=BC=8C=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- check-linuxcnc-switchkins-remap-table.sh | 65 ++++++++++++ generate-linuxcnc-switchkins-remap-table.sh | 112 +++++++++++++++++--- 2 files changed, 161 insertions(+), 16 deletions(-) diff --git a/check-linuxcnc-switchkins-remap-table.sh b/check-linuxcnc-switchkins-remap-table.sh index 6c8833b..f521af1 100755 --- a/check-linuxcnc-switchkins-remap-table.sh +++ b/check-linuxcnc-switchkins-remap-table.sh @@ -363,6 +363,9 @@ validate_generator_cli_contract() { local cli_manifest_with_unused_postgui local cli_manifest_with_unused_remap local cli_manifest_with_unused_tooldata + local cli_manifest_without_halfile_loadusr_asset + local cli_melfa_manifest + local cli_melfa_without_halcmd_loadusr_asset local cli_trsrn_manifest local cli_trsrn_without_g531_asset local cli_trsrn_without_g69_asset @@ -388,6 +391,9 @@ validate_generator_cli_contract() { cli_manifest_with_unused_postgui="$cli_dir/bridgemill-manifest-with-unused-postgui.txt" cli_manifest_with_unused_remap="$cli_dir/bridgemill-manifest-with-unused-remap.txt" cli_manifest_with_unused_tooldata="$cli_dir/bridgemill-manifest-with-unused-tooldata.txt" + cli_manifest_without_halfile_loadusr_asset="$cli_dir/bridgemill-manifest-without-halfile-loadusr-asset.txt" + cli_melfa_manifest="$cli_dir/melfa-manifest.txt" + cli_melfa_without_halcmd_loadusr_asset="$cli_dir/melfa-manifest-without-halcmd-loadusr-asset.txt" cli_trsrn_manifest="$cli_dir/trsrn-manifest.txt" cli_trsrn_without_g531_asset="$cli_dir/trsrn-manifest-without-g531-asset.txt" cli_trsrn_without_g69_asset="$cli_dir/trsrn-manifest-without-g69-asset.txt" @@ -415,6 +421,7 @@ validate_generator_cli_contract() { require("remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc") require("remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc") require("tooldata:configs/sim/axis/vismach/5axis/bridgemill/5axis.tbl") + require("asset:src/hal/user_comps/vismach/5axisgui.py") } { key = $1 ":" $2 @@ -528,6 +535,64 @@ validate_generator_cli_contract() { echo "switchkins remap generator accepted manifest missing LinuxCNC TOOL_TABLE source" >&2 exit 1 fi + grep -Fv \ + 'asset:src/hal/user_comps/vismach/5axisgui.py:' \ + "$cli_manifest" >"$cli_manifest_without_halfile_loadusr_asset" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_without_halfile_loadusr_asset" >/dev/null 2>&1; then + echo "switchkins remap generator accepted manifest missing LinuxCNC HALFILE loadusr asset source" >&2 + exit 1 + fi + + if ! awk -F: -v manifest="$manifest_file" ' + function require(key) { + expected[++expected_count] = key + expected_keys[key] = 1 + } + BEGIN { + require("config:configs/sim/axis/vismach/melfa-sim/melfa.ini") + require("config:configs/sim/axis/vismach/melfa-sim/melfa_dh.hal") + require("config:configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal") + require("remap:configs/sim/axis/vismach/melfa-sim/remap_subs/428remap.ngc") + require("remap:configs/sim/axis/vismach/melfa-sim/remap_subs/429remap.ngc") + require("remap:configs/sim/axis/vismach/melfa-sim/remap_subs/430remap.ngc") + require("tooldata:configs/sim/axis/vismach/melfa-sim/melfa.tbl") + require("asset:src/hal/user_comps/vismach/melfagui.py") + } + { + key = $1 ":" $2 + if (key in expected_keys) { + if (key in manifest_line) { + print "duplicate melfa switchkins source in " manifest ": " key > "/dev/stderr" + duplicate = 1 + } + manifest_line[key] = $0 + } + } + END { + missing = 0 + for (expected_index = 1; expected_index <= expected_count; expected_index++) { + key = expected[expected_index] + if (!(key in manifest_line)) { + print "melfa switchkins source is not listed in " manifest ": " key > "/dev/stderr" + missing = 1 + continue + } + print manifest_line[key] + } + exit missing || duplicate + } + ' "$manifest_file" >"$cli_melfa_manifest"; then + exit 1 + fi + grep -Fv \ + 'asset:src/hal/user_comps/vismach/melfagui.py:' \ + "$cli_melfa_manifest" >"$cli_melfa_without_halcmd_loadusr_asset" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_melfa_without_halcmd_loadusr_asset" >/dev/null 2>&1; then + echo "switchkins remap generator accepted manifest missing LinuxCNC HALCMD loadusr command asset source" >&2 + exit 1 + fi cp "$cli_manifest" "$cli_manifest_with_unused_hal" grep -F \ 'config:configs/sim/axis/vismach/melfa-sim/melfa_dh.hal:' \ diff --git a/generate-linuxcnc-switchkins-remap-table.sh b/generate-linuxcnc-switchkins-remap-table.sh index 892a89b..938b62f 100755 --- a/generate-linuxcnc-switchkins-remap-table.sh +++ b/generate-linuxcnc-switchkins-remap-table.sh @@ -102,11 +102,16 @@ read_ini_switchkins_config() { print "postgui_halfile\t" value } else if (section == "hal" && key == "halcmd") { lower = tolower(value) - if (lower ~ /(^|[[:space:]])loadusr([[:space:]]|$)/ && - match(lower, /[^[:space:]]+\.py([[:space:]]|$)/)) { - py = substr(value, RSTART, RLENGTH) - sub(/[[:space:]]*$/, "", py) - print "halcmd_loadusr_py\t" py + if (lower ~ /(^|[[:space:]])loadusr([[:space:]]|$)/) { + command = value + sub(/^.*(^|[[:space:]])loadusr[[:space:]]+/, "", command) + while (command ~ /^-[^[:space:]]+[[:space:]]+/) { + sub(/^-[^[:space:]]+[[:space:]]+/, "", command) + } + sub(/[[:space:]].*$/, "", command) + if (command != "") { + print "halcmd_loadusr\t" command + } } } else if (section == "emcio" && key == "tool_table") { print "tool_table\t" value @@ -149,6 +154,34 @@ read_ini_switchkins_config() { ' "$file" } +read_loadusr_commands() { + local file=$1 + awk ' + function trim(value) { + sub(/^[[:space:]]*/, "", value) + sub(/[[:space:]]*$/, "", value) + return value + } + { + line = $0 + sub(/[[:space:]]*#.*/, "", line) + line = trim(line) + lower = tolower(line) + if (lower !~ /(^|[[:space:]])loadusr([[:space:]]|$)/) { + next + } + sub(/^.*(^|[[:space:]])loadusr[[:space:]]+/, "", line) + while (line ~ /^-[^[:space:]]+[[:space:]]+/) { + sub(/^-[^[:space:]]+[[:space:]]+/, "", line) + } + sub(/[[:space:]].*$/, "", line) + if (line != "") { + print line + } + } + ' "$file" +} + resolved_config_path= resolve_config_path() { local config_dir=$1 @@ -382,6 +415,49 @@ asset_source_for_path() { resolved_asset_source=$resolved_linuxcnc_path } +resolved_loadusr_asset_source= +loadusr_asset_source_for_command() { + local config=$1 + local command=$2 + resolved_loadusr_asset_source= + [[ -n "$command" ]] || return 1 + + if [[ "$command" == */* || "$command" == *.py ]]; then + if asset_source_for_path "$config" "$command"; then + resolved_loadusr_asset_source=$resolved_asset_source + return 0 + fi + if [[ "$command" != *.py ]] && asset_source_for_path "$config" "$command.py"; then + resolved_loadusr_asset_source=$resolved_asset_source + return 0 + fi + return 1 + fi + + local source="src/hal/user_comps/vismach/$command.py" + if [[ -f "$linuxcnc_root/$source" ]]; then + resolved_loadusr_asset_source=$source + return 0 + fi + if asset_source_for_path "$config" "$command.py"; then + resolved_loadusr_asset_source=$resolved_asset_source + return 0 + fi + return 1 +} + +record_loadusr_asset() { + local config_path=$1 + local config=$2 + local command=$3 + local label=$4 + if loadusr_asset_source_for_command "$config" "$command"; then + loadusr_asset_source=$resolved_loadusr_asset_source + record_asset_source "$config_path" "$loadusr_asset_source" "$label" + record_python_import_assets "$config_path" "$loadusr_asset_source" + fi +} + resolved_python_module_source= python_module_source_for_name() { local config=$1 @@ -813,7 +889,7 @@ while IFS=: read -r group path _note; do python_paths= python_toplevels= python_remaps= - halcmd_loadusr_pys= + halcmd_loadusrs= remap_ngc_428= remap_ngc_429= remap_ngc_430= @@ -852,8 +928,8 @@ while IFS=: read -r group path _note; do python_remap) python_remaps+="${python_remaps:+$'\n'}$ini_value" ;; - halcmd_loadusr_py) - halcmd_loadusr_pys+="${halcmd_loadusr_pys:+$'\n'}$ini_value" + halcmd_loadusr) + halcmd_loadusrs+="${halcmd_loadusrs:+$'\n'}$ini_value" ;; remap_428) [[ -n "$remap_ngc_428" ]] || remap_ngc_428=$ini_value @@ -948,6 +1024,10 @@ while IFS=: read -r group path _note; do record_config_source "$path" "$hal_source" "HALFILE" add_alias "$hal_source" "$m428" "$m429" "$m430" add_halfile_source_cases "$hal_source" "$m428" "$m429" "$m430" + while IFS= read -r loadusr_command; do + [[ -n "$loadusr_command" ]] || continue + record_loadusr_asset "$path" "$linuxcnc_root/$hal_source" "$loadusr_command" "HALFILE loadusr" + done < <(read_loadusr_commands "$linuxcnc_root/$hal_source") fi add_halfile_cases "$halfile" "$m428" "$m429" "$m430" add_halfile_aliases "$halfile" "$m428" "$m429" "$m430" @@ -958,6 +1038,10 @@ while IFS=: read -r group path _note; do record_config_source "$path" "$hal_source" "POSTGUI_HALFILE" add_alias "$hal_source" "$m428" "$m429" "$m430" add_postgui_halfile_source_cases "$hal_source" "$m428" "$m429" "$m430" + while IFS= read -r loadusr_command; do + [[ -n "$loadusr_command" ]] || continue + record_loadusr_asset "$path" "$linuxcnc_root/$hal_source" "$loadusr_command" "POSTGUI_HALFILE loadusr" + done < <(read_loadusr_commands "$linuxcnc_root/$hal_source") fi add_postgui_halfile_cases "$halfile" "$m428" "$m429" "$m430" add_halfile_aliases "$halfile" "$m428" "$m429" "$m430" @@ -997,14 +1081,10 @@ while IFS=: read -r group path _note; do record_python_import_assets "$path" "$python_remap_source" fi done <<<"$python_remaps" - while IFS= read -r loadusr_py; do - [[ -n "$loadusr_py" ]] || continue - if asset_source_for_path "$config" "$loadusr_py"; then - halcmd_loadusr_source=$resolved_asset_source - record_asset_source "$path" "$halcmd_loadusr_source" "HALCMD loadusr" - record_python_import_assets "$path" "$halcmd_loadusr_source" - fi - done <<<"$halcmd_loadusr_pys" + while IFS= read -r loadusr_command; do + [[ -n "$loadusr_command" ]] || continue + record_loadusr_asset "$path" "$config" "$loadusr_command" "HALCMD loadusr" + done <<<"$halcmd_loadusrs" for remap_source in "$remap_source_428" "$remap_source_429" "$remap_source_430"; do if [[ -n "$remap_source" ]]; then