Integrate SIM_ABORT into code across OR
This commit is contained in:
		
							parent
							
								
									2123531f14
								
							
						
					
					
						commit
						173a3d38e2
					
				| @ -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 | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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); | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| 	 | ||||
| 	/** | ||||
|  | ||||
| @ -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)); | ||||
| 	} | ||||
| 				  | ||||
| } | ||||
|  | ||||
| @ -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) { | ||||
|  | ||||
| @ -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]); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user