mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-04 03:13:49 +00:00
Couple of changes for the Windchart
- Removed TimeSeries for marking the time - Retreival of confidence values for the wind - Improved settings
This commit is contained in:
1 parent
16bb72aab8
commit
f675fc476b
11 files changed
+126
-134
No files matched your search
@@ -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,
|
||||
|
||||
+51
-94
@@ -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<WindChartSe
|
||||
private final StringMessages stringMessages;
|
||||
private final Set<WindSourceType> 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<WindChartSe
|
||||
private final AsyncActionsExecutor asyncActionsExecutor;
|
||||
private final SailingServiceAsync sailingService;
|
||||
private final Chart chart;
|
||||
private Series timeLineSeries;
|
||||
private final boolean allowTimeAdjust;
|
||||
private boolean ignoreClickOnce;
|
||||
private final DateTimeFormat dateFormat = DateTimeFormat.getFormat("HH:mm:ss");
|
||||
|
||||
@@ -108,17 +107,18 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
*/
|
||||
public WindChart(SailingServiceAsync sailingService, RaceSelectionProvider raceSelectionProvider, Timer timer,
|
||||
WindChartSettings settings, final StringMessages stringMessages, AsyncActionsExecutor asyncActionsExecutor,
|
||||
ErrorReporter errorReporter, boolean compactChart, boolean allowTimeAdjust) {
|
||||
ErrorReporter errorReporter, boolean compactChart) {
|
||||
super(timer);
|
||||
this.sailingService = sailingService;
|
||||
this.asyncActionsExecutor = asyncActionsExecutor;
|
||||
this.stringMessages = stringMessages;
|
||||
this.errorReporter = errorReporter;
|
||||
this.allowTimeAdjust = allowTimeAdjust;
|
||||
this.windSourceDirectionSeries = new HashMap<WindSource, Series>();
|
||||
this.windSourceSpeedSeries = new HashMap<WindSource, Series>();
|
||||
this.colorMap = new ColorMap<WindSource>();
|
||||
this.windSourceTypesToDisplay = new HashSet<WindSourceType>();
|
||||
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<WindChartSe
|
||||
@Override
|
||||
public String format(ToolTipData toolTipData) {
|
||||
String seriesName = toolTipData.getSeriesName();
|
||||
|
||||
if (seriesName.equals(WindChart.this.stringMessages.time())) {
|
||||
return "<b>" + seriesName + ":</b> " + dateFormat.format(new Date(toolTipData.getXAsLong()))
|
||||
+ "<br/>(" + stringMessages.clickChartToSetTime() + ")";
|
||||
@@ -158,7 +157,6 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
|
||||
chart.setBackgroundColor(new Color("#ebebec"));
|
||||
|
||||
if (allowTimeAdjust) {
|
||||
chart.setClickEventHandler(new ChartClickEventHandler() {
|
||||
@Override
|
||||
public boolean onClick(ChartClickEvent chartClickEvent) {
|
||||
@@ -171,6 +169,7 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
chart.setSelectionEventHandler(new ChartSelectionEventHandler() {
|
||||
@Override
|
||||
public boolean onSelection(ChartSelectionEvent chartSelectionEvent) {
|
||||
@@ -191,7 +190,7 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
chart.getXAxis().setType(Axis.Type.DATE_TIME).setMaxZoom(10000) // ten seconds
|
||||
.setAxisTitleText(stringMessages.time());
|
||||
chart.getYAxis(0).setAxisTitleText(stringMessages.fromDeg()).setStartOnTick(false).setShowFirstLabel(false)
|
||||
@@ -202,6 +201,7 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
return new Long(value < 0 ? value + 360 : value).toString();
|
||||
}
|
||||
}));
|
||||
|
||||
chart.getYAxis(1).setOpposite(true).setAxisTitleText(stringMessages.speed()+" ("+stringMessages.averageSpeedInKnotsUnit()+")")
|
||||
.setStartOnTick(false).setShowFirstLabel(false).setGridLineWidth(0).setMinorGridLineWidth(0);
|
||||
|
||||
@@ -213,8 +213,6 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
.getXAxis().setAxisTitle(null);
|
||||
}
|
||||
|
||||
timeLineSeries = createTimeLineSeries();
|
||||
|
||||
setWidget(chart);
|
||||
setSize("100%", "100%");
|
||||
updateSettings(settings);
|
||||
@@ -237,37 +235,40 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
}
|
||||
|
||||
private void showVisibleSeries() {
|
||||
Series[] currentlyVisible = chart.getSeries();
|
||||
Set<Series> seriesToRemove = new HashSet<Series>();
|
||||
for (Series series : currentlyVisible) {
|
||||
seriesToRemove.add(series);
|
||||
}
|
||||
for (Map.Entry<WindSource, Series> 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
|
||||
Set<Series> visibleSeries = new HashSet<Series>(Arrays.asList(chart.getSeries()));
|
||||
|
||||
if(showWindDirectionsSeries) {
|
||||
for (Map.Entry<WindSource, Series> 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 {
|
||||
seriesToRemove.remove(e.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Map.Entry<WindSource, Series> 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());
|
||||
if(visibleSeries.contains(series)) {
|
||||
chart.removeSeries(series, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// never remove the timeLineSeries
|
||||
seriesToRemove.remove(timeLineSeries);
|
||||
for (Series series : seriesToRemove) {
|
||||
chart.removeSeries(series);
|
||||
if(showWindSpeedSeries) {
|
||||
for (Map.Entry<WindSource, Series> 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 Component<WindChartSe
|
||||
if (result == null) {
|
||||
result = createSpeedSeries(windSource);
|
||||
windSourceSpeedSeries.put(windSource, result);
|
||||
if (windSourceTypesToDisplay.contains(windSource.getType())) {
|
||||
if (showWindSpeedSeries && windSourceTypesToDisplay.contains(windSource.getType())) {
|
||||
chart.addSeries(result);
|
||||
}
|
||||
}
|
||||
@@ -316,15 +317,6 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
return newSeries;
|
||||
}
|
||||
|
||||
private Series createTimeLineSeries() {
|
||||
return chart
|
||||
.createSeries()
|
||||
.setType(Series.Type.LINE)
|
||||
.setName(stringMessages.time())
|
||||
.setYAxis(0)
|
||||
.setPlotOptions(new LinePlotOptions().setShowInLegend(false).setHoverStateEnabled(false).setLineWidth(2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the wind charts with the wind data from <code>result</code>. If <code>append</code> is <code>true</code>, 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 Component<WindChartSe
|
||||
int i=0;
|
||||
for (WindDTO wind : windTrackInfo.windFixes) {
|
||||
if (timeOfEarliestRequestInMillis == null || wind.timepoint<timeOfEarliestRequestInMillis) {
|
||||
timeOfEarliestRequestInMillis = wind.timepoint;
|
||||
timeOfEarliestRequestInMillis = wind.originTimepoint;
|
||||
}
|
||||
if (timeOfLatestRequestInMillis == null || wind.timepoint>timeOfLatestRequestInMillis) {
|
||||
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<WindChartSe
|
||||
directionMin = direction;
|
||||
}
|
||||
|
||||
Point newSpeedPoint = new Point(wind.timepoint, wind.dampenedTrueWindSpeedInKnots);
|
||||
Point newSpeedPoint = new Point(wind.originTimepoint, wind.dampenedTrueWindSpeedInKnots);
|
||||
speedPoints[i++] = newSpeedPoint;
|
||||
}
|
||||
Point[] newDirectionPoints;
|
||||
@@ -425,7 +419,7 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
|
||||
@Override
|
||||
public SettingsDialogComponent<WindChartSettings> 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 Component<WindChartSe
|
||||
resolutionInMilliseconds = newSettings.getResolutionInMilliseconds();
|
||||
clearCacheAndReload();
|
||||
}
|
||||
showWindDirectionsSeries = newSettings.isShowWindDirectionsSeries();
|
||||
showWindSpeedSeries = newSettings.isShowWindSpeedSeries();
|
||||
windSourceTypesToDisplay.clear();
|
||||
windSourceTypesToDisplay.addAll(newSettings.getWindSourceTypesToDisplay());
|
||||
showVisibleSeries();
|
||||
chart.redraw();
|
||||
}
|
||||
|
||||
private void clearCacheAndReload() {
|
||||
@@ -460,7 +455,7 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
if (result == null) {
|
||||
result = createDirectionSeries(windSource);
|
||||
windSourceDirectionSeries.put(windSource, result);
|
||||
if (windSourceTypesToDisplay.contains(windSource.getType())) {
|
||||
if (showWindDirectionsSeries && windSourceTypesToDisplay.contains(windSource.getType())) {
|
||||
chart.addSeries(result);
|
||||
}
|
||||
}
|
||||
@@ -492,8 +487,6 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
xAxis.setStartOnTick(false);
|
||||
xAxis.setEndOnTick(false);
|
||||
|
||||
xAxis.setPlotLines(xAxis.createPlotLine().setColor("#CC0000").setValue(WindChart.this.timer.getTime().getTime()));
|
||||
|
||||
updateStripChartSeries(result, append);
|
||||
} else {
|
||||
if (!append) {
|
||||
@@ -560,49 +553,13 @@ public class WindChart extends SimpleChartPanel implements Component<WindChartSe
|
||||
loadData(selectedRaceIdentifier, minTimepoint, maxTimepoint, /* append */false); // replace old series
|
||||
}
|
||||
}
|
||||
updateTimeLine(date);
|
||||
}
|
||||
|
||||
/**
|
||||
* Forces the chart to {@link #updateTimeLine(Date) update} the position and to {@link #ensureTimeLineIsVisible()
|
||||
* ensure}, that the time line is visible.
|
||||
*/
|
||||
public void forceTimeLineUpdate() {
|
||||
updateTimeLine(timer.getTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the position of the time line for the given {@link Date}, if {@link #allowTimeAdjust} is <code>true</code>.<br />
|
||||
* @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() {
|
||||
|
||||
+16
-11
@@ -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<WindSourceType> windSourceTypesToDisplay, long resolutionInMilliseconds) {
|
||||
private final boolean showWindSpeedSeries;
|
||||
private final boolean showWindDirectionsSeries;
|
||||
|
||||
public WindChartSettings(boolean showWindSpeedSeries, boolean showWindDirectionsSeries, Set<WindSourceType> 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<WindSourceType>(windSourceTypesToDisplay == null ? new ArrayList<WindSourceType>()
|
||||
: Arrays.asList(windSourceTypesToDisplay)), resolutionInMilliseconds);
|
||||
public WindChartSettings(boolean showWindSpeedSeries, boolean showWindDirectionsSeries, Set<WindSourceType> windSourceTypesToDisplay) {
|
||||
this(showWindSpeedSeries, showWindDirectionsSeries, windSourceTypesToDisplay, WindChart.DEFAULT_RESOLUTION_IN_MILLISECONDS);
|
||||
}
|
||||
|
||||
public Set<WindSourceType> getWindSourceTypesToDisplay() {
|
||||
@@ -37,4 +34,12 @@ public class WindChartSettings {
|
||||
return resolutionInMilliseconds;
|
||||
}
|
||||
|
||||
public boolean isShowWindSpeedSeries() {
|
||||
return showWindSpeedSeries;
|
||||
}
|
||||
|
||||
public boolean isShowWindDirectionsSeries() {
|
||||
return showWindDirectionsSeries;
|
||||
}
|
||||
|
||||
}
|
||||
+17
-1
@@ -23,6 +23,9 @@ public class WindChartSettingsDialogComponent implements SettingsDialogComponent
|
||||
private final WindChartSettings initialSettings;
|
||||
private IntegerBox resolutionInSecondsBox;
|
||||
private final Map<WindSourceType, CheckBox> 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
|
||||
|
||||
+4
-2
@@ -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<WindSourceType>(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);
|
||||
|
||||
+2
@@ -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();
|
||||
}
|
||||
+2
@@ -293,3 +293,5 @@ jmsPortNumber=JMS port number
|
||||
servletPortNumber=Servlet port number
|
||||
registeredAt=Registered at {0}
|
||||
replicatingFromMaster=Replicating from master {0}, JMS port {1}, servlet port {2}
|
||||
showWindSpeedSeries=Show wind speed data
|
||||
showWindDirectionSeries=Show wind directions data
|
||||
+2
@@ -294,3 +294,5 @@ jmsPortNumber=JMS Portnummer
|
||||
servletPortNumber=Servlet Portnummer
|
||||
registeredAt=Registriert {0}
|
||||
replicatingFromMaster=Repliziert von master {0}, JMS Port {1}, Servlet Port {2}
|
||||
showWindSpeedSeries=Daten für Windgeschwindigkeit zeigen
|
||||
showWindDirectionSeries=Daten für Windrichtung zeigen
|
||||
+4
-2
@@ -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<WindSourceType>(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,
|
||||
|
||||
+25
-23
@@ -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 <code>wind</code> 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<Pair<Position, TimePoint>> 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<String> 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<Pair<Position, TimePoint>> 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);
|
||||
|
||||
@@ -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() {}
|
||||
}
|
||||
Reference in new issue
Block a user