diff --git a/network/src/main/java/seng302/Networking/Messages/RaceStatus.java b/network/src/main/java/seng302/Networking/Messages/RaceStatus.java index c03281aa..097045ba 100644 --- a/network/src/main/java/seng302/Networking/Messages/RaceStatus.java +++ b/network/src/main/java/seng302/Networking/Messages/RaceStatus.java @@ -17,6 +17,7 @@ public class RaceStatus extends AC35Data { private int windSpeed; private int raceType; private ArrayList boatStatuses; + private static final double windDirectionScalar = 360.0 / 32768.0; // 0x8000 / 360 public RaceStatus(long currentTime, int raceID, int raceStatus, long expectedStartTime, int windDirection, int windSpeed, int raceType, ArrayList boatStatuses){ super(MessageType.RACESTATUS); @@ -121,4 +122,8 @@ public class RaceStatus extends AC35Data { public boolean isPrestart() { return raceStatus == 10; } + + public double getScaledWindDirection() { + return (double) windDirection * windDirectionScalar; + } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index 6d7f6a90..1080679d 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -14,6 +14,7 @@ public class StreamedCourse extends Observable implements RaceDataSource { StreamedCourseXMLReader streamedCourseXMLReader = null; BoatXMLReader boatXMLReader = null; RegattaXMLReader regattaXMLReader = null; + private double windDirection = 0; public StreamedCourse() {} @@ -54,6 +55,14 @@ public class StreamedCourse extends Observable implements RaceDataSource { notifyObservers(); } + public void setWindDirection(double windDirection) { + this.windDirection = windDirection; + } + + public double getWindDirection() { + return windDirection; + } + public boolean hasReadRegatta() { return regattaXMLReader != null; } public boolean hasReadBoats() { return boatXMLReader != null; } diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index 1d3a7bfa..0535f965 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -8,6 +8,7 @@ import javafx.scene.paint.Paint; import javafx.scene.transform.Rotate; import seng302.*; import seng302.Controllers.RaceController; +import seng302.Mock.StreamedCourse; import java.util.ArrayList; import java.util.Arrays; @@ -29,6 +30,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { private List colours; private List markers; double[] xpoints = {}, ypoints = {}; + RaceDataSource raceData; public ResizableRaceCanvas(RaceDataSource raceData) { super(); @@ -42,6 +44,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { this.markers = raceData.getMarkers(); makeColours(); + this.raceData = raceData; } /** @@ -133,7 +136,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { * @param angle Angle that the arrow is to be facing in degrees 0 degrees = North (Up). * @see GraphCoordinate */ - private void displayArrow(GraphCoordinate coordinate, int angle) { + private void displayArrow(GraphCoordinate coordinate, double angle) { gc.save(); rotate(angle, coordinate.getX(), coordinate.getY()); gc.setFill(Color.BLACK); @@ -236,7 +239,11 @@ public class ResizableRaceCanvas extends ResizableCanvas { drawMarkers(); //display wind direction arrow - specify origin point and angle - angle now set to random angle - displayArrow(new GraphCoordinate((int) getWidth() - 40, 40), 150); + if (raceData instanceof StreamedCourse) { + displayArrow(new GraphCoordinate((int) getWidth() - 40, 40), ((StreamedCourse) raceData).getWindDirection()); + } else { + displayArrow(new GraphCoordinate((int) getWidth() - 40, 40), 150); + } } /** @@ -363,4 +370,4 @@ public class ResizableRaceCanvas extends ResizableCanvas { )); } -} +} \ No newline at end of file diff --git a/visualiser/src/main/java/seng302/VisualiserInput.java b/visualiser/src/main/java/seng302/VisualiserInput.java index 34e712bc..41f0dc75 100644 --- a/visualiser/src/main/java/seng302/VisualiserInput.java +++ b/visualiser/src/main/java/seng302/VisualiserInput.java @@ -157,6 +157,13 @@ public class VisualiserInput implements Runnable { return markRoundingMap; } + /** + * Sets the wind direction for the current course. + */ + private void setCourseWindDirection(double direction) { + this.course.setWindDirection(direction); + } + /** * Reads and returns the next message as an array of bytes from the socket. Use getNextMessage() to get the actual message object instead. * @return Encoded binary message bytes. @@ -286,6 +293,7 @@ public class VisualiserInput implements Runnable { for (BoatStatus boatStatus: this.raceStatus.getBoatStatuses()) { this.boatStatusMap.put(boatStatus.getSourceID(), boatStatus); } + setCourseWindDirection(raceStatus.getScaledWindDirection() + 180); } //DisplayTextMessage. /*else if (message instanceof DisplayTextMessage) {