optimisation: there is only one extruder when planning a line

Change in memory:
Flash: -50 bytes
SRAM: -3 bytes
This commit is contained in:
Guðni Már Gilbert 2022-12-31 15:30:57 +00:00 committed by DRracer
parent 534c2e2664
commit 8c79bab503
7 changed files with 35 additions and 78 deletions

View File

@ -276,7 +276,6 @@ your extruder heater takes 2 minutes to hit the target on heating.
#define DISABLE_Y 0 #define DISABLE_Y 0
#define DISABLE_Z 0 #define DISABLE_Z 0
#define DISABLE_E 0// For all extruders #define DISABLE_E 0// For all extruders
#define DISABLE_INACTIVE_EXTRUDER 1 //disable only inactive extruders and keep active extruder enabled
// ENDSTOP SETTINGS: // ENDSTOP SETTINGS:

View File

@ -1975,7 +1975,7 @@ static void run_z_probe() {
// move down until you find the bed // move down until you find the bed
float zPosition = -10; float zPosition = -10;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60);
st_synchronize(); st_synchronize();
// we have to let the planner know where we are right now as it is not where we said to go. // we have to let the planner know where we are right now as it is not where we said to go.
@ -1984,13 +1984,13 @@ static void run_z_probe() {
// move up the retract distance // move up the retract distance
zPosition += home_retract_mm(Z_AXIS); zPosition += home_retract_mm(Z_AXIS);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60);
st_synchronize(); st_synchronize();
// move back down slowly to find bed // move back down slowly to find bed
feedrate = homing_feedrate[Z_AXIS]/4; feedrate = homing_feedrate[Z_AXIS]/4;
zPosition -= home_retract_mm(Z_AXIS) * 2; zPosition -= home_retract_mm(Z_AXIS) * 2;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], zPosition, current_position[E_AXIS], feedrate/60);
st_synchronize(); st_synchronize();
current_position[Z_AXIS] = st_get_position_mm(Z_AXIS); current_position[Z_AXIS] = st_get_position_mm(Z_AXIS);
@ -3615,11 +3615,11 @@ static void gcode_M600(bool automatic, float x_position, float y_position, float
} }
// Move XY back // Move XY back
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED, active_extruder); plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED);
st_synchronize(); st_synchronize();
// Move Z back // Move Z back
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED, active_extruder); plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_ZFEED);
st_synchronize(); st_synchronize();
// Set E position to original // Set E position to original
@ -5678,7 +5678,7 @@ void process_commands()
world2machine_revert_to_uncorrected(); world2machine_revert_to_uncorrected();
// Move the print head close to the bed. // Move the print head close to the bed.
current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40);
st_synchronize(); st_synchronize();
// Home in the XY plane. // Home in the XY plane.
set_destination_to_current(); set_destination_to_current();
@ -5694,7 +5694,7 @@ void process_commands()
clean_up_after_endstop_move(l_feedmultiply); clean_up_after_endstop_move(l_feedmultiply);
// Print head up. // Print head up.
current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; current_position[Z_AXIS] = MESH_HOME_Z_SEARCH;
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40);
st_synchronize(); st_synchronize();
lcd_update_enable(true); lcd_update_enable(true);
break; break;
@ -5799,8 +5799,7 @@ void process_commands()
plan_bed_level_matrix.set_to_identity(); plan_bed_level_matrix.set_to_identity();
plan_buffer_line( X_current, Y_current, Z_start_location, plan_buffer_line( X_current, Y_current, Z_start_location,
ext_position, ext_position,
homing_feedrate[Z_AXIS]/60, homing_feedrate[Z_AXIS]/60);
active_extruder);
st_synchronize(); st_synchronize();
// //
@ -5813,8 +5812,7 @@ void process_commands()
plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location, plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location,
ext_position, ext_position,
homing_feedrate[X_AXIS]/60, homing_feedrate[X_AXIS]/60);
active_extruder);
st_synchronize(); st_synchronize();
current_position[X_AXIS] = X_current = st_get_position_mm(X_AXIS); current_position[X_AXIS] = X_current = st_get_position_mm(X_AXIS);
@ -5835,8 +5833,7 @@ void process_commands()
plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location, plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location,
ext_position, ext_position,
homing_feedrate[X_AXIS]/60, homing_feedrate[X_AXIS]/60);
active_extruder);
st_synchronize(); st_synchronize();
current_position[Z_AXIS] = Z_current = st_get_position_mm(Z_AXIS); current_position[Z_AXIS] = Z_current = st_get_position_mm(Z_AXIS);
@ -5935,7 +5932,7 @@ void process_commands()
SERIAL_PROTOCOLPGM("\n"); SERIAL_PROTOCOLPGM("\n");
plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location, plan_buffer_line( X_probe_location, Y_probe_location, Z_start_location,
current_position[E_AXIS], homing_feedrate[Z_AXIS]/60, active_extruder); current_position[E_AXIS], homing_feedrate[Z_AXIS]/60);
st_synchronize(); st_synchronize();
} }
@ -9179,7 +9176,7 @@ uint16_t restore_interrupted_gcode() {
} }
#ifdef MESH_BED_LEVELING #ifdef MESH_BED_LEVELING
void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const float &e, const float &feed_rate, const uint8_t extruder, uint16_t start_segment_idx = 0) { void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const float &e, const float &feed_rate, uint16_t start_segment_idx = 0) {
float dx = x - current_position[X_AXIS]; float dx = x - current_position[X_AXIS];
float dy = y - current_position[Y_AXIS]; float dy = y - current_position[Y_AXIS];
uint16_t n_segments = 0; uint16_t n_segments = 0;
@ -9202,13 +9199,13 @@ void mesh_plan_buffer_line(const float &x, const float &y, const float &z, const
current_position[Y_AXIS] + t * dy, current_position[Y_AXIS] + t * dy,
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, current_position, i); feed_rate, current_position, i);
if (planner_aborted) if (planner_aborted)
return; return;
} }
} }
// The rest of the path. // The rest of the path.
plan_buffer_line(x, y, z, e, feed_rate, extruder, current_position); plan_buffer_line(x, y, z, e, feed_rate, current_position);
} }
#endif // MESH_BED_LEVELING #endif // MESH_BED_LEVELING
@ -9223,7 +9220,7 @@ void prepare_move(uint16_t start_segment_idx)
} }
else { else {
#ifdef MESH_BED_LEVELING #ifdef MESH_BED_LEVELING
mesh_plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply*(1./(60.f*100.f)), active_extruder, start_segment_idx); mesh_plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply*(1./(60.f*100.f)), start_segment_idx);
#else #else
plan_buffer_line_destinationXYZE(feedrate*feedmultiply*(1./(60.f*100.f))); plan_buffer_line_destinationXYZE(feedrate*feedmultiply*(1./(60.f*100.f)));
#endif #endif
@ -9235,7 +9232,7 @@ void prepare_move(uint16_t start_segment_idx)
void prepare_arc_move(bool isclockwise, uint16_t start_segment_idx) { void prepare_arc_move(bool isclockwise, uint16_t start_segment_idx) {
float r = hypot(offset[X_AXIS], offset[Y_AXIS]); // Compute arc radius for mc_arc float r = hypot(offset[X_AXIS], offset[Y_AXIS]); // Compute arc radius for mc_arc
// Trace the arc // Trace the arc
mc_arc(current_position, destination, offset, feedrate * feedmultiply / 60 / 100.0, r, isclockwise, active_extruder, start_segment_idx); mc_arc(current_position, destination, offset, feedrate * feedmultiply / 60 / 100.0, r, isclockwise, start_segment_idx);
// As far as the parser is concerned, the position is now == target. In reality the // As far as the parser is concerned, the position is now == target. In reality the
// motion control system might still be processing the action and the real tool position // motion control system might still be processing the action and the real tool position
// in any intermediate location. // in any intermediate location.
@ -9403,7 +9400,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s
float oldedes=destination[E_AXIS]; float oldedes=destination[E_AXIS];
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS],
destination[E_AXIS]+EXTRUDER_RUNOUT_EXTRUDE*EXTRUDER_RUNOUT_ESTEPS/cs.axis_steps_per_unit[E_AXIS], destination[E_AXIS]+EXTRUDER_RUNOUT_EXTRUDE*EXTRUDER_RUNOUT_ESTEPS/cs.axis_steps_per_unit[E_AXIS],
EXTRUDER_RUNOUT_SPEED/60.*EXTRUDER_RUNOUT_ESTEPS/cs.axis_steps_per_unit[E_AXIS], active_extruder); EXTRUDER_RUNOUT_SPEED/60.*EXTRUDER_RUNOUT_ESTEPS/cs.axis_steps_per_unit[E_AXIS]);
current_position[E_AXIS]=oldepos; current_position[E_AXIS]=oldepos;
destination[E_AXIS]=oldedes; destination[E_AXIS]=oldedes;
plan_set_e_position(oldepos); plan_set_e_position(oldepos);
@ -10275,7 +10272,7 @@ static void temp_compensation_apply() {
z_shift_mm = temp_comp_interpolation(target_temperature_bed) / cs.axis_steps_per_unit[Z_AXIS]; z_shift_mm = temp_comp_interpolation(target_temperature_bed) / cs.axis_steps_per_unit[Z_AXIS];
} }
printf_P(_N("\nZ shift applied:%.3f\n"), z_shift_mm); printf_P(_N("\nZ shift applied:%.3f\n"), z_shift_mm);
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] - z_shift_mm, current_position[E_AXIS], homing_feedrate[Z_AXIS] / 40, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] - z_shift_mm, current_position[E_AXIS], homing_feedrate[Z_AXIS] / 40);
st_synchronize(); st_synchronize();
plan_set_z_position(current_position[Z_AXIS]); plan_set_z_position(current_position[Z_AXIS]);
} }
@ -11208,11 +11205,11 @@ void restore_print_from_ram_and_continue(float e_move)
} }
//first move print head in XY to the saved position: //first move print head in XY to the saved position:
plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], current_position[Z_AXIS], saved_pos[E_AXIS] - e_move, homing_feedrate[Z_AXIS]/13, active_extruder); plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], current_position[Z_AXIS], saved_pos[E_AXIS] - e_move, homing_feedrate[Z_AXIS]/13);
//then move Z //then move Z
plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], saved_pos[E_AXIS] - e_move, homing_feedrate[Z_AXIS]/13, active_extruder); plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], saved_pos[E_AXIS] - e_move, homing_feedrate[Z_AXIS]/13);
//and finaly unretract (35mm/s) //and finaly unretract (35mm/s)
plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], saved_pos[E_AXIS], FILAMENTCHANGE_RFEED, active_extruder); plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], saved_pos[E_AXIS], FILAMENTCHANGE_RFEED);
st_synchronize(); st_synchronize();
#ifdef FANCHECK #ifdef FANCHECK

View File

@ -912,13 +912,13 @@ void world2machine_update_current()
static inline void go_xyz(float x, float y, float z, float fr) static inline void go_xyz(float x, float y, float z, float fr)
{ {
plan_buffer_line(x, y, z, current_position[E_AXIS], fr, active_extruder); plan_buffer_line(x, y, z, current_position[E_AXIS], fr);
st_synchronize(); st_synchronize();
} }
static inline void go_xy(float x, float y, float fr) static inline void go_xy(float x, float y, float fr)
{ {
plan_buffer_line(x, y, current_position[Z_AXIS], current_position[E_AXIS], fr, active_extruder); plan_buffer_line(x, y, current_position[Z_AXIS], current_position[E_AXIS], fr);
st_synchronize(); st_synchronize();
} }
@ -3029,7 +3029,7 @@ bool scan_bed_induction_points(int8_t verbosity_level)
// To replace loading of the babystep correction. // To replace loading of the babystep correction.
static void shift_z(float delta) static void shift_z(float delta)
{ {
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] - delta, current_position[E_AXIS], homing_feedrate[Z_AXIS]/40, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] - delta, current_position[E_AXIS], homing_feedrate[Z_AXIS]/40);
st_synchronize(); st_synchronize();
plan_set_z_position(current_position[Z_AXIS]); plan_set_z_position(current_position[Z_AXIS]);
} }

View File

@ -26,7 +26,7 @@
// The arc is approximated by generating a huge number of tiny, linear segments. The length of each // The arc is approximated by generating a huge number of tiny, linear segments. The length of each
// segment is configured in settings.mm_per_arc_segment. // segment is configured in settings.mm_per_arc_segment.
void mc_arc(const float* position, float* target, const float* offset, float feed_rate, float radius, bool isclockwise, uint8_t extruder, uint16_t start_segment_idx) void mc_arc(const float* position, float* target, const float* offset, float feed_rate, float radius, bool isclockwise, uint16_t start_segment_idx)
{ {
float start_position[4]; float start_position[4];
memcpy(start_position, position, sizeof(start_position)); memcpy(start_position, position, sizeof(start_position));
@ -153,7 +153,7 @@ void mc_arc(const float* position, float* target, const float* offset, float fee
clamp_to_software_endstops(start_position); clamp_to_software_endstops(start_position);
// Insert the segment into the buffer // Insert the segment into the buffer
if (i >= start_segment_idx) if (i >= start_segment_idx)
plan_buffer_line(start_position[X_AXIS], start_position[Y_AXIS], start_position[Z_AXIS], start_position[E_AXIS], feed_rate, extruder, position, i); plan_buffer_line(start_position[X_AXIS], start_position[Y_AXIS], start_position[Z_AXIS], start_position[E_AXIS], feed_rate, position, i);
// Handle the situation where the planner is aborted hard. // Handle the situation where the planner is aborted hard.
if (planner_aborted) if (planner_aborted)
return; return;
@ -162,5 +162,5 @@ void mc_arc(const float* position, float* target, const float* offset, float fee
// Clamp to the target position. // Clamp to the target position.
clamp_to_software_endstops(target); clamp_to_software_endstops(target);
// Ensure last segment arrives at target location. // Ensure last segment arrives at target location.
plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feed_rate, extruder, position, 0); plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], feed_rate, position, 0);
} }

View File

@ -26,6 +26,6 @@
// offset == offset from current xyz, axis_XXX defines circle plane in tool space, axis_linear is // offset == offset from current xyz, axis_XXX defines circle plane in tool space, axis_linear is
// the direction of helical travel, radius == circle radius, isclockwise boolean. Used // the direction of helical travel, radius == circle radius, isclockwise boolean. Used
// for vector transformation direction. // for vector transformation direction.
void mc_arc(const float *position, float *target, const float *offset, float feed_rate, float radius, bool isclockwise, uint8_t extruder, uint16_t start_segment_idx); void mc_arc(const float *position, float *target, const float *offset, float feed_rate, float radius, bool isclockwise, uint16_t start_segment_idx);
#endif #endif

View File

@ -106,8 +106,6 @@ float autotemp_factor=0.1;
bool autotemp_enabled=false; bool autotemp_enabled=false;
#endif #endif
unsigned char g_uc_extruder_last_move[3] = {0,0,0};
//=========================================================================== //===========================================================================
//=================semi-private variables, used in inline functions ===== //=================semi-private variables, used in inline functions =====
//=========================================================================== //===========================================================================
@ -686,11 +684,11 @@ void planner_abort_hard()
} }
void plan_buffer_line_curposXYZE(float feed_rate) { void plan_buffer_line_curposXYZE(float feed_rate) {
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feed_rate, active_extruder ); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], feed_rate);
} }
void plan_buffer_line_destinationXYZE(float feed_rate) { void plan_buffer_line_destinationXYZE(float feed_rate) {
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feed_rate, active_extruder); plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feed_rate);
} }
void plan_set_position_curposXYZE(){ void plan_set_position_curposXYZE(){
@ -701,7 +699,7 @@ float junction_deviation = 0.1;
// Add a new linear movement to the buffer. steps_x, _y and _z is the absolute position in // Add a new linear movement to the buffer. steps_x, _y and _z is the absolute position in
// mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration // mm. Microseconds specify how many microseconds the move should take to perform. To aid acceleration
// calculation the caller must also provide the physical length of the line in millimeters. // calculation the caller must also provide the physical length of the line in millimeters.
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder, const float* gcode_start_position, uint16_t segment_idx) void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const float* gcode_start_position, uint16_t segment_idx)
{ {
// CRITICAL_SECTION_START; //prevent stack overflow in ISR // CRITICAL_SECTION_START; //prevent stack overflow in ISR
// printf_P(PSTR("plan_buffer_line(%f, %f, %f, %f, %f, %u, [%f,%f,%f,%f], %u)\n"), x, y, z, e, feed_rate, extruder, gcode_start_position[0], gcode_start_position[1], gcode_start_position[2], gcode_start_position[3], segment_idx); // printf_P(PSTR("plan_buffer_line(%f, %f, %f, %f, %f, %u, [%f,%f,%f,%f], %u)\n"), x, y, z, e, feed_rate, extruder, gcode_start_position[0], gcode_start_position[1], gcode_start_position[2], gcode_start_position[3], segment_idx);
@ -924,47 +922,10 @@ block->steps_y.wide = labs((target[X_AXIS]-position[X_AXIS]) - (target[Y_AXIS]-p
#endif #endif
if(block->steps_z.wide != 0) enable_z(); if(block->steps_z.wide != 0) enable_z();
// Enable extruder(s) // Enable extruder
if(block->steps_e.wide != 0) if(block->steps_e.wide != 0)
{ {
if (DISABLE_INACTIVE_EXTRUDER) //enable only selected extruder enable_e0();
{
if(g_uc_extruder_last_move[0] > 0) g_uc_extruder_last_move[0]--;
if(g_uc_extruder_last_move[1] > 0) g_uc_extruder_last_move[1]--;
if(g_uc_extruder_last_move[2] > 0) g_uc_extruder_last_move[2]--;
switch(extruder)
{
case 0:
enable_e0();
g_uc_extruder_last_move[0] = BLOCK_BUFFER_SIZE*2;
if(g_uc_extruder_last_move[1] == 0) {disable_e1();}
if(g_uc_extruder_last_move[2] == 0) {disable_e2();}
break;
case 1:
enable_e1();
g_uc_extruder_last_move[1] = BLOCK_BUFFER_SIZE*2;
if(g_uc_extruder_last_move[0] == 0) {disable_e0();}
if(g_uc_extruder_last_move[2] == 0) {disable_e2();}
break;
case 2:
enable_e2();
g_uc_extruder_last_move[2] = BLOCK_BUFFER_SIZE*2;
if(g_uc_extruder_last_move[0] == 0) {disable_e0();}
if(g_uc_extruder_last_move[1] == 0) {disable_e1();}
break;
}
}
else //enable all
{
enable_e0();
enable_e1();
enable_e2();
}
} }
if (block->steps_e.wide == 0) if (block->steps_e.wide == 0)

View File

@ -143,7 +143,7 @@ void plan_init();
// millimaters. Feed rate specifies the speed of the motion. // millimaters. Feed rate specifies the speed of the motion.
#ifdef ENABLE_AUTO_BED_LEVELING #ifdef ENABLE_AUTO_BED_LEVELING
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const uint8_t &extruder); void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate);
// Get the position applying the bed level matrix if enabled // Get the position applying the bed level matrix if enabled
vector_3 plan_get_position(); vector_3 plan_get_position();
@ -159,7 +159,7 @@ void plan_buffer_line_destinationXYZE(float feed_rate);
void plan_set_position_curposXYZE(); void plan_set_position_curposXYZE();
void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, uint8_t extruder, const float* gcode_start_position = NULL, uint16_t segment_idx = 0); void plan_buffer_line(float x, float y, float z, const float &e, float feed_rate, const float* gcode_start_position = NULL, uint16_t segment_idx = 0);
//void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t &extruder); //void plan_buffer_line(const float &x, const float &y, const float &z, const float &e, float feed_rate, const uint8_t &extruder);
#endif // ENABLE_AUTO_BED_LEVELING #endif // ENABLE_AUTO_BED_LEVELING