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 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<MotorId> unmodifiableIds = Collections.unmodifiableList(ids);
private final List<MotorInstance> motors = new ArrayList<MotorInstance>();
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<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.
* @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++;
}
@ -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());
}

View File

@ -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;

View File

@ -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));
}
}