package nl.ru.ai.projects.parrot.fsm;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import nl.ru.ai.projects.parrot.dronecontrol.simulator.Simulator;
import nl.ru.ai.projects.parrot.tools.PositionLogger;
import nl.ru.ai.projects.parrot.tools.Writer;
private String name;
private ArrayList<Behavior> behaviors;
private ArrayList<Transition> transitions;
public static HashSet<State> resetStates = new HashSet<State>(20);
private Behavior entryBehavior;
private Behavior exitBehavior;
private boolean isActive;
private boolean isFinalState;
private static boolean logDronePosition;
public static boolean outputCurrentState;
private static int writeCounter;
private Set<StateListener> stateListeners = new HashSet<StateListener>();
public State(String name) {
this.name = name;
behaviors = new ArrayList<Behavior>();
transitions = new ArrayList<Transition>();
entryBehavior = null;
exitBehavior = null;
isActive = false;
isFinalState = false;
writeCounter = 0;
}
return name;
}
State.logDronePosition = value;
}
State.outputCurrentState = value;
}
behaviors.add(behavior);
}
this.entryBehavior = behavior;
}
this.exitBehavior = behavior;
}
this.isFinalState = isFinal;
}
return isFinalState;
}
transitions.add(transition);
}
isActive = false;
writeCounter = 0;
for (int i = 0; i < behaviors.size(); i++)
behaviors.get(i).reset();
for (int j = 0; j < transitions.size(); j++) {
Transition transition = transitions.get(j);
transition.reset();
if (resetStates.add(transition.getConnectedState()))
transition.getConnectedState().reset();
}
}
resetStates.clear();
}
public State
run()
throws InterruptedException {
if (State.logDronePosition) {
double[] position = Simulator.getInstance().getDrone(0)
.getDronePosition();
PositionLogger.addPosition(position);
String pos0 = Double.toString(position[0]).replace('.', ',');
String pos1 = Double.toString(position[1]).replace('.', ',');
Writer.getInstance().write(pos0 + ";" + pos1);
writeCounter++;
if (writeCounter == 10) {
Writer.getInstance().flush();
writeCounter = 0;
}
}
if (!isActive) {
for (StateListener sl : stateListeners) {
sl.stateEntered(this);
}
if (outputCurrentState)
System.out.println("Entered State: " + name);
isActive = true;
if (entryBehavior != null)
entryBehavior.run();
}
for (int i = 0; i < transitions.size(); i++) {
Transition currentTransition = transitions.get(i);
if (currentTransition.fire()) {
for (StateListener sl : stateListeners) {
sl.stateLeft(this);
}
isActive = false;
if (exitBehavior != null)
exitBehavior.run();
currentTransition.run();
return currentTransition.getConnectedState();
}
}
for (int i = 0; i < behaviors.size(); i++) {
Behavior currentBehavior = behaviors.get(i);
if (currentBehavior.fire())
currentBehavior.run();
}
return this;
}
if (!stateListeners.contains(sl)) {
stateListeners.add(sl);
}
}
return stateListeners.remove(sl);
}
}