package de.ctdo.crashtest; import java.util.ArrayList; import java.util.List; public class Statemachine { private final char BLUE_BUTTON = 'd'; private final char LIGHT_BARRIER = 'k'; private final char TABLE_ONE = 'c'; private final char TABLE_TWO = 'v'; private final char TABLE_THREE = 'b'; private long lastHandleInput = 0; private final List stateChangeListenerList = new ArrayList(); 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, FINISH, } private state currentState = state.IDLE; public state getCurrentState() { return currentState; } public int getStateChangeCounter() { return stateChangeCounter; } public void reset() { stateChangeCounter = 0; currentState = state.IDLE; } 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; } else { retVal = state.TABLE_GAME_ONE; } break; case TABLE_GAME_TWO: if(input == TABLE_THREE) { retVal = state.TABLE_GAME_THREE; } else { retVal = state.TABLE_GAME_ONE; } break; case TABLE_GAME_THREE: if(input == TABLE_TWO) { retVal = state.TABLE_GAME_FOUR; } else { retVal = state.TABLE_GAME_ONE; } break; case TABLE_GAME_FOUR: if(input == TABLE_THREE) { retVal = state.TABLE_GAME_FIVE; } else { retVal = state.TABLE_GAME_ONE; } break; case TABLE_GAME_FIVE: if(input == TABLE_ONE) { retVal = state.TABLE_GAME_SIX; } else { retVal = state.TABLE_GAME_ONE; } break; case TABLE_GAME_SIX: if(input == TABLE_THREE) { retVal = state.TABLE_GAME_SEVEN; } else { retVal = state.TABLE_GAME_ONE; } break; case TABLE_GAME_SEVEN: if(input == BLUE_BUTTON) { retVal = state.FINISH; } else { retVal = state.TABLE_GAME_ONE; } break; } return retVal; } }