From f5755cc4af67355e3a986714fac08088034dbf56 Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Thu, 11 Jan 2024 09:30:41 -0700 Subject: [PATCH] Add explicit test and abort for "no stages defined" running simulation --- core/resources/l10n/messages.properties | 3 +++ .../sf/openrocket/logging/SimulationAbort.java | 3 +++ .../simulation/BasicEventSimulationEngine.java | 15 +++++++++++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 8467d4d03..7a3f369da 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -655,8 +655,11 @@ BasicEventSimulationEngine.error.noConfiguredIgnition = No motors configured to BasicEventSimulationEngine.error.noIgnition = No motors ignited. BasicEventSimulationEngine.error.NaNResult = Simulation resulted in not-a-number (NaN) value, please report a bug. +BasicEventSimlationEngine.nullBranchName = (null) + RK4SimulationStepper.error.valuesTooLarge = Simulation values exceeded limits. Try selecting a shorter time step. +SimulationAbort.noActiveStages = No active stages SimulationAbort.noMotorsDefined = No motors defined in the simulation SimulationAbort.noConfiguredIgnition = No motors configured to ignite at liftoff SimulationAbort.noIgnition = No motors ignited diff --git a/core/src/net/sf/openrocket/logging/SimulationAbort.java b/core/src/net/sf/openrocket/logging/SimulationAbort.java index e692c3f4a..7f1ed6ccd 100644 --- a/core/src/net/sf/openrocket/logging/SimulationAbort.java +++ b/core/src/net/sf/openrocket/logging/SimulationAbort.java @@ -24,6 +24,9 @@ public class SimulationAbort extends Message { * Possible causes of sim aborts */ public enum Cause { + // No active stages in simulation + NO_ACTIVE_STAGES(trans.get("SimulationAbort.noActiveStages")), + // No motors are defined in the sim configuration NOMOTORSDEFINED(trans.get("SimulationAbort.noMotorsDefined")), diff --git a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java index d169c9595..107ed4eff 100644 --- a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java +++ b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java @@ -75,8 +75,14 @@ public class BasicEventSimulationEngine implements SimulationEngine { simulationConfig.copyStages(origConfig); // Clone the stage activation configuration currentStatus = new SimulationStatus(simulationConfig, simulationConditions); - // main simulation branch - final String branchName = simulationConfig.getRocket().getTopmostStage(currentStatus.getConfiguration()).getName(); + // main simulation branch. Need to watch for pathological case with no stages defined + final AxialStage topStage = simulationConfig.getRocket().getTopmostStage(currentStatus.getConfiguration()); + final String branchName; + if (topStage != null) { + branchName = topStage.getName(); + } else { + branchName = trans.get("BasicEventSimulationEngine.nullBranchName"); + } FlightDataBranch initialBranch = new FlightDataBranch( branchName, FlightDataType.TYPE_TIME); // put a point on it so we can plot if we get an early abort event @@ -90,6 +96,11 @@ public class BasicEventSimulationEngine implements SimulationEngine { // Problems that keep us from simulating at all + // No active stages + if (topStage == null) { + currentStatus.abortSimulation(SimulationAbort.Cause.NO_ACTIVE_STAGES); + } + // No motors in configuration if (!simulationConfig.hasMotors() ) { currentStatus.abortSimulation(SimulationAbort.Cause.NOMOTORSDEFINED);