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 ResettableManeuverTriggers {
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 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 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.computeIfAbsent(field, k -> new ArrayList<>());
142
143
144 list.add(resetter);
145
146 }
147
148
149
150
151
152 protected void initializeResetters(final SpacecraftState initialState, final AbsoluteDate target) {
153 for (final ManeuverTriggersResetter r : resetters) {
154 r.init(initialState, target);
155 }
156 }
157
158
159
160
161
162 protected void notifyResetters(final SpacecraftState state, final boolean start) {
163 for (final ManeuverTriggersResetter r : resetters) {
164 r.maneuverTriggered(state, start);
165 }
166 }
167
168
169
170
171
172 protected SpacecraftState applyResetters(final SpacecraftState state) {
173 SpacecraftState reset = state;
174 for (final ManeuverTriggersResetter r : resetters) {
175 reset = r.resetState(reset);
176 }
177 return reset;
178 }
179
180
181
182
183
184
185 protected <T extends CalculusFieldElement<T>> void initializeResetters(final FieldSpacecraftState<T> initialState, final FieldAbsoluteDate<T> target) {
186 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(initialState.getDate().getField());
187 if (list != null) {
188 for (final FieldManeuverTriggersResetter<?> r : list) {
189 @SuppressWarnings("unchecked")
190 final FieldManeuverTriggersResetter<T> tr = (FieldManeuverTriggersResetter<T>) r;
191 tr.init(initialState, target);
192 }
193 }
194 }
195
196
197
198
199
200
201 protected <T extends CalculusFieldElement<T>> void notifyResetters(final FieldSpacecraftState<T> state, final boolean start) {
202 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(state.getDate().getField());
203 if (list != null) {
204 for (final FieldManeuverTriggersResetter<?> r : list) {
205 @SuppressWarnings("unchecked")
206 final FieldManeuverTriggersResetter<T> tr = (FieldManeuverTriggersResetter<T>) r;
207 tr.maneuverTriggered(state, start);
208 }
209 }
210 }
211
212
213
214
215
216
217 protected <T extends CalculusFieldElement<T>> FieldSpacecraftState<T>
218 applyResetters(final FieldSpacecraftState<T> state) {
219 FieldSpacecraftState<T> reset = state;
220 final List<FieldManeuverTriggersResetter<?>> list = fieldResetters.get(state.getDate().getField());
221 if (list != null) {
222 for (final FieldManeuverTriggersResetter<?> r : list) {
223 @SuppressWarnings("unchecked")
224 final FieldManeuverTriggersResetter<T> tr = (FieldManeuverTriggersResetter<T>) r;
225 reset = tr.resetState(reset);
226 }
227 }
228 return reset;
229 }
230
231 }