From 3bc8ad0a0762a7636f4cdfeb627fc46c0c7ecafe Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Wed, 10 May 2017 16:30:32 +1200 Subject: [PATCH 01/17] Arrow is now displayed on screen more vividly, the arrow can be customised to a different colour scheme if needed. #story[882] --- .../Networking/Messages/RaceStatus.java | 2 +- visualiser/pom.xml | 6 ++ .../seng302/Controllers/RaceController.java | 57 +++++++++++++ .../seng302/Model/ResizableRaceCanvas.java | 19 ++++- .../main/java/seng302/VisualiserInput.java | 4 +- .../src/main/resources/scenes/race.fxml | 80 ++++++++----------- 6 files changed, 115 insertions(+), 53 deletions(-) diff --git a/network/src/main/java/seng302/Networking/Messages/RaceStatus.java b/network/src/main/java/seng302/Networking/Messages/RaceStatus.java index 097045ba..708dcd70 100644 --- a/network/src/main/java/seng302/Networking/Messages/RaceStatus.java +++ b/network/src/main/java/seng302/Networking/Messages/RaceStatus.java @@ -17,7 +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 + private static final double windDirectionScalar = 360.0 / 49152; // 0xC000 / 360 public RaceStatus(long currentTime, int raceID, int raceStatus, long expectedStartTime, int windDirection, int windSpeed, int raceType, ArrayList boatStatuses){ super(MessageType.RACESTATUS); diff --git a/visualiser/pom.xml b/visualiser/pom.xml index fb7b17a8..8876c318 100644 --- a/visualiser/pom.xml +++ b/visualiser/pom.xml @@ -54,6 +54,12 @@ 1.0-SNAPSHOT + + eu.hansolo + Medusa + 7.9 + + diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index a108b592..8bb2e1a2 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -1,16 +1,27 @@ package seng302.Controllers; +import eu.hansolo.medusa.Fonts; +import eu.hansolo.medusa.Gauge; +import eu.hansolo.medusa.GaugeBuilder; +import eu.hansolo.medusa.skins.GaugeSkin; +import eu.hansolo.medusa.skins.GaugeSkinBase; import javafx.collections.ObservableList; import javafx.fxml.FXML; +import javafx.geometry.Pos; import javafx.scene.control.*; import javafx.scene.layout.GridPane; +import javafx.scene.layout.Pane; +import javafx.scene.layout.StackPane; +import javafx.scene.paint.Color; +import javafx.scene.paint.Paint; import seng302.Mock.StreamedRace; import seng302.Model.*; import seng302.VisualiserInput; import java.net.URL; import java.util.ArrayList; +import java.util.Locale; import java.util.ResourceBundle; /** @@ -24,7 +35,9 @@ public class RaceController extends Controller { private ResizableRaceCanvas raceMap; private ResizableRaceMap raceBoundaries; + private Gauge arrow; @FXML SplitPane race; + @FXML StackPane arrowPane; @FXML CheckBox showFPS; @FXML CheckBox showBoatPath; @FXML CheckBox showAnnotations; @@ -94,6 +107,8 @@ public class RaceController extends Controller { StreamedRace newRace = new StreamedRace(visualiserInput, this); //newRace.initialiseBoats(); + makeArrow(); + raceMap = new ResizableRaceCanvas(visualiserInput.getCourse()); raceMap.setMouseTransparent(true); raceMap.widthProperty().bind(canvasBase.widthProperty()); @@ -101,6 +116,7 @@ public class RaceController extends Controller { //raceMap.setBoats(newRace.getStartingBoats()); raceMap.draw(); raceMap.setVisible(true); + raceMap.setArrow(this.arrow); canvasBase.getChildren().add(0, raceMap); @@ -110,6 +126,7 @@ public class RaceController extends Controller { raceBoundaries.heightProperty().bind(canvasBase.heightProperty()); raceBoundaries.draw(); raceBoundaries.setVisible(true); + canvasBase.getChildren().add(0, raceBoundaries); race.setVisible(true); @@ -211,4 +228,44 @@ public class RaceController extends Controller { } }); } + + private void makeArrow() { + arrow = GaugeBuilder.create() + .minValue(0) + .maxValue(359) + .startAngle(180) + .angleRange(360) + .autoScale(false) + .customTickLabelsEnabled(true) + .customTickLabels("N", "", "", "", "", "", "", "", "", + "E", "", "", "", "", "", "", "", "", + "S", "", "", "", "", "", "", "", "", + "W", "", "", "", "", "", "", "", "") + .customTickLabelFontSize(72) + .needleBehavior(Gauge.NeedleBehavior.OPTIMIZED) + .borderPaint(Color.web("#1f1e23")) + .backgroundPaint(Color.web("#1f1e23")) + .needleColor(Color.web("#dad9db")) + .tickMarkColor(Color.web("#9f9fa1")) + .tickLabelColor(Color.web("#dad9db")) + .valueColor(Color.web("#dad9db")) + .title("Wind direction") + .titleColor(Color.web("#dad9db")) + .knobType(Gauge.KnobType.FLAT) + .knobColor(Gauge.BRIGHT_COLOR) + .prefSize(125, 125) + .maxWidth(125) + .maxHeight(125) + .build(); + + Label value = new Label("0°"); + value.setFont(Fonts.latoBold(72)); + value.setAlignment(Pos.CENTER); + + arrow.valueProperty().addListener(o -> { + value.setText(String.format("%f°", arrow.getValue())); + }); + arrow.setValue(0); + arrowPane.getChildren().add(arrow); + } } diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index 2b793da9..ead59846 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -1,6 +1,9 @@ package seng302.Model; +import eu.hansolo.medusa.Gauge; +import eu.hansolo.medusa.GaugeBuilder; +import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.transform.Rotate; @@ -31,6 +34,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { private final List markers; double[] xpoints = {}, ypoints = {}; private final RaceDataSource raceData; + private Gauge arrow; public ResizableRaceCanvas(RaceDataSource raceData) { super(); @@ -146,6 +150,13 @@ public class ResizableRaceCanvas extends ResizableCanvas { gc.restore(); } + private void displayFancyArrow(GraphCoordinate coordinate, double angle) { + angle = angle % 360; + if (arrow != null && arrow.getValue() != angle) { + this.arrow.setValue(angle); + } + } + /** * Rotates things on the canvas Note: this must be called in between gc.save() and gc.restore() else they will rotate everything * @@ -240,9 +251,9 @@ public class ResizableRaceCanvas extends ResizableCanvas { //display wind direction arrow - specify origin point and angle - angle now set to random angle if (raceData instanceof StreamedCourse) { - displayArrow(new GraphCoordinate((int) getWidth() - 40, 40), ((StreamedCourse) raceData).getWindDirection()); + displayFancyArrow(new GraphCoordinate((int) getWidth() - 40, 40), ((StreamedCourse) raceData).getWindDirection()); } else { - displayArrow(new GraphCoordinate((int) getWidth() - 40, 40), 150); + displayFancyArrow(new GraphCoordinate((int) getWidth() - 40, 40), 150); } } @@ -349,4 +360,8 @@ public class ResizableRaceCanvas extends ResizableCanvas { )); } + public void setArrow(Gauge arrow) { + this.arrow = arrow; + } + } \ 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 ffba53c3..87afeaed 100644 --- a/visualiser/src/main/java/seng302/VisualiserInput.java +++ b/visualiser/src/main/java/seng302/VisualiserInput.java @@ -219,7 +219,7 @@ public class VisualiserInput implements Runnable { //If no heartbeat has been received in more the heartbeat period //then the connection will need to be restarted. - System.out.println("time since last heartbeat: " + timeSinceHeartbeat());//TEMP REMOVE + //System.out.println("time since last heartbeat: " + timeSinceHeartbeat());//TEMP REMOVE long heartBeatPeriod = 10 * 1000; if (timeSinceHeartbeat() > heartBeatPeriod) { System.out.println("Connection has stopped, trying to reconnect."); @@ -285,7 +285,7 @@ public class VisualiserInput implements Runnable { for (BoatStatus boatStatus: this.raceStatus.getBoatStatuses()) { this.boatStatusMap.put(boatStatus.getSourceID(), boatStatus); } - setCourseWindDirection(raceStatus.getScaledWindDirection() + 180); + setCourseWindDirection(raceStatus.getScaledWindDirection()); } //DisplayTextMessage. /*else if (message instanceof DisplayTextMessage) { diff --git a/visualiser/src/main/resources/scenes/race.fxml b/visualiser/src/main/resources/scenes/race.fxml index 7ab63046..46d9c717 100644 --- a/visualiser/src/main/resources/scenes/race.fxml +++ b/visualiser/src/main/resources/scenes/race.fxml @@ -1,19 +1,21 @@ + + + - + + - + - + @@ -24,28 +26,13 @@ - - - - - -