Have the simulation honor per-flight ignition values.

This commit is contained in:
kruland2607 2012-10-19 14:43:36 -05:00
parent e6662b7622
commit 741bed3187
3 changed files with 38 additions and 8 deletions

View File

@ -5,6 +5,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import net.sf.openrocket.models.atmosphere.AtmosphericConditions; import net.sf.openrocket.models.atmosphere.AtmosphericConditions;
import net.sf.openrocket.rocketcomponent.MotorConfiguration;
import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.Monitorable; import net.sf.openrocket.util.Monitorable;
@ -21,6 +22,8 @@ public final class MotorInstanceConfiguration implements Monitorable, Cloneable
private final List<MotorId> unmodifiableIds = Collections.unmodifiableList(ids); private final List<MotorId> unmodifiableIds = Collections.unmodifiableList(ids);
private final List<MotorInstance> motors = new ArrayList<MotorInstance>(); private final List<MotorInstance> motors = new ArrayList<MotorInstance>();
private final List<MotorMount> mounts = new ArrayList<MotorMount>(); private final List<MotorMount> mounts = new ArrayList<MotorMount>();
private final List<MotorConfiguration.IgnitionEvent> ignitionEvents = new ArrayList<MotorConfiguration.IgnitionEvent>();
private final List<Double> ignitionDelays = new ArrayList<Double>();
private final List<Coordinate> positions = new ArrayList<Coordinate>(); private final List<Coordinate> positions = new ArrayList<Coordinate>();
private final List<Double> ignitionTimes = new ArrayList<Double>(); private final List<Double> ignitionTimes = new ArrayList<Double>();
@ -38,16 +41,29 @@ public final class MotorInstanceConfiguration implements Monitorable, Cloneable
* @param position the position of the motor in absolute coordinates. * @param position the position of the motor in absolute coordinates.
* @throws IllegalArgumentException if a motor with the specified ID already exists. * @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)) { if (this.ids.contains(id)) {
throw new IllegalArgumentException("MotorInstanceConfiguration already " + throw new IllegalArgumentException("MotorInstanceConfiguration already " +
"contains a motor with id " + id); "contains a motor with id " + id);
} }
this.ids.add(id); this.ids.add(id);
this.motors.add(motor); this.motors.add(motorConfig.getMotor().getInstance());
this.mounts.add(mount); this.mounts.add(mount);
this.positions.add(position); this.positions.add(position);
this.ignitionTimes.add(Double.POSITIVE_INFINITY); 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++; modID++;
} }
@ -84,6 +100,13 @@ public final class MotorInstanceConfiguration implements Monitorable, Cloneable
modID++; 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) { private int indexOf(MotorId id) {
@ -131,6 +154,8 @@ public final class MotorInstanceConfiguration implements Monitorable, Cloneable
clone.mounts.addAll(this.mounts); clone.mounts.addAll(this.mounts);
clone.positions.addAll(this.positions); clone.positions.addAll(this.positions);
clone.ignitionTimes.addAll(this.ignitionTimes); clone.ignitionTimes.addAll(this.ignitionTimes);
clone.ignitionEvents.addAll(this.ignitionEvents);
clone.ignitionDelays.addAll(this.ignitionDelays);
for (MotorInstance motor : this.motors) { for (MotorInstance motor : this.motors) {
clone.motors.add(motor.clone()); clone.motors.add(motor.clone());
} }

View File

@ -68,7 +68,7 @@ public class MotorConfiguration implements Cloneable {
} }
@Override @Override
protected MotorConfiguration clone() { public MotorConfiguration clone() {
MotorConfiguration clone = new MotorConfiguration(); MotorConfiguration clone = new MotorConfiguration();
clone.motor = motor; clone.motor = motor;
clone.ejectionDelay = ejectionDelay; clone.ejectionDelay = ejectionDelay;

View File

@ -15,6 +15,7 @@ import net.sf.openrocket.motor.MotorInstanceConfiguration;
import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.rocketcomponent.Configuration;
import net.sf.openrocket.rocketcomponent.DeploymentConfiguration; import net.sf.openrocket.rocketcomponent.DeploymentConfiguration;
import net.sf.openrocket.rocketcomponent.LaunchLug; import net.sf.openrocket.rocketcomponent.LaunchLug;
import net.sf.openrocket.rocketcomponent.MotorConfiguration;
import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.MotorMount;
import net.sf.openrocket.rocketcomponent.RecoveryDevice; import net.sf.openrocket.rocketcomponent.RecoveryDevice;
import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketcomponent.RocketComponent;
@ -285,14 +286,16 @@ public class BasicEventSimulationEngine implements SimulationEngine {
while (iterator.hasNext()) { while (iterator.hasNext()) {
MotorMount mount = iterator.next(); MotorMount mount = iterator.next();
RocketComponent component = (RocketComponent) mount; 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) { if (motor != null) {
Coordinate[] positions = component.toAbsolute(mount.getMotorPosition(motorId)); Coordinate[] positions = component.toAbsolute(mount.getMotorPosition(motorId));
for (int i = 0; i < positions.length; i++) { for (int i = 0; i < positions.length; i++) {
Coordinate position = positions[i]; Coordinate position = positions[i];
MotorId id = new MotorId(component.getID(), i + 1); 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 // Check for motor ignition events, add ignition events to queue
for (MotorId id : status.getMotorConfiguration().getMotorIDs()) { for (MotorId id : status.getMotorConfiguration().getMotorIDs()) {
MotorConfiguration.IgnitionEvent ignitionEvent = status.getMotorConfiguration().getMotorIgnitionEvent(id);
MotorMount mount = status.getMotorConfiguration().getMotorMount(id); MotorMount mount = status.getMotorConfiguration().getMotorMount(id);
RocketComponent component = (RocketComponent) mount; 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, addEvent(new FlightEvent(FlightEvent.Type.IGNITION,
status.getSimulationTime() + mount.getDefaultIgnitionDelay(), status.getSimulationTime() + ignitionDelay,
component, id)); component, id));
} }
} }