From 741bed318737caaa098e52e271cce3a54965d10a Mon Sep 17 00:00:00 2001 From: kruland2607 Date: Fri, 19 Oct 2012 14:43:36 -0500 Subject: [PATCH] Have the simulation honor per-flight ignition values. --- .../motor/MotorInstanceConfiguration.java | 31 +++++++++++++++++-- .../rocketcomponent/MotorConfiguration.java | 2 +- .../BasicEventSimulationEngine.java | 13 +++++--- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/core/src/net/sf/openrocket/motor/MotorInstanceConfiguration.java b/core/src/net/sf/openrocket/motor/MotorInstanceConfiguration.java index a3142028d..2bb5597ea 100644 --- a/core/src/net/sf/openrocket/motor/MotorInstanceConfiguration.java +++ b/core/src/net/sf/openrocket/motor/MotorInstanceConfiguration.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import net.sf.openrocket.models.atmosphere.AtmosphericConditions; +import net.sf.openrocket.rocketcomponent.MotorConfiguration; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Monitorable; @@ -21,6 +22,8 @@ public final class MotorInstanceConfiguration implements Monitorable, Cloneable private final List unmodifiableIds = Collections.unmodifiableList(ids); private final List motors = new ArrayList(); private final List mounts = new ArrayList(); + private final List ignitionEvents = new ArrayList(); + private final List ignitionDelays = new ArrayList(); private final List positions = new ArrayList(); private final List ignitionTimes = new ArrayList(); @@ -38,19 +41,32 @@ public final class MotorInstanceConfiguration implements Monitorable, Cloneable * @param position the position of the motor in absolute coordinates. * @throws IllegalArgumentException if a motor with the specified ID already exists. */ - public void addMotor(MotorId id, MotorInstance motor, MotorMount mount, Coordinate position) { + public void addMotor(MotorId id, MotorConfiguration motorConfig, MotorConfiguration defaultConfig, MotorMount mount, Coordinate position) { if (this.ids.contains(id)) { throw new IllegalArgumentException("MotorInstanceConfiguration already " + "contains a motor with id " + id); } this.ids.add(id); - this.motors.add(motor); + this.motors.add(motorConfig.getMotor().getInstance()); this.mounts.add(mount); this.positions.add(position); this.ignitionTimes.add(Double.POSITIVE_INFINITY); + MotorConfiguration.IgnitionEvent ignitionEvent = motorConfig.getIgnitionEvent(); + if ( ignitionEvent == null ) { + ignitionEvent = defaultConfig.getIgnitionEvent(); + } + this.ignitionEvents.add(ignitionEvent); + Double ignitionDelay = motorConfig.getIgnitionDelay(); + if ( ignitionDelay == null ) { + ignitionDelay = defaultConfig.getIgnitionDelay(); + } + if (ignitionDelay == null ) { + ignitionDelay = 0d; + } + this.ignitionDelays.add(ignitionDelay); modID++; } - + /** * Return a list of all motor IDs in this configuration (not only ones in active stages). */ @@ -84,6 +100,13 @@ public final class MotorInstanceConfiguration implements Monitorable, Cloneable modID++; } + public double getMotorIgnitionDelay(MotorId id ) { + return ignitionDelays.get(indexOf(id)); + } + + public MotorConfiguration.IgnitionEvent getMotorIgnitionEvent( MotorId id ) { + return ignitionEvents.get(indexOf(id)); + } private int indexOf(MotorId id) { @@ -131,6 +154,8 @@ public final class MotorInstanceConfiguration implements Monitorable, Cloneable clone.mounts.addAll(this.mounts); clone.positions.addAll(this.positions); clone.ignitionTimes.addAll(this.ignitionTimes); + clone.ignitionEvents.addAll(this.ignitionEvents); + clone.ignitionDelays.addAll(this.ignitionDelays); for (MotorInstance motor : this.motors) { clone.motors.add(motor.clone()); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/MotorConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/MotorConfiguration.java index 1419baef3..287a49bd7 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MotorConfiguration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MotorConfiguration.java @@ -68,7 +68,7 @@ public class MotorConfiguration implements Cloneable { } @Override - protected MotorConfiguration clone() { + public MotorConfiguration clone() { MotorConfiguration clone = new MotorConfiguration(); clone.motor = motor; clone.ejectionDelay = ejectionDelay; diff --git a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java index f4556e57f..dfd38ffee 100644 --- a/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java +++ b/core/src/net/sf/openrocket/simulation/BasicEventSimulationEngine.java @@ -15,6 +15,7 @@ import net.sf.openrocket.motor.MotorInstanceConfiguration; import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; import net.sf.openrocket.rocketcomponent.LaunchLug; +import net.sf.openrocket.rocketcomponent.MotorConfiguration; import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.RocketComponent; @@ -285,14 +286,16 @@ public class BasicEventSimulationEngine implements SimulationEngine { while (iterator.hasNext()) { MotorMount mount = iterator.next(); RocketComponent component = (RocketComponent) mount; - Motor motor = mount.getMotor(motorId); + MotorConfiguration motorConfig = mount.getFlightConfiguration(motorId); + MotorConfiguration defaultConfig = mount.getDefaultFlightConfiguration(); + Motor motor = motorConfig.getMotor(); if (motor != null) { Coordinate[] positions = component.toAbsolute(mount.getMotorPosition(motorId)); for (int i = 0; i < positions.length; i++) { Coordinate position = positions[i]; MotorId id = new MotorId(component.getID(), i + 1); - motors.addMotor(id, motor.getInstance(), mount, position); + motors.addMotor(id, motorConfig, defaultConfig, mount, position); } } } @@ -345,12 +348,14 @@ public class BasicEventSimulationEngine implements SimulationEngine { // Check for motor ignition events, add ignition events to queue for (MotorId id : status.getMotorConfiguration().getMotorIDs()) { + MotorConfiguration.IgnitionEvent ignitionEvent = status.getMotorConfiguration().getMotorIgnitionEvent(id); MotorMount mount = status.getMotorConfiguration().getMotorMount(id); RocketComponent component = (RocketComponent) mount; - if (mount.getDefaultIgnitionEvent().isActivationEvent(event, component)) { + if (ignitionEvent.isActivationEvent(event, component)) { + double ignitionDelay = status.getMotorConfiguration().getMotorIgnitionDelay(id); addEvent(new FlightEvent(FlightEvent.Type.IGNITION, - status.getSimulationTime() + mount.getDefaultIgnitionDelay(), + status.getSimulationTime() + ignitionDelay, component, id)); } }