double TimeEstimateCalculator::calculate() { reverse_pass(); forward_pass(); recalculate_trapezoids(); double totalTime = 0; for(unsigned int n=0; n<blocks.size(); n++) { double plateau_distance = blocks[n].decelerate_after - blocks[n].accelerate_until; totalTime += acceleration_time_from_distance(blocks[n].initial_feedrate, blocks[n].accelerate_until, blocks[n].acceleration); totalTime += plateau_distance / blocks[n].nominal_feedrate; totalTime += acceleration_time_from_distance(blocks[n].final_feedrate, (blocks[n].distance - blocks[n].decelerate_after), blocks[n].acceleration); } return totalTime; }
/* * Recalculate the motion plan according to the following algorithm: * * 1. Go over every block in reverse order... * * Calculate a junction speed reduction (block_t.entry_factor) so: * * a. The junction jerk is within the set limit, and * * b. No speed reduction within one block requires faster * deceleration than the one, true constant acceleration. * * 2. Go over every block in chronological order... * * Dial down junction speed reduction values if: * a. The speed increase within one block would require faster * acceleration than the one, true constant acceleration. * * After that, all blocks will have an entry_factor allowing all speed changes to * be performed using only the one, true constant acceleration, and where no junction * jerk is jerkier than the set limit, Jerky. Finally it will: * * 3. Recalculate "trapezoids" for all blocks. */ void Planner::recalculate() { reverse_pass(); forward_pass(); recalculate_trapezoids(); }