1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.adm.aem;
18
19 import java.io.IOException;
20
21 import org.hipparchus.exception.LocalizedCoreFormats;
22 import org.orekit.errors.OrekitException;
23 import org.orekit.errors.OrekitMessages;
24 import org.orekit.files.ccsds.definitions.FrameFacade;
25 import org.orekit.files.ccsds.ndm.adm.AdmHeader;
26 import org.orekit.files.ccsds.section.Header;
27 import org.orekit.files.ccsds.utils.generation.Generator;
28 import org.orekit.propagation.Propagator;
29 import org.orekit.propagation.SpacecraftState;
30 import org.orekit.propagation.sampling.OrekitFixedStepHandler;
31 import org.orekit.time.AbsoluteDate;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 public class StreamingAemWriter implements AutoCloseable {
66
67
68 private final Generator generator;
69
70
71 private final AemWriter writer;
72
73
74 private final AdmHeader header;
75
76
77 private final AemMetadata metadata;
78
79
80 private boolean headerWritePending;
81
82
83
84
85
86
87
88
89 public StreamingAemWriter(final Generator generator, final AemWriter writer,
90 final AdmHeader header, final AemMetadata template) {
91 this.generator = generator;
92 this.writer = writer;
93 this.header = header;
94 this.metadata = template.copy(header == null ? writer.getDefaultVersion() : header.getFormatVersion());
95 this.headerWritePending = true;
96 }
97
98
99
100
101
102
103
104 public SegmentWriter newSegment() {
105 return new SegmentWriter();
106 }
107
108
109 @Override
110 public void close() throws IOException {
111 writer.writeFooter(generator);
112 }
113
114
115 public class SegmentWriter implements OrekitFixedStepHandler {
116
117
118
119
120
121
122
123
124 public SegmentWriter() {
125
126 }
127
128
129
130
131
132
133
134
135 @Override
136 public void init(final SpacecraftState s0, final AbsoluteDate t, final double step) {
137 try {
138 final AbsoluteDate date = s0.getDate();
139 if (t.isBefore(date)) {
140 throw new OrekitException(OrekitMessages.NON_CHRONOLOGICALLY_SORTED_ENTRIES,
141 date, t, date.durationFrom(t));
142 }
143
144 if (headerWritePending) {
145
146 writer.writeHeader(generator, header);
147 headerWritePending = false;
148 }
149
150 metadata.setStartTime(date);
151 metadata.setUseableStartTime(null);
152 metadata.setUseableStopTime(null);
153 metadata.setStopTime(t);
154 if (metadata.getEndpoints().getFrameA() == null ||
155 metadata.getEndpoints().getFrameA().asSpacecraftBodyFrame() == null) {
156
157 metadata.getEndpoints().setFrameA(FrameFacade.map(s0.getAttitude().getReferenceFrame()));
158 } else {
159
160 metadata.getEndpoints().setFrameB(FrameFacade.map(s0.getAttitude().getReferenceFrame()));
161 }
162 writer.writeMetadata(generator,
163 header == null ? writer.getDefaultVersion() : header.getFormatVersion(),
164 metadata);
165 writer.startAttitudeBlock(generator);
166 } catch (IOException e) {
167 throw new OrekitException(e, LocalizedCoreFormats.SIMPLE_MESSAGE, e.getLocalizedMessage());
168 }
169 }
170
171
172 @Override
173 public void handleStep(final SpacecraftState currentState) {
174 try {
175 writer.writeAttitudeEphemerisLine(generator,
176 header == null ? writer.getDefaultVersion() : header.getFormatVersion(),
177 metadata, currentState.getAttitude().getOrientation());
178 } catch (IOException e) {
179 throw new OrekitException(e, LocalizedCoreFormats.SIMPLE_MESSAGE, e.getLocalizedMessage());
180 }
181 }
182
183
184 @Override
185 public void finish(final SpacecraftState finalState) {
186 try {
187 writer.endAttitudeBlock(generator);
188 } catch (IOException e) {
189 throw new OrekitException(e, LocalizedCoreFormats.SIMPLE_MESSAGE, e.getLocalizedMessage());
190 }
191 }
192
193 }
194
195 }