/*******************************************************************************
* Copyright (c) 2011 The University of York.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Louis Rose - initial API and implementation
******************************************************************************/
package simulator.execution.model;
import java.util.Arrays;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import simulator.execution.model.actions.RunnableActionGroup;
import simulator.execution.model.state.ModeObserver;
import simulator.execution.model.state.State;
import simulator.scl.Action;
import simulator.scl.Button;
import simulator.scl.Mode;
public class Modes implements ModeObserver {
private final List<Mode> modes;
public Modes(Mode... modes) {
this(Arrays.asList(modes));
}
public Modes(List<Mode> modes) {
this.modes = modes;
}
public Mode getCurrentMode(State state) {
return modes.get(state.getCurrentModeIndex());
}
public void pressButton(int buttonIndex, State state) {
state.addStimulusToResults("ButtonPress", "" + buttonIndex);
run(getButton(buttonIndex, state).getBehaviour(), state);
}
private Button getButton(int buttonIndex, State state) {
return getCurrentMode(state).getButtons().get(buttonIndex);
}
@Override
public void modeChanged(State state) {
runEntryActionsOfCurrentMode(state);
}
private void runEntryActionsOfCurrentMode(State state) {
run(getCurrentMode(state).getEntryActions(), state);
}
private void run(EList<Action> actions, State state) {
new RunnableActionGroup(actions).run(state);
}
}