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.utils.ContextBinding;
21 import org.orekit.files.ccsds.utils.lexical.ParseToken;
22 import org.orekit.files.ccsds.utils.lexical.TokenType;
23 import org.orekit.utils.units.Unit;
24
25
26
27
28
29 public enum SpinStabilizedKey {
30
31
32 COMMENT((token, context, container) ->
33 token.getType() == TokenType.ENTRY ? container.addComment(token.getContentAsNormalizedString()) : true),
34
35
36 SPIN_FRAME_A((token, context, container) -> token.processAsFrame(container.getEndpoints()::setFrameA, context, true, true, true)),
37
38
39
40
41 REF_FRAME_A((token, context, container) -> token.processAsFrame(container.getEndpoints()::setFrameA, context, true, true, true)),
42
43
44 SPIN_FRAME_B((token, context, container) -> {
45 if (token.getType() == TokenType.ENTRY) {
46 container.checkNotNull(container.getEndpoints().getFrameA(), SPIN_FRAME_A.name());
47 final boolean aIsSpaceraftBody = container.getEndpoints().getFrameA().asSpacecraftBodyFrame() != null;
48 return token.processAsFrame(container.getEndpoints()::setFrameB, context,
49 aIsSpaceraftBody, aIsSpaceraftBody, !aIsSpaceraftBody);
50 }
51 return true;
52 }),
53
54
55
56
57 REF_FRAME_B((token, context, container) -> {
58 if (token.getType() == TokenType.ENTRY) {
59 container.checkNotNull(container.getEndpoints().getFrameA(), REF_FRAME_A.name());
60 final boolean aIsSpaceraftBody = container.getEndpoints().getFrameA().asSpacecraftBodyFrame() != null;
61 return token.processAsFrame(container.getEndpoints()::setFrameB, context,
62 aIsSpaceraftBody, aIsSpaceraftBody, !aIsSpaceraftBody);
63 }
64 return true;
65 }),
66
67
68 SPIN_DIR((token, context, container) -> {
69 if (token.getType() == TokenType.ENTRY) {
70 container.getEndpoints().setA2b(token.getContentAsUppercaseCharacter() == 'A');
71 }
72 return true;
73 }),
74
75
76 SPIN_ALPHA((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(),
77 container::setSpinAlpha)),
78
79
80 SPIN_DELTA((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(),
81 container::setSpinDelta)),
82
83
84 SPIN_ANGLE((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(),
85 container::setSpinAngle)),
86
87
88 SPIN_ANGLE_VEL((token, context, container) -> token.processAsDouble(Units.DEG_PER_S, context.getParsedUnitsBehavior(),
89 container::setSpinAngleVel)),
90
91
92 NUTATION((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(),
93 container::setNutation)),
94
95
96 NUTATION_PER((token, context, container) -> token.processAsDouble(Unit.SECOND, context.getParsedUnitsBehavior(),
97 container::setNutationPeriod)),
98
99
100 NUTATION_PHASE((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(),
101 container::setNutationPhase)),
102
103
104
105
106 MOMENTUM_ALPHA((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(),
107 container::setMomentumAlpha)),
108
109
110
111
112 MOMENTUM_DELTA((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(),
113 container::setMomentumDelta)),
114
115
116
117
118 NUTATION_VEL((token, context, container) -> token.processAsDouble(Units.DEG_PER_S, context.getParsedUnitsBehavior(),
119 container::setNutationVel));
120
121
122 private final transient TokenProcessor processor;
123
124
125
126
127 SpinStabilizedKey(final TokenProcessor processor) {
128 this.processor = processor;
129 }
130
131
132
133
134
135
136
137 public boolean process(final ParseToken token, final ContextBinding context, final SpinStabilized container) {
138 return processor.process(token, context, container);
139 }
140
141
142 interface TokenProcessor {
143
144
145
146
147
148
149 boolean process(ParseToken token, ContextBinding context, SpinStabilized container);
150 }
151
152 }