1 package net.sf.openrocket.simulation.listeners.example;
4 import java.io.FileNotFoundException;
5 import java.io.PrintStream;
6 import java.util.Iterator;
8 import net.sf.openrocket.rocketcomponent.FinSet;
9 import net.sf.openrocket.rocketcomponent.RocketComponent;
10 import net.sf.openrocket.simulation.FlightDataType;
11 import net.sf.openrocket.simulation.FlightEvent;
12 import net.sf.openrocket.simulation.SimulationStatus;
13 import net.sf.openrocket.simulation.exception.SimulationException;
14 import net.sf.openrocket.simulation.listeners.AbstractSimulationListener;
17 public class CSVSaveListener extends AbstractSimulationListener {
19 private static enum Types {
22 public double getValue(SimulationStatus status) {
23 return status.getSimulationTime();
28 public double getValue(SimulationStatus status) {
29 return status.getRocketPosition().x;
34 public double getValue(SimulationStatus status) {
35 return status.getRocketPosition().y;
40 public double getValue(SimulationStatus status) {
41 return status.getRocketPosition().z;
46 public double getValue(SimulationStatus status) {
47 return status.getRocketVelocity().x;
52 public double getValue(SimulationStatus status) {
53 return status.getRocketVelocity().y;
58 public double getValue(SimulationStatus status) {
59 return status.getRocketVelocity().z;
64 public double getValue(SimulationStatus status) {
65 return status.getFlightData().getLast(FlightDataType.TYPE_ORIENTATION_THETA);
70 public double getValue(SimulationStatus status) {
71 return status.getFlightData().getLast(FlightDataType.TYPE_ORIENTATION_PHI);
76 public double getValue(SimulationStatus status) {
77 return status.getFlightData().getLast(FlightDataType.TYPE_AOA);
82 public double getValue(SimulationStatus status) {
83 return status.getFlightData().getLast(FlightDataType.TYPE_ROLL_RATE);
88 public double getValue(SimulationStatus status) {
89 return status.getFlightData().getLast(FlightDataType.TYPE_PITCH_RATE);
95 public double getValue(SimulationStatus status) {
96 return status.getFlightData().getLast(FlightDataType.TYPE_PITCH_MOMENT_COEFF);
101 public double getValue(SimulationStatus status) {
102 return status.getFlightData().getLast(FlightDataType.TYPE_YAW_MOMENT_COEFF);
107 public double getValue(SimulationStatus status) {
108 return status.getFlightData().getLast(FlightDataType.TYPE_ROLL_MOMENT_COEFF);
113 public double getValue(SimulationStatus status) {
114 return status.getFlightData().getLast(FlightDataType.TYPE_NORMAL_FORCE_COEFF);
119 public double getValue(SimulationStatus status) {
120 return status.getFlightData().getLast(FlightDataType.TYPE_SIDE_FORCE_COEFF);
125 public double getValue(SimulationStatus status) {
126 return status.getFlightData().getLast(FlightDataType.TYPE_DRAG_FORCE);
131 public double getValue(SimulationStatus status) {
132 return status.getFlightData().getLast(FlightDataType.TYPE_WIND_VELOCITY);
137 public double getValue(SimulationStatus status) {
138 return status.getFlightData().getLast(FlightDataType.TYPE_PITCH_DAMPING_MOMENT_COEFF);
143 public double getValue(SimulationStatus status) {
144 return status.getFlightData().getLast(FlightDataType.TYPE_AXIAL_DRAG_COEFF);
149 public double getValue(SimulationStatus status) {
150 return status.getFlightData().getLast(FlightDataType.TYPE_DRAG_COEFF);
155 public double getValue(SimulationStatus status) {
156 return status.getFlightData().getLast(FlightDataType.TYPE_PRESSURE_DRAG_COEFF);
161 public double getValue(SimulationStatus status) {
162 return status.getFlightData().getLast(FlightDataType.TYPE_FRICTION_DRAG_COEFF);
167 public double getValue(SimulationStatus status) {
168 return status.getFlightData().getLast(FlightDataType.TYPE_BASE_DRAG_COEFF);
173 public double getValue(SimulationStatus status) {
174 return status.getFlightData().getLast(FlightDataType.TYPE_MACH_NUMBER);
179 public double getValue(SimulationStatus status) {
180 return status.getFlightData().getLast(FlightDataType.TYPE_REYNOLDS_NUMBER);
186 public double getValue(SimulationStatus status) {
187 Iterator<RocketComponent> iterator =
188 status.getConfiguration().getRocket().iterator();
191 while (iterator.hasNext()) {
192 RocketComponent c = iterator.next();
193 if (c instanceof FinSet && c.getName().equals("CONTROL")) {
200 return fin.getCantAngle();
206 public double getValue(SimulationStatus status) {
207 return status.getFlightData().getLast(FlightDataType.TYPE_MASS);
213 public abstract double getValue(SimulationStatus status);
217 public static final String FILENAME_FORMAT = "simulation-%03d.csv";
220 private PrintStream output = null;
224 public boolean handleFlightEvent(SimulationStatus status, FlightEvent event) throws SimulationException {
226 if (event.getType() == FlightEvent.Type.LAUNCH) {
229 if (output != null) {
230 System.err.println("WARNING: Ending simulation logging to CSV file " +
231 "(SIMULATION_END not encountered).");
237 file = new File(String.format(FILENAME_FORMAT, n));
239 } while (file.exists());
241 System.err.println("Opening file " + file + " for CSV output.");
243 output = new PrintStream(file);
244 } catch (FileNotFoundException e) {
245 System.err.println("ERROR OPENING FILE: " + e);
248 final Types[] types = Types.values();
249 StringBuilder s = new StringBuilder("# " + types[0].toString());
250 for (int i = 1; i < types.length; i++) {
251 s.append("," + types[i].toString());
255 } else if (event.getType() == FlightEvent.Type.SIMULATION_END && output != null) {
257 System.err.println("Ending simulation logging to CSV file: " + file);
261 } else if (event.getType() != FlightEvent.Type.ALTITUDE) {
263 if (output != null) {
264 output.println("# Event " + event);
266 System.err.println("WARNING: Event " + event + " encountered without open file");
275 public void postStep(SimulationStatus status) throws SimulationException {
277 final Types[] types = Types.values();
280 if (output != null) {
282 s = new StringBuilder("" + types[0].getValue(status));
283 for (int i = 1; i < types.length; i++) {
284 s.append("," + types[i].getValue(status));
290 System.err.println("WARNING: stepTaken called with no open file " +
291 "(t=" + status.getSimulationTime() + ")");