1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.files.ccsds.ndm.odm;
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.orbits.PositionAngleType;
24 import org.orekit.utils.units.Unit;
25
26
27
28
29
30
31 public enum KeplerianElementsKey {
32
33
34 COMMENT((token, context, container) ->
35 token.getType() == TokenType.ENTRY ? container.addComment(token.getContentAsNormalizedString()) : true),
36
37
38 EPOCH((token, context, container) -> token.processAsDate(container::setEpoch, context)),
39
40
41 SEMI_MAJOR_AXIS((token, context, container) -> token.processAsDouble(Unit.KILOMETRE, context.getParsedUnitsBehavior(), container::setA)),
42
43
44 MEAN_MOTION((token, context, container) -> token.processAsDouble(Units.REV_PER_DAY, context.getParsedUnitsBehavior(), container::setMeanMotion)),
45
46
47 ECCENTRICITY((token, context, container) -> token.processAsDouble(Unit.ONE, context.getParsedUnitsBehavior(), container::setE)),
48
49
50 INCLINATION((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(), container::setI)),
51
52
53 RA_OF_ASC_NODE((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(), container::setRaan)),
54
55
56 ARG_OF_PERICENTER((token, context, container) -> token.processAsDouble(Unit.DEGREE, context.getParsedUnitsBehavior(), container::setPa)),
57
58
59 TRUE_ANOMALY((token, context, container) -> {
60 if (token.getType() == TokenType.ENTRY) {
61 final double angle = context.
62 getParsedUnitsBehavior().
63 select(token.getUnits(), Unit.DEGREE).
64 toSI(token.getContentAsDouble());
65 container.setAnomaly(angle);
66 container.setAnomalyType(PositionAngleType.TRUE);
67 }
68 return true;
69 }),
70
71
72 MEAN_ANOMALY((token, context, container) -> {
73 if (token.getType() == TokenType.ENTRY) {
74 final double angle = context.
75 getParsedUnitsBehavior().
76 select(token.getUnits(), Unit.DEGREE).
77 toSI(token.getContentAsDouble());
78 container.setAnomaly(angle);
79 container.setAnomalyType(PositionAngleType.MEAN);
80 }
81 return true;
82 }),
83
84
85 GM((token, context, container) -> token.processAsDouble(Units.KM3_PER_S2, context.getParsedUnitsBehavior(), container::setMu));
86
87
88 private final transient TokenProcessor processor;
89
90
91
92
93 KeplerianElementsKey(final TokenProcessor processor) {
94 this.processor = processor;
95 }
96
97
98
99
100
101
102
103 public boolean process(final ParseToken token, final ContextBinding context, final KeplerianElements container) {
104 return processor.process(token, context, container);
105 }
106
107
108 interface TokenProcessor {
109
110
111
112
113
114
115 boolean process(ParseToken token, ContextBinding context, KeplerianElements container);
116 }
117
118 }