crashtest/src/de/ctdo/crashtest/Statemachine.java

174 lines
4.7 KiB
Java

package de.ctdo.crashtest;
import java.util.ArrayList;
import java.util.List;
public class Statemachine {
private final char BLUE_BUTTON = 'E';
private final char LIGHT_BARRIER = 'F';
private final char TABLE_ONE = 'G';
private final char TABLE_TWO = 'H';
private final char TABLE_THREE = 'I';
private final char ROKET_INPUT = 'B';
private long lastHandleInput = 0;
private final List<StateChangeListener> stateChangeListenerList = new ArrayList<StateChangeListener>();
private int stateChangeCounter = 0;
public void addStateChangedListener(StateChangeListener listener) {
stateChangeListenerList.add(listener);
}
public enum state {
IDLE,
ENTERED_ROOM,
TABLE_GAME_ONE,
TABLE_GAME_TWO,
TABLE_GAME_THREE,
TABLE_GAME_FOUR,
TABLE_GAME_FIVE,
TABLE_GAME_SIX,
TABLE_GAME_SEVEN,
TABLE_FINISH,
ROKET_DONE
}
private state currentState = state.IDLE;
public state getCurrentState() {
return currentState;
}
public int getStateChangeCounter() {
return stateChangeCounter;
}
public void reset() {
stateChangeCounter = 0;
currentState = state.IDLE;
onStateChanged();
}
public void handleInput(char input) {
if(System.currentTimeMillis() - lastHandleInput < 200 ) return;
state newState = getNewState(input);
if( newState != currentState ) {
stateChangeCounter++;
System.out.println("newState = " + newState);
workForState(newState);
currentState = newState;
onStateChanged();
}
lastHandleInput = System.currentTimeMillis();
}
private void onStateChanged() {
for(StateChangeListener listener: stateChangeListenerList) {
listener.stateChanged(currentState);
}
}
private void workForState(state newState) {
switch (newState) {
case IDLE:
break;
case ENTERED_ROOM:
break;
case TABLE_GAME_ONE:
break;
case TABLE_GAME_TWO:
break;
case TABLE_GAME_THREE:
break;
case TABLE_GAME_FOUR:
break;
case TABLE_GAME_FIVE:
break;
case TABLE_GAME_SIX:
break;
case TABLE_GAME_SEVEN:
break;
}
}
private state getNewState(char input) {
state retVal = currentState;
switch (currentState) {
case IDLE:
if(input == LIGHT_BARRIER) {
retVal = state.ENTERED_ROOM;
}
break;
case ENTERED_ROOM:
if(input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_ONE:
if(input == TABLE_TWO) {
retVal = state.TABLE_GAME_TWO;
}
break;
case TABLE_GAME_TWO:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_THREE;
} else if (input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_THREE:
if(input == TABLE_TWO) {
retVal = state.TABLE_GAME_FOUR;
} else if (input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_FOUR:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_FIVE;
} else if (input == TABLE_ONE) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_FIVE:
if(input == TABLE_ONE) {
retVal = state.TABLE_GAME_SIX;
} else if (input == TABLE_TWO) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_SIX:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_SEVEN;
} else if (input == TABLE_TWO) {
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_SEVEN:
if(input == BLUE_BUTTON) {
retVal = state.TABLE_FINISH;
}
break;
case TABLE_FINISH:
if(input == ROKET_INPUT) {
retVal = state.ROKET_DONE;
}
}
return retVal;
}
}