diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/EstimatedWindFixesAsNavigableSet.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/EstimatedWindFixesAsNavigableSet.java index b86cf6323cc..1ad36754c5d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/EstimatedWindFixesAsNavigableSet.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/EstimatedWindFixesAsNavigableSet.java @@ -59,23 +59,47 @@ public class EstimatedWindFixesAsNavigableSet extends AbstractUnmodifiableNaviga } private TimePoint lowerToResolution(Wind w) { - return new MillisecondsTimePoint((w.getTimePoint().asMillis() - 1) / RESOLUTION_IN_MILLISECONDS - * RESOLUTION_IN_MILLISECONDS); + TimePoint result; + if (w.getTimePoint().compareTo(trackedRace.getTimePointOfLastEvent()) > 0) { + result = lowerToResolution(new DummyWind(trackedRace.getTimePointOfLastEvent())); + } else { + result = new MillisecondsTimePoint((w.getTimePoint().asMillis() - 1) / RESOLUTION_IN_MILLISECONDS + * RESOLUTION_IN_MILLISECONDS); + } + return result; } private TimePoint floorToResolution(Wind w) { - return new MillisecondsTimePoint(w.getTimePoint().asMillis() / RESOLUTION_IN_MILLISECONDS - * RESOLUTION_IN_MILLISECONDS); + TimePoint result; + if (w.getTimePoint().compareTo(trackedRace.getTimePointOfLastEvent()) > 0) { + result = floorToResolution(new DummyWind(trackedRace.getTimePointOfLastEvent())); + } else { + result = new MillisecondsTimePoint(w.getTimePoint().asMillis() / RESOLUTION_IN_MILLISECONDS + * RESOLUTION_IN_MILLISECONDS); + } + return result; } private TimePoint ceilingToResolution(Wind w) { - return new MillisecondsTimePoint(((w.getTimePoint().asMillis() - 1) / RESOLUTION_IN_MILLISECONDS + 1) - * RESOLUTION_IN_MILLISECONDS); + TimePoint result; + if (w.getTimePoint().compareTo(trackedRace.getStartOfTracking()) < 0) { + result = ceilingToResolution(new DummyWind(trackedRace.getStartOfTracking())); + } else { + result = new MillisecondsTimePoint(((w.getTimePoint().asMillis() - 1) / RESOLUTION_IN_MILLISECONDS + 1) + * RESOLUTION_IN_MILLISECONDS); + } + return result; } private TimePoint higherToResolution(Wind w) { - return new MillisecondsTimePoint((w.getTimePoint().asMillis() / RESOLUTION_IN_MILLISECONDS + 1) - * RESOLUTION_IN_MILLISECONDS); + TimePoint result; + if (w.getTimePoint().compareTo(trackedRace.getStartOfTracking()) < 0) { + result = higherToResolution(new DummyWind(trackedRace.getStartOfTracking())); + } else { + result = new MillisecondsTimePoint((w.getTimePoint().asMillis() / RESOLUTION_IN_MILLISECONDS + 1) + * RESOLUTION_IN_MILLISECONDS); + } + return result; } /** diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index c8805cbb87f..91e415858ca 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -523,7 +523,8 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { @Override public Wind getWind(Position p, TimePoint at, Iterable windSourcesToExclude) { - return getWindWithConfidence(p, at, windSourcesToExclude).getObject(); + final WindWithConfidence> windWithConfidence = getWindWithConfidence(p, at, windSourcesToExclude); + return windWithConfidence == null ? null : windWithConfidence.getObject(); } @Override @@ -542,10 +543,13 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { if (!Util.contains(windSourcesToExclude, windSource)) { WindTrack track = getWindTrack(windSource); WindWithConfidence> windWithConfidence = track.getEstimatedWindWithConfidence(p, at); - windFixesWithConfidences.add(windWithConfidence); + if (windWithConfidence != null) { + windFixesWithConfidences.add(windWithConfidence); + } } } - HasConfidence> average = averager.getAverage(windFixesWithConfidences, new Pair(p, at)); + HasConfidence> average = averager.getAverage( + windFixesWithConfidences, new Pair(p, at)); WindWithConfidence> result = new WindWithConfidenceImpl>( average.getObject(), average.getConfidence(), new Pair(p, at)); return result; diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindTrackImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindTrackImpl.java index e1b5fe0bb8a..9aae80ca29f 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindTrackImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/WindTrackImpl.java @@ -121,7 +121,8 @@ public class WindTrackImpl extends TrackImpl implements WindTrack { */ @Override public synchronized Wind getEstimatedWind(Position p, TimePoint at) { - return getEstimatedWindUnsynchronized(p, at).getObject(); + final WindWithConfidence> estimatedWindUnsynchronized = getEstimatedWindUnsynchronized(p, at); + return estimatedWindUnsynchronized == null ? null : estimatedWindUnsynchronized.getObject(); } @Override