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 org.orekit.files.ccsds.definitions.Units;
20 import org.orekit.files.ccsds.ndm.adm.AdmParser;
21 import org.orekit.files.ccsds.utils.ContextBinding;
22 import org.orekit.files.ccsds.utils.lexical.ParseToken;
23 import org.orekit.files.ccsds.utils.lexical.TokenType;
24 import org.orekit.utils.units.Unit;
25
26
27
28
29
30 public enum EulerKey {
31
32
33 rotationAngles((token, context, container) -> true),
34
35
36 rotationRates((token, context, container) -> true),
37
38
39 COMMENT((token, context, container) ->
40 token.getType() == TokenType.ENTRY ? container.addComment(token.getContentAsNormalizedString()) : true),
41
42
43 EULER_FRAME_A((token, context, container) -> token.processAsFrame(container.getEndpoints()::setFrameA, context, true, true, true)),
44
45
46 EULER_FRAME_B((token, context, container) -> {
47 if (token.getType() == TokenType.ENTRY) {
48 container.checkNotNull(container.getEndpoints().getFrameA(), EULER_FRAME_A);
49 final boolean aIsSpaceraftBody = container.getEndpoints().getFrameA().asSpacecraftBodyFrame() != null;
50 return token.processAsFrame(container.getEndpoints()::setFrameB, context,
51 aIsSpaceraftBody, aIsSpaceraftBody, !aIsSpaceraftBody);
52 }
53 return true;
54 }),
55
56
57 EULER_DIR((token, context, container) -> {
58 if (token.getType() == TokenType.ENTRY) {
59 container.getEndpoints().setA2b(token.getContentAsUppercaseCharacter() == 'A');
60 }
61 return true;
62 }),
63
64
65 EULER_ROT_SEQ((token, context, container) -> AdmParser.processRotationOrder(token, container::setEulerRotSeq)),
66
67
68 RATE_FRAME((token, context, container) -> {
69 if (token.getType() == TokenType.ENTRY) {
70 final String content = token.getContentAsUppercaseString();
71 final char suffix = content.charAt(content.length() - 1);
72 container.setRateFrameIsA(suffix == 'A');
73 }
74 return true;
75 }),
76
77
78 X_ANGLE((token, context, container) -> token.processAsLabeledDouble('X', Unit.DEGREE, context.getParsedUnitsBehavior(),
79 container::setRotationAngle)),
80
81
82 Y_ANGLE((token, context, container) -> token.processAsLabeledDouble('Y', Unit.DEGREE, context.getParsedUnitsBehavior(),
83 container::setRotationAngle)),
84
85
86 Z_ANGLE((token, context, container) -> token.processAsLabeledDouble('Z', Unit.DEGREE, context.getParsedUnitsBehavior(),
87 container::setRotationAngle)),
88
89
90 X_RATE((token, context, container) -> token.processAsLabeledDouble('X', Units.DEG_PER_S, context.getParsedUnitsBehavior(),
91 container::setRotationRate)),
92
93
94 Y_RATE((token, context, container) -> token.processAsLabeledDouble('Y', Units.DEG_PER_S, context.getParsedUnitsBehavior(),
95 container::setRotationRate)),
96
97
98 Z_RATE((token, context, container) -> token.processAsLabeledDouble('Z', Units.DEG_PER_S, context.getParsedUnitsBehavior(),
99 container::setRotationRate));
100
101
102 private final TokenProcessor processor;
103
104
105
106
107 EulerKey(final TokenProcessor processor) {
108 this.processor = processor;
109 }
110
111
112
113
114
115
116
117 public boolean process(final ParseToken token, final ContextBinding context, final Euler container) {
118 return processor.process(token, context, container);
119 }
120
121
122 interface TokenProcessor {
123
124
125
126
127
128
129 boolean process(ParseToken token, ContextBinding context, Euler container);
130 }
131
132 }