diff --git a/check-linuxcnc-switchkins-remap-table.sh b/check-linuxcnc-switchkins-remap-table.sh index a7b1e09..34db967 100755 --- a/check-linuxcnc-switchkins-remap-table.sh +++ b/check-linuxcnc-switchkins-remap-table.sh @@ -191,8 +191,6 @@ validate_manifest_config_remaps "$manifest" validate_generator_cli_contract() { local manifest_file=$1 - local cli_dir - cli_dir=$(mktemp -d "${TMPDIR:-/tmp}/linuxcnc_switchkins_remap_cli.XXXXXX") LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --help >/dev/null 2>&1 if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --unknown "$manifest_file" >/dev/null 2>&1; then @@ -207,18 +205,188 @@ validate_generator_cli_contract() { echo "switchkins remap generator accepted too many arguments" >&2 exit 1 fi - LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --all-output-dir "$cli_dir/out" "$manifest_file" + + ( + local cli_dir + local cli_manifest + local cli_manifest_with_config_ngc + local cli_manifest_with_duplicate_ini + local cli_manifest_with_duplicate_remap + local cli_manifest_with_unused_hal + local cli_manifest_with_unused_postgui + local cli_manifest_with_unused_remap + local cli_manifest_without_ini + local cli_manifest_without_hal + local cli_manifest_without_postgui + local cli_manifest_without_remap + cli_dir=$(mktemp -d "${TMPDIR:-/tmp}/linuxcnc_switchkins_remap_cli.XXXXXX") + trap 'rm -rf "$cli_dir"' EXIT + cli_manifest="$cli_dir/bridgemill-manifest.txt" + cli_manifest_with_config_ngc="$cli_dir/bridgemill-manifest-with-config-ngc.txt" + cli_manifest_with_duplicate_ini="$cli_dir/bridgemill-manifest-with-duplicate-ini.txt" + cli_manifest_with_duplicate_remap="$cli_dir/bridgemill-manifest-with-duplicate-remap.txt" + cli_manifest_with_unused_hal="$cli_dir/bridgemill-manifest-with-unused-hal.txt" + 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_without_ini="$cli_dir/bridgemill-manifest-without-ini.txt" + cli_manifest_without_hal="$cli_dir/bridgemill-manifest-without-hal.txt" + cli_manifest_without_postgui="$cli_dir/bridgemill-manifest-without-postgui.txt" + cli_manifest_without_remap="$cli_dir/bridgemill-manifest-without-remap.txt" + + 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/5axis/bridgemill/5axis.ini") + require("config:configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal") + require("config:configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal") + require("remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc") + require("remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc") + require("remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc") + } + { + key = $1 ":" $2 + if (key in expected_keys) { + if (key in manifest_line) { + print "duplicate switchkins remap generator CLI contract 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 "switchkins remap generator CLI contract source is not listed in " manifest ": " key > "/dev/stderr" + missing = 1 + continue + } + print manifest_line[key] + } + exit missing || duplicate + } + ' "$manifest_file" >"$cli_manifest"; then + exit 1 + fi + + cp "$cli_manifest" "$cli_manifest_with_config_ngc" + grep -F \ + 'remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc:' \ + "$cli_manifest" | sed 's/^remap:/config:/' >>"$cli_manifest_with_config_ngc" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_with_config_ngc" >/dev/null 2>&1; then + echo "switchkins remap generator accepted LinuxCNC remap source listed as config" >&2 + exit 1 + fi + cp "$cli_manifest" "$cli_manifest_with_duplicate_ini" + grep -F \ + 'config:configs/sim/axis/vismach/5axis/bridgemill/5axis.ini:' \ + "$cli_manifest" >>"$cli_manifest_with_duplicate_ini" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_with_duplicate_ini" >/dev/null 2>&1; then + echo "switchkins remap generator accepted duplicate LinuxCNC INI config source" >&2 + exit 1 + fi + cp "$cli_manifest" "$cli_manifest_with_duplicate_remap" + grep -F \ + 'remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc:' \ + "$cli_manifest" >>"$cli_manifest_with_duplicate_remap" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_with_duplicate_remap" >/dev/null 2>&1; then + echo "switchkins remap generator accepted duplicate LinuxCNC M428 remap source" >&2 + exit 1 + fi + grep -Fv \ + 'config:configs/sim/axis/vismach/5axis/bridgemill/5axis.ini:' \ + "$cli_manifest" >"$cli_manifest_without_ini" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_without_ini" >/dev/null 2>&1; then + echo "switchkins remap generator accepted manifest missing LinuxCNC INI config source" >&2 + exit 1 + fi + grep -Fv \ + 'config:configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal:' \ + "$cli_manifest" >"$cli_manifest_without_hal" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_without_hal" >/dev/null 2>&1; then + echo "switchkins remap generator accepted manifest missing LinuxCNC HALFILE source" >&2 + exit 1 + fi + grep -Fv \ + 'config:configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal:' \ + "$cli_manifest" >"$cli_manifest_without_postgui" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_without_postgui" >/dev/null 2>&1; then + echo "switchkins remap generator accepted manifest missing LinuxCNC POSTGUI_HALFILE source" >&2 + exit 1 + fi + grep -Fv \ + 'remap:configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc:' \ + "$cli_manifest" >"$cli_manifest_without_remap" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_without_remap" >/dev/null 2>&1; then + echo "switchkins remap generator accepted manifest missing LinuxCNC M430 remap 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:' \ + "$manifest_file" >>"$cli_manifest_with_unused_hal" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_with_unused_hal" >/dev/null 2>&1; then + echo "switchkins remap generator accepted unused LinuxCNC HALFILE source" >&2 + exit 1 + fi + cp "$cli_manifest" "$cli_manifest_with_unused_postgui" + grep -F \ + 'config:configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal:' \ + "$manifest_file" >>"$cli_manifest_with_unused_postgui" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_with_unused_postgui" >/dev/null 2>&1; then + echo "switchkins remap generator accepted unused LinuxCNC POSTGUI_HALFILE source" >&2 + exit 1 + fi + cp "$cli_manifest" "$cli_manifest_with_unused_remap" + grep -F \ + 'remap:configs/sim/axis/vismach/melfa-sim/remap_subs/428remap.ngc:' \ + "$manifest_file" >>"$cli_manifest_with_unused_remap" + if LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh \ + "$cli_manifest_with_unused_remap" >/dev/null 2>&1; then + echo "switchkins remap generator accepted unused LinuxCNC M428 remap source" >&2 + exit 1 + fi + + LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --all-output-dir "$cli_dir/out" "$cli_manifest" + LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh "$cli_manifest" \ + >"$cli_dir/linuxcnc_switchkins_remap_table.stdout.inc" + LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --config-cases "$cli_manifest" \ + >"$cli_dir/linuxcnc_switchkins_remap_config_cases.stdout.inc" + LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --json-cases "$cli_manifest" \ + >"$cli_dir/linuxcnc_switchkins_remap_config_cases.stdout.json" for generated_file in \ - linuxcnc_switchkins_remap_table.inc \ - linuxcnc_switchkins_remap_config_cases.inc \ - linuxcnc_switchkins_remap_config_cases.json + out/linuxcnc_switchkins_remap_table.inc \ + out/linuxcnc_switchkins_remap_config_cases.inc \ + out/linuxcnc_switchkins_remap_config_cases.json \ + linuxcnc_switchkins_remap_table.stdout.inc \ + linuxcnc_switchkins_remap_config_cases.stdout.inc \ + linuxcnc_switchkins_remap_config_cases.stdout.json do - if [[ ! -s "$cli_dir/out/$generated_file" ]]; then - echo "switchkins remap generator --all-output-dir did not write $generated_file" >&2 + if [[ ! -s "$cli_dir/$generated_file" ]]; then + echo "switchkins remap generator CLI contract did not write $generated_file" >&2 exit 1 fi done - rm -rf "$cli_dir" + diff -u "$cli_dir/out/linuxcnc_switchkins_remap_table.inc" \ + "$cli_dir/linuxcnc_switchkins_remap_table.stdout.inc" + diff -u "$cli_dir/out/linuxcnc_switchkins_remap_config_cases.inc" \ + "$cli_dir/linuxcnc_switchkins_remap_config_cases.stdout.inc" + diff -u "$cli_dir/out/linuxcnc_switchkins_remap_config_cases.json" \ + "$cli_dir/linuxcnc_switchkins_remap_config_cases.stdout.json" + ) } validate_generator_cli_contract "$manifest" @@ -226,12 +394,6 @@ generated_dir=$(mktemp -d "${TMPDIR:-/tmp}/linuxcnc_switchkins_remap.XXXXXX") trap 'rm -rf "$generated_dir"' EXIT LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --all-output-dir "$generated_dir" "$manifest" -LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh "$manifest" \ - >"$generated_dir/linuxcnc_switchkins_remap_table.stdout.inc" -LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --config-cases "$manifest" \ - >"$generated_dir/linuxcnc_switchkins_remap_config_cases.stdout.inc" -LINUXCNC_ROOT="$linuxcnc_root" ./generate-linuxcnc-switchkins-remap-table.sh --json-cases "$manifest" \ - >"$generated_dir/linuxcnc_switchkins_remap_config_cases.stdout.json" validate_json() { local file=$1 @@ -325,34 +487,6 @@ JS fi } -count_cpp_config_cases() { - local file=$1 - grep -Ec '^[[:space:]]*\{"[^"]+", "[^"]+", -?[0-9]+, -?[0-9]+, -?[0-9]+\},?$' "$file" -} - -count_table_rows() { - local file=$1 - grep -Ec '^[[:space:]]*\{"[^"]+", -?[0-9]+, -?[0-9]+, -?[0-9]+\},?$' "$file" -} - -count_json_cases() { - local file=$1 - if command -v python3 >/dev/null 2>&1; then - python3 - "$file" <<'PY' -import json -import sys - -with open(sys.argv[1], encoding="utf-8") as handle: - print(len(json.load(handle))) -PY - elif command -v node >/dev/null 2>&1; then - node -e 'console.log(JSON.parse(require("fs").readFileSync(process.argv[1], "utf8")).length)' "$file" - else - echo "missing python3 or node for switchkins remap JSON counting" >&2 - exit 1 - fi -} - validate_generated_header() { local file=$1 local label=$2 @@ -363,6 +497,19 @@ validate_generated_header() { fi } +validate_generated_source_notes() { + local file=$1 + local label=$2 + shift 2 + local expected + for expected in "$@"; do + if ! grep -Fxq "$expected" "$file"; then + echo "missing generated switchkins remap $label source note in $file: $expected" >&2 + exit 1 + fi + done +} + validate_cpp_table() { local file=$1 local label=$2 @@ -741,10 +888,16 @@ def load_cases(path): ] cases = load_cases(cpp_file) + load_cases(json_file) +covered = set() for index, entry in enumerate(cases): field = entry["field"] if field.lower() not in allowed: raise SystemExit(f"{label} case {index} uses unsupported switchkins field {field!r}") + covered.add(field.lower()) + +missing = sorted(allowed - covered) +if missing: + raise SystemExit(f"{label} cases do not cover switchkins API alias field(s): {missing}") PY then exit 1 @@ -759,6 +912,7 @@ if (allowed.size === 0) { } const rowRe = /^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*("(?:(?:\\.)|[^"\\])*"),\s*(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$/; const cases = []; +const covered = new Set(); for (const [path, isJson] of [[cppFile, false], [jsonFile, true]]) { if (isJson) { for (const entry of JSON.parse(fs.readFileSync(path, "utf8"))) { @@ -784,7 +938,12 @@ cases.forEach((entry, index) => { if (!allowed.has(entry.field.toLowerCase())) { throw new Error(`${label} case ${index} uses unsupported switchkins field ${JSON.stringify(entry.field)}`); } + covered.add(entry.field.toLowerCase()); }); +const missing = [...allowed].filter((key) => !covered.has(key)).sort(); +if (missing.length > 0) { + throw new Error(`${label} cases do not cover switchkins API alias field(s): ${missing.join(",")}`); +} JS then exit 1 @@ -923,6 +1082,1170 @@ JS fi } +validate_manifest_remap_paths_in_outputs() { + local manifest_file=$1 + local table_file=$2 + local cpp_file=$3 + local json_file=$4 + local label=$5 + if command -v python3 >/dev/null 2>&1; then + if ! python3 - "$linuxcnc_root" "$manifest_file" "$table_file" "$cpp_file" "$json_file" "$label" <<'PY' +import json +import os +import re +import sys + +linuxcnc_root, manifest_file, table_file, cpp_file, json_file, label = sys.argv[1:] +linuxcnc_root = os.path.abspath(linuxcnc_root) +manifest_remaps = [] +manifest_inis = [] +remap_assignment_re = re.compile(r'^\s*#\s*=\s*(-?\d+)\b') +with open(manifest_file, encoding="utf-8") as handle: + for line in handle: + parts = line.rstrip("\n").split(":", 2) + if len(parts) >= 2 and parts[0] == "remap": + manifest_remaps.append(parts[1]) + if len(parts) >= 2 and parts[0] == "config" and parts[1].endswith(".ini"): + manifest_inis.append(parts[1]) + +if not manifest_remaps: + raise SystemExit(f"{manifest_file} has no LinuxCNC remap sources") + +resolved_ini_remaps = set() +remap_line_re = re.compile(r'\bM(428|429|430)\b.*\bngc\s*=\s*([^\s]+)', re.I) +for source_path in manifest_inis: + ini_path = os.path.join(linuxcnc_root, source_path) + with open(ini_path, encoding="utf-8") as handle: + section = "" + subroutine_paths = [] + remap_ngc_names = [] + for raw_line in handle: + line = re.sub(r'[;#].*$', '', raw_line).strip() + if not line: + continue + if line.startswith("[") and line.endswith("]"): + section = line[1:-1].strip().lower() + continue + if section != "rs274ngc" or "=" not in line: + continue + key, value = line.split("=", 1) + key = key.strip().lower() + value = value.strip() + if key == "subroutine_path": + subroutine_paths.append(value) + elif key == "remap": + match = remap_line_re.search(value) + if match: + ngc_name = match.group(2) + if not ngc_name.endswith(".ngc"): + ngc_name = f"{ngc_name}.ngc" + remap_ngc_names.append(ngc_name) + if not remap_ngc_names: + continue + if not subroutine_paths: + subroutine_paths = ["."] + config_dir = os.path.dirname(ini_path) + for ngc_name in remap_ngc_names: + resolved_source = None + for subroutine_path in subroutine_paths: + for path_part in subroutine_path.split(":"): + if not path_part: + continue + candidate_dir = path_part if os.path.isabs(path_part) else os.path.join(config_dir, path_part) + candidate = os.path.join(candidate_dir, ngc_name) + if os.path.isfile(candidate): + resolved_abs = os.path.abspath(candidate) + rel = os.path.relpath(resolved_abs, linuxcnc_root) + if rel.startswith("..") or os.path.isabs(rel): + raise SystemExit(f"LinuxCNC remap source escapes LinuxCNC root: {resolved_abs}") + resolved_source = rel + break + if resolved_source: + break + if not resolved_source: + raise SystemExit(f"{label} could not resolve LinuxCNC REMAP ngc source {ngc_name} from {source_path}") + resolved_ini_remaps.add(resolved_source) + +manifest_remap_set = set(manifest_remaps) +missing_ini_remaps = sorted(resolved_ini_remaps - manifest_remap_set) +unused_manifest_remaps = sorted(manifest_remap_set - resolved_ini_remaps) +if missing_ini_remaps: + raise SystemExit(f"{label} manifest is missing LinuxCNC INI-resolved remap source(s): {missing_ini_remaps}") +if unused_manifest_remaps: + raise SystemExit(f"{label} manifest remap source(s) are not resolved from LinuxCNC INI REMAP/SUBROUTINE_PATH entries: {unused_manifest_remaps}") + +remap_group_types = {} +for path in manifest_remaps: + basename = os.path.basename(path) + mcode = int(basename[:3]) + with open(os.path.join(linuxcnc_root, path), encoding="utf-8") as handle: + kinstypes = [ + int(match.group(1)) + for match in map(remap_assignment_re.match, handle) + if match + ] + if len(kinstypes) != 1: + raise SystemExit(f"expected exactly one # assignment in {path}, found {len(kinstypes)}") + remap_group_types.setdefault(os.path.dirname(path), {})[mcode] = kinstypes[0] + +expected_types = { + path: ( + remap_group_types[os.path.dirname(path)].get(428, -1), + remap_group_types[os.path.dirname(path)].get(429, -1), + remap_group_types[os.path.dirname(path)].get(430, -1), + ) + for path in manifest_remaps +} + +table_row_re = re.compile( + r'^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*' + r'(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$' +) +aliases = {} +with open(table_file, encoding="utf-8") as handle: + for line in handle: + match = table_row_re.match(line) + if match: + aliases[json.loads(match.group(1))] = ( + int(match.group(2)), + int(match.group(3)), + int(match.group(4)), + ) + +case_row_re = re.compile( + r'^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*' + r'("(?:(?:\\.)|[^"\\])*"),\s*' + r'(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$' +) +case_remaps = {} +required_subroutine_case_fields = { + "SUBROUTINE_PATH", + "subroutinePath", + "subroutinepath", + "subroutine_path", +} +case_subroutine_paths = { + field: {} + for field in required_subroutine_case_fields +} +with open(cpp_file, encoding="utf-8") as handle: + for line in handle: + match = case_row_re.match(line) + if not match: + continue + raw_field = json.loads(match.group(1)) + field = raw_field.lower() + value = json.loads(match.group(2)) + types = (int(match.group(3)), int(match.group(4)), int(match.group(5))) + if field == "remap": + case_remaps[value] = types + if raw_field in required_subroutine_case_fields: + case_subroutine_paths[raw_field][value] = types +with open(json_file, encoding="utf-8") as handle: + for entry in json.load(handle): + raw_field = entry["field"] + field = raw_field.lower() + types = (entry["m428"], entry["m429"], entry["m430"]) + if field == "remap": + case_remaps[entry["value"]] = types + if raw_field in required_subroutine_case_fields: + case_subroutine_paths[raw_field][entry["value"]] = types + +missing_aliases = [path for path in manifest_remaps if path not in aliases] +missing_cases = [path for path in manifest_remaps if path not in case_remaps] +if missing_aliases: + raise SystemExit(f"{label} table is missing LinuxCNC remap source alias(es): {missing_aliases}") +if missing_cases: + raise SystemExit(f"{label} cases are missing LinuxCNC remap source path(s): {missing_cases}") +expected_subroutine_types = { + os.path.dirname(path): expected_types[path] + for path in manifest_remaps +} +missing_subroutine_cases = [ + (field, path) + for field in sorted(required_subroutine_case_fields) + for path in expected_subroutine_types + if path not in case_subroutine_paths[field] +] +if missing_subroutine_cases: + raise SystemExit( + f"{label} cases are missing LinuxCNC SUBROUTINE_PATH remap dir(s): {missing_subroutine_cases}" + ) +wrong_alias_types = [ + (path, expected_types[path], aliases[path]) + for path in manifest_remaps + if path in aliases and aliases[path] != expected_types[path] +] +wrong_case_types = [ + (path, expected_types[path], case_remaps[path]) + for path in manifest_remaps + if path in case_remaps and case_remaps[path] != expected_types[path] +] +wrong_subroutine_types = [ + (field, path, expected_subroutine_types[path], case_subroutine_paths[field][path]) + for field in sorted(required_subroutine_case_fields) + for path in expected_subroutine_types + if path in case_subroutine_paths[field] and case_subroutine_paths[field][path] != expected_subroutine_types[path] +] +if wrong_alias_types: + raise SystemExit(f"{label} table has LinuxCNC remap source kinstype mismatch(es): {wrong_alias_types}") +if wrong_case_types: + raise SystemExit(f"{label} cases have LinuxCNC remap source kinstype mismatch(es): {wrong_case_types}") +if wrong_subroutine_types: + raise SystemExit(f"{label} cases have LinuxCNC SUBROUTINE_PATH kinstype mismatch(es): {wrong_subroutine_types}") +PY + then + exit 1 + fi + elif command -v node >/dev/null 2>&1; then + if ! node - "$linuxcnc_root" "$manifest_file" "$table_file" "$cpp_file" "$json_file" "$label" <<'JS' +const fs = require("fs"); +const path = require("path"); +const [linuxcncRoot, manifestFile, tableFile, cppFile, jsonFile, label] = process.argv.slice(2); +const manifestRemaps = fs.readFileSync(manifestFile, "utf8") + .split(/\r?\n/) + .map((line) => line.split(":", 3)) + .filter((parts) => parts.length >= 2 && parts[0] === "remap") + .map((parts) => parts[1]); +const manifestInis = fs.readFileSync(manifestFile, "utf8") + .split(/\r?\n/) + .map((line) => line.split(":", 3)) + .filter((parts) => parts.length >= 2 && parts[0] === "config" && parts[1].endsWith(".ini")) + .map((parts) => parts[1]); +if (manifestRemaps.length === 0) { + throw new Error(`${manifestFile} has no LinuxCNC remap sources`); +} + +const linuxcncRootAbs = path.resolve(linuxcncRoot); +const resolvedIniRemaps = new Set(); +const remapLineRe = /\bM(428|429|430)\b.*\bngc\s*=\s*([^\s]+)/i; +for (const sourcePath of manifestInis) { + const iniPath = path.join(linuxcncRootAbs, sourcePath); + let section = ""; + const subroutinePaths = []; + const remapNgcNames = []; + for (const rawLine of fs.readFileSync(iniPath, "utf8").split(/\r?\n/)) { + const line = rawLine.replace(/[;#].*$/, "").trim(); + if (line.length === 0) { + continue; + } + if (line.startsWith("[") && line.endsWith("]")) { + section = line.slice(1, -1).trim().toLowerCase(); + continue; + } + if (section !== "rs274ngc" || !line.includes("=")) { + continue; + } + const equals = line.indexOf("="); + const key = line.slice(0, equals).trim().toLowerCase(); + const value = line.slice(equals + 1).trim(); + if (key === "subroutine_path") { + subroutinePaths.push(value); + } else if (key === "remap") { + const match = remapLineRe.exec(value); + if (match) { + const ngcName = match[2].endsWith(".ngc") ? match[2] : `${match[2]}.ngc`; + remapNgcNames.push(ngcName); + } + } + } + if (remapNgcNames.length === 0) { + continue; + } + if (subroutinePaths.length === 0) { + subroutinePaths.push("."); + } + const configDir = path.dirname(iniPath); + for (const ngcName of remapNgcNames) { + let resolvedSource = null; + for (const subroutinePath of subroutinePaths) { + for (const pathPart of subroutinePath.split(":")) { + if (!pathPart) { + continue; + } + const candidateDir = path.isAbsolute(pathPart) ? pathPart : path.join(configDir, pathPart); + const candidate = path.join(candidateDir, ngcName); + if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) { + const resolvedAbs = path.resolve(candidate); + const rel = path.relative(linuxcncRootAbs, resolvedAbs); + if (rel.startsWith("..") || path.isAbsolute(rel)) { + throw new Error(`LinuxCNC remap source escapes LinuxCNC root: ${resolvedAbs}`); + } + resolvedSource = rel; + break; + } + } + if (resolvedSource) { + break; + } + } + if (!resolvedSource) { + throw new Error(`${label} could not resolve LinuxCNC REMAP ngc source ${ngcName} from ${sourcePath}`); + } + resolvedIniRemaps.add(resolvedSource); + } +} +const manifestRemapSet = new Set(manifestRemaps); +const missingIniRemaps = [...resolvedIniRemaps].filter((sourcePath) => !manifestRemapSet.has(sourcePath)).sort(); +const unusedManifestRemaps = manifestRemaps.filter((sourcePath) => !resolvedIniRemaps.has(sourcePath)).sort(); +if (missingIniRemaps.length > 0) { + throw new Error(`${label} manifest is missing LinuxCNC INI-resolved remap source(s): ${missingIniRemaps.join(",")}`); +} +if (unusedManifestRemaps.length > 0) { + throw new Error(`${label} manifest remap source(s) are not resolved from LinuxCNC INI REMAP/SUBROUTINE_PATH entries: ${unusedManifestRemaps.join(",")}`); +} + +const remapAssignmentRe = /^\s*#\s*=\s*(-?\d+)\b/; +const remapGroupTypes = new Map(); +for (const sourcePath of manifestRemaps) { + const basename = path.basename(sourcePath); + const mcode = Number(basename.slice(0, 3)); + const kinstypes = fs.readFileSync(path.join(linuxcncRoot, sourcePath), "utf8") + .split(/\r?\n/) + .map((line) => remapAssignmentRe.exec(line)) + .filter(Boolean) + .map((match) => Number(match[1])); + if (kinstypes.length !== 1) { + throw new Error(`expected exactly one # assignment in ${sourcePath}, found ${kinstypes.length}`); + } + const dirname = path.dirname(sourcePath); + if (!remapGroupTypes.has(dirname)) { + remapGroupTypes.set(dirname, new Map()); + } + remapGroupTypes.get(dirname).set(mcode, kinstypes[0]); +} +const expectedTypes = new Map(); +for (const sourcePath of manifestRemaps) { + const typesByMcode = remapGroupTypes.get(path.dirname(sourcePath)); + expectedTypes.set(sourcePath, [ + typesByMcode.get(428) ?? -1, + typesByMcode.get(429) ?? -1, + typesByMcode.get(430) ?? -1, + ]); +} + +const tableRowRe = /^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$/; +const aliases = new Map(); +for (const line of fs.readFileSync(tableFile, "utf8").split(/\r?\n/)) { + const match = tableRowRe.exec(line); + if (match) { + aliases.set(JSON.parse(match[1]), [Number(match[2]), Number(match[3]), Number(match[4])]); + } +} + +const caseRowRe = /^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*("(?:(?:\\.)|[^"\\])*"),\s*(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$/; +const caseRemaps = new Map(); +const requiredSubroutineCaseFields = ["SUBROUTINE_PATH", "subroutinePath", "subroutinepath", "subroutine_path"]; +const caseSubroutinePaths = new Map(requiredSubroutineCaseFields.map((field) => [field, new Map()])); +for (const line of fs.readFileSync(cppFile, "utf8").split(/\r?\n/)) { + const match = caseRowRe.exec(line); + if (!match) { + continue; + } + const rawField = JSON.parse(match[1]); + const field = rawField.toLowerCase(); + const value = JSON.parse(match[2]); + const types = [Number(match[3]), Number(match[4]), Number(match[5])]; + if (field === "remap") { + caseRemaps.set(value, types); + } + if (caseSubroutinePaths.has(rawField)) { + caseSubroutinePaths.get(rawField).set(value, types); + } +} +for (const entry of JSON.parse(fs.readFileSync(jsonFile, "utf8"))) { + const rawField = entry.field; + const field = rawField.toLowerCase(); + const types = [entry.m428, entry.m429, entry.m430]; + if (field === "remap") { + caseRemaps.set(entry.value, types); + } + if (caseSubroutinePaths.has(rawField)) { + caseSubroutinePaths.get(rawField).set(entry.value, types); + } +} + +const missingAliases = manifestRemaps.filter((sourcePath) => !aliases.has(sourcePath)); +const missingCases = manifestRemaps.filter((sourcePath) => !caseRemaps.has(sourcePath)); +if (missingAliases.length > 0) { + throw new Error(`${label} table is missing LinuxCNC remap source alias(es): ${missingAliases.join(",")}`); +} +if (missingCases.length > 0) { + throw new Error(`${label} cases are missing LinuxCNC remap source path(s): ${missingCases.join(",")}`); +} +const expectedSubroutineTypes = new Map(); +for (const sourcePath of manifestRemaps) { + expectedSubroutineTypes.set(path.dirname(sourcePath), expectedTypes.get(sourcePath)); +} +const missingSubroutineCases = requiredSubroutineCaseFields.flatMap((field) => + [...expectedSubroutineTypes.keys()] + .filter((sourcePath) => !caseSubroutinePaths.get(field).has(sourcePath)) + .map((sourcePath) => `${field}:${sourcePath}`) +); +if (missingSubroutineCases.length > 0) { + throw new Error(`${label} cases are missing LinuxCNC SUBROUTINE_PATH remap dir(s): ${missingSubroutineCases.join(",")}`); +} +const wrongAliasTypes = manifestRemaps + .filter((sourcePath) => aliases.has(sourcePath)) + .filter((sourcePath) => JSON.stringify(aliases.get(sourcePath)) !== JSON.stringify(expectedTypes.get(sourcePath))) + .map((sourcePath) => `${sourcePath}: expected ${JSON.stringify(expectedTypes.get(sourcePath))}, got ${JSON.stringify(aliases.get(sourcePath))}`); +const wrongCaseTypes = manifestRemaps + .filter((sourcePath) => caseRemaps.has(sourcePath)) + .filter((sourcePath) => JSON.stringify(caseRemaps.get(sourcePath)) !== JSON.stringify(expectedTypes.get(sourcePath))) + .map((sourcePath) => `${sourcePath}: expected ${JSON.stringify(expectedTypes.get(sourcePath))}, got ${JSON.stringify(caseRemaps.get(sourcePath))}`); +const wrongSubroutineTypes = [...expectedSubroutineTypes.keys()] + .flatMap((sourcePath) => + requiredSubroutineCaseFields + .filter((field) => caseSubroutinePaths.get(field).has(sourcePath)) + .filter((field) => JSON.stringify(caseSubroutinePaths.get(field).get(sourcePath)) !== JSON.stringify(expectedSubroutineTypes.get(sourcePath))) + .map((field) => `${field}:${sourcePath}: expected ${JSON.stringify(expectedSubroutineTypes.get(sourcePath))}, got ${JSON.stringify(caseSubroutinePaths.get(field).get(sourcePath))}`) + ); +if (wrongAliasTypes.length > 0) { + throw new Error(`${label} table has LinuxCNC remap source kinstype mismatch(es): ${wrongAliasTypes.join("; ")}`); +} +if (wrongCaseTypes.length > 0) { + throw new Error(`${label} cases have LinuxCNC remap source kinstype mismatch(es): ${wrongCaseTypes.join("; ")}`); +} +if (wrongSubroutineTypes.length > 0) { + throw new Error(`${label} cases have LinuxCNC SUBROUTINE_PATH kinstype mismatch(es): ${wrongSubroutineTypes.join("; ")}`); +} +JS + then + exit 1 + fi + else + echo "missing python3 or node for switchkins remap manifest output validation" >&2 + exit 1 + fi +} + +validate_manifest_hal_paths_in_outputs() { + local manifest_file=$1 + local table_file=$2 + local cpp_file=$3 + local json_file=$4 + local label=$5 + if command -v python3 >/dev/null 2>&1; then + if ! python3 - "$linuxcnc_root" "$manifest_file" "$table_file" "$cpp_file" "$json_file" "$label" <<'PY' +import json +import os +import re +import sys + +linuxcnc_root, manifest_file, table_file, cpp_file, json_file, label = sys.argv[1:] +linuxcnc_root = os.path.abspath(linuxcnc_root) +manifest_hals = [] +manifest_inis = [] +with open(manifest_file, encoding="utf-8") as handle: + for line in handle: + parts = line.rstrip("\n").split(":", 2) + if len(parts) >= 2 and parts[0] == "config" and parts[1].endswith(".hal"): + manifest_hals.append(parts[1]) + if len(parts) >= 2 and parts[0] == "config" and parts[1].endswith(".ini"): + manifest_inis.append(parts[1]) + +if not manifest_hals: + raise SystemExit(f"{manifest_file} has no LinuxCNC HAL config sources") + +expected_hal_roles = {} +remap_re = re.compile(r'\bREMAP\s*=\s*M(428|429|430)(?:\D|$)', re.I) +hal_entry_re = re.compile(r'^([^=]+)=(.*)$') +for source_path in manifest_inis: + ini_path = os.path.join(linuxcnc_root, source_path) + with open(ini_path, encoding="utf-8") as handle: + ini_text = handle.read() + if not remap_re.search(ini_text): + continue + section = "" + for raw_line in ini_text.splitlines(): + line = re.sub(r'[;#].*$', '', raw_line).strip() + if not line: + continue + if line.startswith("[") and line.endswith("]"): + section = line[1:-1].strip().lower() + continue + if section != "hal": + continue + match = hal_entry_re.match(line) + if not match: + continue + key = match.group(1).strip().lower() + if key not in {"halfile", "postgui_halfile"}: + continue + value = match.group(2).strip() + if not value or value.startswith("LIB:"): + continue + resolved = value if os.path.isabs(value) else os.path.join(os.path.dirname(ini_path), value) + if not os.path.isfile(resolved): + continue + resolved_abs = os.path.abspath(resolved) + rel = os.path.relpath(resolved_abs, linuxcnc_root) + if rel.startswith("..") or os.path.isabs(rel): + raise SystemExit(f"LinuxCNC HAL source escapes LinuxCNC root: {resolved_abs}") + expected_hal_roles.setdefault(rel, set()).add("postgui" if key == "postgui_halfile" else "hal") + +unexpected_hals = [path for path in manifest_hals if path not in expected_hal_roles] +if unexpected_hals: + raise SystemExit(f"{label} manifest HAL source(s) are not referenced by LinuxCNC switchkins INI HALFILE/POSTGUI_HALFILE entries: {unexpected_hals}") + +table_row_re = re.compile( + r'^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*' + r'(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$' +) +aliases = {} +with open(table_file, encoding="utf-8") as handle: + for line in handle: + match = table_row_re.match(line) + if match: + aliases[json.loads(match.group(1))] = ( + int(match.group(2)), + int(match.group(3)), + int(match.group(4)), + ) + +case_sources = {} +hal_fields = { + "HALFILE", + "halFile", + "halfile", + "hal_file", +} +postgui_hal_fields = { + "POSTGUI_HALFILE", + "postguiHalFile", + "postguihalfile", + "postgui_hal_file", + "postgui_halfile", +} +hal_case_sources = { + field: {} + for field in hal_fields +} +postgui_hal_case_sources = { + field: {} + for field in postgui_hal_fields +} +case_row_re = re.compile( + r'^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*' + r'("(?:(?:\\.)|[^"\\])*"),\s*' + r'(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$' +) +with open(cpp_file, encoding="utf-8") as handle: + for line in handle: + match = case_row_re.match(line) + if not match: + continue + raw_field = json.loads(match.group(1)) + value = json.loads(match.group(2)) + types = ( + int(match.group(3)), + int(match.group(4)), + int(match.group(5)), + ) + if raw_field in hal_fields: + case_sources[value] = types + hal_case_sources[raw_field][value] = types + if raw_field in postgui_hal_fields: + case_sources[value] = types + postgui_hal_case_sources[raw_field][value] = types +with open(json_file, encoding="utf-8") as handle: + for entry in json.load(handle): + types = (entry["m428"], entry["m429"], entry["m430"]) + if entry["field"] in hal_fields: + case_sources[entry["value"]] = types + hal_case_sources[entry["field"]][entry["value"]] = types + if entry["field"] in postgui_hal_fields: + case_sources[entry["value"]] = types + postgui_hal_case_sources[entry["field"]][entry["value"]] = types + +missing_aliases = [path for path in manifest_hals if path not in aliases] +missing_cases = [path for path in manifest_hals if path not in case_sources] +missing_role_cases = [ + (field, path, role) + for path in manifest_hals + for role in sorted(expected_hal_roles[path]) + for field in sorted(postgui_hal_fields if role == "postgui" else hal_fields) + if path not in (postgui_hal_case_sources[field] if role == "postgui" else hal_case_sources[field]) +] +if missing_aliases: + raise SystemExit(f"{label} table is missing LinuxCNC HAL source alias(es): {missing_aliases}") +if missing_cases: + raise SystemExit(f"{label} cases are missing LinuxCNC HAL source path(s): {missing_cases}") +if missing_role_cases: + raise SystemExit(f"{label} cases are missing LinuxCNC HAL source path(s) in the matching HALFILE/POSTGUI_HALFILE field group: {missing_role_cases}") +wrong_types = [ + (path, aliases[path], case_sources[path]) + for path in manifest_hals + if path in aliases and path in case_sources and aliases[path] != case_sources[path] +] +wrong_role_types = [ + (field, path, role, aliases[path], (postgui_hal_case_sources[field] if role == "postgui" else hal_case_sources[field])[path]) + for path in manifest_hals + for role in sorted(expected_hal_roles[path]) + for field in sorted(postgui_hal_fields if role == "postgui" else hal_fields) + if path in aliases + and path in (postgui_hal_case_sources[field] if role == "postgui" else hal_case_sources[field]) + and aliases[path] != (postgui_hal_case_sources[field] if role == "postgui" else hal_case_sources[field])[path] +] +if wrong_types: + raise SystemExit(f"{label} HAL source kinstype mismatch(es): {wrong_types}") +if wrong_role_types: + raise SystemExit(f"{label} HAL source field kinstype mismatch(es): {wrong_role_types}") +PY + then + exit 1 + fi + elif command -v node >/dev/null 2>&1; then + if ! node - "$linuxcnc_root" "$manifest_file" "$table_file" "$cpp_file" "$json_file" "$label" <<'JS' +const fs = require("fs"); +const path = require("path"); +const [linuxcncRootArg, manifestFile, tableFile, cppFile, jsonFile, label] = process.argv.slice(2); +const linuxcncRoot = path.resolve(linuxcncRootArg); +const manifestHals = fs.readFileSync(manifestFile, "utf8") + .split(/\r?\n/) + .map((line) => line.split(":", 3)) + .filter((parts) => parts.length >= 2 && parts[0] === "config" && parts[1].endsWith(".hal")) + .map((parts) => parts[1]); +const manifestInis = fs.readFileSync(manifestFile, "utf8") + .split(/\r?\n/) + .map((line) => line.split(":", 3)) + .filter((parts) => parts.length >= 2 && parts[0] === "config" && parts[1].endsWith(".ini")) + .map((parts) => parts[1]); +if (manifestHals.length === 0) { + throw new Error(`${manifestFile} has no LinuxCNC HAL config sources`); +} + +const expectedHalRoles = new Map(); +const remapRe = /\bREMAP\s*=\s*M(428|429|430)(?:\D|$)/i; +for (const sourcePath of manifestInis) { + const iniPath = path.join(linuxcncRoot, sourcePath); + const iniText = fs.readFileSync(iniPath, "utf8"); + if (!remapRe.test(iniText)) { + continue; + } + let section = ""; + for (const rawLine of iniText.split(/\r?\n/)) { + const line = rawLine.replace(/[;#].*$/, "").trim(); + if (line.length === 0) { + continue; + } + if (line.startsWith("[") && line.endsWith("]")) { + section = line.slice(1, -1).trim().toLowerCase(); + continue; + } + if (section !== "hal" || !line.includes("=")) { + continue; + } + const equals = line.indexOf("="); + const key = line.slice(0, equals).trim().toLowerCase(); + if (key !== "halfile" && key !== "postgui_halfile") { + continue; + } + const value = line.slice(equals + 1).trim(); + if (!value || value.startsWith("LIB:")) { + continue; + } + const resolved = path.isAbsolute(value) ? value : path.join(path.dirname(iniPath), value); + if (!fs.existsSync(resolved) || !fs.statSync(resolved).isFile()) { + continue; + } + const resolvedAbs = path.resolve(resolved); + const rel = path.relative(linuxcncRoot, resolvedAbs); + if (rel.startsWith("..") || path.isAbsolute(rel)) { + throw new Error(`LinuxCNC HAL source escapes LinuxCNC root: ${resolvedAbs}`); + } + if (!expectedHalRoles.has(rel)) { + expectedHalRoles.set(rel, new Set()); + } + expectedHalRoles.get(rel).add(key === "postgui_halfile" ? "postgui" : "hal"); + } +} +const unexpectedHals = manifestHals.filter((sourcePath) => !expectedHalRoles.has(sourcePath)); +if (unexpectedHals.length > 0) { + throw new Error(`${label} manifest HAL source(s) are not referenced by LinuxCNC switchkins INI HALFILE/POSTGUI_HALFILE entries: ${unexpectedHals.join(",")}`); +} + +const tableRowRe = /^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$/; +const aliases = new Map(); +for (const line of fs.readFileSync(tableFile, "utf8").split(/\r?\n/)) { + const match = tableRowRe.exec(line); + if (match) { + aliases.set(JSON.parse(match[1]), [Number(match[2]), Number(match[3]), Number(match[4])]); + } +} + +const halFields = ["HALFILE", "halFile", "halfile", "hal_file"]; +const postguiHalFields = ["POSTGUI_HALFILE", "postguiHalFile", "postguihalfile", "postgui_hal_file", "postgui_halfile"]; +const caseRowRe = /^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*("(?:(?:\\.)|[^"\\])*"),\s*(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$/; +const caseSources = new Map(); +const halCaseSources = new Map(halFields.map((field) => [field, new Map()])); +const postguiHalCaseSources = new Map(postguiHalFields.map((field) => [field, new Map()])); +for (const line of fs.readFileSync(cppFile, "utf8").split(/\r?\n/)) { + const match = caseRowRe.exec(line); + if (!match) { + continue; + } + const rawField = JSON.parse(match[1]); + const value = JSON.parse(match[2]); + const types = [Number(match[3]), Number(match[4]), Number(match[5])]; + if (halCaseSources.has(rawField)) { + caseSources.set(value, types); + halCaseSources.get(rawField).set(value, types); + } + if (postguiHalCaseSources.has(rawField)) { + caseSources.set(value, types); + postguiHalCaseSources.get(rawField).set(value, types); + } +} +for (const entry of JSON.parse(fs.readFileSync(jsonFile, "utf8"))) { + const types = [entry.m428, entry.m429, entry.m430]; + if (halCaseSources.has(entry.field)) { + caseSources.set(entry.value, types); + halCaseSources.get(entry.field).set(entry.value, types); + } + if (postguiHalCaseSources.has(entry.field)) { + caseSources.set(entry.value, types); + postguiHalCaseSources.get(entry.field).set(entry.value, types); + } +} + +const missingAliases = manifestHals.filter((sourcePath) => !aliases.has(sourcePath)); +const missingCases = manifestHals.filter((sourcePath) => !caseSources.has(sourcePath)); +const missingRoleCases = manifestHals.flatMap((sourcePath) => + [...expectedHalRoles.get(sourcePath)].sort() + .flatMap((role) => + (role === "postgui" ? postguiHalFields : halFields) + .filter((field) => !(role === "postgui" ? postguiHalCaseSources : halCaseSources).get(field).has(sourcePath)) + .map((field) => `${field}:${sourcePath} ${role}`) + ) +); +if (missingAliases.length > 0) { + throw new Error(`${label} table is missing LinuxCNC HAL source alias(es): ${missingAliases.join(",")}`); +} +if (missingCases.length > 0) { + throw new Error(`${label} cases are missing LinuxCNC HAL source path(s): ${missingCases.join(",")}`); +} +if (missingRoleCases.length > 0) { + throw new Error(`${label} cases are missing LinuxCNC HAL source path(s) in the matching HALFILE/POSTGUI_HALFILE field group: ${missingRoleCases.join(",")}`); +} +const wrongTypes = manifestHals + .filter((sourcePath) => aliases.has(sourcePath) && caseSources.has(sourcePath)) + .filter((sourcePath) => JSON.stringify(aliases.get(sourcePath)) !== JSON.stringify(caseSources.get(sourcePath))) + .map((sourcePath) => `${sourcePath}: table ${JSON.stringify(aliases.get(sourcePath))}, case ${JSON.stringify(caseSources.get(sourcePath))}`); +const wrongRoleTypes = manifestHals.flatMap((sourcePath) => + [...expectedHalRoles.get(sourcePath)].sort() + .flatMap((role) => + (role === "postgui" ? postguiHalFields : halFields) + .filter((field) => aliases.has(sourcePath)) + .filter((field) => (role === "postgui" ? postguiHalCaseSources : halCaseSources).get(field).has(sourcePath)) + .filter((field) => JSON.stringify(aliases.get(sourcePath)) !== JSON.stringify((role === "postgui" ? postguiHalCaseSources : halCaseSources).get(field).get(sourcePath))) + .map((field) => `${field}:${sourcePath} ${role}: table ${JSON.stringify(aliases.get(sourcePath))}, case ${JSON.stringify((role === "postgui" ? postguiHalCaseSources : halCaseSources).get(field).get(sourcePath))}`) + ) +); +if (wrongTypes.length > 0) { + throw new Error(`${label} HAL source kinstype mismatch(es): ${wrongTypes.join("; ")}`); +} +if (wrongRoleTypes.length > 0) { + throw new Error(`${label} HAL source field kinstype mismatch(es): ${wrongRoleTypes.join("; ")}`); +} +JS + then + exit 1 + fi + else + echo "missing python3 or node for switchkins HAL manifest output validation" >&2 + exit 1 + fi +} + +validate_manifest_ini_paths_in_outputs() { + local manifest_file=$1 + local table_file=$2 + local cpp_file=$3 + local json_file=$4 + local label=$5 + if command -v python3 >/dev/null 2>&1; then + if ! python3 - "$manifest_file" "$table_file" "$cpp_file" "$json_file" "$label" <<'PY' +import json +import re +import sys + +manifest_file, table_file, cpp_file, json_file, label = sys.argv[1:] +manifest_inis = [] +with open(manifest_file, encoding="utf-8") as handle: + for line in handle: + parts = line.rstrip("\n").split(":", 2) + if len(parts) >= 2 and parts[0] == "config" and parts[1].endswith(".ini"): + manifest_inis.append(parts[1]) + +if not manifest_inis: + raise SystemExit(f"{manifest_file} has no LinuxCNC INI config sources") + +table_row_re = re.compile( + r'^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*' + r'(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$' +) +aliases = {} +with open(table_file, encoding="utf-8") as handle: + for line in handle: + match = table_row_re.match(line) + if match: + aliases[json.loads(match.group(1))] = ( + int(match.group(2)), + int(match.group(3)), + int(match.group(4)), + ) + +ini_fields = { + "INI_FILE_NAME", + "config", + "configPath", + "configpath", + "config_path", + "ini", + "iniFile", + "inifile", + "iniFileName", + "inifilename", + "ini_file", + "ini_file_name", +} +case_sources = { + field: {} + for field in ini_fields +} +case_row_re = re.compile( + r'^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*' + r'("(?:(?:\\.)|[^"\\])*"),\s*' + r'(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$' +) +with open(cpp_file, encoding="utf-8") as handle: + for line in handle: + match = case_row_re.match(line) + if not match: + continue + raw_field = json.loads(match.group(1)) + if raw_field in ini_fields: + case_sources[raw_field][json.loads(match.group(2))] = ( + int(match.group(3)), + int(match.group(4)), + int(match.group(5)), + ) +with open(json_file, encoding="utf-8") as handle: + for entry in json.load(handle): + if entry["field"] in ini_fields: + case_sources[entry["field"]][entry["value"]] = (entry["m428"], entry["m429"], entry["m430"]) + +missing_aliases = [path for path in manifest_inis if path not in aliases] +missing_cases = [ + (field, path) + for field in sorted(ini_fields) + for path in manifest_inis + if path not in case_sources[field] +] +if missing_aliases: + raise SystemExit(f"{label} table is missing LinuxCNC INI source alias(es): {missing_aliases}") +if missing_cases: + raise SystemExit(f"{label} cases are missing LinuxCNC INI source path(s): {missing_cases}") +wrong_types = [ + (field, path, aliases[path], case_sources[field][path]) + for field in sorted(ini_fields) + for path in manifest_inis + if path in aliases and path in case_sources[field] and aliases[path] != case_sources[field][path] +] +if wrong_types: + raise SystemExit(f"{label} INI source kinstype mismatch(es): {wrong_types}") +PY + then + exit 1 + fi + elif command -v node >/dev/null 2>&1; then + if ! node - "$manifest_file" "$table_file" "$cpp_file" "$json_file" "$label" <<'JS' +const fs = require("fs"); +const [manifestFile, tableFile, cppFile, jsonFile, label] = process.argv.slice(2); +const manifestInis = fs.readFileSync(manifestFile, "utf8") + .split(/\r?\n/) + .map((line) => line.split(":", 3)) + .filter((parts) => parts.length >= 2 && parts[0] === "config" && parts[1].endsWith(".ini")) + .map((parts) => parts[1]); +if (manifestInis.length === 0) { + throw new Error(`${manifestFile} has no LinuxCNC INI config sources`); +} + +const tableRowRe = /^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$/; +const aliases = new Map(); +for (const line of fs.readFileSync(tableFile, "utf8").split(/\r?\n/)) { + const match = tableRowRe.exec(line); + if (match) { + aliases.set(JSON.parse(match[1]), [Number(match[2]), Number(match[3]), Number(match[4])]); + } +} + +const iniFields = ["INI_FILE_NAME", "config", "configPath", "configpath", "config_path", "ini", "iniFile", "inifile", "iniFileName", "inifilename", "ini_file", "ini_file_name"]; +const caseRowRe = /^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*("(?:(?:\\.)|[^"\\])*"),\s*(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$/; +const caseSources = new Map(iniFields.map((field) => [field, new Map()])); +for (const line of fs.readFileSync(cppFile, "utf8").split(/\r?\n/)) { + const match = caseRowRe.exec(line); + if (!match) { + continue; + } + const rawField = JSON.parse(match[1]); + if (caseSources.has(rawField)) { + caseSources.get(rawField).set(JSON.parse(match[2]), [Number(match[3]), Number(match[4]), Number(match[5])]); + } +} +for (const entry of JSON.parse(fs.readFileSync(jsonFile, "utf8"))) { + if (caseSources.has(entry.field)) { + caseSources.get(entry.field).set(entry.value, [entry.m428, entry.m429, entry.m430]); + } +} + +const missingAliases = manifestInis.filter((sourcePath) => !aliases.has(sourcePath)); +const missingCases = iniFields.flatMap((field) => + manifestInis + .filter((sourcePath) => !caseSources.get(field).has(sourcePath)) + .map((sourcePath) => `${field}:${sourcePath}`) +); +if (missingAliases.length > 0) { + throw new Error(`${label} table is missing LinuxCNC INI source alias(es): ${missingAliases.join(",")}`); +} +if (missingCases.length > 0) { + throw new Error(`${label} cases are missing LinuxCNC INI source path(s): ${missingCases.join(",")}`); +} +const wrongTypes = iniFields.flatMap((field) => + manifestInis + .filter((sourcePath) => aliases.has(sourcePath) && caseSources.get(field).has(sourcePath)) + .filter((sourcePath) => JSON.stringify(aliases.get(sourcePath)) !== JSON.stringify(caseSources.get(field).get(sourcePath))) + .map((sourcePath) => `${field}:${sourcePath}: table ${JSON.stringify(aliases.get(sourcePath))}, case ${JSON.stringify(caseSources.get(field).get(sourcePath))}`) +); +if (wrongTypes.length > 0) { + throw new Error(`${label} INI source kinstype mismatch(es): ${wrongTypes.join("; ")}`); +} +JS + then + exit 1 + fi + else + echo "missing python3 or node for switchkins INI manifest output validation" >&2 + exit 1 + fi +} + +validate_manifest_ini_identity_in_outputs() { + local manifest_file=$1 + local table_file=$2 + local cpp_file=$3 + local json_file=$4 + local label=$5 + if command -v python3 >/dev/null 2>&1; then + if ! python3 - "$linuxcnc_root" "$manifest_file" "$table_file" "$cpp_file" "$json_file" "$label" <<'PY' +import json +import os +import re +import sys + +linuxcnc_root, manifest_file, table_file, cpp_file, json_file, label = sys.argv[1:] + +def normalize_alias(value): + return "".join(ch for ch in value.lower() if not ch.isspace()) + +def read_ini_identity(path): + values = {} + with open(os.path.join(linuxcnc_root, path), encoding="utf-8") as handle: + for line in handle: + line = re.sub(r'\s*[#;].*$', '', line).strip() + if "=" not in line: + continue + key, value = line.split("=", 1) + key = key.strip().lower() + value = value.strip() + if key in {"machine", "kinematics"} and value and key not in values: + values[key] = value + return values + +manifest_inis = [] +with open(manifest_file, encoding="utf-8") as handle: + for line in handle: + parts = line.rstrip("\n").split(":", 2) + if len(parts) >= 2 and parts[0] == "config" and parts[1].endswith(".ini"): + manifest_inis.append(parts[1]) +if not manifest_inis: + raise SystemExit(f"{manifest_file} has no LinuxCNC INI config sources") + +table_row_re = re.compile( + r'^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*' + r'(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$' +) +aliases = {} +with open(table_file, encoding="utf-8") as handle: + for line in handle: + match = table_row_re.match(line) + if match: + aliases[json.loads(match.group(1))] = ( + int(match.group(2)), + int(match.group(3)), + int(match.group(4)), + ) + +case_row_re = re.compile( + r'^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*' + r'("(?:(?:\\.)|[^"\\])*"),\s*' + r'(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$' +) +case_sources = {} +with open(cpp_file, encoding="utf-8") as handle: + for line in handle: + match = case_row_re.match(line) + if match: + case_sources[(json.loads(match.group(1)).lower(), json.loads(match.group(2)))] = ( + int(match.group(3)), + int(match.group(4)), + int(match.group(5)), + ) +with open(json_file, encoding="utf-8") as handle: + for entry in json.load(handle): + case_sources[(entry["field"].lower(), entry["value"])] = ( + entry["m428"], + entry["m429"], + entry["m430"], + ) + +missing_cases = [] +missing_aliases = [] +wrong_case_types = [] +wrong_alias_types = [] +for ini_path in manifest_inis: + if ini_path not in aliases: + continue + expected_types = aliases[ini_path] + for field, value in read_ini_identity(ini_path).items(): + case_key = (field, value) + alias = normalize_alias(value) + if case_key not in case_sources: + missing_cases.append((ini_path, field, value)) + elif case_sources[case_key] != expected_types: + wrong_case_types.append((ini_path, field, value, expected_types, case_sources[case_key])) + if alias not in aliases: + missing_aliases.append((ini_path, field, value, alias)) + elif aliases[alias] != expected_types: + wrong_alias_types.append((ini_path, field, value, expected_types, aliases[alias])) + +if missing_cases: + raise SystemExit(f"{label} cases are missing LinuxCNC INI MACHINE/KINEMATICS value(s): {missing_cases}") +if missing_aliases: + raise SystemExit(f"{label} table is missing LinuxCNC INI MACHINE/KINEMATICS alias(es): {missing_aliases}") +if wrong_case_types: + raise SystemExit(f"{label} cases have LinuxCNC INI MACHINE/KINEMATICS kinstype mismatch(es): {wrong_case_types}") +if wrong_alias_types: + raise SystemExit(f"{label} table has LinuxCNC INI MACHINE/KINEMATICS kinstype mismatch(es): {wrong_alias_types}") +PY + then + exit 1 + fi + elif command -v node >/dev/null 2>&1; then + if ! node - "$linuxcnc_root" "$manifest_file" "$table_file" "$cpp_file" "$json_file" "$label" <<'JS' +const fs = require("fs"); +const path = require("path"); +const [linuxcncRoot, manifestFile, tableFile, cppFile, jsonFile, label] = process.argv.slice(2); + +function normalizeAlias(value) { + return value.toLowerCase().replace(/\s+/g, ""); +} + +function readIniIdentity(sourcePath) { + const values = new Map(); + for (const sourceLine of fs.readFileSync(path.join(linuxcncRoot, sourcePath), "utf8").split(/\r?\n/)) { + const line = sourceLine.replace(/\s*[#;].*$/, "").trim(); + const equals = line.indexOf("="); + if (equals < 0) { + continue; + } + const key = line.slice(0, equals).trim().toLowerCase(); + const value = line.slice(equals + 1).trim(); + if ((key === "machine" || key === "kinematics") && value && !values.has(key)) { + values.set(key, value); + } + } + return values; +} + +const manifestInis = fs.readFileSync(manifestFile, "utf8") + .split(/\r?\n/) + .map((line) => line.split(":", 3)) + .filter((parts) => parts.length >= 2 && parts[0] === "config" && parts[1].endsWith(".ini")) + .map((parts) => parts[1]); +if (manifestInis.length === 0) { + throw new Error(`${manifestFile} has no LinuxCNC INI config sources`); +} + +const tableRowRe = /^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$/; +const aliases = new Map(); +for (const line of fs.readFileSync(tableFile, "utf8").split(/\r?\n/)) { + const match = tableRowRe.exec(line); + if (match) { + aliases.set(JSON.parse(match[1]), [Number(match[2]), Number(match[3]), Number(match[4])]); + } +} + +const caseRowRe = /^\s*\{("(?:(?:\\.)|[^"\\])*"),\s*("(?:(?:\\.)|[^"\\])*"),\s*(-?\d+),\s*(-?\d+),\s*(-?\d+)\},?\s*$/; +const caseSources = new Map(); +for (const line of fs.readFileSync(cppFile, "utf8").split(/\r?\n/)) { + const match = caseRowRe.exec(line); + if (match) { + caseSources.set(JSON.stringify([JSON.parse(match[1]).toLowerCase(), JSON.parse(match[2])]), [Number(match[3]), Number(match[4]), Number(match[5])]); + } +} +for (const entry of JSON.parse(fs.readFileSync(jsonFile, "utf8"))) { + caseSources.set(JSON.stringify([entry.field.toLowerCase(), entry.value]), [entry.m428, entry.m429, entry.m430]); +} + +const missingCases = []; +const missingAliases = []; +const wrongCaseTypes = []; +const wrongAliasTypes = []; +for (const iniPath of manifestInis) { + if (!aliases.has(iniPath)) { + continue; + } + const expectedTypes = aliases.get(iniPath); + for (const [field, value] of readIniIdentity(iniPath).entries()) { + const caseKey = JSON.stringify([field, value]); + const alias = normalizeAlias(value); + if (!caseSources.has(caseKey)) { + missingCases.push([iniPath, field, value]); + } else if (JSON.stringify(caseSources.get(caseKey)) !== JSON.stringify(expectedTypes)) { + wrongCaseTypes.push([iniPath, field, value, expectedTypes, caseSources.get(caseKey)]); + } + if (!aliases.has(alias)) { + missingAliases.push([iniPath, field, value, alias]); + } else if (JSON.stringify(aliases.get(alias)) !== JSON.stringify(expectedTypes)) { + wrongAliasTypes.push([iniPath, field, value, expectedTypes, aliases.get(alias)]); + } + } +} + +if (missingCases.length > 0) { + throw new Error(`${label} cases are missing LinuxCNC INI MACHINE/KINEMATICS value(s): ${JSON.stringify(missingCases)}`); +} +if (missingAliases.length > 0) { + throw new Error(`${label} table is missing LinuxCNC INI MACHINE/KINEMATICS alias(es): ${JSON.stringify(missingAliases)}`); +} +if (wrongCaseTypes.length > 0) { + throw new Error(`${label} cases have LinuxCNC INI MACHINE/KINEMATICS kinstype mismatch(es): ${JSON.stringify(wrongCaseTypes)}`); +} +if (wrongAliasTypes.length > 0) { + throw new Error(`${label} table has LinuxCNC INI MACHINE/KINEMATICS kinstype mismatch(es): ${JSON.stringify(wrongAliasTypes)}`); +} +JS + then + exit 1 + fi + else + echo "missing python3 or node for switchkins INI identity output validation" >&2 + exit 1 + fi +} + api_keys_csv=$(printf '%s,' $(extract_api_switchkins_alias_keys core/src/cnc_sim_api.cpp)) api_keys_csv=${api_keys_csv%,} validate_api_switchkins_alias_keys() { @@ -977,13 +2300,77 @@ JS } validate_api_switchkins_alias_keys "$api_keys_csv" +validate_web_switchkins_case_fields() { + local json_file=$1 + local wasm_core_file=$2 + local types_file=$3 + local label=$4 + if command -v python3 >/dev/null 2>&1; then + if ! python3 - "$json_file" "$wasm_core_file" "$types_file" "$label" <<'PY' +import json +import re +import sys + +json_file, wasm_core_file, types_file, label = sys.argv[1:] +with open(json_file, encoding="utf-8") as handle: + fields = sorted({entry["field"] for entry in json.load(handle)}) +with open(wasm_core_file, encoding="utf-8") as handle: + wasm_core = handle.read() +with open(types_file, encoding="utf-8") as handle: + types = handle.read() + +missing_wasm = [ + field for field in fields + if not re.search( + rf"\.\.\.\(\s*options\.{re.escape(field)}\s*\?\s*" + rf"\{{\s*{re.escape(field)}\s*:\s*options\.{re.escape(field)}\s*\}}\s*:\s*\{{\}}\s*\)", + wasm_core, + ) +] +missing_types = [ + field for field in fields + if not re.search(rf"\b{re.escape(field)}\?:\s*string\b", types) +] +if missing_wasm: + raise SystemExit(f"{label} web wasm-core.js does not forward switchkins config field(s): {missing_wasm}") +if missing_types: + raise SystemExit(f"{label} web TypeScript options do not expose switchkins config field(s): {missing_types}") +PY + then + exit 1 + fi + elif command -v node >/dev/null 2>&1; then + if ! node - "$json_file" "$wasm_core_file" "$types_file" "$label" <<'JS' +const fs = require("fs"); +const [jsonFile, wasmCoreFile, typesFile, label] = process.argv.slice(2); +const fields = [...new Set(JSON.parse(fs.readFileSync(jsonFile, "utf8")).map((entry) => entry.field))].sort(); +const wasmCore = fs.readFileSync(wasmCoreFile, "utf8"); +const types = fs.readFileSync(typesFile, "utf8"); +const missingWasm = fields.filter((field) => { + const escaped = field.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return !new RegExp(`\\.\\.\\.\\(\\s*options\\.${escaped}\\s*\\?\\s*\\{\\s*${escaped}\\s*:\\s*options\\.${escaped}\\s*\\}\\s*:\\s*\\{\\}\\s*\\)`).test(wasmCore); +}); +const missingTypes = fields.filter((field) => !new RegExp(`\\b${field.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\?:\\s*string\\b`).test(types)); +if (missingWasm.length > 0) { + throw new Error(`${label} web wasm-core.js does not forward switchkins config field(s): ${missingWasm.join(",")}`); +} +if (missingTypes.length > 0) { + throw new Error(`${label} web TypeScript options do not expose switchkins config field(s): ${missingTypes.join(",")}`); +} +JS + then + exit 1 + fi + else + echo "missing python3 or node for browser switchkins config field validation" >&2 + exit 1 + fi +} + for generated_file in \ linuxcnc_switchkins_remap_table.inc \ - linuxcnc_switchkins_remap_table.stdout.inc \ linuxcnc_switchkins_remap_config_cases.inc \ - linuxcnc_switchkins_remap_config_cases.stdout.inc \ - linuxcnc_switchkins_remap_config_cases.json \ - linuxcnc_switchkins_remap_config_cases.stdout.json + linuxcnc_switchkins_remap_config_cases.json do if [[ ! -f "$generated_dir/$generated_file" ]]; then echo "missing generated switchkins remap output: $generated_file" >&2 @@ -995,12 +2382,11 @@ do fi done -diff -u "$generated_dir/linuxcnc_switchkins_remap_table.inc" \ - "$generated_dir/linuxcnc_switchkins_remap_table.stdout.inc" -diff -u "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc" \ - "$generated_dir/linuxcnc_switchkins_remap_config_cases.stdout.inc" -diff -u "$generated_dir/linuxcnc_switchkins_remap_config_cases.json" \ - "$generated_dir/linuxcnc_switchkins_remap_config_cases.stdout.json" +validate_web_switchkins_case_fields \ + "$generated_dir/linuxcnc_switchkins_remap_config_cases.json" \ + web/src/wasm-core.js \ + web/src/index.ts \ + "generated" validate_generated_header \ "$generated_dir/linuxcnc_switchkins_remap_table.inc" \ @@ -1018,33 +2404,34 @@ validate_generated_header \ core/tests/linuxcnc_switchkins_remap_config_cases.inc \ "tracked config cases" \ "// Generated by ./generate-linuxcnc-switchkins-remap-table.sh --config-cases." +validate_generated_source_notes \ + "$generated_dir/linuxcnc_switchkins_remap_table.inc" \ + "table" \ + "// Source: LinuxCNC INI MACHINE/KINEMATICS/HALFILE/POSTGUI_HALFILE/SUBROUTINE_PATH/REMAP entries and" \ + "// adjacent remap_subs/{428,429,430}remap.ngc # assignments." +validate_generated_source_notes \ + core/src/linuxcnc_switchkins_remap_table.inc \ + "tracked table" \ + "// Source: LinuxCNC INI MACHINE/KINEMATICS/HALFILE/POSTGUI_HALFILE/SUBROUTINE_PATH/REMAP entries and" \ + "// adjacent remap_subs/{428,429,430}remap.ngc # assignments." +validate_generated_source_notes \ + "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc" \ + "config cases" \ + "// Source: LinuxCNC INI config path, MACHINE, KINEMATICS, non-LIB HALFILE/POSTGUI_HALFILE," \ + "// SUBROUTINE_PATH-resolved remap_subs entries, and adjacent M428/M429/M430 # assignments." +validate_generated_source_notes \ + core/tests/linuxcnc_switchkins_remap_config_cases.inc \ + "tracked config cases" \ + "// Source: LinuxCNC INI config path, MACHINE, KINEMATICS, non-LIB HALFILE/POSTGUI_HALFILE," \ + "// SUBROUTINE_PATH-resolved remap_subs entries, and adjacent M428/M429/M430 # assignments." validate_json "$generated_dir/linuxcnc_switchkins_remap_config_cases.json" "generated linuxcnc_switchkins_remap_config_cases.json" -validate_json "$generated_dir/linuxcnc_switchkins_remap_config_cases.stdout.json" "generated stdout linuxcnc_switchkins_remap_config_cases.json" validate_json web/public/linuxcnc_switchkins_remap_config_cases.json "web/public/linuxcnc_switchkins_remap_config_cases.json" validate_cpp_table "$generated_dir/linuxcnc_switchkins_remap_table.inc" "generated" validate_cpp_table core/src/linuxcnc_switchkins_remap_table.inc "tracked" validate_cpp_cases "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc" "generated" validate_cpp_cases core/tests/linuxcnc_switchkins_remap_config_cases.inc "tracked" -generated_table_rows=$(count_table_rows "$generated_dir/linuxcnc_switchkins_remap_table.inc") -if ((generated_table_rows == 0)); then - echo "empty generated switchkins remap table rows" >&2 - exit 1 -fi - -generated_cpp_cases=$(count_cpp_config_cases "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc") -generated_json_cases=$(count_json_cases "$generated_dir/linuxcnc_switchkins_remap_config_cases.json") -tracked_cpp_cases=$(count_cpp_config_cases core/tests/linuxcnc_switchkins_remap_config_cases.inc) -tracked_json_cases=$(count_json_cases web/public/linuxcnc_switchkins_remap_config_cases.json) -if [[ "$generated_cpp_cases" != "$generated_json_cases" ]]; then - echo "generated switchkins remap C++/JSON case count mismatch: $generated_cpp_cases != $generated_json_cases" >&2 - exit 1 -fi -if [[ "$tracked_cpp_cases" != "$tracked_json_cases" ]]; then - echo "tracked switchkins remap C++/JSON case count mismatch: $tracked_cpp_cases != $tracked_json_cases" >&2 - exit 1 -fi compare_cpp_json_cases \ "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc" \ "$generated_dir/linuxcnc_switchkins_remap_config_cases.json" \ @@ -1063,6 +2450,24 @@ validate_case_values_against_table \ "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc" \ "$generated_dir/linuxcnc_switchkins_remap_config_cases.json" \ "generated" +validate_manifest_ini_paths_in_outputs \ + "$manifest" \ + "$generated_dir/linuxcnc_switchkins_remap_table.inc" \ + "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc" \ + "$generated_dir/linuxcnc_switchkins_remap_config_cases.json" \ + "generated" +validate_manifest_remap_paths_in_outputs \ + "$manifest" \ + "$generated_dir/linuxcnc_switchkins_remap_table.inc" \ + "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc" \ + "$generated_dir/linuxcnc_switchkins_remap_config_cases.json" \ + "generated" +validate_manifest_hal_paths_in_outputs \ + "$manifest" \ + "$generated_dir/linuxcnc_switchkins_remap_table.inc" \ + "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc" \ + "$generated_dir/linuxcnc_switchkins_remap_config_cases.json" \ + "generated" validate_switchkins_case_fields_against_api \ "$api_keys_csv" \ core/tests/linuxcnc_switchkins_remap_config_cases.inc \ @@ -1073,6 +2478,24 @@ validate_case_values_against_table \ core/tests/linuxcnc_switchkins_remap_config_cases.inc \ web/public/linuxcnc_switchkins_remap_config_cases.json \ "tracked" +validate_manifest_ini_paths_in_outputs \ + "$manifest" \ + core/src/linuxcnc_switchkins_remap_table.inc \ + core/tests/linuxcnc_switchkins_remap_config_cases.inc \ + web/public/linuxcnc_switchkins_remap_config_cases.json \ + "tracked" +validate_manifest_remap_paths_in_outputs \ + "$manifest" \ + core/src/linuxcnc_switchkins_remap_table.inc \ + core/tests/linuxcnc_switchkins_remap_config_cases.inc \ + web/public/linuxcnc_switchkins_remap_config_cases.json \ + "tracked" +validate_manifest_hal_paths_in_outputs \ + "$manifest" \ + core/src/linuxcnc_switchkins_remap_table.inc \ + core/tests/linuxcnc_switchkins_remap_config_cases.inc \ + web/public/linuxcnc_switchkins_remap_config_cases.json \ + "tracked" diff -u core/src/linuxcnc_switchkins_remap_table.inc "$generated_dir/linuxcnc_switchkins_remap_table.inc" diff -u core/tests/linuxcnc_switchkins_remap_config_cases.inc "$generated_dir/linuxcnc_switchkins_remap_config_cases.inc" diff --git a/core/src/cnc_sim_api.cpp b/core/src/cnc_sim_api.cpp index 033bd09..3d707dd 100644 --- a/core/src/cnc_sim_api.cpp +++ b/core/src/cnc_sim_api.cpp @@ -106,6 +106,8 @@ bool contains_switchkins_config_alias(const std::string &compact, const char *al contains_string_value(compact, "postguihalfile", alias) || contains_string_value(compact, "postgui_halfile", alias) || contains_string_value(compact, "postgui_hal_file", alias) || + contains_string_value(compact, "subroutinepath", alias) || + contains_string_value(compact, "subroutine_path", alias) || contains_string_value(compact, "config", alias) || contains_string_value(compact, "configpath", alias) || contains_string_value(compact, "config_path", alias) || diff --git a/core/src/linuxcnc_switchkins_remap_table.inc b/core/src/linuxcnc_switchkins_remap_table.inc index 6956967..e4e1c46 100644 --- a/core/src/linuxcnc_switchkins_remap_table.inc +++ b/core/src/linuxcnc_switchkins_remap_table.inc @@ -9,11 +9,16 @@ {"sim-5axisbridgemill", 0, 1, 2}, {"5axiskinscoordinates=xyzbcwy", 0, 1, 2}, {"5axiskins", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal", 0, 1, 2}, {"5axisgui.hal", 0, 1, 2}, {"5axisgui", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal", 0, 1, 2}, {"5axis_postgui.hal", 0, 1, 2}, {"5axis_postgui", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/5axis/bridgemill/remap_subs", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, {"configs/sim/axis/vismach/5axis/table-dual-rotary", 1, 0, -1}, {"table-dual-rotary", 1, 0, -1}, @@ -23,9 +28,12 @@ {"xyzab_tdr_kins", 1, 0, -1}, {"xyzab_tdr", 1, 0, -1}, {"xyzab-tdr-kins", 1, 0, -1}, + {"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal", 1, 0, -1}, {"xyzab-tdr-postgui.hal", 1, 0, -1}, {"xyzab-tdr-postgui", 1, 0, -1}, + {"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/428remap.ngc", 1, 0, -1}, {"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs", 1, 0, -1}, + {"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/429remap.ngc", 1, 0, -1}, {"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, {"configs/sim/axis/vismach/5axis/table-rotary-tilting", 1, 0, 2}, {"table-rotary-tilting", 1, 0, 2}, @@ -34,9 +42,13 @@ {"sim-xyzac-trt-kins", 1, 0, 2}, {"xyzac-trt-kinssparm=identityfirst", 1, 0, 2}, {"xyzac-trt-kins", 1, 0, 2}, + {"configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal", 1, 0, 2}, {"switchkins_postgui.hal", 1, 0, 2}, {"switchkins_postgui", 1, 0, 2}, + {"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc", 1, 0, 2}, {"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs", 1, 0, 2}, + {"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc", 1, 0, 2}, + {"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc", 1, 0, 2}, {"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, {"xyzbc-trt", 1, 0, 2}, {"sim-xyzbc-trt-kins(switchkins)", 1, 0, 2}, @@ -49,17 +61,22 @@ {"xyzacb-trsrn", 0, 1, 2}, {"xyzacb-trsrn(switchkins)", 0, 1, 2}, {"xyzacb_trsrn", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal", 0, 1, 2}, {"xyzacb-trsrn_postgui.hal", 0, 1, 2}, {"xyzacb-trsrn_postgui", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/428remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs", 0, 1, 2}, {"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating", 0, 1, 2}, {"table-rotary_spindle-rotary-nutating", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/429remap.ngc", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/430remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, {"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp", 0, 1, 2}, {"xyzbca-trsrn_twp", 0, 1, 2}, {"xyzbca-trsrn", 0, 1, 2}, {"xyzbca-trsrn(switchkins)", 0, 1, 2}, {"xyzbca_trsrn", 0, 1, 2}, + {"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal", 0, 1, 2}, {"xyzbca-trsrn_postgui.hal", 0, 1, 2}, {"xyzbca-trsrn_postgui", 0, 1, 2}, {"configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, @@ -68,40 +85,59 @@ {"hexapod", 0, 1, 2}, {"hexapod(switchkins)", 0, 1, 2}, {"genhexkins", 0, 1, 2}, + {"configs/sim/axis/vismach/hexapod-sim/kinematics.hal", 0, 1, 2}, {"kinematics.hal", 0, 1, 2}, {"kinematics", 0, 1, 2}, + {"configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal", 0, 1, 2}, {"hexapod_postgui.hal", 0, 1, 2}, {"hexapod_postgui", 0, 1, 2}, + {"configs/sim/axis/vismach/hexapod-sim/remap_subs/428remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/hexapod-sim/remap_subs", 0, 1, 2}, + {"configs/sim/axis/vismach/hexapod-sim/remap_subs/429remap.ngc", 0, 1, 2}, + {"configs/sim/axis/vismach/hexapod-sim/remap_subs/430remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, {"configs/sim/axis/vismach/melfa-sim", 0, 1, 2}, {"melfa-sim", 0, 1, 2}, {"melfa", 0, 1, 2}, {"melfa(mm)", 0, 1, 2}, {"genserkins", 0, 1, 2}, + {"configs/sim/axis/vismach/melfa-sim/melfa_dh.hal", 0, 1, 2}, {"melfa_dh.hal", 0, 1, 2}, {"melfa_dh", 0, 1, 2}, + {"configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal", 0, 1, 2}, {"melfa-postgui.hal", 0, 1, 2}, {"melfa-postgui", 0, 1, 2}, + {"configs/sim/axis/vismach/melfa-sim/remap_subs/428remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/melfa-sim/remap_subs", 0, 1, 2}, + {"configs/sim/axis/vismach/melfa-sim/remap_subs/429remap.ngc", 0, 1, 2}, + {"configs/sim/axis/vismach/melfa-sim/remap_subs/430remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, {"configs/sim/axis/vismach/millturn", 0, 1, -1}, {"millturn", 0, 1, -1}, {"millturn(mm)", 0, 1, -1}, + {"configs/sim/axis/vismach/millturn/millturn.hal", 0, 1, -1}, {"millturn.hal", 0, 1, -1}, + {"configs/sim/axis/vismach/millturn/millturn-postgui.hal", 0, 1, -1}, {"millturn-postgui.hal", 0, 1, -1}, {"millturn-postgui", 0, 1, -1}, + {"configs/sim/axis/vismach/millturn/remap_subs/428remap.ngc", 0, 1, -1}, {"configs/sim/axis/vismach/millturn/remap_subs", 0, 1, -1}, + {"configs/sim/axis/vismach/millturn/remap_subs/429remap.ngc", 0, 1, -1}, {"configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, {"configs/sim/axis/vismach/puma", 0, 1, 2}, {"puma", 0, 1, 2}, {"puma(pumakins,switchkins)", 0, 1, 2}, {"pumakins", 0, 1, 2}, + {"configs/sim/axis/vismach/puma/puma_dh.hal", 0, 1, 2}, {"puma_dh.hal", 0, 1, 2}, {"puma_dh", 0, 1, 2}, + {"configs/sim/axis/vismach/puma/puma_postgui.hal", 0, 1, 2}, {"puma_postgui.hal", 0, 1, 2}, {"puma_postgui", 0, 1, 2}, + {"configs/sim/axis/vismach/puma/remap_subs/428remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/puma/remap_subs", 0, 1, 2}, + {"configs/sim/axis/vismach/puma/remap_subs/429remap.ngc", 0, 1, 2}, + {"configs/sim/axis/vismach/puma/remap_subs/430remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, {"puma_cube", 0, 1, 2}, {"puma_cube.ini(pumakins)", 0, 1, 2}, @@ -109,8 +145,10 @@ {"configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"puma560", 0, 1, 2}, {"puma560(switchkins)(inch)", 0, 1, 2}, + {"configs/sim/axis/vismach/puma/puma560_dh.hal", 0, 1, 2}, {"puma560_dh.hal", 0, 1, 2}, {"puma560_dh", 0, 1, 2}, + {"configs/sim/axis/vismach/puma/puma560_postgui.hal", 0, 1, 2}, {"puma560_postgui.hal", 0, 1, 2}, {"puma560_postgui", 0, 1, 2}, {"configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, @@ -121,12 +159,22 @@ {"scara(genserkins,switchkins)", 0, 1, 2}, {"scarakinscoordinates=xyzcab", 0, 1, 2}, {"scarakins", 0, 1, 2}, + {"configs/sim/axis/vismach/scara/scara_postgui.hal", 0, 1, 2}, {"scara_postgui.hal", 0, 1, 2}, {"scara_postgui", 0, 1, 2}, + {"configs/sim/axis/vismach/scara/remap_subs/428remap.ngc", 0, 1, 2}, {"configs/sim/axis/vismach/scara/remap_subs", 0, 1, 2}, + {"configs/sim/axis/vismach/scara/remap_subs/429remap.ngc", 0, 1, 2}, + {"configs/sim/axis/vismach/scara/remap_subs/430remap.ngc", 0, 1, 2}, {"configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, {"configs/sim/qtaxis/non-trivial/scara", 0, 1, 2}, + {"configs/sim/qtaxis/non-trivial/scara/remap_subs/428remap.ngc", 0, 1, 2}, {"configs/sim/qtaxis/non-trivial/scara/remap_subs", 0, 1, 2}, + {"configs/sim/qtaxis/non-trivial/scara/remap_subs/429remap.ngc", 0, 1, 2}, + {"configs/sim/qtaxis/non-trivial/scara/remap_subs/430remap.ngc", 0, 1, 2}, {"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, {"configs/sim/qtvcp_screens/non-trivial/scara", 0, 1, 2}, + {"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs/428remap.ngc", 0, 1, 2}, {"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs", 0, 1, 2}, + {"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs/429remap.ngc", 0, 1, 2}, + {"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs/430remap.ngc", 0, 1, 2}, diff --git a/core/tests/linuxcnc_switchkins_remap_config_cases.inc b/core/tests/linuxcnc_switchkins_remap_config_cases.inc index c6297a6..9ec874f 100644 --- a/core/tests/linuxcnc_switchkins_remap_config_cases.inc +++ b/core/tests/linuxcnc_switchkins_remap_config_cases.inc @@ -1,12 +1,15 @@ // Generated by ./generate-linuxcnc-switchkins-remap-table.sh --config-cases. // Source: LinuxCNC INI config path, MACHINE, KINEMATICS, non-LIB HALFILE/POSTGUI_HALFILE, -// and adjacent remap_subs entries for M428/M429/M430 # assignments. +// SUBROUTINE_PATH-resolved remap_subs entries, and adjacent M428/M429/M430 # assignments. {"config", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/5axis/bridgemill/5axis.ini", 0, 1, 2}, @@ -18,6 +21,10 @@ {"switchkins", "Sim-5Axis Bridge Mill", 0, 1, 2}, {"switchkins", "5axiskins coordinates=xyzbcwy", 0, 1, 2}, {"switchkins", "5axiskins", 0, 1, 2}, + {"halFile", "configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal", 0, 1, 2}, + {"halfile", "configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal", 0, 1, 2}, + {"hal_file", "configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal", 0, 1, 2}, + {"HALFILE", "configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal", 0, 1, 2}, {"halFile", "5axisgui.hal", 0, 1, 2}, {"halFile", "5axisgui", 0, 1, 2}, {"halfile", "5axisgui.hal", 0, 1, 2}, @@ -26,22 +33,40 @@ {"hal_file", "5axisgui", 0, 1, 2}, {"HALFILE", "5axisgui.hal", 0, 1, 2}, {"HALFILE", "5axisgui", 0, 1, 2}, + {"postguiHalFile", "configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal", 0, 1, 2}, + {"postguihalfile", "configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal", 0, 1, 2}, + {"postgui_halfile", "configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal", 0, 1, 2}, + {"postgui_hal_file", "configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal", 0, 1, 2}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal", 0, 1, 2}, {"postguiHalFile", "5axis_postgui.hal", 0, 1, 2}, {"postguiHalFile", "5axis_postgui", 0, 1, 2}, + {"postguihalfile", "5axis_postgui.hal", 0, 1, 2}, + {"postguihalfile", "5axis_postgui", 0, 1, 2}, {"postgui_halfile", "5axis_postgui.hal", 0, 1, 2}, {"postgui_halfile", "5axis_postgui", 0, 1, 2}, {"postgui_hal_file", "5axis_postgui.hal", 0, 1, 2}, {"postgui_hal_file", "5axis_postgui", 0, 1, 2}, {"POSTGUI_HALFILE", "5axis_postgui.hal", 0, 1, 2}, {"POSTGUI_HALFILE", "5axis_postgui", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/5axis/bridgemill/remap_subs", 0, 1, 2}, {"remap", "configs/sim/axis/vismach/5axis/bridgemill", 0, 1, 2}, {"remap", "bridgemill", 0, 1, 2}, + {"subroutinePath", "configs/sim/axis/vismach/5axis/bridgemill/remap_subs", 0, 1, 2}, + {"subroutinepath", "configs/sim/axis/vismach/5axis/bridgemill/remap_subs", 0, 1, 2}, + {"subroutine_path", "configs/sim/axis/vismach/5axis/bridgemill/remap_subs", 0, 1, 2}, + {"SUBROUTINE_PATH", "configs/sim/axis/vismach/5axis/bridgemill/remap_subs", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc", 0, 1, 2}, {"config", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, {"configPath", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, + {"configpath", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, {"config_path", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, {"ini", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, {"iniFile", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, + {"inifile", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, {"iniFileName", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, + {"inifilename", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, {"ini_file", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, {"ini_file_name", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, {"INI_FILE_NAME", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini", 1, 0, -1}, @@ -54,22 +79,39 @@ {"switchkins", "xyzab_tdr_kins", 1, 0, -1}, {"switchkins", "xyzab_tdr", 1, 0, -1}, {"switchkins", "xyzab-tdr-kins", 1, 0, -1}, + {"postguiHalFile", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal", 1, 0, -1}, + {"postguihalfile", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal", 1, 0, -1}, + {"postgui_halfile", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal", 1, 0, -1}, + {"postgui_hal_file", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal", 1, 0, -1}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal", 1, 0, -1}, {"postguiHalFile", "xyzab-tdr-postgui.hal", 1, 0, -1}, {"postguiHalFile", "xyzab-tdr-postgui", 1, 0, -1}, + {"postguihalfile", "xyzab-tdr-postgui.hal", 1, 0, -1}, + {"postguihalfile", "xyzab-tdr-postgui", 1, 0, -1}, {"postgui_halfile", "xyzab-tdr-postgui.hal", 1, 0, -1}, {"postgui_halfile", "xyzab-tdr-postgui", 1, 0, -1}, {"postgui_hal_file", "xyzab-tdr-postgui.hal", 1, 0, -1}, {"postgui_hal_file", "xyzab-tdr-postgui", 1, 0, -1}, {"POSTGUI_HALFILE", "xyzab-tdr-postgui.hal", 1, 0, -1}, {"POSTGUI_HALFILE", "xyzab-tdr-postgui", 1, 0, -1}, + {"remap", "configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/428remap.ngc", 1, 0, -1}, + {"remap", "configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs", 1, 0, -1}, {"remap", "configs/sim/axis/vismach/5axis/table-dual-rotary", 1, 0, -1}, {"remap", "table-dual-rotary", 1, 0, -1}, + {"subroutinePath", "configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs", 1, 0, -1}, + {"subroutinepath", "configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs", 1, 0, -1}, + {"subroutine_path", "configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs", 1, 0, -1}, + {"SUBROUTINE_PATH", "configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs", 1, 0, -1}, + {"remap", "configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/429remap.ngc", 1, 0, -1}, {"config", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, {"configPath", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, + {"configpath", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, {"config_path", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, {"ini", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, {"iniFile", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, + {"inifile", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, {"iniFileName", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, + {"inifilename", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, {"ini_file", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, {"ini_file_name", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", 1, 0, 2}, @@ -81,22 +123,40 @@ {"switchkins", "sim-xyzac-trt-kins", 1, 0, 2}, {"switchkins", "xyzac-trt-kins sparm=identityfirst", 1, 0, 2}, {"switchkins", "xyzac-trt-kins", 1, 0, 2}, + {"postguiHalFile", "configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal", 1, 0, 2}, + {"postguihalfile", "configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal", 1, 0, 2}, + {"postgui_halfile", "configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal", 1, 0, 2}, + {"postgui_hal_file", "configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal", 1, 0, 2}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal", 1, 0, 2}, {"postguiHalFile", "switchkins_postgui.hal", 1, 0, 2}, {"postguiHalFile", "switchkins_postgui", 1, 0, 2}, + {"postguihalfile", "switchkins_postgui.hal", 1, 0, 2}, + {"postguihalfile", "switchkins_postgui", 1, 0, 2}, {"postgui_halfile", "switchkins_postgui.hal", 1, 0, 2}, {"postgui_halfile", "switchkins_postgui", 1, 0, 2}, {"postgui_hal_file", "switchkins_postgui.hal", 1, 0, 2}, {"postgui_hal_file", "switchkins_postgui", 1, 0, 2}, {"POSTGUI_HALFILE", "switchkins_postgui.hal", 1, 0, 2}, {"POSTGUI_HALFILE", "switchkins_postgui", 1, 0, 2}, + {"remap", "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc", 1, 0, 2}, + {"remap", "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs", 1, 0, 2}, {"remap", "configs/sim/axis/vismach/5axis/table-rotary-tilting", 1, 0, 2}, {"remap", "table-rotary-tilting", 1, 0, 2}, + {"subroutinePath", "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs", 1, 0, 2}, + {"subroutinepath", "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs", 1, 0, 2}, + {"subroutine_path", "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs", 1, 0, 2}, + {"SUBROUTINE_PATH", "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs", 1, 0, 2}, + {"remap", "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc", 1, 0, 2}, + {"remap", "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc", 1, 0, 2}, {"config", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, {"configPath", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, + {"configpath", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, {"config_path", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, {"ini", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, {"iniFile", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, + {"inifile", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, {"iniFileName", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, + {"inifilename", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, {"ini_file", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, {"ini_file_name", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini", 1, 0, 2}, @@ -109,10 +169,13 @@ {"switchkins", "xyzbc-trt-kins", 1, 0, 2}, {"config", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini", 0, 1, 2}, @@ -122,22 +185,40 @@ {"switchkins", "xyzacb-trsrn", 0, 1, 2}, {"switchkins", "xyzacb-trsrn (switchkins)", 0, 1, 2}, {"switchkins", "xyzacb_trsrn", 0, 1, 2}, + {"postguiHalFile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal", 0, 1, 2}, + {"postguihalfile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal", 0, 1, 2}, + {"postgui_halfile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal", 0, 1, 2}, + {"postgui_hal_file", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal", 0, 1, 2}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal", 0, 1, 2}, {"postguiHalFile", "xyzacb-trsrn_postgui.hal", 0, 1, 2}, {"postguiHalFile", "xyzacb-trsrn_postgui", 0, 1, 2}, + {"postguihalfile", "xyzacb-trsrn_postgui.hal", 0, 1, 2}, + {"postguihalfile", "xyzacb-trsrn_postgui", 0, 1, 2}, {"postgui_halfile", "xyzacb-trsrn_postgui.hal", 0, 1, 2}, {"postgui_halfile", "xyzacb-trsrn_postgui", 0, 1, 2}, {"postgui_hal_file", "xyzacb-trsrn_postgui.hal", 0, 1, 2}, {"postgui_hal_file", "xyzacb-trsrn_postgui", 0, 1, 2}, {"POSTGUI_HALFILE", "xyzacb-trsrn_postgui.hal", 0, 1, 2}, {"POSTGUI_HALFILE", "xyzacb-trsrn_postgui", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/428remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs", 0, 1, 2}, {"remap", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating", 0, 1, 2}, {"remap", "table-rotary_spindle-rotary-nutating", 0, 1, 2}, + {"subroutinePath", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs", 0, 1, 2}, + {"subroutinepath", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs", 0, 1, 2}, + {"subroutine_path", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs", 0, 1, 2}, + {"SUBROUTINE_PATH", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/429remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/430remap.ngc", 0, 1, 2}, {"config", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini", 0, 1, 2}, @@ -147,8 +228,15 @@ {"switchkins", "xyzbca-trsrn", 0, 1, 2}, {"switchkins", "xyzbca-trsrn (switchkins)", 0, 1, 2}, {"switchkins", "xyzbca_trsrn", 0, 1, 2}, + {"postguiHalFile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal", 0, 1, 2}, + {"postguihalfile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal", 0, 1, 2}, + {"postgui_halfile", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal", 0, 1, 2}, + {"postgui_hal_file", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal", 0, 1, 2}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal", 0, 1, 2}, {"postguiHalFile", "xyzbca-trsrn_postgui.hal", 0, 1, 2}, {"postguiHalFile", "xyzbca-trsrn_postgui", 0, 1, 2}, + {"postguihalfile", "xyzbca-trsrn_postgui.hal", 0, 1, 2}, + {"postguihalfile", "xyzbca-trsrn_postgui", 0, 1, 2}, {"postgui_halfile", "xyzbca-trsrn_postgui.hal", 0, 1, 2}, {"postgui_halfile", "xyzbca-trsrn_postgui", 0, 1, 2}, {"postgui_hal_file", "xyzbca-trsrn_postgui.hal", 0, 1, 2}, @@ -157,10 +245,13 @@ {"POSTGUI_HALFILE", "xyzbca-trsrn_postgui", 0, 1, 2}, {"config", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/hexapod-sim/hexapod.ini", 0, 1, 2}, @@ -170,6 +261,10 @@ {"switchkins", "hexapod", 0, 1, 2}, {"switchkins", "hexapod (switchkins)", 0, 1, 2}, {"switchkins", "genhexkins", 0, 1, 2}, + {"halFile", "configs/sim/axis/vismach/hexapod-sim/kinematics.hal", 0, 1, 2}, + {"halfile", "configs/sim/axis/vismach/hexapod-sim/kinematics.hal", 0, 1, 2}, + {"hal_file", "configs/sim/axis/vismach/hexapod-sim/kinematics.hal", 0, 1, 2}, + {"HALFILE", "configs/sim/axis/vismach/hexapod-sim/kinematics.hal", 0, 1, 2}, {"halFile", "kinematics.hal", 0, 1, 2}, {"halFile", "kinematics", 0, 1, 2}, {"halfile", "kinematics.hal", 0, 1, 2}, @@ -178,22 +273,40 @@ {"hal_file", "kinematics", 0, 1, 2}, {"HALFILE", "kinematics.hal", 0, 1, 2}, {"HALFILE", "kinematics", 0, 1, 2}, + {"postguiHalFile", "configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal", 0, 1, 2}, + {"postguihalfile", "configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal", 0, 1, 2}, + {"postgui_halfile", "configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal", 0, 1, 2}, + {"postgui_hal_file", "configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal", 0, 1, 2}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal", 0, 1, 2}, {"postguiHalFile", "hexapod_postgui.hal", 0, 1, 2}, {"postguiHalFile", "hexapod_postgui", 0, 1, 2}, + {"postguihalfile", "hexapod_postgui.hal", 0, 1, 2}, + {"postguihalfile", "hexapod_postgui", 0, 1, 2}, {"postgui_halfile", "hexapod_postgui.hal", 0, 1, 2}, {"postgui_halfile", "hexapod_postgui", 0, 1, 2}, {"postgui_hal_file", "hexapod_postgui.hal", 0, 1, 2}, {"postgui_hal_file", "hexapod_postgui", 0, 1, 2}, {"POSTGUI_HALFILE", "hexapod_postgui.hal", 0, 1, 2}, {"POSTGUI_HALFILE", "hexapod_postgui", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/hexapod-sim/remap_subs/428remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/hexapod-sim/remap_subs", 0, 1, 2}, {"remap", "configs/sim/axis/vismach/hexapod-sim", 0, 1, 2}, {"remap", "hexapod-sim", 0, 1, 2}, + {"subroutinePath", "configs/sim/axis/vismach/hexapod-sim/remap_subs", 0, 1, 2}, + {"subroutinepath", "configs/sim/axis/vismach/hexapod-sim/remap_subs", 0, 1, 2}, + {"subroutine_path", "configs/sim/axis/vismach/hexapod-sim/remap_subs", 0, 1, 2}, + {"SUBROUTINE_PATH", "configs/sim/axis/vismach/hexapod-sim/remap_subs", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/hexapod-sim/remap_subs/429remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/hexapod-sim/remap_subs/430remap.ngc", 0, 1, 2}, {"config", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/melfa-sim/melfa.ini", 0, 1, 2}, @@ -203,6 +316,10 @@ {"switchkins", "melfa", 0, 1, 2}, {"switchkins", "melfa (mm)", 0, 1, 2}, {"switchkins", "genserkins", 0, 1, 2}, + {"halFile", "configs/sim/axis/vismach/melfa-sim/melfa_dh.hal", 0, 1, 2}, + {"halfile", "configs/sim/axis/vismach/melfa-sim/melfa_dh.hal", 0, 1, 2}, + {"hal_file", "configs/sim/axis/vismach/melfa-sim/melfa_dh.hal", 0, 1, 2}, + {"HALFILE", "configs/sim/axis/vismach/melfa-sim/melfa_dh.hal", 0, 1, 2}, {"halFile", "melfa_dh.hal", 0, 1, 2}, {"halFile", "melfa_dh", 0, 1, 2}, {"halfile", "melfa_dh.hal", 0, 1, 2}, @@ -211,22 +328,40 @@ {"hal_file", "melfa_dh", 0, 1, 2}, {"HALFILE", "melfa_dh.hal", 0, 1, 2}, {"HALFILE", "melfa_dh", 0, 1, 2}, + {"postguiHalFile", "configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal", 0, 1, 2}, + {"postguihalfile", "configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal", 0, 1, 2}, + {"postgui_halfile", "configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal", 0, 1, 2}, + {"postgui_hal_file", "configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal", 0, 1, 2}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal", 0, 1, 2}, {"postguiHalFile", "melfa-postgui.hal", 0, 1, 2}, {"postguiHalFile", "melfa-postgui", 0, 1, 2}, + {"postguihalfile", "melfa-postgui.hal", 0, 1, 2}, + {"postguihalfile", "melfa-postgui", 0, 1, 2}, {"postgui_halfile", "melfa-postgui.hal", 0, 1, 2}, {"postgui_halfile", "melfa-postgui", 0, 1, 2}, {"postgui_hal_file", "melfa-postgui.hal", 0, 1, 2}, {"postgui_hal_file", "melfa-postgui", 0, 1, 2}, {"POSTGUI_HALFILE", "melfa-postgui.hal", 0, 1, 2}, {"POSTGUI_HALFILE", "melfa-postgui", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/melfa-sim/remap_subs/428remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/melfa-sim/remap_subs", 0, 1, 2}, {"remap", "configs/sim/axis/vismach/melfa-sim", 0, 1, 2}, {"remap", "melfa-sim", 0, 1, 2}, + {"subroutinePath", "configs/sim/axis/vismach/melfa-sim/remap_subs", 0, 1, 2}, + {"subroutinepath", "configs/sim/axis/vismach/melfa-sim/remap_subs", 0, 1, 2}, + {"subroutine_path", "configs/sim/axis/vismach/melfa-sim/remap_subs", 0, 1, 2}, + {"SUBROUTINE_PATH", "configs/sim/axis/vismach/melfa-sim/remap_subs", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/melfa-sim/remap_subs/429remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/melfa-sim/remap_subs/430remap.ngc", 0, 1, 2}, {"config", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, {"configPath", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, + {"configpath", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, {"config_path", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, {"ini", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, {"iniFile", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, + {"inifile", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, {"iniFileName", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, + {"inifilename", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, {"ini_file", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, {"ini_file_name", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, {"INI_FILE_NAME", "configs/sim/axis/vismach/millturn/millturn.ini", 0, 1, -1}, @@ -234,6 +369,10 @@ {"kinematics", "millturn", 0, 1, -1}, {"switchkins", "millturn", 0, 1, -1}, {"switchkins", "millturn (mm)", 0, 1, -1}, + {"halFile", "configs/sim/axis/vismach/millturn/millturn.hal", 0, 1, -1}, + {"halfile", "configs/sim/axis/vismach/millturn/millturn.hal", 0, 1, -1}, + {"hal_file", "configs/sim/axis/vismach/millturn/millturn.hal", 0, 1, -1}, + {"HALFILE", "configs/sim/axis/vismach/millturn/millturn.hal", 0, 1, -1}, {"halFile", "millturn.hal", 0, 1, -1}, {"halFile", "millturn", 0, 1, -1}, {"halfile", "millturn.hal", 0, 1, -1}, @@ -242,22 +381,39 @@ {"hal_file", "millturn", 0, 1, -1}, {"HALFILE", "millturn.hal", 0, 1, -1}, {"HALFILE", "millturn", 0, 1, -1}, + {"postguiHalFile", "configs/sim/axis/vismach/millturn/millturn-postgui.hal", 0, 1, -1}, + {"postguihalfile", "configs/sim/axis/vismach/millturn/millturn-postgui.hal", 0, 1, -1}, + {"postgui_halfile", "configs/sim/axis/vismach/millturn/millturn-postgui.hal", 0, 1, -1}, + {"postgui_hal_file", "configs/sim/axis/vismach/millturn/millturn-postgui.hal", 0, 1, -1}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/millturn/millturn-postgui.hal", 0, 1, -1}, {"postguiHalFile", "millturn-postgui.hal", 0, 1, -1}, {"postguiHalFile", "millturn-postgui", 0, 1, -1}, + {"postguihalfile", "millturn-postgui.hal", 0, 1, -1}, + {"postguihalfile", "millturn-postgui", 0, 1, -1}, {"postgui_halfile", "millturn-postgui.hal", 0, 1, -1}, {"postgui_halfile", "millturn-postgui", 0, 1, -1}, {"postgui_hal_file", "millturn-postgui.hal", 0, 1, -1}, {"postgui_hal_file", "millturn-postgui", 0, 1, -1}, {"POSTGUI_HALFILE", "millturn-postgui.hal", 0, 1, -1}, {"POSTGUI_HALFILE", "millturn-postgui", 0, 1, -1}, + {"remap", "configs/sim/axis/vismach/millturn/remap_subs/428remap.ngc", 0, 1, -1}, + {"remap", "configs/sim/axis/vismach/millturn/remap_subs", 0, 1, -1}, {"remap", "configs/sim/axis/vismach/millturn", 0, 1, -1}, {"remap", "millturn", 0, 1, -1}, + {"subroutinePath", "configs/sim/axis/vismach/millturn/remap_subs", 0, 1, -1}, + {"subroutinepath", "configs/sim/axis/vismach/millturn/remap_subs", 0, 1, -1}, + {"subroutine_path", "configs/sim/axis/vismach/millturn/remap_subs", 0, 1, -1}, + {"SUBROUTINE_PATH", "configs/sim/axis/vismach/millturn/remap_subs", 0, 1, -1}, + {"remap", "configs/sim/axis/vismach/millturn/remap_subs/429remap.ngc", 0, 1, -1}, {"config", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/puma/puma.ini", 0, 1, 2}, @@ -267,6 +423,10 @@ {"switchkins", "PUMA (pumakins,switchkins)", 0, 1, 2}, {"switchkins", "PUMA", 0, 1, 2}, {"switchkins", "pumakins", 0, 1, 2}, + {"halFile", "configs/sim/axis/vismach/puma/puma_dh.hal", 0, 1, 2}, + {"halfile", "configs/sim/axis/vismach/puma/puma_dh.hal", 0, 1, 2}, + {"hal_file", "configs/sim/axis/vismach/puma/puma_dh.hal", 0, 1, 2}, + {"HALFILE", "configs/sim/axis/vismach/puma/puma_dh.hal", 0, 1, 2}, {"halFile", "puma_dh.hal", 0, 1, 2}, {"halFile", "puma_dh", 0, 1, 2}, {"halfile", "puma_dh.hal", 0, 1, 2}, @@ -275,22 +435,40 @@ {"hal_file", "puma_dh", 0, 1, 2}, {"HALFILE", "puma_dh.hal", 0, 1, 2}, {"HALFILE", "puma_dh", 0, 1, 2}, + {"postguiHalFile", "configs/sim/axis/vismach/puma/puma_postgui.hal", 0, 1, 2}, + {"postguihalfile", "configs/sim/axis/vismach/puma/puma_postgui.hal", 0, 1, 2}, + {"postgui_halfile", "configs/sim/axis/vismach/puma/puma_postgui.hal", 0, 1, 2}, + {"postgui_hal_file", "configs/sim/axis/vismach/puma/puma_postgui.hal", 0, 1, 2}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/puma/puma_postgui.hal", 0, 1, 2}, {"postguiHalFile", "puma_postgui.hal", 0, 1, 2}, {"postguiHalFile", "puma_postgui", 0, 1, 2}, + {"postguihalfile", "puma_postgui.hal", 0, 1, 2}, + {"postguihalfile", "puma_postgui", 0, 1, 2}, {"postgui_halfile", "puma_postgui.hal", 0, 1, 2}, {"postgui_halfile", "puma_postgui", 0, 1, 2}, {"postgui_hal_file", "puma_postgui.hal", 0, 1, 2}, {"postgui_hal_file", "puma_postgui", 0, 1, 2}, {"POSTGUI_HALFILE", "puma_postgui.hal", 0, 1, 2}, {"POSTGUI_HALFILE", "puma_postgui", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/puma/remap_subs/428remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/puma/remap_subs", 0, 1, 2}, {"remap", "configs/sim/axis/vismach/puma", 0, 1, 2}, {"remap", "puma", 0, 1, 2}, + {"subroutinePath", "configs/sim/axis/vismach/puma/remap_subs", 0, 1, 2}, + {"subroutinepath", "configs/sim/axis/vismach/puma/remap_subs", 0, 1, 2}, + {"subroutine_path", "configs/sim/axis/vismach/puma/remap_subs", 0, 1, 2}, + {"SUBROUTINE_PATH", "configs/sim/axis/vismach/puma/remap_subs", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/puma/remap_subs/429remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/puma/remap_subs/430remap.ngc", 0, 1, 2}, {"config", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/puma/puma_cube.ini", 0, 1, 2}, @@ -300,16 +478,23 @@ {"switchkins", "puma_cube.ini", 0, 1, 2}, {"config", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/puma/puma560.ini", 0, 1, 2}, {"machine", "puma560 (switchkins) (inch)", 0, 1, 2}, {"switchkins", "puma560", 0, 1, 2}, {"switchkins", "puma560 (switchkins) (inch)", 0, 1, 2}, + {"halFile", "configs/sim/axis/vismach/puma/puma560_dh.hal", 0, 1, 2}, + {"halfile", "configs/sim/axis/vismach/puma/puma560_dh.hal", 0, 1, 2}, + {"hal_file", "configs/sim/axis/vismach/puma/puma560_dh.hal", 0, 1, 2}, + {"HALFILE", "configs/sim/axis/vismach/puma/puma560_dh.hal", 0, 1, 2}, {"halFile", "puma560_dh.hal", 0, 1, 2}, {"halFile", "puma560_dh", 0, 1, 2}, {"halfile", "puma560_dh.hal", 0, 1, 2}, @@ -318,8 +503,15 @@ {"hal_file", "puma560_dh", 0, 1, 2}, {"HALFILE", "puma560_dh.hal", 0, 1, 2}, {"HALFILE", "puma560_dh", 0, 1, 2}, + {"postguiHalFile", "configs/sim/axis/vismach/puma/puma560_postgui.hal", 0, 1, 2}, + {"postguihalfile", "configs/sim/axis/vismach/puma/puma560_postgui.hal", 0, 1, 2}, + {"postgui_halfile", "configs/sim/axis/vismach/puma/puma560_postgui.hal", 0, 1, 2}, + {"postgui_hal_file", "configs/sim/axis/vismach/puma/puma560_postgui.hal", 0, 1, 2}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/puma/puma560_postgui.hal", 0, 1, 2}, {"postguiHalFile", "puma560_postgui.hal", 0, 1, 2}, {"postguiHalFile", "puma560_postgui", 0, 1, 2}, + {"postguihalfile", "puma560_postgui.hal", 0, 1, 2}, + {"postguihalfile", "puma560_postgui", 0, 1, 2}, {"postgui_halfile", "puma560_postgui.hal", 0, 1, 2}, {"postgui_halfile", "puma560_postgui", 0, 1, 2}, {"postgui_hal_file", "puma560_postgui.hal", 0, 1, 2}, @@ -328,20 +520,26 @@ {"POSTGUI_HALFILE", "puma560_postgui", 0, 1, 2}, {"config", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/puma/puma560_uvw.ini", 0, 1, 2}, {"switchkins", "puma560_uvw", 0, 1, 2}, {"config", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, {"configPath", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, + {"configpath", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, {"config_path", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, {"ini", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, {"iniFile", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, + {"inifile", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, {"iniFileName", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, + {"inifilename", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, {"ini_file", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/axis/vismach/scara/scara.ini", 0, 1, 2}, @@ -352,33 +550,70 @@ {"switchkins", "SCARA", 0, 1, 2}, {"switchkins", "scarakins coordinates=xyzcab", 0, 1, 2}, {"switchkins", "scarakins", 0, 1, 2}, + {"postguiHalFile", "configs/sim/axis/vismach/scara/scara_postgui.hal", 0, 1, 2}, + {"postguihalfile", "configs/sim/axis/vismach/scara/scara_postgui.hal", 0, 1, 2}, + {"postgui_halfile", "configs/sim/axis/vismach/scara/scara_postgui.hal", 0, 1, 2}, + {"postgui_hal_file", "configs/sim/axis/vismach/scara/scara_postgui.hal", 0, 1, 2}, + {"POSTGUI_HALFILE", "configs/sim/axis/vismach/scara/scara_postgui.hal", 0, 1, 2}, {"postguiHalFile", "scara_postgui.hal", 0, 1, 2}, {"postguiHalFile", "scara_postgui", 0, 1, 2}, + {"postguihalfile", "scara_postgui.hal", 0, 1, 2}, + {"postguihalfile", "scara_postgui", 0, 1, 2}, {"postgui_halfile", "scara_postgui.hal", 0, 1, 2}, {"postgui_halfile", "scara_postgui", 0, 1, 2}, {"postgui_hal_file", "scara_postgui.hal", 0, 1, 2}, {"postgui_hal_file", "scara_postgui", 0, 1, 2}, {"POSTGUI_HALFILE", "scara_postgui.hal", 0, 1, 2}, {"POSTGUI_HALFILE", "scara_postgui", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/scara/remap_subs/428remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/scara/remap_subs", 0, 1, 2}, {"remap", "configs/sim/axis/vismach/scara", 0, 1, 2}, {"remap", "scara", 0, 1, 2}, + {"subroutinePath", "configs/sim/axis/vismach/scara/remap_subs", 0, 1, 2}, + {"subroutinepath", "configs/sim/axis/vismach/scara/remap_subs", 0, 1, 2}, + {"subroutine_path", "configs/sim/axis/vismach/scara/remap_subs", 0, 1, 2}, + {"SUBROUTINE_PATH", "configs/sim/axis/vismach/scara/remap_subs", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/scara/remap_subs/429remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/axis/vismach/scara/remap_subs/430remap.ngc", 0, 1, 2}, {"config", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, {"configPath", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, + {"configpath", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, {"config_path", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, {"ini", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, {"iniFile", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, + {"inifile", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, {"iniFileName", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, + {"inifilename", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, {"ini_file", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/qtaxis/non-trivial/scara/scara.ini", 0, 1, 2}, + {"remap", "configs/sim/qtaxis/non-trivial/scara/remap_subs/428remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/qtaxis/non-trivial/scara/remap_subs", 0, 1, 2}, {"remap", "configs/sim/qtaxis/non-trivial/scara", 0, 1, 2}, + {"subroutinePath", "configs/sim/qtaxis/non-trivial/scara/remap_subs", 0, 1, 2}, + {"subroutinepath", "configs/sim/qtaxis/non-trivial/scara/remap_subs", 0, 1, 2}, + {"subroutine_path", "configs/sim/qtaxis/non-trivial/scara/remap_subs", 0, 1, 2}, + {"SUBROUTINE_PATH", "configs/sim/qtaxis/non-trivial/scara/remap_subs", 0, 1, 2}, + {"remap", "configs/sim/qtaxis/non-trivial/scara/remap_subs/429remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/qtaxis/non-trivial/scara/remap_subs/430remap.ngc", 0, 1, 2}, {"config", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, {"configPath", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, + {"configpath", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, {"config_path", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, {"ini", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, {"iniFile", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, + {"inifile", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, {"iniFileName", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, + {"inifilename", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, {"ini_file", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, {"ini_file_name", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, {"INI_FILE_NAME", "configs/sim/qtvcp_screens/non-trivial/scara/scara.ini", 0, 1, 2}, + {"remap", "configs/sim/qtvcp_screens/non-trivial/scara/remap_subs/428remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/qtvcp_screens/non-trivial/scara/remap_subs", 0, 1, 2}, {"remap", "configs/sim/qtvcp_screens/non-trivial/scara", 0, 1, 2}, + {"subroutinePath", "configs/sim/qtvcp_screens/non-trivial/scara/remap_subs", 0, 1, 2}, + {"subroutinepath", "configs/sim/qtvcp_screens/non-trivial/scara/remap_subs", 0, 1, 2}, + {"subroutine_path", "configs/sim/qtvcp_screens/non-trivial/scara/remap_subs", 0, 1, 2}, + {"SUBROUTINE_PATH", "configs/sim/qtvcp_screens/non-trivial/scara/remap_subs", 0, 1, 2}, + {"remap", "configs/sim/qtvcp_screens/non-trivial/scara/remap_subs/429remap.ngc", 0, 1, 2}, + {"remap", "configs/sim/qtvcp_screens/non-trivial/scara/remap_subs/430remap.ngc", 0, 1, 2}, diff --git a/generate-linuxcnc-switchkins-remap-table.sh b/generate-linuxcnc-switchkins-remap-table.sh index 7d76410..bb41917 100755 --- a/generate-linuxcnc-switchkins-remap-table.sh +++ b/generate-linuxcnc-switchkins-remap-table.sh @@ -75,6 +75,10 @@ read_ini_switchkins_config() { line = $0 sub(/[[:space:]]*[#;].*$/, "", line) line = trim(line) + if (line ~ /^\[[^][]+\]$/) { + section = tolower(substr(line, 2, length(line) - 2)) + next + } if (line !~ /=/) { next } @@ -85,17 +89,17 @@ read_ini_switchkins_config() { sub(/^[^=]*=[[:space:]]*/, "", value) value = trim(value) - if (key == "machine") { + if (section == "emc" && key == "machine") { print "machine\t" value - } else if (key == "kinematics") { + } else if (section == "kins" && key == "kinematics") { print "kinematics\t" value - } else if (key == "halfile") { + } else if (section == "hal" && key == "halfile") { print "halfile\t" value - } else if (key == "postgui_halfile") { + } else if (section == "hal" && key == "postgui_halfile") { print "postgui_halfile\t" value - } else if (key == "subroutine_path") { + } else if (section == "rs274ngc" && key == "subroutine_path") { print "subroutine_path\t" value - } else if (key == "remap") { + } else if (section == "rs274ngc" && key == "remap") { lower = tolower(value) for (mcode = 428; mcode <= 430; mcode++) { if (lower ~ "m" mcode "([^0-9]|$)" && @@ -110,24 +114,34 @@ read_ini_switchkins_config() { ' "$file" } +resolved_config_path= resolve_config_path() { local config_dir=$1 local path=$2 if [[ "$path" = /* ]]; then - printf '%s\n' "$path" + resolved_config_path=$path else - printf '%s\n' "$config_dir/$path" + resolved_config_path=$config_dir/$path fi } +resolved_linuxcnc_path= +declare -A relative_linuxcnc_path_cache=() relative_linuxcnc_path() { local path=$1 - path=$(cd "${path%/*}" && pwd)/${path##*/} - if [[ "$path" != "$linuxcnc_root/"* ]]; then - echo "resolved LinuxCNC source path escapes LinuxCNC root: $path" >&2 + if [[ -n "${relative_linuxcnc_path_cache[$path]+x}" ]]; then + resolved_linuxcnc_path=${relative_linuxcnc_path_cache[$path]} + return 0 + fi + + local absolute_path + absolute_path=$(cd "${path%/*}" && pwd)/${path##*/} + if [[ "$absolute_path" != "$linuxcnc_root/"* ]]; then + echo "resolved LinuxCNC source path escapes LinuxCNC root: $absolute_path" >&2 exit 1 fi - printf '%s\n' "${path#"$linuxcnc_root/"}" + resolved_linuxcnc_path=${absolute_path#"$linuxcnc_root/"} + relative_linuxcnc_path_cache[$path]=$resolved_linuxcnc_path } declare -A config_dir_cache=() @@ -159,6 +173,10 @@ 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 [[ "$manifest_path" != *.ini && "$manifest_path" != *.hal ]]; then + echo "LinuxCNC config source must be an INI or HAL file in $manifest: $manifest_path" >&2 + exit 1 + fi if [[ -n "${manifest_config_sources[$manifest_path]:-}" ]]; then echo "duplicate LinuxCNC config source in $manifest: $manifest_path" >&2 exit 1 @@ -190,24 +208,28 @@ while IFS=: read -r manifest_group manifest_path _manifest_note; do esac done <"$manifest" +resolved_config_dir= 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]}" + resolved_config_dir=${config_dir_cache[$config]} } +resolved_remap_source= remap_source_for_ngc() { local config=$1 local ngc_name=$2 local subroutine_paths=${3:-} + resolved_remap_source= if [[ "$ngc_name" != *.ngc ]]; then ngc_name="$ngc_name.ngc" fi local config_dir - config_dir=$(config_dir_for "$config") + config_dir_for "$config" + config_dir=$resolved_config_dir if [[ -z "$subroutine_paths" ]]; then subroutine_paths="." fi @@ -220,9 +242,11 @@ remap_source_for_ngc() { for path_part in "${path_parts[@]}"; do [[ -n "$path_part" ]] || continue local candidate_dir - candidate_dir=$(resolve_config_path "$config_dir" "$path_part") + resolve_config_path "$config_dir" "$path_part" + candidate_dir=$resolved_config_path if [[ -f "$candidate_dir/$ngc_name" ]]; then relative_linuxcnc_path "$candidate_dir/$ngc_name" + resolved_remap_source=$resolved_linuxcnc_path return 0 fi done @@ -231,9 +255,11 @@ remap_source_for_ngc() { return 1 } +resolved_config_source= config_source_for_halfile() { local config=$1 local halfile=$2 + resolved_config_source= [[ -n "$halfile" ]] || return 1 [[ "$halfile" == LIB:* ]] && return 1 @@ -241,24 +267,34 @@ config_source_for_halfile() { [[ -n "$hal_path" ]] || return 1 local config_dir - config_dir=$(config_dir_for "$config") + config_dir_for "$config" + config_dir=$resolved_config_dir local resolved - resolved=$(resolve_config_path "$config_dir" "$hal_path") + resolve_config_path "$config_dir" "$hal_path" + resolved=$resolved_config_path if [[ ! -f "$resolved" ]]; then echo "missing LinuxCNC HAL source referenced by ${config#"$linuxcnc_root/"}: $halfile" >&2 exit 1 fi relative_linuxcnc_path "$resolved" + resolved_config_source=$resolved_linuxcnc_path } +resolved_kinstype= +declare -A kinstype_cache=() kinstype_for_remap_source() { local source source=$1 + resolved_kinstype= if [[ -z "$source" ]]; then - printf '%s\n' -1 + resolved_kinstype=-1 return 0 fi - awk ' + if [[ -n "${kinstype_cache[$source]+x}" ]]; then + resolved_kinstype=${kinstype_cache[$source]} + return 0 + fi + resolved_kinstype=$(awk ' /^[[:space:]]*#[[:space:]]*=/ { value = $0 sub(/^[[:space:]]*#[[:space:]]*=[[:space:]]*/, "", value) @@ -266,7 +302,8 @@ kinstype_for_remap_source() { print value exit } - ' "$linuxcnc_root/$source" + ' "$linuxcnc_root/$source") + kinstype_cache[$source]=$resolved_kinstype } require_remap_source() { @@ -324,13 +361,6 @@ 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 @@ -338,7 +368,8 @@ add_alias() { local m430=$4 alias=${alias,,} alias=${alias//[[:space:]]/} - alias=$(escape_generated_string "$alias") + alias=${alias//\\/\\\\} + alias=${alias//\"/\\\"} [[ -n "$alias" ]] || return 0 local types="$m428,$m429,$m430" @@ -376,18 +407,21 @@ add_case() { seen_cases[$key]=1 local cpp_field=$field local cpp_value=$value - cpp_field=$(escape_generated_string "$cpp_field") - cpp_value=$(escape_generated_string "$cpp_value") + cpp_field=${cpp_field//\\/\\\\} + cpp_field=${cpp_field//\"/\\\"} + cpp_value=${cpp_value//\\/\\\\} + cpp_value=${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}") } +trimmed_machine_label= trim_machine_label() { local machine=$1 machine=${machine%%(*} machine="${machine#"${machine%%[![:space:]]*}"}" machine="${machine%"${machine##*[![:space:]]}"}" - printf '%s\n' "$machine" + trimmed_machine_label=$machine } add_kinematics_variants() { @@ -444,9 +478,8 @@ add_machine_aliases() { local m430=$4 [[ -n "$machine" ]] || return 0 add_alias "$machine" "$m428" "$m429" "$m430" - local trimmed_machine - trimmed_machine=$(trim_machine_label "$machine") - add_alias "$trimmed_machine" "$m428" "$m429" "$m430" + trim_machine_label "$machine" + add_alias "$trimmed_machine_label" "$m428" "$m429" "$m430" } add_kinematics_aliases() { @@ -472,9 +505,8 @@ add_switchkins_cases() { 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" + trim_machine_label "$machine" + add_case "switchkins" "$trimmed_machine_label" "$m428" "$m429" "$m430" fi if [[ -n "$kinematics" ]]; then @@ -509,6 +541,19 @@ add_halfile_cases() { add_halfile_case_fields "HALFILE" "$halfile" "$m428" "$m429" "$m430" } +add_halfile_source_cases() { + local source=$1 + local m428=$2 + local m429=$3 + local m430=$4 + [[ -n "$source" ]] || return 0 + + add_case "halFile" "$source" "$m428" "$m429" "$m430" + add_case "halfile" "$source" "$m428" "$m429" "$m430" + add_case "hal_file" "$source" "$m428" "$m429" "$m430" + add_case "HALFILE" "$source" "$m428" "$m429" "$m430" +} + add_postgui_halfile_cases() { local halfile=$1 local m428=$2 @@ -518,11 +563,39 @@ add_postgui_halfile_cases() { [[ "$halfile" == LIB:* ]] && return 0 add_halfile_case_fields "postguiHalFile" "$halfile" "$m428" "$m429" "$m430" + 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" } +add_postgui_halfile_source_cases() { + local source=$1 + local m428=$2 + local m429=$3 + local m430=$4 + [[ -n "$source" ]] || return 0 + + add_case "postguiHalFile" "$source" "$m428" "$m429" "$m430" + add_case "postguihalfile" "$source" "$m428" "$m429" "$m430" + add_case "postgui_halfile" "$source" "$m428" "$m429" "$m430" + add_case "postgui_hal_file" "$source" "$m428" "$m429" "$m430" + add_case "POSTGUI_HALFILE" "$source" "$m428" "$m429" "$m430" +} + +add_subroutine_path_cases() { + local subroutine_path=$1 + local m428=$2 + local m429=$3 + local m430=$4 + [[ -n "$subroutine_path" ]] || return 0 + + add_case "subroutinePath" "$subroutine_path" "$m428" "$m429" "$m430" + add_case "subroutinepath" "$subroutine_path" "$m428" "$m429" "$m430" + add_case "subroutine_path" "$subroutine_path" "$m428" "$m429" "$m430" + add_case "SUBROUTINE_PATH" "$subroutine_path" "$m428" "$m429" "$m430" +} + while IFS=: read -r group path _note; do [[ "$group" == "config" && "$path" == *.ini ]] || continue @@ -531,9 +604,6 @@ while IFS=: read -r group path _note; do echo "missing LinuxCNC config source: $path" >&2 exit 1 } - if ! grep -Eiq 'REMAP[[:space:]]*=[[:space:]]*M(428|429|430)([^0-9]|$)' "$config"; then - continue - fi machine= kinematics= @@ -571,6 +641,9 @@ while IFS=: read -r group path _note; do ;; esac done < <(read_ini_switchkins_config "$config") + if [[ -z "$remap_ngc_428" && -z "$remap_ngc_429" && -z "$remap_ngc_430" ]]; then + continue + fi if [[ -z "$subroutine_paths" ]]; then subroutine_paths="." fi @@ -579,27 +652,36 @@ while IFS=: read -r group path _note; do 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) + if remap_source_for_ngc "$config" "$remap_ngc_428" "$subroutine_paths"; then + remap_source_428=$resolved_remap_source + fi 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) + if remap_source_for_ngc "$config" "$remap_ngc_429" "$subroutine_paths"; then + remap_source_429=$resolved_remap_source + fi 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) + if remap_source_for_ngc "$config" "$remap_ngc_430" "$subroutine_paths"; then + remap_source_430=$resolved_remap_source + fi 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") + kinstype_for_remap_source "$remap_source_428" + m428=$resolved_kinstype + kinstype_for_remap_source "$remap_source_429" + m429=$resolved_kinstype + kinstype_for_remap_source "$remap_source_430" + m430=$resolved_kinstype [[ -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" @@ -615,10 +697,13 @@ while IFS=: read -r group path _note; do add_case "config" "$path" "$m428" "$m429" "$m430" add_case "configPath" "$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 "inifile" "$path" "$m428" "$m429" "$m430" add_case "iniFileName" "$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" @@ -633,15 +718,21 @@ 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 + if config_source_for_halfile "$config" "$halfile"; then + hal_source=$resolved_config_source record_config_source "$path" "$hal_source" "HALFILE" + add_alias "$hal_source" "$m428" "$m429" "$m430" + add_halfile_source_cases "$hal_source" "$m428" "$m429" "$m430" 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 + if config_source_for_halfile "$config" "$halfile"; then + hal_source=$resolved_config_source 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" fi add_postgui_halfile_cases "$halfile" "$m428" "$m429" "$m430" add_halfile_aliases "$halfile" "$m428" "$m429" "$m430" @@ -650,13 +741,17 @@ while IFS=: read -r group path _note; do 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_source" "$m428" "$m429" "$m430" 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_source" "$m428" "$m429" "$m430" + add_case "remap" "$remap_dir" "$m428" "$m429" "$m430" add_case "remap" "$remap_parent" "$m428" "$m429" "$m430" add_case "remap" "${remap_parent##*/}" "$m428" "$m429" "$m430" + add_subroutine_path_cases "$remap_dir" "$m428" "$m429" "$m430" fi done done <"$manifest" @@ -739,7 +834,7 @@ write_config_cases() { cat <<'EOF' // Generated by ./generate-linuxcnc-switchkins-remap-table.sh --config-cases. // Source: LinuxCNC INI config path, MACHINE, KINEMATICS, non-LIB HALFILE/POSTGUI_HALFILE, -// and adjacent remap_subs entries for M428/M429/M430 # assignments. +// SUBROUTINE_PATH-resolved remap_subs entries, and adjacent M428/M429/M430 # assignments. EOF printf '%s\n' "${case_entries[@]}" diff --git a/test-native.sh b/test-native.sh index 54dfefd..d4fc6f0 100755 --- a/test-native.sh +++ b/test-native.sh @@ -38,14 +38,40 @@ preflight_cache_dir="$build_dir/preflight-cache" grep -F '#include "linuxcnc_switchkins_remap_table.inc"' core/src/cnc_sim_api.cpp >/dev/null grep -F 'switchkins: options.switchkins' web/src/wasm-core.js >/dev/null grep -F 'remap: options.remap' web/src/wasm-core.js >/dev/null +grep -F 'machine: options.machine' web/src/wasm-core.js >/dev/null +grep -F 'config: options.config' web/src/wasm-core.js >/dev/null +grep -F 'configPath: options.configPath' web/src/wasm-core.js >/dev/null +grep -F 'configpath: options.configpath' web/src/wasm-core.js >/dev/null +grep -F 'config_path: options.config_path' web/src/wasm-core.js >/dev/null +grep -F 'ini: options.ini' web/src/wasm-core.js >/dev/null grep -F 'iniFile: options.iniFile' web/src/wasm-core.js >/dev/null +grep -F 'inifile: options.inifile' web/src/wasm-core.js >/dev/null grep -F 'iniFileName: options.iniFileName' web/src/wasm-core.js >/dev/null +grep -F 'inifilename: options.inifilename' web/src/wasm-core.js >/dev/null +grep -F 'ini_file: options.ini_file' web/src/wasm-core.js >/dev/null +grep -F 'ini_file_name: options.ini_file_name' web/src/wasm-core.js >/dev/null grep -F 'INI_FILE_NAME: options.INI_FILE_NAME' web/src/wasm-core.js >/dev/null grep -F 'halFile: options.halFile' web/src/wasm-core.js >/dev/null +grep -F 'halfile: options.halfile' web/src/wasm-core.js >/dev/null +grep -F 'hal_file: options.hal_file' web/src/wasm-core.js >/dev/null +grep -F 'HALFILE: options.HALFILE' web/src/wasm-core.js >/dev/null grep -F 'postguiHalFile: options.postguiHalFile' web/src/wasm-core.js >/dev/null +grep -F 'postguihalfile: options.postguihalfile' web/src/wasm-core.js >/dev/null +grep -F 'postgui_halfile: options.postgui_halfile' web/src/wasm-core.js >/dev/null +grep -F 'postgui_hal_file: options.postgui_hal_file' web/src/wasm-core.js >/dev/null grep -F 'POSTGUI_HALFILE: options.POSTGUI_HALFILE' web/src/wasm-core.js >/dev/null +grep -F 'subroutinePath: options.subroutinePath' web/src/wasm-core.js >/dev/null +grep -F 'subroutinepath: options.subroutinepath' web/src/wasm-core.js >/dev/null +grep -F 'subroutine_path: options.subroutine_path' web/src/wasm-core.js >/dev/null +grep -F 'SUBROUTINE_PATH: options.SUBROUTINE_PATH' web/src/wasm-core.js >/dev/null grep -F 'kinematics: options.kinematics' web/src/wasm-core.js >/dev/null +grep -F 'trt: options.trt' web/src/wasm-core.js >/dev/null grep -F 'pivotLength: options.pivotLength' web/src/wasm-core.js >/dev/null +grep -F 'pivot_length: options.pivot_length' web/src/wasm-core.js >/dev/null +grep -F 'kinematicsType: options.kinematicsType' web/src/wasm-core.js >/dev/null +grep -F 'kinematics_type: options.kinematics_type' web/src/wasm-core.js >/dev/null +grep -F 'fiveaxisKinematicsType: options.fiveaxisKinematicsType' web/src/wasm-core.js >/dev/null +grep -F 'fiveaxis_kinematics_type: options.fiveaxis_kinematics_type' web/src/wasm-core.js >/dev/null grep -F 'xyzbcTrt: options.xyzbcTrt' web/src/wasm-core.js >/dev/null grep -F 'globalThis.createCncSimModule' web/src/wasm-core.js >/dev/null grep -F 'createModule(moduleOptions)' web/src/wasm-core.js >/dev/null @@ -56,12 +82,41 @@ grep -F 'LINUXCNC_DEFAULT_PARAMETER_FILE = "rs274ngc.var"' web/src/wasm-core.js grep -F 'export type CncParseOptions' web/src/index.ts >/dev/null grep -F 'switchkins?: string;' web/src/index.ts >/dev/null grep -F 'remap?: string;' web/src/index.ts >/dev/null +grep -F 'machine?: string;' web/src/index.ts >/dev/null +grep -F 'config?: string;' web/src/index.ts >/dev/null +grep -F 'configPath?: string;' web/src/index.ts >/dev/null +grep -F 'configpath?: string;' web/src/index.ts >/dev/null +grep -F 'config_path?: string;' web/src/index.ts >/dev/null +grep -F 'ini?: string;' web/src/index.ts >/dev/null grep -F 'iniFile?: string;' web/src/index.ts >/dev/null +grep -F 'inifile?: string;' web/src/index.ts >/dev/null grep -F 'iniFileName?: string;' web/src/index.ts >/dev/null +grep -F 'inifilename?: string;' web/src/index.ts >/dev/null +grep -F 'ini_file?: string;' web/src/index.ts >/dev/null +grep -F 'ini_file_name?: string;' web/src/index.ts >/dev/null grep -F 'INI_FILE_NAME?: string;' web/src/index.ts >/dev/null grep -F 'halFile?: string;' web/src/index.ts >/dev/null +grep -F 'halfile?: string;' web/src/index.ts >/dev/null +grep -F 'hal_file?: string;' web/src/index.ts >/dev/null +grep -F 'HALFILE?: string;' web/src/index.ts >/dev/null grep -F 'postguiHalFile?: string;' web/src/index.ts >/dev/null +grep -F 'postguihalfile?: string;' web/src/index.ts >/dev/null +grep -F 'postgui_halfile?: string;' web/src/index.ts >/dev/null +grep -F 'postgui_hal_file?: string;' web/src/index.ts >/dev/null grep -F 'POSTGUI_HALFILE?: string;' web/src/index.ts >/dev/null +grep -F 'subroutinePath?: string;' web/src/index.ts >/dev/null +grep -F 'subroutinepath?: string;' web/src/index.ts >/dev/null +grep -F 'subroutine_path?: string;' web/src/index.ts >/dev/null +grep -F 'SUBROUTINE_PATH?: string;' web/src/index.ts >/dev/null +grep -F 'kinematics?: string;' web/src/index.ts >/dev/null +grep -F 'trt?: "xyzbc" | "xyzac" | string;' web/src/index.ts >/dev/null +grep -F 'pivotLength?: number;' web/src/index.ts >/dev/null +grep -F 'pivot_length?: number;' web/src/index.ts >/dev/null +grep -F 'kinematicsType?: number;' web/src/index.ts >/dev/null +grep -F 'kinematics_type?: number;' web/src/index.ts >/dev/null +grep -F 'fiveaxisKinematicsType?: number;' web/src/index.ts >/dev/null +grep -F 'fiveaxis_kinematics_type?: number;' web/src/index.ts >/dev/null +grep -F 'xyzbcTrt?: CncXyzbcTrtOptions;' web/src/index.ts >/dev/null grep -F '): CncEvent[];' web/src/index.ts >/dev/null grep -F 'options?: CncParseOptions' web/src/wasm-core.d.ts >/dev/null grep -F 'parseFile(path: string, dialect?: CncDialect, options?: CncParseOptions): Promise;' web/src/wasm-core.d.ts >/dev/null @@ -82,12 +137,62 @@ grep -F 'export type WasmModuleOptions' web/src/wasm-core.d.ts >/dev/null grep -F 'printErr?: (text: string) => void;' web/src/wasm-core.d.ts >/dev/null grep -F '"field":"switchkins"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null grep -F '"field":"remap"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"machine"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"kinematics"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"config"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"configPath"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"configpath"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"config_path"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"ini"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"iniFile"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"inifile"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"iniFileName"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"inifilename"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"ini_file"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"ini_file_name"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"INI_FILE_NAME"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"halFile"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"halfile"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"hal_file"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"HALFILE"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null grep -F '"field":"postguiHalFile"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"postguihalfile"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"postgui_halfile"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"postgui_hal_file"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null grep -F '"field":"POSTGUI_HALFILE"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"subroutinePath"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"subroutinepath"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"subroutine_path"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null +grep -F '"field":"SUBROUTINE_PATH"' web/public/linuxcnc_switchkins_remap_config_cases.json >/dev/null grep -F '{"switchkins", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null grep -F '{"remap", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"machine", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"kinematics", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"config", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"configPath", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"configpath", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"config_path", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"ini", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"iniFile", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"inifile", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"iniFileName", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"inifilename", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"ini_file", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"ini_file_name", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"INI_FILE_NAME", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"halFile", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"halfile", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"hal_file", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"HALFILE", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null grep -F '{"postguiHalFile", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"postguihalfile", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"postgui_halfile", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"postgui_hal_file", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null grep -F '{"POSTGUI_HALFILE", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"subroutinePath", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"subroutinepath", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"subroutine_path", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null +grep -F '{"SUBROUTINE_PATH", ' core/tests/linuxcnc_switchkins_remap_config_cases.inc >/dev/null grep -F '"moduleResolution": "Bundler"' web/tsconfig.json >/dev/null grep -F '"include": ["src/index.ts", "src/**/*.d.ts"]' web/tsconfig.json >/dev/null grep -F 'createWasmSimulator' test-web-wasm-node-smoke.cjs >/dev/null diff --git a/web/public/linuxcnc_switchkins_remap_config_cases.json b/web/public/linuxcnc_switchkins_remap_config_cases.json index b2500e6..4b86d47 100644 --- a/web/public/linuxcnc_switchkins_remap_config_cases.json +++ b/web/public/linuxcnc_switchkins_remap_config_cases.json @@ -1,10 +1,13 @@ [ {"field":"config","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis.ini","m428":0,"m429":1,"m430":2}, @@ -16,6 +19,10 @@ {"field":"switchkins","value":"Sim-5Axis Bridge Mill","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"5axiskins coordinates=xyzbcwy","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"5axiskins","m428":0,"m429":1,"m430":2}, + {"field":"halFile","value":"configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"halfile","value":"configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"hal_file","value":"configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"HALFILE","value":"configs/sim/axis/vismach/5axis/bridgemill/5axisgui.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"5axisgui.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"5axisgui","m428":0,"m429":1,"m430":2}, {"field":"halfile","value":"5axisgui.hal","m428":0,"m429":1,"m430":2}, @@ -24,22 +31,40 @@ {"field":"hal_file","value":"5axisgui","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"5axisgui.hal","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"5axisgui","m428":0,"m429":1,"m430":2}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"5axis_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"5axis_postgui","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"5axis_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"5axis_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"5axis_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"5axis_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"5axis_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"5axis_postgui","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"5axis_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"5axis_postgui","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/bridgemill/remap_subs/428remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/bridgemill/remap_subs","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"configs/sim/axis/vismach/5axis/bridgemill","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"bridgemill","m428":0,"m429":1,"m430":2}, + {"field":"subroutinePath","value":"configs/sim/axis/vismach/5axis/bridgemill/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutinepath","value":"configs/sim/axis/vismach/5axis/bridgemill/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutine_path","value":"configs/sim/axis/vismach/5axis/bridgemill/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/axis/vismach/5axis/bridgemill/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/bridgemill/remap_subs/429remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/bridgemill/remap_subs/430remap.ngc","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, {"field":"configPath","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, + {"field":"configpath","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, {"field":"config_path","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, {"field":"ini","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, {"field":"iniFile","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, + {"field":"inifile","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, {"field":"iniFileName","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, + {"field":"inifilename","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, {"field":"ini_file","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini","m428":1,"m429":0,"m430":-1}, @@ -52,22 +77,39 @@ {"field":"switchkins","value":"xyzab_tdr_kins","m428":1,"m429":0,"m430":-1}, {"field":"switchkins","value":"xyzab_tdr","m428":1,"m429":0,"m430":-1}, {"field":"switchkins","value":"xyzab-tdr-kins","m428":1,"m429":0,"m430":-1}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, {"field":"postguiHalFile","value":"xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, {"field":"postguiHalFile","value":"xyzab-tdr-postgui","m428":1,"m429":0,"m430":-1}, + {"field":"postguihalfile","value":"xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, + {"field":"postguihalfile","value":"xyzab-tdr-postgui","m428":1,"m429":0,"m430":-1}, {"field":"postgui_halfile","value":"xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, {"field":"postgui_halfile","value":"xyzab-tdr-postgui","m428":1,"m429":0,"m430":-1}, {"field":"postgui_hal_file","value":"xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, {"field":"postgui_hal_file","value":"xyzab-tdr-postgui","m428":1,"m429":0,"m430":-1}, {"field":"POSTGUI_HALFILE","value":"xyzab-tdr-postgui.hal","m428":1,"m429":0,"m430":-1}, {"field":"POSTGUI_HALFILE","value":"xyzab-tdr-postgui","m428":1,"m429":0,"m430":-1}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/428remap.ngc","m428":1,"m429":0,"m430":-1}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs","m428":1,"m429":0,"m430":-1}, {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-dual-rotary","m428":1,"m429":0,"m430":-1}, {"field":"remap","value":"table-dual-rotary","m428":1,"m429":0,"m430":-1}, + {"field":"subroutinePath","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs","m428":1,"m429":0,"m430":-1}, + {"field":"subroutinepath","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs","m428":1,"m429":0,"m430":-1}, + {"field":"subroutine_path","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs","m428":1,"m429":0,"m430":-1}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs","m428":1,"m429":0,"m430":-1}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-dual-rotary/remap_subs/429remap.ngc","m428":1,"m429":0,"m430":-1}, {"field":"config","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini","m428":1,"m429":0,"m430":2}, @@ -79,22 +121,40 @@ {"field":"switchkins","value":"sim-xyzac-trt-kins","m428":1,"m429":0,"m430":2}, {"field":"switchkins","value":"xyzac-trt-kins sparm=identityfirst","m428":1,"m429":0,"m430":2}, {"field":"switchkins","value":"xyzac-trt-kins","m428":1,"m429":0,"m430":2}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, {"field":"postguiHalFile","value":"switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, {"field":"postguiHalFile","value":"switchkins_postgui","m428":1,"m429":0,"m430":2}, + {"field":"postguihalfile","value":"switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, + {"field":"postguihalfile","value":"switchkins_postgui","m428":1,"m429":0,"m430":2}, {"field":"postgui_halfile","value":"switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, {"field":"postgui_halfile","value":"switchkins_postgui","m428":1,"m429":0,"m430":2}, {"field":"postgui_hal_file","value":"switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, {"field":"postgui_hal_file","value":"switchkins_postgui","m428":1,"m429":0,"m430":2}, {"field":"POSTGUI_HALFILE","value":"switchkins_postgui.hal","m428":1,"m429":0,"m430":2}, {"field":"POSTGUI_HALFILE","value":"switchkins_postgui","m428":1,"m429":0,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc","m428":1,"m429":0,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs","m428":1,"m429":0,"m430":2}, {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting","m428":1,"m429":0,"m430":2}, {"field":"remap","value":"table-rotary-tilting","m428":1,"m429":0,"m430":2}, + {"field":"subroutinePath","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs","m428":1,"m429":0,"m430":2}, + {"field":"subroutinepath","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs","m428":1,"m429":0,"m430":2}, + {"field":"subroutine_path","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs","m428":1,"m429":0,"m430":2}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs","m428":1,"m429":0,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc","m428":1,"m429":0,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc","m428":1,"m429":0,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini","m428":1,"m429":0,"m430":2}, @@ -107,10 +167,13 @@ {"field":"switchkins","value":"xyzbc-trt-kins","m428":1,"m429":0,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn.ini","m428":0,"m429":1,"m430":2}, @@ -120,22 +183,40 @@ {"field":"switchkins","value":"xyzacb-trsrn","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"xyzacb-trsrn (switchkins)","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"xyzacb_trsrn","m428":0,"m429":1,"m430":2}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzacb-trsrn_twp/xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"xyzacb-trsrn_postgui","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"xyzacb-trsrn_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"xyzacb-trsrn_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"xyzacb-trsrn_postgui","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"xyzacb-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"xyzacb-trsrn_postgui","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/428remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"table-rotary_spindle-rotary-nutating","m428":0,"m429":1,"m430":2}, + {"field":"subroutinePath","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutinepath","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutine_path","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/429remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/remap_subs/430remap.ngc","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn.ini","m428":0,"m429":1,"m430":2}, @@ -145,8 +226,15 @@ {"field":"switchkins","value":"xyzbca-trsrn","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"xyzbca-trsrn (switchkins)","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"xyzbca_trsrn","m428":0,"m429":1,"m430":2}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/5axis/table-rotary_spindle-rotary-nutating/xyzbca-trsrn_twp/xyzbca-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"xyzbca-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"xyzbca-trsrn_postgui","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"xyzbca-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"xyzbca-trsrn_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"xyzbca-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"xyzbca-trsrn_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"xyzbca-trsrn_postgui.hal","m428":0,"m429":1,"m430":2}, @@ -155,10 +243,13 @@ {"field":"POSTGUI_HALFILE","value":"xyzbca-trsrn_postgui","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/hexapod-sim/hexapod.ini","m428":0,"m429":1,"m430":2}, @@ -168,6 +259,10 @@ {"field":"switchkins","value":"hexapod","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"hexapod (switchkins)","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"genhexkins","m428":0,"m429":1,"m430":2}, + {"field":"halFile","value":"configs/sim/axis/vismach/hexapod-sim/kinematics.hal","m428":0,"m429":1,"m430":2}, + {"field":"halfile","value":"configs/sim/axis/vismach/hexapod-sim/kinematics.hal","m428":0,"m429":1,"m430":2}, + {"field":"hal_file","value":"configs/sim/axis/vismach/hexapod-sim/kinematics.hal","m428":0,"m429":1,"m430":2}, + {"field":"HALFILE","value":"configs/sim/axis/vismach/hexapod-sim/kinematics.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"kinematics.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"kinematics","m428":0,"m429":1,"m430":2}, {"field":"halfile","value":"kinematics.hal","m428":0,"m429":1,"m430":2}, @@ -176,22 +271,40 @@ {"field":"hal_file","value":"kinematics","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"kinematics.hal","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"kinematics","m428":0,"m429":1,"m430":2}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/hexapod-sim/hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"hexapod_postgui","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"hexapod_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"hexapod_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"hexapod_postgui","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"hexapod_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"hexapod_postgui","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/hexapod-sim/remap_subs/428remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/hexapod-sim/remap_subs","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"configs/sim/axis/vismach/hexapod-sim","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"hexapod-sim","m428":0,"m429":1,"m430":2}, + {"field":"subroutinePath","value":"configs/sim/axis/vismach/hexapod-sim/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutinepath","value":"configs/sim/axis/vismach/hexapod-sim/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutine_path","value":"configs/sim/axis/vismach/hexapod-sim/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/axis/vismach/hexapod-sim/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/hexapod-sim/remap_subs/429remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/hexapod-sim/remap_subs/430remap.ngc","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/melfa-sim/melfa.ini","m428":0,"m429":1,"m430":2}, @@ -201,6 +314,10 @@ {"field":"switchkins","value":"melfa","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"melfa (mm)","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"genserkins","m428":0,"m429":1,"m430":2}, + {"field":"halFile","value":"configs/sim/axis/vismach/melfa-sim/melfa_dh.hal","m428":0,"m429":1,"m430":2}, + {"field":"halfile","value":"configs/sim/axis/vismach/melfa-sim/melfa_dh.hal","m428":0,"m429":1,"m430":2}, + {"field":"hal_file","value":"configs/sim/axis/vismach/melfa-sim/melfa_dh.hal","m428":0,"m429":1,"m430":2}, + {"field":"HALFILE","value":"configs/sim/axis/vismach/melfa-sim/melfa_dh.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"melfa_dh.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"melfa_dh","m428":0,"m429":1,"m430":2}, {"field":"halfile","value":"melfa_dh.hal","m428":0,"m429":1,"m430":2}, @@ -209,22 +326,40 @@ {"field":"hal_file","value":"melfa_dh","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"melfa_dh.hal","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"melfa_dh","m428":0,"m429":1,"m430":2}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/melfa-sim/melfa-postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"melfa-postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"melfa-postgui","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"melfa-postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"melfa-postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"melfa-postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"melfa-postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"melfa-postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"melfa-postgui","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"melfa-postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"melfa-postgui","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/melfa-sim/remap_subs/428remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/melfa-sim/remap_subs","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"configs/sim/axis/vismach/melfa-sim","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"melfa-sim","m428":0,"m429":1,"m430":2}, + {"field":"subroutinePath","value":"configs/sim/axis/vismach/melfa-sim/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutinepath","value":"configs/sim/axis/vismach/melfa-sim/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutine_path","value":"configs/sim/axis/vismach/melfa-sim/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/axis/vismach/melfa-sim/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/melfa-sim/remap_subs/429remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/melfa-sim/remap_subs/430remap.ngc","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, {"field":"configPath","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, + {"field":"configpath","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, {"field":"config_path","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, {"field":"ini","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, {"field":"iniFile","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, + {"field":"inifile","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, {"field":"iniFileName","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, + {"field":"inifilename","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, {"field":"ini_file","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/millturn/millturn.ini","m428":0,"m429":1,"m430":-1}, @@ -232,6 +367,10 @@ {"field":"kinematics","value":"millturn","m428":0,"m429":1,"m430":-1}, {"field":"switchkins","value":"millturn","m428":0,"m429":1,"m430":-1}, {"field":"switchkins","value":"millturn (mm)","m428":0,"m429":1,"m430":-1}, + {"field":"halFile","value":"configs/sim/axis/vismach/millturn/millturn.hal","m428":0,"m429":1,"m430":-1}, + {"field":"halfile","value":"configs/sim/axis/vismach/millturn/millturn.hal","m428":0,"m429":1,"m430":-1}, + {"field":"hal_file","value":"configs/sim/axis/vismach/millturn/millturn.hal","m428":0,"m429":1,"m430":-1}, + {"field":"HALFILE","value":"configs/sim/axis/vismach/millturn/millturn.hal","m428":0,"m429":1,"m430":-1}, {"field":"halFile","value":"millturn.hal","m428":0,"m429":1,"m430":-1}, {"field":"halFile","value":"millturn","m428":0,"m429":1,"m430":-1}, {"field":"halfile","value":"millturn.hal","m428":0,"m429":1,"m430":-1}, @@ -240,22 +379,39 @@ {"field":"hal_file","value":"millturn","m428":0,"m429":1,"m430":-1}, {"field":"HALFILE","value":"millturn.hal","m428":0,"m429":1,"m430":-1}, {"field":"HALFILE","value":"millturn","m428":0,"m429":1,"m430":-1}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/millturn/millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/millturn/millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/millturn/millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/millturn/millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/millturn/millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, {"field":"postguiHalFile","value":"millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, {"field":"postguiHalFile","value":"millturn-postgui","m428":0,"m429":1,"m430":-1}, + {"field":"postguihalfile","value":"millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, + {"field":"postguihalfile","value":"millturn-postgui","m428":0,"m429":1,"m430":-1}, {"field":"postgui_halfile","value":"millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, {"field":"postgui_halfile","value":"millturn-postgui","m428":0,"m429":1,"m430":-1}, {"field":"postgui_hal_file","value":"millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, {"field":"postgui_hal_file","value":"millturn-postgui","m428":0,"m429":1,"m430":-1}, {"field":"POSTGUI_HALFILE","value":"millturn-postgui.hal","m428":0,"m429":1,"m430":-1}, {"field":"POSTGUI_HALFILE","value":"millturn-postgui","m428":0,"m429":1,"m430":-1}, + {"field":"remap","value":"configs/sim/axis/vismach/millturn/remap_subs/428remap.ngc","m428":0,"m429":1,"m430":-1}, + {"field":"remap","value":"configs/sim/axis/vismach/millturn/remap_subs","m428":0,"m429":1,"m430":-1}, {"field":"remap","value":"configs/sim/axis/vismach/millturn","m428":0,"m429":1,"m430":-1}, {"field":"remap","value":"millturn","m428":0,"m429":1,"m430":-1}, + {"field":"subroutinePath","value":"configs/sim/axis/vismach/millturn/remap_subs","m428":0,"m429":1,"m430":-1}, + {"field":"subroutinepath","value":"configs/sim/axis/vismach/millturn/remap_subs","m428":0,"m429":1,"m430":-1}, + {"field":"subroutine_path","value":"configs/sim/axis/vismach/millturn/remap_subs","m428":0,"m429":1,"m430":-1}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/axis/vismach/millturn/remap_subs","m428":0,"m429":1,"m430":-1}, + {"field":"remap","value":"configs/sim/axis/vismach/millturn/remap_subs/429remap.ngc","m428":0,"m429":1,"m430":-1}, {"field":"config","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/puma/puma.ini","m428":0,"m429":1,"m430":2}, @@ -265,6 +421,10 @@ {"field":"switchkins","value":"PUMA (pumakins,switchkins)","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"PUMA","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"pumakins","m428":0,"m429":1,"m430":2}, + {"field":"halFile","value":"configs/sim/axis/vismach/puma/puma_dh.hal","m428":0,"m429":1,"m430":2}, + {"field":"halfile","value":"configs/sim/axis/vismach/puma/puma_dh.hal","m428":0,"m429":1,"m430":2}, + {"field":"hal_file","value":"configs/sim/axis/vismach/puma/puma_dh.hal","m428":0,"m429":1,"m430":2}, + {"field":"HALFILE","value":"configs/sim/axis/vismach/puma/puma_dh.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"puma_dh.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"puma_dh","m428":0,"m429":1,"m430":2}, {"field":"halfile","value":"puma_dh.hal","m428":0,"m429":1,"m430":2}, @@ -273,22 +433,40 @@ {"field":"hal_file","value":"puma_dh","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"puma_dh.hal","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"puma_dh","m428":0,"m429":1,"m430":2}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/puma/puma_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/puma/puma_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/puma/puma_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/puma/puma_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/puma/puma_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"puma_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"puma_postgui","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"puma_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"puma_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"puma_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"puma_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"puma_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"puma_postgui","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"puma_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"puma_postgui","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/puma/remap_subs/428remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/puma/remap_subs","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"configs/sim/axis/vismach/puma","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"puma","m428":0,"m429":1,"m430":2}, + {"field":"subroutinePath","value":"configs/sim/axis/vismach/puma/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutinepath","value":"configs/sim/axis/vismach/puma/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutine_path","value":"configs/sim/axis/vismach/puma/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/axis/vismach/puma/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/puma/remap_subs/429remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/puma/remap_subs/430remap.ngc","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/puma/puma_cube.ini","m428":0,"m429":1,"m430":2}, @@ -298,16 +476,23 @@ {"field":"switchkins","value":"puma_cube.ini","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/puma/puma560.ini","m428":0,"m429":1,"m430":2}, {"field":"machine","value":"puma560 (switchkins) (inch)","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"puma560","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"puma560 (switchkins) (inch)","m428":0,"m429":1,"m430":2}, + {"field":"halFile","value":"configs/sim/axis/vismach/puma/puma560_dh.hal","m428":0,"m429":1,"m430":2}, + {"field":"halfile","value":"configs/sim/axis/vismach/puma/puma560_dh.hal","m428":0,"m429":1,"m430":2}, + {"field":"hal_file","value":"configs/sim/axis/vismach/puma/puma560_dh.hal","m428":0,"m429":1,"m430":2}, + {"field":"HALFILE","value":"configs/sim/axis/vismach/puma/puma560_dh.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"puma560_dh.hal","m428":0,"m429":1,"m430":2}, {"field":"halFile","value":"puma560_dh","m428":0,"m429":1,"m430":2}, {"field":"halfile","value":"puma560_dh.hal","m428":0,"m429":1,"m430":2}, @@ -316,8 +501,15 @@ {"field":"hal_file","value":"puma560_dh","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"puma560_dh.hal","m428":0,"m429":1,"m430":2}, {"field":"HALFILE","value":"puma560_dh","m428":0,"m429":1,"m430":2}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/puma/puma560_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/puma/puma560_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/puma/puma560_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/puma/puma560_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/puma/puma560_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"puma560_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"puma560_postgui","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"puma560_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"puma560_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"puma560_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"puma560_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"puma560_postgui.hal","m428":0,"m429":1,"m430":2}, @@ -326,20 +518,26 @@ {"field":"POSTGUI_HALFILE","value":"puma560_postgui","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/puma/puma560_uvw.ini","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"puma560_uvw","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/axis/vismach/scara/scara.ini","m428":0,"m429":1,"m430":2}, @@ -350,34 +548,71 @@ {"field":"switchkins","value":"SCARA","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"scarakins coordinates=xyzcab","m428":0,"m429":1,"m430":2}, {"field":"switchkins","value":"scarakins","m428":0,"m429":1,"m430":2}, + {"field":"postguiHalFile","value":"configs/sim/axis/vismach/scara/scara_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"configs/sim/axis/vismach/scara/scara_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_halfile","value":"configs/sim/axis/vismach/scara/scara_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postgui_hal_file","value":"configs/sim/axis/vismach/scara/scara_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"POSTGUI_HALFILE","value":"configs/sim/axis/vismach/scara/scara_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"scara_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postguiHalFile","value":"scara_postgui","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"scara_postgui.hal","m428":0,"m429":1,"m430":2}, + {"field":"postguihalfile","value":"scara_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"scara_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_halfile","value":"scara_postgui","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"scara_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"postgui_hal_file","value":"scara_postgui","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"scara_postgui.hal","m428":0,"m429":1,"m430":2}, {"field":"POSTGUI_HALFILE","value":"scara_postgui","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/scara/remap_subs/428remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/scara/remap_subs","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"configs/sim/axis/vismach/scara","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"scara","m428":0,"m429":1,"m430":2}, + {"field":"subroutinePath","value":"configs/sim/axis/vismach/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutinepath","value":"configs/sim/axis/vismach/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutine_path","value":"configs/sim/axis/vismach/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/axis/vismach/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/scara/remap_subs/429remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/axis/vismach/scara/remap_subs/430remap.ngc","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/qtaxis/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/qtaxis/non-trivial/scara/remap_subs/428remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/qtaxis/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, {"field":"remap","value":"configs/sim/qtaxis/non-trivial/scara","m428":0,"m429":1,"m430":2}, + {"field":"subroutinePath","value":"configs/sim/qtaxis/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutinepath","value":"configs/sim/qtaxis/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutine_path","value":"configs/sim/qtaxis/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/qtaxis/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/qtaxis/non-trivial/scara/remap_subs/429remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/qtaxis/non-trivial/scara/remap_subs/430remap.ngc","m428":0,"m429":1,"m430":2}, {"field":"config","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"configPath","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"configpath","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"config_path","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"ini","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFile","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifile","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"iniFileName","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, + {"field":"inifilename","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"ini_file_name","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, {"field":"INI_FILE_NAME","value":"configs/sim/qtvcp_screens/non-trivial/scara/scara.ini","m428":0,"m429":1,"m430":2}, - {"field":"remap","value":"configs/sim/qtvcp_screens/non-trivial/scara","m428":0,"m429":1,"m430":2} + {"field":"remap","value":"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs/428remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/qtvcp_screens/non-trivial/scara","m428":0,"m429":1,"m430":2}, + {"field":"subroutinePath","value":"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutinepath","value":"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"subroutine_path","value":"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"SUBROUTINE_PATH","value":"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs/429remap.ngc","m428":0,"m429":1,"m430":2}, + {"field":"remap","value":"configs/sim/qtvcp_screens/non-trivial/scara/remap_subs/430remap.ngc","m428":0,"m429":1,"m430":2} ] diff --git a/web/src/index.ts b/web/src/index.ts index 27c04ba..4168d78 100644 --- a/web/src/index.ts +++ b/web/src/index.ts @@ -83,20 +83,29 @@ export type CncParseOptions = { machine?: string; config?: string; configPath?: string; + configpath?: string; config_path?: string; ini?: string; iniFile?: string; + inifile?: string; iniFileName?: string; + inifilename?: string; ini_file?: string; ini_file_name?: string; INI_FILE_NAME?: string; halFile?: string; halfile?: string; hal_file?: string; + HALFILE?: string; postguiHalFile?: string; + postguihalfile?: string; postgui_halfile?: string; postgui_hal_file?: string; POSTGUI_HALFILE?: string; + subroutinePath?: string; + subroutinepath?: string; + subroutine_path?: string; + SUBROUTINE_PATH?: string; kinematics?: string; trt?: "xyzbc" | "xyzac" | string; pivotLength?: number; diff --git a/web/src/wasm-core.js b/web/src/wasm-core.js index 745767a..b2ba64d 100644 --- a/web/src/wasm-core.js +++ b/web/src/wasm-core.js @@ -605,20 +605,29 @@ export async function createWasmSimulator(moduleOptions = {}) { ...(options.machine ? { machine: options.machine } : {}), ...(options.config ? { config: options.config } : {}), ...(options.configPath ? { configPath: options.configPath } : {}), + ...(options.configpath ? { configpath: options.configpath } : {}), ...(options.config_path ? { config_path: options.config_path } : {}), ...(options.ini ? { ini: options.ini } : {}), ...(options.iniFile ? { iniFile: options.iniFile } : {}), + ...(options.inifile ? { inifile: options.inifile } : {}), ...(options.iniFileName ? { iniFileName: options.iniFileName } : {}), + ...(options.inifilename ? { inifilename: options.inifilename } : {}), ...(options.ini_file ? { ini_file: options.ini_file } : {}), ...(options.ini_file_name ? { ini_file_name: options.ini_file_name } : {}), ...(options.INI_FILE_NAME ? { INI_FILE_NAME: options.INI_FILE_NAME } : {}), ...(options.halFile ? { halFile: options.halFile } : {}), ...(options.halfile ? { halfile: options.halfile } : {}), ...(options.hal_file ? { hal_file: options.hal_file } : {}), + ...(options.HALFILE ? { HALFILE: options.HALFILE } : {}), ...(options.postguiHalFile ? { postguiHalFile: options.postguiHalFile } : {}), + ...(options.postguihalfile ? { postguihalfile: options.postguihalfile } : {}), ...(options.postgui_halfile ? { postgui_halfile: options.postgui_halfile } : {}), ...(options.postgui_hal_file ? { postgui_hal_file: options.postgui_hal_file } : {}), ...(options.POSTGUI_HALFILE ? { POSTGUI_HALFILE: options.POSTGUI_HALFILE } : {}), + ...(options.subroutinePath ? { subroutinePath: options.subroutinePath } : {}), + ...(options.subroutinepath ? { subroutinepath: options.subroutinepath } : {}), + ...(options.subroutine_path ? { subroutine_path: options.subroutine_path } : {}), + ...(options.SUBROUTINE_PATH ? { SUBROUTINE_PATH: options.SUBROUTINE_PATH } : {}), ...(options.kinematics ? { kinematics: options.kinematics } : {}), ...(options.trt ? { trt: options.trt } : {}), ...(options.pivotLength !== undefined ? { pivotLength: options.pivotLength } : {}),