1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.odm.ocm;
18
19 import java.util.regex.Matcher;
20 import java.util.regex.Pattern;
21
22 import org.orekit.files.ccsds.definitions.Units;
23 import org.orekit.files.ccsds.utils.ContextBinding;
24 import org.orekit.files.ccsds.utils.lexical.ParseToken;
25 import org.orekit.files.ccsds.utils.lexical.TokenType;
26 import org.orekit.utils.units.Unit;
27
28
29
30
31
32
33 public enum PerturbationsKey {
34
35
36 COMMENT((token, context, container) ->
37 token.getType() == TokenType.ENTRY ? container.addComment(token.getContentAsNormalizedString()) : true),
38
39
40 ATMOSPHERIC_MODEL((token, context, container) -> token.processAsFreeTextString(container::setAtmosphericModel)),
41
42
43 GRAVITY_MODEL(new GravityProcessor()),
44
45
46 EQUATORIAL_RADIUS((token, context, container) -> token.processAsDouble(Unit.KILOMETRE, context.getParsedUnitsBehavior(),
47 container::setEquatorialRadius)),
48
49
50 GM((token, context, container) -> token.processAsDouble(Units.KM3_PER_S2, context.getParsedUnitsBehavior(),
51 container::setGm)),
52
53
54 N_BODY_PERTURBATIONS((token, context, container) -> token.processAsCenterList(container::setNBodyPerturbations,
55 context.getDataContext().getCelestialBodies())),
56
57
58 CENTRAL_BODY_ROTATION((token, context, container) -> token.processAsDouble(Units.DEG_PER_S, context.getParsedUnitsBehavior(),
59 container::setCentralBodyRotation)),
60
61
62 OBLATE_FLATTENING((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(),
63 container::setOblateFlattening)),
64
65
66 OCEAN_TIDES_MODEL((token, context, container) -> token.processAsFreeTextString(container::setOceanTidesModel)),
67
68
69 SOLID_TIDES_MODEL((token, context, container) -> token.processAsFreeTextString(container::setSolidTidesModel)),
70
71
72 REDUCTION_THEORY((token, context, container) -> token.processAsFreeTextString(container::setReductionTheory)),
73
74
75 ALBEDO_MODEL((token, context, container) -> token.processAsFreeTextString(container::setAlbedoModel)),
76
77
78 ALBEDO_GRID_SIZE((token, context, container) -> token.processAsInteger(container::setAlbedoGridSize)),
79
80
81 SHADOW_MODEL((token, context, container) -> token.processAsEnum(ShadowModel.class, container::setShadowModel)),
82
83
84 SHADOW_BODIES((token, context, container) -> token.processAsCenterList(container::setShadowBodies,
85 context.getDataContext().getCelestialBodies())),
86
87
88 SRP_MODEL((token, context, container) -> token.processAsFreeTextString(container::setSrpModel)),
89
90
91 SW_DATA_SOURCE((token, context, container) -> token.processAsFreeTextString(container::setSpaceWeatherSource)),
92
93
94 SW_DATA_EPOCH((token, context, container) -> token.processAsDate(container::setSpaceWeatherEpoch, context)),
95
96
97 SW_INTERP_METHOD((token, context, container) -> token.processAsFreeTextString(container::setInterpMethodSW)),
98
99
100 FIXED_GEOMAG_KP((token, context, container) -> token.processAsDouble(Units.NANO_TESLA, context.getParsedUnitsBehavior(),
101 container::setFixedGeomagneticKp)),
102
103
104 FIXED_GEOMAG_AP((token, context, container) -> token.processAsDouble(Units.NANO_TESLA, context.getParsedUnitsBehavior(),
105 container::setFixedGeomagneticAp)),
106
107
108 FIXED_GEOMAG_DST((token, context, container) -> token.processAsDouble(Units.NANO_TESLA, context.getParsedUnitsBehavior(),
109 container::setFixedGeomagneticDst)),
110
111
112 FIXED_F10P7((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
113 container::setFixedF10P7)),
114
115
116 FIXED_F10P7_MEAN((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
117 container::setFixedF10P7Mean)),
118
119
120 FIXED_M10P7((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
121 container::setFixedM10P7)),
122
123
124 FIXED_M10P7_MEAN((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
125 container::setFixedM10P7Mean)),
126
127
128 FIXED_S10P7((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
129 container::setFixedS10P7)),
130
131
132 FIXED_S10P7_MEAN((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
133 container::setFixedS10P7Mean)),
134
135
136 FIXED_Y10P7((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
137 container::setFixedY10P7)),
138
139
140 FIXED_Y10P7_MEAN((token, context, container) -> token.processAsDouble(Unit.SOLAR_FLUX_UNIT, context.getParsedUnitsBehavior(),
141 container::setFixedY10P7Mean));
142
143
144 private final transient TokenProcessor processor;
145
146
147
148
149 PerturbationsKey(final TokenProcessor processor) {
150 this.processor = processor;
151 }
152
153
154
155
156
157
158
159 public boolean process(final ParseToken token, final ContextBinding context, final Perturbations container) {
160 return processor.process(token, context, container);
161 }
162
163
164 interface TokenProcessor {
165
166
167
168
169
170
171 boolean process(ParseToken token, ContextBinding context, Perturbations container);
172 }
173
174
175 private static class GravityProcessor implements TokenProcessor {
176
177
178 private static final Pattern GRAVITY_PATTERN =
179 Pattern.compile("^\\p{Blank}*([-_A-Za-z0-9]+)\\p{Blank}*:" +
180 "\\p{Blank}*([0-9]+)D" +
181 "\\p{Blank}*([0-9]+)O" +
182 "\\p{Blank}*$");
183
184
185 @Override
186 public boolean process(final ParseToken token, final ContextBinding context, final Perturbations container) {
187 if (token.getType() == TokenType.ENTRY) {
188 final Matcher matcher = GRAVITY_PATTERN.matcher(token.getRawContent());
189 if (!matcher.matches()) {
190 throw token.generateException(null);
191 }
192 container.setGravityModel(matcher.group(1),
193 Integer.parseInt(matcher.group(2)),
194 Integer.parseInt(matcher.group(3)));
195 }
196 return true;
197 }
198 }
199
200 }