Unroll the stack in restore_print_from_ram_and_continue
While handling moves in a recursive plan, such a filament check, ensure restore_print_from_ram_and_continue unwinds the stack by aborting early from any call that waits on the planner. This currently only handles G1 moves, but hard-coded behavior that can trigger recursive behavior (such as filament change) will probably have to be checked too.
This commit is contained in:
parent
404802b5e6
commit
0f6b9b4051
@ -8363,6 +8363,8 @@ void clamp_to_software_endstops(float target[3])
|
|||||||
current_position[Z_AXIS] + t * dz,
|
current_position[Z_AXIS] + t * dz,
|
||||||
current_position[E_AXIS] + t * de,
|
current_position[E_AXIS] + t * de,
|
||||||
feed_rate, extruder);
|
feed_rate, extruder);
|
||||||
|
if (waiting_inside_plan_buffer_line_print_aborted)
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// The rest of the path.
|
// The rest of the path.
|
||||||
@ -8390,6 +8392,8 @@ void prepare_move()
|
|||||||
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply*(1./(60.f*100.f)), active_extruder);
|
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply*(1./(60.f*100.f)), active_extruder);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
if (waiting_inside_plan_buffer_line_print_aborted)
|
||||||
|
return;
|
||||||
|
|
||||||
for(int8_t i=0; i < NUM_AXIS; i++) {
|
for(int8_t i=0; i < NUM_AXIS; i++) {
|
||||||
current_position[i] = destination[i];
|
current_position[i] = destination[i];
|
||||||
@ -10264,10 +10268,12 @@ void restore_print_from_ram_and_continue(float e_move)
|
|||||||
else {
|
else {
|
||||||
//not sd printing nor usb printing
|
//not sd printing nor usb printing
|
||||||
}
|
}
|
||||||
|
|
||||||
SERIAL_PROTOCOLLNRPGM(MSG_OK); //dummy response because of octoprint is waiting for this
|
SERIAL_PROTOCOLLNRPGM(MSG_OK); //dummy response because of octoprint is waiting for this
|
||||||
lcd_setstatuspgm(_T(WELCOME_MSG));
|
lcd_setstatuspgm(_T(WELCOME_MSG));
|
||||||
saved_printing_type = PRINTING_TYPE_NONE;
|
saved_printing_type = PRINTING_TYPE_NONE;
|
||||||
saved_printing = false;
|
saved_printing = false;
|
||||||
|
waiting_inside_plan_buffer_line_print_aborted = true; //unroll the stack
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_world_coordinates()
|
void print_world_coordinates()
|
||||||
|
@ -666,8 +666,8 @@ void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate
|
|||||||
|
|
||||||
// If the buffer is full: good! That means we are well ahead of the robot.
|
// If the buffer is full: good! That means we are well ahead of the robot.
|
||||||
// Rest here until there is room in the buffer.
|
// Rest here until there is room in the buffer.
|
||||||
|
waiting_inside_plan_buffer_line_print_aborted = false;
|
||||||
if (block_buffer_tail == next_buffer_head) {
|
if (block_buffer_tail == next_buffer_head) {
|
||||||
waiting_inside_plan_buffer_line_print_aborted = false;
|
|
||||||
do {
|
do {
|
||||||
manage_heater();
|
manage_heater();
|
||||||
// Vojtech: Don't disable motors inside the planner!
|
// Vojtech: Don't disable motors inside the planner!
|
||||||
|
@ -238,6 +238,7 @@ FORCE_INLINE bool planner_queue_full() {
|
|||||||
// wait for the steppers to stop,
|
// wait for the steppers to stop,
|
||||||
// update planner's current position and the current_position of the front end.
|
// update planner's current position and the current_position of the front end.
|
||||||
extern void planner_abort_hard();
|
extern void planner_abort_hard();
|
||||||
|
extern bool waiting_inside_plan_buffer_line_print_aborted;
|
||||||
|
|
||||||
#ifdef PREVENT_DANGEROUS_EXTRUDE
|
#ifdef PREVENT_DANGEROUS_EXTRUDE
|
||||||
void set_extrude_min_temp(float temp);
|
void set_extrude_min_temp(float temp);
|
||||||
|
Loading…
Reference in New Issue
Block a user