rendered paste body while(x_steps_remaining + y_steps_remaining + z_steps_remaining + e_steps_remaining > 0) { #ifdef RAMP_ACCELERATION //If acceleration is enabled on this move and we are in the acceleration segment, calculate the current interval if (acceleration_enabled && steps_done == 0) { interval = max_interval; } else if (acceleration_enabled && steps_done <= plateau_steps) { long current_speed = (long) ((((long) steps_per_sqr_second) / 10000) * ((micros() - start_move_micros) / 100) + (long) min_speed_steps_per_second); interval = 100000000 / current_speed; if (interval < full_interval) { accelerating = false; interval = full_interval; } if (steps_done >= steps_to_take / 2) { plateau_steps = steps_done; max_speed_steps_per_second = 100000000 / interval; accelerating = false; } } else if (acceleration_enabled && steps_remaining <= plateau_steps) { //(interval > minInterval * 100) { if (!accelerating) { start_move_micros = micros(); accelerating = true; decelerating = true; } long current_speed = (long) ((long) max_speed_steps_per_second - ((((long) steps_per_sqr_second) / 10000) * ((micros() - start_move_micros) / 100))); interval = 100000000 / current_speed; if (interval > max_interval) interval = max_interval; } else { //Else, we are just use the full speed interval as current interval interval = full_interval; accelerating = false; } #endif #ifdef EXP_ACCELERATION //If acceleration is enabled on this move and we are in the acceleration segment, calculate the current interval if (acceleration_enabled && steps_done < full_velocity_steps && steps_done / full_velocity_steps < 1 && (steps_done % steps_acceleration_check == 0)) { if(steps_done == 0) { interval = max_interval; } else { interval = max_interval - ((max_interval - full_interval) * steps_done / virtual_full_velocity_steps); } } else if (acceleration_enabled && steps_remaining < full_velocity_steps) { //Else, if acceleration is enabled on this move and we are in the deceleration segment, calculate the current interval if(steps_remaining == 0) { interval = max_interval; } else { interval = max_interval - ((max_interval - full_interval) * steps_remaining / virtual_full_velocity_steps); } accelerating = true; } else if (steps_done - full_velocity_steps >= 1 || !acceleration_enabled){ //Else, we are just use the full speed interval as current interval interval = full_interval; accelerating = false; } #endif //If there are x or y steps remaining, perform Bresenham algorithm if(x_steps_remaining || y_steps_remaining) { if(X_MIN_PIN > -1) if(!direction_x) if(digitalRead(X_MIN_PIN) != ENDSTOPS_INVERTING) break; if(Y_MIN_PIN > -1) if(!direction_y) if(digitalRead(Y_MIN_PIN) != ENDSTOPS_INVERTING) break; if(X_MAX_PIN > -1) if(direction_x) if(digitalRead(X_MAX_PIN) != ENDSTOPS_INVERTING) break; if(Y_MAX_PIN > -1) if(direction_y) if(digitalRead(Y_MAX_PIN) != ENDSTOPS_INVERTING) break; if(steep_y) { timediff = micros() * 100 - previous_micros_y; while(timediff >= interval && y_steps_remaining > 0) { steps_done++; steps_remaining--; y_steps_remaining--; timediff -= interval; error_x = error_x - delta_x; do_y_step(); if(error_x < 0) { do_x_step(); x_steps_remaining--; error_x = error_x + delta_y; } #ifdef RAMP_ACCELERATION if (steps_remaining == plateau_steps || (steps_done >= steps_to_take / 2 && accelerating && !decelerating)) break; #endif #ifdef STEP_DELAY_RATIO if(timediff >= interval) delayMicroseconds(long_step_delay_ratio * interval / 10000); #endif #ifdef STEP_DELAY_MICROS if(timediff >= interval) delayMicroseconds(STEP_DELAY_MICROS); #endif } } else if (steep_x) { timediff=micros() * 100 - previous_micros_x; while(timediff >= interval && x_steps_remaining>0) { steps_done++; steps_remaining--; x_steps_remaining--; timediff -= interval; error_y = error_y - delta_y; do_x_step(); if(error_y < 0) { do_y_step(); y_steps_remaining--; error_y = error_y + delta_x; } #ifdef RAMP_ACCELERATION if (steps_remaining == plateau_steps || (steps_done >= steps_to_take / 2 && accelerating && !decelerating)) break; #endif #ifdef STEP_DELAY_RATIO if(timediff >= interval) delayMicroseconds(long_step_delay_ratio * interval / 10000); #endif #ifdef STEP_DELAY_MICROS if(timediff >= interval) delayMicroseconds(STEP_DELAY_MICROS); #endif } } } #ifdef RAMP_ACCELERATION if (steps_to_take > 0 && (steps_remaining == plateau_steps || (steps_done >= steps_to_take / 2 && accelerating && !decelerating))) continue; #endif //If there are z steps remaining, check if z steps must be taken if(z_steps_remaining) { if(Z_MIN_PIN > -1) if(!direction_z) if(digitalRead(Z_MIN_PIN) != ENDSTOPS_INVERTING) break; if(Z_MAX_PIN > -1) if(direction_z) if(digitalRead(Z_MAX_PIN) != ENDSTOPS_INVERTING) break; timediff = micros() * 100-previous_micros_z; while(timediff >= z_interval && z_steps_remaining) { do_z_step(); z_steps_remaining--; timediff -= z_interval; #ifdef STEP_DELAY_RATIO if(timediff >= z_interval) delayMicroseconds(long_step_delay_ratio * z_interval / 10000); #endif #ifdef STEP_DELAY_MICROS if(timediff >= z_interval) delayMicroseconds(STEP_DELAY_MICROS); #endif } } //If there are e steps remaining, check if e steps must be taken if(e_steps_remaining){ if (x_steps_to_take + y_steps_to_take <= 0) timediff = micros()*100 - previous_micros_e; unsigned int final_e_steps_remaining = 0; if (steep_x && x_steps_to_take > 0) final_e_steps_remaining = e_steps_to_take * x_steps_remaining / x_steps_to_take; else if (steep_y && y_steps_to_take > 0) final_e_steps_remaining = e_steps_to_take * y_steps_remaining / y_steps_to_take; //If this move has X or Y steps, let E follow the Bresenham pace if (final_e_steps_remaining > 0) while(e_steps_remaining > final_e_steps_remaining) { do_e_step(); e_steps_remaining--;} else if (x_steps_to_take + y_steps_to_take > 0) while(e_steps_remaining) { do_e_step(); e_steps_remaining--;} //Else, normally check if e steps must be taken else while (timediff >= e_interval && e_steps_remaining) { do_e_step(); e_steps_remaining--; timediff -= e_interval; #ifdef STEP_DELAY_RATIO if(timediff >= e_interval) delayMicroseconds(long_step_delay_ratio * e_interval / 10000); #endif #ifdef STEP_DELAY_MICROS if(timediff >= e_interval) delayMicroseconds(STEP_DELAY_MICROS); #endif } } //If more that 50ms have passed since previous heating check, adjust temp if(!accelerating && (millis() - previous_millis_heater) >= 50 ) { manage_heater(); previous_millis_heater = millis(); manage_inactivity(2); } }