第 6 组:源码链接、构建和文档约束闭环完成
This commit is contained in:
@@ -5,15 +5,49 @@ cd "$(dirname "$0")"
|
||||
|
||||
linuxcnc_root=${LINUXCNC_ROOT:-../linuxcnc}
|
||||
mode=table
|
||||
if [[ "${1:-}" == "--config-cases" ]]; then
|
||||
mode=config-cases
|
||||
shift
|
||||
elif [[ "${1:-}" == "--json-cases" ]]; then
|
||||
mode=json-cases
|
||||
shift
|
||||
fi
|
||||
all_output_dir=
|
||||
|
||||
usage() {
|
||||
echo "usage: $0 [--config-cases|--json-cases|--all-output-dir DIR] [manifest]" >&2
|
||||
}
|
||||
|
||||
case "${1:-}" in
|
||||
--config-cases)
|
||||
mode=config-cases
|
||||
shift
|
||||
;;
|
||||
--json-cases)
|
||||
mode=json-cases
|
||||
shift
|
||||
;;
|
||||
--all-output-dir)
|
||||
mode=all
|
||||
if [[ -z "${2:-}" || "${2:-}" == --* ]]; then
|
||||
usage
|
||||
echo "missing output directory for --all-output-dir" >&2
|
||||
exit 1
|
||||
fi
|
||||
all_output_dir=$2
|
||||
shift 2
|
||||
;;
|
||||
--help|-h)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
--*)
|
||||
usage
|
||||
echo "unknown switchkins remap table generator option: $1" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
manifest=${1:-linuxcnc-kinematics-source-files.txt}
|
||||
|
||||
if [[ -n "${2:-}" ]]; then
|
||||
usage
|
||||
echo "too many switchkins remap table generator arguments" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -d "$linuxcnc_root" ]]; then
|
||||
echo "missing LinuxCNC root: $linuxcnc_root" >&2
|
||||
exit 1
|
||||
@@ -22,34 +56,58 @@ if [[ ! -f "$manifest" ]]; then
|
||||
echo "missing kinematics manifest: $manifest" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ "$mode" == all && -z "$all_output_dir" ]]; then
|
||||
echo "missing output directory for --all-output-dir" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
linuxcnc_root=$(cd "$linuxcnc_root" && pwd)
|
||||
|
||||
normalize_alias() {
|
||||
tr '[:upper:]' '[:lower:]' | tr -d '[:space:]'
|
||||
}
|
||||
|
||||
trim_value() {
|
||||
sed 's/[[:space:]]*[#;].*$//; s/^[[:space:]]*//; s/[[:space:]]*$//'
|
||||
}
|
||||
|
||||
ini_value() {
|
||||
read_ini_switchkins_config() {
|
||||
local file=$1
|
||||
local key=$2
|
||||
sed -n "s/^[[:space:]]*$key[[:space:]]*=[[:space:]]*//Ip" "$file" | head -n 1 | trim_value
|
||||
}
|
||||
awk '
|
||||
function trim(value) {
|
||||
sub(/^[[:space:]]*/, "", value)
|
||||
sub(/[[:space:]]*$/, "", value)
|
||||
return value
|
||||
}
|
||||
{
|
||||
line = $0
|
||||
sub(/[[:space:]]*[#;].*$/, "", line)
|
||||
line = trim(line)
|
||||
if (line !~ /=/) {
|
||||
next
|
||||
}
|
||||
key = line
|
||||
sub(/[[:space:]]*=.*/, "", key)
|
||||
key = tolower(trim(key))
|
||||
value = line
|
||||
sub(/^[^=]*=[[:space:]]*/, "", value)
|
||||
value = trim(value)
|
||||
|
||||
ini_values() {
|
||||
local file=$1
|
||||
local key=$2
|
||||
sed -n "s/^[[:space:]]*$key[[:space:]]*=[[:space:]]*//Ip" "$file" | trim_value
|
||||
}
|
||||
|
||||
remap_ngc_name() {
|
||||
local file=$1
|
||||
local mcode=$2
|
||||
sed -n "s/.*REMAP[[:space:]]*=[[:space:]]*M$mcode[[:space:]][^#;]*ngc[[:space:]]*=[[:space:]]*\\([^[:space:]#;]*\\).*/\\1/Ip" "$file" |
|
||||
head -n 1
|
||||
if (key == "machine") {
|
||||
print "machine\t" value
|
||||
} else if (key == "kinematics") {
|
||||
print "kinematics\t" value
|
||||
} else if (key == "halfile") {
|
||||
print "halfile\t" value
|
||||
} else if (key == "postgui_halfile") {
|
||||
print "postgui_halfile\t" value
|
||||
} else if (key == "subroutine_path") {
|
||||
print "subroutine_path\t" value
|
||||
} else if (key == "remap") {
|
||||
lower = tolower(value)
|
||||
for (mcode = 428; mcode <= 430; mcode++) {
|
||||
if (lower ~ "m" mcode "([^0-9]|$)" &&
|
||||
match(lower, /ngc[[:space:]]*=[[:space:]]*[^[:space:]]+/)) {
|
||||
ngc = substr(value, RSTART, RLENGTH)
|
||||
sub(/^[Nn][Gg][Cc][[:space:]]*=[[:space:]]*/, "", ngc)
|
||||
print "remap_" mcode "\t" ngc
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
' "$file"
|
||||
}
|
||||
|
||||
resolve_config_path() {
|
||||
@@ -64,26 +122,92 @@ resolve_config_path() {
|
||||
|
||||
relative_linuxcnc_path() {
|
||||
local path=$1
|
||||
path=$(cd "$(dirname "$path")" && pwd)/$(basename "$path")
|
||||
path=$(cd "${path%/*}" && pwd)/${path##*/}
|
||||
if [[ "$path" != "$linuxcnc_root/"* ]]; then
|
||||
echo "resolved LinuxCNC source path escapes LinuxCNC root: $path" >&2
|
||||
exit 1
|
||||
fi
|
||||
printf '%s\n' "${path#"$linuxcnc_root/"}"
|
||||
}
|
||||
|
||||
remap_source_for_mcode() {
|
||||
local config=$1
|
||||
local mcode=$2
|
||||
local ngc_name
|
||||
ngc_name=$(remap_ngc_name "$config" "$mcode")
|
||||
if [[ -z "$ngc_name" ]]; then
|
||||
return 1
|
||||
declare -A config_dir_cache=()
|
||||
declare -A manifest_config_sources=()
|
||||
declare -A used_config_sources=()
|
||||
declare -A manifest_remap_sources=()
|
||||
declare -A used_remap_sources=()
|
||||
manifest_config_count=0
|
||||
manifest_remap_count=0
|
||||
|
||||
validate_manifest_source_path() {
|
||||
local group=$1
|
||||
local path=$2
|
||||
if [[ -z "$path" ]]; then
|
||||
echo "empty LinuxCNC $group source path in $manifest" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ "$path" = /* || "$path" == *..* ]]; then
|
||||
echo "LinuxCNC $group source path must stay under LinuxCNC root: $path" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ ! -f "$linuxcnc_root/$path" ]]; then
|
||||
echo "missing LinuxCNC $group source listed in $manifest: $path" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
while IFS=: read -r manifest_group manifest_path _manifest_note; do
|
||||
case "$manifest_group" in
|
||||
config)
|
||||
validate_manifest_source_path "$manifest_group" "$manifest_path"
|
||||
if [[ -n "${manifest_config_sources[$manifest_path]:-}" ]]; then
|
||||
echo "duplicate LinuxCNC config source in $manifest: $manifest_path" >&2
|
||||
exit 1
|
||||
fi
|
||||
manifest_config_sources[$manifest_path]=1
|
||||
manifest_config_count=$((manifest_config_count + 1))
|
||||
;;
|
||||
remap)
|
||||
validate_manifest_source_path "$manifest_group" "$manifest_path"
|
||||
if [[ "$manifest_path" != *.ngc ]]; then
|
||||
echo "LinuxCNC remap source must be an ngc file in $manifest: $manifest_path" >&2
|
||||
exit 1
|
||||
fi
|
||||
case "${manifest_path##*/}" in
|
||||
428remap.ngc|429remap.ngc|430remap.ngc)
|
||||
;;
|
||||
*)
|
||||
echo "LinuxCNC switchkins remap source must be 428/429/430remap.ngc in $manifest: $manifest_path" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
if [[ -n "${manifest_remap_sources[$manifest_path]:-}" ]]; then
|
||||
echo "duplicate LinuxCNC remap source in $manifest: $manifest_path" >&2
|
||||
exit 1
|
||||
fi
|
||||
manifest_remap_sources[$manifest_path]=1
|
||||
manifest_remap_count=$((manifest_remap_count + 1))
|
||||
;;
|
||||
esac
|
||||
done <"$manifest"
|
||||
|
||||
config_dir_for() {
|
||||
local config=$1
|
||||
if [[ -z "${config_dir_cache[$config]:-}" ]]; then
|
||||
config_dir_cache[$config]=$(cd "${config%/*}" && pwd)
|
||||
fi
|
||||
printf '%s\n' "${config_dir_cache[$config]}"
|
||||
}
|
||||
|
||||
remap_source_for_ngc() {
|
||||
local config=$1
|
||||
local ngc_name=$2
|
||||
local subroutine_paths=${3:-}
|
||||
if [[ "$ngc_name" != *.ngc ]]; then
|
||||
ngc_name="$ngc_name.ngc"
|
||||
fi
|
||||
|
||||
local config_dir
|
||||
config_dir=$(cd "$(dirname "$config")" && pwd)
|
||||
local subroutine_paths
|
||||
subroutine_paths=$(ini_values "$config" "SUBROUTINE_PATH")
|
||||
config_dir=$(config_dir_for "$config")
|
||||
if [[ -z "$subroutine_paths" ]]; then
|
||||
subroutine_paths="."
|
||||
fi
|
||||
@@ -107,41 +231,114 @@ remap_source_for_mcode() {
|
||||
return 1
|
||||
}
|
||||
|
||||
kinstype_for_mcode() {
|
||||
config_source_for_halfile() {
|
||||
local config=$1
|
||||
local mcode=$2
|
||||
local halfile=$2
|
||||
[[ -n "$halfile" ]] || return 1
|
||||
[[ "$halfile" == LIB:* ]] && return 1
|
||||
|
||||
local hal_path=${halfile%%[[:space:]]*}
|
||||
[[ -n "$hal_path" ]] || return 1
|
||||
|
||||
local config_dir
|
||||
config_dir=$(config_dir_for "$config")
|
||||
local resolved
|
||||
resolved=$(resolve_config_path "$config_dir" "$hal_path")
|
||||
if [[ ! -f "$resolved" ]]; then
|
||||
echo "missing LinuxCNC HAL source referenced by ${config#"$linuxcnc_root/"}: $halfile" >&2
|
||||
exit 1
|
||||
fi
|
||||
relative_linuxcnc_path "$resolved"
|
||||
}
|
||||
|
||||
kinstype_for_remap_source() {
|
||||
local source
|
||||
if ! source=$(remap_source_for_mcode "$config" "$mcode"); then
|
||||
printf '%s\n' "-1"
|
||||
source=$1
|
||||
if [[ -z "$source" ]]; then
|
||||
printf '%s\n' -1
|
||||
return 0
|
||||
fi
|
||||
sed -n 's/^[[:space:]]*#<kinstype>[[:space:]]*=[[:space:]]*\([0-9][0-9]*\).*/\1/p' \
|
||||
"$linuxcnc_root/$source" |
|
||||
head -n 1
|
||||
awk '
|
||||
/^[[:space:]]*#<kinstype>[[:space:]]*=/ {
|
||||
value = $0
|
||||
sub(/^[[:space:]]*#<kinstype>[[:space:]]*=[[:space:]]*/, "", value)
|
||||
sub(/[^0-9].*$/, "", value)
|
||||
print value
|
||||
exit
|
||||
}
|
||||
' "$linuxcnc_root/$source"
|
||||
}
|
||||
|
||||
json_compact_string() {
|
||||
local value=$1
|
||||
printf '%s' "$value" | normalize_alias | sed 's/\\/\\\\/g; s/"/\\"/g'
|
||||
require_remap_source() {
|
||||
local config_path=$1
|
||||
local mcode=$2
|
||||
local ngc_name=$3
|
||||
local source=$4
|
||||
if [[ -z "$source" ]]; then
|
||||
echo "missing LinuxCNC M$mcode remap source for $config_path: ngc=$ngc_name" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
cpp_string() {
|
||||
local value=$1
|
||||
printf '%s' "$value" | sed 's/\\/\\\\/g; s/"/\\"/g'
|
||||
require_kinstype() {
|
||||
local config_path=$1
|
||||
local mcode=$2
|
||||
local source=$3
|
||||
local kinstype=$4
|
||||
if [[ -z "$kinstype" || "$kinstype" == -1 ]]; then
|
||||
echo "missing #<kinstype> assignment for LinuxCNC M$mcode remap source: $source ($config_path)" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
record_remap_source() {
|
||||
local config_path=$1
|
||||
local mcode=$2
|
||||
local source=$3
|
||||
if [[ -z "${manifest_remap_sources[$source]:-}" ]]; then
|
||||
echo "LinuxCNC M$mcode remap source is not listed in $manifest: $source ($config_path)" >&2
|
||||
exit 1
|
||||
fi
|
||||
used_remap_sources[$source]=1
|
||||
}
|
||||
|
||||
record_config_source() {
|
||||
local config_path=$1
|
||||
local source=$2
|
||||
local label=$3
|
||||
if [[ -z "${manifest_config_sources[$source]:-}" ]]; then
|
||||
echo "LinuxCNC $label source is not listed in $manifest: $source ($config_path)" >&2
|
||||
exit 1
|
||||
fi
|
||||
used_config_sources[$source]=1
|
||||
}
|
||||
|
||||
declare -A seen_aliases=()
|
||||
declare -A seen_cases=()
|
||||
declare -A seen_case_values=()
|
||||
entries=()
|
||||
case_entries=()
|
||||
json_case_entries=()
|
||||
processed_config_count=0
|
||||
resolved_remap_count=0
|
||||
unique_config_source_count=0
|
||||
unique_resolved_remap_count=0
|
||||
|
||||
escape_generated_string() {
|
||||
local value=$1
|
||||
value=${value//\\/\\\\}
|
||||
value=${value//\"/\\\"}
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
add_alias() {
|
||||
local alias=$1
|
||||
local m428=$2
|
||||
local m429=$3
|
||||
local m430=$4
|
||||
alias=$(json_compact_string "$alias")
|
||||
alias=${alias,,}
|
||||
alias=${alias//[[:space:]]/}
|
||||
alias=$(escape_generated_string "$alias")
|
||||
[[ -n "$alias" ]] || return 0
|
||||
|
||||
local types="$m428,$m429,$m430"
|
||||
@@ -166,18 +363,80 @@ add_case() {
|
||||
[[ -n "$value" ]] || return 0
|
||||
|
||||
local types="$m428,$m429,$m430"
|
||||
local value_key="$field|$value"
|
||||
if [[ -n "${seen_case_values[$value_key]:-}" && "${seen_case_values[$value_key]}" != "$types" ]]; then
|
||||
echo "ambiguous switchkins config case '$field=$value': ${seen_case_values[$value_key]} and $types" >&2
|
||||
exit 1
|
||||
fi
|
||||
seen_case_values[$value_key]=$types
|
||||
|
||||
local key="$field|$value|$types"
|
||||
[[ -z "${seen_cases[$key]:-}" ]] || return 0
|
||||
|
||||
seen_cases[$key]=1
|
||||
local cpp_field
|
||||
local cpp_value
|
||||
cpp_field=$(cpp_string "$field")
|
||||
cpp_value=$(cpp_string "$value")
|
||||
local cpp_field=$field
|
||||
local cpp_value=$value
|
||||
cpp_field=$(escape_generated_string "$cpp_field")
|
||||
cpp_value=$(escape_generated_string "$cpp_value")
|
||||
case_entries+=(" {\"$cpp_field\", \"$cpp_value\", $m428, $m429, $m430},")
|
||||
json_case_entries+=("{\"field\":\"$cpp_field\",\"value\":\"$cpp_value\",\"m428\":$m428,\"m429\":$m429,\"m430\":$m430}")
|
||||
}
|
||||
|
||||
trim_machine_label() {
|
||||
local machine=$1
|
||||
machine=${machine%%(*}
|
||||
machine="${machine#"${machine%%[![:space:]]*}"}"
|
||||
machine="${machine%"${machine##*[![:space:]]}"}"
|
||||
printf '%s\n' "$machine"
|
||||
}
|
||||
|
||||
add_kinematics_variants() {
|
||||
local callback=$1
|
||||
local field=$2
|
||||
local kinematics=$3
|
||||
local m428=$4
|
||||
local m429=$5
|
||||
local m430=$6
|
||||
|
||||
[[ -n "$kinematics" ]] || return 0
|
||||
"$callback" "$field" "$kinematics" "$m428" "$m429" "$m430"
|
||||
|
||||
local first_word=${kinematics%%[[:space:]]*}
|
||||
"$callback" "$field" "$first_word" "$m428" "$m429" "$m430"
|
||||
"$callback" "$field" "${first_word%_kins}" "$m428" "$m429" "$m430"
|
||||
"$callback" "$field" "${first_word%-kins}" "$m428" "$m429" "$m430"
|
||||
local first_word_hyphen=${first_word//_/-}
|
||||
local first_word_without_underscore_kins=${first_word%_kins}
|
||||
local first_word_without_dash_kins=${first_word%-kins}
|
||||
"$callback" "$field" "$first_word_hyphen" "$m428" "$m429" "$m430"
|
||||
"$callback" "$field" "${first_word_without_underscore_kins//_/-}" "$m428" "$m429" "$m430"
|
||||
"$callback" "$field" "${first_word_without_dash_kins//_/-}" "$m428" "$m429" "$m430"
|
||||
}
|
||||
|
||||
add_alias_variant() {
|
||||
local _field=$1
|
||||
shift
|
||||
add_alias "$@"
|
||||
}
|
||||
|
||||
add_case_variant() {
|
||||
add_case "$@"
|
||||
}
|
||||
|
||||
add_halfile_case_fields() {
|
||||
local field=$1
|
||||
local halfile=$2
|
||||
local m428=$3
|
||||
local m429=$4
|
||||
local m430=$5
|
||||
|
||||
local hal_base=${halfile##*/}
|
||||
local hal_stem=${hal_base%.hal}
|
||||
add_case "$field" "$halfile" "$m428" "$m429" "$m430"
|
||||
add_case "$field" "$hal_base" "$m428" "$m429" "$m430"
|
||||
add_case "$field" "$hal_stem" "$m428" "$m429" "$m430"
|
||||
}
|
||||
|
||||
add_machine_aliases() {
|
||||
local machine=$1
|
||||
local m428=$2
|
||||
@@ -185,7 +444,9 @@ add_machine_aliases() {
|
||||
local m430=$4
|
||||
[[ -n "$machine" ]] || return 0
|
||||
add_alias "$machine" "$m428" "$m429" "$m430"
|
||||
add_alias "${machine%%(*}" "$m428" "$m429" "$m430"
|
||||
local trimmed_machine
|
||||
trimmed_machine=$(trim_machine_label "$machine")
|
||||
add_alias "$trimmed_machine" "$m428" "$m429" "$m430"
|
||||
}
|
||||
|
||||
add_kinematics_aliases() {
|
||||
@@ -194,15 +455,31 @@ add_kinematics_aliases() {
|
||||
local m429=$3
|
||||
local m430=$4
|
||||
[[ -n "$kinematics" ]] || return 0
|
||||
add_alias "$kinematics" "$m428" "$m429" "$m430"
|
||||
add_kinematics_variants add_alias_variant "" "$kinematics" "$m428" "$m429" "$m430"
|
||||
}
|
||||
|
||||
local first_word=${kinematics%%[[:space:]]*}
|
||||
add_alias "$first_word" "$m428" "$m429" "$m430"
|
||||
add_alias "${first_word%_kins}" "$m428" "$m429" "$m430"
|
||||
add_alias "${first_word%-kins}" "$m428" "$m429" "$m430"
|
||||
add_alias "$(printf '%s' "$first_word" | tr '_' '-')" "$m428" "$m429" "$m430"
|
||||
add_alias "$(printf '%s' "${first_word%_kins}" | tr '_' '-')" "$m428" "$m429" "$m430"
|
||||
add_alias "$(printf '%s' "${first_word%-kins}" | tr '_' '-')" "$m428" "$m429" "$m430"
|
||||
add_switchkins_cases() {
|
||||
local config_dir=$1
|
||||
local config_stem=$2
|
||||
local machine=$3
|
||||
local kinematics=$4
|
||||
local m428=$5
|
||||
local m429=$6
|
||||
local m430=$7
|
||||
|
||||
add_case "switchkins" "${config_dir##*/}" "$m428" "$m429" "$m430"
|
||||
add_case "switchkins" "$config_stem" "$m428" "$m429" "$m430"
|
||||
|
||||
if [[ -n "$machine" ]]; then
|
||||
add_case "switchkins" "$machine" "$m428" "$m429" "$m430"
|
||||
local trimmed_machine
|
||||
trimmed_machine=$(trim_machine_label "$machine")
|
||||
add_case "switchkins" "$trimmed_machine" "$m428" "$m429" "$m430"
|
||||
fi
|
||||
|
||||
if [[ -n "$kinematics" ]]; then
|
||||
add_kinematics_variants add_case_variant "switchkins" "$kinematics" "$m428" "$m429" "$m430"
|
||||
fi
|
||||
}
|
||||
|
||||
add_halfile_aliases() {
|
||||
@@ -226,14 +503,24 @@ add_halfile_cases() {
|
||||
[[ -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"
|
||||
add_halfile_case_fields "halFile" "$halfile" "$m428" "$m429" "$m430"
|
||||
add_halfile_case_fields "halfile" "$halfile" "$m428" "$m429" "$m430"
|
||||
add_halfile_case_fields "hal_file" "$halfile" "$m428" "$m429" "$m430"
|
||||
add_halfile_case_fields "HALFILE" "$halfile" "$m428" "$m429" "$m430"
|
||||
}
|
||||
|
||||
add_postgui_halfile_cases() {
|
||||
local halfile=$1
|
||||
local m428=$2
|
||||
local m429=$3
|
||||
local m430=$4
|
||||
[[ -n "$halfile" ]] || return 0
|
||||
[[ "$halfile" == LIB:* ]] && return 0
|
||||
|
||||
add_halfile_case_fields "postguiHalFile" "$halfile" "$m428" "$m429" "$m430"
|
||||
add_halfile_case_fields "postgui_halfile" "$halfile" "$m428" "$m429" "$m430"
|
||||
add_halfile_case_fields "postgui_hal_file" "$halfile" "$m428" "$m429" "$m430"
|
||||
add_halfile_case_fields "POSTGUI_HALFILE" "$halfile" "$m428" "$m429" "$m430"
|
||||
}
|
||||
|
||||
while IFS=: read -r group path _note; do
|
||||
@@ -248,23 +535,96 @@ while IFS=: read -r group path _note; do
|
||||
continue
|
||||
fi
|
||||
|
||||
m428=$(kinstype_for_mcode "$config" 428)
|
||||
m429=$(kinstype_for_mcode "$config" 429)
|
||||
m430=$(kinstype_for_mcode "$config" 430)
|
||||
machine=
|
||||
kinematics=
|
||||
halfiles=
|
||||
postgui_halfiles=
|
||||
subroutine_paths=
|
||||
remap_ngc_428=
|
||||
remap_ngc_429=
|
||||
remap_ngc_430=
|
||||
while IFS=$'\t' read -r ini_key ini_value; do
|
||||
case "$ini_key" in
|
||||
machine)
|
||||
[[ -n "$machine" ]] || machine=$ini_value
|
||||
;;
|
||||
kinematics)
|
||||
[[ -n "$kinematics" ]] || kinematics=$ini_value
|
||||
;;
|
||||
halfile)
|
||||
halfiles+="${halfiles:+$'\n'}$ini_value"
|
||||
;;
|
||||
postgui_halfile)
|
||||
postgui_halfiles+="${postgui_halfiles:+$'\n'}$ini_value"
|
||||
;;
|
||||
subroutine_path)
|
||||
subroutine_paths+="${subroutine_paths:+$'\n'}$ini_value"
|
||||
;;
|
||||
remap_428)
|
||||
[[ -n "$remap_ngc_428" ]] || remap_ngc_428=$ini_value
|
||||
;;
|
||||
remap_429)
|
||||
[[ -n "$remap_ngc_429" ]] || remap_ngc_429=$ini_value
|
||||
;;
|
||||
remap_430)
|
||||
[[ -n "$remap_ngc_430" ]] || remap_ngc_430=$ini_value
|
||||
;;
|
||||
esac
|
||||
done < <(read_ini_switchkins_config "$config")
|
||||
if [[ -z "$subroutine_paths" ]]; then
|
||||
subroutine_paths="."
|
||||
fi
|
||||
|
||||
remap_source_428=
|
||||
remap_source_429=
|
||||
remap_source_430=
|
||||
if [[ -n "$remap_ngc_428" ]]; then
|
||||
remap_source_428=$(remap_source_for_ngc "$config" "$remap_ngc_428" "$subroutine_paths" || true)
|
||||
require_remap_source "$path" 428 "$remap_ngc_428" "$remap_source_428"
|
||||
record_remap_source "$path" 428 "$remap_source_428"
|
||||
resolved_remap_count=$((resolved_remap_count + 1))
|
||||
fi
|
||||
if [[ -n "$remap_ngc_429" ]]; then
|
||||
remap_source_429=$(remap_source_for_ngc "$config" "$remap_ngc_429" "$subroutine_paths" || true)
|
||||
require_remap_source "$path" 429 "$remap_ngc_429" "$remap_source_429"
|
||||
record_remap_source "$path" 429 "$remap_source_429"
|
||||
resolved_remap_count=$((resolved_remap_count + 1))
|
||||
fi
|
||||
if [[ -n "$remap_ngc_430" ]]; then
|
||||
remap_source_430=$(remap_source_for_ngc "$config" "$remap_ngc_430" "$subroutine_paths" || true)
|
||||
require_remap_source "$path" 430 "$remap_ngc_430" "$remap_source_430"
|
||||
record_remap_source "$path" 430 "$remap_source_430"
|
||||
resolved_remap_count=$((resolved_remap_count + 1))
|
||||
fi
|
||||
|
||||
m428=$(kinstype_for_remap_source "$remap_source_428")
|
||||
m429=$(kinstype_for_remap_source "$remap_source_429")
|
||||
m430=$(kinstype_for_remap_source "$remap_source_430")
|
||||
[[ -z "$remap_ngc_428" ]] || require_kinstype "$path" 428 "$remap_source_428" "$m428"
|
||||
[[ -z "$remap_ngc_429" ]] || require_kinstype "$path" 429 "$remap_source_429" "$m429"
|
||||
[[ -z "$remap_ngc_430" ]] || require_kinstype "$path" 430 "$remap_source_430" "$m430"
|
||||
[[ -n "$m428" ]] || m428=-1
|
||||
[[ -n "$m429" ]] || m429=-1
|
||||
[[ -n "$m430" ]] || m430=-1
|
||||
processed_config_count=$((processed_config_count + 1))
|
||||
record_config_source "$path" "$path" "INI config"
|
||||
|
||||
machine=$(ini_value "$config" "MACHINE")
|
||||
kinematics=$(ini_value "$config" "KINEMATICS")
|
||||
halfiles=$(ini_values "$config" "HALFILE")
|
||||
config_dir=${path%/*}
|
||||
config_base=${path##*/}
|
||||
config_stem=${config_base%.ini}
|
||||
|
||||
add_case "config" "$path" "$m428" "$m429" "$m430"
|
||||
add_case "configPath" "$path" "$m428" "$m429" "$m430"
|
||||
add_case "config_path" "$path" "$m428" "$m429" "$m430"
|
||||
add_case "ini" "$path" "$m428" "$m429" "$m430"
|
||||
add_case "iniFile" "$path" "$m428" "$m429" "$m430"
|
||||
add_case "iniFileName" "$path" "$m428" "$m429" "$m430"
|
||||
add_case "ini_file" "$path" "$m428" "$m429" "$m430"
|
||||
add_case "ini_file_name" "$path" "$m428" "$m429" "$m430"
|
||||
add_case "INI_FILE_NAME" "$path" "$m428" "$m429" "$m430"
|
||||
add_case "machine" "$machine" "$m428" "$m429" "$m430"
|
||||
add_case "kinematics" "$kinematics" "$m428" "$m429" "$m430"
|
||||
add_switchkins_cases "$config_dir" "$config_stem" "$machine" "$kinematics" "$m428" "$m429" "$m430"
|
||||
|
||||
add_alias "$path" "$m428" "$m429" "$m430"
|
||||
add_alias "$config_dir" "$m428" "$m429" "$m430"
|
||||
@@ -273,39 +633,119 @@ 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
|
||||
if hal_source=$(config_source_for_halfile "$config" "$halfile"); then
|
||||
record_config_source "$path" "$hal_source" "HALFILE"
|
||||
fi
|
||||
add_halfile_cases "$halfile" "$m428" "$m429" "$m430"
|
||||
add_halfile_aliases "$halfile" "$m428" "$m429" "$m430"
|
||||
done <<<"$halfiles"
|
||||
while IFS= read -r halfile; do
|
||||
if hal_source=$(config_source_for_halfile "$config" "$halfile"); then
|
||||
record_config_source "$path" "$hal_source" "POSTGUI_HALFILE"
|
||||
fi
|
||||
add_postgui_halfile_cases "$halfile" "$m428" "$m429" "$m430"
|
||||
add_halfile_aliases "$halfile" "$m428" "$m429" "$m430"
|
||||
done <<<"$postgui_halfiles"
|
||||
|
||||
for mcode in 428 429 430; do
|
||||
if remap_source=$(remap_source_for_mcode "$config" "$mcode"); then
|
||||
for remap_source in "$remap_source_428" "$remap_source_429" "$remap_source_430"; do
|
||||
if [[ -n "$remap_source" ]]; then
|
||||
remap_dir=${remap_source%/*}
|
||||
add_alias "$remap_dir" "$m428" "$m429" "$m430"
|
||||
add_alias "${remap_dir%/*}" "$m428" "$m429" "$m430"
|
||||
add_alias "${remap_dir%/remap_subs}" "$m428" "$m429" "$m430"
|
||||
remap_parent=${remap_dir%/remap_subs}
|
||||
add_alias "${remap_parent##*/}" "$m428" "$m429" "$m430"
|
||||
add_case "remap" "$remap_parent" "$m428" "$m429" "$m430"
|
||||
add_case "remap" "${remap_parent##*/}" "$m428" "$m429" "$m430"
|
||||
fi
|
||||
done
|
||||
done <"$manifest"
|
||||
|
||||
if [[ "$mode" == table ]]; then
|
||||
unique_config_source_count=${#used_config_sources[@]}
|
||||
unique_resolved_remap_count=${#used_remap_sources[@]}
|
||||
|
||||
validate_generated_content() {
|
||||
if ((manifest_config_count == 0)); then
|
||||
echo "no LinuxCNC config sources listed in manifest: $manifest" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ((manifest_remap_count == 0)); then
|
||||
echo "no LinuxCNC remap sources listed in manifest: $manifest" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ((processed_config_count == 0)); then
|
||||
echo "no LinuxCNC switchkins remap configs found in manifest: $manifest" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ((resolved_remap_count == 0)); then
|
||||
echo "no LinuxCNC M428/M429/M430 remap sources resolved from manifest: $manifest" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ((unique_resolved_remap_count == 0)); then
|
||||
echo "no unique LinuxCNC M428/M429/M430 remap sources resolved from manifest: $manifest" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ((unique_config_source_count == 0)); then
|
||||
echo "no unique LinuxCNC config sources used from manifest: $manifest" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ((unique_config_source_count != manifest_config_count)); then
|
||||
echo "LinuxCNC config manifest coverage mismatch: used $unique_config_source_count of $manifest_config_count config sources" >&2
|
||||
local config_source
|
||||
for config_source in "${!manifest_config_sources[@]}"; do
|
||||
if [[ -z "${used_config_sources[$config_source]:-}" ]]; then
|
||||
echo "unused LinuxCNC config manifest source: $config_source" >&2
|
||||
fi
|
||||
done
|
||||
exit 1
|
||||
fi
|
||||
if ((unique_resolved_remap_count != manifest_remap_count)); then
|
||||
echo "LinuxCNC remap manifest coverage mismatch: resolved $unique_resolved_remap_count of $manifest_remap_count remap sources" >&2
|
||||
local remap_source
|
||||
for remap_source in "${!manifest_remap_sources[@]}"; do
|
||||
if [[ -z "${used_remap_sources[$remap_source]:-}" ]]; then
|
||||
echo "unused LinuxCNC remap manifest source: $remap_source" >&2
|
||||
fi
|
||||
done
|
||||
exit 1
|
||||
fi
|
||||
if ((${#entries[@]} == 0)); then
|
||||
echo "empty generated switchkins remap alias table" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ((${#case_entries[@]} == 0)); then
|
||||
echo "empty generated switchkins remap config cases" >&2
|
||||
exit 1
|
||||
fi
|
||||
if ((${#case_entries[@]} != ${#json_case_entries[@]})); then
|
||||
echo "generated C++/JSON switchkins config case count mismatch: ${#case_entries[@]} != ${#json_case_entries[@]}" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
validate_generated_content
|
||||
|
||||
write_table() {
|
||||
cat <<'EOF'
|
||||
// Generated by ./generate-linuxcnc-switchkins-remap-table.sh.
|
||||
// Source: LinuxCNC INI MACHINE/KINEMATICS/HALFILE/SUBROUTINE_PATH/REMAP entries and
|
||||
// Source: LinuxCNC INI MACHINE/KINEMATICS/HALFILE/POSTGUI_HALFILE/SUBROUTINE_PATH/REMAP entries and
|
||||
// adjacent remap_subs/{428,429,430}remap.ngc #<kinstype> assignments.
|
||||
EOF
|
||||
|
||||
printf '%s\n' "${entries[@]}"
|
||||
elif [[ "$mode" == config-cases ]]; then
|
||||
}
|
||||
|
||||
write_config_cases() {
|
||||
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.
|
||||
// Source: LinuxCNC INI config path, MACHINE, KINEMATICS, non-LIB HALFILE/POSTGUI_HALFILE,
|
||||
// and adjacent remap_subs entries for M428/M429/M430 #<kinstype> assignments.
|
||||
EOF
|
||||
|
||||
printf '%s\n' "${case_entries[@]}"
|
||||
elif [[ "$mode" == json-cases ]]; then
|
||||
}
|
||||
|
||||
write_json_cases() {
|
||||
printf '[\n'
|
||||
for i in "${!json_case_entries[@]}"; do
|
||||
suffix=,
|
||||
@@ -315,6 +755,34 @@ elif [[ "$mode" == json-cases ]]; then
|
||||
printf ' %s%s\n' "${json_case_entries[$i]}" "$suffix"
|
||||
done
|
||||
printf ']\n'
|
||||
}
|
||||
|
||||
write_generated_file() {
|
||||
local path=$1
|
||||
local label=$2
|
||||
local writer=$3
|
||||
if [[ -e "$path" && ! -f "$path" ]]; then
|
||||
echo "cannot write generated $label: $path is not a file" >&2
|
||||
exit 1
|
||||
fi
|
||||
"$writer" >"$path"
|
||||
}
|
||||
|
||||
if [[ "$mode" == table ]]; then
|
||||
write_table
|
||||
elif [[ "$mode" == config-cases ]]; then
|
||||
write_config_cases
|
||||
elif [[ "$mode" == json-cases ]]; then
|
||||
write_json_cases
|
||||
elif [[ "$mode" == all ]]; then
|
||||
if [[ -e "$all_output_dir" && ! -d "$all_output_dir" ]]; then
|
||||
echo "switchkins remap output path is not a directory: $all_output_dir" >&2
|
||||
exit 1
|
||||
fi
|
||||
mkdir -p "$all_output_dir"
|
||||
write_generated_file "$all_output_dir/linuxcnc_switchkins_remap_table.inc" "table" write_table
|
||||
write_generated_file "$all_output_dir/linuxcnc_switchkins_remap_config_cases.inc" "config cases" write_config_cases
|
||||
write_generated_file "$all_output_dir/linuxcnc_switchkins_remap_config_cases.json" "JSON config cases" write_json_cases
|
||||
else
|
||||
echo "unknown switchkins remap table generator mode: $mode" >&2
|
||||
exit 1
|
||||
|
||||
Reference in New Issue
Block a user