1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.cdm;
18
19 import java.io.IOException;
20
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.orekit.data.DataContext;
23 import org.orekit.files.ccsds.definitions.TimeSystem;
24 import org.orekit.files.ccsds.definitions.Units;
25 import org.orekit.files.ccsds.ndm.ParsedUnitsBehavior;
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.Generator;
31 import org.orekit.utils.IERSConventions;
32 import org.orekit.utils.units.Unit;
33
34
35
36
37
38
39
40 public class CdmWriter extends CdmMessageWriter {
41
42
43 public static final double CCSDS_CDM_VERS = 1.0;
44
45
46 public static final int KVN_PADDING_WIDTH = 17;
47
48
49 private final Vector3D NANVECTOR = new Vector3D(Double.NaN, Double.NaN, Double.NaN);
50
51
52
53
54
55
56
57
58
59
60 public CdmWriter(final IERSConventions conventions, final DataContext dataContext) {
61 super(Cdm.ROOT, Cdm.FORMAT_VERSION_KEY, CCSDS_CDM_VERS,
62 new ContextBinding(
63 () -> conventions,
64 () -> false, () -> dataContext, () -> ParsedUnitsBehavior.STRICT_COMPLIANCE,
65 () -> null, () -> TimeSystem.UTC,
66 () -> 0.0, () -> 1.0));
67 }
68
69
70 @Override
71 public void writeSegmentContent(final Generator generator, final double formatVersion,
72 final Segment<CdmMetadata, CdmData> segment)
73 throws IOException {
74
75
76 final ContextBinding oldContext = getContext();
77 final CdmMetadata metadata = segment.getMetadata();
78 setContext(new ContextBinding(oldContext::getConventions,
79 oldContext::isSimpleEOP,
80 oldContext::getDataContext,
81 oldContext::getParsedUnitsBehavior,
82 oldContext::getReferenceDate,
83 metadata::getTimeSystem,
84 oldContext::getClockCount,
85 oldContext::getClockRate));
86 new CdmMetadataWriter(metadata).write(generator);
87
88
89 if (generator.getFormat() == FileFormat.XML) {
90 generator.enterSection(XmlStructureKey.data.name());
91 }
92
93 if (segment.getData().getODParametersBlock() != null) {
94
95 generator.writeComments(segment.getData().getComments());
96 new ODParametersWriter(XmlSubStructureKey.odParameters.name(), null,
97 segment.getData().getODParametersBlock(), getTimeConverter()).
98 write(generator);
99 }
100
101 if (segment.getData().getAdditionalParametersBlock() != null) {
102
103 new AdditionalParametersWriter(XmlSubStructureKey.additionalParameters.name(), null,
104 segment.getData().getAdditionalParametersBlock()).
105 write(generator);
106 }
107
108
109 new StateVectorWriter(XmlSubStructureKey.stateVector.name(), null,
110 segment.getData().getStateVectorBlock()).
111 write(generator);
112
113
114 new RTNCovarianceWriter(XmlSubStructureKey.covarianceMatrix.name(), null,
115 segment.getData().getRTNCovarianceBlock()).
116 write(generator);
117
118
119 if (generator.getFormat() == FileFormat.XML) {
120 generator.exitSection();
121 }
122
123 }
124
125 @Override
126 public void writeRelativeMetadataContent(final Generator generator, final double formatVersion,
127 final CdmRelativeMetadata relativeMetadata) throws IOException {
128
129
130
131 if (generator.getFormat() == FileFormat.XML) {
132 generator.enterSection(XmlSubStructureKey.relativeMetadataData.name());
133 }
134 generator.writeComments(relativeMetadata.getComment());
135
136 generator.writeEntry(CdmRelativeMetadataKey.TCA.name(), getTimeConverter(), relativeMetadata.getTca(), true, true);
137 generator.writeEntry(CdmRelativeMetadataKey.MISS_DISTANCE.name(), relativeMetadata.getMissDistance(), Unit.METRE, true);
138 generator.writeEntry(CdmRelativeMetadataKey.RELATIVE_SPEED.name(), relativeMetadata.getRelativeSpeed(), Units.M_PER_S, false);
139
140
141 if (generator.getFormat() == FileFormat.XML && (relativeMetadata.getRelativePosition() != NANVECTOR ||
142 relativeMetadata.getRelativeVelocity() != NANVECTOR)) {
143 generator.enterSection(XmlSubStructureKey.relativeStateVector.name());
144 }
145
146 if (relativeMetadata.getRelativePosition() != NANVECTOR) {
147 generator.writeEntry(CdmRelativeMetadataKey.RELATIVE_POSITION_R.name(),
148 relativeMetadata.getRelativePosition().getX(), Unit.METRE, false);
149 generator.writeEntry(CdmRelativeMetadataKey.RELATIVE_POSITION_T.name(),
150 relativeMetadata.getRelativePosition().getY(), Unit.METRE, false);
151 generator.writeEntry(CdmRelativeMetadataKey.RELATIVE_POSITION_N.name(),
152 relativeMetadata.getRelativePosition().getZ(), Unit.METRE, false);
153 }
154 if (relativeMetadata.getRelativeVelocity() != NANVECTOR) {
155 generator.writeEntry(CdmRelativeMetadataKey.RELATIVE_VELOCITY_R.name(),
156 relativeMetadata.getRelativeVelocity().getX(), Units.M_PER_S, false);
157 generator.writeEntry(CdmRelativeMetadataKey.RELATIVE_VELOCITY_T.name(),
158 relativeMetadata.getRelativeVelocity().getY(), Units.M_PER_S, false);
159 generator.writeEntry(CdmRelativeMetadataKey.RELATIVE_VELOCITY_N.name(),
160 relativeMetadata.getRelativeVelocity().getZ(), Units.M_PER_S, false);
161 }
162
163
164 if (generator.getFormat() == FileFormat.XML &&
165 (relativeMetadata.getRelativePosition() != NANVECTOR || relativeMetadata.getRelativeVelocity() != NANVECTOR)) {
166 generator.exitSection();
167 }
168
169 generator.writeEntry(CdmRelativeMetadataKey.START_SCREEN_PERIOD.name(), getTimeConverter(),
170 relativeMetadata.getStartScreenPeriod(), true, false);
171 generator.writeEntry(CdmRelativeMetadataKey.STOP_SCREEN_PERIOD.name(), getTimeConverter(),
172 relativeMetadata.getStopScreenPeriod(), true, false);
173 generator.writeEntry(CdmRelativeMetadataKey.SCREEN_VOLUME_FRAME.name(), relativeMetadata.getScreenVolumeFrame(), false);
174 generator.writeEntry(CdmRelativeMetadataKey.SCREEN_VOLUME_SHAPE.name(), relativeMetadata.getScreenVolumeShape(), false);
175 generator.writeEntry(CdmRelativeMetadataKey.SCREEN_VOLUME_X.name(), relativeMetadata.getScreenVolumeX(), Unit.METRE, false);
176 generator.writeEntry(CdmRelativeMetadataKey.SCREEN_VOLUME_Y.name(), relativeMetadata.getScreenVolumeY(), Unit.METRE, false);
177 generator.writeEntry(CdmRelativeMetadataKey.SCREEN_VOLUME_Z.name(), relativeMetadata.getScreenVolumeZ(), Unit.METRE, false);
178 generator.writeEntry(CdmRelativeMetadataKey.SCREEN_ENTRY_TIME.name(), getTimeConverter(),
179 relativeMetadata.getScreenEntryTime(), true, false);
180 generator.writeEntry(CdmRelativeMetadataKey.SCREEN_EXIT_TIME.name(), getTimeConverter(),
181 relativeMetadata.getScreenExitTime(), true, false);
182 generator.writeEntry(CdmRelativeMetadataKey.COLLISION_PROBABILITY.name(), relativeMetadata.getCollisionProbability(), Unit.ONE, false);
183 if (relativeMetadata.getCollisionProbaMethod() != null) {
184 generator.writeEntry(CdmRelativeMetadataKey.COLLISION_PROBABILITY_METHOD.name(),
185 relativeMetadata.getCollisionProbaMethod().getName(), null, false);
186 }
187
188
189 if (generator.getFormat() == FileFormat.XML) {
190 generator.exitSection();
191 }
192
193 }
194
195 }
196