1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.forces.maneuvers.trigger;
18
19 import java.util.ArrayList;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23
24 import org.hipparchus.CalculusFieldElement;
25 import org.hipparchus.Field;
26 import org.orekit.propagation.FieldSpacecraftState;
27 import org.orekit.propagation.SpacecraftState;
28 import org.orekit.time.AbsoluteDate;
29 import org.orekit.time.FieldAbsoluteDate;
30 import org.orekit.utils.TimeSpanMap;
31
32
33
34
35
36 public abstract class AbstractManeuverTriggers implements ManeuverTriggers {
37
38
39 private TimeSpanMap<Boolean> firings;
40
41
42 private boolean forward;
43
44
45 private final List<ManeuverTriggersResetter> resetters;
46
47
48 private final transient Map<Field<? extends CalculusFieldElement<?>>, List<FieldManeuverTriggersResetter<?>>> fieldResetters;
49
50
51
52 protected AbstractManeuverTriggers() {
53 this.firings = new TimeSpanMap<>(Boolean.FALSE);
54 this.resetters = new ArrayList<>();
55 this.fieldResetters = new HashMap<>();
56 }
57
58
59 @Override
60 public void init(final SpacecraftState initialState, final AbsoluteDate target) {
61
62 forward = target.isAfterOrEqualTo(initialState);
63 firings = new TimeSpanMap<>(Boolean.FALSE);
64 initializeResetters(initialState, target);
65
66 if (isFiringOnInitialState(initialState, forward)) {
67 if (forward) {
68 firings.addValidAfter(Boolean.TRUE, initialState.getDate(), false);
69 } else {
70 firings.addValidBefore(Boolean.TRUE, initialState.getDate(), false);
71 }
72 }
73
74 }
75
76
77 @SuppressWarnings("unchecked")
78 @Override
79 public <T extends CalculusFieldElement<T>> void init(final FieldSpacecraftState<T> initialState, final FieldAbsoluteDate<T> target) {
80
81 forward = target.isAfterOrEqualTo(initialState);
82 firings = new TimeSpanMap<>(Boolean.FALSE);
83
84 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(initialState.getDate().getField());
85 if (list != null) {
86 for (FieldManeuverTriggersResetter<?> r : list) {
87 ((FieldManeuverTriggersResetter<T>) r).init(initialState, target);
88 }
89 }
90
91 if (isFiringOnInitialState(initialState.toSpacecraftState(), forward)) {
92 if (forward) {
93 firings.addValidAfter(Boolean.TRUE, initialState.getDate().toAbsoluteDate(), false);
94 } else {
95 firings.addValidBefore(Boolean.TRUE, initialState.getDate().toAbsoluteDate(), false);
96 }
97 }
98
99 }
100
101
102
103
104
105
106
107
108
109 protected abstract boolean isFiringOnInitialState(SpacecraftState initialState, boolean isForward);
110
111
112 @Override
113 public boolean isFiring(final AbsoluteDate date, final double[] parameters) {
114 return firings.get(date);
115 }
116
117
118 @Override
119 public <S extends CalculusFieldElement<S>> boolean isFiring(final FieldAbsoluteDate<S> date, final S[] parameters) {
120 return firings.get(date.toAbsoluteDate());
121 }
122
123
124
125
126 public TimeSpanMap<Boolean> getFirings() {
127 return firings;
128 }
129
130
131 @Override
132 public void addResetter(final ManeuverTriggersResetter resetter) {
133 resetters.add(resetter);
134 }
135
136
137 @Override
138 public <T extends CalculusFieldElement<T>> void addResetter(final Field<T> field, final FieldManeuverTriggersResetter<T> resetter) {
139
140
141 List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(field);
142 if (list == null) {
143 list = new ArrayList<>();
144 fieldResetters.put(field, list);
145 }
146
147
148 list.add(resetter);
149
150 }
151
152
153
154
155
156 protected void initializeResetters(final SpacecraftState initialState, final AbsoluteDate target) {
157 for (final ManeuverTriggersResetter r : resetters) {
158 r.init(initialState, target);
159 }
160 }
161
162
163
164
165
166 protected void notifyResetters(final SpacecraftState state, final boolean start) {
167 for (final ManeuverTriggersResetter r : resetters) {
168 r.maneuverTriggered(state, start);
169 }
170 }
171
172
173
174
175
176 protected SpacecraftState applyResetters(final SpacecraftState state) {
177 SpacecraftState reset = state;
178 for (final ManeuverTriggersResetter r : resetters) {
179 reset = r.resetState(reset);
180 }
181 return reset;
182 }
183
184
185
186
187
188
189 protected <T extends CalculusFieldElement<T>> void initializeResetters(final FieldSpacecraftState<T> initialState, final FieldAbsoluteDate<T> target) {
190 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(initialState.getDate().getField());
191 if (list != null) {
192 for (final FieldManeuverTriggersResetter<?> r : list) {
193 @SuppressWarnings("unchecked")
194 final FieldManeuverTriggersResetter<T> tr = (FieldManeuverTriggersResetter<T>) r;
195 tr.init(initialState, target);
196 }
197 }
198 }
199
200
201
202
203
204
205 protected <T extends CalculusFieldElement<T>> void notifyResetters(final FieldSpacecraftState<T> state, final boolean start) {
206 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(state.getDate().getField());
207 if (list != null) {
208 for (final FieldManeuverTriggersResetter<?> r : list) {
209 @SuppressWarnings("unchecked")
210 final FieldManeuverTriggersResetter<T> tr = (FieldManeuverTriggersResetter<T>) r;
211 tr.maneuverTriggered(state, start);
212 }
213 }
214 }
215
216
217
218
219
220
221 protected <T extends CalculusFieldElement<T>> FieldSpacecraftState<T>
222 applyResetters(final FieldSpacecraftState<T> state) {
223 FieldSpacecraftState<T> reset = state;
224 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(state.getDate().getField());
225 if (list != null) {
226 for (final FieldManeuverTriggersResetter<?> r : list) {
227 @SuppressWarnings("unchecked")
228 final FieldManeuverTriggersResetter<T> tr = (FieldManeuverTriggersResetter<T>) r;
229 reset = tr.resetState(reset);
230 }
231 }
232 return reset;
233 }
234
235 }