1 package net.sf.openrocket.simulation.listeners;
4 import java.io.FileNotFoundException;
5 import java.io.PrintStream;
6 import java.util.Collection;
8 import net.sf.openrocket.simulation.FlightDataBranch;
9 import net.sf.openrocket.simulation.FlightEvent;
10 import net.sf.openrocket.simulation.SimulationStatus;
13 public class RollSaveListener extends AbstractSimulationListener {
15 private static enum Types {
18 public double getValue(SimulationStatus status) {
24 public double getValue(SimulationStatus status) {
25 return status.position.z;
30 public double getValue(SimulationStatus status) {
31 return status.velocity.z;
36 public double getValue(SimulationStatus status) {
37 return status.flightData.getLast(FlightDataBranch.TYPE_ORIENTATION_THETA);
42 public double getValue(SimulationStatus status) {
43 return status.flightData.getLast(FlightDataBranch.TYPE_AOA);
48 public double getValue(SimulationStatus status) {
49 return status.flightData.getLast(FlightDataBranch.TYPE_ROLL_RATE);
54 public double getValue(SimulationStatus status) {
55 return status.flightData.getLast(FlightDataBranch.TYPE_PITCH_RATE);
60 public double getValue(SimulationStatus status) {
61 return status.flightData.getLast(FlightDataBranch.TYPE_ROLL_MOMENT_COEFF);
66 public double getValue(SimulationStatus status) {
67 return status.flightData.getLast(FlightDataBranch.TYPE_MACH_NUMBER);
73 public abstract double getValue(SimulationStatus status);
77 public static final String FILENAME_FORMAT = "simulation-%03d.csv";
80 private PrintStream output = null;
85 public Collection<FlightEvent> handleEvent(FlightEvent event,
86 SimulationStatus status) {
88 if (event.getType() == FlightEvent.Type.LAUNCH) {
92 System.err.println("WARNING: Ending simulation logging to CSV file " +
93 "(SIMULATION_END not encountered).");
99 file = new File(String.format(FILENAME_FORMAT, n));
101 } while (file.exists());
103 System.err.println("Opening file "+file+" for CSV output.");
105 output = new PrintStream(file);
106 } catch (FileNotFoundException e) {
107 System.err.println("ERROR OPENING FILE: "+e);
110 final Types[] types = Types.values();
111 StringBuilder s = new StringBuilder("# " + types[0].toString());
112 for (int i=1; i<types.length; i++) {
113 s.append("," + types[i].toString());
117 } else if (event.getType() == FlightEvent.Type.SIMULATION_END && output != null) {
119 System.err.println("Ending simulation logging to CSV file: "+file);
123 } else if (event.getType() != FlightEvent.Type.ALTITUDE){
125 if (output != null) {
126 output.println("# Event "+event);
128 System.err.println("WARNING: Event "+event+" encountered without open file");
138 public Collection<FlightEvent> stepTaken(SimulationStatus status) {
140 final Types[] types = Types.values();
143 if (output != null) {
145 s = new StringBuilder("" + types[0].getValue(status));
146 for (int i=1; i<types.length; i++) {
147 s.append("," + types[i].getValue(status));
153 System.err.println("WARNING: stepTaken called with no open file " +
154 "(t="+status.time+")");