From a4fdc333ad301b007bacdebea8eaf6d2beb80d23 Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Wed, 4 Jan 2023 09:21:15 -0700 Subject: [PATCH] Inhibit reignition of already ignited motor If a later stage motor's ignition event is triggered by burnout of earlier stage motors, an ignition even gets queued for every burnout in the earlier stage. This checks to see if a motor is already burning when an ignition event is processed for it, and ignores the event if so. --- .../openrocket/simulation/BasicEventSimulationEngine.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java index e31fa4a98..33b39174a 100644 --- a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java +++ b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java @@ -396,7 +396,13 @@ public class BasicEventSimulationEngine implements SimulationEngine { case IGNITION: { MotorClusterState motorState = (MotorClusterState) event.getData(); - + + // If there are multiple ignition events (as is the case if the preceding stage has several burnout events, for instance) + // We get multiple ignition events for the upper stage motor. Ignore are all after the first. + if (motorState.getIgnitionTime() < currentStatus.getSimulationTime()) { + log.info("Ignoring motor " +motorState.toDescription()+" ignition event @"+currentStatus.getSimulationTime()); + continue; + } log.info(" Igniting motor: "+motorState.toDescription()+" @"+currentStatus.getSimulationTime()); motorState.ignite( event.getTime());