mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-22 05:35:51 +00:00
bug5932: modifying bravo to gps
This commit is contained in:
+22
@@ -0,0 +1,22 @@
|
||||
package com.sap.sailing.datamining.data;
|
||||
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sse.common.Distance;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.datamining.annotations.Connector;
|
||||
import com.sap.sse.datamining.annotations.Statistic;
|
||||
|
||||
public interface HasGPSFixTrackContext {
|
||||
@Connector(scanForStatistics=false)
|
||||
HasRaceOfCompetitorContext getRaceOfCompetitorContext();
|
||||
|
||||
GPSFixTrack<Competitor, GPSFixMoving> getGPSFixTrack();
|
||||
|
||||
@Statistic(messageKey="timeSpentOnTackType", resultDecimals=1)
|
||||
Duration getTimeSpentTackType();
|
||||
|
||||
@Statistic(messageKey="TackTypeDistance", resultDecimals=1)
|
||||
Distance getDistanceSpentTackType();
|
||||
}
|
||||
+1
-1
@@ -9,7 +9,7 @@ import com.sap.sse.datamining.annotations.Statistic;
|
||||
|
||||
public interface HasTackTypeSegmentContext {
|
||||
@Connector(scanForStatistics=false)
|
||||
HasBravoFixTrackContext getBravoFixTrackContext();
|
||||
HasGPSFixTrackContext getGPSFixTrackContext();
|
||||
|
||||
TimePoint getStartOfTackTypeSegment();
|
||||
|
||||
|
||||
+34
-32
@@ -7,13 +7,15 @@ import java.util.concurrent.ExecutorService;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasTackTypeSegmentContext;
|
||||
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
|
||||
import com.sap.sailing.datamining.impl.data.BravoFixTrackWithContext;
|
||||
import com.sap.sailing.datamining.impl.data.TackTypeSegmentWithContext;
|
||||
import com.sap.sailing.datamining.shared.TackTypeSegmentsDataMiningSettings;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.NoWindException;
|
||||
import com.sap.sailing.domain.common.tracking.BravoFix;
|
||||
import com.sap.sailing.domain.tracking.BravoFixTrack;
|
||||
import com.sap.sailing.domain.common.TackType;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFix;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.datamining.impl.data.GPSFixTrackWithContext;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
@@ -46,44 +48,44 @@ public class TackTypeSegmentRetrievalProcessor extends AbstractRetrievalProcesso
|
||||
} else {
|
||||
end = endOfRace;
|
||||
}
|
||||
final BravoFixTrack<Competitor> bravoFixTrack = trackedRace.getSensorTrack(element.getCompetitor(), BravoFixTrack.TRACK_NAME);
|
||||
if (bravoFixTrack != null) {
|
||||
boolean isTackType = false;
|
||||
final GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack = trackedRace.getTrack(element.getCompetitor());
|
||||
if (gpsFixTrack != null) {
|
||||
TackType lastTackType = null;
|
||||
TackType currentFixTackType = null;
|
||||
TimePoint last = null;
|
||||
TimePoint startOfSegment = null;
|
||||
bravoFixTrack.lockForRead();
|
||||
gpsFixTrack.lockForRead();
|
||||
try {
|
||||
for (final BravoFix bravoFix : bravoFixTrack.getFixes(startOfRace, /* fromInclusive */ true, end, /* toInclusive */ false)) {
|
||||
for (final GPSFix gpsFix : gpsFixTrack.getFixes(startOfRace, /* fromInclusive */ true, end, /* toInclusive */ false)) { //SCHLEIFE die durch alle gps fixes des rennen geht
|
||||
if (isAborted()) {
|
||||
break;
|
||||
}
|
||||
TrackedLegOfCompetitor trackedLegComp = element.getTrackedRaceContext().getTrackedRace().getTrackedLeg(element.getCompetitor(), bravoFix.getTimePoint());
|
||||
boolean currentFixIsTackType;
|
||||
TrackedLegOfCompetitor trackedLegComp = element.getTrackedRaceContext().getTrackedRace().getTrackedLeg(element.getCompetitor(), gpsFix.getTimePoint());
|
||||
try {
|
||||
currentFixIsTackType = (bravoFix.isTackType(trackedLegComp.getTackType(bravoFix.getTimePoint())));
|
||||
currentFixTackType = trackedLegComp.getTackType(gpsFix.getTimePoint());
|
||||
} catch (NoWindException e) {
|
||||
currentFixIsTackType=false;
|
||||
currentFixTackType=null;
|
||||
}
|
||||
if (currentFixIsTackType != isTackType) {
|
||||
if (currentFixIsTackType) {
|
||||
startOfSegment = bravoFix.getTimePoint();
|
||||
if (currentFixTackType != lastTackType) { //wenn Veränderung des TT:
|
||||
if (settings.getMinimumTackTypeSegmentDuration() == null || startOfSegment.until(last) //wenn zu kleine segment dann:
|
||||
.compareTo(settings.getMinimumTackTypeSegmentDuration()) >= 0) {
|
||||
addOrMergeTackTypeSegment(element, tackTypeSegments, gpsFixTrack, startOfSegment,
|
||||
last /* don't include the last interval ending at the non-TackType fix */);
|
||||
} //wenn next abschnitt nicht null TT ist:
|
||||
if (currentFixTackType != null) { // immer wenn TT sich ändert start UND ende, außer null
|
||||
startOfSegment = gpsFix.getTimePoint();
|
||||
} else {
|
||||
if (settings.getMinimumTackTypeSegmentDuration() == null ||
|
||||
startOfSegment.until(last).compareTo(settings.getMinimumTackTypeSegmentDuration()) >= 0) {
|
||||
addOrMergeTackTypeSegment(element, tackTypeSegments, bravoFixTrack, startOfSegment,
|
||||
last /* don't include the last interval ending at the non-TackType fix */);
|
||||
}
|
||||
startOfSegment = null;
|
||||
}
|
||||
isTackType = currentFixIsTackType;
|
||||
} //veränderter TT wird aktualisiert
|
||||
lastTackType = currentFixTackType;
|
||||
}
|
||||
last = bravoFix.getTimePoint();
|
||||
last = gpsFix.getTimePoint();
|
||||
}
|
||||
} finally {
|
||||
bravoFixTrack.unlockAfterRead();
|
||||
gpsFixTrack.unlockAfterRead();
|
||||
}
|
||||
if (isTackType) {
|
||||
addOrMergeTackTypeSegment(element, tackTypeSegments, bravoFixTrack, startOfSegment, end);
|
||||
if (currentFixTackType == lastTackType && currentFixTackType!= null) {
|
||||
addOrMergeTackTypeSegment(element, tackTypeSegments, gpsFixTrack, startOfSegment, end);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -91,26 +93,26 @@ public class TackTypeSegmentRetrievalProcessor extends AbstractRetrievalProcesso
|
||||
}
|
||||
|
||||
private void addOrMergeTackTypeSegment(HasRaceOfCompetitorContext element,
|
||||
List<HasTackTypeSegmentContext> tackTypeSegments, final BravoFixTrack<Competitor> bravoFixTrack,
|
||||
List<HasTackTypeSegmentContext> tackTypeSegments, final GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack,
|
||||
TimePoint startOfSegment, TimePoint endOfSegment) {
|
||||
if (tackTypeSegments.isEmpty() || settings.getMinimumDurationBetweenAdjacentTackTypeSegments() == null) {
|
||||
tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, bravoFixTrack));
|
||||
tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, gpsFixTrack));
|
||||
} else {
|
||||
final HasTackTypeSegmentContext previousSegment = tackTypeSegments.get(tackTypeSegments.size()-1);
|
||||
final TimePoint previousEnd = previousSegment.getEndOfTackTypeSegment();
|
||||
if (previousEnd.until(startOfSegment).compareTo(settings.getMinimumDurationBetweenAdjacentTackTypeSegments()) < 0) {
|
||||
// merge:
|
||||
tackTypeSegments.set(tackTypeSegments.size()-1, createTackTypeSegment(previousSegment.getStartOfTackTypeSegment(), endOfSegment, element, bravoFixTrack));
|
||||
tackTypeSegments.set(tackTypeSegments.size()-1, createTackTypeSegment(previousSegment.getStartOfTackTypeSegment(), endOfSegment, element, gpsFixTrack));
|
||||
} else {
|
||||
// add; duration between the segments is large enough
|
||||
tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, bravoFixTrack));
|
||||
tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, gpsFixTrack));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private HasTackTypeSegmentContext createTackTypeSegment(TimePoint startOfSegment, TimePoint endOfSegment,
|
||||
HasRaceOfCompetitorContext raceOfCompetitorContext, BravoFixTrack<Competitor> bravoFixTrack) {
|
||||
return new TackTypeSegmentWithContext(new BravoFixTrackWithContext(raceOfCompetitorContext, bravoFixTrack), startOfSegment, endOfSegment);
|
||||
HasRaceOfCompetitorContext raceOfCompetitorContext, GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack) {
|
||||
return new TackTypeSegmentWithContext(new GPSFixTrackWithContext(raceOfCompetitorContext, gpsFixTrack), startOfSegment, endOfSegment);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasGPSFixTrackContext;
|
||||
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sse.common.Distance;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
|
||||
public class GPSFixTrackWithContext implements HasGPSFixTrackContext {
|
||||
|
||||
private final HasRaceOfCompetitorContext raceOfCompetitorContext;
|
||||
|
||||
private final GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack;
|
||||
|
||||
public GPSFixTrackWithContext(HasRaceOfCompetitorContext raceOfCompetitorContext, GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack) {
|
||||
this.raceOfCompetitorContext = raceOfCompetitorContext;
|
||||
this.gpsFixTrack = gpsFixTrack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HasRaceOfCompetitorContext getRaceOfCompetitorContext() {
|
||||
return raceOfCompetitorContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GPSFixTrack<Competitor, GPSFixMoving> getGPSFixTrack() {
|
||||
return gpsFixTrack;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Duration getTimeSpentTackType() {
|
||||
if(getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace() != null) {
|
||||
final TimePoint endOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfRace();
|
||||
final TimePoint startOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getStartOfRace();
|
||||
final TimePoint end;
|
||||
if (endOfRace == null) {
|
||||
final TimePoint endOfTracking = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfTracking();
|
||||
end = endOfTracking == null ? MillisecondsTimePoint.now() : endOfTracking;
|
||||
} else {
|
||||
end = endOfRace;
|
||||
}
|
||||
return gpsFixTrack.getTimeSpentTackType(startOfRace, end);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Distance getDistanceSpentTackType() {
|
||||
if(getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace() != null) {
|
||||
final TimePoint endOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfRace();
|
||||
final TimePoint startOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getStartOfRace();
|
||||
final TimePoint end;
|
||||
if (endOfRace == null) {
|
||||
final TimePoint endOfTracking = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfTracking();
|
||||
end = endOfTracking == null ? MillisecondsTimePoint.now() : endOfTracking;
|
||||
} else {
|
||||
end = endOfRace;
|
||||
}
|
||||
return gpsFixTrack.getDistanceSpentTackType(
|
||||
startOfRace,
|
||||
end);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
+9
-9
@@ -2,7 +2,7 @@ package com.sap.sailing.datamining.impl.data;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
import com.sap.sailing.datamining.data.HasBravoFixTrackContext;
|
||||
import com.sap.sailing.datamining.data.HasGPSFixTrackContext;
|
||||
import com.sap.sailing.datamining.data.HasTackTypeSegmentContext;
|
||||
import com.sap.sailing.domain.base.Competitor;
|
||||
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
|
||||
@@ -13,28 +13,28 @@ import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
|
||||
public class TackTypeSegmentWithContext implements HasTackTypeSegmentContext {
|
||||
private final HasBravoFixTrackContext bravoFixTrackContext;
|
||||
private final HasGPSFixTrackContext gpsFixTrackContext;
|
||||
private final TimePoint startOfTackTypeSegment;
|
||||
private final TimePoint endOfTackTypeSegment;
|
||||
private static final SimpleDateFormat TIMEPOINT_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
|
||||
|
||||
public TackTypeSegmentWithContext(HasBravoFixTrackContext bravoFixTrackContext, TimePoint startOfTackTypeSegment,
|
||||
public TackTypeSegmentWithContext(GPSFixTrackWithContext gpsFixTrackWithContext, TimePoint startOfTackTypeSegment,
|
||||
TimePoint endOfTackTypeSegment) {
|
||||
super();
|
||||
this.bravoFixTrackContext = bravoFixTrackContext;
|
||||
this.gpsFixTrackContext = gpsFixTrackWithContext;
|
||||
this.startOfTackTypeSegment = startOfTackTypeSegment;
|
||||
this.endOfTackTypeSegment = endOfTackTypeSegment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return bravoFixTrackContext.getRaceOfCompetitorContext().getCompetitor().getName() + "@"
|
||||
return gpsFixTrackContext.getRaceOfCompetitorContext().getCompetitor().getName() + "@"
|
||||
+ TIMEPOINT_FORMATTER.format(startOfTackTypeSegment.asDate());
|
||||
}
|
||||
|
||||
@Override
|
||||
public HasBravoFixTrackContext getBravoFixTrackContext() {
|
||||
return bravoFixTrackContext;
|
||||
public HasGPSFixTrackContext getGPSFixTrackContext() {
|
||||
return gpsFixTrackContext;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -63,10 +63,10 @@ public class TackTypeSegmentWithContext implements HasTackTypeSegmentContext {
|
||||
}
|
||||
|
||||
private Competitor getCompetitor() {
|
||||
return getBravoFixTrackContext().getRaceOfCompetitorContext().getCompetitor();
|
||||
return getGPSFixTrackContext().getRaceOfCompetitorContext().getCompetitor();
|
||||
}
|
||||
|
||||
private TrackedRace getTrackedRace() {
|
||||
return getBravoFixTrackContext().getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace();
|
||||
return getGPSFixTrackContext().getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace();
|
||||
}
|
||||
}
|
||||
|
||||
-2
@@ -1,6 +1,5 @@
|
||||
package com.sap.sailing.domain.common.tracking;
|
||||
|
||||
import com.sap.sailing.domain.common.TackType;
|
||||
import com.sap.sailing.domain.common.impl.MeterDistance;
|
||||
import com.sap.sse.common.Bearing;
|
||||
import com.sap.sse.common.Distance;
|
||||
@@ -41,7 +40,6 @@ public interface BravoFix extends SensorFix {
|
||||
* for a fix to be considered foiling.
|
||||
*/
|
||||
boolean isFoiling(Distance minimumRideHeight);
|
||||
boolean isTackType(TackType tackType);
|
||||
|
||||
@Statistic(messageKey="pitch", resultDecimals=1)
|
||||
Bearing getPitch();
|
||||
|
||||
-6
@@ -1,6 +1,5 @@
|
||||
package com.sap.sailing.domain.common.tracking.impl;
|
||||
|
||||
import com.sap.sailing.domain.common.TackType;
|
||||
import com.sap.sailing.domain.common.impl.MeterDistance;
|
||||
import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata;
|
||||
import com.sap.sailing.domain.common.sensordata.ColumnMetadata;
|
||||
@@ -74,9 +73,4 @@ public class BravoFixImpl extends SensorFixImpl implements BravoFix {
|
||||
final Double bearingDeg = fix.get(BravoSensorDataMetadata.HEEL.getColumnIndex());
|
||||
return bearingDeg == null ? null : new DegreeBearingImpl(bearingDeg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTackType(TackType tackType) {
|
||||
return TackType.LONGTACK == tackType;
|
||||
}
|
||||
}
|
||||
|
||||
-1
@@ -275,5 +275,4 @@ public class DynamicGPSFixMovingTrackImpl<ItemType> extends GPSFixTrackImpl<Item
|
||||
public void setMillisecondsOverWhichToAverage(long millisecondsOverWhichToAverage) {
|
||||
super.setMillisecondsOverWhichToAverage(millisecondsOverWhichToAverage);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user