diff --git a/check-linuxcnc-wasm-shims-source-map.sh b/check-linuxcnc-wasm-shims-source-map.sh index 4b9256b..c59d444 100755 --- a/check-linuxcnc-wasm-shims-source-map.sh +++ b/check-linuxcnc-wasm-shims-source-map.sh @@ -29,6 +29,13 @@ grep -F 'int _task = 0;' "$linuxcnc_root/src/emc/rs274ngc/gcodemodule.cc" >/dev/ grep -F 'int _task = 1;' "$linuxcnc_root/src/emc/task/emctaskmain.cc" >/dev/null grep -F 'struct _inittab builtin_modules[]' "$linuxcnc_root/src/emc/task/taskclass.cc" >/dev/null grep -F 'int Interp::fetch_hal_param(' "$linuxcnc_root/src/emc/rs274ngc/interp_namedparams.cc" >/dev/null +grep -F 'hal_get_pin_value_by_name(hal_name, &type, &ptr, &conn)' \ + "$linuxcnc_root/src/emc/rs274ngc/interp_namedparams.cc" >/dev/null +grep -F 'hal_get_signal_value_by_name(hal_name, &type, &ptr, &conn)' \ + "$linuxcnc_root/src/emc/rs274ngc/interp_namedparams.cc" >/dev/null +grep -F 'hal_get_param_value_by_name(hal_name, &type, &ptr)' \ + "$linuxcnc_root/src/emc/rs274ngc/interp_namedparams.cc" >/dev/null +grep -F 'HAL_TYPE_UNINITIALIZED = 0,' "$linuxcnc_root/include/hal.h" >/dev/null grep -F 'wordexp(basename, &exp_result, 0);' "$linuxcnc_root/src/emc/rs274ngc/rs274ngc_pre.cc" >/dev/null grep -F 'EMC_STAT *emcStatus = new EMC_STAT;' "$linuxcnc_root/src/emc/sai/dummyemcstat.cc" >/dev/null grep -F 'NMLmsg::NMLmsg' "$linuxcnc_root/src/libnml/nml/nmlmsg.cc" >/dev/null @@ -71,6 +78,7 @@ expected_shims = { "src/emc/task/emctaskmain.cc", "src/emc/task/taskclass.cc", "src/emc/rs274ngc/interp_namedparams.cc", + "include/hal.h", "src/hal/hal_lib.c", "src/emc/rs274ngc/rs274ngc_pre.cc", ], @@ -123,6 +131,7 @@ for phrase in [ "RS274/WASM manifest", "browser-safe LinuxCNC adaptations", "dynamic loading unavailable", + "unavailable HAL lookup", "inactive-DB return values", "negative-status short-circuit behavior", ]: diff --git a/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc b/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc index 9316c1b..d664cda 100644 --- a/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc +++ b/core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc @@ -1,4 +1,5 @@ #include "cnc_sim_api.h" +#include "hal.h" #include #include @@ -9,6 +10,8 @@ // LinuxCNC source basis: src/emc/rs274ngc/rs274ngc_pre.cc provides read(), // execute(), and wordexp() paths; interp_convert.cc converts G0, G2, and M30. +// src/emc/rs274ngc/interp_namedparams.cc calls the HAL lookup functions +// declared in include/hal.h and implemented by src/hal/hal_lib.c. namespace { int collect_event(const CncSimEvent *event, void *user_data) { @@ -57,6 +60,46 @@ bool wordexp_expands_environment_variables() { return ok; } +bool hal_lookup_is_unavailable() { + if (hal_init("cnc_sim_wasm_runtime_probe") != 1) { + return false; + } + if (hal_ready(1) != 0) { + return false; + } + + hal_data_u dummy{}; + hal_data_u *data = &dummy; + hal_type_t type = HAL_FLOAT; + bool connected = true; + if (hal_get_pin_value_by_name("cnc-sim.missing-pin", &type, &data, &connected) != -1 || + type != HAL_TYPE_UNINITIALIZED || + data != nullptr || + connected) { + return false; + } + + data = &dummy; + type = HAL_FLOAT; + bool has_writers = true; + if (hal_get_signal_value_by_name("cnc-sim.missing-signal", &type, &data, &has_writers) != -1 || + type != HAL_TYPE_UNINITIALIZED || + data != nullptr || + has_writers) { + return false; + } + + data = &dummy; + type = HAL_FLOAT; + if (hal_get_param_value_by_name("cnc-sim.missing-param", &type, &data) != -1 || + type != HAL_TYPE_UNINITIALIZED || + data != nullptr) { + return false; + } + + return true; +} + } // namespace int main() { @@ -66,6 +109,9 @@ int main() { if (!wordexp_expands_environment_variables()) { return 6; } + if (!hal_lookup_is_unavailable()) { + return 7; + } std::vector events; CncSimHandle *sim = cnc_sim_create(); diff --git a/docs/linuxcnc-wasm-shims-source-map.md b/docs/linuxcnc-wasm-shims-source-map.md index dffccfa..5613ba3 100644 --- a/docs/linuxcnc-wasm-shims-source-map.md +++ b/docs/linuxcnc-wasm-shims-source-map.md @@ -17,7 +17,7 @@ only; it must not add CNC behavior and must not expand the temporary smoke parse | `core/wasm_shims/dlfcn.cc` | `src/emc/rs274ngc/interp_base.cc` | Satisfies native `dlopen` symbols for browser-safe probes while keeping dynamic loading unavailable. | | `core/wasm_shims/emc_status_shim.cc` | `src/emc/sai/dummyemcstat.cc` | Provides the source-backed `emcStatus` singleton shape without task/NML startup. | | `core/wasm_shims/gettext_shim.cc` | `src/emc/rs274ngc/interp_internal.hh` | Preserves LinuxCNC diagnostic call sites without browser gettext catalogs. | -| `core/wasm_shims/linuxcnc_runtime_shim.cc` | `src/emc/rs274ngc/gcodemodule.cc`, `src/emc/task/emctaskmain.cc`, `src/emc/task/taskclass.cc`, `src/emc/rs274ngc/interp_namedparams.cc`, `src/hal/hal_lib.c`, `src/emc/rs274ngc/rs274ngc_pre.cc` | Keeps preview/task, builtin Python module, HAL lookup, and `wordexp()` edges compile-safe. | +| `core/wasm_shims/linuxcnc_runtime_shim.cc` | `src/emc/rs274ngc/gcodemodule.cc`, `src/emc/task/emctaskmain.cc`, `src/emc/task/taskclass.cc`, `src/emc/rs274ngc/interp_namedparams.cc`, `include/hal.h`, `src/hal/hal_lib.c`, `src/emc/rs274ngc/rs274ngc_pre.cc` | Keeps preview/task, builtin Python module, unavailable HAL lookup, and `wordexp()` edges compile-safe. | | `core/wasm_shims/nml_status_shim.cc` | `src/libnml/nml/nmlmsg.cc`, `src/libnml/nml/stat_msg.cc` | Provides NML status constructors needed by source-linked EMC status objects. | | `core/wasm_shims/python_c_api_shim.cc` | `src/emc/rs274ngc/interp_python.cc`, `src/emc/rs274ngc/interp_namedparams.cc`, `src/emc/rs274ngc/gcodemodule.cc`, `src/emc/pythonplugin/python_plugin.cc` | Satisfies Python C API symbols while Python/Boost.Python remap paths remain tracked blockers. | | `core/wasm_shims/rcs_print_shim.cc` | `src/libnml/rcs/rcs_print.cc` | Provides LinuxCNC RCS print diagnostics used by NML validation. | diff --git a/test-linuxcnc-wasm-cmake-safe-probe.sh b/test-linuxcnc-wasm-cmake-safe-probe.sh index a753c3b..fb8218b 100755 --- a/test-linuxcnc-wasm-cmake-safe-probe.sh +++ b/test-linuxcnc-wasm-cmake-safe-probe.sh @@ -1531,6 +1531,10 @@ grep -F 'LinuxCNC source basis: src/emc/rs274ngc/interp_base.cc native loader fl grep -F 'LinuxCNC source basis: src/emc/rs274ngc/gcodemodule.cc defines _task=0' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null grep -F 'LinuxCNC source basis: src/emc/task/taskclass.cc and' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null grep -F 'LinuxCNC source basis: src/emc/rs274ngc/interp_namedparams.cc fetch_hal_param()' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null +grep -F 'src/emc/rs274ngc/interp_namedparams.cc calls the HAL lookup functions' core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc >/dev/null +grep -F 'bool hal_lookup_is_unavailable()' core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc >/dev/null +grep -F 'hal_get_pin_value_by_name("cnc-sim.missing-pin", &type, &data, &connected) != -1' core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc >/dev/null +grep -F 'type != HAL_TYPE_UNINITIALIZED' core/wasm_shims/cnc_sim_wasm_runtime_probe_main.cc >/dev/null grep -F 'LinuxCNC source basis: src/emc/rs274ngc/rs274ngc_pre.cc uses wordexp()' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null grep -F 'extern "C" int wordexp(const char *words, wordexp_t *pwordexp, int)' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null grep -F 'extern "C" void wordfree(wordexp_t *pwordexp)' core/wasm_shims/linuxcnc_runtime_shim.cc >/dev/null