diff --git a/wasm-port/docs/porting-steps-standalone.md b/wasm-port/docs/porting-steps-standalone.md index 6216104..ed4e46e 100644 --- a/wasm-port/docs/porting-steps-standalone.md +++ b/wasm-port/docs/porting-steps-standalone.md @@ -403,6 +403,12 @@ Current verified progress: `tests/fixtures/gcode/threading_sync.ngc` and `tests/fixtures/canon/threading_sync.events` pin `G33` spindle-synchronized straight feed and `G33.1` rigid tap behavior. +- `runtime/core/linuxcnc_wrap/linuxcnc_interp_minimal_runtime.cpp` now records + NURBS G5 canonical boundary calls emitted by vendored + `interp_convert.cc::convert_nurbs()`: `NURBS_G5_FEED`. + `tests/fixtures/gcode/nurbs_g5_semantics.ngc` and + `tests/fixtures/canon/nurbs_g5_semantics.events` pin `G5.2` control-point + collection and `G5.3` NURBS feed emission. - `tests/fixtures/gcode_errors/g1_zero_feed.ngc` and `tests/fixtures/canon_errors/g1_zero_feed.expected` pin the negative `G1` zero-feed case. The source basis is LinuxCNC diff --git a/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_interp_minimal_runtime.cpp b/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_interp_minimal_runtime.cpp index 3605056..3630783 100644 --- a/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_interp_minimal_runtime.cpp +++ b/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_interp_minimal_runtime.cpp @@ -452,7 +452,25 @@ int GET_EXTERNAL_AXIS_MASK() { return 7; } int GET_EXTERNAL_OFFSET_APPLIED() { return 0; } EmcPose GET_EXTERNAL_OFFSETS() { return {{0, 0, 0}, 0, 0, 0, 0, 0, 0}; } -void NURBS_G5_FEED(int, const std::vector &, unsigned int, CANON_PLANE) {} +void NURBS_G5_FEED(int lineno, + const std::vector &control_points, + unsigned int order, + CANON_PLANE plane) +{ + std::ostringstream oss; + oss << "NURBS_G5_FEED line=" << lineno + << " order=" << order + << " plane=" << static_cast(plane) + << " points=" << control_points.size(); + for (std::size_t index = 0; index < control_points.size(); ++index) { + const auto &point = control_points[index]; + oss << " p" << index + << "=(" << point.NURBS_X + << "," << point.NURBS_Y + << "," << point.NURBS_W << ")"; + } + standalone::push_canon_event(oss.str()); +} void NURBS_G6_FEED(int, const std::vector &, unsigned int, double, int, CANON_PLANE) {} void COMMENT(const char *s) diff --git a/wasm-port/tests/fixtures/canon/nurbs_g5_semantics.events b/wasm-port/tests/fixtures/canon/nurbs_g5_semantics.events new file mode 100644 index 0000000..ca057d1 --- /dev/null +++ b/wasm-port/tests/fixtures/canon/nurbs_g5_semantics.events @@ -0,0 +1,4 @@ +canon_event=SELECT_PLANE plane=1 +canon_event=STRAIGHT_TRAVERSE line=1 x=0 y=0 z=0 a=0 b=0 c=0 u=0 v=0 w=0 +canon_event=SET_FEED_RATE rate=40 +canon_event=NURBS_G5_FEED line=5 order=3 plane=1 points=3 p0=(0,0,1) p1=(1,0,1) p2=(1,1,1) diff --git a/wasm-port/tests/fixtures/gcode/nurbs_g5_semantics.ngc b/wasm-port/tests/fixtures/gcode/nurbs_g5_semantics.ngc new file mode 100644 index 0000000..8d27cc4 --- /dev/null +++ b/wasm-port/tests/fixtures/gcode/nurbs_g5_semantics.ngc @@ -0,0 +1,5 @@ +G90 G17 G0 X0 Y0 Z0 +F40 +G5.2 X1 Y0 P1 +G5.2 X1 Y1 P1 +G5.3