1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.odm.omm;
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.CartesianCovarianceWriter;
25 import org.orekit.files.ccsds.ndm.odm.OdmHeader;
26 import org.orekit.files.ccsds.ndm.odm.SpacecraftParametersWriter;
27 import org.orekit.files.ccsds.ndm.odm.UserDefinedWriter;
28 import org.orekit.files.ccsds.section.Segment;
29 import org.orekit.files.ccsds.section.XmlStructureKey;
30 import org.orekit.files.ccsds.utils.ContextBinding;
31 import org.orekit.files.ccsds.utils.FileFormat;
32 import org.orekit.files.ccsds.utils.generation.AbstractMessageWriter;
33 import org.orekit.files.ccsds.utils.generation.Generator;
34 import org.orekit.time.AbsoluteDate;
35 import org.orekit.utils.IERSConventions;
36
37
38
39
40
41
42
43
44 public class OmmWriter extends AbstractMessageWriter<OdmHeader, Segment<OmmMetadata, OmmData>, Omm> {
45
46
47 public static final double CCSDS_OMM_VERS = 3.0;
48
49
50 public static final int KVN_PADDING_WIDTH = 19;
51
52
53
54
55
56
57
58
59
60
61
62 public OmmWriter(final IERSConventions conventions, final DataContext dataContext,
63 final AbsoluteDate missionReferenceDate) {
64 super(Omm.ROOT, Omm.FORMAT_VERSION_KEY, CCSDS_OMM_VERS,
65 new ContextBinding(
66 () -> conventions, () -> false, () -> dataContext,
67 () -> ParsedUnitsBehavior.STRICT_COMPLIANCE,
68 () -> missionReferenceDate, () -> TimeSystem.UTC,
69 () -> 0.0, () -> 1.0));
70 }
71
72
73 @Override
74 protected void writeSegmentContent(final Generator generator, final double formatVersion,
75 final Segment<OmmMetadata, OmmData> segment)
76 throws IOException {
77
78
79 final ContextBinding oldContext = getContext();
80 final OmmMetadata metadata = segment.getMetadata();
81 setContext(new ContextBinding(oldContext::getConventions,
82 oldContext::isSimpleEOP,
83 oldContext::getDataContext,
84 oldContext::getParsedUnitsBehavior,
85 oldContext::getReferenceDate,
86 metadata::getTimeSystem,
87 oldContext::getClockCount,
88 oldContext::getClockRate));
89 new OmmMetadataWriter(metadata, getTimeConverter()).write(generator);
90
91
92 if (generator.getFormat() == FileFormat.XML) {
93 generator.enterSection(XmlStructureKey.data.name());
94 }
95
96
97 new MeanKeplerianElementsWriter(XmlSubStructureKey.meanElements.name(), null,
98 segment.getData().getKeplerianElementsBlock(),
99 getTimeConverter(), segment.getMetadata().theoryIsSgpSdp()).
100 write(generator);
101
102 if (segment.getData().getSpacecraftParametersBlock() != null) {
103
104 new SpacecraftParametersWriter(XmlSubStructureKey.spacecraftParameters.name(), null,
105 segment.getData().getSpacecraftParametersBlock()).
106 write(generator);
107 }
108
109 if (segment.getData().getTLEBlock() != null) {
110 new OmmTleWriter(XmlSubStructureKey.tleParameters.name(), null,
111 segment.getData().getTLEBlock()).
112 write(generator);
113 }
114
115 if (segment.getData().getCovarianceBlock() != null) {
116
117 new CartesianCovarianceWriter(XmlSubStructureKey.covarianceMatrix.name(), null,
118 segment.getData().getCovarianceBlock()).
119 write(generator);
120 }
121
122 if (segment.getData().getUserDefinedBlock() != null) {
123
124 new UserDefinedWriter(XmlSubStructureKey.userDefinedParameters.name(), null,
125 segment.getData().getUserDefinedBlock()).
126 write(generator);
127 }
128
129
130 if (generator.getFormat() == FileFormat.XML) {
131 generator.exitSection();
132 }
133
134 }
135
136 }