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 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());
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user