/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package robotinterface.robot.action; import java.nio.ByteBuffer; import java.util.logging.Level; import java.util.logging.Logger; import robotinterface.robot.Robot; import robotinterface.robot.connection.message.Message; /** * * @author antunes */ public abstract class Action extends Message { private static final ByteBuffer buffer = ByteBuffer.allocate(256); private boolean waitingMessage = false; private boolean autoSend = true; private boolean singleMessage = false; private boolean running = false; public Action (){ } public Action (boolean singleMessage){ this.singleMessage = singleMessage; } public void setAutoSend(boolean autoSend) { this.autoSend = autoSend; } public abstract void putMessage(ByteBuffer data, Robot robot); public synchronized void begin(Robot robot) { buffer.clear(); putMessage(buffer, robot); buffer.flip(); setWaiting(); running = true; send(buffer); waitingMessage = false; if (!singleMessage){ setWaiting(Long.MAX_VALUE); //espera terminar a ação run(this, robot); //espera confimação do comando 1 } } public static void run(Action action, Robot robot) { while (!action.perform(robot)) { try { Thread.sleep(5); } catch (InterruptedException ex) { } } } public final boolean perform(Robot robot) { try { if (isValidRead()) { return true; } } catch (Message.TimeoutException ex) { if (autoSend) { begin(robot); } else { return true; } } return false; } public final void setRunning() { waitingMessage = true; running = true; } public final void setDone() { waitingMessage = false; running = false; } public boolean isWaiting() { return waitingMessage; } public boolean isRunning() { return running; } }