create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / simulation / listeners / example / CSVSaveListener.java
1 package net.sf.openrocket.simulation.listeners.example;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.PrintStream;
6 import java.util.Iterator;
7
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;
15
16
17 public class CSVSaveListener extends AbstractSimulationListener {
18         
19         private static enum Types {
20                 TIME {
21                         @Override
22                         public double getValue(SimulationStatus status) {
23                                 return status.getSimulationTime();
24                         }
25                 },
26                 POSITION_X {
27                         @Override
28                         public double getValue(SimulationStatus status) {
29                                 return status.getRocketPosition().x;
30                         }
31                 },
32                 POSITION_Y {
33                         @Override
34                         public double getValue(SimulationStatus status) {
35                                 return status.getRocketPosition().y;
36                         }
37                 },
38                 ALTITUDE {
39                         @Override
40                         public double getValue(SimulationStatus status) {
41                                 return status.getRocketPosition().z;
42                         }
43                 },
44                 VELOCITY_X {
45                         @Override
46                         public double getValue(SimulationStatus status) {
47                                 return status.getRocketVelocity().x;
48                         }
49                 },
50                 VELOCITY_Y {
51                         @Override
52                         public double getValue(SimulationStatus status) {
53                                 return status.getRocketVelocity().y;
54                         }
55                 },
56                 VELOCITY_Z {
57                         @Override
58                         public double getValue(SimulationStatus status) {
59                                 return status.getRocketVelocity().z;
60                         }
61                 },
62                 THETA {
63                         @Override
64                         public double getValue(SimulationStatus status) {
65                                 return status.getFlightData().getLast(FlightDataType.TYPE_ORIENTATION_THETA);
66                         }
67                 },
68                 PHI {
69                         @Override
70                         public double getValue(SimulationStatus status) {
71                                 return status.getFlightData().getLast(FlightDataType.TYPE_ORIENTATION_PHI);
72                         }
73                 },
74                 AOA {
75                         @Override
76                         public double getValue(SimulationStatus status) {
77                                 return status.getFlightData().getLast(FlightDataType.TYPE_AOA);
78                         }
79                 },
80                 ROLLRATE {
81                         @Override
82                         public double getValue(SimulationStatus status) {
83                                 return status.getFlightData().getLast(FlightDataType.TYPE_ROLL_RATE);
84                         }
85                 },
86                 PITCHRATE {
87                         @Override
88                         public double getValue(SimulationStatus status) {
89                                 return status.getFlightData().getLast(FlightDataType.TYPE_PITCH_RATE);
90                         }
91                 },
92                 
93                 PITCHMOMENT {
94                         @Override
95                         public double getValue(SimulationStatus status) {
96                                 return status.getFlightData().getLast(FlightDataType.TYPE_PITCH_MOMENT_COEFF);
97                         }
98                 },
99                 YAWMOMENT {
100                         @Override
101                         public double getValue(SimulationStatus status) {
102                                 return status.getFlightData().getLast(FlightDataType.TYPE_YAW_MOMENT_COEFF);
103                         }
104                 },
105                 ROLLMOMENT {
106                         @Override
107                         public double getValue(SimulationStatus status) {
108                                 return status.getFlightData().getLast(FlightDataType.TYPE_ROLL_MOMENT_COEFF);
109                         }
110                 },
111                 NORMALFORCE {
112                         @Override
113                         public double getValue(SimulationStatus status) {
114                                 return status.getFlightData().getLast(FlightDataType.TYPE_NORMAL_FORCE_COEFF);
115                         }
116                 },
117                 SIDEFORCE {
118                         @Override
119                         public double getValue(SimulationStatus status) {
120                                 return status.getFlightData().getLast(FlightDataType.TYPE_SIDE_FORCE_COEFF);
121                         }
122                 },
123                 AXIALFORCE {
124                         @Override
125                         public double getValue(SimulationStatus status) {
126                                 return status.getFlightData().getLast(FlightDataType.TYPE_DRAG_FORCE);
127                         }
128                 },
129                 WINDSPEED {
130                         @Override
131                         public double getValue(SimulationStatus status) {
132                                 return status.getFlightData().getLast(FlightDataType.TYPE_WIND_VELOCITY);
133                         }
134                 },
135                 PITCHDAMPING {
136                         @Override
137                         public double getValue(SimulationStatus status) {
138                                 return status.getFlightData().getLast(FlightDataType.TYPE_PITCH_DAMPING_MOMENT_COEFF);
139                         }
140                 },
141                 CA {
142                         @Override
143                         public double getValue(SimulationStatus status) {
144                                 return status.getFlightData().getLast(FlightDataType.TYPE_AXIAL_DRAG_COEFF);
145                         }
146                 },
147                 CD {
148                         @Override
149                         public double getValue(SimulationStatus status) {
150                                 return status.getFlightData().getLast(FlightDataType.TYPE_DRAG_COEFF);
151                         }
152                 },
153                 CDpressure {
154                         @Override
155                         public double getValue(SimulationStatus status) {
156                                 return status.getFlightData().getLast(FlightDataType.TYPE_PRESSURE_DRAG_COEFF);
157                         }
158                 },
159                 CDfriction {
160                         @Override
161                         public double getValue(SimulationStatus status) {
162                                 return status.getFlightData().getLast(FlightDataType.TYPE_FRICTION_DRAG_COEFF);
163                         }
164                 },
165                 CDbase {
166                         @Override
167                         public double getValue(SimulationStatus status) {
168                                 return status.getFlightData().getLast(FlightDataType.TYPE_BASE_DRAG_COEFF);
169                         }
170                 },
171                 MACH {
172                         @Override
173                         public double getValue(SimulationStatus status) {
174                                 return status.getFlightData().getLast(FlightDataType.TYPE_MACH_NUMBER);
175                         }
176                 },
177                 RE {
178                         @Override
179                         public double getValue(SimulationStatus status) {
180                                 return status.getFlightData().getLast(FlightDataType.TYPE_REYNOLDS_NUMBER);
181                         }
182                 },
183                 
184                 CONTROL_ANGLE {
185                         @Override
186                         public double getValue(SimulationStatus status) {
187                                 Iterator<RocketComponent> iterator =
188                                                 status.getConfiguration().getRocket().iterator();
189                                 FinSet fin = null;
190                                 
191                                 while (iterator.hasNext()) {
192                                         RocketComponent c = iterator.next();
193                                         if (c instanceof FinSet && c.getName().equals("CONTROL")) {
194                                                 fin = (FinSet) c;
195                                                 break;
196                                         }
197                                 }
198                                 if (fin == null)
199                                         return 0;
200                                 return fin.getCantAngle();
201                         }
202                 },
203                 
204                 MASS {
205                         @Override
206                         public double getValue(SimulationStatus status) {
207                                 return status.getFlightData().getLast(FlightDataType.TYPE_MASS);
208                         }
209                 }
210
211                 ;
212                 
213                 public abstract double getValue(SimulationStatus status);
214         }
215         
216         
217         public static final String FILENAME_FORMAT = "simulation-%03d.csv";
218         
219         private File file;
220         private PrintStream output = null;
221         
222         
223         @Override
224         public boolean handleFlightEvent(SimulationStatus status, FlightEvent event) throws SimulationException {
225                 
226                 if (event.getType() == FlightEvent.Type.LAUNCH) {
227                         int n = 1;
228                         
229                         if (output != null) {
230                                 System.err.println("WARNING: Ending simulation logging to CSV file " +
231                                                 "(SIMULATION_END not encountered).");
232                                 output.close();
233                                 output = null;
234                         }
235                         
236                         do {
237                                 file = new File(String.format(FILENAME_FORMAT, n));
238                                 n++;
239                         } while (file.exists());
240                         
241                         System.err.println("Opening file " + file + " for CSV output.");
242                         try {
243                                 output = new PrintStream(file);
244                         } catch (FileNotFoundException e) {
245                                 System.err.println("ERROR OPENING FILE: " + e);
246                         }
247                         
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());
252                         }
253                         output.println(s);
254                         
255                 } else if (event.getType() == FlightEvent.Type.SIMULATION_END && output != null) {
256                         
257                         System.err.println("Ending simulation logging to CSV file: " + file);
258                         output.close();
259                         output = null;
260                         
261                 } else if (event.getType() != FlightEvent.Type.ALTITUDE) {
262                         
263                         if (output != null) {
264                                 output.println("# Event " + event);
265                         } else {
266                                 System.err.println("WARNING: Event " + event + " encountered without open file");
267                         }
268                         
269                 }
270                 
271                 return true;
272         }
273         
274         @Override
275         public void postStep(SimulationStatus status) throws SimulationException {
276                 
277                 final Types[] types = Types.values();
278                 StringBuilder s;
279                 
280                 if (output != null) {
281                         
282                         s = new StringBuilder("" + types[0].getValue(status));
283                         for (int i = 1; i < types.length; i++) {
284                                 s.append("," + types[i].getValue(status));
285                         }
286                         output.println(s);
287                         
288                 } else {
289                         
290                         System.err.println("WARNING: stepTaken called with no open file " +
291                                         "(t=" + status.getSimulationTime() + ")");
292                 }
293                 
294         }
295 }