I had accidentally broken the raceXML construction - fixed it.
Fixed a few issues where boat didn't have nextMark/previousMark times under certain circumstances. LatestMessages wasn't actually notifying properly - fixed. The various XML readers now treat a string constructor as containing file contents, not file name - this was how it was mostly already used. Fixed some issues in RaceXMLReader, including where element.getChildNodes() was used instead of element.getElementsByName(...). Boat: changes speed to a doubleProperty. Changed leg to a Property<Leg>. Race.lastFps is now an IntegerProperty. Added breaks to the case statements in VisualiserInput. Whoops. ResizableRaceCanvas now handles drawing the race boundary. Tidied up code a bit. Removed ResizableRaceMap. Started refactoring Sparkline. Currently doesn't work.
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package visualiser.model;
|
||||
|
||||
import javafx.animation.AnimationTimer;
|
||||
import javafx.application.Platform;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.scene.paint.Color;
|
||||
@@ -15,8 +14,9 @@ import shared.dataInput.BoatDataSource;
|
||||
import shared.dataInput.RaceDataSource;
|
||||
import shared.dataInput.RegattaDataSource;
|
||||
import shared.model.*;
|
||||
import visualiser.Controllers.RaceController;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -94,6 +94,14 @@ public class VisualiserRace extends Race {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a list of {@link Mark} boats.
|
||||
* @return List of mark boats.
|
||||
*/
|
||||
public ObservableList<Mark> getMarks() {
|
||||
return boatMarkers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a list of VisualiserBoats given a list of Boats, and a list of participating boats.
|
||||
* @param boats The map of Boats describing boats that are potentially in the race. Maps boat sourceID to boat.
|
||||
@@ -120,6 +128,9 @@ public class VisualiserRace extends Race {
|
||||
|
||||
visualiserBoats.add(visualiserBoat);
|
||||
|
||||
//Next color.
|
||||
colorIndex++;
|
||||
|
||||
}
|
||||
|
||||
return visualiserBoats;
|
||||
@@ -139,7 +150,7 @@ public class VisualiserRace extends Race {
|
||||
for (VisualiserBoat boat : boats) {
|
||||
|
||||
boat.setCurrentLeg(startingLeg);
|
||||
boat.setTimeSinceLastMark(this.raceClock.getCurrentTime());
|
||||
boat.setTimeAtLastMark(this.raceClock.getCurrentTime());
|
||||
|
||||
}
|
||||
|
||||
@@ -183,15 +194,21 @@ public class VisualiserRace extends Race {
|
||||
boat.setBearing(Bearing.fromDegrees(boatLocation.getHeadingDegrees()));
|
||||
|
||||
//Time until next mark.
|
||||
boat.setEstimatedTime(convertEstTime(boatStatus.getEstTimeAtNextMark(), boatLocation.getTime()));
|
||||
boat.setEstimatedTimeAtNextMark(raceClock.getLocalTime(boatStatus.getEstTimeAtNextMark()));
|
||||
|
||||
//Speed.
|
||||
boat.setCurrentSpeed(boatLocation.getBoatSOG() / Constants.KnotsToMMPerSecond);
|
||||
|
||||
|
||||
//Boat status.
|
||||
BoatStatusEnum boatStatusEnum = BoatStatusEnum.fromByte(boatStatus.getBoatStatus());
|
||||
boat.setStatus(boatStatusEnum);
|
||||
BoatStatusEnum newBoatStatusEnum = BoatStatusEnum.fromByte(boatStatus.getBoatStatus());
|
||||
|
||||
//If we are changing from non-racing to racing, we need to initialise boat with their time at last mark.
|
||||
if ((boat.getStatus() != BoatStatusEnum.RACING) && (newBoatStatusEnum == BoatStatusEnum.RACING)) {
|
||||
boat.setTimeAtLastMark(this.raceClock.getCurrentTime());
|
||||
}
|
||||
|
||||
boat.setStatus(newBoatStatusEnum);
|
||||
|
||||
|
||||
//Leg.
|
||||
@@ -200,18 +217,18 @@ public class VisualiserRace extends Race {
|
||||
if (legNumber >= 1 && legNumber < legs.size()) {
|
||||
if (boat.getCurrentLeg() != legs.get(legNumber)) {
|
||||
boat.setCurrentLeg(legs.get(legNumber));
|
||||
boat.setTimeSinceLastMark(this.raceClock.getCurrentTime());
|
||||
boat.setTimeAtLastMark(this.raceClock.getCurrentTime());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Add a track point.
|
||||
if (boatStatusEnum == BoatStatusEnum.RACING) {
|
||||
//Attempt to add a track point.
|
||||
if (newBoatStatusEnum == BoatStatusEnum.RACING) {
|
||||
boat.addTrackPoint(boat.getCurrentPosition());
|
||||
}
|
||||
|
||||
//Set finish time if boat finished.
|
||||
if (boatStatusEnum == BoatStatusEnum.FINISHED || legNumber == this.legs.size()) {
|
||||
if (newBoatStatusEnum == BoatStatusEnum.FINISHED || legNumber == this.legs.size()) {
|
||||
boat.setTimeFinished(boatLocation.getTime());
|
||||
boat.setStatus(BoatStatusEnum.FINISHED);
|
||||
|
||||
@@ -297,16 +314,14 @@ public class VisualiserRace extends Race {
|
||||
|
||||
new AnimationTimer() {
|
||||
|
||||
//final long timeRaceStarted = System.currentTimeMillis(); //start time of loop
|
||||
int fps = 0; //init fps value
|
||||
//long timeCurrent = System.currentTimeMillis(); //current time
|
||||
long lastFrameTime = System.currentTimeMillis();
|
||||
|
||||
@Override
|
||||
public void handle(long arg0) {
|
||||
|
||||
//totalTimeElapsed = System.currentTimeMillis() - timeRaceStarted;
|
||||
|
||||
|
||||
//Calculate the frame period.
|
||||
long currentFrameTime = System.currentTimeMillis();
|
||||
long framePeriod = currentFrameTime - lastFrameTime;
|
||||
|
||||
//Update racing boats.
|
||||
updateBoats(boats, latestMessages.getBoatLocationMap(), latestMessages.getBoatStatusMap());
|
||||
@@ -325,6 +340,10 @@ public class VisualiserRace extends Race {
|
||||
stop();
|
||||
}
|
||||
|
||||
lastFrameTime = currentFrameTime;
|
||||
|
||||
//Increment fps.
|
||||
incrementFps(framePeriod);
|
||||
|
||||
}
|
||||
}.start();
|
||||
@@ -357,7 +376,7 @@ public class VisualiserRace extends Race {
|
||||
|
||||
//If they're on the same leg, we need to compare time to finish leg.
|
||||
if (legNumberDelta == 0) {
|
||||
return (int) (b.getEstimatedTime() - a.getEstimatedTime());
|
||||
return (int) Duration.between(b.getEstimatedTimeAtNextMark(), a.getEstimatedTimeAtNextMark()).toMillis();
|
||||
} else {
|
||||
return legNumberDelta;
|
||||
}
|
||||
@@ -381,13 +400,18 @@ public class VisualiserRace extends Race {
|
||||
* Takes an estimated time an event will occur, and converts it to the
|
||||
* number of seconds before the event will occur.
|
||||
*
|
||||
* @param estTimeMillis estimated time in milliseconds
|
||||
* @param estTimeMillis The estimated time, in milliseconds.
|
||||
* @param currentTime The current time, in milliseconds.
|
||||
* @return int difference between time the race started and the estimated time
|
||||
*/
|
||||
private int convertEstTime(long estTimeMillis, long currentTime) {
|
||||
|
||||
//Calculate millisecond delta.
|
||||
long estElapsedMillis = estTimeMillis - currentTime;
|
||||
int estElapsedSecs = Math.round(estElapsedMillis/1000);
|
||||
|
||||
//Convert milliseconds to seconds.
|
||||
int estElapsedSecs = Math.round(estElapsedMillis / 1000);
|
||||
|
||||
return estElapsedSecs;
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user