mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-22 12:03:58 +00:00
Merge remote-tracking branch 'server/ribdashboard' into ribdashboard
This commit is contained in:
commit
674ba8e118
3 files changed
+52
-73
No files matched your search
+16
-21
@@ -40,7 +40,6 @@ import com.sap.sailing.domain.polars.PolarDataService;
|
||||
import com.sap.sailing.domain.tracking.GPSFixTrack;
|
||||
import com.sap.sailing.domain.tracking.TrackedRace;
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sse.common.Duration;
|
||||
import com.sap.sse.common.TimePoint;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
@@ -182,16 +181,9 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
|
||||
for (RaceColumn column : lb.getRaceColumns()) {
|
||||
for (Fleet fleet : column.getFleets()) {
|
||||
TrackedRace race = column.getTrackedRace(fleet);
|
||||
if (race != null) {
|
||||
if (race != null && race.isLive(MillisecondsTimePoint.now())) {
|
||||
result = race;
|
||||
notifyLiveTrackedRaceListenerAboutLiveTrackedRaceChange(race);
|
||||
TimePoint startOfRace = race.getStartOfRace();
|
||||
// not relying on isLive() because the time window is too short
|
||||
// to retrieve wind information we need to extend the time window
|
||||
if (startOfRace != null && race.getEndOfRace() == null &&
|
||||
MillisecondsTimePoint.now().after(startOfRace.minus(Duration.ONE_MINUTE.times(20)))) {
|
||||
result = race;
|
||||
// no break here as we want to have the last race that is deemed to be live
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -286,20 +278,23 @@ public class RibDashboardServiceImpl extends RemoteServiceServlet implements Rib
|
||||
@Override
|
||||
public List<StartAnalysisDTO> getStartAnalysisListForCompetitorIDAndLeaderboardName(String competitorIdAsString,
|
||||
String leaderboardName) {
|
||||
List<StartAnalysisDTO> startAnalysisDTOs = new ArrayList<StartAnalysisDTO>();
|
||||
try {
|
||||
Competitor competitor = baseDomainFactory.getCompetitorStore().getExistingCompetitorByIdAsString(competitorIdAsString);
|
||||
List<TrackedRace> trackedRacesForLeaderBoardName = getTrackedRacesFromLeaderboard(leaderboardName);
|
||||
for (TrackedRace trackedRace : trackedRacesForLeaderBoardName) {
|
||||
StartAnalysisDTO startAnalysisDTO = startAnalysisCreationController.checkStartAnalysisForCompetitorInTrackedRace(competitor, trackedRace);
|
||||
if (startAnalysisDTO != null) {
|
||||
startAnalysisDTOs.add(startAnalysisDTO);
|
||||
List<StartAnalysisDTO> result = null;
|
||||
if (competitorIdAsString != null && leaderboardName != null) {
|
||||
result = new ArrayList<StartAnalysisDTO>();
|
||||
try {
|
||||
Competitor competitor = baseDomainFactory.getCompetitorStore().getExistingCompetitorByIdAsString(competitorIdAsString);
|
||||
List<TrackedRace> trackedRacesForLeaderBoardName = getTrackedRacesFromLeaderboard(leaderboardName);
|
||||
for (TrackedRace trackedRace : trackedRacesForLeaderBoardName) {
|
||||
StartAnalysisDTO startAnalysisDTO = startAnalysisCreationController.checkStartAnalysisForCompetitorInTrackedRace(competitor, trackedRace);
|
||||
if (startAnalysisDTO != null) {
|
||||
result.add(startAnalysisDTO);
|
||||
}
|
||||
}
|
||||
} catch (NullPointerException e) {
|
||||
logger.log(Level.INFO, "", e);
|
||||
}
|
||||
} catch (NullPointerException e) {
|
||||
logger.log(Level.INFO, "", e);
|
||||
}
|
||||
return startAnalysisDTOs;
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+36
-33
@@ -51,42 +51,45 @@ public class StartlineAdvantagesCalculator extends AbstracPreCalculationDataRet
|
||||
// Calculate duration from two new distances for normal upwind starts
|
||||
// Put all durations in one set
|
||||
// Get the smallest of the durations and subtract number from every other number
|
||||
public StartlineAdvantagesWithMaxAndAverageDTO getStartLineAdvantagesAccrossLineAtTimePoint(TimePoint timepoint){
|
||||
public StartlineAdvantagesWithMaxAndAverageDTO getStartLineAdvantagesAccrossLineAtTimePoint(TimePoint timepoint) {
|
||||
StartlineAdvantagesWithMaxAndAverageDTO result = new StartlineAdvantagesWithMaxAndAverageDTO();
|
||||
if (currentLiveTrackedRace != null) {
|
||||
retrieveDataForCalculation(currentLiveTrackedRace);
|
||||
if(isStartlineCompletelyUnderneathLaylines()) {
|
||||
logger.log(Level.INFO, "Startline is completely underneath laylines");
|
||||
Pair<Double, Double> advantagesRange = new Pair<Double, Double>(0.0, startlineLenghtInMeters);
|
||||
result.advantages = calculateStartlineAdvantagesUnderneathLaylinesInRange(advantagesRange);
|
||||
double maximum = getMaximumAdvantageOfStartlineAdvantageDTOs(result.advantages);
|
||||
result.maximum = maximum;
|
||||
advantageMaximumAverage.add(maximum);
|
||||
result.average = advantageMaximumAverage.getAverage();
|
||||
} else if (isStartlineCompletelyAboveLaylines()) {
|
||||
logger.log(Level.INFO, "Startline is completely above laylines");
|
||||
Pair<Double, Double> advantagesRange = new Pair<Double, Double>(0.0, startlineLenghtInMeters);
|
||||
result.advantages = calculatePolarBasedStartlineAdvantagesInRange(advantagesRange);
|
||||
subtractMinimumOfAllStartlineAdvantages(result.advantages);
|
||||
double maximum = getMaximumAdvantageOfStartlineAdvantageDTOs(result.advantages);
|
||||
result.maximum = maximum;
|
||||
advantageMaximumAverage.add(maximum);
|
||||
result.average = advantageMaximumAverage.getAverage();
|
||||
subtractAgainstMaximumOfAllStartlineAdvantages(result.advantages, maximum);
|
||||
} else {
|
||||
logger.log(Level.INFO, "Layline(s) cross startline");
|
||||
Position intersectionOfRightLaylineAndStartline = getIntersectionOfRightLaylineAndStartline();
|
||||
Position intersectionOfleftLaylineAndStartline = getIntersectionOfLeftLaylineAndStartline();
|
||||
Pair<Double, Double> polarBasedStartlineAdvatagesRange = getStartAndEndPointOfPolarBasedStartlineAdvatagesInDistancesToRCBoat(intersectionOfRightLaylineAndStartline, intersectionOfleftLaylineAndStartline);
|
||||
Pair<Double, Double> pinEndStartlineAdvatagesRange = getPinEndStartlineAdvantagesRangeFromPolarAdvantagesRange(polarBasedStartlineAdvatagesRange);
|
||||
result.advantages = calculatePolarBasedStartlineAdvantagesInRange(polarBasedStartlineAdvatagesRange);
|
||||
subtractMinimumOfAllStartlineAdvantages(result.advantages);
|
||||
double maximum = getMaximumAdvantageOfStartlineAdvantageDTOs(result.advantages);
|
||||
result.maximum = maximum;
|
||||
advantageMaximumAverage.add(maximum);
|
||||
result.average = advantageMaximumAverage.getAverage();
|
||||
subtractAgainstMaximumOfAllStartlineAdvantages(result.advantages, maximum);
|
||||
addClosingZeroPointToMixedAdvantages(result.advantages, pinEndStartlineAdvatagesRange);
|
||||
if (wind != null) {
|
||||
if (isStartlineCompletelyUnderneathLaylines()) {
|
||||
logger.log(Level.INFO, "Startline is completely underneath laylines");
|
||||
Pair<Double, Double> advantagesRange = new Pair<Double, Double>(0.0, startlineLenghtInMeters);
|
||||
result.advantages = calculateStartlineAdvantagesUnderneathLaylinesInRange(advantagesRange);
|
||||
double maximum = getMaximumAdvantageOfStartlineAdvantageDTOs(result.advantages);
|
||||
result.maximum = maximum;
|
||||
advantageMaximumAverage.add(maximum);
|
||||
result.average = advantageMaximumAverage.getAverage();
|
||||
} else if (isStartlineCompletelyAboveLaylines()) {
|
||||
logger.log(Level.INFO, "Startline is completely above laylines");
|
||||
Pair<Double, Double> advantagesRange = new Pair<Double, Double>(0.0, startlineLenghtInMeters);
|
||||
result.advantages = calculatePolarBasedStartlineAdvantagesInRange(advantagesRange);
|
||||
subtractMinimumOfAllStartlineAdvantages(result.advantages);
|
||||
double maximum = getMaximumAdvantageOfStartlineAdvantageDTOs(result.advantages);
|
||||
result.maximum = maximum;
|
||||
advantageMaximumAverage.add(maximum);
|
||||
result.average = advantageMaximumAverage.getAverage();
|
||||
subtractAgainstMaximumOfAllStartlineAdvantages(result.advantages, maximum);
|
||||
} else {
|
||||
logger.log(Level.INFO, "Layline(s) cross startline");
|
||||
Position intersectionOfRightLaylineAndStartline = getIntersectionOfRightLaylineAndStartline();
|
||||
Position intersectionOfleftLaylineAndStartline = getIntersectionOfLeftLaylineAndStartline();
|
||||
Pair<Double, Double> polarBasedStartlineAdvatagesRange = getStartAndEndPointOfPolarBasedStartlineAdvatagesInDistancesToRCBoat(
|
||||
intersectionOfRightLaylineAndStartline, intersectionOfleftLaylineAndStartline);
|
||||
Pair<Double, Double> pinEndStartlineAdvatagesRange = getPinEndStartlineAdvantagesRangeFromPolarAdvantagesRange(polarBasedStartlineAdvatagesRange);
|
||||
result.advantages = calculatePolarBasedStartlineAdvantagesInRange(polarBasedStartlineAdvatagesRange);
|
||||
subtractMinimumOfAllStartlineAdvantages(result.advantages);
|
||||
double maximum = getMaximumAdvantageOfStartlineAdvantageDTOs(result.advantages);
|
||||
result.maximum = maximum;
|
||||
advantageMaximumAverage.add(maximum);
|
||||
result.average = advantageMaximumAverage.getAverage();
|
||||
subtractAgainstMaximumOfAllStartlineAdvantages(result.advantages, maximum);
|
||||
addClosingZeroPointToMixedAdvantages(result.advantages, pinEndStartlineAdvatagesRange);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
logger.log(Level.INFO, "No live race available for startlineadvantages calculation");
|
||||
|
||||
-19
@@ -1,9 +1,5 @@
|
||||
package com.sap.sailing.dashboards.gwt.server.startlineadvantages.precalculation;
|
||||
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.sap.sailing.dashboards.gwt.server.startlineadvantages.StartlineAdvantagesCalculator;
|
||||
import com.sap.sailing.domain.base.impl.BoatClassImpl;
|
||||
import com.sap.sailing.domain.common.BoatClassMasterdata;
|
||||
import com.sap.sailing.domain.common.ManeuverType;
|
||||
@@ -24,26 +20,11 @@ public abstract class AbstracPreCalculationDataRetriever implements PreCalculati
|
||||
public Wind wind;
|
||||
public double meouvreAngle;
|
||||
|
||||
private static final Logger logger = Logger.getLogger(StartlineAdvantagesCalculator.class.getName());
|
||||
|
||||
protected void retrieveDataForCalculation(TrackedRace trackedRace) {
|
||||
startlineAndFirstMarkPositions = retrieveMarkPositions(trackedRace);
|
||||
startlineAdvantageAtPinEndInMeters = retrieveStartlineAdvantage(trackedRace);
|
||||
startlineLenghtInMeters = retrieveStartlineLenght(trackedRace);
|
||||
wind = retrieveWindAtPosition(startlineAndFirstMarkPositions.startBoatPosition, trackedRace);
|
||||
meouvreAngle = retrieveManouvreAngleAtWindSpeedAndBoatClass(new BoatClassImpl("Extreme40", BoatClassMasterdata.EXTREME_40), ManeuverType.TACK, wind);
|
||||
printData();
|
||||
}
|
||||
|
||||
private void printData() {
|
||||
logger.log(Level.INFO, "Retrieved pre calculation data for startline advantages calculation");
|
||||
logger.log(Level.INFO, "startlineAndFirstMarkPositions.startBoatPosition "+startlineAndFirstMarkPositions.startBoatPosition);
|
||||
logger.log(Level.INFO, "startlineAndFirstMarkPositions.pinEndPosition "+startlineAndFirstMarkPositions.pinEndPosition);
|
||||
logger.log(Level.INFO, "startlineAndFirstMarkPositions.firstMarkPosition "+startlineAndFirstMarkPositions.firstMarkPosition);
|
||||
logger.log(Level.INFO, "startlineAdvantageAtPinEndInMeters "+startlineAdvantageAtPinEndInMeters);
|
||||
logger.log(Level.INFO, "startlineLenghtInMeters "+startlineLenghtInMeters);
|
||||
logger.log(Level.INFO, "wind.getBeaufort() "+wind.getKnots());
|
||||
logger.log(Level.INFO, "wind.getBearing().getDegrees() "+wind.getBearing().getDegrees());
|
||||
logger.log(Level.INFO, "meouvreAngle.getDegrees() "+meouvreAngle);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user