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.apm;
19
20 import java.io.IOException;
21
22 import org.orekit.files.ccsds.definitions.Units;
23 import org.orekit.files.ccsds.ndm.adm.AttitudeEndpoints;
24 import org.orekit.files.ccsds.section.AbstractWriter;
25 import org.orekit.files.ccsds.utils.generation.Generator;
26 import org.orekit.utils.units.Unit;
27
28
29
30
31
32 class EulerWriter extends AbstractWriter {
33
34
35 private static String ANGLE = "_ANGLE";
36
37
38 private static String RATE = "_RATE";
39
40
41
42
43 private final double formatVersion;
44
45
46 private final Euler euler;
47
48
49
50
51
52
53
54 EulerWriter(final double formatVersion, final String xmlTag, final String kvnTag,
55 final Euler euler) {
56 super(xmlTag, kvnTag);
57 this.formatVersion = formatVersion;
58 this.euler = euler;
59 }
60
61
62 @Override
63 protected void writeContent(final Generator generator) throws IOException {
64
65 generator.writeComments(euler.getComments());
66
67
68 if (formatVersion < 2.0) {
69 generator.writeEntry(EulerKey.EULER_FRAME_A.name(), euler.getEndpoints().getFrameA().getName(), null, true);
70 generator.writeEntry(EulerKey.EULER_FRAME_B.name(), euler.getEndpoints().getFrameB().getName(), null, true);
71 generator.writeEntry(EulerKey.EULER_DIR.name(),
72 euler.getEndpoints().isA2b() ? AttitudeEndpoints.A2B : AttitudeEndpoints.B2A,
73 null, true);
74 } else {
75 generator.writeEntry(EulerKey.REF_FRAME_A.name(), euler.getEndpoints().getFrameA().getName(), null, true);
76 generator.writeEntry(EulerKey.REF_FRAME_B.name(), euler.getEndpoints().getFrameB().getName(), null, true);
77 }
78
79
80 final String seq = euler.getEulerRotSeq().name();
81 final double[] angles = euler.getRotationAngles();
82 if (formatVersion < 2.0) {
83 generator.writeEntry(EulerKey.EULER_ROT_SEQ.name(),
84 seq.replace('X', '1').replace('Y', '2').replace('Z', '3'),
85 null, true);
86 generator.writeEntry(EulerKey.RATE_FRAME.name(),
87 euler.rateFrameIsA() ? EulerKey.EULER_FRAME_A.name() : EulerKey.EULER_FRAME_B.name(),
88 null, euler.hasRates());
89 } else {
90 generator.writeEntry(EulerKey.EULER_ROT_SEQ.name(), seq, null, true);
91 }
92
93
94
95 final boolean needsAngles = !euler.hasRates();
96 if (formatVersion < 2.0) {
97 generator.writeEntry(seq.charAt(0) + ANGLE, angles[0], Unit.DEGREE, needsAngles);
98 generator.writeEntry(seq.charAt(1) + ANGLE, angles[1], Unit.DEGREE, needsAngles);
99 generator.writeEntry(seq.charAt(2) + ANGLE, angles[2], Unit.DEGREE, needsAngles);
100 } else {
101 generator.writeEntry(EulerKey.ANGLE_1.name(), angles[0], Unit.DEGREE, needsAngles);
102 generator.writeEntry(EulerKey.ANGLE_2.name(), angles[1], Unit.DEGREE, needsAngles);
103 generator.writeEntry(EulerKey.ANGLE_3.name(), angles[2], Unit.DEGREE, needsAngles);
104 }
105
106
107 if (euler.hasRates()) {
108 final double[] rates = euler.getRotationRates();
109 if (formatVersion < 2.0) {
110 generator.writeEntry(seq.charAt(0) + RATE, rates[0], Units.DEG_PER_S, true);
111 generator.writeEntry(seq.charAt(1) + RATE, rates[1], Units.DEG_PER_S, true);
112 generator.writeEntry(seq.charAt(2) + RATE, rates[2], Units.DEG_PER_S, true);
113 } else {
114 generator.writeEntry(EulerKey.ANGLE_1_DOT.name(), rates[0], Units.DEG_PER_S, true);
115 generator.writeEntry(EulerKey.ANGLE_2_DOT.name(), rates[1], Units.DEG_PER_S, true);
116 generator.writeEntry(EulerKey.ANGLE_3_DOT.name(), rates[2], Units.DEG_PER_S, true);
117 }
118 }
119
120 }
121
122 }