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