完善虚拟HAL仿真替代能力

This commit is contained in:
2026-06-17 19:45:51 +08:00
parent 656cddf73a
commit a4d449ad48
17 changed files with 5005 additions and 302 deletions

View File

@@ -550,6 +550,82 @@ char *load_tool_table_with_mode(const char *path, bool random_tool_changer)
return copy_result(output.str());
}
standalone::HalValueKind hal_value_kind_from_name(const char *kind)
{
const std::string value = kind ? kind : "";
if (value == "signal") {
return standalone::HalValueKind::Signal;
}
if (value == "param") {
return standalone::HalValueKind::Param;
}
return standalone::HalValueKind::Pin;
}
hal_type_t hal_type_from_name(const char *type)
{
const std::string value = type ? type : "";
if (value == "HAL_BIT") {
return HAL_BIT;
}
if (value == "HAL_S32") {
return HAL_S32;
}
if (value == "HAL_U32") {
return HAL_U32;
}
if (value == "HAL_S64") {
return HAL_S64;
}
if (value == "HAL_U64") {
return HAL_U64;
}
return HAL_FLOAT;
}
hal_data_u hal_data_from_double(hal_type_t type, double value)
{
hal_data_u data{};
switch (type) {
case HAL_BIT:
data.b = value != 0.0;
break;
case HAL_S32:
data.s = static_cast<int>(value);
break;
case HAL_U32:
data.u = static_cast<unsigned int>(value);
break;
case HAL_S64:
data.ls = static_cast<long long>(value);
break;
case HAL_U64:
data.lu = static_cast<unsigned long long>(value);
break;
case HAL_FLOAT:
default:
data.f = value;
break;
}
return data;
}
void initialize_hal_probe_interp(Interp &interp)
{
interp._setup.length_units = CANON_UNITS_MM;
interp._setup.distance_mode = DISTANCE_MODE::ABSOLUTE;
interp._setup.ijk_distance_mode = DISTANCE_MODE::INCREMENTAL;
interp._setup.feed_mode = FEED_MODE::UNITS_PER_MINUTE;
interp._setup.plane = CANON_PLANE::XY;
interp._setup.motion_mode = G_0;
interp._setup.percent_flag = false;
interp._setup.sequence_number = 0;
interp._setup.parameter_occurrence = 0;
interp._setup.num_spindles = 1;
interp._setup.feature_set = FEATURE_HAL_PIN_VARS;
interp.init_named_parameters();
}
} // namespace
extern "C" {
@@ -1201,6 +1277,39 @@ char *lcinterp_probe_named_parameters(const char *ini_path)
return copy_result(output.str());
}
EMSCRIPTEN_KEEPALIVE
void lcinterp_hal_reset()
{
standalone::reset_hal_adapter();
}
EMSCRIPTEN_KEEPALIVE
int lcinterp_hal_set_value(const char *kind, const char *name, const char *type,
double value, int connected)
{
if (!name || name[0] == '\0') {
return -1;
}
const hal_type_t resolved_type = hal_type_from_name(type);
standalone::set_hal_value(
hal_value_kind_from_name(kind),
name,
resolved_type,
hal_data_from_double(resolved_type, value),
connected != 0);
return 0;
}
EMSCRIPTEN_KEEPALIVE
char *lcinterp_probe_hal_named(const char *name)
{
Interp interp;
initialize_hal_probe_interp(interp);
std::ostringstream output;
append_named_value(output, interp, name ? name : "_hal[missing]");
return copy_result(output.str());
}
EMSCRIPTEN_KEEPALIVE
void lcinterp_free_string(char *value)
{