按提示词结论接入 INI 参数文件桥
This commit is contained in:
@@ -2,8 +2,11 @@
|
||||
|
||||
#include <cstdlib>
|
||||
#include <cmath>
|
||||
#include <filesystem>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <system_error>
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
@@ -61,6 +64,34 @@ private:
|
||||
std::string old_;
|
||||
};
|
||||
|
||||
class ScopedTempDir {
|
||||
public:
|
||||
explicit ScopedTempDir(const char *prefix) {
|
||||
const char *tmpdir = std::getenv("TMPDIR");
|
||||
std::string tmpl = std::string(tmpdir ? tmpdir : "/tmp") + "/" + prefix + ".XXXXXX";
|
||||
std::vector<char> buffer(tmpl.begin(), tmpl.end());
|
||||
buffer.push_back('\0');
|
||||
char *dir = mkdtemp(buffer.data());
|
||||
if (!dir) {
|
||||
std::perror("mkdtemp");
|
||||
std::exit(1);
|
||||
}
|
||||
path_ = dir;
|
||||
}
|
||||
|
||||
~ScopedTempDir() {
|
||||
std::error_code error;
|
||||
std::filesystem::remove_all(path_, error);
|
||||
}
|
||||
|
||||
std::string file(const char *name) const {
|
||||
return path_ + "/" + name;
|
||||
}
|
||||
|
||||
private:
|
||||
std::string path_;
|
||||
};
|
||||
|
||||
bool saw_comment_state(const std::vector<CncSimEvent> &events,
|
||||
int line,
|
||||
int reserved,
|
||||
@@ -168,6 +199,8 @@ bool expect_switchkins_remap_config(const std::string &json,
|
||||
} // namespace
|
||||
|
||||
int main() {
|
||||
ScopedTempDir temp_dir("cnc_sim_api_linuxcnc_rs274_smoke");
|
||||
|
||||
{
|
||||
std::vector<CncSimEvent> default_events;
|
||||
CncSimHandle *default_sim = cnc_sim_create();
|
||||
@@ -196,6 +229,55 @@ int main() {
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const std::string ini_parameter_var_path = temp_dir.file("ini_parameter.var");
|
||||
{
|
||||
std::ofstream var_file(ini_parameter_var_path);
|
||||
var_file << "5001\t44.000000\n";
|
||||
}
|
||||
const std::string rs274_ini_path = temp_dir.file("rs274_parameter.ini");
|
||||
{
|
||||
std::ofstream ini_file(rs274_ini_path);
|
||||
ini_file << "[RS274NGC]\n";
|
||||
ini_file << "PARAMETER_FILE = " << ini_parameter_var_path << "\n";
|
||||
}
|
||||
std::vector<CncSimEvent> ini_events;
|
||||
CncSimHandle *ini_sim = cnc_sim_create();
|
||||
cnc_sim_set_event_callback(ini_sim, collect_event, &ini_events);
|
||||
const std::string ini_config =
|
||||
std::string("{\"backend\":\"linuxcnc-rs274\",\"iniFileName\":\"") +
|
||||
rs274_ini_path +
|
||||
"\"}";
|
||||
bool ini_ok = true;
|
||||
ini_ok &= expect(cnc_sim_load_config_json(ini_sim, ini_config.c_str(), ini_config.size()) == 0,
|
||||
cnc_sim_last_error(ini_sim));
|
||||
ScopedEnv file_mode_env("CNC_SIM_RS274_FILE_MODE", "1");
|
||||
const char ini_parameter_check_program[] =
|
||||
"G21 G90 G17\n"
|
||||
"F100\n"
|
||||
"G1 X#5001\n";
|
||||
ini_ok &= expect(cnc_sim_parse_program(ini_sim,
|
||||
ini_parameter_check_program,
|
||||
sizeof(ini_parameter_check_program) - 1) == 0,
|
||||
cnc_sim_last_error(ini_sim));
|
||||
bool saw_ini_parameter_restore = false;
|
||||
for (const auto &event : ini_events) {
|
||||
saw_ini_parameter_restore = saw_ini_parameter_restore ||
|
||||
(event.type == CNC_SIM_EVENT_LINEAR_FEED &&
|
||||
event.line == 3 &&
|
||||
near(event.end.x, 44.0));
|
||||
}
|
||||
// LinuxCNC source basis: emctask.cc calls interp.ini_load(), and
|
||||
// rs274ngc_pre.cc ini_load() maps [RS274NGC] PARAMETER_FILE through
|
||||
// SET_PARAMETER_FILE_NAME before rs274_ngc_init() restores parameters.
|
||||
ini_ok &= expect(saw_ini_parameter_restore,
|
||||
"expected LinuxCNC INI PARAMETER_FILE to restore numbered parameters");
|
||||
cnc_sim_destroy(ini_sim);
|
||||
if (!ini_ok) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
const char config[] =
|
||||
"{\"backend\":\"linuxcnc-rs274\",\"rtcp\":{\"enabled\":true,\"toolLength\":100,\"toolLengths\":{\"7\":125}}}";
|
||||
const char program[] =
|
||||
|
||||
Reference in New Issue
Block a user