Skip to content

Commit 5967839

Browse files
committed
Improved fix for rare lowering feed/rapid override bug.
[fix] In the previous hot fix, there was still (rarer) potential for very small floating point errors incorrectly handle an override deceleration and crash Grbl. Re-factored the if-then statement in terms of speed changes, rather than distance, to completely eliminate the issue.
1 parent 477a94c commit 5967839

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

doc/log/commit_log_v1.1.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
----------------
2+
Date: 2017-07-31
3+
Author: Sonny Jeon
4+
Subject: Hot fix for rare lowering feed override bug.
5+
6+
[fix] Squashed a very rare bug when lowering the feedrate (or rapid) override. When in the very strict set of circumstances with acceleration settings, override step size, and current speed, an internal calculation would cause Grbl to crash. The fix was an overlooked equality statement that should have been a less than or equal, not a less than.
7+
8+
19
----------------
210
Date: 2017-07-17
311
Author: Sonny Jeon

grbl/grbl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
// Grbl versioning system
2525
#define GRBL_VERSION "1.1f"
26-
#define GRBL_VERSION_BUILD "20170731"
26+
#define GRBL_VERSION_BUILD "20170801"
2727

2828
// Define standard libraries used by Grbl.
2929
#include <avr/io.h>

grbl/stepper.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ void st_prep_buffer()
734734

735735
} else {
736736
// Decelerate to cruise or cruise-decelerate types. Guaranteed to intersect updated plan.
737-
prep.decelerate_after = inv_2_accel*(nominal_speed_sqr-exit_speed_sqr);
737+
prep.decelerate_after = inv_2_accel*(nominal_speed_sqr-exit_speed_sqr); // Should always be >= 0.0 due to planner reinit.
738738
prep.maximum_speed = nominal_speed;
739739
prep.ramp_type = RAMP_DECEL_OVERRIDE;
740740
}
@@ -806,15 +806,14 @@ void st_prep_buffer()
806806
switch (prep.ramp_type) {
807807
case RAMP_DECEL_OVERRIDE:
808808
speed_var = pl_block->acceleration*time_var;
809-
mm_var = time_var*(prep.current_speed - 0.5*speed_var);
810-
mm_remaining -= mm_var;
811-
if ((mm_remaining <= prep.accelerate_until) || (mm_var <= 0.0)) {
809+
if (prep.current_speed-prep.maximum_speed <= speed_var) {
812810
// Cruise or cruise-deceleration types only for deceleration override.
813-
mm_remaining = prep.accelerate_until; // NOTE: 0.0 at EOB
811+
mm_remaining = prep.accelerate_until;
814812
time_var = 2.0*(pl_block->millimeters-mm_remaining)/(prep.current_speed+prep.maximum_speed);
815813
prep.ramp_type = RAMP_CRUISE;
816814
prep.current_speed = prep.maximum_speed;
817815
} else { // Mid-deceleration override ramp.
816+
mm_remaining -= time_var*(prep.current_speed - 0.5*speed_var);
818817
prep.current_speed -= speed_var;
819818
}
820819
break;

0 commit comments

Comments
 (0)