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.UserDefinedWriter;
25 import org.orekit.files.ccsds.section.Header;
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 public class OcmWriter extends AbstractMessageWriter<Header, Segment<OcmMetadata, OcmData>, Ocm> {
42
43
44 public static final double CCSDS_OCM_VERS = 3.0;
45
46
47 public static final int KVN_PADDING_WIDTH = 24;
48
49
50
51
52
53
54
55
56
57
58 public OcmWriter(final IERSConventions conventions, final DataContext dataContext) {
59 super(Ocm.ROOT, Ocm.FORMAT_VERSION_KEY, CCSDS_OCM_VERS,
60 new ContextBinding(
61 () -> conventions, () -> false, () -> dataContext,
62 () -> ParsedUnitsBehavior.STRICT_COMPLIANCE,
63 () -> null, () -> TimeSystem.UTC,
64 () -> 0.0, () -> 1.0));
65 }
66
67
68 @Override
69 public void writeSegmentContent(final Generator generator, final double formatVersion,
70 final Segment<OcmMetadata, OcmData> segment)
71 throws IOException {
72
73
74 final ContextBinding oldContext = getContext();
75 final OcmMetadata metadata = segment.getMetadata();
76 setContext(new ContextBinding(oldContext::getConventions,
77 oldContext::isSimpleEOP,
78 oldContext::getDataContext,
79 oldContext::getParsedUnitsBehavior,
80 metadata::getEpochT0,
81 metadata::getTimeSystem,
82 metadata::getSclkOffsetAtEpoch,
83 metadata::getSclkSecPerSISec));
84 new OcmMetadataWriter(metadata, getTimeConverter()).write(generator);
85
86
87 if (generator.getFormat() == FileFormat.XML) {
88 generator.enterSection(XmlStructureKey.data.name());
89 }
90
91
92 if (segment.getData().getOTrajectoryBlocks() != null && !segment.getData().getOTrajectoryBlocks().isEmpty()) {
93 for (final TrajectoryStateHistory history : segment.getData().getOTrajectoryBlocks()) {
94
95 new TrajectoryStateHistoryWriter(history, getTimeConverter()).write(generator);
96 }
97 }
98
99 if (segment.getData().getPhysicBlock() != null) {
100
101 new PhysicalPropertiesWriter(segment.getData().getPhysicBlock(),
102 getTimeConverter()).
103 write(generator);
104 }
105
106
107 if (segment.getData().getCovarianceBlocks() != null && !segment.getData().getCovarianceBlocks().isEmpty()) {
108 for (final CovarianceHistory history : segment.getData().getCovarianceBlocks()) {
109
110 new CovarianceHistoryWriter(history, getTimeConverter()).write(generator);
111 }
112 }
113
114 if (segment.getData().getManeuverBlocks() != null && !segment.getData().getManeuverBlocks().isEmpty()) {
115 for (final ManeuverHistory maneuver : segment.getData().getManeuverBlocks()) {
116
117 new ManeuverHistoryWriter(maneuver, getTimeConverter()).write(generator);
118 }
119 }
120
121 if (segment.getData().getPerturbationsBlock() != null) {
122
123 new PerturbationsWriter(segment.getData().getPerturbationsBlock(),
124 getTimeConverter()).
125 write(generator);
126 }
127
128 if (segment.getData().getOrbitDeterminationBlock() != null) {
129
130 new OrbitDeterminationWriter(segment.getData().getOrbitDeterminationBlock(),
131 getTimeConverter()).
132 write(generator);
133 }
134
135 if (segment.getData().getUserDefinedBlock() != null) {
136
137 new UserDefinedWriter(OcmDataSubStructureKey.userDef.name(),
138 OcmDataSubStructureKey.USER.name(),
139 segment.getData().getUserDefinedBlock()).
140 write(generator);
141 }
142
143
144 if (generator.getFormat() == FileFormat.XML) {
145 generator.exitSection();
146 }
147
148 }
149
150 }