Do not enqueue a E/Z moves unless requested

Do not unconditionally enqueue a Z move if no move has been requested.
Since Z is calculated using the absolute current (saved) position and
scheduled for later execution, the queue order becomes relevant.
This commit is contained in:
Yuri D'Elia 2019-12-30 14:49:07 +01:00
parent 0cc68228f8
commit 5660fcffb0

View File

@ -10238,23 +10238,29 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
// move away from the print.
char buf[48];
// First unretract (relative extrusion)
if(!saved_extruder_relative_mode){
enquecommand(PSTR("M83"), true);
}
//retract 45mm/s
// A single sprintf may not be faster, but is definitely 20B shorter
// than a sequence of commands building the string piece by piece
// A snprintf would have been a safer call, but since it is not used
// in the whole program, its implementation would bring more bytes to the total size
// The behavior of dtostrf 8,3 should be roughly the same as %-0.3
sprintf_P(buf, PSTR("G1 E%-0.3f F2700"), e_move);
enquecommand(buf, false);
if(e_move)
{
// First unretract (relative extrusion)
if(!saved_extruder_relative_mode){
enquecommand(PSTR("M83"), true);
}
//retract 45mm/s
// A single sprintf may not be faster, but is definitely 20B shorter
// than a sequence of commands building the string piece by piece
// A snprintf would have been a safer call, but since it is not used
// in the whole program, its implementation would bring more bytes to the total size
// The behavior of dtostrf 8,3 should be roughly the same as %-0.3
sprintf_P(buf, PSTR("G1 E%-0.3f F2700"), e_move);
enquecommand(buf, false);
}
if(z_move)
{
// Then lift Z axis
sprintf_P(buf, PSTR("G1 Z%-0.3f F%-0.3f"), saved_pos[Z_AXIS] + z_move, homing_feedrate[Z_AXIS]);
enquecommand(buf, false);
}
// Then lift Z axis
sprintf_P(buf, PSTR("G1 Z%-0.3f F%-0.3f"), saved_pos[Z_AXIS] + z_move, homing_feedrate[Z_AXIS]);
// At this point the command queue is empty.
enquecommand(buf, false);
// If this call is invoked from the main Arduino loop() function, let the caller know that the command
// in the command queue is not the original command, but a new one, so it should not be removed from the queue.
repeatcommand_front();