Support for configurable stage separation
This commit is contained in:
parent
737ede90a7
commit
e56dabfd78
@ -1,3 +1,11 @@
|
|||||||
|
2012-02-10 Sampo Niskanen
|
||||||
|
|
||||||
|
* Configurable stage separation events
|
||||||
|
|
||||||
|
2012-00-00 Doug Pedrick
|
||||||
|
|
||||||
|
* RKT saving support
|
||||||
|
|
||||||
2011-11-24 Sampo Niskanen
|
2011-11-24 Sampo Niskanen
|
||||||
|
|
||||||
* Released version 1.1.9
|
* Released version 1.1.9
|
||||||
|
@ -674,6 +674,13 @@ ComponentCfgDlg.configuration = configuration
|
|||||||
ComponentCfgDlg.configuration1 =
|
ComponentCfgDlg.configuration1 =
|
||||||
ComponentCfgDlg.Modify = Modify
|
ComponentCfgDlg.Modify = Modify
|
||||||
|
|
||||||
|
!StageConfig
|
||||||
|
StageConfig.tab.Separation = Separation
|
||||||
|
StageConfig.tab.Separation.ttip = Stage separation options
|
||||||
|
StageConfig.separation.lbl.title = Select when this stage separates:
|
||||||
|
StageConfig.separation.lbl.plus = plus
|
||||||
|
StageConfig.separation.lbl.seconds = seconds
|
||||||
|
|
||||||
!EllipticalFinSetConfig
|
!EllipticalFinSetConfig
|
||||||
EllipticalFinSetCfg.Nbroffins = Number of fins:
|
EllipticalFinSetCfg.Nbroffins = Number of fins:
|
||||||
EllipticalFinSetCfg.Rotation = Rotation:
|
EllipticalFinSetCfg.Rotation = Rotation:
|
||||||
@ -1120,6 +1127,14 @@ NoseCone.NoseCone = Nose cone
|
|||||||
Transition.Transition = Transition
|
Transition.Transition = Transition
|
||||||
!Stage
|
!Stage
|
||||||
Stage.Stage = Stage
|
Stage.Stage = Stage
|
||||||
|
|
||||||
|
Stage.SeparationEvent.UPPER_IGNITION = Upper stage motor ignition
|
||||||
|
Stage.SeparationEvent.IGNITION = Current stage motor ignition
|
||||||
|
Stage.SeparationEvent.BURNOUT = Current stage motor burnout
|
||||||
|
Stage.SeparationEvent.EJECTION = Current stage ejection charge
|
||||||
|
Stage.SeparationEvent.LAUNCH = Launch
|
||||||
|
Stage.SeparationEvent.NEVER = Never
|
||||||
|
|
||||||
! BodyTube
|
! BodyTube
|
||||||
BodyTube.BodyTube = Body tube
|
BodyTube.BodyTube = Body tube
|
||||||
! TubeCoupler
|
! TubeCoupler
|
||||||
|
@ -478,6 +478,14 @@ class DocumentConfig {
|
|||||||
Reflection.findMethod(Rocket.class, "setDesigner", String.class)));
|
Reflection.findMethod(Rocket.class, "setDesigner", String.class)));
|
||||||
setters.put("Rocket:revision", new StringSetter(
|
setters.put("Rocket:revision", new StringSetter(
|
||||||
Reflection.findMethod(Rocket.class, "setRevision", String.class)));
|
Reflection.findMethod(Rocket.class, "setRevision", String.class)));
|
||||||
|
|
||||||
|
// Stage
|
||||||
|
setters.put("Stage:separationevent", new EnumSetter<Stage.SeparationEvent>(
|
||||||
|
Reflection.findMethod(Stage.class, "setSeparationEvent", Stage.SeparationEvent.class),
|
||||||
|
Stage.SeparationEvent.class));
|
||||||
|
setters.put("Stage:separationdelay", new DoubleSetter(
|
||||||
|
Reflection.findMethod(Stage.class, "setSeparationDelay", double.class)));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,20 +1,35 @@
|
|||||||
package net.sf.openrocket.file.openrocket.savers;
|
package net.sf.openrocket.file.openrocket.savers;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
|
import net.sf.openrocket.rocketcomponent.Stage;
|
||||||
|
|
||||||
public class StageSaver extends ComponentAssemblySaver {
|
public class StageSaver extends ComponentAssemblySaver {
|
||||||
|
|
||||||
private static final StageSaver instance = new StageSaver();
|
private static final StageSaver instance = new StageSaver();
|
||||||
|
|
||||||
public static ArrayList<String> getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) {
|
public static ArrayList<String> getElements(net.sf.openrocket.rocketcomponent.RocketComponent c) {
|
||||||
ArrayList<String> list = new ArrayList<String>();
|
ArrayList<String> list = new ArrayList<String>();
|
||||||
|
|
||||||
list.add("<stage>");
|
list.add("<stage>");
|
||||||
instance.addParams(c,list);
|
instance.addParams(c, list);
|
||||||
list.add("</stage>");
|
list.add("</stage>");
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addParams(RocketComponent c, List<String> elements) {
|
||||||
|
super.addParams(c, elements);
|
||||||
|
Stage stage = (Stage) c;
|
||||||
|
|
||||||
|
if (stage.getStageNumber() > 0) {
|
||||||
|
elements.add("<separationevent>"
|
||||||
|
+ stage.getSeparationEvent().name().toLowerCase().replace("_", "")
|
||||||
|
+ "</separationevent>");
|
||||||
|
elements.add("<separationdelay>" + stage.getSeparationDelay() + "</separationdelay>");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
60
core/src/net/sf/openrocket/gui/configdialog/StageConfig.java
Normal file
60
core/src/net/sf/openrocket/gui/configdialog/StageConfig.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package net.sf.openrocket.gui.configdialog;
|
||||||
|
|
||||||
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.JLabel;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
import javax.swing.JSpinner;
|
||||||
|
|
||||||
|
import net.miginfocom.swing.MigLayout;
|
||||||
|
import net.sf.openrocket.document.OpenRocketDocument;
|
||||||
|
import net.sf.openrocket.gui.SpinnerEditor;
|
||||||
|
import net.sf.openrocket.gui.adaptors.DoubleModel;
|
||||||
|
import net.sf.openrocket.gui.adaptors.EnumModel;
|
||||||
|
import net.sf.openrocket.gui.components.StyledLabel;
|
||||||
|
import net.sf.openrocket.gui.components.StyledLabel.Style;
|
||||||
|
import net.sf.openrocket.l10n.Translator;
|
||||||
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
|
import net.sf.openrocket.rocketcomponent.Stage;
|
||||||
|
import net.sf.openrocket.rocketcomponent.Stage.SeparationEvent;
|
||||||
|
import net.sf.openrocket.startup.Application;
|
||||||
|
|
||||||
|
public class StageConfig extends RocketComponentConfig {
|
||||||
|
private static final Translator trans = Application.getTranslator();
|
||||||
|
|
||||||
|
public StageConfig(OpenRocketDocument document, RocketComponent component) {
|
||||||
|
super(document, component);
|
||||||
|
|
||||||
|
// Stage separation config (for non-first stage)
|
||||||
|
if (component.getStageNumber() > 0) {
|
||||||
|
JPanel tab = separationTab((Stage) component);
|
||||||
|
tabbedPane.insertTab(trans.get("tab.Separation"), null, tab,
|
||||||
|
trans.get("tab.Separation.ttip"), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private JPanel separationTab(Stage stage) {
|
||||||
|
JPanel panel = new JPanel(new MigLayout("fill"));
|
||||||
|
|
||||||
|
// Select separation event
|
||||||
|
panel.add(new StyledLabel(trans.get("separation.lbl.title"), Style.BOLD), "spanx, wrap rel");
|
||||||
|
|
||||||
|
JComboBox combo = new JComboBox(new EnumModel<SeparationEvent>(stage, "SeparationEvent"));
|
||||||
|
panel.add(combo, "");
|
||||||
|
|
||||||
|
// ... and delay
|
||||||
|
panel.add(new JLabel(trans.get("separation.lbl.plus")), "");
|
||||||
|
|
||||||
|
DoubleModel dm = new DoubleModel(stage, "SeparationDelay", 0);
|
||||||
|
JSpinner spin = new JSpinner(dm.getSpinnerModel());
|
||||||
|
spin.setEditor(new SpinnerEditor(spin));
|
||||||
|
panel.add(spin, "");
|
||||||
|
|
||||||
|
//// seconds
|
||||||
|
panel.add(new JLabel(trans.get("separation.lbl.seconds")), "wrap unrel");
|
||||||
|
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,34 +1,152 @@
|
|||||||
package net.sf.openrocket.rocketcomponent;
|
package net.sf.openrocket.rocketcomponent;
|
||||||
|
|
||||||
import net.sf.openrocket.l10n.Translator;
|
import net.sf.openrocket.l10n.Translator;
|
||||||
|
import net.sf.openrocket.simulation.FlightEvent;
|
||||||
import net.sf.openrocket.startup.Application;
|
import net.sf.openrocket.startup.Application;
|
||||||
|
import net.sf.openrocket.util.MathUtil;
|
||||||
|
|
||||||
public class Stage extends ComponentAssembly {
|
public class Stage extends ComponentAssembly {
|
||||||
|
|
||||||
private static final Translator trans = Application.getTranslator();
|
private static final Translator trans = Application.getTranslator();
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getComponentName () {
|
public static enum SeparationEvent {
|
||||||
//// Stage
|
//// Upper stage motor ignition
|
||||||
return trans.get("Stage.Stage");
|
UPPER_IGNITION("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("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("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("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("Stage.SeparationEvent.LAUNCH") {
|
||||||
|
@Override
|
||||||
|
public boolean isSeparationEvent(FlightEvent e, Stage stage) {
|
||||||
|
return e.getType() == FlightEvent.Type.LAUNCH;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//// Never
|
||||||
|
NEVER("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 trans.get(description);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
private SeparationEvent separationEvent = SeparationEvent.UPPER_IGNITION;
|
||||||
|
private double separationDelay = 0;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getComponentName() {
|
||||||
|
//// Stage
|
||||||
|
return trans.get("Stage.Stage");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public SeparationEvent getSeparationEvent() {
|
||||||
|
return separationEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setSeparationEvent(SeparationEvent separationEvent) {
|
||||||
|
if (separationEvent == this.separationEvent)
|
||||||
|
return;
|
||||||
|
this.separationEvent = separationEvent;
|
||||||
|
fireComponentChangeEvent(ComponentChangeEvent.EVENT_CHANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public double getSeparationDelay() {
|
||||||
|
return separationDelay;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setSeparationDelay(double separationDelay) {
|
||||||
|
if (MathUtil.equals(separationDelay, this.separationDelay))
|
||||||
|
return;
|
||||||
|
this.separationDelay = separationDelay;
|
||||||
|
fireComponentChangeEvent(ComponentChangeEvent.EVENT_CHANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean allowsChildren() {
|
public boolean allowsChildren() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether the given type can be added to this component. A Stage allows
|
* Check whether the given type can be added to this component. A Stage allows
|
||||||
* only BodyComponents to be added.
|
* only BodyComponents to be added.
|
||||||
*
|
*
|
||||||
* @param type The RocketComponent class type to add.
|
* @param type The RocketComponent class type to add.
|
||||||
*
|
*
|
||||||
* @return Whether such a component can be added.
|
* @return Whether such a component can be added.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isCompatible (Class<? extends RocketComponent> type) {
|
public boolean isCompatible(Class<? extends RocketComponent> type) {
|
||||||
return BodyComponent.class.isAssignableFrom(type);
|
return BodyComponent.class.isAssignableFrom(type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ import net.sf.openrocket.rocketcomponent.LaunchLug;
|
|||||||
import net.sf.openrocket.rocketcomponent.MotorMount;
|
import net.sf.openrocket.rocketcomponent.MotorMount;
|
||||||
import net.sf.openrocket.rocketcomponent.RecoveryDevice;
|
import net.sf.openrocket.rocketcomponent.RecoveryDevice;
|
||||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
|
import net.sf.openrocket.rocketcomponent.Stage;
|
||||||
import net.sf.openrocket.simulation.exception.MotorIgnitionException;
|
import net.sf.openrocket.simulation.exception.MotorIgnitionException;
|
||||||
import net.sf.openrocket.simulation.exception.SimulationException;
|
import net.sf.openrocket.simulation.exception.SimulationException;
|
||||||
import net.sf.openrocket.simulation.exception.SimulationLaunchException;
|
import net.sf.openrocket.simulation.exception.SimulationLaunchException;
|
||||||
@ -60,7 +61,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
status = initialStatus(configuration, motorConfiguration, simulationConditions, flightData);
|
status = initialStatus(configuration, motorConfiguration, simulationConditions, flightData);
|
||||||
status = currentStepper.initialize(status);
|
status = currentStepper.initialize(status);
|
||||||
|
|
||||||
|
|
||||||
SimulationListenerHelper.fireStartSimulation(status);
|
SimulationListenerHelper.fireStartSimulation(status);
|
||||||
// Get originating position (in case listener has modified launch position)
|
// Get originating position (in case listener has modified launch position)
|
||||||
Coordinate origin = status.getRocketPosition();
|
Coordinate origin = status.getRocketPosition();
|
||||||
@ -87,7 +88,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
SimulationListenerHelper.firePostStep(status);
|
SimulationListenerHelper.firePostStep(status);
|
||||||
|
|
||||||
|
|
||||||
// Check for NaN values in the simulation status
|
// Check for NaN values in the simulation status
|
||||||
checkNaN();
|
checkNaN();
|
||||||
|
|
||||||
@ -100,7 +101,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
maxAlt = status.getRocketPosition().z;
|
maxAlt = status.getRocketPosition().z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Position relative to start location
|
// Position relative to start location
|
||||||
Coordinate relativePosition = status.getRocketPosition().sub(origin);
|
Coordinate relativePosition = status.getRocketPosition().sub(origin);
|
||||||
|
|
||||||
@ -134,14 +135,14 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
addEvent(new FlightEvent(FlightEvent.Type.LAUNCHROD, status.getSimulationTime(), null));
|
addEvent(new FlightEvent(FlightEvent.Type.LAUNCHROD, status.getSimulationTime(), null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Check for apogee
|
// Check for apogee
|
||||||
if (!status.isApogeeReached() && status.getRocketPosition().z < maxAlt - 0.01) {
|
if (!status.isApogeeReached() && status.getRocketPosition().z < maxAlt - 0.01) {
|
||||||
addEvent(new FlightEvent(FlightEvent.Type.APOGEE, status.getSimulationTime(),
|
addEvent(new FlightEvent(FlightEvent.Type.APOGEE, status.getSimulationTime(),
|
||||||
status.getConfiguration().getRocket()));
|
status.getConfiguration().getRocket()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Check for burnt out motors
|
// Check for burnt out motors
|
||||||
for (MotorId motorId : status.getMotorConfiguration().getMotorIDs()) {
|
for (MotorId motorId : status.getMotorConfiguration().getMotorIDs()) {
|
||||||
MotorInstance motor = status.getMotorConfiguration().getMotorInstance(motorId);
|
MotorInstance motor = status.getMotorConfiguration().getMotorInstance(motorId);
|
||||||
@ -171,7 +172,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private SimulationStatus initialStatus(Configuration configuration,
|
private SimulationStatus initialStatus(Configuration configuration,
|
||||||
MotorInstanceConfiguration motorConfiguration,
|
MotorInstanceConfiguration motorConfiguration,
|
||||||
SimulationConditions simulationConditions, FlightData flightData) {
|
SimulationConditions simulationConditions, FlightData flightData) {
|
||||||
@ -201,7 +202,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
init.setRocketOrientationQuaternion(o);
|
init.setRocketOrientationQuaternion(o);
|
||||||
init.setRocketRotationVelocity(Coordinate.NUL);
|
init.setRocketRotationVelocity(Coordinate.NUL);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculate the effective launch rod length taking into account launch lugs.
|
* Calculate the effective launch rod length taking into account launch lugs.
|
||||||
* If no lugs are found, assume a tower launcher of full length.
|
* If no lugs are found, assume a tower launcher of full length.
|
||||||
@ -228,8 +229,8 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
init.setEffectiveLaunchRodLength(length);
|
init.setEffectiveLaunchRodLength(length);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
init.setSimulationStartWallTime(System.nanoTime());
|
init.setSimulationStartWallTime(System.nanoTime());
|
||||||
|
|
||||||
init.setMotorIgnited(false);
|
init.setMotorIgnited(false);
|
||||||
@ -246,7 +247,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a rocket configuration from the launch conditions.
|
* Create a rocket configuration from the launch conditions.
|
||||||
*
|
*
|
||||||
@ -262,7 +263,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new motor instance configuration for the rocket configuration.
|
* Create a new motor instance configuration for the rocket configuration.
|
||||||
*
|
*
|
||||||
@ -302,6 +303,12 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
|
|
||||||
for (event = nextEvent(); event != null; event = nextEvent()) {
|
for (event = nextEvent(); event != null; event = nextEvent()) {
|
||||||
|
|
||||||
|
// Ignore events for components that are no longer attached to the rocket
|
||||||
|
if (event.getSource() != null && event.getSource().getParent() != null &&
|
||||||
|
!status.getConfiguration().isStageActive(event.getSource().getStageNumber())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Call simulation listeners, allow aborting event handling
|
// Call simulation listeners, allow aborting event handling
|
||||||
if (!SimulationListenerHelper.fireHandleFlightEvent(status, event)) {
|
if (!SimulationListenerHelper.fireHandleFlightEvent(status, event)) {
|
||||||
continue;
|
continue;
|
||||||
@ -327,8 +334,8 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Check for motor ignition events, add ignition events to queue
|
// Check for motor ignition events, add ignition events to queue
|
||||||
for (MotorId id : status.getMotorConfiguration().getMotorIDs()) {
|
for (MotorId id : status.getMotorConfiguration().getMotorIDs()) {
|
||||||
MotorMount mount = status.getMotorConfiguration().getMotorMount(id);
|
MotorMount mount = status.getMotorConfiguration().getMotorMount(id);
|
||||||
@ -341,7 +348,20 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Check for stage separation event
|
||||||
|
for (int stageNo : status.getConfiguration().getActiveStages()) {
|
||||||
|
if (stageNo == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Stage stage = (Stage) status.getConfiguration().getRocket().getChild(stageNo);
|
||||||
|
if (stage.getSeparationEvent().isSeparationEvent(event, stage)) {
|
||||||
|
addEvent(new FlightEvent(FlightEvent.Type.STAGE_SEPARATION,
|
||||||
|
event.getTime() + stage.getSeparationDelay(), stage));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Check for recovery device deployment, add events to queue
|
// Check for recovery device deployment, add events to queue
|
||||||
Iterator<RocketComponent> rci = status.getConfiguration().iterator();
|
Iterator<RocketComponent> rci = status.getConfiguration().iterator();
|
||||||
while (rci.hasNext()) {
|
while (rci.hasNext()) {
|
||||||
@ -355,7 +375,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Handle event
|
// Handle event
|
||||||
switch (event.getType()) {
|
switch (event.getType()) {
|
||||||
|
|
||||||
@ -363,7 +383,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
status.getFlightData().addEvent(event);
|
status.getFlightData().addEvent(event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case IGNITION: {
|
case IGNITION: {
|
||||||
// Ignite the motor
|
// Ignite the motor
|
||||||
MotorMount mount = (MotorMount) event.getSource();
|
MotorMount mount = (MotorMount) event.getSource();
|
||||||
@ -374,31 +394,23 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
status.setMotorIgnited(true);
|
status.setMotorIgnited(true);
|
||||||
status.getFlightData().addEvent(event);
|
status.getFlightData().addEvent(event);
|
||||||
|
|
||||||
// Add stage separation event if appropriate
|
|
||||||
int n = component.getStageNumber();
|
|
||||||
if (n < component.getRocket().getStageCount() - 1) {
|
|
||||||
if (status.getConfiguration().isStageActive(n + 1)) {
|
|
||||||
addEvent(new FlightEvent(FlightEvent.Type.STAGE_SEPARATION, event.getTime(),
|
|
||||||
component.getStage()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case LIFTOFF: {
|
case LIFTOFF: {
|
||||||
// Mark lift-off as occurred
|
// Mark lift-off as occurred
|
||||||
status.setLiftoff(true);
|
status.setLiftoff(true);
|
||||||
status.getFlightData().addEvent(event);
|
status.getFlightData().addEvent(event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case LAUNCHROD: {
|
case LAUNCHROD: {
|
||||||
// Mark launch rod as cleared
|
// Mark launch rod as cleared
|
||||||
status.setLaunchRodCleared(true);
|
status.setLaunchRodCleared(true);
|
||||||
status.getFlightData().addEvent(event);
|
status.getFlightData().addEvent(event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case BURNOUT: {
|
case BURNOUT: {
|
||||||
// If motor burnout occurs without lift-off, abort
|
// If motor burnout occurs without lift-off, abort
|
||||||
if (!status.isLiftoff()) {
|
if (!status.isLiftoff()) {
|
||||||
@ -415,21 +427,21 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
status.getFlightData().addEvent(event);
|
status.getFlightData().addEvent(event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case EJECTION_CHARGE: {
|
case EJECTION_CHARGE: {
|
||||||
status.getFlightData().addEvent(event);
|
status.getFlightData().addEvent(event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case STAGE_SEPARATION: {
|
case STAGE_SEPARATION: {
|
||||||
// TODO: HIGH: Store lower stages to be simulated later
|
// TODO: HIGH: Store lower stages to be simulated later
|
||||||
RocketComponent stage = event.getSource();
|
RocketComponent stage = event.getSource();
|
||||||
int n = stage.getStageNumber();
|
int n = stage.getStageNumber();
|
||||||
status.getConfiguration().setToStage(n);
|
status.getConfiguration().setToStage(n - 1);
|
||||||
status.getFlightData().addEvent(event);
|
status.getFlightData().addEvent(event);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case APOGEE:
|
case APOGEE:
|
||||||
// Mark apogee as reached
|
// Mark apogee as reached
|
||||||
status.setApogeeReached(true);
|
status.setApogeeReached(true);
|
||||||
@ -494,7 +506,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// If no motor has ignited, abort
|
// If no motor has ignited, abort
|
||||||
if (!status.isMotorIgnited()) {
|
if (!status.isMotorIgnited()) {
|
||||||
throw new MotorIgnitionException("No motors ignited.");
|
throw new MotorIgnitionException("No motors ignited.");
|
||||||
@ -503,7 +515,6 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a flight event to the event queue unless a listener aborts adding it.
|
* Add a flight event to the event queue unless a listener aborts adding it.
|
||||||
*
|
*
|
||||||
@ -516,7 +527,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the next flight event to handle, or null if no more events should be handled.
|
* Return the next flight event to handle, or null if no more events should be handled.
|
||||||
* This method jumps the simulation time forward in case no motors have been ignited.
|
* This method jumps the simulation time forward in case no motors have been ignited.
|
||||||
@ -543,7 +554,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void checkNaN() throws SimulationException {
|
private void checkNaN() throws SimulationException {
|
||||||
double d = 0;
|
double d = 0;
|
||||||
boolean b = false;
|
boolean b = false;
|
||||||
@ -568,5 +579,5 @@ public class BasicEventSimulationEngine implements SimulationEngine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ import net.sf.openrocket.startup.Application;
|
|||||||
*/
|
*/
|
||||||
public class FlightEvent implements Comparable<FlightEvent> {
|
public class FlightEvent implements Comparable<FlightEvent> {
|
||||||
private static final Translator trans = Application.getTranslator();
|
private static final Translator trans = Application.getTranslator();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The type of the flight event.
|
* The type of the flight event.
|
||||||
*
|
*
|
||||||
@ -22,68 +22,56 @@ public class FlightEvent implements Comparable<FlightEvent> {
|
|||||||
/**
|
/**
|
||||||
* Rocket launch.
|
* Rocket launch.
|
||||||
*/
|
*/
|
||||||
//// Launch
|
|
||||||
LAUNCH(trans.get("FlightEvent.Type.LAUNCH")),
|
LAUNCH(trans.get("FlightEvent.Type.LAUNCH")),
|
||||||
/**
|
/**
|
||||||
* Ignition of a motor. Source is the motor mount the motor of which has ignited,
|
* Ignition of a motor. Source is the motor mount the motor of which has ignited,
|
||||||
* and the data is the MotorId of the motor instance.
|
* and the data is the MotorId of the motor instance.
|
||||||
*/
|
*/
|
||||||
//// Motor ignition
|
|
||||||
IGNITION(trans.get("FlightEvent.Type.IGNITION")),
|
IGNITION(trans.get("FlightEvent.Type.IGNITION")),
|
||||||
/**
|
/**
|
||||||
* When the motor has lifted off the ground.
|
* When the motor has lifted off the ground.
|
||||||
*/
|
*/
|
||||||
//// Lift-off
|
|
||||||
LIFTOFF(trans.get("FlightEvent.Type.LIFTOFF")),
|
LIFTOFF(trans.get("FlightEvent.Type.LIFTOFF")),
|
||||||
/**
|
/**
|
||||||
* Launch rod has been cleared.
|
* Launch rod has been cleared.
|
||||||
*/
|
*/
|
||||||
//// Launch rod clearance
|
|
||||||
LAUNCHROD(trans.get("FlightEvent.Type.LAUNCHROD")),
|
LAUNCHROD(trans.get("FlightEvent.Type.LAUNCHROD")),
|
||||||
/**
|
/**
|
||||||
* Burnout of a motor. Source is the motor mount the motor of which has burnt out,
|
* Burnout of a motor. Source is the motor mount the motor of which has burnt out,
|
||||||
* and the data is the MotorId of the motor instance.
|
* and the data is the MotorId of the motor instance.
|
||||||
*/
|
*/
|
||||||
//// Motor burnout
|
|
||||||
BURNOUT(trans.get("FlightEvent.Type.BURNOUT")),
|
BURNOUT(trans.get("FlightEvent.Type.BURNOUT")),
|
||||||
/**
|
/**
|
||||||
* Ejection charge of a motor fired. Source is the motor mount the motor of
|
* Ejection charge of a motor fired. Source is the motor mount the motor of
|
||||||
* which has exploded its ejection charge, and data is the MotorId of the motor instance.
|
* which has exploded its ejection charge, and data is the MotorId of the motor instance.
|
||||||
*/
|
*/
|
||||||
//// Ejection charge
|
|
||||||
EJECTION_CHARGE(trans.get("FlightEvent.Type.EJECTION_CHARGE")),
|
EJECTION_CHARGE(trans.get("FlightEvent.Type.EJECTION_CHARGE")),
|
||||||
/**
|
/**
|
||||||
* Separation of a stage. Source is the stage which has separated all lower stages.
|
* Separation of a stage. Source is the stage which is being separated from the upper stages.
|
||||||
*/
|
*/
|
||||||
//// Stage separation
|
|
||||||
STAGE_SEPARATION(trans.get("FlightEvent.Type.STAGE_SEPARATION")),
|
STAGE_SEPARATION(trans.get("FlightEvent.Type.STAGE_SEPARATION")),
|
||||||
/**
|
/**
|
||||||
* Apogee has been reached.
|
* Apogee has been reached.
|
||||||
*/
|
*/
|
||||||
//// Apogee
|
|
||||||
APOGEE(trans.get("FlightEvent.Type.APOGEE")),
|
APOGEE(trans.get("FlightEvent.Type.APOGEE")),
|
||||||
/**
|
/**
|
||||||
* Opening of a recovery device. Source is the RecoveryComponent which has opened.
|
* Opening of a recovery device. Source is the RecoveryComponent which has opened.
|
||||||
*/
|
*/
|
||||||
//// Recovery device deployment
|
|
||||||
RECOVERY_DEVICE_DEPLOYMENT(trans.get("FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT")),
|
RECOVERY_DEVICE_DEPLOYMENT(trans.get("FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT")),
|
||||||
/**
|
/**
|
||||||
* Ground has been hit after flight.
|
* Ground has been hit after flight.
|
||||||
*/
|
*/
|
||||||
//// Ground hit
|
|
||||||
GROUND_HIT(trans.get("FlightEvent.Type.GROUND_HIT")),
|
GROUND_HIT(trans.get("FlightEvent.Type.GROUND_HIT")),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* End of simulation. Placing this to the queue will end the simulation.
|
* End of simulation. Placing this to the queue will end the simulation.
|
||||||
*/
|
*/
|
||||||
//// Simulation end
|
|
||||||
SIMULATION_END(trans.get("FlightEvent.Type.SIMULATION_END")),
|
SIMULATION_END(trans.get("FlightEvent.Type.SIMULATION_END")),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A change in altitude has occurred. Data is a <code>Pair<Double,Double></code>
|
* A change in altitude has occurred. Data is a <code>Pair<Double,Double></code>
|
||||||
* which contains the old and new altitudes.
|
* which contains the old and new altitudes.
|
||||||
*/
|
*/
|
||||||
//// Altitude change
|
|
||||||
ALTITUDE(trans.get("FlightEvent.Type.ALTITUDE"));
|
ALTITUDE(trans.get("FlightEvent.Type.ALTITUDE"));
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
@ -120,7 +108,7 @@ public class FlightEvent implements Comparable<FlightEvent> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public Type getType() {
|
public Type getType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user