From 9eb4e3daea945d45c89f926b34e9a2f9c59b0468 Mon Sep 17 00:00:00 2001 From: hba56 Date: Sat, 20 May 2017 17:22:52 +1200 Subject: [PATCH 01/11] boats now calculate the time since last mark -the raceclock is passed around so that the time can be tracked -time from start to mark 1 is wrong #story[878] --- .../seng302/Controllers/RaceController.java | 12 +++++++++++- .../main/java/seng302/Mock/StreamedRace.java | 7 ++++--- .../src/main/java/seng302/Model/Boat.java | 14 +++++++++++++- .../seng302/Model/ResizableRaceCanvas.java | 18 ++++++++++++++++-- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index 106a0089..c34e1768 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -24,6 +24,7 @@ public class RaceController extends Controller { private ResizableRaceCanvas raceMap; private ResizableRaceMap raceBoundaries; + private RaceClock raceClock; @FXML SplitPane race; @FXML CheckBox showFPS; @FXML CheckBox showBoatPath; @@ -93,7 +94,7 @@ public class RaceController extends Controller { * @param raceClock The RaceClock to use for the race's countdown/elapsed duration + timezone. */ public void startRace(VisualiserInput visualiserInput, RaceClock raceClock) { - StreamedRace newRace = new StreamedRace(visualiserInput, this); + //newRace.initialiseBoats(); raceMap = new ResizableRaceCanvas(visualiserInput.getCourse()); @@ -119,6 +120,11 @@ public class RaceController extends Controller { //Initialize save annotation array, fps listener, and annotation listeners timeZone.setText(raceClock.getTimeZone()); timer.textProperty().bind(raceClock.durationProperty()); + + this.raceClock = raceClock; + raceMap.setRaceClock(raceClock); + + StreamedRace newRace = new StreamedRace(visualiserInput, this); initializeFPS(); initializeAnnotations(); @@ -213,4 +219,8 @@ public class RaceController extends Controller { } }); } + + public RaceClock getRaceClock() { + return raceClock; + } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index 2ca0fd5c..95d5b80e 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -55,7 +55,8 @@ public class StreamedRace implements Runnable { if (boat != null) { Leg startLeg = new Leg(name, 0); startLeg.setEndMarker(endCompoundMark); - boat.setCurrentLeg(startLeg); + System.out.println(controller.getRaceClock().getTime()); + boat.setCurrentLeg(startLeg, controller.getRaceClock()); } } } @@ -83,8 +84,8 @@ public class StreamedRace implements Runnable { int legNumber = boatStatusMessage.getLegNumber(); - if (legNumber >= 1 && legNumber < legs.size()) { - boat.setCurrentLeg(legs.get(legNumber)); + if (legNumber >= 1 && legNumber < legs.size() && boat.getCurrentLeg().getLegNumber() != legNumber) { + boat.setCurrentLeg(legs.get(legNumber), controller.getRaceClock()); } if (boatStatusEnum == BoatStatusEnum.RACING) { diff --git a/visualiser/src/main/java/seng302/Model/Boat.java b/visualiser/src/main/java/seng302/Model/Boat.java index 5715927b..75d18c78 100644 --- a/visualiser/src/main/java/seng302/Model/Boat.java +++ b/visualiser/src/main/java/seng302/Model/Boat.java @@ -6,6 +6,7 @@ import org.geotools.referencing.GeodeticCalculator; import seng302.GPSCoordinate; import java.awt.geom.Point2D; +import java.time.ZonedDateTime; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -31,6 +32,8 @@ public class Boat { private final Queue track = new ConcurrentLinkedQueue<>(); private long nextValidTime = 0; + private ZonedDateTime timeSinceLastMark; + /** * Boat initializer which keeps all of the information of the boat. * @@ -181,9 +184,10 @@ public class Boat { return currentLeg; } - public void setCurrentLeg(Leg currentLeg) { + public void setCurrentLeg(Leg currentLeg, RaceClock raceClock) { this.currentLeg = currentLeg; this.currentLegName.setValue(currentLeg.getName()); + this.setTimeSinceLastMark(raceClock.getTime()); } public boolean isFinished() { @@ -236,4 +240,12 @@ public class Boat { public void setDnf(boolean dnf) { this.dnf = dnf; } + + public ZonedDateTime getTimeSinceLastMark() { + return timeSinceLastMark; + } + + public void setTimeSinceLastMark(ZonedDateTime timeSinceLastMark) { + this.timeSinceLastMark = timeSinceLastMark; + } } diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index b4815d22..d3911d3c 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -10,6 +10,9 @@ import seng302.Mock.StreamedCourse; import seng302.RaceDataSource; import seng302.RaceMap; +import java.time.Duration; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -28,10 +31,13 @@ public class ResizableRaceCanvas extends ResizableCanvas { private boolean annoAbbrev = true; private boolean annoSpeed = true; private boolean annoPath = true; + private boolean annoTimeSinceLastMark = true; private List colours; private final List markers; private final RaceDataSource raceData; + private RaceClock raceClock; + public ResizableRaceCanvas(RaceDataSource raceData) { super(); @@ -160,7 +166,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { * @param speed speed of the boat * @param coordinate coordinate the text appears */ - private void displayText(String name, String abbrev, double speed, GraphCoordinate coordinate) { + private void displayText(String name, String abbrev, double speed, GraphCoordinate coordinate, ZonedDateTime timeSinceLastMark) { String text = ""; //Check name toggle value if (annoName){ @@ -174,6 +180,11 @@ public class ResizableRaceCanvas extends ResizableCanvas { if (annoSpeed){ text += String.format("%.2fkn", speed); } + //Check time since last mark toggle value + if(annoTimeSinceLastMark){ + Duration timeSince = Duration.between(timeSinceLastMark, raceClock.getTime()); + text += String.format("%d", timeSince.getSeconds()); + } //String text = String.format("%s, %2$.2fkn", name, speed); long xCoord = coordinate.getX() + 20; long yCoord = coordinate.getY(); @@ -293,7 +304,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { } if (raceAnno) - displayText(boat.toString(), boat.getAbbrev(), boat.getVelocity(), this.map.convertGPS(boat.getCurrentPosition())); + displayText(boat.toString(), boat.getAbbrev(), boat.getVelocity(), this.map.convertGPS(boat.getCurrentPosition()), boat.getTimeSinceLastMark()); //TODO this needs to be fixed. drawTrack(boat, colours.get(currentColour)); currentColour = (currentColour + 1) % colours.size(); @@ -330,4 +341,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { )); } + public void setRaceClock(RaceClock raceClock) { + this.raceClock = raceClock; + } } \ No newline at end of file From a24dda2fd8575dab745d1652cc3ea6902e4e8f63 Mon Sep 17 00:00:00 2001 From: hba56 Date: Sat, 20 May 2017 20:40:08 +1200 Subject: [PATCH 02/11] boats have an annotation beside them that shows time since last mark passed #story[878] --- visualiser/src/main/java/seng302/Mock/StreamedRace.java | 2 +- .../src/main/java/seng302/Model/ResizableRaceCanvas.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index 95d5b80e..fe93cf81 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -55,8 +55,8 @@ public class StreamedRace implements Runnable { if (boat != null) { Leg startLeg = new Leg(name, 0); startLeg.setEndMarker(endCompoundMark); - System.out.println(controller.getRaceClock().getTime()); boat.setCurrentLeg(startLeg, controller.getRaceClock()); + boat.setTimeSinceLastMark(controller.getRaceClock().getTime()); } } } diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index d3911d3c..02082a78 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -165,6 +165,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { * @param abbrev abbreviation of the boat name * @param speed speed of the boat * @param coordinate coordinate the text appears + * @param timeSinceLastMark time since the last mark was passed */ private void displayText(String name, String abbrev, double speed, GraphCoordinate coordinate, ZonedDateTime timeSinceLastMark) { String text = ""; @@ -178,7 +179,7 @@ public class ResizableRaceCanvas extends ResizableCanvas { } //Check speed toggle value if (annoSpeed){ - text += String.format("%.2fkn", speed); + text += String.format("%.2fkn ", speed); } //Check time since last mark toggle value if(annoTimeSinceLastMark){ @@ -304,6 +305,9 @@ public class ResizableRaceCanvas extends ResizableCanvas { } if (raceAnno) + if (Duration.between(boat.getTimeSinceLastMark(), raceClock.getTime()).getSeconds() < 0){ + boat.setTimeSinceLastMark(raceClock.getTime()); + } displayText(boat.toString(), boat.getAbbrev(), boat.getVelocity(), this.map.convertGPS(boat.getCurrentPosition()), boat.getTimeSinceLastMark()); //TODO this needs to be fixed. drawTrack(boat, colours.get(currentColour)); From 4b2e90f54bf9f2e463f8ad0484b7b8e96ae434de Mon Sep 17 00:00:00 2001 From: hba56 Date: Sat, 20 May 2017 21:04:03 +1200 Subject: [PATCH 03/11] can now toggle the boats time on and off #story[878] --- .../seng302/Controllers/RaceController.java | 5 ++ .../seng302/Model/ResizableRaceCanvas.java | 8 ++ .../src/main/resources/scenes/race.fxml | 76 +++++++------------ 3 files changed, 41 insertions(+), 48 deletions(-) diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index c34e1768..a0937a9b 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -35,6 +35,7 @@ public class RaceController extends Controller { @FXML CheckBox showName; @FXML CheckBox showAbbrev; @FXML CheckBox showSpeed; + @FXML CheckBox showTime; @FXML Button saveAnno; @FXML Button showSetAnno; @FXML TableView boatInfoTable; @@ -200,6 +201,10 @@ public class RaceController extends Controller { raceMap.toggleAnnoSpeed(); raceMap.update(); }); + showTime.selectedProperty().addListener((ov, old_val, new_val) -> { + raceMap.toggleAnnoTime(); + raceMap.update(); + }); //listener to save currently selected annotation saveAnno.setOnAction(event -> { presetAnno.clear(); diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index 02082a78..edccebdd 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -266,10 +266,18 @@ public class ResizableRaceCanvas extends ResizableCanvas { annoName = !annoName; } + /** + * Toggle boat path display in annotation + */ public void toggleBoatPath() { annoPath = !annoPath; } + /** + * Toggle boat time display in annotation + */ + public void toggleAnnoTime() { annoTimeSinceLastMark = !annoTimeSinceLastMark;} + /** * Toggle abbreviation display in annotation */ diff --git a/visualiser/src/main/resources/scenes/race.fxml b/visualiser/src/main/resources/scenes/race.fxml index 7ab63046..148f1133 100644 --- a/visualiser/src/main/resources/scenes/race.fxml +++ b/visualiser/src/main/resources/scenes/race.fxml @@ -1,19 +1,21 @@ + + + - + + - + - + @@ -24,28 +26,14 @@ - - - - - -