package org.goko.core.gcode.rs274ngcv3.instruction.executiontime;
import java.util.ArrayList;
import java.util.List;
import org.goko.core.common.exception.GkException;
import org.goko.core.common.measure.quantity.Time;
import org.goko.core.gcode.rs274ngcv3.context.GCodeContext;
import org.goko.core.gcode.rs274ngcv3.instruction.AbstractInstruction;
/**
* Instruction factory
*
* @author Psyko
*/
public class InstructionTimeCalculatorFactory {
/** The list of known calculators*/
public List<AbstractInstructionTimeCalculator<? extends AbstractInstruction>> calculators;
/** Constructor */
public InstructionTimeCalculatorFactory() {
calculators = new ArrayList<AbstractInstructionTimeCalculator<? extends AbstractInstruction>>();
calculators.add(new StraightFeedTimeCalculator());
calculators.add(new StraightTraverseTimeCalculator());
calculators.add(new ArcFeedTimeCalculator());
calculators.add(new StraightProbeTimeCalculator());
calculators.add(new DwellTimeCalculator());
}
/**
* Evaluate the time required to execute the given instruction
* @param context the context
* @param instruction the instruction to evaluate
* @return a Time quantity
* @throws GkException GkException
*/
public Time getExecutionTime(GCodeContext context, AbstractInstruction instruction) throws GkException{
for (AbstractInstructionTimeCalculator<? extends AbstractInstruction> calculator : calculators) {
if(instruction.getType().equals(calculator.getInstructionType())){
return calculator.getExecutionTime(context, instruction);
}
}
return Time.ZERO;
}
}