1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.adm.aem;
18
19 import org.orekit.files.ccsds.ndm.adm.AdmMetadataKey;
20 import org.orekit.files.ccsds.ndm.adm.AttitudeType;
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
25
26
27
28
29
30
31
32
33 public enum AemMetadataKey {
34
35
36 REF_FRAME_A((token, context, container) -> token.processAsFrame(container.getEndpoints()::setFrameA, context, true, true, true)),
37
38
39 REF_FRAME_B((token, context, container) -> {
40 if (token.getType() == TokenType.ENTRY) {
41 container.checkNotNull(container.getEndpoints().getFrameA(), REF_FRAME_A.name());
42 final boolean aIsSpaceraftBody = container.getEndpoints().getFrameA().asSpacecraftBodyFrame() != null;
43 return token.processAsFrame(container.getEndpoints()::setFrameB, context,
44 aIsSpaceraftBody, aIsSpaceraftBody, !aIsSpaceraftBody);
45 }
46 return true;
47 }),
48
49
50 ATTITUDE_DIR((token, context, container) -> {
51 if (token.getType() == TokenType.ENTRY) {
52 container.getEndpoints().setA2b(token.getContentAsUppercaseCharacter() == 'A');
53 }
54 return true;
55 }),
56
57
58 START_TIME((token, context, container) -> token.processAsDate(container::setStartTime, context)),
59
60
61 STOP_TIME((token, context, container) -> token.processAsDate(container::setStopTime, context)),
62
63
64 USEABLE_START_TIME((token, context, container) -> token.processAsDate(container::setUseableStartTime, context)),
65
66
67 USEABLE_STOP_TIME((token, context, container) -> token.processAsDate(container::setUseableStopTime, context)),
68
69
70 ATTITUDE_TYPE((token, context, container) -> {
71 if (token.getType() == TokenType.ENTRY) {
72 try {
73 container.setAttitudeType(AttitudeType.parseType(token.getRawContent()));
74 return true;
75 } catch (IllegalArgumentException iae) {
76 return false;
77 }
78 }
79 return true;
80 }),
81
82
83 QUATERNION_TYPE((token, context, container) -> {
84 if (token.getType() == TokenType.ENTRY) {
85 container.setIsFirst("FIRST".equals(token.getContentAsUppercaseString()));
86 }
87 return true;
88 }),
89
90
91 EULER_ROT_SEQ((token, context, container) -> token.processAsRotationOrder(container::setEulerRotSeq)),
92
93
94 RATE_FRAME((token, context, container) -> {
95 if (token.getType() == TokenType.ENTRY) {
96 final String content = token.getContentAsUppercaseString();
97 final char suffix = content.charAt(content.length() - 1);
98 container.setRateFrameIsA(suffix == 'A');
99 }
100 return true;
101 }),
102
103
104
105
106 ANGVEL_FRAME((token, context, container) -> token.processAsFrame(container::setAngvelFrame, context, true, true, true)),
107
108
109 INTERPOLATION_METHOD((token, context, container) -> token.processAsUppercaseString(container::setInterpolationMethod)),
110
111
112 INTERPOLATION_DEGREE((token, context, container) -> token.processAsInteger(container::setInterpolationDegree));
113
114
115 private final transient TokenProcessor processor;
116
117
118
119
120 AemMetadataKey(final TokenProcessor processor) {
121 this.processor = processor;
122 }
123
124
125
126
127
128
129
130 public boolean process(final ParseToken token, final ContextBinding context, final AemMetadata container) {
131 return processor.process(token, context, container);
132 }
133
134
135 interface TokenProcessor {
136
137
138
139
140
141
142 boolean process(ParseToken token, ContextBinding context, AemMetadata container);
143 }
144
145 }