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