1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.adm.acm;
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.AdmHeader;
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 public class AcmWriter extends AbstractMessageWriter<AdmHeader, Segment<AcmMetadata, AcmData>, Acm> {
42
43
44 public static final double CCSDS_ACM_VERS = 2.0;
45
46
47 public static final int KVN_PADDING_WIDTH = 33;
48
49
50
51
52
53
54
55
56
57
58 public AcmWriter(final IERSConventions conventions, final DataContext dataContext) {
59 super(Acm.ROOT, Acm.FORMAT_VERSION_KEY, CCSDS_ACM_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 protected void writeSegmentContent(final Generator generator, final double formatVersion,
70 final Segment<AcmMetadata, AcmData> segment)
71 throws IOException {
72
73
74 final ContextBinding oldContext = getContext();
75 final AcmMetadata 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 () -> 0.0, () -> 1.0));
83 new AcmMetadataWriter(metadata, getTimeConverter()).write(generator);
84
85
86 if (generator.getFormat() == FileFormat.XML) {
87 generator.enterSection(XmlStructureKey.data.name());
88 }
89
90
91 if (segment.getData().getAttitudeBlocks() != null && !segment.getData().getAttitudeBlocks().isEmpty()) {
92 for (final AttitudeStateHistory history : segment.getData().getAttitudeBlocks()) {
93
94 new AttitudeStateHistoryWriter(history, getTimeConverter()).write(generator);
95 }
96 }
97
98 if (segment.getData().getPhysicBlock() != null) {
99
100 new AttitudePhysicalPropertiesWriter(segment.getData().getPhysicBlock()).
101 write(generator);
102 }
103
104
105 if (segment.getData().getCovarianceBlocks() != null && !segment.getData().getCovarianceBlocks().isEmpty()) {
106 for (final AttitudeCovarianceHistory history : segment.getData().getCovarianceBlocks()) {
107
108 new AttitudeCovarianceHistoryWriter(history, getTimeConverter()).write(generator);
109 }
110 }
111
112 if (segment.getData().getManeuverBlocks() != null && !segment.getData().getManeuverBlocks().isEmpty()) {
113 for (final AttitudeManeuver maneuver : segment.getData().getManeuverBlocks()) {
114
115 new AttitudeManeuverWriter(maneuver).write(generator);
116 }
117 }
118
119 if (segment.getData().getAttitudeDeterminationBlock() != null) {
120
121 new AttitudeDeterminationWriter(segment.getData().getAttitudeDeterminationBlock()).
122 write(generator);
123 }
124
125 if (segment.getData().getUserDefinedBlock() != null) {
126
127 new UserDefinedWriter(AcmDataSubStructureKey.user.name(),
128 AcmDataSubStructureKey.USER.name(),
129 segment.getData().getUserDefinedBlock()).
130 write(generator);
131 }
132
133
134 if (generator.getFormat() == FileFormat.XML) {
135 generator.exitSection();
136 }
137
138 }
139
140 }