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.stream.Stream;
20
21 import org.hipparchus.Field;
22 import org.hipparchus.CalculusFieldElement;
23 import org.hipparchus.ode.events.Action;
24 import org.orekit.propagation.FieldSpacecraftState;
25 import org.orekit.propagation.SpacecraftState;
26 import org.orekit.propagation.events.DateDetector;
27 import org.orekit.propagation.events.EventDetector;
28 import org.orekit.propagation.events.FieldDateDetector;
29 import org.orekit.propagation.events.FieldEventDetector;
30 import org.orekit.time.AbsoluteDate;
31 import org.orekit.time.FieldAbsoluteDate;
32
33
34
35
36
37 public class DateBasedManeuverTriggers implements ManeuverTriggers {
38
39
40 private final AbsoluteDate startDate;
41
42
43 private final AbsoluteDate endDate;
44
45
46 private AbsoluteDate triggeredStart;
47
48
49 private AbsoluteDate triggeredEnd;
50
51
52 private boolean forward;
53
54 public DateBasedManeuverTriggers(final AbsoluteDate date,
55 final double duration) {
56 if (duration >= 0) {
57 this.startDate = date;
58 this.endDate = date.shiftedBy(duration);
59 } else {
60 this.endDate = date;
61 this.startDate = endDate.shiftedBy(duration);
62 }
63 this.triggeredStart = null;
64 this.triggeredEnd = null;
65
66 }
67
68
69
70
71 public AbsoluteDate getStartDate() {
72 return startDate;
73 }
74
75
76
77
78 public AbsoluteDate getEndDate() {
79 return endDate;
80 }
81
82
83
84
85
86 public double getDuration() {
87 return endDate.durationFrom(startDate);
88 }
89
90
91 @Override
92 public void init(final SpacecraftState initialState, final AbsoluteDate target) {
93
94 final AbsoluteDate sDate = initialState.getDate();
95 this.forward = sDate.compareTo(target) < 0;
96 final boolean isBetween = sDate.isBetween(startDate, endDate);
97 final boolean isOnStart = startDate.compareTo(sDate) == 0;
98 final boolean isOnEnd = endDate.compareTo(sDate) == 0;
99
100 triggeredStart = null;
101 triggeredEnd = null;
102 if (forward) {
103 if (isBetween || isOnStart) {
104 triggeredStart = startDate;
105 }
106 } else {
107 if (isBetween || isOnEnd) {
108 triggeredEnd = endDate;
109 }
110 }
111 }
112
113
114 @Override
115 public Stream<EventDetector> getEventsDetectors() {
116
117
118
119
120 final DateDetector startDetector = new DateDetector(startDate).
121 withHandler((SpacecraftState state, DateDetector d, boolean increasing) -> {
122 triggeredStart = state.getDate();
123 return Action.RESET_DERIVATIVES;
124 }
125 );
126 final DateDetector endDetector = new DateDetector(endDate).
127 withHandler((SpacecraftState state, DateDetector d, boolean increasing) -> {
128 triggeredEnd = state.getDate();
129 return Action.RESET_DERIVATIVES;
130 });
131 return Stream.of(startDetector, endDetector);
132 }
133
134
135 @Override
136 public <T extends CalculusFieldElement<T>> Stream<FieldEventDetector<T>> getFieldEventsDetectors(final Field<T> field) {
137
138
139
140
141 final FieldDateDetector<T> startDetector = new FieldDateDetector<>(new FieldAbsoluteDate<>(field, startDate)).
142 withHandler((FieldSpacecraftState<T> state, FieldDateDetector<T> d, boolean increasing) -> {
143 triggeredStart = state.getDate().toAbsoluteDate();
144 return Action.RESET_DERIVATIVES;
145 });
146 final FieldDateDetector<T> endDetector = new FieldDateDetector<>(new FieldAbsoluteDate<>(field, endDate)).
147 withHandler((FieldSpacecraftState<T> state, FieldDateDetector<T> d, boolean increasing) -> {
148 triggeredEnd = state.getDate().toAbsoluteDate();
149 return Action.RESET_DERIVATIVES;
150 });
151 return Stream.of(startDetector, endDetector);
152 }
153
154
155 @Override
156 public boolean isFiring(final AbsoluteDate date, final double[] parameters) {
157
158 return isFiring(date);
159 }
160
161 @Override
162 public <T extends CalculusFieldElement<T>> boolean isFiring(final FieldAbsoluteDate<T> date,
163 final T[] parameters) {
164
165 return isFiring(date.toAbsoluteDate());
166 }
167
168
169
170
171
172 public boolean isFiring(final AbsoluteDate date) {
173 if (forward) {
174 if (triggeredStart == null) {
175
176 return false;
177 } else if (date.durationFrom(triggeredStart) < 0.0) {
178
179 return false;
180 } else {
181 if (triggeredEnd == null) {
182
183 return true;
184 } else if (date.durationFrom(triggeredEnd) < 0.0) {
185
186 return true;
187 } else {
188
189 return false;
190 }
191 }
192 } else {
193 if (triggeredEnd == null) {
194
195 return false;
196 } else if (date.durationFrom(triggeredEnd) > 0.0) {
197
198 return false;
199 } else {
200 if (triggeredStart == null) {
201
202 return true;
203 } else if (date.durationFrom(triggeredStart) > 0.0) {
204
205 return true;
206 } else {
207
208 return false;
209 }
210 }
211 }
212 }
213
214 }