Integrate SIM_ABORT into code across OR

This commit is contained in:
JoePfeiffer 2023-12-24 10:32:10 -07:00
parent 2123531f14
commit 173a3d38e2
6 changed files with 56 additions and 30 deletions

View File

@ -662,7 +662,7 @@ SimulationAbort.noIgnition = No motors ignited
SimulationAbort.noLiftOff = <html>Motor burnout without liftoff.<br>Use more (powerful) motors, or decrease the rocket mass.</html>
SimulationAbort.activeLengthZero = Active airframe has length 0
SimulationAbort.noCP = Can't calculate Center of Pressure
SimulationAbort.totalMassZero = Total mass of active stages is 0
SimulationAbort.activeMassZero = Total mass of active stages is 0
SimulationModifierTree.OptimizationParameters = Optimization Parameters

View File

@ -37,12 +37,12 @@ public class SimulationAbort extends Message {
public static final SimulationAbort NOCONFIGUREDIGNITION = new SimulationAbort(trans.get("SimulationAbort.noConfiguredIgnition"));
// No motors fired (can this really happen without getting a NoMotorsDefined?)
public static final SimulationAbort NOMOTORSFIRED = new SimulationAbort(trans.get("SimulationAbort.noMotorsIgnited"));
public static final SimulationAbort NOMOTORSFIRED = new SimulationAbort(trans.get("SimulationAbort.noIgnition"));
// Motors ignited, but rocket did not lift off
public static final SimulationAbort NOLIFTOFF = new SimulationAbort(trans.get("SimulationAbort.noLiftOff"));
// It is impossible to calculate the stage's center of pressure
// It is impossible to calculate the active components' center of pressure
public static final SimulationAbort NOCP = new SimulationAbort(trans.get("SimulationAbort.noCP"));
// The currently active components have a total length of 0

View File

@ -7,6 +7,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.openrocket.aerodynamics.FlightConditions;
import net.sf.openrocket.logging.SimulationAbort;
import net.sf.openrocket.logging.Warning;
import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.l10n.Translator;
@ -178,7 +179,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
// If we haven't hit the ground, add altitude event
if (!currentStatus.isLanded())
addEvent(new FlightEvent(FlightEvent.Type.ALTITUDE, currentStatus.getSimulationTime(),
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.ALTITUDE, currentStatus.getSimulationTime(),
currentStatus.getConfiguration().getRocket(),
new Pair<Double, Double>(oldAlt, currentStatus.getRocketPosition().z)));
@ -200,16 +201,16 @@ public class BasicEventSimulationEngine implements SimulationEngine {
}
// Detect lift-off
if (relativePosition.z > 0.02) {
addEvent(new FlightEvent(FlightEvent.Type.LIFTOFF, currentStatus.getSimulationTime()));
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.LIFTOFF, currentStatus.getSimulationTime()));
}
} else {
// Check ground hit after liftoff
if ((currentStatus.getRocketPosition().z < MathUtil.EPSILON) && !currentStatus.isLanded()) {
addEvent(new FlightEvent(FlightEvent.Type.GROUND_HIT, currentStatus.getSimulationTime()));
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.GROUND_HIT, currentStatus.getSimulationTime()));
// addEvent(new FlightEvent(FlightEvent.Type.SIMULATION_END, currentStatus.getSimulationTime()));
// currentStatus.addEvent(new FlightEvent(FlightEvent.Type.SIMULATION_END, currentStatus.getSimulationTime()));
}
}
@ -218,14 +219,14 @@ public class BasicEventSimulationEngine implements SimulationEngine {
if (currentStatus.isLiftoff() &&
!currentStatus.isLaunchRodCleared() &&
relativePosition.length() > currentStatus.getSimulationConditions().getLaunchRodLength()) {
addEvent(new FlightEvent(FlightEvent.Type.LAUNCHROD, currentStatus.getSimulationTime(), null));
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.LAUNCHROD, currentStatus.getSimulationTime(), null));
}
// Check for apogee
if (!currentStatus.isApogeeReached() && currentStatus.getRocketPosition().z < currentStatus.getMaxAlt() - 0.01) {
currentStatus.setMaxAltTime(previousSimulationTime);
addEvent(new FlightEvent(FlightEvent.Type.APOGEE, previousSimulationTime,
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.APOGEE, previousSimulationTime,
currentStatus.getConfiguration().getRocket()));
}
@ -234,7 +235,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
// // Check for burnt out motors
// for( MotorClusterState state : currentStatus.getActiveMotors()){
// if ( state.isSpent()){
// addEvent(new FlightEvent(FlightEvent.Type.BURNOUT, currentStatus.getSimulationTime(),
// currentStatus.addEvent(new FlightEvent(FlightEvent.Type.BURNOUT, currentStatus.getSimulationTime(),
// (RocketComponent) state.getMount(), state));
// }
// }
@ -256,13 +257,13 @@ public class BasicEventSimulationEngine implements SimulationEngine {
final boolean isSustainer = currentStatus.getConfiguration().isStageActive(0);
final boolean isApogee = currentStatus.isApogeeReached();
if (wantToTumble && (isApogee || !isSustainer)) {
addEvent(new FlightEvent(FlightEvent.Type.TUMBLE, currentStatus.getSimulationTime()));
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.TUMBLE, currentStatus.getSimulationTime()));
}
}
// If I'm on the ground and have no events in the queue, I'm done
if (currentStatus.isLanded() && currentStatus.getEventQueue().isEmpty())
addEvent(new FlightEvent(FlightEvent.Type.SIMULATION_END, currentStatus.getSimulationTime()));
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.SIMULATION_END, currentStatus.getSimulationTime()));
previousSimulationTime = currentStatus.getSimulationTime();
}
@ -270,7 +271,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
} catch (SimulationException e) {
SimulationListenerHelper.fireEndSimulation(currentStatus, e);
// Add FlightEvent for Abort.
// Add FlightEvent for exception.
currentStatus.getFlightData().addEvent(new FlightEvent(FlightEvent.Type.EXCEPTION, currentStatus.getSimulationTime(), currentStatus.getConfiguration().getRocket(), e.getLocalizedMessage()));
flightData.addBranch(currentStatus.getFlightData());
@ -325,7 +326,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
log.info("Queueing Ignition Event for: "+state.toDescription()+" @: "+ignitionTime);
//log.info(" Because of "+event.getShapeType().name()+" @"+event.getTime()+" from: "+event.getSource().getName());
addEvent(new FlightEvent(FlightEvent.Type.IGNITION, ignitionTime, (RocketComponent) mount, state ));
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.IGNITION, ignitionTime, (RocketComponent) mount, state ));
}
}
@ -360,7 +361,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
StageSeparationConfiguration separationConfig = stage.getSeparationConfigurations().get(this.fcid);
if (separationConfig.getSeparationEvent().isSeparationEvent(event, stage)) {
addEvent(new FlightEvent(FlightEvent.Type.STAGE_SEPARATION,
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.STAGE_SEPARATION,
event.getTime() + separationConfig.getSeparationDelay(), stage));
}
}
@ -374,7 +375,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
DeploymentConfiguration deployConfig = ((RecoveryDevice) c).getDeploymentConfigurations().get(this.fcid);
if (deployConfig.isActivationEvent(event, c)) {
// Delay event by at least 1ms to allow stage separation to occur first
addEvent(new FlightEvent(FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT,
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT,
event.getTime() + Math.max(0.001, deployConfig.getDeployDelay()), c));
}
}
@ -415,7 +416,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
// and queue up the burnout for this motor, as well.
double duration = motorState.getBurnTime();
double burnout = currentStatus.getSimulationTime() + duration;
addEvent(new FlightEvent(FlightEvent.Type.BURNOUT, burnout,
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.BURNOUT, burnout,
event.getSource(), motorState ));
break;
}
@ -450,7 +451,7 @@ public class BasicEventSimulationEngine implements SimulationEngine {
double delay = motorState.getEjectionDelay();
if ( motorState.hasEjectionCharge() ){
addEvent(new FlightEvent(FlightEvent.Type.EJECTION_CHARGE, currentStatus.getSimulationTime() + delay,
currentStatus.addEvent(new FlightEvent(FlightEvent.Type.EJECTION_CHARGE, currentStatus.getSimulationTime() + delay,
stage, event.getData()));
}
currentStatus.getFlightData().addEvent(event);
@ -586,6 +587,11 @@ public class BasicEventSimulationEngine implements SimulationEngine {
currentStatus.getFlightData().addEvent(event);
break;
case SIM_ABORT:
ret = false;
currentStatus.getFlightData().addEvent(event);
break;
case SIMULATION_END:
ret = false;
currentStatus.getFlightData().addEvent(event);
@ -632,17 +638,6 @@ public class BasicEventSimulationEngine implements SimulationEngine {
return ret;
}
/**
* Add a flight event to the event queue unless a listener aborts adding it.
*
* @param event the event to add to the queue.
*/
private void addEvent(FlightEvent event) throws SimulationException {
if (SimulationListenerHelper.fireAddFlightEvent(currentStatus, event)) {
currentStatus.getEventQueue().add(event);
}
}
/**

View File

@ -8,6 +8,9 @@ import java.util.Map;
import java.util.Set;
import net.sf.openrocket.aerodynamics.FlightConditions;
import net.sf.openrocket.simulation.exception.SimulationException;
import net.sf.openrocket.simulation.listeners.SimulationListenerHelper;
import net.sf.openrocket.logging.SimulationAbort;
import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.motor.MotorConfiguration;
import net.sf.openrocket.motor.MotorConfigurationId;
@ -550,4 +553,22 @@ public class SimulationStatus implements Monitorable {
}
}
/**
* Add a flight event to the event queue unless a listener aborts adding it.
*
* @param event the event to add to the queue.
*/
public void addEvent(FlightEvent event) throws SimulationException {
if (SimulationListenerHelper.fireAddFlightEvent(this, event)) {
getEventQueue().add(event);
}
}
/**
* Abort the current simulation branch
*/
public void abortSimulation(SimulationAbort cause) throws SimulationException {
addEvent(new FlightEvent(FlightEvent.Type.SIM_ABORT, getSimulationTime(), null, cause));
}
}

View File

@ -58,6 +58,7 @@ public class EventGraphics {
loadImage(FlightEvent.Type.GROUND_HIT, "pix/eventicons/event-ground-hit.png");
loadImage(FlightEvent.Type.SIMULATION_END, "pix/eventicons/event-simulation-end.png");
loadImage(FlightEvent.Type.EXCEPTION, "pix/eventicons/event-exception.png");
loadImage(FlightEvent.Type.SIM_ABORT, "pix/eventicons/event-exception.png");
}
private static void loadImage(FlightEvent.Type type, String file) {

View File

@ -39,6 +39,7 @@ public class PlotConfiguration implements Cloneable {
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
config.setEvent(FlightEvent.Type.TUMBLE, true);
config.setEvent(FlightEvent.Type.EXCEPTION, true);
config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config);
//// Total motion vs. time
@ -54,6 +55,7 @@ public class PlotConfiguration implements Cloneable {
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
config.setEvent(FlightEvent.Type.TUMBLE, true);
config.setEvent(FlightEvent.Type.EXCEPTION, true);
config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config);
//// Flight side profile
@ -67,6 +69,7 @@ public class PlotConfiguration implements Cloneable {
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
config.setEvent(FlightEvent.Type.TUMBLE, true);
config.setEvent(FlightEvent.Type.EXCEPTION, true);
config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config);
@ -79,6 +82,8 @@ public class PlotConfiguration implements Cloneable {
config.setEvent(FlightEvent.Type.APOGEE, true);
config.setEvent(FlightEvent.Type.RECOVERY_DEVICE_DEPLOYMENT, true);
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
config.setEvent(FlightEvent.Type.EXCEPTION, true);
config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config);
//// Stability vs. time
@ -93,7 +98,7 @@ public class PlotConfiguration implements Cloneable {
config.setEvent(FlightEvent.Type.STAGE_SEPARATION, true);
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
config.setEvent(FlightEvent.Type.TUMBLE, true);
config.setEvent(FlightEvent.Type.EXCEPTION, true);
config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config);
//// Drag coefficients vs. Mach number
@ -104,6 +109,7 @@ public class PlotConfiguration implements Cloneable {
config.addPlotDataType(FlightDataType.TYPE_BASE_DRAG_COEFF, 0);
config.addPlotDataType(FlightDataType.TYPE_PRESSURE_DRAG_COEFF, 0);
config.setEvent(FlightEvent.Type.EXCEPTION, true);
config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config);
//// Roll characteristics
@ -121,6 +127,7 @@ public class PlotConfiguration implements Cloneable {
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
config.setEvent(FlightEvent.Type.TUMBLE, true);
config.setEvent(FlightEvent.Type.EXCEPTION, true);
config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config);
//// Angle of attack and orientation vs. time
@ -136,6 +143,7 @@ public class PlotConfiguration implements Cloneable {
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
config.setEvent(FlightEvent.Type.TUMBLE, true);
config.setEvent(FlightEvent.Type.EXCEPTION, true);
config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config);
//// Simulation time step and computation time
@ -150,6 +158,7 @@ public class PlotConfiguration implements Cloneable {
config.setEvent(FlightEvent.Type.GROUND_HIT, true);
config.setEvent(FlightEvent.Type.TUMBLE, true);
config.setEvent(FlightEvent.Type.EXCEPTION, true);
config.setEvent(FlightEvent.Type.SIM_ABORT, true);
configs.add(config);
DEFAULT_CONFIGURATIONS = configs.toArray(new PlotConfiguration[0]);