174 lines
4.7 KiB
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;
|
|
}
|
|
}
|