/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package robotinterface.plugin.cmdpack.begginer; import java.awt.Color; import java.awt.Polygon; import java.awt.geom.Area; import java.util.ArrayList; import java.util.Collection; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import org.fife.ui.autocomplete.Completion; import org.fife.ui.autocomplete.CompletionProvider; import org.fife.ui.autocomplete.FunctionCompletion; import org.nfunk.jep.JEP; import robotinterface.algorithm.parser.FunctionToken; import robotinterface.algorithm.parser.parameterparser.Argument; import robotinterface.algorithm.procedure.Procedure; import robotinterface.drawable.swing.DrawableProcedureBlock; import robotinterface.drawable.GraphicObject; import robotinterface.drawable.swing.MutableWidgetContainer; import robotinterface.drawable.swing.component.TextLabel; import robotinterface.drawable.swing.component.Component; import robotinterface.drawable.swing.component.SubLineBreak; import robotinterface.drawable.swing.component.Widget; import robotinterface.drawable.swing.component.WidgetLine; import robotinterface.drawable.util.QuickFrame; import robotinterface.gui.panels.sidepanel.Classifiable; import robotinterface.gui.panels.sidepanel.Item; import robotinterface.interpreter.ExecutionException; import robotinterface.interpreter.ResourceManager; import robotinterface.util.trafficsimulator.Clock; import robotinterface.util.trafficsimulator.Timer; /** * * @author antunes */ public class Wait extends Procedure implements Classifiable, FunctionToken<Wait> { private static Color myColor = Color.decode("#9966FF"); private Timer timer; private Argument arg0; public Wait() { arg0 = new Argument("0", Argument.NUMBER_LITERAL); timer = new Timer(0); } public Wait(long ms) { this(); timer.setTick(ms); } private Wait(Argument[] args) { this(); arg0.set(args[0]); } @Override public void begin(ResourceManager rm) throws ExecutionException { Clock clock = rm.getResource(Clock.class); JEP parser = rm.getResource(JEP.class); arg0.parse(parser); timer.setTick((long) arg0.getDoubleValue()); timer.reset(); clock.addTimer(timer); } @Override public boolean perform(ResourceManager rm) { return timer.isConsumed(); } @Override public Item getItem() { Area myShape = new Area(); Polygon tmpShape = new Polygon(); tmpShape.addPoint(0, 0); tmpShape.addPoint(7, 0); tmpShape.addPoint(7, 18); tmpShape.addPoint(0, 18); myShape.add(new Area(tmpShape)); tmpShape.reset(); tmpShape.addPoint(11, 0); tmpShape.addPoint(18, 0); tmpShape.addPoint(18, 18); tmpShape.addPoint(11, 18); myShape.add(new Area(tmpShape)); return new Item("Esperar", myShape, myColor, "Mantém o robô se movendo ou faz o programa esperar por alguns milissegundos"); } @Override public Object createInstance() { return new Wait(); } @Override public Completion getInfo(CompletionProvider provider) { FunctionCompletion fc = new FunctionCompletion(provider, "wait(t);", null); fc.setShortDescription("Serve para controlar o tempo de duração de uma atividade do robô. O tempo é regulado pelo\n" + "parâmetro inteiro t, e é medido em milissegundos. Ao executar um comando e depois usar o wait(t)\n" + "o robô mantém o seu “estado de máquina” por um determinado tempo, ou seja, ele fica em stand-by\n" + "durante esse período, sem receber novos comandos." + "<p><b>Exemplo:\n" + "<p>move (127, 127);" + "<p>wait (1000);" + "<p>move (0, 0); <\b>\n" + "<p><p>Faz o robô acionar os motores em velocidade máxima para frente por 1 segundo e depois parar"); return fc; } @Override public String getToken(){ return "wait"; } @Override public void toString(String ident, StringBuilder sb) { setProcedure("wait(" + arg0 + ")"); super.toString(ident, sb); } private GraphicObject resource = null; @Override public GraphicObject getDrawableResource() { if (resource == null) { resource = createDrawableMove(this); } return resource; } public static MutableWidgetContainer createDrawableMove(final Wait W) { //HEADER LINE final WidgetLine headerLine = new WidgetLine() { @Override public void createRow(Collection<Component> components, final MutableWidgetContainer container, int index) { components.add(new TextLabel("Espera:", true)); components.add(new SubLineBreak()); Widget[] widgets = createGenericField(W, W.arg0, "Tempo (ms):", 80, 25, components, container); JSpinner spinner = (JSpinner) widgets[0].widget; spinner.setModel(new SpinnerNumberModel((int) spinner.getValue(), 0, 10000, 50)); components.add(new SubLineBreak(true)); } @Override public void toString(StringBuilder sb, ArrayList<Argument> arguments, MutableWidgetContainer container) { sb.append("wait("); for (int i = 0; i < arguments.size(); i++) { sb.append(arguments.get(i)); if (i < arguments.size() - 1) { sb.append(","); } } sb.append(")"); } }; DrawableProcedureBlock dcb = new DrawableProcedureBlock(W, myColor) { @Override public void updateStructure() { clear(); addLine(headerLine); boxLabel = getBoxLabel(); } }; return dcb; } @Override public Procedure copy(Procedure copy) { super.copy(copy); if (copy instanceof Wait){ ((Wait)copy).arg0.set(arg0); } return copy; } public static void main(String[] args) { Wait p = new Wait(); p.addBefore(new Procedure("var x, y;")); QuickFrame.applyLookAndFeel(); QuickFrame.drawTest(p.getDrawableResource()); } @Override public int getParameters() { return 1; } @Override public Wait createInstance(Argument[] args) { Wait w = new Wait(args); return w; } }