1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.odm.ocm;
18
19 import java.io.IOException;
20
21 import org.orekit.data.DataContext;
22 import org.orekit.files.ccsds.definitions.TimeSystem;
23 import org.orekit.files.ccsds.ndm.ParsedUnitsBehavior;
24 import org.orekit.files.ccsds.ndm.odm.OdmHeader;
25 import org.orekit.files.ccsds.ndm.odm.UserDefinedWriter;
26 import org.orekit.files.ccsds.section.Segment;
27 import org.orekit.files.ccsds.section.XmlStructureKey;
28 import org.orekit.files.ccsds.utils.ContextBinding;
29 import org.orekit.files.ccsds.utils.FileFormat;
30 import org.orekit.files.ccsds.utils.generation.AbstractMessageWriter;
31 import org.orekit.files.ccsds.utils.generation.Generator;
32 import org.orekit.utils.IERSConventions;
33
34
35
36
37
38
39
40
41
42
43 public class OcmWriter extends AbstractMessageWriter<OdmHeader, Segment<OcmMetadata, OcmData>, Ocm> {
44
45
46 public static final double CCSDS_OCM_VERS = 3.0;
47
48
49 public static final int KVN_PADDING_WIDTH = 24;
50
51
52
53
54 private final double equatorialRadius;
55
56
57
58
59 private final double flattening;
60
61
62
63
64
65
66
67
68
69
70
71
72 public OcmWriter(final IERSConventions conventions,
73 final double equatorialRadius, final double flattening,
74 final DataContext dataContext) {
75 super(Ocm.ROOT, Ocm.FORMAT_VERSION_KEY, CCSDS_OCM_VERS,
76 new ContextBinding(
77 () -> conventions, () -> false, () -> dataContext,
78 () -> ParsedUnitsBehavior.STRICT_COMPLIANCE,
79 () -> null, () -> TimeSystem.UTC,
80 () -> 0.0, () -> 1.0));
81 this.equatorialRadius = equatorialRadius;
82 this.flattening = flattening;
83 }
84
85
86
87
88
89 public double getEquatorialRadius() {
90 return equatorialRadius;
91 }
92
93
94
95
96
97 public double getFlattening() {
98 return flattening;
99 }
100
101
102 @Override
103 protected void writeSegmentContent(final Generator generator, final double formatVersion,
104 final Segment<OcmMetadata, OcmData> segment)
105 throws IOException {
106
107
108 final ContextBinding oldContext = getContext();
109 final OcmMetadata metadata = segment.getMetadata();
110 setContext(new ContextBinding(oldContext::getConventions,
111 oldContext::isSimpleEOP,
112 oldContext::getDataContext,
113 oldContext::getParsedUnitsBehavior,
114 metadata::getEpochT0,
115 metadata::getTimeSystem,
116 metadata::getSclkOffsetAtEpoch,
117 metadata::getSclkSecPerSISec));
118 new OcmMetadataWriter(metadata, getTimeConverter()).write(generator);
119
120
121 if (generator.getFormat() == FileFormat.XML) {
122 generator.enterSection(XmlStructureKey.data.name());
123 }
124
125
126 if (segment.getData().getTrajectoryBlocks() != null && !segment.getData().getTrajectoryBlocks().isEmpty()) {
127 for (final TrajectoryStateHistory history : segment.getData().getTrajectoryBlocks()) {
128
129 new TrajectoryStateHistoryWriter(history, getTimeConverter()).write(generator);
130 }
131 }
132
133 if (segment.getData().getPhysicBlock() != null) {
134
135 new OrbitPhysicalPropertiesWriter(segment.getData().getPhysicBlock(),
136 getTimeConverter()).
137 write(generator);
138 }
139
140
141 if (segment.getData().getCovarianceBlocks() != null && !segment.getData().getCovarianceBlocks().isEmpty()) {
142 for (final OrbitCovarianceHistory history : segment.getData().getCovarianceBlocks()) {
143
144 new OrbitCovarianceHistoryWriter(history, getTimeConverter()).write(generator);
145 }
146 }
147
148 if (segment.getData().getManeuverBlocks() != null && !segment.getData().getManeuverBlocks().isEmpty()) {
149 for (final OrbitManeuverHistory maneuver : segment.getData().getManeuverBlocks()) {
150
151 new OrbitManeuverHistoryWriter(maneuver, getTimeConverter()).write(generator);
152 }
153 }
154
155 if (segment.getData().getPerturbationsBlock() != null) {
156
157 new PerturbationsWriter(segment.getData().getPerturbationsBlock(),
158 getTimeConverter()).
159 write(generator);
160 }
161
162 if (segment.getData().getOrbitDeterminationBlock() != null) {
163
164 new OrbitDeterminationWriter(segment.getData().getOrbitDeterminationBlock(),
165 getTimeConverter()).
166 write(generator);
167 }
168
169 if (segment.getData().getUserDefinedBlock() != null) {
170
171 new UserDefinedWriter(OcmDataSubStructureKey.user.name(),
172 OcmDataSubStructureKey.USER.name(),
173 segment.getData().getUserDefinedBlock()).
174 write(generator);
175 }
176
177
178 if (generator.getFormat() == FileFormat.XML) {
179 generator.exitSection();
180 }
181
182 }
183
184 }