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