1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ilrs;
18
19 import java.io.IOException;
20 import java.util.Locale;
21
22 import org.hipparchus.exception.LocalizedCoreFormats;
23 import org.hipparchus.geometry.euclidean.threed.Vector3D;
24 import org.orekit.errors.OrekitException;
25 import org.orekit.frames.Frame;
26 import org.orekit.propagation.Propagator;
27 import org.orekit.propagation.SpacecraftState;
28 import org.orekit.propagation.sampling.OrekitFixedStepHandler;
29 import org.orekit.time.AbsoluteDate;
30 import org.orekit.time.DateTimeComponents;
31 import org.orekit.time.TimeScale;
32 import org.orekit.utils.TimeStampedPVCoordinates;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class StreamingCpfWriter {
51
52
53 private static final String NEW_LINE = "\n";
54
55
56 private static final String A2 = "%2s";
57
58
59 private static final String A3 = "%3s";
60
61
62 private static final String A4 = "%4s";
63
64
65 private static final String A8 = "%8s";
66
67
68 private static final String A10 = "%10s";
69
70
71 private static final String I1 = "%1d";
72
73
74 private static final String I2 = "%2d";
75
76
77 private static final String I3 = "%3d";
78
79
80 private static final String I4 = "%4d";
81
82
83 private static final String I5 = "%5d";
84
85
86 private static final String F13_6 = "%13.6f";
87
88
89 private static final String F17_3 = "%17.3f";
90
91
92 private static final String SPACE = " ";
93
94
95 private static final String FORMAT = "CPF";
96
97
98 private static final Locale STANDARDIZED_LOCALE = Locale.US;
99
100
101 private static final int DEFAULT_DIRECTION_FLAG = 0;
102
103
104 private final Appendable writer;
105
106
107 private final TimeScale timeScale;
108
109
110 private final CPFHeader header;
111
112
113
114
115
116
117
118
119 public StreamingCpfWriter(final Appendable writer,
120 final TimeScale timeScale,
121 final CPFHeader header) {
122
123 this.writer = writer;
124 this.timeScale = timeScale;
125 this.header = header;
126 }
127
128
129
130
131
132 public void writeHeader() throws IOException {
133
134
135 HeaderLineWriter.H1.write(header, writer, timeScale);
136 writer.append(NEW_LINE);
137
138
139 HeaderLineWriter.H2.write(header, writer, timeScale);
140 writer.append(NEW_LINE);
141
142
143 writer.append("H9");
144 writer.append(NEW_LINE);
145
146 }
147
148
149
150
151
152 public void writeEndOfFile() throws IOException {
153 writer.append("99");
154 }
155
156
157
158
159
160
161
162
163
164 public Segment newSegment(final Frame frame) {
165 return new Segment(frame);
166 }
167
168
169
170
171
172
173
174
175 private static void writeValue(final Appendable cpfWriter, final String format, final String value)
176 throws IOException {
177 cpfWriter.append(String.format(STANDARDIZED_LOCALE, format, value)).append(SPACE);
178 }
179
180
181
182
183
184
185
186
187 private static void writeValue(final Appendable cpfWriter, final String format, final int value)
188 throws IOException {
189 cpfWriter.append(String.format(STANDARDIZED_LOCALE, format, value)).append(SPACE);
190 }
191
192
193
194
195
196
197
198
199 private static void writeValue(final Appendable cpfWriter, final String format, final double value)
200 throws IOException {
201 cpfWriter.append(String.format(STANDARDIZED_LOCALE, format, value)).append(SPACE);
202 }
203
204
205
206
207
208
209
210
211 private static void writeValue(final Appendable cpfWriter, final String format, final boolean value)
212 throws IOException {
213
214 final int intValue = value ? 1 : 0;
215 writeValue(cpfWriter, format, intValue);
216 }
217
218
219 public class Segment implements OrekitFixedStepHandler {
220
221
222 private final Frame frame;
223
224
225
226
227
228
229
230 private Segment(final Frame frame) {
231 this.frame = frame;
232 }
233
234
235 @Override
236 public void handleStep(final SpacecraftState currentState) {
237 try {
238
239
240 writeEphemerisLine(currentState.getPVCoordinates(frame));
241
242 } catch (IOException e) {
243 throw new OrekitException(e, LocalizedCoreFormats.SIMPLE_MESSAGE,
244 e.getLocalizedMessage());
245 }
246
247 }
248
249
250 @Override
251 public void finish(final SpacecraftState finalState) {
252 try {
253
254 writeEphemerisLine(finalState.getPVCoordinates(frame));
255
256
257 writeEndOfFile();
258
259 } catch (IOException e) {
260 throw new OrekitException(e, LocalizedCoreFormats.SIMPLE_MESSAGE,
261 e.getLocalizedMessage());
262 }
263
264 }
265
266
267
268
269
270
271
272
273 public void writeEphemerisLine(final TimeStampedPVCoordinates pv)
274 throws IOException {
275
276
277 writeValue(writer, A2, "10");
278 writeValue(writer, I1, DEFAULT_DIRECTION_FLAG);
279
280
281 final AbsoluteDate epoch = pv.getDate();
282 final DateTimeComponents dtc = epoch.getComponents(timeScale);
283 writeValue(writer, I5, dtc.getDate().getMJD());
284 writeValue(writer, F13_6, dtc.getTime().getSecondsInLocalDay());
285
286
287 writeValue(writer, I2, 0);
288
289
290 final Vector3D position = pv.getPosition();
291 writeValue(writer, F17_3, position.getX());
292 writeValue(writer, F17_3, position.getY());
293 writeValue(writer, F17_3, position.getZ());
294
295
296 writer.append(NEW_LINE);
297
298 }
299
300 }
301
302
303 public enum HeaderLineWriter {
304
305
306 H1("H1") {
307
308
309 @Override
310 public void write(final CPFHeader cpfHeader, final Appendable cpfWriter, final TimeScale timescale)
311 throws IOException {
312
313
314 writeValue(cpfWriter, A2, getIdentifier());
315 writeValue(cpfWriter, A3, FORMAT);
316 writeValue(cpfWriter, I2, cpfHeader.getVersion());
317 writeValue(cpfWriter, A3, cpfHeader.getSource());
318 writeValue(cpfWriter, I4, cpfHeader.getProductionEpoch().getYear());
319 writeValue(cpfWriter, I2, cpfHeader.getProductionEpoch().getMonth());
320 writeValue(cpfWriter, I2, cpfHeader.getProductionEpoch().getDay());
321 writeValue(cpfWriter, I2, cpfHeader.getProductionHour());
322 writeValue(cpfWriter, I3, cpfHeader.getSequenceNumber());
323
324
325 if (cpfHeader.getVersion() == 2) {
326 writeValue(cpfWriter, I2, cpfHeader.getSubDailySequenceNumber());
327 }
328
329
330 writeValue(cpfWriter, A10, cpfHeader.getName());
331
332 }
333
334 },
335
336
337 H2("H2") {
338
339
340 @Override
341 public void write(final CPFHeader cpfHeader, final Appendable cpfWriter, final TimeScale timescale)
342 throws IOException {
343
344
345 writeValue(cpfWriter, A2, getIdentifier());
346 writeValue(cpfWriter, A8, cpfHeader.getIlrsSatelliteId());
347 writeValue(cpfWriter, A4, cpfHeader.getSic());
348 writeValue(cpfWriter, A8, cpfHeader.getNoradId());
349
350
351 final AbsoluteDate starting = cpfHeader.getStartEpoch();
352 final DateTimeComponents dtcStart = starting.getComponents(timescale);
353 writeValue(cpfWriter, I4, dtcStart.getDate().getYear());
354 writeValue(cpfWriter, I2, dtcStart.getDate().getMonth());
355 writeValue(cpfWriter, I2, dtcStart.getDate().getDay());
356 writeValue(cpfWriter, I2, dtcStart.getTime().getHour());
357 writeValue(cpfWriter, I2, dtcStart.getTime().getMinute());
358 writeValue(cpfWriter, I2, (int) dtcStart.getTime().getSecond());
359
360
361 final AbsoluteDate ending = cpfHeader.getEndEpoch();
362 final DateTimeComponents dtcEnd = ending.getComponents(timescale);
363 writeValue(cpfWriter, I4, dtcEnd.getDate().getYear());
364 writeValue(cpfWriter, I2, dtcEnd.getDate().getMonth());
365 writeValue(cpfWriter, I2, dtcEnd.getDate().getDay());
366 writeValue(cpfWriter, I2, dtcEnd.getTime().getHour());
367 writeValue(cpfWriter, I2, dtcEnd.getTime().getMinute());
368 writeValue(cpfWriter, I2, (int) dtcEnd.getTime().getSecond());
369
370
371 writeValue(cpfWriter, I5, cpfHeader.getStep());
372 writeValue(cpfWriter, I1, cpfHeader.isCompatibleWithTIVs());
373 writeValue(cpfWriter, I1, cpfHeader.getTargetClass());
374 writeValue(cpfWriter, I2, cpfHeader.getRefFrameId());
375 writeValue(cpfWriter, I1, cpfHeader.getRotationalAngleType());
376 writeValue(cpfWriter, I1, cpfHeader.isCenterOfMassCorrectionApplied());
377 if (cpfHeader.getVersion() == 2) {
378 writeValue(cpfWriter, I1, cpfHeader.getTargetLocation());
379 }
380
381 }
382
383 };
384
385
386 private final String identifier;
387
388
389
390
391 HeaderLineWriter(final String identifier) {
392 this.identifier = identifier;
393 }
394
395
396
397
398
399
400
401
402
403 public abstract void write(CPFHeader cpfHeader, Appendable cpfWriter, TimeScale timescale) throws IOException;
404
405
406
407
408
409 public String getIdentifier() {
410 return identifier;
411 }
412
413 }
414
415 }