第 6 组:源码链接、构建和文档约束闭环完成

This commit is contained in:
cnc
2026-06-01 06:11:08 +08:00
parent 1498d9830d
commit 4c55ab3435
43 changed files with 8414 additions and 636 deletions

View File

@@ -1,5 +1,6 @@
#include "cnc_sim_api.h"
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <string>
@@ -35,6 +36,31 @@ bool near(double lhs, double rhs) {
return std::fabs(lhs - rhs) < 0.000001;
}
class ScopedEnv {
public:
ScopedEnv(const char *name, const char *value) : name_(name) {
const char *old = std::getenv(name);
if (old) {
had_old_ = true;
old_ = old;
}
setenv(name, value, 1);
}
~ScopedEnv() {
if (had_old_) {
setenv(name_, old_.c_str(), 1);
} else {
unsetenv(name_);
}
}
private:
const char *name_;
bool had_old_ = false;
std::string old_;
};
bool saw_comment_state(const std::vector<CncSimEvent> &events,
int line,
int reserved,
@@ -66,6 +92,79 @@ bool saw_any_kinematics_switch(const std::vector<CncSimEvent> &events, int line)
return false;
}
bool saw_kinematics_switch(const std::vector<CncSimEvent> &events, int line, int kinstype) {
for (const auto &event : events) {
if (event.type == CNC_SIM_EVENT_KINEMATICS_SWITCH &&
event.line == line &&
event.reserved == kinstype) {
return true;
}
}
return false;
}
bool expect_switchkins_remap_config(const std::string &json,
int m428_type,
int m429_type,
int m430_type,
const char *message) {
std::vector<CncSimEvent> events;
CncSimHandle *sim = cnc_sim_create();
cnc_sim_set_event_callback(sim, collect_event, &events);
const char supported_program[] =
"M428\n"
"M429\n";
const char full_program[] =
"M428\n"
"M429\n"
"M430\n";
const char *program = m430_type >= 0 ? full_program : supported_program;
const size_t program_len = m430_type >= 0 ? sizeof(full_program) - 1 : sizeof(supported_program) - 1;
bool ok = true;
const std::string load_message = std::string(message) + " load";
const std::string parse_message = std::string(message) + " parse M428/M429";
const std::string m428_message = std::string(message) + " M428 kinstype";
const std::string m429_message = std::string(message) + " M429 kinstype";
ok &= expect(cnc_sim_load_config_json(sim, json.c_str(), json.size()) == 0, load_message.c_str());
ok &= expect(cnc_sim_parse_program(sim, program, program_len) == 0, parse_message.c_str());
ok &= expect(saw_kinematics_switch(events, 1, m428_type), m428_message.c_str());
ok &= expect(saw_kinematics_switch(events, 2, m429_type), m429_message.c_str());
if (m430_type >= 0) {
const std::string m430_message = std::string(message) + " M430 kinstype";
ok &= expect(saw_kinematics_switch(events, 3, m430_type), m430_message.c_str());
} else {
const std::string m430_reject_message = std::string(message) + " reject M430";
const std::string m430_error_message = std::string(message) + " M430 error";
const std::string m430_no_switch_message = std::string(message) + " M430 no switch";
const std::string mixed_load_message = std::string(message) + " mixed load";
const std::string mixed_reject_message = std::string(message) + " reject mixed M428/M430";
const std::string mixed_error_message = std::string(message) + " mixed M430 error";
const std::string mixed_no_switch_message = std::string(message) + " mixed no partial switch";
events.clear();
ok &= expect(cnc_sim_parse_program(sim, "M430\n", 5) != 0, m430_reject_message.c_str());
// Source: LinuxCNC interp_read.cc reports NCE_M_CODE_GREATER_THAN_199;
// linuxcnc_rs274_backend.cpp preserves the read-stage context.
ok &= expect(std::string(cnc_sim_last_error(sim)) == "read failed: M-code greater than 199: M430",
m430_error_message.c_str());
ok &= expect(!saw_kinematics_switch(events, 1, 2), m430_no_switch_message.c_str());
std::vector<CncSimEvent> mixed_events;
CncSimHandle *mixed_sim = cnc_sim_create();
cnc_sim_set_event_callback(mixed_sim, collect_event, &mixed_events);
ok &= expect(cnc_sim_load_config_json(mixed_sim, json.c_str(), json.size()) == 0,
mixed_load_message.c_str());
ok &= expect(cnc_sim_parse_program(mixed_sim, "M428 M430\n", 9) != 0,
mixed_reject_message.c_str());
ok &= expect(std::string(cnc_sim_last_error(mixed_sim)) == "M-code greater than 199: M430",
mixed_error_message.c_str());
ok &= expect(!saw_any_kinematics_switch(mixed_events, 1), mixed_no_switch_message.c_str());
cnc_sim_destroy(mixed_sim);
}
cnc_sim_destroy(sim);
return ok;
}
} // namespace
int main() {
@@ -1577,6 +1676,35 @@ int main() {
ok &= expect(cnc_sim_load_config_json(sim, config, sizeof(config) - 1) == 0,
cnc_sim_last_error(sim));
{
struct SourceBackedConfigCase {
const char *field;
const char *value;
int m428_type;
int m429_type;
int m430_type;
};
const SourceBackedConfigCase source_cases[] = {
#include "linuxcnc_switchkins_remap_config_cases.inc"
};
for (const SourceBackedConfigCase &source_case : source_cases) {
const std::string json = std::string("{\"backend\":\"linuxcnc-rs274\",\"") +
source_case.field +
"\":\"" +
source_case.value +
"\"}";
const std::string message = std::string("expected LinuxCNC source-backed switchkins remap config for ") +
source_case.field +
"=" +
source_case.value;
ok &= expect_switchkins_remap_config(json,
source_case.m428_type,
source_case.m429_type,
source_case.m430_type,
message.c_str());
}
}
const char exponent_m428_control_program[] =
"G21 G90\n"
"M4.28e2\n";

View File

@@ -1,67 +1,384 @@
// Generated by ./generate-linuxcnc-switchkins-remap-table.sh --config-cases.
// Source: LinuxCNC INI config path, MACHINE, KINEMATICS, and non-LIB HALFILE entries
// for M428/M429/M430 remap #<kinstype> assignments.
// Source: LinuxCNC INI config path, MACHINE, KINEMATICS, non-LIB HALFILE/POSTGUI_HALFILE,
// and adjacent remap_subs entries for M428/M429/M430 #<kinstype> assignments.
{"config", "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},
{"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},
{"machine", "Sim-5Axis Bridge Mill (xyzbcw)", 0, 1, 2},
{"kinematics", "5axiskins coordinates=xyzbcwy", 0, 1, 2},
{"switchkins", "bridgemill", 0, 1, 2},
{"switchkins", "5axis", 0, 1, 2},
{"switchkins", "Sim-5Axis Bridge Mill (xyzbcw)", 0, 1, 2},
{"switchkins", "Sim-5Axis Bridge Mill", 0, 1, 2},
{"switchkins", "5axiskins coordinates=xyzbcwy", 0, 1, 2},
{"switchkins", "5axiskins", 0, 1, 2},
{"halFile", "5axisgui.hal", 0, 1, 2},
{"halFile", "5axisgui", 0, 1, 2},
{"halfile", "5axisgui.hal", 0, 1, 2},
{"halfile", "5axisgui", 0, 1, 2},
{"hal_file", "5axisgui.hal", 0, 1, 2},
{"hal_file", "5axisgui", 0, 1, 2},
{"HALFILE", "5axisgui.hal", 0, 1, 2},
{"HALFILE", "5axisgui", 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", 0, 1, 2},
{"remap", "bridgemill", 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},
{"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},
{"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},
{"machine", "sim-xyzab-tdr-kins (switchkins)", 1, 0, -1},
{"kinematics", "xyzab_tdr_kins", 1, 0, -1},
{"switchkins", "table-dual-rotary", 1, 0, -1},
{"switchkins", "xyzab-tdr", 1, 0, -1},
{"switchkins", "sim-xyzab-tdr-kins (switchkins)", 1, 0, -1},
{"switchkins", "sim-xyzab-tdr-kins", 1, 0, -1},
{"switchkins", "xyzab_tdr_kins", 1, 0, -1},
{"switchkins", "xyzab_tdr", 1, 0, -1},
{"switchkins", "xyzab-tdr-kins", 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", 1, 0, -1},
{"remap", "table-dual-rotary", 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},
{"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},
{"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},
{"machine", "sim-xyzac-trt-kins (switchkins)", 1, 0, 2},
{"kinematics", "xyzac-trt-kins sparm=identityfirst", 1, 0, 2},
{"switchkins", "table-rotary-tilting", 1, 0, 2},
{"switchkins", "xyzac-trt", 1, 0, 2},
{"switchkins", "sim-xyzac-trt-kins (switchkins)", 1, 0, 2},
{"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", "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", 1, 0, 2},
{"remap", "table-rotary-tilting", 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},
{"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},
{"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},
{"machine", "sim-xyzbc-trt-kins (switchkins)", 1, 0, 2},
{"kinematics", "xyzbc-trt-kins sparm=identityfirst", 1, 0, 2},
{"switchkins", "xyzbc-trt", 1, 0, 2},
{"switchkins", "sim-xyzbc-trt-kins (switchkins)", 1, 0, 2},
{"switchkins", "sim-xyzbc-trt-kins", 1, 0, 2},
{"switchkins", "xyzbc-trt-kins sparm=identityfirst", 1, 0, 2},
{"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},
{"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},
{"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},
{"machine", "xyzacb-trsrn (switchkins)", 0, 1, 2},
{"kinematics", "xyzacb_trsrn", 0, 1, 2},
{"switchkins", "xyzacb-trsrn_twp", 0, 1, 2},
{"switchkins", "xyzacb-trsrn", 0, 1, 2},
{"switchkins", "xyzacb-trsrn (switchkins)", 0, 1, 2},
{"switchkins", "xyzacb_trsrn", 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", 0, 1, 2},
{"remap", "table-rotary_spindle-rotary-nutating", 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},
{"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},
{"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},
{"machine", "xyzbca-trsrn (switchkins)", 0, 1, 2},
{"kinematics", "xyzbca_trsrn", 0, 1, 2},
{"switchkins", "xyzbca-trsrn_twp", 0, 1, 2},
{"switchkins", "xyzbca-trsrn", 0, 1, 2},
{"switchkins", "xyzbca-trsrn (switchkins)", 0, 1, 2},
{"switchkins", "xyzbca_trsrn", 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},
{"postgui_hal_file", "xyzbca-trsrn_postgui", 0, 1, 2},
{"POSTGUI_HALFILE", "xyzbca-trsrn_postgui.hal", 0, 1, 2},
{"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},
{"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},
{"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},
{"machine", "hexapod (switchkins)", 0, 1, 2},
{"kinematics", "genhexkins", 0, 1, 2},
{"switchkins", "hexapod-sim", 0, 1, 2},
{"switchkins", "hexapod", 0, 1, 2},
{"switchkins", "hexapod (switchkins)", 0, 1, 2},
{"switchkins", "genhexkins", 0, 1, 2},
{"halFile", "kinematics.hal", 0, 1, 2},
{"halFile", "kinematics", 0, 1, 2},
{"halfile", "kinematics.hal", 0, 1, 2},
{"halfile", "kinematics", 0, 1, 2},
{"hal_file", "kinematics.hal", 0, 1, 2},
{"hal_file", "kinematics", 0, 1, 2},
{"HALFILE", "kinematics.hal", 0, 1, 2},
{"HALFILE", "kinematics", 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", 0, 1, 2},
{"remap", "hexapod-sim", 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},
{"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},
{"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},
{"machine", "melfa (mm)", 0, 1, 2},
{"kinematics", "genserkins", 0, 1, 2},
{"switchkins", "melfa-sim", 0, 1, 2},
{"switchkins", "melfa", 0, 1, 2},
{"switchkins", "melfa (mm)", 0, 1, 2},
{"switchkins", "genserkins", 0, 1, 2},
{"halFile", "melfa_dh.hal", 0, 1, 2},
{"halFile", "melfa_dh", 0, 1, 2},
{"halfile", "melfa_dh.hal", 0, 1, 2},
{"halfile", "melfa_dh", 0, 1, 2},
{"hal_file", "melfa_dh.hal", 0, 1, 2},
{"hal_file", "melfa_dh", 0, 1, 2},
{"HALFILE", "melfa_dh.hal", 0, 1, 2},
{"HALFILE", "melfa_dh", 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", 0, 1, 2},
{"remap", "melfa-sim", 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},
{"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},
{"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},
{"machine", "millturn (mm)", 0, 1, -1},
{"kinematics", "millturn", 0, 1, -1},
{"switchkins", "millturn", 0, 1, -1},
{"switchkins", "millturn (mm)", 0, 1, -1},
{"halFile", "millturn.hal", 0, 1, -1},
{"halFile", "millturn", 0, 1, -1},
{"halfile", "millturn.hal", 0, 1, -1},
{"halfile", "millturn", 0, 1, -1},
{"hal_file", "millturn.hal", 0, 1, -1},
{"hal_file", "millturn", 0, 1, -1},
{"HALFILE", "millturn.hal", 0, 1, -1},
{"HALFILE", "millturn", 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", 0, 1, -1},
{"remap", "millturn", 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},
{"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},
{"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},
{"machine", "PUMA (pumakins,switchkins)", 0, 1, 2},
{"kinematics", "pumakins", 0, 1, 2},
{"switchkins", "puma", 0, 1, 2},
{"switchkins", "PUMA (pumakins,switchkins)", 0, 1, 2},
{"switchkins", "PUMA", 0, 1, 2},
{"switchkins", "pumakins", 0, 1, 2},
{"halFile", "puma_dh.hal", 0, 1, 2},
{"halFile", "puma_dh", 0, 1, 2},
{"halfile", "puma_dh.hal", 0, 1, 2},
{"halfile", "puma_dh", 0, 1, 2},
{"hal_file", "puma_dh.hal", 0, 1, 2},
{"hal_file", "puma_dh", 0, 1, 2},
{"HALFILE", "puma_dh.hal", 0, 1, 2},
{"HALFILE", "puma_dh", 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", 0, 1, 2},
{"remap", "puma", 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},
{"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},
{"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},
{"machine", "puma_cube.ini (pumakins)", 0, 1, 2},
{"switchkins", "puma_cube", 0, 1, 2},
{"switchkins", "puma_cube.ini (pumakins)", 0, 1, 2},
{"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},
{"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},
{"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", "puma560_dh.hal", 0, 1, 2},
{"halFile", "puma560_dh", 0, 1, 2},
{"halfile", "puma560_dh.hal", 0, 1, 2},
{"halfile", "puma560_dh", 0, 1, 2},
{"hal_file", "puma560_dh.hal", 0, 1, 2},
{"hal_file", "puma560_dh", 0, 1, 2},
{"HALFILE", "puma560_dh.hal", 0, 1, 2},
{"HALFILE", "puma560_dh", 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},
{"postgui_hal_file", "puma560_postgui", 0, 1, 2},
{"POSTGUI_HALFILE", "puma560_postgui.hal", 0, 1, 2},
{"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},
{"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},
{"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},
{"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},
{"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},
{"machine", "SCARA (genserkins,switchkins)", 0, 1, 2},
{"kinematics", "scarakins coordinates=xyzcab", 0, 1, 2},
{"switchkins", "scara", 0, 1, 2},
{"switchkins", "SCARA (genserkins,switchkins)", 0, 1, 2},
{"switchkins", "SCARA", 0, 1, 2},
{"switchkins", "scarakins coordinates=xyzcab", 0, 1, 2},
{"switchkins", "scarakins", 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", 0, 1, 2},
{"remap", "scara", 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},
{"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},
{"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", 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},
{"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},
{"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", 0, 1, 2},