#!/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'