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.AdmMetadata;
25 import org.orekit.files.ccsds.ndm.adm.AdmMetadataWriter;
26 import org.orekit.files.ccsds.section.Header;
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<Header, 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 public 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 AdmMetadataWriter(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
97
98 new ApmQuaternionWriter(XmlSubStructureKey.quaternionState.name(), null,
99 segment.getData().getQuaternionBlock(), getTimeConverter()).
100 write(generator);
101
102 if (segment.getData().getEulerBlock() != null) {
103
104 new EulerWriter(XmlSubStructureKey.eulerElementsThree.name(), null,
105 segment.getData().getEulerBlock()).
106 write(generator);
107 }
108
109 if (segment.getData().getSpinStabilizedBlock() != null) {
110
111 new SpinStabilizedWriter(XmlSubStructureKey.eulerElementsSpin.name(), null,
112 segment.getData().getSpinStabilizedBlock()).
113 write(generator);
114 }
115
116 if (segment.getData().getSpacecraftParametersBlock() != null) {
117
118 new SpacecraftParametersWriter(XmlSubStructureKey.spacecraftParameters.name(), null,
119 segment.getData().getSpacecraftParametersBlock()).
120 write(generator);
121 }
122
123 if (!segment.getData().getManeuvers().isEmpty()) {
124 for (final Maneuver maneuver : segment.getData().getManeuvers()) {
125
126 new ManeuverWriter(XmlSubStructureKey.maneuverParameters.name(), null,
127 maneuver, getTimeConverter()).write(generator);
128 }
129 }
130
131
132 if (generator.getFormat() == FileFormat.XML) {
133 generator.exitSection();
134 }
135
136 }
137
138 }