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 import java.util.List;
21
22 import org.orekit.errors.OrekitIllegalArgumentException;
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.utils.FileFormat;
27 import org.orekit.files.ccsds.utils.generation.Generator;
28 import org.orekit.files.ccsds.utils.generation.KvnGenerator;
29 import org.orekit.files.ccsds.utils.generation.XmlGenerator;
30 import org.orekit.files.general.AttitudeEphemerisFile;
31 import org.orekit.files.general.AttitudeEphemerisFile.SatelliteAttitudeEphemeris;
32 import org.orekit.files.general.AttitudeEphemerisFileWriter;
33 import org.orekit.utils.AccurateFormatter;
34 import org.orekit.utils.Formatter;
35 import org.orekit.utils.TimeStampedAngularCoordinates;
36
37
38
39
40
41 public class AttitudeWriter implements AttitudeEphemerisFileWriter {
42
43
44 private final AemWriter writer;
45
46
47 private final AdmHeader header;
48
49
50 private final AemMetadata metadata;
51
52
53 private final FileFormat fileFormat;
54
55
56 private final String outputName;
57
58
59
60
61 private final double maxRelativeOffset;
62
63
64 private final int unitsColumn;
65
66
67 private final Formatter formatter;
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 public AttitudeWriter(final AemWriter writer,
99 final AdmHeader header, final AemMetadata template,
100 final FileFormat fileFormat, final String outputName,
101 final double maxRelativeOffset, final int unitsColumn, final Formatter formatter) {
102 this.writer = writer;
103 this.header = header;
104 this.metadata = template.copy(header == null ? writer.getDefaultVersion() : header.getFormatVersion());
105 this.fileFormat = fileFormat;
106 this.outputName = outputName;
107 this.maxRelativeOffset = maxRelativeOffset;
108 this.unitsColumn = unitsColumn;
109 this.formatter = formatter;
110 }
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140 public AttitudeWriter(final AemWriter writer,
141 final AdmHeader header, final AemMetadata template,
142 final FileFormat fileFormat, final String outputName,
143 final double maxRelativeOffset, final int unitsColumn) {
144 this(writer, header, template, fileFormat, outputName, maxRelativeOffset, unitsColumn, new AccurateFormatter());
145 }
146
147
148
149
150
151
152
153
154
155
156
157 @Override
158 public <C extends TimeStampedAngularCoordinates, S extends AttitudeEphemerisFile.AttitudeEphemerisSegment<C>>
159 void write(final Appendable appendable, final AttitudeEphemerisFile<C, S> ephemerisFile)
160 throws IOException {
161
162 if (appendable == null) {
163 throw new OrekitIllegalArgumentException(OrekitMessages.NULL_ARGUMENT, "writer");
164 }
165
166 if (ephemerisFile == null) {
167 return;
168 }
169
170 final SatelliteAttitudeEphemeris<C, S> satEphem =
171 ephemerisFile.getSatellites().get(metadata.getObjectID());
172 if (satEphem == null) {
173 throw new OrekitIllegalArgumentException(OrekitMessages.VALUE_NOT_FOUND,
174 metadata.getObjectID(), "ephemerisFile");
175 }
176
177
178 final List<S> segments = satEphem.getSegments();
179 if (segments.isEmpty()) {
180
181 return;
182 }
183
184 try (Generator generator = fileFormat == FileFormat.KVN ?
185 new KvnGenerator(appendable, AemWriter.KVN_PADDING_WIDTH, outputName,
186 maxRelativeOffset, unitsColumn, formatter) :
187 new XmlGenerator(appendable, XmlGenerator.DEFAULT_INDENT, outputName,
188 maxRelativeOffset, unitsColumn > 0, null, formatter)) {
189
190 writer.writeHeader(generator, header);
191
192
193 for (final S segment : segments) {
194 writeSegment(generator, segment);
195 }
196
197 writer.writeFooter(generator);
198
199 }
200
201 }
202
203
204
205
206
207
208
209
210 private <C extends TimeStampedAngularCoordinates, S extends AttitudeEphemerisFile.AttitudeEphemerisSegment<C>>
211 void writeSegment(final Generator generator, final S segment) throws IOException {
212
213
214 metadata.setStartTime(segment.getStart());
215 metadata.setStopTime(segment.getStop());
216 if (metadata.getEndpoints().getFrameA() == null ||
217 metadata.getEndpoints().getFrameA().asSpacecraftBodyFrame() == null) {
218
219 metadata.getEndpoints().setFrameA(FrameFacade.map(segment.getReferenceFrame()));
220 } else {
221
222 metadata.getEndpoints().setFrameB(FrameFacade.map(segment.getReferenceFrame()));
223 }
224 metadata.setInterpolationMethod(segment.getInterpolationMethod());
225 metadata.setInterpolationDegree(segment.getInterpolationSamples() - 1);
226 metadata.validate(header == null ? writer.getDefaultVersion() : header.getFormatVersion());
227 writer.writeMetadata(generator,
228 header == null ? writer.getDefaultVersion() : header.getFormatVersion(),
229 metadata);
230
231
232 writer.startAttitudeBlock(generator);
233 if (segment instanceof AemSegment) {
234 generator.writeComments(((AemSegment) segment).getData().getComments());
235 }
236 for (final TimeStampedAngularCoordinates coordinates : segment.getAngularCoordinates()) {
237 writer.writeAttitudeEphemerisLine(generator,
238 header == null ? writer.getDefaultVersion() : header.getFormatVersion(),
239 metadata, coordinates);
240 }
241 writer.endAttitudeBlock(generator);
242
243 }
244
245 }