From acaca0a8933ec51e23fca990058a462c32a177ee Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Mon, 24 Oct 2022 09:22:38 -0600 Subject: [PATCH 1/2] update rocket max altitude on either positive rocket Z velocity or actual increase in altitude create new SimulationStatus to report --- .../gui/simulation/SimulationRunDialog.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java index bb1f11147..ba7aee53d 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java @@ -49,9 +49,9 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.gui.widgets.SelectColorButton; - public class SimulationRunDialog extends JDialog { private static final long serialVersionUID = -1593459321777026455L; private static final Logger log = LoggerFactory.getLogger(SimulationRunDialog.class); @@ -328,10 +328,11 @@ public class SimulationRunDialog extends JDialog { // in order to calculate things like optimal coast time, we'll keep updating max altitude // whenever we see that the rocket is going upwards. The last apogee found is the real one. for (SimulationStatus s : chunks) { - if (s.getConfiguration().isStageActive(0) && (s.getRocketVelocity().z > 0)) { + if (s.getConfiguration().isStageActive(0) && + ((s.getRocketVelocity().z > 0) || (s.getRocketPosition().z > simulationMaxAltitude[index]))) { log.debug("updating simulationMaxAltitude[" + index + "] to " + s.getRocketPosition().z); simulationMaxAltitude[index] = s.getRocketPosition().z; - simulationMaxVelocity[index] = Math.max(simulationMaxVelocity[index], s.getRocketVelocity().length()); + simulationMaxVelocity[index] = Math.max(simulationMaxVelocity[index], s.getRocketVelocity().z); } } @@ -372,7 +373,6 @@ public class SimulationRunDialog extends JDialog { // >= 0 Landing. z-position from apogee to zero // TODO: MEDIUM: several stages - System.out.flush(); log.debug("simulationStage landing (" + simulationStage + "): alt=" + status.getRocketPosition().z + " apogee=" + simulationMaxAltitude[index]); setSimulationProgress(MathUtil.map(status.getRocketPosition().z, simulationMaxAltitude[index], 0, APOGEE_PROGRESS, 1.0)); updateProgress(); @@ -449,16 +449,17 @@ public class SimulationRunDialog extends JDialog { switch (event.getType()) { case APOGEE: log.debug("APOGEE"); - publish(status); + publish(new SimulationStatus(status)); break; case LAUNCH: - publish(status); + log.debug("LAUNCH"); + publish(new SimulationStatus(status)); break; case SIMULATION_END: log.debug("END"); - publish(status); + publish(new SimulationStatus(status)); break; default: @@ -471,7 +472,7 @@ public class SimulationRunDialog extends JDialog { public void postStep(SimulationStatus status) { if (System.currentTimeMillis() >= time + UPDATE_MS) { time = System.currentTimeMillis(); - publish(status); + publish(new SimulationStatus(status)); } } } From 5c8d995e7f50f74570b968f7a771df2e5772b776 Mon Sep 17 00:00:00 2001 From: JoePfeiffer Date: Mon, 24 Oct 2022 10:11:26 -0600 Subject: [PATCH 2/2] restore apogeeAltitude member variable to keep track of apogee. It turns out this wasn't quite redundant before; setting it included a call to MathUtil.max() to make sure it wasn't 0. --- .../sf/openrocket/gui/simulation/SimulationRunDialog.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java index ba7aee53d..44416bf24 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java @@ -270,6 +270,7 @@ public class SimulationRunDialog extends JDialog { private final int index; private final double burnoutTimeEstimate; private volatile double burnoutVelocity; + private volatile double apogeeAltitude; private final CustomExpressionSimulationListener exprListener; @@ -368,13 +369,14 @@ public class SimulationRunDialog extends JDialog { // Past apogee, switch to landing if (simulationStage == -1 && status.getRocketVelocity().z < 0) { simulationStage++; - log.debug("CHANGING to simulationStage " + simulationStage + ", apogee=" + simulationMaxAltitude[index]); + apogeeAltitude = MathUtil.max(simulationMaxAltitude[index], 1); + log.debug("CHANGING to simulationStage " + simulationStage + ", apogee=" + apogeeAltitude); } // >= 0 Landing. z-position from apogee to zero // TODO: MEDIUM: several stages - log.debug("simulationStage landing (" + simulationStage + "): alt=" + status.getRocketPosition().z + " apogee=" + simulationMaxAltitude[index]); - setSimulationProgress(MathUtil.map(status.getRocketPosition().z, simulationMaxAltitude[index], 0, APOGEE_PROGRESS, 1.0)); + log.debug("simulationStage landing (" + simulationStage + "): alt=" + status.getRocketPosition().z + " apogee=" + apogeeAltitude); + setSimulationProgress(MathUtil.map(status.getRocketPosition().z, apogeeAltitude, 0, APOGEE_PROGRESS, 1.0)); updateProgress(); }