1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.adm.apm;
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.adm.AdmCommonMetadataWriter;
25 import org.orekit.files.ccsds.ndm.adm.AdmHeader;
26 import org.orekit.files.ccsds.ndm.adm.AdmMetadata;
27 import org.orekit.files.ccsds.section.Segment;
28 import org.orekit.files.ccsds.section.XmlStructureKey;
29 import org.orekit.files.ccsds.utils.ContextBinding;
30 import org.orekit.files.ccsds.utils.FileFormat;
31 import org.orekit.files.ccsds.utils.generation.AbstractMessageWriter;
32 import org.orekit.files.ccsds.utils.generation.Generator;
33 import org.orekit.time.AbsoluteDate;
34 import org.orekit.utils.IERSConventions;
35
36
37
38
39
40
41
42
43 public class ApmWriter extends AbstractMessageWriter<AdmHeader, Segment<AdmMetadata, ApmData>, Apm> {
44
45
46 public static final double CCSDS_APM_VERS = 1.0;
47
48
49 public static final int KVN_PADDING_WIDTH = 17;
50
51
52
53
54
55
56
57
58
59
60
61 public ApmWriter(final IERSConventions conventions, final DataContext dataContext,
62 final AbsoluteDate missionReferenceDate) {
63 super(Apm.ROOT, Apm.FORMAT_VERSION_KEY, CCSDS_APM_VERS,
64 new ContextBinding(
65 () -> conventions,
66 () -> false, () -> dataContext, () -> ParsedUnitsBehavior.STRICT_COMPLIANCE,
67 () -> missionReferenceDate, () -> TimeSystem.UTC,
68 () -> 0.0, () -> 1.0));
69 }
70
71
72 @Override
73 protected void writeSegmentContent(final Generator generator, final double formatVersion,
74 final Segment<AdmMetadata, ApmData> segment)
75 throws IOException {
76
77
78 final ContextBinding oldContext = getContext();
79 final AdmMetadata metadata = segment.getMetadata();
80 setContext(new ContextBinding(oldContext::getConventions,
81 oldContext::isSimpleEOP,
82 oldContext::getDataContext,
83 oldContext::getParsedUnitsBehavior,
84 oldContext::getReferenceDate,
85 metadata::getTimeSystem,
86 oldContext::getClockCount,
87 oldContext::getClockRate));
88 new AdmCommonMetadataWriter(metadata).write(generator);
89
90
91 if (generator.getFormat() == FileFormat.XML) {
92 generator.enterSection(XmlStructureKey.data.name());
93 }
94
95 generator.writeComments(segment.getData().getComments());
96 if (formatVersion >= 2.0) {
97
98 generator.writeEntry("EPOCH", getTimeConverter(), segment.getData().getEpoch(), false, true);
99 }
100
101 if (segment.getData().getQuaternionBlock() != null) {
102
103 final String xmlTag = ApmDataSubStructureKey.quaternionState.name();
104 final String kvnTag = formatVersion < 2.0 ? null : ApmDataSubStructureKey.QUAT.name();
105 new ApmQuaternionWriter(formatVersion, xmlTag, kvnTag,
106 segment.getData().getQuaternionBlock(),
107 formatVersion >= 2.0 ? null : segment.getData().getEpoch(),
108 getTimeConverter()).
109 write(generator);
110 }
111
112 if (segment.getData().getEulerBlock() != null) {
113
114 final String xmlTag = formatVersion < 2.0 ?
115 ApmDataSubStructureKey.eulerElementsThree.name() :
116 ApmDataSubStructureKey.eulerAngleState.name();
117 final String kvnTag = formatVersion < 2.0 ? null : ApmDataSubStructureKey.EULER.name();
118 new EulerWriter(formatVersion, xmlTag, kvnTag,
119 segment.getData().getEulerBlock()).
120 write(generator);
121 }
122
123 if (segment.getData().getAngularVelocityBlock() != null) {
124
125 final String xmlTag = ApmDataSubStructureKey.angularVelocity.name();
126 final String kvnTag = ApmDataSubStructureKey.ANGVEL.name();
127 new AngularVelocityWriter(xmlTag, kvnTag,
128 segment.getData().getAngularVelocityBlock()).
129 write(generator);
130 }
131
132 if (segment.getData().getSpinStabilizedBlock() != null) {
133
134 final String xmlTag;
135 final String kvnTag;
136 if (formatVersion < 2.0) {
137 xmlTag = ApmDataSubStructureKey.eulerElementsSpin.name();
138 kvnTag = null;
139 } else {
140 xmlTag = ApmDataSubStructureKey.spin.name();
141 kvnTag = ApmDataSubStructureKey.SPIN.name();
142 }
143 new SpinStabilizedWriter(formatVersion, xmlTag, kvnTag,
144 segment.getData().getSpinStabilizedBlock()).
145 write(generator);
146 }
147
148 if (segment.getData().getInertiaBlock() != null) {
149
150 final String xmlTag = formatVersion < 2.0 ?
151 ApmDataSubStructureKey.spacecraftParameters.name() :
152 ApmDataSubStructureKey.inertia.name();
153 final String kvnTag = formatVersion < 2.0 ? null : ApmDataSubStructureKey.INERTIA.name();
154 new InertiaWriter(formatVersion, xmlTag, kvnTag,
155 segment.getData().getInertiaBlock()).
156 write(generator);
157 }
158
159 if (!segment.getData().getManeuvers().isEmpty()) {
160 for (final Maneuver maneuver : segment.getData().getManeuvers()) {
161
162 final String xmlTag = ApmDataSubStructureKey.maneuverParameters.name();
163 final String kvnTag = formatVersion < 2.0 ? null : ApmDataSubStructureKey.MAN.name();
164 new ManeuverWriter(formatVersion, xmlTag, kvnTag,
165 maneuver, getTimeConverter()).write(generator);
166 }
167 }
168
169
170 if (generator.getFormat() == FileFormat.XML) {
171 generator.exitSection();
172 }
173
174 }
175
176 }