Have the simulation honor per-flight ignition values.
This commit is contained in:
parent
e6662b7622
commit
741bed3187
@ -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());
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user