WindControlParametes moved to server side, client using WindPatternDisplay to set the settings.

This commit is contained in:
Nidhi Sawhney committed 2012-05-25 13:56:43 +02:00
1 parent 7daa8b1380
commit 8da0ab4a43
12 files changed
+94 -91

No files matched your search

@@ -30,12 +30,12 @@ import com.sap.sailing.gwt.ui.shared.windpattern.WindPatternDisplay;
import com.sap.sailing.gwt.ui.shared.windpattern.WindPatternDisplayManager;
import com.sap.sailing.gwt.ui.shared.windpattern.WindPatternDisplayManager.WindPattern;
import com.sap.sailing.gwt.ui.shared.windpattern.WindPatternSetting;
import com.sap.sailing.gwt.ui.simulator.WindControlParameters;
import com.sap.sailing.simulator.Path;
import com.sap.sailing.simulator.PolarDiagram;
import com.sap.sailing.simulator.SailingSimulator;
import com.sap.sailing.simulator.SimulationParameters;
import com.sap.sailing.simulator.TimedPositionWithSpeed;
import com.sap.sailing.simulator.WindControlParameters;
import com.sap.sailing.simulator.WindField;
import com.sap.sailing.simulator.impl.PolarDiagramImpl;
import com.sap.sailing.simulator.impl.RectangularBoundary;
@@ -172,8 +172,8 @@ public class SimulatorServiceImpl extends RemoteServiceServlet implements Simula
List<Position> lattice = bd.extractLattice(params.getxRes(), params.getyRes());
retreiveWindControlParameters(pattern);
KnotSpeedImpl knotSpeedImpl = new KnotSpeedImpl(controlParameters.speed);
WindField wf = new WindFieldImpl(bd, knotSpeedImpl.getKilometersPerHour(), bd.getSouth().getDegrees());
controlParameters.windBearing = bd.getSouth().getDegrees();
WindField wf = new WindFieldImpl(bd, controlParameters);
List<WindDTO> wList = new ArrayList<WindDTO>();
@@ -206,8 +206,9 @@ public class SimulatorServiceImpl extends RemoteServiceServlet implements Simula
RectangularBoundary bd = new RectangularBoundary(nw, se);
retreiveWindControlParameters(pattern);
KnotSpeedImpl knotSpeedImpl = new KnotSpeedImpl(controlParameters.speed);
WindField wf = new WindFieldImpl(bd, knotSpeedImpl.getKilometersPerHour(), bd.getSouth().getDegrees());
controlParameters.windBearing = bd.getSouth().getDegrees();
WindField wf = new WindFieldImpl(bd, controlParameters);
//TODO Get all the paths that need to be displayed
@@ -28,4 +28,6 @@ public interface WindPatternSetting<SettingsType> extends Named {
public SettingsType getValue();
public String getDisplayName();
}
@@ -28,16 +28,16 @@ public class WindPatternDisplayManagerImpl implements WindPatternDisplayManager
@Override
public WindPatternDisplay getDisplay(WindPattern windPattern) {
WindPatternDisplay display = new WindPatternDisplayImpl();
WindPatternSetting<Double> windSpeedSetting = new WindPatternSettingSliderBar("speed", 1,10,1);
WindPatternSetting<Double> windSpeedSetting = new WindPatternSettingSliderBar("baseSpeed", "Base Wind Speed", 1,10,1);
display.addSetting(windSpeedSetting);
switch(windPattern) {
case BLASTS :
break;
case OSCILLATIONS :
WindPatternSetting<Double> noise = new WindPatternSettingSliderBar("noise", 0,1,0);
WindPatternSetting<Double> noise = new WindPatternSettingSliderBar("noise", "Noise", 0,1,0);
display.addSetting(noise);
WindPatternSetting<String> names = new WindPatternSettingListBox("names");
WindPatternSetting<String> names = new WindPatternSettingListBox("names", "Names");
names.getValues().add("A");
names.getValues().add("B");
display.addSetting(names);
@@ -12,7 +12,11 @@ public class WindPatternSettingListBox implements WindPatternSetting<String>, Is
*
*/
private static final long serialVersionUID = 5396311857725053774L;
/**
* name should match the corresponding field name from @WindControlParameters for which this control is being set
*/
private String name;
private String displayName;
private String currentValue;
private List<String> values;
@@ -23,8 +27,9 @@ public class WindPatternSettingListBox implements WindPatternSetting<String>, Is
}
public WindPatternSettingListBox(String name) {
public WindPatternSettingListBox(String name, String displayName) {
this.name = name;
this.displayName = displayName;
this.values = new ArrayList<String>();
}
@@ -83,4 +88,9 @@ public class WindPatternSettingListBox implements WindPatternSetting<String>, Is
// TODO Auto-generated method stub
}
@Override
public String getDisplayName() {
return displayName;
}
}
@@ -11,21 +11,26 @@ public class WindPatternSettingSliderBar implements WindPatternSetting<Double>,
* Generated serial version UID
*/
private static final long serialVersionUID = 2817622009812937399L;
/**
* name should match the corresponding field name from @WindControlParameters for which this control is being set
*/
private String name;
private String displayName;
private double currentValue;
private double min;
private double max;
private double defaultValue;
/**
* Required for serialization
*/
public WindPatternSettingSliderBar() {
}
public WindPatternSettingSliderBar(String name, double min, double max, double defaultValue) {
public WindPatternSettingSliderBar(String name, String displayName, double min, double max, double defaultValue) {
this.name = name;
this.displayName = displayName;
this.min = min;
this.max = max;
this.defaultValue = defaultValue;
@@ -66,14 +71,15 @@ public class WindPatternSettingSliderBar implements WindPatternSetting<Double>,
@Override
public String toString() {
return getName() + " " + getDisplayWidgetType() + " Min:" + getMin() + " Max: " + getMax() + " Default:" + getDefault();
return getName() + " " + getDisplayWidgetType() + " Min:" + getMin() + " Max: " + getMax() + " Default:"
+ getDefault();
}
@Override
public void setValue(Double value) {
this.currentValue = value;
this.currentValue = value;
}
@Override
@@ -84,6 +90,11 @@ public class WindPatternSettingSliderBar implements WindPatternSetting<Double>,
@Override
public void setValue(String value) {
// TODO Auto-generated method stub
}
@Override
public String getDisplayName() {
return displayName;
}
}
@@ -57,7 +57,6 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
private RadioButton windDisplayButton;
private TimePanel<TimePanelSettings> timePanel;
private WindControlParameters wControls;
private Map<String, WindPatternDisplay> patternDisplayMap;
private Map<String, Panel> patternPanelMap;
@@ -158,7 +157,6 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
leftPanel = new FlowPanel();
rightPanel = new FlowPanel();
wControls = new WindControlParameters(1, 0);
patternSelector = new ListBox();
patternSelector.addChangeHandler(new PatternSelectorHandler());
patternNameDTOMap = new HashMap<String, WindPatternDTO>();
@@ -267,7 +265,7 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
for (WindPatternSetting<?> s : currentWPDisplay.getSettings()) {
switch (s.getDisplayWidgetType()) {
case SLIDERBAR:
Panel sliderPanel = getSliderPanel(windControlPanel, s.getName(), (Double) s.getMin(), (Double) s.getMax(),
Panel sliderPanel = getSliderPanel(windControlPanel, s.getDisplayName(), (Double) s.getMin(), (Double) s.getMax(),
(Double) s.getDefault(), new WindControlCapture(s));
//windControlPanel.add(sliderPanel);
//sliderPanel.getElement().getStyle().setFloat(Style.Float.NONE);
@@ -421,13 +419,13 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
if (windDisplayButton.getValue()) {
timePanel.setVisible(true);
simulatorMap.refreshView(SimulatorMap.ViewName.WINDDISPLAY, wControls, currentWPDisplay);
simulatorMap.refreshView(SimulatorMap.ViewName.WINDDISPLAY, currentWPDisplay);
} else if (summaryButton.getValue()) {
timePanel.setVisible(false);
simulatorMap.refreshView(SimulatorMap.ViewName.SUMMARY, wControls, currentWPDisplay);
simulatorMap.refreshView(SimulatorMap.ViewName.SUMMARY, currentWPDisplay);
} else if (replayButton.getValue()) {
timePanel.setVisible(true);
simulatorMap.refreshView(SimulatorMap.ViewName.REPLAY, wControls, currentWPDisplay);
simulatorMap.refreshView(SimulatorMap.ViewName.REPLAY, currentWPDisplay);
}
}
@@ -453,7 +451,7 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
@Override
public void onClick(ClickEvent arg0) {
timePanel.setVisible(false);
simulatorMap.refreshView(SimulatorMap.ViewName.SUMMARY, wControls, currentWPDisplay);
simulatorMap.refreshView(SimulatorMap.ViewName.SUMMARY, currentWPDisplay);
}
});
@@ -466,7 +464,7 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
public void onClick(ClickEvent arg0) {
resetTimer();
timePanel.setVisible(true);
simulatorMap.refreshView(SimulatorMap.ViewName.REPLAY, wControls, currentWPDisplay);
simulatorMap.refreshView(SimulatorMap.ViewName.REPLAY, currentWPDisplay);
}
});
@@ -479,7 +477,7 @@ public class SimulatorMainPanel extends SplitLayoutPanel {
public void onClick(ClickEvent arg0) {
resetTimer();
timePanel.setVisible(true);
simulatorMap.refreshView(SimulatorMap.ViewName.WINDDISPLAY, wControls, currentWPDisplay);
simulatorMap.refreshView(SimulatorMap.ViewName.WINDDISPLAY, currentWPDisplay);
}
});
@@ -115,7 +115,7 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
overlaysInitialized = true;
}
private void generateWindField(final WindControlParameters wControls, WindPatternDisplay windPatternDisplay) {
private void generateWindField(WindPatternDisplay windPatternDisplay) {
logger.info("In generateWindField");
PositionDTO startPointDTO = new PositionDTO(raceCourseCanvasOverlay.startPoint.getLatitude(),
@@ -148,7 +148,7 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
windFieldCanvasOverlay.redraw(true);
}
private void generatePath(final WindControlParameters wControls, WindPatternDisplay windPatternDisplay, final boolean display) {
private void generatePath(WindPatternDisplay windPatternDisplay, final boolean display) {
logger.info("In generatePath");
PositionDTO startPointDTO = new PositionDTO(raceCourseCanvasOverlay.startPoint.getLatitude(),
@@ -203,32 +203,32 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
raceCourseCanvasOverlay.redraw(true);
}
private void refreshSummaryView(WindControlParameters wControls, WindPatternDisplay windPatternDisplay) {
private void refreshSummaryView(WindPatternDisplay windPatternDisplay) {
mapw.removeOverlay(windFieldCanvasOverlay);
mapw.removeOverlay(replayPathCanvasOverlay);
pathCanvasOverlay.displayWindAlongPath = true;
mapw.addOverlay(pathCanvasOverlay);
generatePath(wControls, windPatternDisplay, true);
generatePath(windPatternDisplay, true);
// pathCanvasOverlay.redraw(true);
}
private void refreshReplayView(WindControlParameters wControls, WindPatternDisplay windPatternDisplay) {
private void refreshReplayView(WindPatternDisplay windPatternDisplay) {
mapw.removeOverlay(pathCanvasOverlay);
mapw.addOverlay(windFieldCanvasOverlay);
replayPathCanvasOverlay.displayWindAlongPath = false;
mapw.addOverlay(replayPathCanvasOverlay);
generateWindField(wControls, windPatternDisplay);
generatePath(wControls, windPatternDisplay, false);
generateWindField(windPatternDisplay);
generatePath(windPatternDisplay, false);
}
private void refreshWindDisplayView(WindControlParameters wControls, WindPatternDisplay windPatternDisplay) {
private void refreshWindDisplayView(WindPatternDisplay windPatternDisplay) {
mapw.removeOverlay(pathCanvasOverlay);
mapw.removeOverlay(replayPathCanvasOverlay);
mapw.addOverlay(windFieldCanvasOverlay);
generateWindField(wControls, windPatternDisplay);
generateWindField(windPatternDisplay);
}
public void refreshView(ViewName name, WindControlParameters wControls, WindPatternDisplay windPatternDisplay) {
public void refreshView(ViewName name, WindPatternDisplay windPatternDisplay) {
if (!overlaysInitialized) {
initializeOverlays();
}
@@ -237,13 +237,13 @@ public class SimulatorMap extends AbsolutePanel implements RequiresDataInitializ
raceCourseCanvasOverlay.setSelected(false);
switch (name) {
case SUMMARY:
refreshSummaryView(wControls, windPatternDisplay);
refreshSummaryView(windPatternDisplay);
break;
case REPLAY:
refreshReplayView(wControls, windPatternDisplay);
refreshReplayView(windPatternDisplay);
break;
case WINDDISPLAY:
refreshWindDisplayView(wControls, windPatternDisplay);
refreshWindDisplayView(windPatternDisplay);
break;
default:
break;
@@ -1,14 +0,0 @@
package com.sap.sailing.gwt.ui.simulator;
public class WindControlParameters {
public Double speed;
public double windSpeedInKnots;
public double windBearing;
public WindControlParameters(double speedInKnots, double bearing) {
speed = speedInKnots;
windSpeedInKnots = speedInKnots;
windBearing = bearing;
}
}
@@ -12,12 +12,14 @@ import com.sap.sailing.domain.common.Distance;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Speed;
import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.impl.KilometersPerHourSpeedImpl;
import com.sap.sailing.simulator.Boundary;
import com.sap.sailing.simulator.Path;
import com.sap.sailing.simulator.PolarDiagram;
import com.sap.sailing.simulator.SailingSimulator;
import com.sap.sailing.simulator.SimulationParameters;
import com.sap.sailing.simulator.TimedPositionWithSpeed;
import com.sap.sailing.simulator.WindControlParameters;
import com.sap.sailing.simulator.WindField;
import com.sap.sailing.simulator.impl.PolarDiagramImpl;
import com.sap.sailing.simulator.impl.RectangularBoundary;
@@ -40,8 +42,9 @@ public class SimulatorTest {
course.add(end);
PolarDiagram pd = new PolarDiagramImpl(0);
RectangularBoundary bd = new RectangularBoundary(start, end);
WindField wf = new WindFieldImpl(bd, 7.2, 45);
KilometersPerHourSpeedImpl kmhrSpeed = new KilometersPerHourSpeedImpl(7.2);
WindControlParameters windParameters = new WindControlParameters(kmhrSpeed.getKnots(), 45);
WindField wf = new WindFieldImpl(bd, windParameters);
SimulationParameters param = new SimulationParametersImpl(course, pd, wf);
SailingSimulatorImpl sailingSim = new SailingSimulatorImpl(param);
@@ -68,7 +71,8 @@ public class SimulatorTest {
// I am creating the WindField such as the course goes mainly against the wind (as it should)
// and the speed of the wind would go over the course in 10 minutes (for the sake of the running time)
WindField wf = new WindFieldImpl(b, requiredSpeed10.getKilometersPerHour(), b.getSouth().getDegrees());
WindControlParameters windParameters = new WindControlParameters(requiredSpeed10.getKnots(), b.getSouth().getDegrees());
WindField wf = new WindFieldImpl(b, windParameters);
PolarDiagram pd = new PolarDiagramImpl(1);
List<Position> course = new ArrayList<Position>();
course.add(p1);
@@ -0,0 +1,18 @@
package com.sap.sailing.simulator;
public class WindControlParameters {
/**
* Base wind speed in knots
*/
public Double baseSpeed;
/**
* Base average wind direction in degrees
*/
public Double windBearing;
public WindControlParameters(double speedInKnots, double bearing) {
baseSpeed = speedInKnots;
windBearing = bearing;
}
}
@@ -124,32 +124,4 @@ public class SailingSimulatorImpl implements SailingSimulator {
return new PathImpl(lst);
}
//SailingSimulator roundtrip
public static void main(String args[]) {
Position p1 = new DegreePosition(25.661333,-90.752563);
Position p2 = new DegreePosition(24.522137,-90.774536);
Boundary b = new RectangularBoundary(p1, p2);
Distance dist = p1.getDistance(p2);
//the Speed required to go from p1 to p2 in 10 minutes
Speed requiredSpeed10 = dist.inTime(600000);
//I am creating the WindField such as the course goes mainly against the wind (as it should)
//and the speed of the wind would go over the course in 10 minutes (for the sake of the running time)
WindField wf = new WindFieldImpl(b, requiredSpeed10.getKilometersPerHour(), b.getSouth().getDegrees());
PolarDiagram pd = new PolarDiagramImpl(1);
List<Position> course= new ArrayList<Position>();
course.add(p1);
course.add(p2);
SimulationParameters sp = new SimulationParametersImpl(course, pd, wf);
SailingSimulator solver = new SailingSimulatorImpl(sp);
Path pth = solver.getOptimumPath();
for(TimedPositionWithSpeed p : pth.getPathPoints()) {
System.out.println("Position: " + p.getPosition() + " Wind: " + wf.getWind(new TimedPositionWithSpeedSimple(p.getPosition())));
}
//the null in the Wind output is the timestamp - this Wind is time-invariant!
}
}
@@ -2,32 +2,33 @@ package com.sap.sailing.simulator.impl;
import com.sap.sailing.domain.base.SpeedWithBearing;
import com.sap.sailing.domain.base.impl.KilometersPerHourSpeedWithBearingImpl;
import com.sap.sailing.domain.base.impl.KnotSpeedImpl;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.tracking.Wind;
import com.sap.sailing.domain.tracking.impl.WindImpl;
import com.sap.sailing.simulator.Boundary;
import com.sap.sailing.simulator.TimedPosition;
import com.sap.sailing.simulator.WindControlParameters;
import com.sap.sailing.simulator.WindField;
public class WindFieldImpl implements WindField {
double windSpeed;
double windBearing;
protected WindControlParameters windParameters;
protected Boundary boundary;
public WindFieldImpl(Boundary b, double windspeed, double bearing)
public WindFieldImpl(Boundary b, WindControlParameters parameters)
{
boundary = b;
windSpeed = windspeed;
windBearing = bearing;
windParameters = parameters;
}
@Override
public Wind getWind(TimedPosition coordinates) {
KnotSpeedImpl knotSpeedImpl = new KnotSpeedImpl(windParameters.baseSpeed);
double wBearing = windBearing *
double wBearing = windParameters.windBearing *
(1 + coordinates.getPosition().getDistance(boundary.getCorners().get("NorthWest")).getMeters()/boundary.getHeight().getMeters());
SpeedWithBearing wspeed = new KilometersPerHourSpeedWithBearingImpl(windSpeed, new DegreeBearingImpl(wBearing));
SpeedWithBearing wspeed = new KilometersPerHourSpeedWithBearingImpl(knotSpeedImpl.getKilometersPerHour(), new DegreeBearingImpl(wBearing));
return new WindImpl(coordinates.getPosition(),coordinates.getTimePoint(), wspeed);