In the both-rotation-axes branch, bit_false(r_around.mask, bit(idx)) used the stale
outer loop variable idx instead of idx_0. When idx != idx_0, idx_1 (the second
rotation-plane axis) came out wrong, so in the final offset loop that axis was not
recognized as a rotation axis and its WCS offset was applied a second time. Result:
a rotated G54 move with both X and Y present targeted (work + 2x offset) on the second
axis -> false soft-limit (Alarm:2). Reproduced on hardware; only a nonzero WCS rotation
+ a full-plane G54 move triggers it. Fix: clear bit(idx_0).
Upstream grblHAL bug - PR-worthy.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Commit 41abd8c dropped the disable_motors() call that restores
SquaringMode_Both after the dual axis offset pull-off move at the end
of homing.
When an auto squared axis has a non-zero $17n offset, homing masks off
one of the two motors for the compensation move and never unmasks it.
The motor stays step-disabled for all subsequent motion until a soft
reset, so the axis moves on one motor only while jogging or running a
program. A negative offset strands the second motor, a positive one
strands the first.
Restore the call so both motors are re-enabled once the pull-off
completes.
Only affects builds with ROTATION_ENABLE defined; the offending code is inside
#ifdef ROTATION_ENABLE, so default builds are unaffected.
The rotation-transform block was entered for any axis-word motion without
excluding NonModal_AbsoluteOverride, so G53 (absolute machine override) moves
had the active WCS offset added to the plane axes (and were rotated). Per
RS274/NGC a G53 target is in machine coordinates and must ignore all offsets
and rotation.
Symptom: with a non-zero WCS rotation active (e.g. set by G10 L2 R / G68), G53
drives to the rotated work origin instead of the machine target, false-
triggering a soft-limit alarm when that lands outside the machine envelope.
Guard the transform with `non_modal_command != NonModal_AbsoluteOverride`, and
initialise r_axes.mask = 0 so it stays defined when the block is bypassed.
Fix for parking motion using `$32` laser mode setting when it should use the current spindle mode.
For developers: changed signature of `hal.stream.on_linestate_changed()` to include stream properties.
Added P-word option to G38.x probe commands, use to temporarily switch the probe input when multiple probes are available.
Fixed PWM spindle ramping, did not hit the target RPM.
Changes to allow stepper spindle to use per degree settings, ref. issue 926.
Changes for improved line number reporting for subroutines and branching gcode.
Slow locate phase can now be skipped by setting $24 to 0, this can be useful for Trinamic sensorless homing.
Fix for pendant not working if default stream is native USB and no client is connected. Ref. issue #927.