package org.goko.core.gcode.rs274ngcv3.instruction.builder;
import java.util.List;
import org.goko.core.common.exception.GkException;
import org.goko.core.common.measure.quantity.Speed;
import org.goko.core.common.measure.quantity.SpeedUnit;
import org.goko.core.common.utils.BigDecimalUtils;
import org.goko.core.gcode.element.GCodeWord;
import org.goko.core.gcode.rs274ngcv3.context.EnumUnit;
import org.goko.core.gcode.rs274ngcv3.context.GCodeContext;
import org.goko.core.gcode.rs274ngcv3.element.InstructionType;
import org.goko.core.gcode.rs274ngcv3.instruction.SetFeedRateInstruction;
import org.goko.core.gcode.rs274ngcv3.utils.GCodeWordUtils;
public class SetFeedRateBuilder extends AbstractInstructionBuilder<SetFeedRateInstruction> {
/** Constructor */
public SetFeedRateBuilder() {
super(InstructionType.SET_FEED_RATE);
}
/** (inheritDoc)
* @see org.goko.core.gcode.rs274ngcv3.instruction.IInstructionBuilder#match(org.goko.core.gcode.rs274ngcv3.context.GCodeContext, java.util.List)
*/
@Override
public boolean match(GCodeContext context, List<GCodeWord> words) throws GkException {
return GCodeWordUtils.containsWordByLetter("F", words);
}
@Override
protected SetFeedRateInstruction getInstruction(GCodeContext context, List<GCodeWord> words) throws GkException {
GCodeWord fWord = GCodeWordUtils.getAndRemoveWordByLetter("F", words);
Speed feedrate = Speed.ZERO;
if(context.getUnit() == EnumUnit.INCHES){
feedrate = Speed.valueOf(BigDecimalUtils.parse(fWord.getValue()), SpeedUnit.INCH_PER_MINUTE);
}else if(context.getUnit() == EnumUnit.MILLIMETERS){
feedrate = Speed.valueOf(BigDecimalUtils.parse(fWord.getValue()), SpeedUnit.MILLIMETRE_PER_MINUTE);
}
return new SetFeedRateInstruction(feedrate);
}
}