Merge remote-tracking branch 'server/ribdashboard' into ribdashboard

This commit is contained in:
Axel Uhl committed 2015-10-02 18:19:22 +02:00
commit 674ba8e118
3 files changed
+52 -73

No files matched your search

@@ -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
@@ -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");
@@ -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);
}
}