Initial commit
[debian/openrocket] / src / net / sf / openrocket / simulation / listeners / RollSaveListener.java
1 package net.sf.openrocket.simulation.listeners;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.PrintStream;
6 import java.util.Collection;
7
8 import net.sf.openrocket.simulation.FlightDataBranch;
9 import net.sf.openrocket.simulation.FlightEvent;
10 import net.sf.openrocket.simulation.SimulationStatus;
11
12
13 public class RollSaveListener extends AbstractSimulationListener {
14
15         private static enum Types {
16                 TIME {
17                         @Override
18                         public double getValue(SimulationStatus status) {
19                                 return status.time;
20                         }
21                 },
22                 ALTITUDE {
23                         @Override
24                         public double getValue(SimulationStatus status) {
25                                 return status.position.z;
26                         }
27                 },
28                 VELOCITY_Z {
29                         @Override
30                         public double getValue(SimulationStatus status) {
31                                 return status.velocity.z;
32                         }
33                 },
34                 THETA {
35                         @Override
36                         public double getValue(SimulationStatus status) {
37                                 return status.flightData.getLast(FlightDataBranch.TYPE_ORIENTATION_THETA);
38                         }
39                 },
40                 AOA {
41                         @Override
42                         public double getValue(SimulationStatus status) {
43                                 return status.flightData.getLast(FlightDataBranch.TYPE_AOA);
44                         }
45                 },
46                 ROLLRATE {
47                         @Override
48                         public double getValue(SimulationStatus status) {
49                                 return status.flightData.getLast(FlightDataBranch.TYPE_ROLL_RATE);
50                         }
51                 },
52                 PITCHRATE {
53                         @Override
54                         public double getValue(SimulationStatus status) {
55                                 return status.flightData.getLast(FlightDataBranch.TYPE_PITCH_RATE);
56                         }
57                 },
58                 ROLLMOMENT {
59                         @Override
60                         public double getValue(SimulationStatus status) {
61                                 return status.flightData.getLast(FlightDataBranch.TYPE_ROLL_MOMENT_COEFF);
62                         }
63                 },
64                 MACH {
65                         @Override
66                         public double getValue(SimulationStatus status) {
67                                 return status.flightData.getLast(FlightDataBranch.TYPE_MACH_NUMBER);
68                         }
69                 },
70
71                 ;
72                 
73                 public abstract double getValue(SimulationStatus status);
74         }
75         
76         
77         public static final String FILENAME_FORMAT = "simulation-%03d.csv";
78         
79         private File file;
80         private PrintStream output = null;
81         
82                 
83         
84         @Override
85         public Collection<FlightEvent> handleEvent(FlightEvent event,
86                         SimulationStatus status) {
87
88                 if (event.getType() == FlightEvent.Type.LAUNCH) {
89                         int n = 1;
90
91                         if (output != null) {
92                                 System.err.println("WARNING: Ending simulation logging to CSV file " +
93                                                 "(SIMULATION_END not encountered).");
94                                 output.close();
95                                 output = null;
96                         }
97                         
98                         do {
99                                 file = new File(String.format(FILENAME_FORMAT, n));
100                                 n++;
101                         } while (file.exists());
102                         
103                         System.err.println("Opening file "+file+" for CSV output.");
104                         try {
105                                 output = new PrintStream(file);
106                         } catch (FileNotFoundException e) {
107                                 System.err.println("ERROR OPENING FILE: "+e);
108                         }
109                         
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());
114                         }
115                         output.println(s);
116                         
117                 } else if (event.getType() == FlightEvent.Type.SIMULATION_END && output != null) {
118                         
119                         System.err.println("Ending simulation logging to CSV file: "+file);
120                         output.close();
121                         output = null;
122                         
123                 } else if (event.getType() != FlightEvent.Type.ALTITUDE){
124                         
125                         if (output != null) {
126                                 output.println("# Event "+event);
127                         } else {
128                                 System.err.println("WARNING: Event "+event+" encountered without open file");
129                         }
130                         
131                 }
132                 
133                 return null;
134         }
135
136         
137         @Override
138         public Collection<FlightEvent> stepTaken(SimulationStatus status) {
139
140                 final Types[] types = Types.values();
141                 StringBuilder s;
142                 
143                 if (output != null) {
144                         
145                         s = new StringBuilder("" + types[0].getValue(status));
146                         for (int i=1; i<types.length; i++) {
147                                 s.append("," + types[i].getValue(status));
148                         }
149                         output.println(s);
150                 
151                 } else {
152                         
153                         System.err.println("WARNING: stepTaken called with no open file " +
154                                         "(t="+status.time+")");
155                 }
156
157                 return null;
158         }
159 }