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 org.hipparchus.CalculusFieldElement;
20 import org.hipparchus.Field;
21 import org.orekit.propagation.events.BooleanDetector;
22 import org.orekit.propagation.events.FieldBooleanDetector;
23 import org.orekit.propagation.events.FieldEventDetectionSettings;
24 import org.orekit.propagation.events.FieldEventDetector;
25 import org.orekit.propagation.events.FieldTimeIntervalDetector;
26 import org.orekit.propagation.events.TimeIntervalDetector;
27 import org.orekit.propagation.events.handlers.ContinueOnEvent;
28 import org.orekit.propagation.events.handlers.EventHandler;
29 import org.orekit.propagation.events.handlers.FieldContinueOnEvent;
30 import org.orekit.propagation.events.handlers.FieldEventHandler;
31 import org.orekit.propagation.events.intervals.AdaptableInterval;
32 import org.orekit.propagation.events.intervals.DateDetectionAdaptableIntervalFactory;
33 import org.orekit.time.TimeInterval;
34 import org.orekit.time.TimeStamped;
35 import org.orekit.utils.ParameterDriver;
36
37 import java.util.Arrays;
38 import java.util.Collections;
39 import java.util.HashSet;
40 import java.util.List;
41 import java.util.Set;
42 import java.util.stream.Collectors;
43
44
45
46
47
48
49
50
51
52 public class TimeIntervalsManeuverTrigger extends IntervalEventTrigger<BooleanDetector> {
53
54
55
56
57
58 private TimeIntervalsManeuverTrigger(final BooleanDetector booleanDetector) {
59 super(booleanDetector);
60 }
61
62
63
64
65
66
67 public static TimeIntervalsManeuverTrigger of(final TimeInterval... timeIntervals) {
68 final EventHandler arbitraryHandler = new ContinueOnEvent();
69 final BooleanDetector detector = BooleanDetector.orCombine(Arrays.stream(timeIntervals)
70 .map(timeInterval -> new TimeIntervalDetector(arbitraryHandler, timeInterval))
71 .collect(Collectors.toList()));
72 final Set<TimeStamped> dates = new HashSet<>();
73 Arrays.stream(timeIntervals).forEach(interval -> dates.add(interval.getStartDate()));
74 Arrays.stream(timeIntervals).forEach(interval -> dates.add(interval.getEndDate()));
75 final AdaptableInterval maxCheck = DateDetectionAdaptableIntervalFactory
76 .getDatesDetectionInterval(dates.toArray(new TimeStamped[0]));
77 return new TimeIntervalsManeuverTrigger(detector.withMaxCheck(maxCheck));
78 }
79
80
81
82
83
84
85 public static TimeIntervalsManeuverTrigger of(final TimeIntervalDetector... timeIntervalDetectors) {
86 final BooleanDetector detector = BooleanDetector.orCombine(timeIntervalDetectors);
87 return new TimeIntervalsManeuverTrigger(detector);
88 }
89
90 @Override
91 @SuppressWarnings("unchecked")
92 protected <D extends FieldEventDetector<S>, S extends CalculusFieldElement<S>> D convertIntervalDetector(final Field<S> field,
93 final BooleanDetector detector) {
94 final FieldEventHandler<S> arbitraryHandler = new FieldContinueOnEvent<>();
95 return (D) FieldBooleanDetector.orCombine(detector.getDetectors().stream()
96 .map(TimeIntervalDetector.class::cast)
97 .map(intervalDetector -> new FieldTimeIntervalDetector<>(new FieldEventDetectionSettings<>(field,
98 intervalDetector.getDetectionSettings()), arbitraryHandler, intervalDetector.getTimeInterval()))
99 .collect(Collectors.toList()));
100 }
101
102 @Override
103 public List<ParameterDriver> getParametersDrivers() {
104 return Collections.emptyList();
105 }
106 }