From a1afcbf5dade435eb0b92e0ef29d6836988e4a3b Mon Sep 17 00:00:00 2001 From: wangdequan Date: Sun, 7 Jun 2026 16:07:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8E=A7=E7=B3=BB=E7=BB=9F=E4=BB=BF?= =?UTF-8?q?=E7=9C=9F=E8=BD=AF=E4=BB=B6=EF=BC=8C=E4=BB=8Elinuxcnc=E7=A7=BB?= =?UTF-8?q?=E6=A4=8D=E8=BF=87=E6=9D=A5=E7=9A=84=E3=80=82=E4=B8=BB=E8=A6=81?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=BF=85?= =?UTF-8?q?=E9=A1=BB=E7=9B=B4=E6=8E=A5=E6=9D=A5=E6=BA=90=E4=BA=8Elinuxcnc?= =?UTF-8?q?=E7=9A=84=E6=BA=90=E7=A8=8B=E5=BA=8F=E3=80=82=E4=B8=8D=E8=A6=81?= =?UTF-8?q?=E8=87=AA=E5=B7=B1=E7=BC=96=E5=86=99=E3=80=82=E8=BF=99=E6=98=AF?= =?UTF-8?q?=E4=B8=80=E6=9D=A1=E9=93=81=E7=9A=84=E7=BA=AA=E5=BE=8B=E3=80=82?= =?UTF-8?q?=E6=8C=81=E7=BB=AD=E6=8E=A8=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结论:已新增直接调用 LinuxCNC tpAddLine/tpRunCycle 的多段队列验证,覆盖两段线性运动排队、执行完成、队列清空和终点到达,并通过 native probes 全量验证。 --- .../linuxcnc_wrap/linuxcnc_tp_api_probe.cpp | 100 +++++++++++++++++- .../tests/native/verify_native_probes.sh | 7 ++ 2 files changed, 103 insertions(+), 4 deletions(-) diff --git a/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tp_api_probe.cpp b/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tp_api_probe.cpp index 120476a..d5feaac 100644 --- a/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tp_api_probe.cpp +++ b/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tp_api_probe.cpp @@ -28,6 +28,9 @@ double axis_acc_limit(int axis) void init_motion_state() { + status = {}; + config = {}; + config.numJoints = 3; config.numSpindles = 1; config.numDIO = 4; @@ -61,6 +64,13 @@ void init_motion_state() axis_acc_limit); } +int pose_near(EmcPose const &actual, EmcPose const &expected) +{ + return std::fabs(actual.tran.x - expected.tran.x) < 1e-9 && + std::fabs(actual.tran.y - expected.tran.y) < 1e-9 && + std::fabs(actual.tran.z - expected.tran.z) < 1e-9; +} + void run_linear_probe() { init_motion_state(); @@ -171,10 +181,7 @@ void run_arc_probe() EmcPose final_pos{}; const int get_pos_rc = tpGetPos(&tp, &final_pos); - const int near_end = - std::fabs(final_pos.tran.x - end.tran.x) < 1e-9 && - std::fabs(final_pos.tran.y - end.tran.y) < 1e-9 && - std::fabs(final_pos.tran.z - end.tran.z) < 1e-9; + const int near_end = pose_near(final_pos, end); std::cout << "tp_arc_create=" << create_rc << "\n"; std::cout << "tp_arc_set_cycle_time=" << set_cycle_rc << "\n"; @@ -196,6 +203,90 @@ void run_arc_probe() << final_pos.tran.z << "\n"; } +void run_queued_lines_probe() +{ + init_motion_state(); + + TP_STRUCT tp{}; + EmcPose start{}; + EmcPose end1{}; + EmcPose end2{}; + struct state_tag_t tag {}; + + end1.tran.x = 1.0; + end2.tran.x = 1.0; + end2.tran.y = 1.0; + + const int create_rc = tpCreate(&tp, TP_DEFAULT_QUEUE_SIZE, 3); + const int set_cycle_rc = tpSetCycleTime(&tp, 0.001); + const int set_pos_rc = tpSetPos(&tp, &start); + const int set_vmax_rc = tpSetVmax(&tp, 1.0, 1.0); + const int set_vlimit_rc = tpSetVlimit(&tp, 1.0); + const int set_amax_rc = tpSetAmax(&tp, 10.0); + const int set_term_rc = tpSetTermCond(&tp, TC_TERM_COND_STOP, 0.0); + const int add_line1_rc = tpAddLine( + &tp, + end1, + EMC_MOTION_TYPE_FEED, + 1.0, + 1.0, + 10.0, + 100.0, + status.enables_new, + 0, + -1, + tag); + const int depth_after_line1 = tpQueueDepth(&tp); + const int add_line2_rc = tpAddLine( + &tp, + end2, + EMC_MOTION_TYPE_FEED, + 1.0, + 1.0, + 10.0, + 100.0, + status.enables_new, + 0, + -1, + tag); + const int depth_after_line2 = tpQueueDepth(&tp); + + int cycle_rc = 0; + int cycles = 0; + for (; cycles < 20000 && !tpIsDone(&tp); ++cycles) { + cycle_rc = tpRunCycle(&tp, 1000000); + if (cycle_rc < 0) { + break; + } + } + + EmcPose final_pos{}; + const int get_pos_rc = tpGetPos(&tp, &final_pos); + const int near_end = pose_near(final_pos, end2); + + std::cout << "tp_queue_create=" << create_rc << "\n"; + std::cout << "tp_queue_set_cycle_time=" << set_cycle_rc << "\n"; + std::cout << "tp_queue_set_pos=" << set_pos_rc << "\n"; + std::cout << "tp_queue_set_vmax=" << set_vmax_rc << "\n"; + std::cout << "tp_queue_set_vlimit=" << set_vlimit_rc << "\n"; + std::cout << "tp_queue_set_amax=" << set_amax_rc << "\n"; + std::cout << "tp_queue_set_term_cond=" << set_term_rc << "\n"; + std::cout << "tp_queue_add_line1=" << add_line1_rc << "\n"; + std::cout << "tp_queue_depth_after_line1=" << depth_after_line1 << "\n"; + std::cout << "tp_queue_add_line2=" << add_line2_rc << "\n"; + std::cout << "tp_queue_depth_after_line2=" << depth_after_line2 << "\n"; + std::cout << "tp_queue_cycle_rc=" << cycle_rc << "\n"; + std::cout << "tp_queue_cycles=" << cycles << "\n"; + std::cout << "tp_queue_get_pos=" << get_pos_rc << "\n"; + std::cout << "tp_done_after_queued_lines=" << tpIsDone(&tp) << "\n"; + std::cout << "tp_queue_final_depth=" << tpQueueDepth(&tp) << "\n"; + std::cout << "tp_queue_final_pos_near_end=" << near_end << "\n"; + std::cout << "tp_queue_final_pos=" + << final_pos.tran.x << "," + << final_pos.tran.y << "," + << final_pos.tran.z << "\n"; +} + } // namespace int main() @@ -217,5 +308,6 @@ int main() std::cout << "pose_xyz=" << pose.tran.x << "," << pose.tran.y << "," << pose.tran.z << "\n"; run_linear_probe(); run_arc_probe(); + run_queued_lines_probe(); return 0; } diff --git a/wasm-port/tests/native/verify_native_probes.sh b/wasm-port/tests/native/verify_native_probes.sh index a24b6fa..5ba92c7 100755 --- a/wasm-port/tests/native/verify_native_probes.sh +++ b/wasm-port/tests/native/verify_native_probes.sh @@ -98,6 +98,13 @@ grep -Fq "tp_final_pos=1,0,0" "$TP_API_STDOUT" grep -Fq "tp_add_circle=0" "$TP_API_STDOUT" grep -Fq "tp_done_after_arc=1" "$TP_API_STDOUT" grep -Fq "tp_arc_final_pos_near_end=1" "$TP_API_STDOUT" +grep -Fq "tp_queue_add_line1=0" "$TP_API_STDOUT" +grep -Fq "tp_queue_depth_after_line1=1" "$TP_API_STDOUT" +grep -Fq "tp_queue_add_line2=0" "$TP_API_STDOUT" +grep -Fq "tp_queue_depth_after_line2=2" "$TP_API_STDOUT" +grep -Fq "tp_done_after_queued_lines=1" "$TP_API_STDOUT" +grep -Fq "tp_queue_final_depth=0" "$TP_API_STDOUT" +grep -Fq "tp_queue_final_pos_near_end=1" "$TP_API_STDOUT" check_fixture_output() { local fixture="$1"