/******************************************************************************* * 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.state; import java.io.Serializable; import java.util.Collection; import java.util.LinkedList; import java.util.List; import simulator.execution.model.Time; import simulator.persistence.SerializableResults; import simulator.scl.UnitOfTime; import simulator.scl.Variable; import simulator.srl.Results; import simulator.srl.SimulationElement; import simulator.srl.ResultsFactory; public class State implements Serializable { // Generated by Eclipse private static final long serialVersionUID = -5877262571868562720L; private String displayText = ""; private String indicatorText = ""; private int currentModeIndex = 0; private boolean alarmRinging = false; private final SerializableResults results = new SerializableResults(); private final VariableState variables = new VariableState(); private final int totalNumberOfModes; private final List<StateObserver> observers = new LinkedList<StateObserver>(); private transient List<ModeObserver> modeObservers; public State() { this(1); } public State(int totalNumberOfModes) { this.totalNumberOfModes = totalNumberOfModes; } public boolean isAlarmRinging() { return alarmRinging; } public void soundAlarm() { setAlarmRinging(true); } public void silenceAlarm() { setAlarmRinging(false); } private void setAlarmRinging(boolean alarmRinging) { this.alarmRinging = alarmRinging; notifyObservers(); } public String getDisplayText() { return displayText; } public void setDisplayText(String displayText) { this.displayText = displayText; notifyObservers(); } public String getIndicatorText() { return indicatorText; } public void setIndicatorText(String indicatorText) { this.indicatorText = indicatorText; notifyObservers(); } public Results getResults() { return results.getResults(); } public void addStimulusToResults(String type, Object... params) { addToResults(ResultsFactory.eINSTANCE.createStimulus(), type, params); } public void addResponseToResults(String type, Object... params) { addToResults(ResultsFactory.eINSTANCE.createResponse(), type, params); } public void addEnvironmentalChangeToResults(String type, Object... params) { addToResults(ResultsFactory.eINSTANCE.createEnvironmentalChange(), type, params); } private void addToResults(SimulationElement element, String type, Object... params) { element.setType(type); for (Object param : params) { element.getParams().add(param.toString()); } results.getElements().add(element); } public Time getValueOf(String variableName) { return variables.getValueOf(variableName); } public Time getValueOf(Variable variable) { return getValueOf(variable.getName()); } public void setValueOf(Variable variable, Time value) { setValueOf(variable.getName(), value); } public void setValueOf(String variableName, Time newValue) { variables.setValueOf(variableName, newValue); notifyObservers(); } public Time initialiseValueOf(Variable variable) { return initialiseValueOf(variable.getName()); } public Time initialiseValueOf(String variableName) { final Time initialValue = variables.initialiseValueOf(variableName); notifyObservers(); return initialValue; } public Collection<VariableWithValue> getVariableValues() { return variables.getValues(currentModeIndex); } public void incrementValueOf(String variableName, UnitOfTime unit) { final Time currentValue = getValueOf(variableName); final Time newValue = currentValue.increment(unit); addEnvironmentalChangeToResults("ManualIncrementVariable", currentValue.toString(), newValue.toString()); setValueOf(variableName, newValue); notifyObservers(); } public void nextMode() { incrementModeIndex(); notifyModeObservers(); } private void incrementModeIndex() { currentModeIndex = getNextModeIndex(); } public int getCurrentModeIndex() { return currentModeIndex; } public int getNextModeIndex() { return (currentModeIndex + 1) % totalNumberOfModes; } public void addObserver(StateObserver observer) { observers.add(observer); } public void removeObserve(StateObserver observer) { observers.remove(observer); } private void notifyObservers() { for (StateObserver observer : observers) { observer.stateChanged(this); } } public void addModeObserver(ModeObserver observer) { getModeObservers().add(observer); } private void notifyModeObservers() { notifyObservers(); for (ModeObserver observer : getModeObservers()) { observer.modeChanged(this); } } private List<ModeObserver> getModeObservers() { if (modeObservers == null) { modeObservers = new LinkedList<ModeObserver>(); } return modeObservers; } }