All pastes #2059477 Raw Edit

Anonymous

public cpp v1 · immutable
#2059477 ·published 2011-05-14 19:32 UTC
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);    }  }