chore: close wasm status contract work

This commit is contained in:
wangdequan
2026-07-08 09:20:47 -04:00
parent 97732ceb0b
commit e69333972c
69 changed files with 20435 additions and 495 deletions

View File

@@ -5,6 +5,7 @@ ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
WRAP_DIR="$ROOT_DIR/runtime/core/linuxcnc_wrap"
SHIM_DIR="$ROOT_DIR/runtime/core/shims"
INCLUDE_DIR="$ROOT_DIR/runtime/core/include"
VENDOR_SRC_DIR="$ROOT_DIR/vendor/linuxcnc/src"
OUT_DIR="$ROOT_DIR/build/wasm/task-hal"
OBJ_DIR="$OUT_DIR/obj"
@@ -22,9 +23,13 @@ COMMON_FLAGS=(
-I"$WRAP_DIR"
-I"$SHIM_DIR"
-I"$INCLUDE_DIR"
-I"$VENDOR_SRC_DIR"
)
SOURCES=(
"$VENDOR_SRC_DIR/emc/task/emccanon_wasm_subset.cc"
"$VENDOR_SRC_DIR/emc/task/emctask_wasm_subset.cc"
"$VENDOR_SRC_DIR/emc/task/taskintf_wasm_subset.cc"
"$WRAP_DIR/linuxcnc_hal_runtime.cpp"
"$WRAP_DIR/linuxcnc_motion_runtime.c"
"$WRAP_DIR/linuxcnc_task_hal_wasm.cpp"
@@ -52,7 +57,7 @@ link_wasm_module \
-s ENVIRONMENT=web,node \
-s ALLOW_MEMORY_GROWTH=1 \
-s NO_EXIT_RUNTIME=1 \
-s EXPORTED_FUNCTIONS='["_malloc","_free","_hal_init","_hal_ready","_hal_exit","_hal_malloc","_hal_pin_bit_new","_hal_pin_float_new","_hal_pin_s32_new","_hal_pin_u32_new","_hal_pin_s64_new","_hal_pin_u64_new","_hal_pin_bit_newf","_hal_pin_float_newf","_hal_pin_s32_newf","_hal_pin_u32_newf","_hal_pin_s64_newf","_hal_pin_u64_newf","_hal_param_bit_new","_hal_param_float_new","_hal_param_s32_new","_hal_param_u32_new","_hal_param_s64_new","_hal_param_u64_new","_hal_param_bit_newf","_hal_param_float_newf","_hal_param_s32_newf","_hal_param_u32_newf","_hal_param_s64_newf","_hal_param_u64_newf","_hal_get_pin_value_by_name","_hal_get_signal_value_by_name","_hal_get_param_value_by_name","_hal_link","_hal_unlink","_hal_set_p","_hal_get_p","_hal_create_thread","_hal_add_funct_to_thread","_hal_del_funct_from_thread","_hal_start_threads","_hal_stop_threads","_lchal_init_runtime","_lchal_load_hal_file","_lchal_set_pin_float","_lchal_set_pin_s32","_lchal_set_pin_bit","_lchal_get_pin_json","_lchal_get_snapshot_json","_lchal_step_threads","_lchal_reset_runtime","_lcmot_init_from_ini","_lcmot_write_command_json","_lcmot_step_servo","_lcmot_read_status_json","_lcmot_read_hal_snapshot_json","_lcmot_reset","_lctask_init_session","_lctask_stage_file","_lctask_open_program","_lctask_load_program_motion_plan_json","_lctask_send_command_json","_lctask_run_cycles","_lctask_read_status_json","_lctask_read_events_json","_lctask_reset_session"]' \
-s EXPORTED_FUNCTIONS='["_malloc","_free","_hal_init","_hal_ready","_hal_exit","_hal_malloc","_hal_pin_bit_new","_hal_pin_float_new","_hal_pin_s32_new","_hal_pin_u32_new","_hal_pin_s64_new","_hal_pin_u64_new","_hal_pin_bit_newf","_hal_pin_float_newf","_hal_pin_s32_newf","_hal_pin_u32_newf","_hal_pin_s64_newf","_hal_pin_u64_newf","_hal_param_bit_new","_hal_param_float_new","_hal_param_s32_new","_hal_param_u32_new","_hal_param_s64_new","_hal_param_u64_new","_hal_param_bit_newf","_hal_param_float_newf","_hal_param_s32_newf","_hal_param_u32_newf","_hal_param_s64_newf","_hal_param_u64_newf","_hal_get_pin_value_by_name","_hal_get_signal_value_by_name","_hal_get_param_value_by_name","_hal_link","_hal_unlink","_hal_set_p","_hal_get_p","_hal_create_thread","_hal_add_funct_to_thread","_hal_del_funct_from_thread","_hal_start_threads","_hal_stop_threads","_lchal_init_runtime","_lchal_load_hal_file","_lchal_set_pin_float","_lchal_set_pin_s32","_lchal_set_pin_bit","_lchal_get_pin_json","_lchal_get_snapshot_json","_lchal_step_threads","_lchal_reset_runtime","_lcmot_init_from_ini","_lcmot_write_command_json","_lcmot_write_linear_move","_lcmot_write_jog_incr","_lcmot_write_joint_home","_lcmot_write_joint_unhome","_lcmot_write_aout","_lcmot_step_servo","_lcmot_read_status_snapshot","_lcmot_read_config_snapshot","_lcmot_read_error_message","_lcmot_read_status_json","_lcmot_read_hal_snapshot_json","_lcmot_reset","_lctask_init_session","_lctask_stage_file","_lctask_open_program","_lctask_load_program_motion_plan_json","_lctask_send_command_json","_lctask_run_cycles","_lctask_read_status_json","_lctask_read_events_json","_lctask_reset_session"]' \
-s EXPORTED_RUNTIME_METHODS='["UTF8ToString","stringToUTF8","lengthBytesUTF8","getValue","setValue"]'
echo "linuxcnc_task_hal_wasm_build=ok"

View File

@@ -0,0 +1,55 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
DOC="$ROOT_DIR/working/09-emc_nml复用评估.md"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
UPSTREAM="$LINUXCNC_ROOT/src/emc/nml_intf/emc_nml.hh"
VENDOR="$ROOT_DIR/vendor/linuxcnc/src/emc/nml_intf/emc_nml.hh"
fail() {
printf 'task_emc_nml_reuse_plan_status=fail\n'
printf 'task_emc_nml_reuse_plan_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emc_nml_reuse_plan_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emc_nml_reuse_plan_%s=ok\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file doc "$DOC"
require_file matrix "$MATRIX"
if [[ -f "$VENDOR" ]]; then
fail "vendor_emc_nml_hh_present_without_reuse_promotion"
fi
printf 'task_emc_nml_reuse_plan_vendor_emc_nml_hh=absent\n'
require_text upstream_has_emc_stat "$UPSTREAM" "class EMC_STAT:public EMC_STAT_MSG"
require_text upstream_has_task_stat "$UPSTREAM" "class EMC_TASK_STAT:public EMC_TASK_STAT_MSG"
require_text upstream_has_motion_stat "$UPSTREAM" "class EMC_MOTION_STAT:public EMC_MOTION_STAT_MSG"
require_text upstream_has_io_stat "$UPSTREAM" "class EMC_IO_STAT:public EMC_IO_STAT_MSG"
require_text doc_choice "$DOC" '暂不直接 include 完整上游 `emc_nml.hh`'
require_text doc_strategy "$DOC" "采用分阶段 typedef / 窄 status 容器"
require_text doc_standalone "$DOC" 'T-007 建立 `StandaloneEmcStatus`'
require_text doc_dependency_nml "$DOC" "libnml/rcs/rcs.hh"
require_text doc_dependency_rs274 "$DOC" "rs274ngc/rs274ngc.hh"
require_text doc_boundary "$DOC" "NML transport"
require_text doc_next_t032 "$DOC" "T-032"
require_text matrix_t029_done "$MATRIX" '| T-029 | 评估 vendored `emc_nml.hh` 直接复用可行性 | 完成 |'
printf 'task_emc_nml_reuse_plan_status=ok\n'

View File

@@ -0,0 +1,79 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emccanon.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_emccanon_dwell_path_control_status=fail\n'
printf 'task_emccanon_dwell_path_control_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emccanon_dwell_path_control_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emccanon_dwell_path_control_%s=ok\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
for fn in \
DWELL \
SET_MOTION_CONTROL_MODE
do
require_text "upstream_$fn" "$UPSTREAM" "$fn"
done
require_text upstream_delay "$UPSTREAM" "EMC_TRAJ_DELAY"
require_text upstream_term_cond "$UPSTREAM" "EMC_TRAJ_SET_TERM_COND"
require_text upstream_interp_list "$UPSTREAM" "interp_list.append"
require_text subset_delay_type "$SUBSET_HDR" "LcEmcCanonSubsetDelay"
require_text subset_term_type "$SUBSET_HDR" "LcEmcCanonSubsetTermCond"
require_text subset_dwell_decl "$SUBSET_HDR" "lc_emccanon_subset_dwell"
require_text subset_path_decl "$SUBSET_HDR" "lc_emccanon_subset_set_motion_control_mode"
require_text subset_anchor_decl "$SUBSET_HDR" "lc_emccanon_subset_dwell_path_control_anchor_list"
require_text subset_dwell_impl "$SUBSET_SRC" "lc_emccanon_subset_dwell"
require_text subset_path_impl "$SUBSET_SRC" "lc_emccanon_subset_set_motion_control_mode"
require_text subset_anchor "$SUBSET_SRC" "DWELL,EMC_TRAJ_DELAY,SET_MOTION_CONTROL_MODE,EMC_TRAJ_SET_TERM_COND,interp_list"
require_text wrapper_dwell_count "$TASK_WRAPPER" "dwellCount"
require_text wrapper_delay_append "$TASK_WRAPPER" "delayAppendCount"
require_text wrapper_path_count "$TASK_WRAPPER" "pathControlCount"
require_text wrapper_term_append "$TASK_WRAPPER" "termCondAppendCount"
require_text wrapper_g4 "$TASK_WRAPPER" "G4"
require_text wrapper_g64 "$TASK_WRAPPER" "G64"
require_text wrapper_g61 "$TASK_WRAPPER" "G61"
require_text wrapper_anchor "$TASK_WRAPPER" "lc_emccanon_subset_dwell_path_control_anchor_list"
require_text wasm_test_status "$WASM_TEST" "emccanon_dwell_path_control_status=ok"
require_text wasm_test_dwell "$WASM_TEST" "dwellCount"
require_text wasm_test_delay "$WASM_TEST" "delayAppendCount"
require_text wasm_test_path "$WASM_TEST" "pathControlCount"
require_text wasm_test_term "$WASM_TEST" "termCondAppendCount"
require_text wasm_test_anchor "$WASM_TEST" "dwellPathControlAnchors"
require_text matrix_t043_done "$MATRIX" '| T-043 | `emccanon.cc` dwell/path-control 子集 | 完成 |'
require_text matrix_t044_done "$MATRIX" '| T-044 | `emccanon.cc` spindle/tool command 子集 | 完成 |'
printf 'task_emccanon_dwell_path_control_status=ok\n'

View File

@@ -0,0 +1,83 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emccanon.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_emccanon_init_finish_unit_status=fail\n'
printf 'task_emccanon_init_finish_unit_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emccanon_init_finish_unit_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emccanon_init_finish_unit_%s=ok\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
for fn in \
INIT_CANON \
ON_RESET \
FINISH \
USE_LENGTH_UNITS \
GET_EXTERNAL_LENGTH_UNITS \
GET_EXTERNAL_ANGLE_UNITS \
GET_EXTERNAL_POSITION \
GET_EXTERNAL_POSITION_X \
GET_EXTERNAL_POSITION_Y \
GET_EXTERNAL_POSITION_Z
do
require_text "upstream_$fn" "$UPSTREAM" "$fn"
done
require_text subset_state "$SUBSET_HDR" "LcEmcCanonSubsetState"
require_text subset_init "$SUBSET_HDR" "lc_emccanon_subset_init"
require_text subset_reset "$SUBSET_HDR" "lc_emccanon_subset_on_reset"
require_text subset_finish "$SUBSET_HDR" "lc_emccanon_subset_finish"
require_text subset_units "$SUBSET_HDR" "lc_emccanon_subset_use_length_units"
require_text subset_position "$SUBSET_HDR" "lc_emccanon_subset_get_external_position"
require_text subset_anchors "$SUBSET_SRC" "INIT_CANON,ON_RESET,FINISH,USE_LENGTH_UNITS,GET_EXTERNAL_LENGTH_UNITS,GET_EXTERNAL_ANGLE_UNITS,GET_EXTERNAL_POSITION"
require_text wrapper_state "$TASK_WRAPPER" "LcEmcCanonSubsetState emccanon_state"
require_text wrapper_init "$TASK_WRAPPER" "lc_emccanon_subset_init"
require_text wrapper_reset "$TASK_WRAPPER" "lc_emccanon_subset_on_reset"
require_text wrapper_finish "$TASK_WRAPPER" "lc_emccanon_subset_finish"
require_text wrapper_position "$TASK_WRAPPER" "lc_emccanon_subset_get_external_position"
require_text wrapper_endpoint "$TASK_WRAPPER" "emccanon_update_endpoint"
require_text wrapper_status_init "$TASK_WRAPPER" "initCount"
require_text wrapper_status_units "$TASK_WRAPPER" "externalLengthUnits"
require_text wrapper_status_endpoint "$TASK_WRAPPER" "\\\"endpoint\\\""
require_text wasm_test_status "$WASM_TEST" "emccanon_init_finish_unit_status=ok"
require_text wasm_test_init "$WASM_TEST" "initCount"
require_text wasm_test_finish "$WASM_TEST" "finishCount"
require_text wasm_test_units "$WASM_TEST" "externalLengthUnits"
require_text wasm_test_endpoint "$WASM_TEST" "endpoint"
require_text matrix_t041_done "$MATRIX" '| T-041 | `emccanon.cc` canon init/finish/unit 子集 | 完成 |'
require_text matrix_t042_done "$MATRIX" '| T-042 | `emccanon.cc` straight traverse/feed 子集 | 完成 |'
printf 'task_emccanon_init_finish_unit_status=ok\n'

View File

@@ -0,0 +1,97 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emccanon.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_emccanon_motion_output_status=fail\n'
printf 'task_emccanon_motion_output_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emccanon_motion_output_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emccanon_motion_output_%s=ok\n' "$label"
}
reject_text() {
local label="$1"
local file="$2"
local text="$3"
if grep -Fq "$text" "$file"; then
fail "$label present"
fi
printf 'task_emccanon_motion_output_%s=absent\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
for fn in \
SET_MOTION_OUTPUT_BIT \
CLEAR_MOTION_OUTPUT_BIT \
SET_AUX_OUTPUT_BIT \
CLEAR_AUX_OUTPUT_BIT \
SET_MOTION_OUTPUT_VALUE \
SET_AUX_OUTPUT_VALUE \
WAIT
do
require_text "upstream_$fn" "$UPSTREAM" "$fn"
done
require_text upstream_dout "$UPSTREAM" "EMC_MOTION_SET_DOUT"
require_text upstream_aout "$UPSTREAM" "EMC_MOTION_SET_AOUT"
require_text upstream_wait "$UPSTREAM" "EMC_AUX_INPUT_WAIT"
require_text upstream_interp_list "$UPSTREAM" "interp_list.append"
require_text subset_output_type "$SUBSET_HDR" "LcEmcCanonSubsetOutputCommand"
require_text subset_motion_bit_decl "$SUBSET_HDR" "lc_emccanon_subset_set_motion_output_bit"
require_text subset_aux_value_decl "$SUBSET_HDR" "lc_emccanon_subset_set_aux_output_value"
require_text subset_wait_decl "$SUBSET_HDR" "lc_emccanon_subset_wait_input"
require_text subset_anchor_decl "$SUBSET_HDR" "lc_emccanon_subset_motion_output_anchor_list"
require_text subset_anchor "$SUBSET_SRC" "EMC_MOTION_SET_DOUT,EMC_MOTION_SET_AOUT,EMC_AUX_INPUT_WAIT,interp_list"
require_text wrapper_output_count "$TASK_WRAPPER" "motionOutputCount"
require_text wrapper_output_append "$TASK_WRAPPER" "motionOutputAppendCount"
require_text wrapper_aout_bridge "$TASK_WRAPPER" "motionOutputTaskintfAoutCount"
require_text wrapper_wait_count "$TASK_WRAPPER" "waitInputCount"
require_text wrapper_issue_helper "$TASK_WRAPPER" "issue_motion_output_from_line"
require_text wrapper_m428_exact "$TASK_WRAPPER" "line_has_m_code(line, 428)"
require_text wrapper_m62_exact "$TASK_WRAPPER" "line_has_m_code(line, 62)"
require_text wrapper_m68_exact "$TASK_WRAPPER" "line_has_m_code(line, 68)"
require_text wrapper_anchor "$TASK_WRAPPER" "lc_emccanon_subset_motion_output_anchor_list"
reject_text wrapper_old_m428_special "$TASK_WRAPPER" 'mdi.find("M428")'
require_text wasm_test_status "$WASM_TEST" "emccanon_motion_output_status=ok"
require_text wasm_test_m428 "$WASM_TEST" "M428"
require_text wasm_test_m62 "$WASM_TEST" "M62 P1"
require_text wasm_test_m66 "$WASM_TEST" "M66 P4 L3 Q0.5"
require_text wasm_test_m68 "$WASM_TEST" "M68 E3 Q2.5"
require_text wasm_test_output_count "$WASM_TEST" "motionOutputCount"
require_text wasm_test_anchor "$WASM_TEST" "motionOutputAnchors"
require_text matrix_t045_done "$MATRIX" '| T-045 | `emccanon.cc` motion output/switchkins 子集 | 完成 |'
require_text matrix_t046_done "$MATRIX" '| T-046 | 移除主路径 JSON motion plan 依赖 | 完成 |'
printf 'task_emccanon_motion_output_status=ok\n'

View File

@@ -0,0 +1,102 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emccanon.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_emccanon_spindle_tool_status=fail\n'
printf 'task_emccanon_spindle_tool_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emccanon_spindle_tool_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emccanon_spindle_tool_%s=ok\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
for fn in \
SET_SPINDLE_SPEED \
START_SPINDLE_CLOCKWISE \
START_SPINDLE_COUNTERCLOCKWISE \
STOP_SPINDLE_TURNING \
SELECT_TOOL \
CHANGE_TOOL \
CHANGE_TOOL_NUMBER \
RELOAD_TOOLDATA
do
require_text "upstream_$fn" "$UPSTREAM" "$fn"
done
for msg in \
EMC_SPINDLE_SPEED \
EMC_SPINDLE_ON \
EMC_SPINDLE_OFF \
EMC_TOOL_PREPARE \
EMC_TOOL_LOAD \
EMC_TOOL_SET_NUMBER \
EMC_TOOL_LOAD_TOOL_TABLE
do
require_text "upstream_$msg" "$UPSTREAM" "$msg"
done
require_text upstream_interp_list "$UPSTREAM" "interp_list.append"
require_text subset_spindle_type "$SUBSET_HDR" "LcEmcCanonSubsetSpindleCommand"
require_text subset_tool_type "$SUBSET_HDR" "LcEmcCanonSubsetToolCommand"
require_text subset_spindle_speed_decl "$SUBSET_HDR" "lc_emccanon_subset_set_spindle_speed"
require_text subset_start_cw_decl "$SUBSET_HDR" "lc_emccanon_subset_start_spindle_clockwise"
require_text subset_start_ccw_decl "$SUBSET_HDR" "lc_emccanon_subset_start_spindle_counterclockwise"
require_text subset_stop_decl "$SUBSET_HDR" "lc_emccanon_subset_stop_spindle_turning"
require_text subset_select_tool_decl "$SUBSET_HDR" "lc_emccanon_subset_select_tool"
require_text subset_change_tool_decl "$SUBSET_HDR" "lc_emccanon_subset_change_tool"
require_text subset_change_number_decl "$SUBSET_HDR" "lc_emccanon_subset_change_tool_number"
require_text subset_reload_decl "$SUBSET_HDR" "lc_emccanon_subset_reload_tooldata"
require_text subset_anchor_decl "$SUBSET_HDR" "lc_emccanon_subset_spindle_tool_anchor_list"
require_text subset_anchor "$SUBSET_SRC" "EMC_SPINDLE_SPEED,EMC_SPINDLE_ON,EMC_SPINDLE_OFF"
require_text subset_tool_anchor "$SUBSET_SRC" "EMC_TOOL_PREPARE,EMC_TOOL_LOAD,EMC_TOOL_SET_NUMBER,EMC_TOOL_LOAD_TOOL_TABLE,interp_list"
require_text wrapper_spindle_count "$TASK_WRAPPER" "spindleCommandCount"
require_text wrapper_spindle_append "$TASK_WRAPPER" "spindleAppendCount"
require_text wrapper_tool_count "$TASK_WRAPPER" "toolCommandCount"
require_text wrapper_tool_append "$TASK_WRAPPER" "toolAppendCount"
require_text wrapper_exact_m_code "$TASK_WRAPPER" "line_has_m_code"
require_text wrapper_m3 "$TASK_WRAPPER" "line_has_m_code(line, 3)"
require_text wrapper_m61 "$TASK_WRAPPER" "line_has_m_code(line, 61)"
require_text wrapper_anchor "$TASK_WRAPPER" "lc_emccanon_subset_spindle_tool_anchor_list"
require_text wasm_test_status "$WASM_TEST" "emccanon_spindle_tool_status=ok"
require_text wasm_test_s_m3 "$WASM_TEST" "S1200 M3"
require_text wasm_test_m5 "$WASM_TEST" "M5"
require_text wasm_test_t_m6 "$WASM_TEST" "T7 M6"
require_text wasm_test_m61 "$WASM_TEST" "M61 Q8"
require_text wasm_test_spindle_count "$WASM_TEST" "spindleCommandCount"
require_text wasm_test_tool_count "$WASM_TEST" "toolCommandCount"
require_text wasm_test_anchor "$WASM_TEST" "spindleToolAnchors"
require_text matrix_t044_done "$MATRIX" '| T-044 | `emccanon.cc` spindle/tool command 子集 | 完成 |'
require_text matrix_t045_done "$MATRIX" '| T-045 | `emccanon.cc` motion output/switchkins 子集 | 完成 |'
printf 'task_emccanon_spindle_tool_status=ok\n'

View File

@@ -0,0 +1,77 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emccanon.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_emccanon_straight_motion_status=fail\n'
printf 'task_emccanon_straight_motion_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emccanon_straight_motion_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emccanon_straight_motion_%s=ok\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
for fn in \
generate_fast_move \
generate_move \
STRAIGHT_TRAVERSE \
STRAIGHT_FEED
do
require_text "upstream_$fn" "$UPSTREAM" "$fn"
done
require_text upstream_linear_move "$UPSTREAM" "EMC_TRAJ_LINEAR_MOVE"
require_text upstream_interp_list "$UPSTREAM" "interp_list.append"
require_text subset_traverse_decl "$SUBSET_HDR" "lc_emccanon_subset_straight_traverse"
require_text subset_feed_decl "$SUBSET_HDR" "lc_emccanon_subset_straight_feed"
require_text subset_linear_move_type "$SUBSET_HDR" "LcEmcCanonSubsetLinearMove"
require_text subset_motion_anchor "$SUBSET_HDR" "lc_emccanon_subset_straight_motion_anchor_list"
require_text subset_traverse_impl "$SUBSET_SRC" "LC_EMCCANON_SUBSET_MOTION_TRAVERSE"
require_text subset_feed_impl "$SUBSET_SRC" "LC_EMCCANON_SUBSET_MOTION_FEED"
require_text subset_linear_anchor "$SUBSET_SRC" "EMC_TRAJ_LINEAR_MOVE,interp_list"
require_text wrapper_traverse_count "$TASK_WRAPPER" "straightTraverseCount"
require_text wrapper_feed_count "$TASK_WRAPPER" "straightFeedCount"
require_text wrapper_append_count "$TASK_WRAPPER" "linearMoveAppendCount"
require_text wrapper_last_command "$TASK_WRAPPER" "lastInterpListCommand"
require_text wrapper_linear_move "$TASK_WRAPPER" "EMC_TRAJ_LINEAR_MOVE"
require_text wrapper_motion_anchor "$TASK_WRAPPER" "lc_emccanon_subset_straight_motion_anchor_list"
require_text wrapper_taskintf_linear "$TASK_WRAPPER" "lc_taskintf_subset_linear_move_ex"
require_text wasm_test_status "$WASM_TEST" "emccanon_straight_motion_status=ok"
require_text wasm_test_traverse "$WASM_TEST" "straightTraverseCount"
require_text wasm_test_feed "$WASM_TEST" "straightFeedCount"
require_text wasm_test_append "$WASM_TEST" "linearMoveAppendCount"
require_text wasm_test_interp_command "$WASM_TEST" "lastInterpListCommand"
require_text matrix_t042_done "$MATRIX" '| T-042 | `emccanon.cc` straight traverse/feed 子集 | 完成 |'
require_text matrix_t043_done "$MATRIX" '| T-043 | `emccanon.cc` dwell/path-control 子集 | 完成 |'
printf 'task_emccanon_straight_motion_status=ok\n'

View File

@@ -0,0 +1,57 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emccanon.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emccanon_wasm_subset.hh"
BUILD_SCRIPT="$ROOT_DIR/tools/build_task_hal_wasm.sh"
print_kv() {
printf '%s=%s\n' "$1" "$2"
}
require_file() {
local key="$1"
local path="$2"
if [[ ! -f "$path" ]]; then
print_kv "$key" missing
print_kv "${key}_path" "$path"
exit 1
fi
print_kv "$key" ok
print_kv "${key}_path" "$path"
}
require_pattern() {
local key="$1"
local pattern="$2"
local path="$3"
if ! rg -q "$pattern" "$path"; then
print_kv "$key" missing
print_kv "${key}_pattern" "$pattern"
print_kv "${key}_path" "$path"
exit 1
fi
print_kv "$key" ok
}
require_file task_emccanon_subset_upstream "$UPSTREAM"
require_file task_emccanon_subset_source "$SUBSET_SRC"
require_file task_emccanon_subset_header "$SUBSET_HDR"
for fn in \
generate_fast_move \
generate_move \
STRAIGHT_TRAVERSE \
STRAIGHT_FEED
do
require_pattern "task_emccanon_subset_upstream_$fn" "$fn" "$UPSTREAM"
require_pattern "task_emccanon_subset_origin_$fn" "$fn" "$SUBSET_SRC"
done
require_pattern task_emccanon_subset_origin_path "src/emc/task/emccanon.cc" "$SUBSET_SRC"
require_pattern task_emccanon_subset_build_included "emccanon_wasm_subset.cc" "$BUILD_SCRIPT"
print_kv task_emccanon_subset_source_reuse ok

View File

@@ -0,0 +1,83 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emctask.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_emctask_plan_open_wait_status=fail\n'
printf 'task_emctask_plan_open_wait_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emctask_plan_open_wait_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emctask_plan_open_wait_%s=ok\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
for fn in \
emcTaskPlanSetWait \
emcTaskPlanIsWait \
emcTaskPlanClearWait \
emcTaskPlanSynch \
emcTaskPlanOpen \
emcTaskPlanClose \
emcTaskPlanReset
do
require_text "upstream_$fn" "$UPSTREAM" "int $fn("
done
require_text subset_plan_state "$SUBSET_HDR" "LcEmcTaskSubsetPlanState"
require_text subset_plan_result "$SUBSET_HDR" "LcEmcTaskSubsetPlanResult"
require_text subset_plan_set_wait "$SUBSET_HDR" "lc_emctask_subset_plan_set_wait"
require_text subset_plan_is_wait "$SUBSET_HDR" "lc_emctask_subset_plan_is_wait"
require_text subset_plan_clear_wait "$SUBSET_HDR" "lc_emctask_subset_plan_clear_wait"
require_text subset_plan_synch "$SUBSET_HDR" "lc_emctask_subset_plan_synch"
require_text subset_plan_open "$SUBSET_HDR" "lc_emctask_subset_plan_open"
require_text subset_plan_close "$SUBSET_HDR" "lc_emctask_subset_plan_close"
require_text subset_plan_reset "$SUBSET_HDR" "lc_emctask_subset_plan_reset"
require_text subset_plan_anchors "$SUBSET_SRC" "emcTaskPlanSetWait,emcTaskPlanIsWait,emcTaskPlanClearWait,emcTaskPlanSynch,emcTaskPlanOpen,emcTaskPlanClose,emcTaskPlanReset"
require_text wrapper_plan_state "$TASK_WRAPPER" "emctask_plan_state_from_runtime"
require_text wrapper_plan_open "$TASK_WRAPPER" "lc_emctask_subset_plan_open"
require_text wrapper_plan_wait "$TASK_WRAPPER" "lc_emctask_subset_plan_set_wait"
require_text wrapper_plan_clear "$TASK_WRAPPER" "lc_emctask_subset_plan_clear_wait"
require_text wrapper_plan_synch "$TASK_WRAPPER" "lc_emctask_subset_plan_synch"
require_text wrapper_plan_close "$TASK_WRAPPER" "lc_emctask_subset_plan_close"
require_text wrapper_plan_reset "$TASK_WRAPPER" "lc_emctask_subset_plan_reset"
require_text wrapper_staged_fs "$TASK_WRAPPER" "state.staged_files.find(path)"
require_text wrapper_status_count "$TASK_WRAPPER" "planIssueCount"
require_text wrapper_status_anchor "$TASK_WRAPPER" "planAnchors"
require_text wasm_test_plan_open "$WASM_TEST" "taskPlanOpen"
require_text wasm_test_plan_wait "$WASM_TEST" "planWaitSetCount"
require_text wasm_test_plan_synch "$WASM_TEST" "planSynchCount"
require_text wasm_test_plan_anchor "$WASM_TEST" "planAnchors"
require_text matrix_t039_done "$MATRIX" '| T-039 | `emctask.cc` plan wait/synch/open/close 子集 | 完成 |'
require_text matrix_t040_done "$MATRIX" '| T-040 | `emctask.cc` plan read/execute 子集 | 完成 |'
printf 'task_emctask_plan_open_wait_status=ok\n'

View File

@@ -0,0 +1,80 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emctask.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
STATE_MATRIX="$ROOT_DIR/tests/wasm/node/verify_task_state_matrix.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_emctask_plan_read_execute_status=fail\n'
printf 'task_emctask_plan_read_execute_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emctask_plan_read_execute_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emctask_plan_read_execute_%s=ok\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file state_matrix "$STATE_MATRIX"
require_file matrix "$MATRIX"
for fn in \
emcTaskPlanRead \
emcTaskPlanExecute \
emcTaskPlanLine \
emcTaskPlanLevel \
emcTaskPlanCommand
do
require_text "upstream_$fn" "$UPSTREAM" "int $fn("
done
require_text upstream_interp_list "$ROOT_DIR/../linuxcnc/src/emc/task/emctaskmain.cc" "interp_list.len()"
require_text subset_plan_io_result "$SUBSET_HDR" "LcEmcTaskSubsetPlanIoResult"
require_text subset_plan_read "$SUBSET_HDR" "lc_emctask_subset_plan_read"
require_text subset_plan_execute "$SUBSET_HDR" "lc_emctask_subset_plan_execute"
require_text subset_plan_line "$SUBSET_HDR" "lc_emctask_subset_plan_line"
require_text subset_plan_level "$SUBSET_HDR" "lc_emctask_subset_plan_level"
require_text subset_plan_command "$SUBSET_HDR" "lc_emctask_subset_plan_command"
require_text subset_plan_read_execute_anchors "$SUBSET_SRC" "emcTaskPlanRead,emcTaskPlanExecute,emcTaskPlanLine,emcTaskPlanLevel,emcTaskPlanCommand,interp_list"
require_text wrapper_read_execute_helper "$TASK_WRAPPER" "emctask_plan_read_execute_program_line"
require_text wrapper_execute_helper "$TASK_WRAPPER" "emctask_plan_execute_command"
require_text wrapper_no_json_run "$TASK_WRAPPER" "state.next_program_line < state.executable_line_count"
require_text wrapper_no_json_issue "$TASK_WRAPPER" "issue_linear_move_from_line"
require_text wrapper_status_read "$TASK_WRAPPER" "planReadCount"
require_text wrapper_status_execute "$TASK_WRAPPER" "planExecuteCount"
require_text wrapper_status_interp_list "$TASK_WRAPPER" "interpListAppendCount"
require_text wrapper_status_anchors "$TASK_WRAPPER" "planReadExecuteAnchors"
require_text wasm_test_no_json "$WASM_TEST" "no-json-plan.ngc"
require_text wasm_test_status "$WASM_TEST" "emctask_plan_read_execute_status=ok"
require_text wasm_test_assert_read "$WASM_TEST" "planReadCount"
require_text wasm_test_assert_execute "$WASM_TEST" "planExecuteCount"
require_text state_matrix_no_json "$STATE_MATRIX" "run_gate_staged_program_executes_without_json_plan=ok"
require_text matrix_t040_done "$MATRIX" '| T-040 | `emctask.cc` plan read/execute 子集 | 完成 |'
require_text matrix_t041_done "$MATRIX" '| T-041 | `emccanon.cc` canon init/finish/unit 子集 | 完成 |'
printf 'task_emctask_plan_read_execute_status=ok\n'

View File

@@ -0,0 +1,64 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emctask.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
STATE_MATRIX="$ROOT_DIR/tests/wasm/node/verify_task_state_matrix.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_emctask_state_mode_status=fail\n'
printf 'task_emctask_state_mode_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emctask_state_mode_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emctask_state_mode_%s=ok\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file state_matrix "$STATE_MATRIX"
require_file matrix "$MATRIX"
for fn in emcTaskAbort emcTaskSetMode emcTaskSetState; do
require_text "upstream_$fn" "$UPSTREAM" "int $fn("
done
require_text subset_result_type "$SUBSET_HDR" "LcEmcTaskSubsetCommandResult"
require_text subset_abort_fn "$SUBSET_HDR" "lc_emctask_subset_abort"
require_text subset_mode_fn "$SUBSET_HDR" "lc_emctask_subset_set_mode"
require_text subset_state_fn "$SUBSET_HDR" "lc_emctask_subset_set_state"
require_text subset_anchor "$SUBSET_SRC" "emcTaskAbort,emcTaskSetMode,emcTaskSetState,emcTaskPlanSynch,emcTaskPlanClose,emcTaskPlanReset"
require_text wrapper_uses_abort "$TASK_WRAPPER" "lc_emctask_subset_abort"
require_text wrapper_uses_mode "$TASK_WRAPPER" "lc_emctask_subset_set_mode"
require_text wrapper_uses_state "$TASK_WRAPPER" "lc_emctask_subset_set_state"
require_text wrapper_result_apply "$TASK_WRAPPER" "apply_emctask_command_result"
require_text wrapper_status_count "$TASK_WRAPPER" "stateModeIssueCount"
require_text wasm_test_asserts "$WASM_TEST" "stateModeAnchors"
require_text state_matrix_gate "$STATE_MATRIX" "task_state_matrix=ok"
require_text matrix_t037_done "$MATRIX" '| T-037 | `emctask.cc` abort/state/mode 子集 | 完成 |'
require_text matrix_t038_done "$MATRIX" '| T-038 | `emctask.cc` determine/update 子集 | 完成 |'
printf 'task_emctask_state_mode_status=ok\n'

View File

@@ -0,0 +1,60 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emctask.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh"
BUILD_SCRIPT="$ROOT_DIR/tools/build_task_hal_wasm.sh"
print_kv() {
printf '%s=%s\n' "$1" "$2"
}
require_file() {
local key="$1"
local path="$2"
if [[ ! -f "$path" ]]; then
print_kv "$key" missing
print_kv "${key}_path" "$path"
exit 1
fi
print_kv "$key" ok
print_kv "${key}_path" "$path"
}
require_pattern() {
local key="$1"
local pattern="$2"
local path="$3"
if ! rg -q "$pattern" "$path"; then
print_kv "$key" missing
print_kv "${key}_pattern" "$pattern"
print_kv "${key}_path" "$path"
exit 1
fi
print_kv "$key" ok
}
require_file task_emctask_subset_upstream "$UPSTREAM"
require_file task_emctask_subset_source "$SUBSET_SRC"
require_file task_emctask_subset_header "$SUBSET_HDR"
require_pattern task_emctask_subset_upstream_determine_mode "EMC_TASK_MODE determineMode\\(" "$UPSTREAM"
require_pattern task_emctask_subset_upstream_determine_state "static EMC_TASK_STATE determineState\\(" "$UPSTREAM"
require_pattern task_emctask_subset_upstream_update "int emcTaskUpdate\\(" "$UPSTREAM"
require_pattern task_emctask_subset_upstream_abort "int emcTaskAbort\\(" "$UPSTREAM"
require_pattern task_emctask_subset_upstream_set_mode "int emcTaskSetMode\\(" "$UPSTREAM"
require_pattern task_emctask_subset_upstream_set_state "int emcTaskSetState\\(" "$UPSTREAM"
require_pattern task_emctask_subset_origin_path "src/emc/task/emctask.cc" "$SUBSET_SRC"
require_pattern task_emctask_subset_origin_determine_mode "determineMode\\(\\)" "$SUBSET_SRC"
require_pattern task_emctask_subset_origin_determine_state "determineState\\(\\)" "$SUBSET_SRC"
require_pattern task_emctask_subset_origin_update "emcTaskUpdate\\(\\)" "$SUBSET_SRC"
require_pattern task_emctask_subset_origin_abort "emcTaskAbort\\(\\)" "$SUBSET_SRC"
require_pattern task_emctask_subset_origin_set_mode "emcTaskSetMode\\(\\)" "$SUBSET_SRC"
require_pattern task_emctask_subset_origin_set_state "emcTaskSetState\\(\\)" "$SUBSET_SRC"
require_pattern task_emctask_subset_state_mode_anchor "emcTaskAbort,emcTaskSetMode,emcTaskSetState" "$SUBSET_SRC"
require_pattern task_emctask_subset_build_included "emctask_wasm_subset.cc" "$BUILD_SCRIPT"
print_kv task_emctask_subset_source_reuse ok

View File

@@ -0,0 +1,56 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/emctask.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/emctask_wasm_subset.hh"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_emctask_update_snapshot_status=fail\n'
printf 'task_emctask_update_snapshot_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_emctask_update_snapshot_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_emctask_update_snapshot_%s=ok\n' "$label"
}
require_file upstream "$UPSTREAM"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
require_text upstream_determine_mode "$UPSTREAM" "EMC_TASK_MODE determineMode("
require_text upstream_determine_state "$UPSTREAM" "static EMC_TASK_STATE determineState("
require_text upstream_update "$UPSTREAM" "int emcTaskUpdate("
require_text subset_update "$SUBSET_HDR" "lc_emctask_subset_update"
require_text subset_update_impl "$SUBSET_SRC" "lc_emctask_subset_update"
require_text wrapper_motion_snapshot_input "$TASK_WRAPPER" "state.motion_snapshot.coord_mode"
require_text wrapper_motion_enabled_input "$TASK_WRAPPER" "state.motion_snapshot.motion_enabled"
require_text wrapper_io_estop_input "$TASK_WRAPPER" "emctask_subset_io_estop"
require_text wrapper_update_source "$TASK_WRAPPER" "motionSnapshot,ioSnapshot"
require_text wrapper_snapshot_count "$TASK_WRAPPER" "snapshotUpdateCount"
require_text wasm_test_asserts_source "$WASM_TEST" "updateInputSource"
require_text wasm_test_asserts_count "$WASM_TEST" "snapshotUpdateCount"
require_text matrix_t038_done "$MATRIX" '| T-038 | `emctask.cc` determine/update 子集 | 完成 |'
require_text matrix_t039_done "$MATRIX" '| T-039 | `emctask.cc` plan wait/synch/open/close 子集 | 完成 |'
printf 'task_emctask_update_snapshot_status=ok\n'

View File

@@ -0,0 +1,30 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
if ! command -v emcc >/dev/null 2>&1 && [[ -f "$HOME/emsdk/emsdk_env.sh" ]]; then
# shellcheck source=/dev/null
source "$HOME/emsdk/emsdk_env.sh" >/dev/null
fi
if ! command -v emcc >/dev/null 2>&1; then
printf 'task_full_closure_status=skipped_missing_emcc\n'
printf 'nativeTaskReady=false\n'
printf 'nativeHalSyncReady=false\n'
exit 0
fi
"$ROOT_DIR/tools/build_task_hal_wasm.sh"
SKIP_TASK_HAL_BUILD=1 "$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.sh"
SKIP_TASK_HAL_BUILD=1 "$ROOT_DIR/tests/wasm/node/verify_task_hal_sdk.sh"
node "$ROOT_DIR/tests/wasm/node/verify_task_state_matrix.mjs"
"$ROOT_DIR/tests/wasm/node/verify_motion_hal_sync.sh"
"$ROOT_DIR/tools/verify_task_standalone_emc_status.sh"
"$ROOT_DIR/tools/verify_task_no_json_motion_plan_main_path.sh"
"$ROOT_DIR/tools/verify_task_status_json_contract.sh"
"$ROOT_DIR/tools/verify_task_working_closure.sh"
"$ROOT_DIR/tools/verify_task_source_reuse_drift_docs.sh"
"$ROOT_DIR/tools/verify_task_hal_readiness_contract.sh"
printf 'task_full_closure_status=ok\n'

View File

@@ -0,0 +1,65 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
DOC="$ROOT_DIR/docs/source-reuse-map.md"
RUNTIME="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
fail() {
printf 'task_hal_readiness_contract_status=fail\n'
printf 'task_hal_readiness_contract_error=%s\n' "$1"
exit 1
}
expect_output_value() {
local output="$1"
local key="$2"
local expected="$3"
local actual
actual="$(printf '%s\n' "$output" | awk -F= -v key="$key" '$1 == key {print $2; found=1} END {if (!found) exit 1}')"
[[ "$actual" == "$expected" ]] || fail "$key expected $expected got $actual"
printf 'task_hal_readiness_%s=%s\n' "$key" "$actual"
}
expect_file_contains() {
local file="$1"
local text="$2"
local label="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_hal_readiness_%s=ok\n' "$label"
}
reject_file_contains() {
local file="$1"
local text="$2"
local label="$3"
if grep -Fq "$text" "$file"; then
fail "$label present"
fi
printf 'task_hal_readiness_%s=absent\n' "$label"
}
manifest_output="$("$ROOT_DIR/tools/verify_task_hal_source_manifest.sh")"
expect_output_value "$manifest_output" task_hal_runtime_promoted 0
expect_output_value "$manifest_output" nativeTaskReady false
expect_output_value "$manifest_output" nativeHalSyncReady false
expect_file_contains "$DOC" 'task_hal_runtime_promoted=0' doc_runtime_promoted_false
expect_file_contains "$DOC" 'nativeTaskReady=false' doc_native_task_false
expect_file_contains "$DOC" 'nativeHalSyncReady=false' doc_native_hal_false
expect_file_contains "$DOC" 'fullLinuxCncProgramExecutionReady=false' doc_full_program_false
expect_file_contains "$DOC" 'Runtime-edge adapter, not full native task/HAL promotion' doc_unpromoted_classification
reject_file_contains "$DOC" 'nativeTaskReady=true' doc_native_task_true
reject_file_contains "$DOC" 'nativeHalSyncReady=true' doc_native_hal_true
reject_file_contains "$DOC" 'full boundary gates now validate' doc_full_boundary_promoted_claim
reject_file_contains "$DOC" 'Native task/motion/HAL sync is complete for deterministic Web simulation' doc_complete_claim
expect_file_contains "$RUNTIME" '"nativeTaskReady\":false' runtime_native_task_false
expect_file_contains "$RUNTIME" '"nativeHalSyncReady\":false' runtime_native_hal_false
expect_file_contains "$RUNTIME" '"fullLinuxCncProgramExecutionReady\":false' runtime_full_program_false
expect_file_contains "$WASM_TEST" 'assert.equal(snapshot.fullLinuxCncProgramExecutionReady, false);' wasm_test_full_program_false
printf 'task_hal_readiness_contract_status=ok\n'

View File

@@ -0,0 +1,75 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
SDK_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_sdk.mjs"
STATE_MATRIX="$ROOT_DIR/tests/wasm/node/verify_task_state_matrix.mjs"
SDK="$ROOT_DIR/runtime/sdk/src/linuxcnc-task-hal.js"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_no_json_motion_plan_main_path_status=fail\n'
printf 'task_no_json_motion_plan_main_path_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_no_json_motion_plan_main_path_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_no_json_motion_plan_main_path_%s=ok\n' "$label"
}
reject_text() {
local label="$1"
local file="$2"
local text="$3"
if grep -Fq "$text" "$file"; then
fail "$label present"
fi
printf 'task_no_json_motion_plan_main_path_%s=absent\n' "$label"
}
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file sdk_test "$SDK_TEST"
require_file state_matrix "$STATE_MATRIX"
require_file sdk "$SDK"
require_file matrix "$MATRIX"
require_text wrapper_plan_read "$TASK_WRAPPER" "emctask_plan_read_execute_program_line"
require_text wrapper_staged_work "$TASK_WRAPPER" "state.next_program_line < state.executable_line_count"
require_text wrapper_timed_compat "$TASK_WRAPPER" "lctask_load_program_motion_plan_json"
require_text wrapper_timed_loader "$TASK_WRAPPER" "load_motion_plan"
reject_text wasm_test_main_load_plan "$WASM_TEST" "lctask_load_program_motion_plan_json"
require_text wasm_test_main_false "$WASM_TEST" "motionPlanLoaded, false"
require_text wasm_test_plan_zero "$WASM_TEST" "planId, 0"
require_text wasm_test_status "$WASM_TEST" "task_hal_no_json_main_path_status=ok"
require_text wasm_test_plan_read "$WASM_TEST" "planReadCount"
require_text wasm_test_plan_execute "$WASM_TEST" "planExecuteCount"
require_text sdk_main_false "$SDK_TEST" "motionPlanLoaded, false"
require_text sdk_plan_zero "$SDK_TEST" "planId, 0"
require_text sdk_compat_call "$SDK_TEST" "loadProgramMotionPlan"
require_text sdk_compat_status "$SDK_TEST" "task_hal_timed_motion_plan_compat=ok"
require_text sdk_keeps_api "$SDK" "loadProgramMotionPlan(plan)"
require_text state_default_no_json "$STATE_MATRIX" "function stageAndOpenProgram({ loadPlan = false } = {})"
require_text state_no_json_status "$STATE_MATRIX" "run_gate_staged_program_executes_without_json_plan=ok"
require_text state_compat_status "$STATE_MATRIX" "run_gate_json_motion_plan_compat=ok"
require_text matrix_t046_done "$MATRIX" '| T-046 | 移除主路径 JSON motion plan 依赖 | 完成 |'
require_text matrix_t007_done "$MATRIX" '| T-007 | 建立 `EMC_STAT` 等价状态容器 | 完成 |'
printf 'task_no_json_motion_plan_main_path_status=ok\n'

View File

@@ -0,0 +1,166 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
SOURCE_REUSE="$ROOT_DIR/docs/source-reuse-map.md"
DRIFT="$ROOT_DIR/docs/drift-report.md"
COMPAT="$ROOT_DIR/docs/compatibility-validation.md"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_source_reuse_drift_docs_status=fail\n'
printf 'task_source_reuse_drift_docs_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_source_reuse_drift_docs_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_source_reuse_drift_docs_%s=ok\n' "$label"
}
reject_text() {
local label="$1"
local file="$2"
local text="$3"
if grep -Fq "$text" "$file"; then
fail "$label present"
fi
printf 'task_source_reuse_drift_docs_%s=absent\n' "$label"
}
require_file source_reuse "$SOURCE_REUSE"
require_file drift "$DRIFT"
require_file compatibility "$COMPAT"
require_file matrix "$MATRIX"
require_text source_task_row "$SOURCE_REUSE" "Task/motion/HAL simulation runtime"
require_text source_readiness_promoted "$SOURCE_REUSE" "task_hal_runtime_promoted=0"
require_text source_native_task_false "$SOURCE_REUSE" "nativeTaskReady=false"
require_text source_native_hal_false "$SOURCE_REUSE" "nativeHalSyncReady=false"
require_text source_full_program_false "$SOURCE_REUSE" "fullLinuxCncProgramExecutionReady=false"
require_text source_rcs_aggregation "$SOURCE_REUSE" "top/task/motion/io DONE/EXEC/ERROR aggregation"
require_text source_standalone_emc_status "$SOURCE_REUSE" 'T-007 adds `StandaloneEmcStatus`'
require_text source_status_json_contract "$SOURCE_REUSE" "T-051 through T-055 close the status JSON contract batches"
require_text source_taskintf_motion_bridge "$SOURCE_REUSE" 'T-033 adds a narrow `taskintf.cc` motion bridge'
require_text source_taskintf_traj_control "$SOURCE_REUSE" 'T-034 extends the `taskintf.cc` traj control subset'
require_text source_taskintf_linear_move "$SOURCE_REUSE" 'T-035 maps `emcTrajLinearMove()` to structured `lcmot_write_linear_move()`'
require_text source_taskintf_jog_home_switchkins "$SOURCE_REUSE" 'T-036 maps `emcJogIncr()`'
require_text source_emctask_state_mode "$SOURCE_REUSE" 'T-037 maps `emcTaskAbort()`'
require_text source_emctask_update_snapshot "$SOURCE_REUSE" 'T-038 feeds `determineMode()`'
require_text source_emctask_plan_open_wait "$SOURCE_REUSE" 'T-039 maps `emcTaskPlanSetWait()`'
require_text source_emctask_plan_read_execute "$SOURCE_REUSE" 'T-040 maps `emcTaskPlanRead()`'
require_text source_emccanon_init_finish_unit "$SOURCE_REUSE" 'T-041 maps `INIT_CANON()`'
require_text source_emccanon_straight_motion "$SOURCE_REUSE" 'T-042 maps `generate_fast_move()`'
require_text source_emccanon_dwell_path_control "$SOURCE_REUSE" 'T-043 maps `DWELL()`'
require_text source_emccanon_spindle_tool "$SOURCE_REUSE" 'T-044 maps `SET_SPINDLE_SPEED()`'
require_text source_emccanon_motion_output "$SOURCE_REUSE" 'T-045 maps `SET_MOTION_OUTPUT_BIT()`'
require_text source_no_json_main_path "$SOURCE_REUSE" 'T-046 removes host-provided JSON motion plans'
require_text source_taskintf_motion_bridge_gate "$SOURCE_REUSE" "tools/verify_task_taskintf_motion_bridge.sh"
require_text source_taskintf_traj_control_gate "$SOURCE_REUSE" "tools/verify_task_taskintf_traj_control.sh"
require_text source_taskintf_linear_move_gate "$SOURCE_REUSE" "tools/verify_task_taskintf_linear_move.sh"
require_text source_taskintf_jog_home_switchkins_gate "$SOURCE_REUSE" "tools/verify_task_taskintf_jog_home_switchkins.sh"
require_text source_emctask_state_mode_gate "$SOURCE_REUSE" "tools/verify_task_emctask_state_mode.sh"
require_text source_emctask_update_snapshot_gate "$SOURCE_REUSE" "tools/verify_task_emctask_update_snapshot.sh"
require_text source_emctask_plan_open_wait_gate "$SOURCE_REUSE" "tools/verify_task_emctask_plan_open_wait.sh"
require_text source_emctask_plan_read_execute_gate "$SOURCE_REUSE" "tools/verify_task_emctask_plan_read_execute.sh"
require_text source_emccanon_init_finish_unit_gate "$SOURCE_REUSE" "tools/verify_task_emccanon_init_finish_unit.sh"
require_text source_emccanon_straight_motion_gate "$SOURCE_REUSE" "tools/verify_task_emccanon_straight_motion.sh"
require_text source_emccanon_dwell_path_control_gate "$SOURCE_REUSE" "tools/verify_task_emccanon_dwell_path_control.sh"
require_text source_emccanon_spindle_tool_gate "$SOURCE_REUSE" "tools/verify_task_emccanon_spindle_tool.sh"
require_text source_emccanon_motion_output_gate "$SOURCE_REUSE" "tools/verify_task_emccanon_motion_output.sh"
require_text source_no_json_main_path_gate "$SOURCE_REUSE" "tools/verify_task_no_json_motion_plan_main_path.sh"
require_text source_standalone_emc_status_gate "$SOURCE_REUSE" "tools/verify_task_standalone_emc_status.sh"
require_text source_status_json_contract_gate "$SOURCE_REUSE" "tools/verify_task_status_json_contract.sh"
require_text source_working_closure_gate "$SOURCE_REUSE" "tools/verify_task_working_closure.sh"
require_text source_full_closure_gate "$SOURCE_REUSE" "tools/verify_task_full_closure.sh"
require_text source_emc_nml_decision "$SOURCE_REUSE" 'full `emc_nml.hh` out of the vendor tree'
require_text source_readiness_gate "$SOURCE_REUSE" "tools/verify_task_hal_readiness_contract.sh"
require_text source_emc_nml_gate "$SOURCE_REUSE" "tools/verify_task_emc_nml_reuse_plan.sh"
require_text source_docs_gate "$SOURCE_REUSE" "tools/verify_task_source_reuse_drift_docs.sh"
reject_text source_native_task_true "$SOURCE_REUSE" "nativeTaskReady=true"
reject_text source_native_hal_true "$SOURCE_REUSE" "nativeHalSyncReady=true"
require_text drift_task_boundary "$DRIFT" "Task/motion/HAL WASM runtime"
require_text drift_standalone_emc_status "$DRIFT" "T-007 StandaloneEmcStatus"
require_text drift_status_json_contract "$DRIFT" "T-051-T-055 status JSON contract"
require_text drift_emc_nml_boundary "$DRIFT" '`emc_nml.hh` status container'
require_text drift_rcs_aggregation "$DRIFT" "top/task/motion/io DONE/EXEC/ERROR aggregation"
require_text drift_taskintf_motion_bridge "$DRIFT" 'T-033 `taskintf.cc` motion bridge'
require_text drift_taskintf_traj_control "$DRIFT" "T-034 traj control mapping"
require_text drift_taskintf_linear_move "$DRIFT" "T-035 linear move mapping"
require_text drift_taskintf_jog_home_switchkins "$DRIFT" "T-036 jog/home/switchkins mapping"
require_text drift_emctask_state_mode "$DRIFT" "T-037 abort/state/mode mapping"
require_text drift_emctask_update_snapshot "$DRIFT" "T-038 determine/update snapshot mapping"
require_text drift_emctask_plan_open_wait "$DRIFT" "T-039 plan wait/open/synch/reset mapping"
require_text drift_emctask_plan_read_execute "$DRIFT" "T-040 plan read/execute/line/level/command mapping"
require_text drift_emccanon_init_finish_unit "$DRIFT" "T-041 canon init/finish/unit/endpoint mapping"
require_text drift_emccanon_straight_motion "$DRIFT" "T-042 straight traverse/feed mapping"
require_text drift_emccanon_dwell_path_control "$DRIFT" "T-043 dwell/path-control mapping"
require_text drift_emccanon_spindle_tool "$DRIFT" "T-044 spindle/tool command mapping"
require_text drift_emccanon_motion_output "$DRIFT" "T-045 motion output/switchkins mapping"
require_text drift_no_json_main_path "$DRIFT" "T-046 makes staged program RUN the default validation path"
require_text drift_readiness_false "$DRIFT" "nativeTaskReady=false"
require_text drift_runtime_promoted_false "$DRIFT" "task_hal_runtime_promoted=0"
require_text drift_no_promotion "$DRIFT" "not promote native task/HAL readiness"
require_text compat_task_hal_wasm "$COMPAT" "tests/wasm/node/verify_task_hal_wasm.sh"
require_text compat_task_hal_sdk "$COMPAT" "tests/wasm/node/verify_task_hal_sdk.sh"
require_text compat_readiness_gate "$COMPAT" "tools/verify_task_hal_readiness_contract.sh"
require_text compat_emc_nml_gate "$COMPAT" "tools/verify_task_emc_nml_reuse_plan.sh"
require_text compat_docs_gate "$COMPAT" "tools/verify_task_source_reuse_drift_docs.sh"
require_text compat_working_closure_gate "$COMPAT" "tools/verify_task_working_closure.sh"
require_text compat_full_closure_gate "$COMPAT" "tools/verify_task_full_closure.sh"
require_text compat_taskintf_motion_bridge_gate "$COMPAT" "tools/verify_task_taskintf_motion_bridge.sh"
require_text compat_taskintf_traj_control_gate "$COMPAT" "tools/verify_task_taskintf_traj_control.sh"
require_text compat_taskintf_linear_move_gate "$COMPAT" "tools/verify_task_taskintf_linear_move.sh"
require_text compat_taskintf_jog_home_switchkins_gate "$COMPAT" "tools/verify_task_taskintf_jog_home_switchkins.sh"
require_text compat_emctask_state_mode_gate "$COMPAT" "tools/verify_task_emctask_state_mode.sh"
require_text compat_emctask_update_snapshot_gate "$COMPAT" "tools/verify_task_emctask_update_snapshot.sh"
require_text compat_emctask_plan_open_wait_gate "$COMPAT" "tools/verify_task_emctask_plan_open_wait.sh"
require_text compat_emctask_plan_read_execute_gate "$COMPAT" "tools/verify_task_emctask_plan_read_execute.sh"
require_text compat_emccanon_init_finish_unit_gate "$COMPAT" "tools/verify_task_emccanon_init_finish_unit.sh"
require_text compat_emccanon_straight_motion_gate "$COMPAT" "tools/verify_task_emccanon_straight_motion.sh"
require_text compat_emccanon_dwell_path_control_gate "$COMPAT" "tools/verify_task_emccanon_dwell_path_control.sh"
require_text compat_emccanon_spindle_tool_gate "$COMPAT" "tools/verify_task_emccanon_spindle_tool.sh"
require_text compat_emccanon_motion_output_gate "$COMPAT" "tools/verify_task_emccanon_motion_output.sh"
require_text compat_no_json_main_path_gate "$COMPAT" "tools/verify_task_no_json_motion_plan_main_path.sh"
require_text compat_standalone_emc_status_gate "$COMPAT" "tools/verify_task_standalone_emc_status.sh"
require_text compat_status_json_contract_gate "$COMPAT" "tools/verify_task_status_json_contract.sh"
require_text compat_taskintf_motion_bridge_status "$COMPAT" "taskintfMotionBridge"
require_text compat_taskintf_traj_control_status "$COMPAT" "taskintf_traj_control_status=ok"
require_text compat_taskintf_linear_move_status "$COMPAT" "taskintf_linear_move_status=ok"
require_text compat_taskintf_jog_home_switchkins_status "$COMPAT" "taskintf_jog_home_switchkins_status=ok"
require_text compat_emccanon_init_finish_unit_status "$COMPAT" "emccanon_init_finish_unit_status=ok"
require_text compat_emccanon_straight_motion_status "$COMPAT" "emccanon_straight_motion_status=ok"
require_text compat_emccanon_dwell_path_control_status "$COMPAT" "emccanon_dwell_path_control_status=ok"
require_text compat_emccanon_spindle_tool_status "$COMPAT" "emccanon_spindle_tool_status=ok"
require_text compat_emccanon_motion_output_status "$COMPAT" "emccanon_motion_output_status=ok"
require_text compat_no_json_main_path_status "$COMPAT" "task_hal_no_json_main_path_status=ok"
require_text compat_standalone_emc_status "$COMPAT" "standalone_emc_status_container=ok"
require_text compat_status_json_contract "$COMPAT" "task_status_json_contract=ok"
require_text compat_working_closure "$COMPAT" "working closure gate"
require_text compat_full_closure "$COMPAT" "task_full_closure_status=ok"
require_text compat_rcs_status "$COMPAT" 'RCS DONE/EXEC/ERROR aggregation through `rcsStatus`'
require_text compat_readiness_false "$COMPAT" "nativeTaskReady=false"
require_text matrix_t030_done "$MATRIX" "| T-030 | 更新 source reuse map 与 drift 文档 | 完成 |"
require_text matrix_t007_done "$MATRIX" "| T-007 | 建立 \`EMC_STAT\` 等价状态容器 | 完成 |"
require_text matrix_t048_done "$MATRIX" "| T-048 | 将 working closure gate 纳入全局文档一致性验证 | 完成 |"
require_text matrix_t049_done "$MATRIX" "| T-049 | 建立 task-HAL 全量闭合验证入口 | 完成 |"
require_text matrix_t051_done "$MATRIX" "| T-051 | SJ-1 规范 \`emcStatus.motion.traj\` | 完成 |"
require_text matrix_t052_done "$MATRIX" "| T-052 | SJ-2 规范 task line 和 interpreter 字段 | 完成 |"
require_text matrix_t053_done "$MATRIX" "| T-053 | SJ-3 规范 \`emcStatus.motion.axis[]\` 和 \`joint[]\` | 完成 |"
require_text matrix_t054_done "$MATRIX" "| T-054 | SJ-4 规范 IO/aux/tool/coolant 边界 | 完成 |"
require_text matrix_t055_done "$MATRIX" "| T-055 | SJ-5 引入 status JSON contract gate | 完成 |"
printf 'task_source_reuse_drift_docs_status=ok\n'

View File

@@ -0,0 +1,72 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
SDK_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_sdk.mjs"
STATE_MATRIX="$ROOT_DIR/tests/wasm/node/verify_task_state_matrix.mjs"
SOURCE_REUSE="$ROOT_DIR/docs/source-reuse-map.md"
DRIFT="$ROOT_DIR/docs/drift-report.md"
COMPAT="$ROOT_DIR/docs/compatibility-validation.md"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_standalone_emc_status_status=fail\n'
printf 'task_standalone_emc_status_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_standalone_emc_status_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_standalone_emc_status_%s=ok\n' "$label"
}
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file sdk_test "$SDK_TEST"
require_file state_matrix "$STATE_MATRIX"
require_file source_reuse "$SOURCE_REUSE"
require_file drift "$DRIFT"
require_file compatibility "$COMPAT"
require_file matrix "$MATRIX"
require_text wrapper_status_struct "$TASK_WRAPPER" "struct StandaloneEmcStatus"
require_text wrapper_task_struct "$TASK_WRAPPER" "struct StandaloneEmcTaskStatus"
require_text wrapper_motion_struct "$TASK_WRAPPER" "struct StandaloneEmcMotionStatus"
require_text wrapper_io_struct "$TASK_WRAPPER" "struct StandaloneEmcIoStatus"
require_text wrapper_sync "$TASK_WRAPPER" "sync_standalone_emc_status"
require_text wrapper_status_source "$TASK_WRAPPER" 'statusSource'
require_text wrapper_emc_status_json "$TASK_WRAPPER" 'emcStatus'
require_text wrapper_task_from_container "$TASK_WRAPPER" "const StandaloneEmcTaskStatus &task_status = emc_status.task"
require_text wrapper_motion_from_container "$TASK_WRAPPER" "const StandaloneEmcMotionStatus &motion = emc_status.motion"
require_text wasm_status "$WASM_TEST" "standalone_emc_status_container=ok"
require_text wasm_source "$WASM_TEST" 'snapshot.statusSource, "StandaloneEmcStatus"'
require_text wasm_top_match "$WASM_TEST" "snapshot.emcStatus.top.status, snapshot.taskTopLevelStatus"
require_text wasm_motion_match "$WASM_TEST" "snapshot.emcStatus.motion.programLine, snapshot.motionStatus.motion.programLine"
require_text sdk_status "$SDK_TEST" "task_hal_sdk_standalone_emc_status=ok"
require_text sdk_source "$SDK_TEST" 'status.statusSource, "StandaloneEmcStatus"'
require_text state_matrix_status "$STATE_MATRIX" "standalone_emc_status_matrix=ok"
require_text state_matrix_helper "$STATE_MATRIX" "function assertStandaloneEmcStatus(status)"
require_text docs_source "$SOURCE_REUSE" 'T-007 adds `StandaloneEmcStatus`'
require_text docs_drift "$DRIFT" "T-007 StandaloneEmcStatus"
require_text docs_compat_gate "$COMPAT" "tools/verify_task_standalone_emc_status.sh"
require_text docs_compat_status "$COMPAT" "standalone_emc_status_container=ok"
require_text matrix_t007_done "$MATRIX" '| T-007 | 建立 `EMC_STAT` 等价状态容器 | 完成 |'
require_text matrix_next_none "$MATRIX" '下一条优先任务:无'
printf 'task_standalone_emc_status_status=ok\n'

View File

@@ -0,0 +1,71 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
SDK="$ROOT_DIR/runtime/sdk/src/linuxcnc-task-hal.js"
fail() {
printf 'task_status_json_contract_status=fail\n'
printf 'task_status_json_contract_error=%s\n' "$1"
exit 1
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_status_json_contract_%s=ok\n' "$label"
}
reject_text() {
local label="$1"
local file="$2"
local text="$3"
if grep -Fq "$text" "$file"; then
fail "$label present"
fi
printf 'task_status_json_contract_%s=absent\n' "$label"
}
if ! command -v emcc >/dev/null 2>&1 && [[ -f "$HOME/emsdk/emsdk_env.sh" ]]; then
# shellcheck source=/dev/null
source "$HOME/emsdk/emsdk_env.sh" >/dev/null
fi
if ! command -v emcc >/dev/null 2>&1; then
printf 'task_status_json_contract_status=skipped_missing_emcc\n'
printf 'nativeTaskReady=false\n'
printf 'nativeHalSyncReady=false\n'
exit 0
fi
if [[ "${SKIP_TASK_HAL_BUILD:-0}" != "1" ]]; then
"$ROOT_DIR/tools/build_task_hal_wasm.sh"
fi
node "$ROOT_DIR/tests/wasm/node/verify_task_status_json_contract.mjs"
require_text schema_version "$TASK_WRAPPER" 'schemaVersion'
require_text standalone_status_source "$TASK_WRAPPER" 'statusSource'
require_text traj_object "$TASK_WRAPPER" 'traj'
require_text task_line_fields "$TASK_WRAPPER" 'currentLine'
require_text axis_array "$TASK_WRAPPER" 'axis_status_array_json'
require_text joint_array "$TASK_WRAPPER" 'joint_status_array_json'
require_text io_aux "$TASK_WRAPPER" 'aux'
require_text io_tool "$TASK_WRAPPER" 'tool'
require_text io_coolant "$TASK_WRAPPER" 'coolant'
read_status_body="$(
awk '/int lctask_read_status_json/{capture=1} capture{print} capture && /^}/{exit}' "$TASK_WRAPPER"
)"
if grep -Fq 'lcmot_read_status_json' <<<"$read_status_body"; then
fail "lctask_read_status_json calls lcmot_read_status_json"
fi
printf 'task_status_json_contract_status_read_no_motion_json=ok\n'
reject_text sdk_no_motion_semantics "$SDK" "queueFull"
reject_text sdk_no_task_semantics "$SDK" "interpState"
printf 'task_status_json_contract_status=ok\n'

View File

@@ -0,0 +1,87 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM_TASKINTF="$LINUXCNC_ROOT/src/emc/task/taskintf.cc"
UPSTREAM_MOTION="$LINUXCNC_ROOT/src/emc/motion/motion.h"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh"
LCMOT_HDR="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h"
LCMOT_SRC="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
BUILD_SCRIPT="$ROOT_DIR/tools/build_task_hal_wasm.sh"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_taskintf_jog_home_switchkins_status=fail\n'
printf 'task_taskintf_jog_home_switchkins_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_taskintf_jog_home_switchkins_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_taskintf_jog_home_switchkins_%s=ok\n' "$label"
}
require_file upstream_taskintf "$UPSTREAM_TASKINTF"
require_file upstream_motion "$UPSTREAM_MOTION"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file lcmot_header "$LCMOT_HDR"
require_file lcmot_source "$LCMOT_SRC"
require_file task_wrapper "$TASK_WRAPPER"
require_file build_script "$BUILD_SCRIPT"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
for fn in emcJogIncr emcJointHome emcJointUnhome emcMotionSetAout; do
require_text "upstream_taskintf_$fn" "$UPSTREAM_TASKINTF" "int $fn("
done
for cmd in EMCMOT_JOG_INCR EMCMOT_JOINT_HOME EMCMOT_JOINT_UNHOME EMCMOT_SET_AOUT; do
require_text "upstream_motion_$cmd" "$UPSTREAM_MOTION" "$cmd"
done
require_text subset_has_unhome_enum "$SUBSET_HDR" "LC_TASKINTF_SUBSET_COMMAND_JOINT_UNHOME"
require_text subset_has_jog_ex "$SUBSET_HDR" "lc_taskintf_subset_jog_incr_ex"
require_text subset_has_unhome_fn "$SUBSET_HDR" "lc_taskintf_subset_joint_unhome"
require_text subset_anchor_list "$SUBSET_SRC" "emcJogIncr,emcJointHome,emcJointUnhome,emcMotionSetAout,EMCMOT_JOG_INCR,EMCMOT_JOINT_HOME,EMCMOT_JOINT_UNHOME,EMCMOT_SET_AOUT,usrmotWriteEmcmotCommand"
require_text lcmot_jog_abi "$LCMOT_HDR" "lcmot_write_jog_incr"
require_text lcmot_home_abi "$LCMOT_HDR" "lcmot_write_joint_home"
require_text lcmot_unhome_abi "$LCMOT_HDR" "lcmot_write_joint_unhome"
require_text lcmot_aout_abi "$LCMOT_HDR" "lcmot_write_aout"
require_text lcmot_jog_impl "$LCMOT_SRC" "int lcmot_write_jog_incr("
require_text lcmot_home_impl "$LCMOT_SRC" "int lcmot_write_joint_home("
require_text lcmot_unhome_impl "$LCMOT_SRC" "int lcmot_write_joint_unhome("
require_text lcmot_aout_impl "$LCMOT_SRC" "int lcmot_write_aout("
require_text wrapper_uses_jog "$TASK_WRAPPER" "lcmot_write_jog_incr"
require_text wrapper_uses_home "$TASK_WRAPPER" "lcmot_write_joint_home"
require_text wrapper_uses_unhome "$TASK_WRAPPER" "lcmot_write_joint_unhome"
require_text wrapper_uses_aout "$TASK_WRAPPER" "lcmot_write_aout"
require_text wrapper_status_count "$TASK_WRAPPER" "jogHomeSwitchkinsStructuredIssueCount"
require_text build_exports_jog "$BUILD_SCRIPT" "_lcmot_write_jog_incr"
require_text build_exports_home "$BUILD_SCRIPT" "_lcmot_write_joint_home"
require_text build_exports_unhome "$BUILD_SCRIPT" "_lcmot_write_joint_unhome"
require_text build_exports_aout "$BUILD_SCRIPT" "_lcmot_write_aout"
require_text wasm_test_prints "$WASM_TEST" "taskintf_jog_home_switchkins_status=ok"
require_text wasm_test_asserts "$WASM_TEST" "jogHomeSwitchkinsAnchors"
require_text wasm_test_m430 "$WASM_TEST" "M430"
require_text matrix_t036_done "$MATRIX" '| T-036 | `taskintf.cc` jog/home/switchkins 子集 | 完成 |'
require_text matrix_t037_done "$MATRIX" '| T-037 | `emctask.cc` abort/state/mode 子集 | 完成 |'
printf 'task_taskintf_jog_home_switchkins_status=ok\n'

View File

@@ -0,0 +1,76 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM_TASKINTF="$LINUXCNC_ROOT/src/emc/task/taskintf.cc"
UPSTREAM_MOTION="$LINUXCNC_ROOT/src/emc/motion/motion.h"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh"
LCMOT_HDR="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h"
LCMOT_SRC="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
BUILD_SCRIPT="$ROOT_DIR/tools/build_task_hal_wasm.sh"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_taskintf_linear_move_status=fail\n'
printf 'task_taskintf_linear_move_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_taskintf_linear_move_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_taskintf_linear_move_%s=ok\n' "$label"
}
require_file upstream_taskintf "$UPSTREAM_TASKINTF"
require_file upstream_motion "$UPSTREAM_MOTION"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file lcmot_header "$LCMOT_HDR"
require_file lcmot_source "$LCMOT_SRC"
require_file task_wrapper "$TASK_WRAPPER"
require_file build_script "$BUILD_SCRIPT"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
require_text upstream_emcTrajLinearMove "$UPSTREAM_TASKINTF" "int emcTrajLinearMove("
require_text upstream_sets_line "$UPSTREAM_TASKINTF" "EMCMOT_SET_LINE"
require_text upstream_writes_command "$UPSTREAM_TASKINTF" "usrmotWriteEmcmotCommand(&emcmotCommand)"
require_text upstream_motion_set_line "$UPSTREAM_MOTION" "EMCMOT_SET_LINE"
require_text subset_linear_move_ex_decl "$SUBSET_HDR" "lc_taskintf_subset_linear_move_ex"
require_text subset_linear_move_ex_impl "$SUBSET_SRC" "lc_taskintf_subset_linear_move_ex"
require_text subset_motion_id_field "$SUBSET_SRC" "out->motion_id = motion_id"
require_text subset_ini_maxvel_field "$SUBSET_SRC" "out->ini_maxvel = ini_maxvel"
require_text subset_linear_anchor "$SUBSET_SRC" "emcTrajLinearMove,EMCMOT_SET_LINE,usrmotWriteEmcmotCommand"
require_text lcmot_linear_abi "$LCMOT_HDR" "lcmot_write_linear_move"
require_text lcmot_linear_impl "$LCMOT_SRC" "int lcmot_write_linear_move("
require_text lcmot_linear_command "$LCMOT_SRC" "command.type = LCMOT_CMD_LINEAR_MOVE"
require_text lcmot_linear_motion_id "$LCMOT_SRC" "next_command_motion_id"
require_text wrapper_structured_issue "$TASK_WRAPPER" "lcmot_write_linear_move"
require_text wrapper_pending_struct "$TASK_WRAPPER" "PendingMotionCommand"
require_text wrapper_linear_count "$TASK_WRAPPER" "linearMoveStructuredIssueCount"
require_text build_exports_linear "$BUILD_SCRIPT" "_lcmot_write_linear_move"
require_text wasm_test_prints_linear "$WASM_TEST" "taskintf_linear_move_status=ok"
require_text wasm_test_asserts_linear "$WASM_TEST" "linearMoveAnchors"
require_text wasm_test_direct_linear "$WASM_TEST" "_lcmot_write_linear_move"
require_text matrix_t035_done "$MATRIX" '| T-035 | `taskintf.cc` linear move issue 子集 | 完成 |'
require_text matrix_t036_done "$MATRIX" '| T-036 | `taskintf.cc` jog/home/switchkins 子集 | 完成 |'
printf 'task_taskintf_linear_move_status=ok\n'

View File

@@ -0,0 +1,86 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM_TASKINTF="$LINUXCNC_ROOT/src/emc/task/taskintf.cc"
UPSTREAM_USRMOT="$LINUXCNC_ROOT/src/emc/motion/usrmotintf.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh"
LCMOT_HDR="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h"
LCMOT_SRC="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
BUILD_SCRIPT="$ROOT_DIR/tools/build_task_hal_wasm.sh"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_taskintf_motion_bridge_status=fail\n'
printf 'task_taskintf_motion_bridge_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_taskintf_motion_bridge_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_taskintf_motion_bridge_%s=ok\n' "$label"
}
require_file upstream_taskintf "$UPSTREAM_TASKINTF"
require_file upstream_usrmot "$UPSTREAM_USRMOT"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file lcmot_header "$LCMOT_HDR"
require_file lcmot_source "$LCMOT_SRC"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file build_script "$BUILD_SCRIPT"
require_file matrix "$MATRIX"
for fn in emcMotionInit emcMotionUpdate emcMotionAbort; do
require_text "upstream_taskintf_$fn" "$UPSTREAM_TASKINTF" "int $fn("
done
for fn in usrmotReadEmcmotStatus usrmotReadEmcmotConfig usrmotReadEmcmotError; do
require_text "upstream_usrmot_$fn" "$UPSTREAM_USRMOT" "$fn"
done
require_text subset_has_motion_init "$SUBSET_HDR" "lc_taskintf_subset_motion_init"
require_text subset_has_motion_update "$SUBSET_HDR" "lc_taskintf_subset_motion_update"
require_text subset_has_motion_abort "$SUBSET_HDR" "lc_taskintf_subset_motion_abort"
require_text subset_init_maps_lcmot "$SUBSET_SRC" "lcmot_init_from_ini"
require_text subset_update_reads_status "$SUBSET_SRC" "lcmot_read_status_snapshot"
require_text subset_update_reads_config "$SUBSET_SRC" "lcmot_read_config_snapshot"
require_text subset_update_reads_error "$SUBSET_SRC" "lcmot_read_error_message"
require_text subset_abort_maps_traj_abort "$SUBSET_SRC" "lc_taskintf_subset_traj_abort(out)"
require_text subset_motion_bridge_anchors "$SUBSET_SRC" "emcMotionInit,emcMotionUpdate,emcMotionAbort,usrmotReadEmcmotStatus,usrmotReadEmcmotConfig,usrmotReadEmcmotError"
require_text lcmot_has_config_type "$LCMOT_HDR" "LcmotConfigSnapshot"
require_text lcmot_has_config_read "$LCMOT_HDR" "lcmot_read_config_snapshot"
require_text lcmot_has_error_read "$LCMOT_HDR" "lcmot_read_error_message"
require_text lcmot_source_config_impl "$LCMOT_SRC" "int lcmot_read_config_snapshot"
require_text lcmot_source_error_impl "$LCMOT_SRC" "int lcmot_read_error_message"
require_text lcmot_source_error_queue "$LCMOT_SRC" "queue_error_message"
require_text wrapper_init_uses_bridge "$TASK_WRAPPER" "lc_taskintf_subset_motion_init"
require_text wrapper_update_uses_bridge "$TASK_WRAPPER" "lc_taskintf_subset_motion_update"
require_text wrapper_abort_uses_bridge "$TASK_WRAPPER" "lc_taskintf_subset_motion_abort"
require_text wrapper_status_exports_bridge "$TASK_WRAPPER" "taskintfMotionBridge"
require_text build_exports_config "$BUILD_SCRIPT" "_lcmot_read_config_snapshot"
require_text build_exports_error "$BUILD_SCRIPT" "_lcmot_read_error_message"
require_text wasm_test_asserts_bridge "$WASM_TEST" "taskintfMotionBridge"
require_text wasm_test_prints_bridge "$WASM_TEST" "taskintf_motion_bridge_status=ok"
require_text matrix_t033_done "$MATRIX" '| T-033 | `taskintf.cc` motion init/update/abort 子集 | 完成 |'
require_text matrix_t034_done "$MATRIX" '| T-034 | `taskintf.cc` traj control 子集 | 完成 |'
printf 'task_taskintf_motion_bridge_status=ok\n'

View File

@@ -0,0 +1,73 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM="$LINUXCNC_ROOT/src/emc/task/taskintf.cc"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh"
BUILD_SCRIPT="$ROOT_DIR/tools/build_task_hal_wasm.sh"
print_kv() {
printf '%s=%s\n' "$1" "$2"
}
require_file() {
local key="$1"
local path="$2"
if [[ ! -f "$path" ]]; then
print_kv "$key" missing
print_kv "${key}_path" "$path"
exit 1
fi
print_kv "$key" ok
print_kv "${key}_path" "$path"
}
require_pattern() {
local key="$1"
local pattern="$2"
local path="$3"
if ! rg -q "$pattern" "$path"; then
print_kv "$key" missing
print_kv "${key}_pattern" "$pattern"
print_kv "${key}_path" "$path"
exit 1
fi
print_kv "$key" ok
}
require_file task_taskintf_subset_upstream "$UPSTREAM"
require_file task_taskintf_subset_source "$SUBSET_SRC"
require_file task_taskintf_subset_header "$SUBSET_HDR"
for fn in \
emcMotionInit \
emcMotionUpdate \
emcMotionAbort \
emcTrajSetMotionId \
emcTrajEnable \
emcTrajDisable \
emcTrajAbort \
emcTrajPause \
emcTrajStep \
emcTrajResume \
emcTrajLinearMove \
emcJogIncr \
emcJointHome \
emcJointUnhome \
emcMotionSetAout
do
require_pattern "task_taskintf_subset_upstream_$fn" "int $fn\\(" "$UPSTREAM"
require_pattern "task_taskintf_subset_origin_$fn" "$fn" "$SUBSET_SRC"
done
require_pattern task_taskintf_subset_origin_path "src/emc/task/taskintf.cc" "$SUBSET_SRC"
require_pattern task_taskintf_subset_build_included "taskintf_wasm_subset.cc" "$BUILD_SCRIPT"
require_pattern task_taskintf_subset_motion_bridge_anchors "emcMotionInit,emcMotionUpdate,emcMotionAbort" "$SUBSET_SRC"
require_pattern task_taskintf_subset_traj_control_anchors "emcTrajSetMotionId,emcTrajEnable,emcTrajDisable,emcTrajAbort,emcTrajPause,emcTrajStep,emcTrajResume" "$SUBSET_SRC"
require_pattern task_taskintf_subset_linear_move_ex "lc_taskintf_subset_linear_move_ex" "$SUBSET_HDR"
require_pattern task_taskintf_subset_linear_move_anchors "emcTrajLinearMove,EMCMOT_SET_LINE,usrmotWriteEmcmotCommand" "$SUBSET_SRC"
require_pattern task_taskintf_subset_jog_home_switchkins_anchors "emcJogIncr,emcJointHome,emcJointUnhome,emcMotionSetAout" "$SUBSET_SRC"
print_kv task_taskintf_subset_source_reuse ok

View File

@@ -0,0 +1,82 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
UPSTREAM_TASKINTF="$LINUXCNC_ROOT/src/emc/task/taskintf.cc"
UPSTREAM_MOTION="$LINUXCNC_ROOT/src/emc/motion/motion.h"
SUBSET_SRC="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.cc"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh"
LCMOT_HDR="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h"
LCMOT_SRC="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c"
TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp"
WASM_TEST="$ROOT_DIR/tests/wasm/node/verify_task_hal_wasm.mjs"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
fail() {
printf 'task_taskintf_traj_control_status=fail\n'
printf 'task_taskintf_traj_control_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_taskintf_traj_control_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_taskintf_traj_control_%s=ok\n' "$label"
}
require_file upstream_taskintf "$UPSTREAM_TASKINTF"
require_file upstream_motion "$UPSTREAM_MOTION"
require_file subset_source "$SUBSET_SRC"
require_file subset_header "$SUBSET_HDR"
require_file lcmot_header "$LCMOT_HDR"
require_file lcmot_source "$LCMOT_SRC"
require_file task_wrapper "$TASK_WRAPPER"
require_file wasm_test "$WASM_TEST"
require_file matrix "$MATRIX"
for fn in emcTrajSetMotionId emcTrajEnable emcTrajDisable emcTrajAbort emcTrajPause emcTrajStep emcTrajResume; do
require_text "upstream_taskintf_$fn" "$UPSTREAM_TASKINTF" "int $fn("
done
for cmd in EMCMOT_ENABLE EMCMOT_DISABLE EMCMOT_ABORT EMCMOT_PAUSE EMCMOT_STEP EMCMOT_RESUME; do
require_text "upstream_motion_$cmd" "$UPSTREAM_MOTION" "$cmd"
done
require_text subset_has_enable_enum "$SUBSET_HDR" "LC_TASKINTF_SUBSET_COMMAND_TRAJ_ENABLE"
require_text subset_has_disable_enum "$SUBSET_HDR" "LC_TASKINTF_SUBSET_COMMAND_TRAJ_DISABLE"
require_text subset_has_motion_id_enum "$SUBSET_HDR" "LC_TASKINTF_SUBSET_COMMAND_TRAJ_SET_MOTION_ID"
require_text subset_has_enable_fn "$SUBSET_HDR" "lc_taskintf_subset_traj_enable"
require_text subset_has_disable_fn "$SUBSET_HDR" "lc_taskintf_subset_traj_disable"
require_text subset_has_motion_id_fn "$SUBSET_HDR" "lc_taskintf_subset_traj_set_motion_id"
require_text subset_anchor_list "$SUBSET_SRC" "emcTrajSetMotionId,emcTrajEnable,emcTrajDisable,emcTrajAbort,emcTrajPause,emcTrajStep,emcTrajResume"
require_text lcmot_snapshot_enabled "$LCMOT_HDR" "motion_enabled"
require_text lcmot_snapshot_next_id "$LCMOT_HDR" "next_motion_id"
require_text lcmot_enable_command "$LCMOT_SRC" "LCMOT_CMD_ENABLE"
require_text lcmot_disable_command "$LCMOT_SRC" "LCMOT_CMD_DISABLE"
require_text lcmot_motion_id_command "$LCMOT_SRC" "LCMOT_CMD_SET_MOTION_ID"
require_text lcmot_accepts_enable "$LCMOT_SRC" "EMC_TRAJ_ENABLE"
require_text lcmot_accepts_disable "$LCMOT_SRC" "EMC_TRAJ_DISABLE"
require_text lcmot_accepts_motion_id "$LCMOT_SRC" "EMC_TRAJ_SET_MOTION_ID"
require_text wrapper_uses_enable "$TASK_WRAPPER" "lc_taskintf_subset_traj_enable"
require_text wrapper_uses_disable "$TASK_WRAPPER" "lc_taskintf_subset_traj_disable"
require_text wrapper_uses_motion_id "$TASK_WRAPPER" "lc_taskintf_subset_traj_set_motion_id"
require_text wrapper_exports_traj_count "$TASK_WRAPPER" "trajControlIssueCount"
require_text wasm_test_prints_traj "$WASM_TEST" "taskintf_traj_control_status=ok"
require_text wasm_test_asserts_traj "$WASM_TEST" "trajControlAnchors"
require_text matrix_t034_done "$MATRIX" '| T-034 | `taskintf.cc` traj control 子集 | 完成 |'
require_text matrix_t035_done "$MATRIX" '| T-035 | `taskintf.cc` linear move issue 子集 | 完成 |'
printf 'task_taskintf_traj_control_status=ok\n'

View File

@@ -0,0 +1,89 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
LINUXCNC_ROOT="${LINUXCNC_ROOT:-$ROOT_DIR/../linuxcnc}"
DOC="$ROOT_DIR/working/10-taskintf-usrmot-shim设计.md"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
README="$ROOT_DIR/working/README.md"
UPSTREAM_HDR="$LINUXCNC_ROOT/src/emc/motion/usrmotintf.h"
UPSTREAM_SRC="$LINUXCNC_ROOT/src/emc/motion/usrmotintf.cc"
TASKINTF_SRC="$LINUXCNC_ROOT/src/emc/task/taskintf.cc"
LCMOT_HDR="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h"
LCMOT_SRC="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c"
SUBSET_HDR="$ROOT_DIR/vendor/linuxcnc/src/emc/task/taskintf_wasm_subset.hh"
fail() {
printf 'task_usrmot_shim_design_status=fail\n'
printf 'task_usrmot_shim_design_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_usrmot_shim_design_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_usrmot_shim_design_%s=ok\n' "$label"
}
require_file doc "$DOC"
require_file matrix "$MATRIX"
require_file upstream_header "$UPSTREAM_HDR"
require_file upstream_source "$UPSTREAM_SRC"
require_file upstream_taskintf "$TASKINTF_SRC"
require_file lcmot_header "$LCMOT_HDR"
require_file lcmot_source "$LCMOT_SRC"
require_file taskintf_subset_header "$SUBSET_HDR"
for fn in \
usrmotIniLoad \
usrmotInit \
usrmotExit \
usrmotWriteEmcmotCommand \
usrmotReadEmcmotStatus \
usrmotReadEmcmotConfig \
usrmotReadEmcmotInternal \
usrmotReadEmcmotError
do
require_text "upstream_header_$fn" "$UPSTREAM_HDR" "$fn"
require_text "upstream_source_$fn" "$UPSTREAM_SRC" "$fn"
require_text "doc_maps_$fn" "$DOC" "$fn"
done
require_text lcmot_has_command_write "$LCMOT_HDR" "lcmot_write_command_json"
require_text lcmot_has_status_snapshot "$LCMOT_HDR" "lcmot_read_status_snapshot"
require_text lcmot_has_init "$LCMOT_HDR" "lcmot_init_from_ini"
require_text lcmot_has_reset "$LCMOT_HDR" "lcmot_reset"
require_text lcmot_source_accepts_emcmot_set_line "$LCMOT_SRC" "EMCMOT_SET_LINE"
require_text lcmot_source_accepts_emcmot_abort "$LCMOT_SRC" "EMCMOT_ABORT"
require_text lcmot_source_accepts_error_injection "$LCMOT_SRC" "EMCMOT_INJECT_ERROR"
require_text subset_has_linear_move "$SUBSET_HDR" "LC_TASKINTF_SUBSET_COMMAND_TRAJ_LINEAR_MOVE"
require_text subset_has_pause "$SUBSET_HDR" "LC_TASKINTF_SUBSET_COMMAND_TRAJ_PAUSE"
require_text subset_has_jog "$SUBSET_HDR" "LC_TASKINTF_SUBSET_COMMAND_JOG_INCR"
require_text doc_command_write "$DOC" "usrmotWriteEmcmotCommand(c)"
require_text doc_command_maps_lcmot "$DOC" "lcmot_write_command_json(json)"
require_text doc_status_read "$DOC" "usrmotReadEmcmotStatus(s)"
require_text doc_status_maps_lcmot "$DOC" "lcmot_read_status_snapshot(&snapshot)"
require_text doc_config_read "$DOC" "usrmotReadEmcmotConfig(s)"
require_text doc_config_gap "$DOC" "lcmot_read_config_snapshot"
require_text doc_error_read "$DOC" "usrmotReadEmcmotError(e)"
require_text doc_error_gap "$DOC" "lcmot_read_error_message"
require_text doc_no_json_status_parse "$DOC" '不用 `lcmot_read_status_json()` 反解析'
require_text doc_no_hal_config "$DOC" "不把 config read 映射成 HAL snapshot"
require_text doc_no_readiness_promotion "$DOC" "nativeTaskReady=true"
require_text readme_lists_doc "$README" "10-taskintf-usrmot-shim设计.md"
require_text matrix_t032_done "$MATRIX" '| T-032 | `taskintf.cc` usrmot shim 设计 | 完成 |'
require_text matrix_t033_done "$MATRIX" '| T-033 | `taskintf.cc` motion init/update/abort 子集 | 完成 |'
printf 'task_usrmot_shim_design_status=ok\n'

View File

@@ -0,0 +1,101 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
MATRIX="$ROOT_DIR/working/04-任务矩阵.md"
README="$ROOT_DIR/working/README.md"
FUNCTIONS="$ROOT_DIR/working/01-项目功能内容.md"
NML_EVAL="$ROOT_DIR/working/09-emc_nml复用评估.md"
LEDGER="$ROOT_DIR/working/03-推进台账.md"
EVIDENCE="$ROOT_DIR/working/05-验收证据.md"
DECISIONS="$ROOT_DIR/working/06-决策记录.md"
fail() {
printf 'task_working_closure_status=fail\n'
printf 'task_working_closure_error=%s\n' "$1"
exit 1
}
require_file() {
local label="$1"
local file="$2"
[[ -f "$file" ]] || fail "$label missing: $file"
printf 'task_working_closure_%s=ok\n' "$label"
}
require_text() {
local label="$1"
local file="$2"
local text="$3"
grep -Fq "$text" "$file" || fail "$label missing"
printf 'task_working_closure_%s=ok\n' "$label"
}
reject_regex() {
local label="$1"
local file="$2"
local regex="$3"
if grep -Eq "$regex" "$file"; then
fail "$label present"
fi
printf 'task_working_closure_%s=absent\n' "$label"
}
require_file matrix "$MATRIX"
require_file readme "$README"
require_file functions "$FUNCTIONS"
require_file nml_eval "$NML_EVAL"
require_file ledger "$LEDGER"
require_file evidence "$EVIDENCE"
require_file decisions "$DECISIONS"
require_text matrix_t007_done "$MATRIX" '| T-007 | 建立 `EMC_STAT` 等价状态容器 | 完成 |'
require_text matrix_t047_done "$MATRIX" '| T-047 | 收口 working 索引与闭合 gate | 完成 |'
require_text matrix_t048_done "$MATRIX" '| T-048 | 将 working closure gate 纳入全局文档一致性验证 | 完成 |'
require_text matrix_t049_done "$MATRIX" '| T-049 | 建立 task-HAL 全量闭合验证入口 | 完成 |'
require_text matrix_t050_done "$MATRIX" '| T-050 | 建立 status JSON LinuxCNC 对标方案 | 完成 |'
require_text matrix_t051_done "$MATRIX" '| T-051 | SJ-1 规范 `emcStatus.motion.traj` | 完成 |'
require_text matrix_t052_done "$MATRIX" '| T-052 | SJ-2 规范 task line 和 interpreter 字段 | 完成 |'
require_text matrix_t053_done "$MATRIX" '| T-053 | SJ-3 规范 `emcStatus.motion.axis[]` 和 `joint[]` | 完成 |'
require_text matrix_t054_done "$MATRIX" '| T-054 | SJ-4 规范 IO/aux/tool/coolant 边界 | 完成 |'
require_text matrix_t055_done "$MATRIX" '| T-055 | SJ-5 引入 status JSON contract gate | 完成 |'
require_text matrix_next_none "$MATRIX" '下一条优先任务:无'
reject_regex matrix_unclosed_tasks "$MATRIX" '^\| T-[0-9]+ \|.*\| (待办|进行中|阻塞) \|'
require_text readme_closed "$README" '当前所有任务均为完成'
require_text readme_status_source "$README" 'StandaloneEmcStatus'
require_text readme_no_json "$README" 'host JSON motion plan 仅保留为 timed-plan 兼容/调试入口'
require_text functions_closed "$FUNCTIONS" '## 当前闭合状态'
require_text functions_standalone_status "$FUNCTIONS" 'StandaloneEmcStatus'
require_text functions_readiness "$FUNCTIONS" 'fullLinuxCncProgramExecutionReady=false'
require_text nml_t007_done "$NML_EVAL" 'T-007 已建立集中 `StandaloneEmcStatus`'
require_text ledger_t007 "$LEDGER" 'T-007 已完成'
require_text ledger_t047 "$LEDGER" 'T-047 已完成'
require_text ledger_t048 "$LEDGER" 'T-048 已完成'
require_text ledger_t049 "$LEDGER" 'T-049 已完成'
require_text ledger_t050 "$LEDGER" 'T-050 已完成'
require_text ledger_t051 "$LEDGER" 'T-051'
require_text ledger_t052 "$LEDGER" 'T-052'
require_text ledger_t053 "$LEDGER" 'T-053'
require_text ledger_t054 "$LEDGER" 'T-054'
require_text ledger_t055 "$LEDGER" 'T-055'
require_text evidence_t007 "$EVIDENCE" 'T-007 验收通过'
require_text evidence_t047 "$EVIDENCE" 'T-047 验收通过'
require_text evidence_t048 "$EVIDENCE" 'T-048 验收通过'
require_text evidence_t049 "$EVIDENCE" 'T-049 验收通过'
require_text evidence_t050 "$EVIDENCE" 'T-050 验收通过'
require_text evidence_t051 "$EVIDENCE" 'T-051'
require_text evidence_t052 "$EVIDENCE" 'T-052'
require_text evidence_t053 "$EVIDENCE" 'T-053'
require_text evidence_t054 "$EVIDENCE" 'T-054'
require_text evidence_t055 "$EVIDENCE" 'T-055'
require_text decision_t007 "$DECISIONS" 'D-039'
require_text decision_t047 "$DECISIONS" 'D-040'
require_text decision_t048 "$DECISIONS" 'D-041'
require_text decision_t049 "$DECISIONS" 'D-042'
require_text decision_t050 "$DECISIONS" 'D-044'
require_text decision_t051_t055 "$DECISIONS" 'D-045'
printf 'task_working_closure_status=ok\n'