完善虚拟HAL仿真替代能力
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user