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 for (final ManeuverTriggersResetter r : resetters) {
65 r.init(initialState, target);
66 }
67
68 if (isFiringOnInitialState(initialState, forward)) {
69 if (forward) {
70 firings.addValidAfter(Boolean.TRUE, initialState.getDate(), false);
71 } else {
72 firings.addValidBefore(Boolean.TRUE, initialState.getDate(), false);
73 }
74 }
75
76 }
77
78
79 @SuppressWarnings("unchecked")
80 @Override
81 public <T extends CalculusFieldElement<T>> void init(final FieldSpacecraftState<T> initialState, final FieldAbsoluteDate<T> target) {
82
83 forward = target.isAfterOrEqualTo(initialState);
84 firings = new TimeSpanMap<>(Boolean.FALSE);
85
86 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(initialState.getDate().getField());
87 if (list != null) {
88 for (FieldManeuverTriggersResetter<?> r : list) {
89 ((FieldManeuverTriggersResetter<T>) r).init(initialState, target);
90 }
91 }
92
93 if (isFiringOnInitialState(initialState.toSpacecraftState(), forward)) {
94 if (forward) {
95 firings.addValidAfter(Boolean.TRUE, initialState.getDate().toAbsoluteDate(), false);
96 } else {
97 firings.addValidBefore(Boolean.TRUE, initialState.getDate().toAbsoluteDate(), false);
98 }
99 }
100
101 }
102
103
104
105
106
107
108
109
110
111 protected abstract boolean isFiringOnInitialState(SpacecraftState initialState, boolean isForward);
112
113
114 @Override
115 public boolean isFiring(final AbsoluteDate date, final double[] parameters) {
116 return firings.get(date);
117 }
118
119
120 @Override
121 public <S extends CalculusFieldElement<S>> boolean isFiring(final FieldAbsoluteDate<S> date, final S[] parameters) {
122 return firings.get(date.toAbsoluteDate());
123 }
124
125
126
127
128 public TimeSpanMap<Boolean> getFirings() {
129 return firings;
130 }
131
132
133
134
135 public void addResetter(final ManeuverTriggersResetter resetter) {
136 resetters.add(resetter);
137 }
138
139
140
141
142
143
144 public <T extends CalculusFieldElement<T>> void addResetter(final Field<T> field, final FieldManeuverTriggersResetter<T> resetter) {
145
146
147 List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(field);
148 if (list == null) {
149 list = new ArrayList<>();
150 fieldResetters.put(field, list);
151 }
152
153
154 list.add(resetter);
155
156 }
157
158
159
160
161
162 protected void initializeResetters(final SpacecraftState initialState, final AbsoluteDate target) {
163 for (final ManeuverTriggersResetter r : resetters) {
164 r.init(initialState, target);
165 }
166 }
167
168
169
170
171
172 protected void notifyResetters(final SpacecraftState state, final boolean start) {
173 for (final ManeuverTriggersResetter r : resetters) {
174 r.maneuverTriggered(state, start);
175 }
176 }
177
178
179
180
181
182 protected SpacecraftState applyResetters(final SpacecraftState state) {
183 SpacecraftState reset = state;
184 for (final ManeuverTriggersResetter r : resetters) {
185 reset = r.resetState(reset);
186 }
187 return reset;
188 }
189
190
191
192
193
194
195 protected <T extends CalculusFieldElement<T>> void initializeResetters(final FieldSpacecraftState<T> initialState, final FieldAbsoluteDate<T> target) {
196 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(initialState.getDate().getField());
197 if (list != null) {
198 for (final FieldManeuverTriggersResetter<?> r : list) {
199 @SuppressWarnings("unchecked")
200 final FieldManeuverTriggersResetter<T> tr = (FieldManeuverTriggersResetter<T>) r;
201 tr.init(initialState, target);
202 }
203 }
204 }
205
206
207
208
209
210
211 protected <T extends CalculusFieldElement<T>> void notifyResetters(final FieldSpacecraftState<T> state, final boolean start) {
212 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(state.getDate().getField());
213 if (list != null) {
214 for (final FieldManeuverTriggersResetter<?> r : list) {
215 @SuppressWarnings("unchecked")
216 final FieldManeuverTriggersResetter<T> tr = (FieldManeuverTriggersResetter<T>) r;
217 tr.maneuverTriggered(state, start);
218 }
219 }
220 }
221
222
223
224
225
226
227 protected <T extends CalculusFieldElement<T>> FieldSpacecraftState<T>
228 applyResetters(final FieldSpacecraftState<T> state) {
229 FieldSpacecraftState<T> reset = state;
230 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(state.getDate().getField());
231 if (list != null) {
232 for (final FieldManeuverTriggersResetter<?> r : list) {
233 @SuppressWarnings("unchecked")
234 final FieldManeuverTriggersResetter<T> tr = (FieldManeuverTriggersResetter<T>) r;
235 reset = tr.resetState(reset);
236 }
237 }
238 return reset;
239 }
240
241 }