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

168 lines
4.5 KiB
Java
Raw Normal View History

2012-05-09 23:04:14 +00:00
package de.ctdo.crashtest;
2012-05-10 13:53:18 +00:00
import java.util.ArrayList;
import java.util.List;
2012-05-09 23:04:14 +00:00
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';
2012-05-10 13:53:18 +00:00
private long lastHandleInput = 0;
private final List<StateChangeListener> stateChangeListenerList = new ArrayList<StateChangeListener>();
private int stateChangeCounter = 0;
public void addStateChangedListener(StateChangeListener listener) {
stateChangeListenerList.add(listener);
}
2012-05-10 09:06:16 +00:00
public enum state {
2012-05-09 23:04:14 +00:00
IDLE,
ENTERED_ROOM,
TABLE_GAME_ONE,
TABLE_GAME_TWO,
TABLE_GAME_THREE,
TABLE_GAME_FOUR,
TABLE_GAME_FIVE,
TABLE_GAME_SIX,
TABLE_GAME_SEVEN,
FINISH,
}
2012-05-10 09:06:16 +00:00
private state currentState = state.IDLE;
2012-05-09 23:04:14 +00:00
2012-05-10 09:06:16 +00:00
public state getCurrentState() {
2012-05-09 23:04:14 +00:00
return currentState;
}
2012-05-10 13:53:18 +00:00
public int getStateChangeCounter() {
return stateChangeCounter;
}
public void reset() {
stateChangeCounter = 0;
currentState = state.IDLE;
2012-05-15 20:58:20 +00:00
onStateChanged();
2012-05-10 13:53:18 +00:00
}
2012-05-09 23:04:14 +00:00
public void handleInput(char input) {
2012-05-10 13:53:18 +00:00
if(System.currentTimeMillis() - lastHandleInput < 200 ) return;
2012-05-09 23:04:14 +00:00
2012-05-10 09:06:16 +00:00
state newState = getNewState(input);
2012-05-10 13:53:18 +00:00
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:
2012-05-10 09:06:16 +00:00
2012-05-10 13:53:18 +00:00
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;
}
2012-05-10 09:06:16 +00:00
}
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;
2012-05-22 21:11:08 +00:00
} else if (input == TABLE_ONE) {
2012-05-10 09:06:16 +00:00
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_THREE:
if(input == TABLE_TWO) {
retVal = state.TABLE_GAME_FOUR;
2012-05-22 21:11:08 +00:00
} else if (input == TABLE_ONE) {
2012-05-10 09:06:16 +00:00
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_FOUR:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_FIVE;
2012-05-22 21:11:08 +00:00
} else if (input == TABLE_ONE) {
2012-05-10 09:06:16 +00:00
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_FIVE:
if(input == TABLE_ONE) {
retVal = state.TABLE_GAME_SIX;
2012-05-22 21:11:08 +00:00
} else if (input == TABLE_TWO) {
2012-05-10 09:06:16 +00:00
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_SIX:
if(input == TABLE_THREE) {
retVal = state.TABLE_GAME_SEVEN;
2012-05-22 21:11:08 +00:00
} else if (input == TABLE_TWO) {
2012-05-10 09:06:16 +00:00
retVal = state.TABLE_GAME_ONE;
}
break;
case TABLE_GAME_SEVEN:
if(input == BLUE_BUTTON) {
retVal = state.FINISH;
}
break;
}
2012-05-09 23:04:14 +00:00
2012-05-10 09:06:16 +00:00
return retVal;
2012-05-09 23:04:14 +00:00
}
}