/*******************************************************************************
* 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;
}
}