1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.files.ccsds.ndm.adm.acm;
19
20 import java.io.IOException;
21
22 import org.orekit.files.ccsds.definitions.Units;
23 import org.orekit.files.ccsds.section.AbstractWriter;
24 import org.orekit.files.ccsds.utils.generation.Generator;
25
26 import org.orekit.utils.units.Unit;
27
28
29
30
31
32 class AttitudeDeterminationWriter extends AbstractWriter {
33
34
35 private final AttitudeDetermination ad;
36
37
38
39
40 AttitudeDeterminationWriter(final AttitudeDetermination attitudeDetermination) {
41 super(AcmDataSubStructureKey.ad.name(), AcmDataSubStructureKey.AD.name());
42 this.ad = attitudeDetermination;
43 }
44
45
46 @Override
47 protected void writeContent(final Generator generator) throws IOException {
48
49
50 generator.writeComments(ad.getComments());
51
52
53 generator.writeEntry(AttitudeDeterminationKey.AD_ID.name(), ad.getId(), null, false);
54 generator.writeEntry(AttitudeDeterminationKey.AD_PREV_ID.name(), ad.getPrevId(), null, false);
55 if (ad.getMethod() != null) {
56 generator.writeEntry(AttitudeDeterminationKey.AD_METHOD.name(), ad.getMethod().name(), null, false);
57 }
58
59 generator.writeEntry(AttitudeDeterminationKey.ATTITUDE_SOURCE.name(), ad.getSource(), null, false);
60
61
62 generator.writeEntry(AttitudeDeterminationKey.EULER_ROT_SEQ.name(), ad.getEulerRotSeq(), false);
63 generator.writeEntry(AttitudeDeterminationKey.NUMBER_STATES.name(), ad.getNbStates(), false);
64 generator.writeEntry(AttitudeDeterminationKey.ATTITUDE_STATES.name(), ad.getAttitudeStates(), true);
65 generator.writeEntry(AttitudeDeterminationKey.COV_TYPE.name(), ad.getCovarianceType(), false);
66 generator.writeEntry(AttitudeDeterminationKey.REF_FRAME_A.name(), ad.getEndpoints().getFrameA().getName(), null, false);
67 generator.writeEntry(AttitudeDeterminationKey.REF_FRAME_B.name(), ad.getEndpoints().getFrameB().getName(), null, false);
68 generator.writeEntry(AttitudeDeterminationKey.RATE_STATES.name(), ad.getRateStates(), false);
69 generator.writeEntry(AttitudeDeterminationKey.SIGMA_U.name(), ad.getSigmaU(), Units.DEG_PER_S_3_2, false);
70 generator.writeEntry(AttitudeDeterminationKey.SIGMA_V.name(), ad.getSigmaV(), Units.DEG_PER_S_1_2, false);
71 generator.writeEntry(AttitudeDeterminationKey.RATE_PROCESS_NOISE_STDDEV.name(), ad.getRateProcessNoiseStdDev(), Units.DEG_PER_S_3_2, false);
72
73
74 for (final AttitudeDeterminationSensor sensor : ad.getSensorsUsed()) {
75 generator.enterSection(AttitudeDeterminationKey.SENSOR.name());
76 generator.writeEntry(AttitudeDeterminationSensorKey.SENSOR_NUMBER.name(), sensor.getSensorNumber(), true);
77 generator.writeEntry(AttitudeDeterminationSensorKey.SENSOR_USED.name(), sensor.getSensorUsed(), null, true);
78 final double[] stddevDouble = sensor.getSensorNoiseCovariance();
79 if (stddevDouble != null) {
80 generator.writeEntry(AttitudeDeterminationSensorKey.NUMBER_SENSOR_NOISE_COVARIANCE.name(), stddevDouble.length, true);
81 final StringBuilder stddev = new StringBuilder();
82 for (int k = 0; k < stddevDouble.length; ++k) {
83 if (k > 0) {
84 stddev.append(' ');
85 }
86 stddev.append(generator.doubleToString(Unit.DEGREE.fromSI(stddevDouble[k])));
87 }
88 generator.writeEntry(AttitudeDeterminationSensorKey.SENSOR_NOISE_STDDEV.name(),
89 stddev.toString(), Unit.DEGREE, false);
90 }
91 generator.writeEntry(AttitudeDeterminationSensorKey.SENSOR_FREQUENCY.name(), sensor.getSensorFrequency(), Unit.HERTZ, false);
92 generator.exitSection();
93 }
94
95 }
96
97 }