RLPark 1.0.0
Reinforcement Learning Framework in Java

StateMachine.java

Go to the documentation of this file.
00001 package rlpark.plugin.robot.internal.statemachine;
00002 
00003 import java.util.ArrayList;
00004 import java.util.List;
00005 
00006 import rlpark.plugin.rltoys.utils.Utils;
00007 import zephyr.plugin.core.api.signals.Signal;
00008 
00009 public class StateMachine<T> {
00010   public final Signal<StateMachine<T>> onEnd = new Signal<StateMachine<T>>();
00011   public final Signal<StateMachine<T>> onStateChange = new Signal<StateMachine<T>>();
00012   private int currentStateIndex;
00013   private final List<StateNode<T>> nodes;
00014   private boolean stateChanged = false;
00015 
00016   public StateMachine(StateNode<T>... nodes) {
00017     this(Utils.asList(nodes));
00018   }
00019 
00020   public StateMachine(List<? extends StateNode<T>> nodes) {
00021     currentStateIndex = 0;
00022     this.nodes = new ArrayList<StateNode<T>>(nodes);
00023   }
00024 
00025   public void step(T t) {
00026     if (currentStateIndex >= nodes.size()) {
00027       currentStateIndex = 0;
00028       onEnd.fire(this);
00029     }
00030     StateNode<T> currentState = nodes.get(currentStateIndex);
00031     if (stateChanged) {
00032       currentState.start();
00033       stateChanged = false;
00034     }
00035     currentState.step(t);
00036     if (currentState.isDone()) {
00037       onStateChange.fire(this);
00038       stateChanged = true;
00039       currentStateIndex++;
00040     }
00041   }
00042 
00043   public StateNode<T> currentState() {
00044     if (currentStateIndex < nodes.size())
00045       return nodes.get(currentStateIndex);
00046     return null;
00047   }
00048 
00049   public void setNodes(List<StateNode<T>> nodes) {
00050     this.nodes.clear();
00051     this.nodes.addAll(nodes);
00052   }
00053 }
 All Classes Namespaces Files Functions Variables Enumerations
Zephyr
RLPark