From f675fc476be90b4ecdcdd29e6fe2a7125a917db1 Mon Sep 17 00:00:00 2001 From: fmittag Date: Thu, 10 May 2012 20:14:50 +0200 Subject: [PATCH] Couple of changes for the Windchart - Removed TimeSeries for marking the time - Retreival of confidence values for the wind - Improved settings --- .../META-INF/MANIFEST.MF | 2 +- .../gwt/ui/adminconsole/WindChart.java | 153 +++++++----------- .../ui/adminconsole/WindChartSettings.java | 27 ++-- .../WindChartSettingsDialogComponent.java | 18 ++- .../gwt/ui/adminconsole/WindPanel.java | 6 +- .../sailing/gwt/ui/client/StringMessages.java | 2 + .../gwt/ui/client/StringMessages.properties | 4 +- .../ui/client/StringMessages_de.properties | 4 +- .../gwt/ui/raceboard/RaceBoardPanel.java | 6 +- .../gwt/ui/server/SailingServiceImpl.java | 48 +++--- .../sap/sailing/gwt/ui/shared/WindDTO.java | 2 + 11 files changed, 132 insertions(+), 140 deletions(-) diff --git a/java/com.sap.sailing.domain/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain/META-INF/MANIFEST.MF index 688d835611f..c9382a6eb30 100755 --- a/java/com.sap.sailing.domain/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.domain/META-INF/MANIFEST.MF @@ -8,7 +8,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ClassPath: . Export-Package: com.sap.sailing.domain.base, com.sap.sailing.domain.base.impl, - com.sap.sailing.domain.confidence;x-friends:="com.sap.sailing.domain.test", + com.sap.sailing.domain.confidence, com.sap.sailing.domain.confidence.impl;x-friends:="com.sap.sailing.domain.test", com.sap.sailing.domain.leaderboard, com.sap.sailing.domain.leaderboard.impl, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChart.java index 08ac72dfe7a..5f4fdabd402 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChart.java @@ -13,7 +13,6 @@ import org.moxieapps.gwt.highcharts.client.Chart; import org.moxieapps.gwt.highcharts.client.ChartSubtitle; import org.moxieapps.gwt.highcharts.client.ChartTitle; import org.moxieapps.gwt.highcharts.client.Color; -import org.moxieapps.gwt.highcharts.client.Extremes; import org.moxieapps.gwt.highcharts.client.PlotLine; import org.moxieapps.gwt.highcharts.client.Point; import org.moxieapps.gwt.highcharts.client.Series; @@ -70,6 +69,8 @@ public class WindChart extends SimpleChartPanel implements Component windSourceTypesToDisplay; private long resolutionInMilliseconds; + private boolean showWindSpeedSeries; + private boolean showWindDirectionsSeries; /** * Holds one series for each wind source for which data has been received. @@ -81,8 +82,6 @@ public class WindChart extends SimpleChartPanel implements Component(); this.windSourceSpeedSeries = new HashMap(); this.colorMap = new ColorMap(); this.windSourceTypesToDisplay = new HashSet(); + this.showWindSpeedSeries = false; + this.showWindDirectionsSeries = true; chart = new Chart() .setZoomType(Chart.ZoomType.X) .setMarginLeft(65) @@ -137,7 +137,6 @@ public class WindChart extends SimpleChartPanel implements Component" + seriesName + ": " + dateFormat.format(new Date(toolTipData.getXAsLong())) + "
(" + stringMessages.clickChartToSetTime() + ")"; @@ -158,7 +157,6 @@ public class WindChart extends SimpleChartPanel implements Component seriesToRemove = new HashSet(); - for (Series series : currentlyVisible) { - seriesToRemove.add(series); - } - for (Map.Entry e : windSourceDirectionSeries.entrySet()) { - if (windSourceTypesToDisplay.contains(e.getKey().getType())) { - if (!seriesToRemove.contains(e.getValue())) { - chart.addSeries(e.getValue()); - e.getValue().select(true); // ensures that the checkbox will be ticked - } else { - seriesToRemove.remove(e.getValue()); - } - } - } - for (Map.Entry e : windSourceSpeedSeries.entrySet()) { - if (windSourceTypesToDisplay.contains(e.getKey().getType())) { - if (!seriesToRemove.contains(e.getValue())) { - chart.addSeries(e.getValue()); - e.getValue().select(true); // ensures that the checkbox will be ticked - } else { - seriesToRemove.remove(e.getValue()); - } - } - } + Set visibleSeries = new HashSet(Arrays.asList(chart.getSeries())); - // never remove the timeLineSeries - seriesToRemove.remove(timeLineSeries); - for (Series series : seriesToRemove) { - chart.removeSeries(series); + if(showWindDirectionsSeries) { + for (Map.Entry e : windSourceDirectionSeries.entrySet()) { + Series series = e.getValue(); + if (windSourceTypesToDisplay.contains(e.getKey().getType())) { + if (!visibleSeries.contains(series)) { + chart.addSeries(series, false, false); + series.select(true); // ensures that the checkbox will be ticked + } + } else { + if(visibleSeries.contains(series)) { + chart.removeSeries(series, false); + } + } + } + } + + if(showWindSpeedSeries) { + for (Map.Entry e : windSourceSpeedSeries.entrySet()) { + Series series = e.getValue(); + if (windSourceTypesToDisplay.contains(e.getKey().getType())) { + if (!visibleSeries.contains(series)) { + chart.addSeries(series, false, false); + series.select(true); // ensures that the checkbox will be ticked + } + } else { + if(visibleSeries.contains(series)) { + chart.removeSeries(series, false); + } + } + } } + chart.redraw(); } /** @@ -279,7 +280,7 @@ public class WindChart extends SimpleChartPanel implements Componentresult. If append is true, previously * existing points in the chart are left unchanged. Otherwise, the existing wind series are replaced. @@ -346,15 +338,17 @@ public class WindChart extends SimpleChartPanel implements ComponenttimeOfLatestRequestInMillis) { - timeOfLatestRequestInMillis = wind.timepoint; + timeOfLatestRequestInMillis = wind.originTimepoint; } - Point newDirectionPoint = new Point(wind.timepoint, wind.dampenedTrueWindFromDeg); + Point newDirectionPoint = new Point(wind.originTimepoint, wind.dampenedTrueWindFromDeg); if (wind.dampenedTrueWindSpeedInKnots != null) { - newDirectionPoint.setName(numberFormat.format(wind.dampenedTrueWindSpeedInKnots)+stringMessages.averageSpeedInKnotsUnit()); + String name = numberFormat.format(wind.dampenedTrueWindSpeedInKnots)+ stringMessages.averageSpeedInKnotsUnit(); + // name += " Confidence:" + wind.confidence; + newDirectionPoint.setName(name); } newDirectionPoint = recalculateDirectionPoint(directionMax, directionMin, newDirectionPoint); directionPoints[i] = newDirectionPoint; @@ -367,7 +361,7 @@ public class WindChart extends SimpleChartPanel implements Component getSettingsDialogComponent() { - return new WindChartSettingsDialogComponent(new WindChartSettings(windSourceTypesToDisplay, resolutionInMilliseconds), stringMessages); + return new WindChartSettingsDialogComponent(new WindChartSettings(showWindSpeedSeries, showWindDirectionsSeries, windSourceTypesToDisplay, resolutionInMilliseconds), stringMessages); } /** @@ -438,10 +432,11 @@ public class WindChart extends SimpleChartPanel implements Componenttrue.
- * @param date Defines the x-Value of the line points - */ - private void updateTimeLine(Date date) { - if (allowTimeAdjust) { - Long x = date.getTime(); - try { - Extremes extremes = chart.getYAxis(0).getExtremes(); - Point[] points = new Point[2]; - points[0] = new Point(x, extremes.getMin()); - points[1] = new Point(x, extremes.getMax()); - timeLineSeries.setPoints(points); - ensureTimeLineIsVisible(); - } catch (NullPointerException e) { - // explicitly do nothing; it means that getExtremes() has thrown an exception, so we don't know how to set them - } - } - } - - /** - * Checks if the series of the chart contain the {@link #timeLineSeries}. If not, it is added to the chart. - */ - private void ensureTimeLineIsVisible() { - if (!Arrays.asList(chart.getSeries()).contains(timeLineSeries)) { - chart.addSeries(timeLineSeries); - } - } - @Override public void onResize() { - chart.setSizeToMatchContainer(); + if(isVisible()) { + chart.setSizeToMatchContainer(); + } } private boolean needsDataLoading() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettings.java index 0adb3569aaa..b239ab6d738 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettings.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettings.java @@ -1,8 +1,5 @@ package com.sap.sailing.gwt.ui.adminconsole; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; import java.util.Set; import com.sap.sailing.domain.common.WindSourceType; @@ -12,21 +9,21 @@ public class WindChartSettings { private final long resolutionInMilliseconds; - public WindChartSettings(Set windSourceTypesToDisplay, long resolutionInMilliseconds) { + private final boolean showWindSpeedSeries; + private final boolean showWindDirectionsSeries; + + public WindChartSettings(boolean showWindSpeedSeries, boolean showWindDirectionsSeries, Set windSourceTypesToDisplay, long resolutionInMilliseconds) { this.windSourceTypesToDisplay = windSourceTypesToDisplay; this.resolutionInMilliseconds = resolutionInMilliseconds; + this.showWindDirectionsSeries = showWindDirectionsSeries; + this.showWindSpeedSeries = showWindSpeedSeries; } /** * Uses {@link WindChart#DEFAULT_RESOLUTION_IN_MILLISECONDS} as resolution */ - public WindChartSettings(WindSourceType... windSourceTypesToDisplay) { - this(WindChart.DEFAULT_RESOLUTION_IN_MILLISECONDS, windSourceTypesToDisplay); - } - - public WindChartSettings(long resolutionInMilliseconds, WindSourceType... windSourceTypesToDisplay) { - this(new HashSet(windSourceTypesToDisplay == null ? new ArrayList() - : Arrays.asList(windSourceTypesToDisplay)), resolutionInMilliseconds); + public WindChartSettings(boolean showWindSpeedSeries, boolean showWindDirectionsSeries, Set windSourceTypesToDisplay) { + this(showWindSpeedSeries, showWindDirectionsSeries, windSourceTypesToDisplay, WindChart.DEFAULT_RESOLUTION_IN_MILLISECONDS); } public Set getWindSourceTypesToDisplay() { @@ -36,5 +33,13 @@ public class WindChartSettings { public long getResolutionInMilliseconds() { return resolutionInMilliseconds; } + + public boolean isShowWindSpeedSeries() { + return showWindSpeedSeries; + } + + public boolean isShowWindDirectionsSeries() { + return showWindDirectionsSeries; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettingsDialogComponent.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettingsDialogComponent.java index 312224160b0..81c93d8fc7c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettingsDialogComponent.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChartSettingsDialogComponent.java @@ -23,6 +23,9 @@ public class WindChartSettingsDialogComponent implements SettingsDialogComponent private final WindChartSettings initialSettings; private IntegerBox resolutionInSecondsBox; private final Map checkboxes; + private CheckBox showWindSpeedSeriesCheckbox; + private CheckBox showWindDirectionsSeriesCheckbox; + private final StringMessages stringMessages; public WindChartSettingsDialogComponent(WindChartSettings initialSettings, StringMessages stringMessages) { @@ -36,10 +39,22 @@ public class WindChartSettingsDialogComponent implements SettingsDialogComponent public Widget getAdditionalWidget(DataEntryDialog dialog) { VerticalPanel vp = new VerticalPanel(); resolutionInSecondsBox = dialog.createIntegerBox((int) (initialSettings.getResolutionInMilliseconds()/1000), /* visibleLength */ 5); + HorizontalPanel hp = new HorizontalPanel(); hp.add(new Label(stringMessages.stepSizeInSeconds())); hp.add(resolutionInSecondsBox); vp.add(hp); + + showWindSpeedSeriesCheckbox = dialog.createCheckbox(stringMessages.showWindSpeedSeries()); + showWindSpeedSeriesCheckbox.setValue(initialSettings.isShowWindSpeedSeries()); + vp.add(showWindSpeedSeriesCheckbox); + + showWindDirectionsSeriesCheckbox = dialog.createCheckbox(stringMessages.showWindDirectionSeries()); + showWindDirectionsSeriesCheckbox.setValue(initialSettings.isShowWindDirectionsSeries()); + vp.add(showWindDirectionsSeriesCheckbox); + + Label createHeadlineLabel = dialog.createHeadlineLabel(stringMessages.windSourcesUsed()); + vp.add(createHeadlineLabel); for (WindSourceType windSourceType : WindSourceType.values()) { CheckBox checkbox = dialog.createCheckbox(WindSourceTypeFormatter.format(windSourceType, stringMessages)); checkboxes.put(windSourceType, checkbox); @@ -57,7 +72,8 @@ public class WindChartSettingsDialogComponent implements SettingsDialogComponent windSourceTypesToDisplay.add(e.getKey()); } } - return new WindChartSettings(windSourceTypesToDisplay, resolutionInSecondsBox.getValue() == null ? -1 : resolutionInSecondsBox.getValue()*1000); + return new WindChartSettings(showWindSpeedSeriesCheckbox.getValue(), showWindDirectionsSeriesCheckbox.getValue(), + windSourceTypesToDisplay, resolutionInSecondsBox.getValue() == null ? -1 : resolutionInSecondsBox.getValue()*1000); } @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java index d615cb0b11d..f87fd2e276a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindPanel.java @@ -1,10 +1,12 @@ package com.sap.sailing.gwt.ui.adminconsole; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -180,8 +182,8 @@ public class WindPanel extends FormPanel implements EventDisplayer, WindShower, }); windSourceSelectionPanel.add(showConfigAnchor); grid.setWidget(1, 0, windSourceSelectionPanel); - windChart = new WindChart(sailingService, raceSelectionProvider, new Timer( - PlayModes.Replay), new WindChartSettings(WindSourceType.values()), stringMessages, asyncActionsExecutor, errorReporter, false, false); + WindChartSettings windChartSettings = new WindChartSettings(false, true, new HashSet(Arrays.asList(WindSourceType.values()))); + windChart = new WindChart(sailingService, raceSelectionProvider, new Timer(PlayModes.Replay), windChartSettings, stringMessages, asyncActionsExecutor, errorReporter, false); windChart.onResize(); grid.setWidget(2, 0, windChart.getEntryWidget()); grid.getCellFormatter().setVerticalAlignment(1, 1, HasVerticalAlignment.ALIGN_TOP); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index a9e3af8673e..a80512fcad1 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -298,4 +298,6 @@ public interface StringMessages extends Messages { String servletPortNumber(); String registeredAt(String string); String replicatingFromMaster(String hostname, int jmsPort, int servletPort); + String showWindSpeedSeries(); + String showWindDirectionSeries(); } \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index ed5d0264ff9..149af812e6b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -292,4 +292,6 @@ courseMiddleLine=Course middle line jmsPortNumber=JMS port number servletPortNumber=Servlet port number registeredAt=Registered at {0} -replicatingFromMaster=Replicating from master {0}, JMS port {1}, servlet port {2} \ No newline at end of file +replicatingFromMaster=Replicating from master {0}, JMS port {1}, servlet port {2} +showWindSpeedSeries=Show wind speed data +showWindDirectionSeries=Show wind directions data diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 640bc0d1b81..08ebb4c4d1e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -293,4 +293,6 @@ courseMiddleLine=Kursmittellinie jmsPortNumber=JMS Portnummer servletPortNumber=Servlet Portnummer registeredAt=Registriert {0} -replicatingFromMaster=Repliziert von master {0}, JMS Port {1}, Servlet Port {2} \ No newline at end of file +replicatingFromMaster=Repliziert von master {0}, JMS Port {1}, Servlet Port {2} +showWindSpeedSeries=Daten für Windgeschwindigkeit zeigen +showWindDirectionSeries=Daten für Windrichtung zeigen diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index 50affc4fc4f..7c1dccee306 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -1,8 +1,10 @@ package com.sap.sailing.gwt.ui.raceboard; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; @@ -321,9 +323,9 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel } private WindChart createWindChart(AsyncActionsExecutor asyncActionsExecutor) { - WindChartSettings windChartSettings = new WindChartSettings(WindSourceType.values()); + WindChartSettings windChartSettings = new WindChartSettings(false, true, new HashSet(Arrays.asList(WindSourceType.values()))); return new WindChart(sailingService, raceSelectionProvider, timer, windChartSettings, - stringMessages, asyncActionsExecutor, errorReporter, viewMode == RaceBoardViewModes.ONESCREEN, true); + stringMessages, asyncActionsExecutor, errorReporter, viewMode == RaceBoardViewModes.ONESCREEN); } private void addComponentAsToogleButtonToNavigationMenu(final ComponentViewer componentViewer, diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index 7c816695338..92d14737486 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -100,6 +100,7 @@ import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; import com.sap.sailing.domain.tracking.TrackedRace; import com.sap.sailing.domain.tracking.Wind; import com.sap.sailing.domain.tracking.WindTrack; +import com.sap.sailing.domain.tracking.WindWithConfidence; import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl; import com.sap.sailing.domain.tracking.impl.WindImpl; import com.sap.sailing.domain.tractracadapter.DomainFactory; @@ -661,8 +662,9 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS /** * Uses wind for both, the non-dampened and dampened fields of the {@link WindDTO} object returned */ - protected WindDTO createWindDTOFromAlreadyAveraged(Wind wind, WindTrack windTrack) { + protected WindDTO createWindDTOFromAlreadyAveraged(Wind wind, WindTrack windTrack, TimePoint originTimepoint) { WindDTO windDTO = new WindDTO(); + windDTO.originTimepoint = originTimepoint.asMillis(); windDTO.trueWindBearingDeg = wind.getBearing().getDegrees(); windDTO.trueWindFromDeg = wind.getBearing().reverse().getDegrees(); windDTO.trueWindSpeedInKnots = wind.getKnots(); @@ -717,9 +719,11 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS .getMillisecondsOverWhichToAverageWind(); TimePoint timePoint = fromTimePoint; for (int i = 0; i < numberOfFixes; i++) { - Wind wind = windTrack.getAveragedWind(position, timePoint); - if (wind != null) { - WindDTO windDTO = createWindDTOFromAlreadyAveraged(wind, windTrack); + WindWithConfidence> averagedWindWithConfidence = windTrack.getAveragedWindWithConfidence(position, timePoint); + + if (averagedWindWithConfidence != null) { + WindDTO windDTO = createWindDTOFromAlreadyAveraged(averagedWindWithConfidence.getObject(), windTrack, timePoint); + windDTO.confidence = averagedWindWithConfidence.getConfidence(); windTrackInfoDTO.windFixes.add(windDTO); } timePoint = new MillisecondsTimePoint(timePoint.asMillis() + millisecondsStepWidth); @@ -737,12 +741,12 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS assert from != null; TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier); - WindInfoForRaceDTO result = getAveragedWindInfo(new MillisecondsTimePoint(from), trackedRace.getTimePointOfNewestEvent(), millisecondsStepWidth, numberOfFixes, + WindInfoForRaceDTO result = getAveragedWindInfo(new MillisecondsTimePoint(from), millisecondsStepWidth, numberOfFixes, windSourceTypeNames, trackedRace); return result; } - private WindInfoForRaceDTO getAveragedWindInfo(TimePoint from, TimePoint to, long millisecondsStepWidth, int numberOfFixes, + private WindInfoForRaceDTO getAveragedWindInfo(TimePoint from, long millisecondsStepWidth, int numberOfFixes, Collection windSourceTypeNames, TrackedRace trackedRace) { WindInfoForRaceDTO result = null; if (trackedRace != null) { @@ -770,12 +774,11 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS .getMillisecondsOverWhichToAverageWind(); TimePoint timePoint = from; for (int i = 0; i < numberOfFixes && newestEvent != null && timePoint.compareTo(newestEvent) < 0; i++) { - Wind wind = windTrack.getAveragedWind(null, timePoint); - if (wind != null) { - if(wind.getTimePoint().compareTo(from) > 0 && wind.getTimePoint().compareTo(to) < 0) { - WindDTO windDTO = createWindDTOFromAlreadyAveraged(wind, windTrack); - windTrackInfoDTO.windFixes.add(windDTO); - } + WindWithConfidence> averagedWindWithConfidence = windTrack.getAveragedWindWithConfidence(null, timePoint); + if (averagedWindWithConfidence != null) { + WindDTO windDTO = createWindDTOFromAlreadyAveraged(averagedWindWithConfidence.getObject(), windTrack, timePoint); + windDTO.confidence = averagedWindWithConfidence.getConfidence(); + windTrackInfoDTO.windFixes.add(windDTO); } timePoint = new MillisecondsTimePoint(timePoint.asMillis() + millisecondsStepWidth); } @@ -805,7 +808,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS } if(fromTimePoint != null && toTimePoint != null) { int numberOfFixes = (int) ((toTimePoint.asMillis() - fromTimePoint.asMillis())/resolutionInMilliseconds); - result = getAveragedWindInfo(fromTimePoint, toTimePoint, resolutionInMilliseconds, numberOfFixes, windSourceTypeNames, trackedRace); + result = getAveragedWindInfo(fromTimePoint, resolutionInMilliseconds, numberOfFixes, windSourceTypeNames, trackedRace); } } return result; @@ -900,9 +903,9 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS fix.getTimePoint()); LegType legType = trackedLegOfCompetitor == null ? null : trackedRace.getTrackedLeg( trackedLegOfCompetitor.getLeg()).getLegType(fix.getTimePoint()); - GPSFixDTO fixDTO = createGPSFixDTO(fix, fix.getSpeed(), createWindDTOFromAlreadyAveraged(trackedRace.getWind(fix.getPosition(), - toTimePointExcluding), trackedRace - .getOrCreateWindTrack(windSource)), tack, legType, /* extrapolate */ + Wind wind = trackedRace.getWind(fix.getPosition(),toTimePointExcluding); + WindDTO windDTO = createWindDTOFromAlreadyAveraged(wind, trackedRace.getOrCreateWindTrack(windSource), toTimePointExcluding); + GPSFixDTO fixDTO = createGPSFixDTO(fix, fix.getSpeed(), windDTO, tack, legType, /* extrapolate */ false); fixesForCompetitor.add(fixDTO); if (fixIter.hasNext()) { @@ -916,13 +919,12 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS .getTrackedLeg(trackedLegOfCompetitor.getLeg()).getLegType( fix.getTimePoint()); SpeedWithBearing speedWithBearing = track.getEstimatedSpeed(toTimePointExcluding); + Wind wind2 = trackedRace.getWind(position, toTimePointExcluding); + WindDTO windDTO2 = createWindDTOFromAlreadyAveraged(wind2, trackedRace.getOrCreateWindTrack(windSource), toTimePointExcluding); GPSFixDTO extrapolated = new GPSFixDTO( to.get(competitorDTO), new PositionDTO(position.getLatDeg(), position.getLngDeg()), - createSpeedWithBearingDTO(speedWithBearing), - createWindDTOFromAlreadyAveraged(trackedRace.getWind(position, - toTimePointExcluding), trackedRace - .getOrCreateWindTrack(windSource)), /* extrapolated */ + createSpeedWithBearingDTO(speedWithBearing), windDTO2, /* extrapolated */ tack2, legType2, true); fixesForCompetitor.add(extrapolated); } @@ -1601,9 +1603,9 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS TrackedLegOfCompetitor trackedLegOfCompetitor = trackedRace.getTrackedLeg(competitor, fix.getTimePoint()); LegType legType = trackedLegOfCompetitor == null ? null : trackedRace.getTrackedLeg( trackedLegOfCompetitor.getLeg()).getLegType(fix.getTimePoint()); - GPSFixDTO fixDTO = createGPSFixDTO(fix, speedWithBearing, createWindDTOFromAlreadyAveraged(trackedRace.getWind( - fix.getPosition(), fix.getTimePoint()), - trackedRace.getOrCreateWindTrack(windSource)), tack, legType, /* extrapolated */false); + Wind wind = trackedRace.getWind(fix.getPosition(), fix.getTimePoint()); + WindDTO windDTO = createWindDTOFromAlreadyAveraged(wind, trackedRace.getOrCreateWindTrack(windSource), fix.getTimePoint()); + GPSFixDTO fixDTO = createGPSFixDTO(fix, speedWithBearing, windDTO, tack, legType, /* extrapolated */false); gpsFixDouglasList.add(fixDTO); } result.put(competitorDTO, gpsFixDouglasList); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/WindDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/WindDTO.java index 851ef8b7eb4..272443c6c42 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/WindDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/WindDTO.java @@ -13,6 +13,8 @@ public class WindDTO implements IsSerializable { public Double dampenedTrueWindFromDeg; public PositionDTO position; public Long timepoint; + public Long originTimepoint; + public Double confidence; public WindDTO() {} }