package net.sf.openrocket.rocketcomponent;
import java.util.EventObject;
import java.util.List;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.simulation.FlightEvent;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.ArrayList;
import net.sf.openrocket.util.MathUtil;
import net.sf.openrocket.util.StateChangeListener;
public class StageSeparationConfiguration implements FlightConfigurableParameter<StageSeparationConfiguration> {
public static enum SeparationEvent {
//// Upper stage motor ignition
UPPER_IGNITION(trans.get("Stage.SeparationEvent.UPPER_IGNITION")) {
@Override
public boolean isSeparationEvent(FlightEvent e, Stage stage) {
if (e.getType() != FlightEvent.Type.IGNITION)
return false;
int ignition = e.getSource().getStageNumber();
int mount = stage.getStageNumber();
return (mount == ignition + 1);
}
},
//// Current stage motor ignition
IGNITION(trans.get("Stage.SeparationEvent.IGNITION")) {
@Override
public boolean isSeparationEvent(FlightEvent e, Stage stage) {
if (e.getType() != FlightEvent.Type.IGNITION)
return false;
int ignition = e.getSource().getStageNumber();
int mount = stage.getStageNumber();
return (mount == ignition);
}
},
//// Current stage motor burnout
BURNOUT(trans.get("Stage.SeparationEvent.BURNOUT")) {
@Override
public boolean isSeparationEvent(FlightEvent e, Stage stage) {
if (e.getType() != FlightEvent.Type.BURNOUT)
return false;
int ignition = e.getSource().getStageNumber();
int mount = stage.getStageNumber();
return (mount == ignition);
}
},
//// Current stage ejection charge
EJECTION(trans.get("Stage.SeparationEvent.EJECTION")) {
@Override
public boolean isSeparationEvent(FlightEvent e, Stage stage) {
if (e.getType() != FlightEvent.Type.EJECTION_CHARGE)
return false;
int ignition = e.getSource().getStageNumber();
int mount = stage.getStageNumber();
return (mount == ignition);
}
},
//// Launch
LAUNCH(trans.get("Stage.SeparationEvent.LAUNCH")) {
@Override
public boolean isSeparationEvent(FlightEvent e, Stage stage) {
return e.getType() == FlightEvent.Type.LAUNCH;
}
},
//// Never
NEVER(trans.get("Stage.SeparationEvent.NEVER")) {
@Override
public boolean isSeparationEvent(FlightEvent e, Stage stage) {
return false;
}
},
;
private final String description;
SeparationEvent(String description) {
this.description = description;
}
/**
* Test whether a specific event is a stage separation event.
*/
public abstract boolean isSeparationEvent(FlightEvent e, Stage stage);
@Override
public String toString() {
return description;
}
}
private static final Translator trans = Application.getTranslator();
private final List<StateChangeListener> listeners = new ArrayList<StateChangeListener>();
private SeparationEvent separationEvent = SeparationEvent.UPPER_IGNITION;
private double separationDelay = 0;
public SeparationEvent getSeparationEvent() {
return separationEvent;
}
public void setSeparationEvent(SeparationEvent separationEvent) {
if (separationEvent == null) {
throw new NullPointerException("separationEvent is null");
}
if (this.separationEvent == separationEvent) {
return;
}
this.separationEvent = separationEvent;
fireChangeEvent();
}
public double getSeparationDelay() {
return separationDelay;
}
public void setSeparationDelay(double separationDelay) {
if (MathUtil.equals(this.separationDelay, separationDelay)) {
return;
}
this.separationDelay = separationDelay;
fireChangeEvent();
}
@Override
public String toString() {
if (separationDelay > 0) {
return separationEvent.toString() + " + " + separationDelay + "s";
} else {
return separationEvent.toString();
}
}
@Override
public StageSeparationConfiguration clone() {
StageSeparationConfiguration clone = new StageSeparationConfiguration();
clone.separationEvent = this.separationEvent;
clone.separationDelay = this.separationDelay;
return clone;
}
@Override
public void addChangeListener(StateChangeListener listener) {
listeners.add(listener);
}
@Override
public void removeChangeListener(StateChangeListener listener) {
listeners.remove(listener);
}
private void fireChangeEvent() {
EventObject event = new EventObject(this);
Object[] list = listeners.toArray();
for (Object l : list) {
((StateChangeListener) l).stateChanged(event);
}
}
}