Merge branch 'Story49Vis' into 49Mock
# Conflicts: # visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java # visualiser/src/main/java/seng302/Model/CompoundMark.java # visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java # visualiser/src/main/java/seng302/VisualiserInput.java
This commit is contained in:
@@ -1,34 +0,0 @@
|
|||||||
package seng302;
|
|
||||||
|
|
||||||
import javafx.scene.paint.Color;
|
|
||||||
import seng302.Model.BoatInRace;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constants that are used throughout the program
|
|
||||||
* Created by Erika on 19-Mar-17.
|
|
||||||
* @deprecated please use XML for constant data
|
|
||||||
*/
|
|
||||||
public class Constants {
|
|
||||||
|
|
||||||
public static final int NMToMetersConversion = 1852; // 1 nautical mile = 1852 meters
|
|
||||||
|
|
||||||
public static final GPSCoordinate startLineMarker1 = new GPSCoordinate(32.296577, -64.854304);
|
|
||||||
public static final GPSCoordinate startLineMarker2 = new GPSCoordinate(32.293771, -64.855242);
|
|
||||||
public static final GPSCoordinate mark1 = new GPSCoordinate(32.293039, -64.843983);
|
|
||||||
public static final GPSCoordinate windwardGate1 = new GPSCoordinate(32.284680, -64.850045);
|
|
||||||
public static final GPSCoordinate windwardGate2 = new GPSCoordinate(32.280164, -64.847591);
|
|
||||||
public static final GPSCoordinate leewardGate1 = new GPSCoordinate(32.309693, -64.835249);
|
|
||||||
public static final GPSCoordinate leewardGate2 = new GPSCoordinate(32.308046, -64.831785);
|
|
||||||
public static final GPSCoordinate finishLineMarker1 = new GPSCoordinate(32.317379, -64.839291);
|
|
||||||
public static final GPSCoordinate finishLineMarker2 = new GPSCoordinate(32.317257, -64.836260);
|
|
||||||
|
|
||||||
public static final double wakeScale = 10;
|
|
||||||
|
|
||||||
public static final BoatInRace[] OFFICIAL_AC35_COMPETITORS = new BoatInRace[]
|
|
||||||
{new BoatInRace("Oracle Team USA", 30.0, Color.BLUEVIOLET, "Oracle"),
|
|
||||||
new BoatInRace("Land Rover BAR", 23.0, Color.BLACK, "BGR"),
|
|
||||||
new BoatInRace("SoftBank Team Japan", 27.0, Color.RED, "JPN"),
|
|
||||||
new BoatInRace("Groupama Team France", 25.0, Color.ORANGE, "FRA"),
|
|
||||||
new BoatInRace("Artemis Racing", 22.5, Color.DARKOLIVEGREEN, "SWE"),
|
|
||||||
new BoatInRace("Emirates Team New Zealand", 62, Color.LIMEGREEN, "ETNZ")};
|
|
||||||
}
|
|
||||||
@@ -48,8 +48,9 @@ public class RaceController extends Controller {
|
|||||||
* @param boats boats that are to be displayed in the race
|
* @param boats boats that are to be displayed in the race
|
||||||
* @see ResizableRaceCanvas
|
* @see ResizableRaceCanvas
|
||||||
*/
|
*/
|
||||||
public void updateMap(ObservableList<Boat> boats) {
|
public void updateMap(ObservableList<Boat> boats, ObservableList<Marker> boatMarkers) {
|
||||||
raceMap.setBoats(boats);
|
raceMap.setBoats(boats);
|
||||||
|
raceMap.setBoatMarkers(boatMarkers);
|
||||||
raceMap.update();
|
raceMap.update();
|
||||||
raceBoundaries.draw();
|
raceBoundaries.draw();
|
||||||
//stop if the visualiser is no longer running
|
//stop if the visualiser is no longer running
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ import seng302.VisualiserInput;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.time.ZonedDateTime;
|
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Observable;
|
import java.util.Observable;
|
||||||
@@ -43,8 +42,6 @@ public class StartController extends Controller implements Observer {
|
|||||||
@FXML private Label timer;
|
@FXML private Label timer;
|
||||||
@FXML private Label raceStatusLabel;
|
@FXML private Label raceStatusLabel;
|
||||||
|
|
||||||
private ZonedDateTime startingTime;
|
|
||||||
|
|
||||||
//@FXML Button fifteenMinButton;
|
//@FXML Button fifteenMinButton;
|
||||||
|
|
||||||
private RaceClock raceClock;
|
private RaceClock raceClock;
|
||||||
@@ -61,17 +58,11 @@ public class StartController extends Controller implements Observer {
|
|||||||
* Begins the race with a scale factor of 1
|
* Begins the race with a scale factor of 1
|
||||||
*/
|
*/
|
||||||
private void startRaceNoScaling() {
|
private void startRaceNoScaling() {
|
||||||
//startRace(1);
|
|
||||||
while(visualiserInput.getRaceStatus() == null);//TODO probably remove this.
|
while(visualiserInput.getRaceStatus() == null);//TODO probably remove this.
|
||||||
|
|
||||||
countdownTimer();
|
countdownTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startRace(int raceScale){
|
|
||||||
//fifteenMinButton.setDisable(true);
|
|
||||||
//countdownTimer(raceScale);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize(URL location, ResourceBundle resources){
|
public void initialize(URL location, ResourceBundle resources){
|
||||||
raceData = new StreamedCourse();
|
raceData = new StreamedCourse();
|
||||||
|
|||||||
@@ -21,14 +21,6 @@ public class StreamedCourse extends Observable implements RaceDataSource {
|
|||||||
|
|
||||||
public StreamedCourse() {}
|
public StreamedCourse() {}
|
||||||
|
|
||||||
public StreamedCourse(StreamedCourseXMLReader streamedCourseXMLReader) {
|
|
||||||
this.streamedCourseXMLReader = streamedCourseXMLReader;
|
|
||||||
}
|
|
||||||
|
|
||||||
public StreamedCourse(BoatXMLReader boatXMLReader) {
|
|
||||||
this.boatXMLReader = boatXMLReader;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBoatXMLReader(BoatXMLReader boatXMLReader) {
|
public void setBoatXMLReader(BoatXMLReader boatXMLReader) {
|
||||||
this.boatXMLReader = boatXMLReader;
|
this.boatXMLReader = boatXMLReader;
|
||||||
if (streamedCourseXMLReader != null && boatXMLReader != null) {
|
if (streamedCourseXMLReader != null && boatXMLReader != null) {
|
||||||
|
|||||||
@@ -6,14 +6,13 @@ import org.w3c.dom.Node;
|
|||||||
import org.w3c.dom.NodeList;
|
import org.w3c.dom.NodeList;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import seng302.GPSCoordinate;
|
import seng302.GPSCoordinate;
|
||||||
import seng302.Model.CompoundMark;
|
|
||||||
import seng302.Model.Leg;
|
import seng302.Model.Leg;
|
||||||
|
import seng302.Model.Marker;
|
||||||
import seng302.XMLReader;
|
import seng302.XMLReader;
|
||||||
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.text.ParseException;
|
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -25,29 +24,16 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
private static final double COORDINATEPADDING = 0.000;
|
private static final double COORDINATEPADDING = 0.000;
|
||||||
private GPSCoordinate mapTopLeft, mapBottomRight;
|
private GPSCoordinate mapTopLeft, mapBottomRight;
|
||||||
private final List<GPSCoordinate> boundary = new ArrayList<>();
|
private final List<GPSCoordinate> boundary = new ArrayList<>();
|
||||||
private final Map<Integer,Element> compoundMarkMap = new HashMap<>();
|
private final Map<Integer,Element> compoundMarks = new HashMap<>();
|
||||||
private final Map<Integer, StreamedBoat> participants = new HashMap<>();
|
private final Map<Integer, StreamedBoat> participants = new HashMap<>();
|
||||||
private final List<Leg> legs = new ArrayList<>();
|
private final List<Leg> legs = new ArrayList<>();
|
||||||
private final List<CompoundMark> compoundMarks = new ArrayList<>();
|
private final List<Marker> markers = new ArrayList<>();
|
||||||
private ZonedDateTime creationTimeDate;
|
private ZonedDateTime creationTimeDate;
|
||||||
private ZonedDateTime raceStartTime;
|
private ZonedDateTime raceStartTime;
|
||||||
private int raceID;
|
private int raceID;
|
||||||
private String raceType;
|
private String raceType;
|
||||||
private boolean postpone;
|
private boolean postpone;
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor for Streamed Race XML
|
|
||||||
* @param filePath path of the file
|
|
||||||
* @throws IOException error
|
|
||||||
* @throws SAXException error
|
|
||||||
* @throws ParserConfigurationException error
|
|
||||||
* @throws ParseException error
|
|
||||||
* @throws StreamedCourseXMLException error
|
|
||||||
*/
|
|
||||||
public StreamedCourseXMLReader(String filePath) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException {
|
|
||||||
this(filePath, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for Streamed Race XML
|
* Constructor for Streamed Race XML
|
||||||
* @param filePath file path to read
|
* @param filePath file path to read
|
||||||
@@ -55,10 +41,9 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
* @throws IOException error
|
* @throws IOException error
|
||||||
* @throws SAXException error
|
* @throws SAXException error
|
||||||
* @throws ParserConfigurationException error
|
* @throws ParserConfigurationException error
|
||||||
* @throws ParseException error
|
|
||||||
* @throws StreamedCourseXMLException error
|
* @throws StreamedCourseXMLException error
|
||||||
*/
|
*/
|
||||||
public StreamedCourseXMLReader(String filePath, boolean read) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException {
|
public StreamedCourseXMLReader(String filePath, boolean read) throws IOException, SAXException, ParserConfigurationException, StreamedCourseXMLException {
|
||||||
super(filePath);
|
super(filePath);
|
||||||
if (read) {
|
if (read) {
|
||||||
read();
|
read();
|
||||||
@@ -71,10 +56,9 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
* @throws IOException error
|
* @throws IOException error
|
||||||
* @throws SAXException error
|
* @throws SAXException error
|
||||||
* @throws ParserConfigurationException error
|
* @throws ParserConfigurationException error
|
||||||
* @throws ParseException error
|
|
||||||
* @throws StreamedCourseXMLException error
|
* @throws StreamedCourseXMLException error
|
||||||
*/
|
*/
|
||||||
public StreamedCourseXMLReader(InputStream xmlString) throws IOException, SAXException, ParserConfigurationException, ParseException, StreamedCourseXMLException {
|
public StreamedCourseXMLReader(InputStream xmlString) throws IOException, SAXException, ParserConfigurationException, StreamedCourseXMLException {
|
||||||
super(xmlString);
|
super(xmlString);
|
||||||
read();
|
read();
|
||||||
}
|
}
|
||||||
@@ -138,7 +122,7 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Indexes CompoundMark elements by their ID for use in generating the course, and populates list of Markers.
|
* Indexes CompoundMark elements by their ID for use in generating the course, and populates list of Markers.
|
||||||
* @see CompoundMark
|
* @see seng302.Model.Marker
|
||||||
*/
|
*/
|
||||||
private void readCompoundMarks() throws StreamedCourseXMLException {
|
private void readCompoundMarks() throws StreamedCourseXMLException {
|
||||||
Element nCourse = (Element) doc.getElementsByTagName("Course").item(0);
|
Element nCourse = (Element) doc.getElementsByTagName("Course").item(0);
|
||||||
@@ -146,27 +130,28 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
Node compoundMark = nCourse.getChildNodes().item(i);
|
Node compoundMark = nCourse.getChildNodes().item(i);
|
||||||
if(compoundMark.getNodeName().equals("CompoundMark")) {
|
if(compoundMark.getNodeName().equals("CompoundMark")) {
|
||||||
int compoundMarkID = getCompoundMarkID((Element) compoundMark);
|
int compoundMarkID = getCompoundMarkID((Element) compoundMark);
|
||||||
compoundMarkMap.put(compoundMarkID, (Element)compoundMark);
|
compoundMarks.put(compoundMarkID, (Element)compoundMark);
|
||||||
compoundMarks.add(getMarker(compoundMarkID));
|
markers.add(getMarker(compoundMarkID));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a CompoundMark from the CompoundMark element with given ID.
|
* Generates a Marker from the CompoundMark element with given ID.
|
||||||
* @param compoundMarkID index of required CompoundMark element
|
* @param compoundMarkID index of required CompoundMark element
|
||||||
* @return generated CompoundMark
|
* @return generated Marker
|
||||||
* @throws StreamedCourseXMLException if CompoundMark element contains unhandled number of compoundMarks
|
* @throws StreamedCourseXMLException if CompoundMark element contains unhandled number of compoundMarks
|
||||||
* @see CompoundMark
|
* @see seng302.Model.Marker
|
||||||
*/
|
*/
|
||||||
private CompoundMark getMarker(int compoundMarkID) throws StreamedCourseXMLException {
|
private Marker getMarker(int compoundMarkID) throws StreamedCourseXMLException {
|
||||||
Element compoundMark = compoundMarkMap.get(compoundMarkID);
|
Element compoundMark = compoundMarks.get(compoundMarkID);
|
||||||
NodeList nMarks = compoundMark.getElementsByTagName("Mark");
|
NodeList nMarks = compoundMark.getElementsByTagName("Mark");
|
||||||
CompoundMark marker;
|
Marker marker;
|
||||||
|
|
||||||
switch(nMarks.getLength()) {
|
switch(nMarks.getLength()) {
|
||||||
case 1: marker = new CompoundMark(getCoordinate((Element)nMarks.item(0))); break;
|
case 1: marker = new Marker(getCoordinate((Element)nMarks.item(0)),getSourceId((Element)nMarks.item(0))); break;
|
||||||
case 2: marker = new CompoundMark(getCoordinate((Element)nMarks.item(0)), getCoordinate((Element)nMarks.item(1))); break;
|
case 2: marker = new Marker(getCoordinate((Element)nMarks.item(0)), getCoordinate((Element)nMarks.item(1)),
|
||||||
|
getSourceId((Element)nMarks.item(0)), getSourceId((Element)nMarks.item(1))); break;
|
||||||
default: throw new StreamedCourseXMLException();
|
default: throw new StreamedCourseXMLException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,6 +164,14 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
return new GPSCoordinate(lat,lon);
|
return new GPSCoordinate(lat,lon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getSourceId(Element mark) {
|
||||||
|
String sourceId = mark.getAttribute("SourceID");
|
||||||
|
if (sourceId.isEmpty()){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return Integer.parseInt(sourceId);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads "compoundMarkID" attribute of CompoundMark or Corner element
|
* Reads "compoundMarkID" attribute of CompoundMark or Corner element
|
||||||
* @param element with "compoundMarkID" attribute
|
* @param element with "compoundMarkID" attribute
|
||||||
@@ -194,24 +187,24 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
* @return value of "name" attribute
|
* @return value of "name" attribute
|
||||||
*/
|
*/
|
||||||
private String getCompoundMarkName(int compoundMarkID) {
|
private String getCompoundMarkName(int compoundMarkID) {
|
||||||
return compoundMarkMap.get(compoundMarkID).getAttribute("Name");
|
return compoundMarks.get(compoundMarkID).getAttribute("Name");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Populates list of legs given CompoundMarkSequence element and referenced CompoundMark elements.
|
* Populates list of legs given CompoundMarkSequence element and referenced CompoundMark elements.
|
||||||
* @throws StreamedCourseXMLException if compoundMarks cannot be resolved from CompoundMark
|
* @throws StreamedCourseXMLException if markers cannot be resolved from CompoundMark
|
||||||
*/
|
*/
|
||||||
private void readCompoundMarkSequence() throws StreamedCourseXMLException {
|
private void readCompoundMarkSequence() throws StreamedCourseXMLException {
|
||||||
Element nCompoundMarkSequence = (Element) doc.getElementsByTagName("CompoundMarkSequence").item(0);
|
Element nCompoundMarkSequence = (Element) doc.getElementsByTagName("CompoundMarkSequence").item(0);
|
||||||
NodeList nCorners = nCompoundMarkSequence.getElementsByTagName("Corner");
|
NodeList nCorners = nCompoundMarkSequence.getElementsByTagName("Corner");
|
||||||
Element markXML = (Element)nCorners.item(0);
|
Element markXML = (Element)nCorners.item(0);
|
||||||
CompoundMark lastCompoundMark = getMarker(getCompoundMarkID(markXML));
|
Marker lastMarker = getMarker(getCompoundMarkID(markXML));
|
||||||
String legName = getCompoundMarkName(getCompoundMarkID(markXML));
|
String legName = getCompoundMarkName(getCompoundMarkID(markXML));
|
||||||
for(int i = 1; i < nCorners.getLength(); i++) {
|
for(int i = 1; i < nCorners.getLength(); i++) {
|
||||||
markXML = (Element)nCorners.item(i);
|
markXML = (Element)nCorners.item(i);
|
||||||
CompoundMark currentCompoundMark = getMarker(getCompoundMarkID(markXML));
|
Marker currentMarker = getMarker(getCompoundMarkID(markXML));
|
||||||
legs.add(new Leg(legName, lastCompoundMark, currentCompoundMark, i-1));
|
legs.add(new Leg(legName, lastMarker, currentMarker, i-1));
|
||||||
lastCompoundMark = currentCompoundMark;
|
lastMarker = currentMarker;
|
||||||
legName = getCompoundMarkName(getCompoundMarkID(markXML));
|
legName = getCompoundMarkName(getCompoundMarkID(markXML));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -253,16 +246,12 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
return legs;
|
return legs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<CompoundMark> getCompoundMarks() { return compoundMarks; }
|
public List<Marker> getMarkers() { return markers; }
|
||||||
|
|
||||||
public Double getPadding() {
|
public Double getPadding() {
|
||||||
return COORDINATEPADDING;
|
return COORDINATEPADDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZonedDateTime getCreationTimeDate() {
|
|
||||||
return creationTimeDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ZonedDateTime getRaceStartTime() {
|
public ZonedDateTime getRaceStartTime() {
|
||||||
return raceStartTime;
|
return raceStartTime;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,7 @@ public class StreamedRace extends Race {
|
|||||||
String name = officialStart.getName();
|
String name = officialStart.getName();
|
||||||
CompoundMark endCompoundMark = officialStart.getEndCompoundMark();
|
CompoundMark endCompoundMark = officialStart.getEndCompoundMark();
|
||||||
|
|
||||||
for (int i = 0; i < startingBoats.size(); i++) {
|
for (Boat boat : startingBoats) {
|
||||||
Boat boat = startingBoats.get(i);
|
|
||||||
if (boat != null) {
|
if (boat != null) {
|
||||||
Leg startLeg = new Leg(name, 0);
|
Leg startLeg = new Leg(name, 0);
|
||||||
startLeg.setEndCompoundMark(endCompoundMark);
|
startLeg.setEndCompoundMark(endCompoundMark);
|
||||||
@@ -98,6 +97,28 @@ public class StreamedRace extends Race {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the boat's gps coordinates
|
||||||
|
*
|
||||||
|
* @param mark to be updated
|
||||||
|
*/
|
||||||
|
protected void updateMarker(Marker mark) {
|
||||||
|
int sourceID = mark.getSourceId1();
|
||||||
|
BoatLocation boatLocation1 = visualiserInput.getBoatLocationMessage(sourceID);
|
||||||
|
if(boatLocation1 != null) {
|
||||||
|
double lat = boatLocation1.getLatitudeDouble();
|
||||||
|
double lon = boatLocation1.getLongitudeDouble();
|
||||||
|
mark.setCurrentPosition1(new GPSCoordinate(lat, lon));
|
||||||
|
}
|
||||||
|
int sourceID2 = mark.getSourceId2();
|
||||||
|
BoatLocation boatLocation2 = visualiserInput.getBoatLocationMessage(sourceID2);
|
||||||
|
if(boatLocation2 != null) {
|
||||||
|
double lat = boatLocation2.getLatitudeDouble();
|
||||||
|
double lon = boatLocation2.getLongitudeDouble();
|
||||||
|
mark.setCurrentPosition2(new GPSCoordinate(lat, lon));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sets the position of a boat from coordinate
|
* sets the position of a boat from coordinate
|
||||||
* @param boat the boat to set
|
* @param boat the boat to set
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import javafx.beans.property.SimpleStringProperty;
|
|||||||
import javafx.beans.property.StringProperty;
|
import javafx.beans.property.StringProperty;
|
||||||
import javafx.scene.paint.Color;
|
import javafx.scene.paint.Color;
|
||||||
import org.geotools.referencing.GeodeticCalculator;
|
import org.geotools.referencing.GeodeticCalculator;
|
||||||
import seng302.Constants;
|
|
||||||
import seng302.GPSCoordinate;
|
import seng302.GPSCoordinate;
|
||||||
|
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
@@ -28,6 +27,7 @@ public class BoatInRace extends Boat {
|
|||||||
private boolean started = false;
|
private boolean started = false;
|
||||||
private final StringProperty position;
|
private final StringProperty position;
|
||||||
private double heading;
|
private double heading;
|
||||||
|
private static final double WAKE_SCALE = 10;
|
||||||
|
|
||||||
private final Queue<TrackPoint> track = new ConcurrentLinkedQueue<>();
|
private final Queue<TrackPoint> track = new ConcurrentLinkedQueue<>();
|
||||||
private long nextValidTime = 0;
|
private long nextValidTime = 0;
|
||||||
@@ -50,20 +50,6 @@ public class BoatInRace extends Boat {
|
|||||||
position = new SimpleStringProperty("-");
|
position = new SimpleStringProperty("-");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor method.
|
|
||||||
*
|
|
||||||
* @param name Name of the boat.
|
|
||||||
* @param colour Colour the boat will be displayed as on the map
|
|
||||||
* @param abbrev of boat
|
|
||||||
*/
|
|
||||||
public BoatInRace(String name, Color colour, String abbrev) {
|
|
||||||
super(name, abbrev);
|
|
||||||
setColour(colour);
|
|
||||||
currentLegName = new SimpleStringProperty("");
|
|
||||||
position = new SimpleStringProperty("-");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the azimuth of the travel via map coordinates of the raceMarkers
|
* Calculates the azimuth of the travel via map coordinates of the raceMarkers
|
||||||
*
|
*
|
||||||
@@ -122,7 +108,7 @@ public class BoatInRace extends Boat {
|
|||||||
*/
|
*/
|
||||||
public GPSCoordinate getWake() {
|
public GPSCoordinate getWake() {
|
||||||
double reverseHeading = getHeading() - 180;
|
double reverseHeading = getHeading() - 180;
|
||||||
double distance = Constants.wakeScale * getVelocity();
|
double distance = WAKE_SCALE * getVelocity();
|
||||||
|
|
||||||
GeodeticCalculator calc = new GeodeticCalculator();
|
GeodeticCalculator calc = new GeodeticCalculator();
|
||||||
calc.setStartingGeographicPoint(
|
calc.setStartingGeographicPoint(
|
||||||
|
|||||||
@@ -8,27 +8,44 @@ import java.awt.geom.Point2D;
|
|||||||
/**
|
/**
|
||||||
* Created by esa46 on 29/03/17.
|
* Created by esa46 on 29/03/17.
|
||||||
*/
|
*/
|
||||||
public class CompoundMark {
|
public class Marker {
|
||||||
private final GPSCoordinate averageGPSCoordinate;
|
private final GPSCoordinate averageGPSCoordinate;
|
||||||
private final GPSCoordinate mark1;
|
private GPSCoordinate mark1;
|
||||||
private final GPSCoordinate mark2;
|
private GPSCoordinate mark2;
|
||||||
|
private final int sourceId1;
|
||||||
public CompoundMark(GPSCoordinate mark1) {
|
private final int sourceId2;
|
||||||
|
|
||||||
this.mark1 = mark1;
|
|
||||||
this.mark2 = mark1;
|
|
||||||
this.averageGPSCoordinate = calculateAverage();
|
|
||||||
|
|
||||||
|
public Marker(GPSCoordinate mark1, int sourceId) {
|
||||||
|
this(mark1, mark1, sourceId, sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompoundMark(GPSCoordinate mark1, GPSCoordinate mark2) {
|
public Marker(GPSCoordinate mark1, GPSCoordinate mark2, int sourceId1, int sourceId2) {
|
||||||
|
|
||||||
this.mark1 = mark1;
|
this.mark1 = mark1;
|
||||||
this.mark2 = mark2;
|
this.mark2 = mark2;
|
||||||
this.averageGPSCoordinate = calculateAverage();
|
this.averageGPSCoordinate = calculateAverage();
|
||||||
|
this.sourceId1 = sourceId1;
|
||||||
|
this.sourceId2 = sourceId2;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* @param mark1 Mark coordinates.
|
||||||
|
*/
|
||||||
|
public Marker(GPSCoordinate mark1) {
|
||||||
|
this(mark1, mark1, 0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* @param mark1 Mark one coordinate
|
||||||
|
* @param mark2 Mark two coordinate
|
||||||
|
*/
|
||||||
|
public Marker(GPSCoordinate mark1, GPSCoordinate mark2) {
|
||||||
|
this(mark1, mark2, 0,0);
|
||||||
|
}
|
||||||
|
|
||||||
public GPSCoordinate getMark1() {
|
public GPSCoordinate getMark1() {
|
||||||
return mark1;
|
return mark1;
|
||||||
}
|
}
|
||||||
@@ -66,4 +83,19 @@ public class CompoundMark {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setCurrentPosition1(GPSCoordinate gpsCoordinate){
|
||||||
|
mark1 = gpsCoordinate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCurrentPosition2(GPSCoordinate gpsCoordinate){
|
||||||
|
mark2 = gpsCoordinate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSourceId1() {
|
||||||
|
return sourceId1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSourceId2() {
|
||||||
|
return sourceId2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package seng302.Model;
|
package seng302.Model;
|
||||||
|
|
||||||
import org.geotools.referencing.GeodeticCalculator;
|
import org.geotools.referencing.GeodeticCalculator;
|
||||||
import seng302.Constants;
|
|
||||||
import seng302.GPSCoordinate;
|
import seng302.GPSCoordinate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -13,6 +12,8 @@ public class Leg {
|
|||||||
private CompoundMark startCompoundMark;
|
private CompoundMark startCompoundMark;
|
||||||
private CompoundMark endCompoundMark;
|
private CompoundMark endCompoundMark;
|
||||||
private final int legNumber;
|
private final int legNumber;
|
||||||
|
// 1 nautical mile = 1852 meters
|
||||||
|
public static final int NM_TO_METERS = 1852;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Leg Initializer
|
* Leg Initializer
|
||||||
@@ -97,7 +98,7 @@ public class Leg {
|
|||||||
GPSCoordinate endMarker = this.endCompoundMark.getAverageGPSCoordinate();
|
GPSCoordinate endMarker = this.endCompoundMark.getAverageGPSCoordinate();
|
||||||
calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude());
|
calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude());
|
||||||
calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude());
|
calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude());
|
||||||
this.distance = calc.getOrthodromicDistance() / Constants.NMToMetersConversion;
|
this.distance = calc.getOrthodromicDistance() / NM_TO_METERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public abstract class Race implements Runnable {
|
public abstract class Race implements Runnable {
|
||||||
protected final ObservableList<Boat> startingBoats;
|
protected final ObservableList<Boat> startingBoats;
|
||||||
|
protected final ObservableList<Marker> boatMarkers;
|
||||||
protected final List<Leg> legs;
|
protected final List<Leg> legs;
|
||||||
private RaceController controller;
|
private RaceController controller;
|
||||||
protected FinishController finishController;
|
protected FinishController finishController;
|
||||||
@@ -33,9 +34,10 @@ public abstract class Race implements Runnable {
|
|||||||
* @param controller race controller
|
* @param controller race controller
|
||||||
* @param scaleFactor for race
|
* @param scaleFactor for race
|
||||||
*/
|
*/
|
||||||
private Race(List<Boat> boats, List<Leg> legs, RaceController controller, int scaleFactor) {
|
private Race(List<Boat> boats, List<Marker> boatMarkers, List<Leg> legs, RaceController controller, int scaleFactor) {
|
||||||
|
|
||||||
this.startingBoats = FXCollections.observableArrayList(boats);
|
this.startingBoats = FXCollections.observableArrayList(boats);
|
||||||
|
this.boatMarkers = FXCollections.observableArrayList(boatMarkers);
|
||||||
this.legs = legs;
|
this.legs = legs;
|
||||||
this.legs.add(new Leg("Finish", this.legs.size()));
|
this.legs.add(new Leg("Finish", this.legs.size()));
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
@@ -45,7 +47,7 @@ public abstract class Race implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Race(RaceDataSource raceData, RaceController controller, int scaleFactor) {
|
protected Race(RaceDataSource raceData, RaceController controller, int scaleFactor) {
|
||||||
this(raceData.getBoats(), raceData.getLegs(), controller, scaleFactor);
|
this(raceData.getBoats(), raceData.getMarkers(), raceData.getLegs(), controller, scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,7 +58,7 @@ public abstract class Race implements Runnable {
|
|||||||
* @param scaleFactor factor to scale by
|
* @param scaleFactor factor to scale by
|
||||||
*/
|
*/
|
||||||
public Race(Boat[] startingBoats, List<Leg> legs, RaceController controller, int scaleFactor) {
|
public Race(Boat[] startingBoats, List<Leg> legs, RaceController controller, int scaleFactor) {
|
||||||
this(Arrays.asList(startingBoats), legs, controller, scaleFactor);
|
this(Arrays.asList(startingBoats), null, legs, controller, scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setController(RaceController controller) {
|
public void setController(RaceController controller) {
|
||||||
@@ -80,6 +82,8 @@ public abstract class Race implements Runnable {
|
|||||||
*/
|
*/
|
||||||
protected abstract void checkPosition(Boat boat, long timeElapsed);
|
protected abstract void checkPosition(Boat boat, long timeElapsed);
|
||||||
|
|
||||||
|
protected abstract void updateMarker(Marker mark);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the boat's gps coordinates
|
* Updates the boat's gps coordinates
|
||||||
*
|
*
|
||||||
@@ -140,12 +144,17 @@ public abstract class Race implements Runnable {
|
|||||||
boatsFinished++;
|
boatsFinished++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (Marker mark: boatMarkers){
|
||||||
|
if (mark != null){
|
||||||
|
updateMarker(mark);
|
||||||
|
}
|
||||||
|
}
|
||||||
//System.out.println(boatsFinished + ":" + startingBoats.size());
|
//System.out.println(boatsFinished + ":" + startingBoats.size());
|
||||||
} else {
|
} else {
|
||||||
controller.finishRace(startingBoats);
|
controller.finishRace(startingBoats);
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
controller.updateMap(startingBoats);
|
controller.updateMap(startingBoats, boatMarkers);
|
||||||
fps++;
|
fps++;
|
||||||
if ((System.currentTimeMillis() - timeCurrent) > 1000) {
|
if ((System.currentTimeMillis() - timeCurrent) > 1000) {
|
||||||
updateFPS(fps);
|
updateFPS(fps);
|
||||||
|
|||||||
@@ -34,13 +34,6 @@ public class RaceClock implements Runnable {
|
|||||||
setTime(time);
|
setTime(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
public RaceClock(long utcTime, ZoneId zoneId) {
|
|
||||||
this.zoneId = zoneId;
|
|
||||||
this.timeString = new SimpleStringProperty();
|
|
||||||
this.time = (new Date(utcTime)).toInstant().atZone(zoneId);
|
|
||||||
setTime(time);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ZonedDateTime getCurrentZonedDateTime(GPSCoordinate gpsCoordinate) {
|
public static ZonedDateTime getCurrentZonedDateTime(GPSCoordinate gpsCoordinate) {
|
||||||
TimeZoneLookup timeZoneLookup = new TimeZoneLookup();
|
TimeZoneLookup timeZoneLookup = new TimeZoneLookup();
|
||||||
TimeZoneResult timeZoneResult = timeZoneLookup.getTimeZone(gpsCoordinate.getLatitude(), gpsCoordinate.getLongitude());
|
TimeZoneResult timeZoneResult = timeZoneLookup.getTimeZone(gpsCoordinate.getLatitude(), gpsCoordinate.getLongitude());
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package seng302.Model;
|
package seng302.Model;
|
||||||
|
|
||||||
|
|
||||||
|
import javafx.collections.ObservableList;
|
||||||
import javafx.scene.paint.Color;
|
import javafx.scene.paint.Color;
|
||||||
import javafx.scene.paint.Paint;
|
import javafx.scene.paint.Paint;
|
||||||
import javafx.scene.transform.Rotate;
|
import javafx.scene.transform.Rotate;
|
||||||
import seng302.GPSCoordinate;
|
|
||||||
import seng302.GraphCoordinate;
|
import seng302.GraphCoordinate;
|
||||||
import seng302.Mock.StreamedCourse;
|
import seng302.Mock.StreamedCourse;
|
||||||
import seng302.RaceDataSource;
|
import seng302.RaceDataSource;
|
||||||
@@ -22,14 +22,14 @@ import java.util.List;
|
|||||||
public class ResizableRaceCanvas extends ResizableCanvas {
|
public class ResizableRaceCanvas extends ResizableCanvas {
|
||||||
private RaceMap map;
|
private RaceMap map;
|
||||||
private List<Boat> boats;
|
private List<Boat> boats;
|
||||||
|
private List<Marker> boatMarkers;
|
||||||
private boolean raceAnno = true;
|
private boolean raceAnno = true;
|
||||||
private boolean annoName = true;
|
private boolean annoName = true;
|
||||||
private boolean annoAbbrev = true;
|
private boolean annoAbbrev = true;
|
||||||
private boolean annoSpeed = true;
|
private boolean annoSpeed = true;
|
||||||
private boolean annoPath = true;
|
private boolean annoPath = true;
|
||||||
private List<Color> colours;
|
private List<Color> colours;
|
||||||
private final List<CompoundMark> compoundMarks;
|
private final List<Marker> markers;
|
||||||
double[] xpoints = {}, ypoints = {};
|
|
||||||
private final RaceDataSource raceData;
|
private final RaceDataSource raceData;
|
||||||
|
|
||||||
public ResizableRaceCanvas(RaceDataSource raceData) {
|
public ResizableRaceCanvas(RaceDataSource raceData) {
|
||||||
@@ -42,7 +42,7 @@ public class ResizableRaceCanvas extends ResizableCanvas {
|
|||||||
|
|
||||||
setMap(new RaceMap(lat1, long1, lat2, long2, (int) getWidth(), (int) getHeight()));
|
setMap(new RaceMap(lat1, long1, lat2, long2, (int) getWidth(), (int) getHeight()));
|
||||||
|
|
||||||
this.compoundMarks = raceData.getMarkers();
|
this.markers = raceData.getMarkers();
|
||||||
makeColours();
|
makeColours();
|
||||||
this.raceData = raceData;
|
this.raceData = raceData;
|
||||||
}
|
}
|
||||||
@@ -56,6 +56,16 @@ public class ResizableRaceCanvas extends ResizableCanvas {
|
|||||||
this.boats = boats;
|
this.boats = boats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the boat markers that are to be displayed in this race.
|
||||||
|
*
|
||||||
|
* @param boatMarkers in race
|
||||||
|
*/
|
||||||
|
public void setBoatMarkers(ObservableList<Marker> boatMarkers) {
|
||||||
|
this.boatMarkers = boatMarkers;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the RaceMap that the RaceCanvas is to be displaying for.
|
* Sets the RaceMap that the RaceCanvas is to be displaying for.
|
||||||
*
|
*
|
||||||
@@ -65,22 +75,6 @@ public class ResizableRaceCanvas extends ResizableCanvas {
|
|||||||
this.map = map;
|
this.map = map;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Displays the mark of a race as a circle.
|
|
||||||
*
|
|
||||||
* @param graphCoordinate Latitude and Longitude in GraphCoordinate that it
|
|
||||||
* is to be displayed as.
|
|
||||||
* @param paint Colour the mark is to be coloured.
|
|
||||||
* @see GraphCoordinate
|
|
||||||
* @see Color
|
|
||||||
* @see Paint
|
|
||||||
*/
|
|
||||||
public void displayMark(GraphCoordinate graphCoordinate, Paint paint) {
|
|
||||||
double d = 25;
|
|
||||||
this.gc.setFill(paint);
|
|
||||||
gc.fillOval(graphCoordinate.getX() - (d / 2), graphCoordinate.getY() - (d / 2), d, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void displayBoat(Boat boat, double angle, Color colour) {
|
private void displayBoat(Boat boat, double angle, Color colour) {
|
||||||
if (boat.getCurrentPosition() != null) {
|
if (boat.getCurrentPosition() != null) {
|
||||||
GraphCoordinate pos = this.map.convertGPS(boat.getCurrentPosition());
|
GraphCoordinate pos = this.map.convertGPS(boat.getCurrentPosition());
|
||||||
@@ -201,15 +195,15 @@ public class ResizableRaceCanvas extends ResizableCanvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draw race compoundMarks
|
* Draw race markers
|
||||||
*/
|
*/
|
||||||
private void drawMarkers() {
|
private void drawMarkers() {
|
||||||
for(CompoundMark compoundMark : compoundMarks) {
|
for(Marker marker: markers) {
|
||||||
GraphCoordinate mark1 = this.map.convertGPS(compoundMark.getMark1());
|
GraphCoordinate mark1 = this.map.convertGPS(marker.getMark1());
|
||||||
// removed drawing of lines between the marks as only
|
// removed drawing of lines between the marks as only
|
||||||
// the start and finish line should have a line drawn
|
// the start and finish line should have a line drawn
|
||||||
if(compoundMark.isCompoundMark()) {
|
if(marker.isCompoundMark()) {
|
||||||
GraphCoordinate mark2 = this.map.convertGPS(compoundMark.getMark2());
|
GraphCoordinate mark2 = this.map.convertGPS(marker.getMark2());
|
||||||
displayPoint(mark1, Color.LIMEGREEN);
|
displayPoint(mark1, Color.LIMEGREEN);
|
||||||
displayPoint(mark2, Color.LIMEGREEN);
|
displayPoint(mark2, Color.LIMEGREEN);
|
||||||
} else {
|
} else {
|
||||||
@@ -246,19 +240,6 @@ public class ResizableRaceCanvas extends ResizableCanvas {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws a boat at a certain GPSCoordinate
|
|
||||||
*
|
|
||||||
* @param colour Colour to colour boat.
|
|
||||||
* @param gpsCoordinates GPScoordinate that the boat is to be drawn at.
|
|
||||||
* @see GPSCoordinate
|
|
||||||
* @see Color
|
|
||||||
*/
|
|
||||||
public void drawBoat(Color colour, GPSCoordinate gpsCoordinates) {
|
|
||||||
GraphCoordinate graphCoordinate = this.map.convertGPS(gpsCoordinates);
|
|
||||||
displayPoint(graphCoordinate, colour);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Toggle the raceAnno value
|
* Toggle the raceAnno value
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import java.io.DataInputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.text.ParseException;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -219,6 +218,7 @@ public class VisualiserInput implements Runnable {
|
|||||||
|
|
||||||
//If no heartbeat has been received in more the heartbeat period
|
//If no heartbeat has been received in more the heartbeat period
|
||||||
//then the connection will need to be restarted.
|
//then the connection will need to be restarted.
|
||||||
|
//System.out.println("time since last heartbeat: " + timeSinceHeartbeat());//TEMP REMOVE
|
||||||
long heartBeatPeriod = 10 * 1000;
|
long heartBeatPeriod = 10 * 1000;
|
||||||
if (timeSinceHeartbeat() > heartBeatPeriod) {
|
if (timeSinceHeartbeat() > heartBeatPeriod) {
|
||||||
System.out.println("Connection has stopped, trying to reconnect.");
|
System.out.println("Connection has stopped, trying to reconnect.");
|
||||||
@@ -257,10 +257,10 @@ public class VisualiserInput implements Runnable {
|
|||||||
System.err.println("Unable to read message: " + e.getMessage());
|
System.err.println("Unable to read message: " + e.getMessage());
|
||||||
//Continue to the next loop iteration/message.
|
//Continue to the next loop iteration/message.
|
||||||
continue;
|
continue;
|
||||||
}
|
}/*
|
||||||
|
|
||||||
//Add it to message queue.
|
//Add it to message queue.
|
||||||
this.messagesReceivedQueue.add(message);
|
this.messagesReceivedQueue.add(message);*/
|
||||||
|
|
||||||
|
|
||||||
//Checks which message is being received and does what is needed for that message.
|
//Checks which message is being received and does what is needed for that message.
|
||||||
@@ -314,7 +314,7 @@ public class VisualiserInput implements Runnable {
|
|||||||
course.setStreamedCourseXMLReader(new StreamedCourseXMLReader(xmlMessage.getXmlMessage()));
|
course.setStreamedCourseXMLReader(new StreamedCourseXMLReader(xmlMessage.getXmlMessage()));
|
||||||
}
|
}
|
||||||
//TODO REFACTOR should put all of these exceptions behind a StreamedCourseXMLReaderException.
|
//TODO REFACTOR should put all of these exceptions behind a StreamedCourseXMLReaderException.
|
||||||
catch (IOException | SAXException | ParserConfigurationException | ParseException | StreamedCourseXMLException e) {
|
catch (IOException | SAXException | ParserConfigurationException | StreamedCourseXMLException e) {
|
||||||
System.err.println("Error creating StreamedCourseXMLReader: " + e.getMessage());
|
System.err.println("Error creating StreamedCourseXMLReader: " + e.getMessage());
|
||||||
//Continue to the next loop iteration/message.
|
//Continue to the next loop iteration/message.
|
||||||
}
|
}
|
||||||
@@ -368,8 +368,6 @@ public class VisualiserInput implements Runnable {
|
|||||||
BoatLocation boatLocation = (BoatLocation) message;
|
BoatLocation boatLocation = (BoatLocation) message;
|
||||||
|
|
||||||
//System.out.println("Boat Location!");
|
//System.out.println("Boat Location!");
|
||||||
//System.out.println(boatLocation.getSourceID());
|
|
||||||
|
|
||||||
if (this.boatLocationMap.containsKey(boatLocation.getSourceID())) {
|
if (this.boatLocationMap.containsKey(boatLocation.getSourceID())) {
|
||||||
//If our boatlocation map already contains a boat location message for this boat, check that the new message is actually for a later timestamp (i.e., newer).
|
//If our boatlocation map already contains a boat location message for this boat, check that the new message is actually for a later timestamp (i.e., newer).
|
||||||
if (boatLocation.getTime() > this.boatLocationMap.get(boatLocation.getSourceID()).getTime()){
|
if (boatLocation.getTime() > this.boatLocationMap.get(boatLocation.getSourceID()).getTime()){
|
||||||
@@ -380,7 +378,6 @@ public class VisualiserInput implements Runnable {
|
|||||||
//If the map _doesn't_ already contain a message for this boat, insert the message.
|
//If the map _doesn't_ already contain a message for this boat, insert the message.
|
||||||
this.boatLocationMap.put(boatLocation.getSourceID(), boatLocation);
|
this.boatLocationMap.put(boatLocation.getSourceID(), boatLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
//MarkRounding.
|
//MarkRounding.
|
||||||
else if (message instanceof MarkRounding) {
|
else if (message instanceof MarkRounding) {
|
||||||
|
|||||||
@@ -2,12 +2,12 @@ package seng302.Model;
|
|||||||
|
|
||||||
import org.geotools.referencing.GeodeticCalculator;
|
import org.geotools.referencing.GeodeticCalculator;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import seng302.Constants;
|
|
||||||
import seng302.GPSCoordinate;
|
import seng302.GPSCoordinate;
|
||||||
|
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
|
|
||||||
import static junit.framework.TestCase.assertEquals;
|
import static junit.framework.TestCase.assertEquals;
|
||||||
|
import static seng302.Model.Leg.NM_TO_METERS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by esa46 on 22/03/17.
|
* Created by esa46 on 22/03/17.
|
||||||
@@ -20,7 +20,7 @@ public class LegTest {
|
|||||||
public void calculateDistanceHandles5nmNorth() {
|
public void calculateDistanceHandles5nmNorth() {
|
||||||
GeodeticCalculator calc = new GeodeticCalculator();
|
GeodeticCalculator calc = new GeodeticCalculator();
|
||||||
calc.setStartingGeographicPoint(0, 0);
|
calc.setStartingGeographicPoint(0, 0);
|
||||||
calc.setDirection(0, 5 * Constants.NMToMetersConversion);
|
calc.setDirection(0, 5 * NM_TO_METERS);
|
||||||
|
|
||||||
CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint());
|
CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint());
|
||||||
Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0);
|
Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0);
|
||||||
@@ -31,7 +31,7 @@ public class LegTest {
|
|||||||
public void calculateDistanceHandles12nmEast() {
|
public void calculateDistanceHandles12nmEast() {
|
||||||
GeodeticCalculator calc = new GeodeticCalculator();
|
GeodeticCalculator calc = new GeodeticCalculator();
|
||||||
calc.setStartingGeographicPoint(0, 0);
|
calc.setStartingGeographicPoint(0, 0);
|
||||||
calc.setDirection(90, 12 * Constants.NMToMetersConversion);
|
calc.setDirection(90, 12 * NM_TO_METERS);
|
||||||
|
|
||||||
CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint());
|
CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint());
|
||||||
Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0);
|
Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0);
|
||||||
@@ -42,7 +42,7 @@ public class LegTest {
|
|||||||
public void calculateDistanceHandlesHalfnmSouth() {
|
public void calculateDistanceHandlesHalfnmSouth() {
|
||||||
GeodeticCalculator calc = new GeodeticCalculator();
|
GeodeticCalculator calc = new GeodeticCalculator();
|
||||||
calc.setStartingGeographicPoint(0, 0);
|
calc.setStartingGeographicPoint(0, 0);
|
||||||
calc.setDirection(180, 0.5 * Constants.NMToMetersConversion);
|
calc.setDirection(180, 0.5 * NM_TO_METERS);
|
||||||
|
|
||||||
CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint());
|
CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint());
|
||||||
Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0);
|
Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0);
|
||||||
@@ -53,7 +53,7 @@ public class LegTest {
|
|||||||
public void calculateDistanceHandlesPoint1nmWest() {
|
public void calculateDistanceHandlesPoint1nmWest() {
|
||||||
GeodeticCalculator calc = new GeodeticCalculator();
|
GeodeticCalculator calc = new GeodeticCalculator();
|
||||||
calc.setStartingGeographicPoint(0, 0);
|
calc.setStartingGeographicPoint(0, 0);
|
||||||
calc.setDirection(-90, 0.1 * Constants.NMToMetersConversion);
|
calc.setDirection(-90, 0.1 * NM_TO_METERS);
|
||||||
|
|
||||||
CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint());
|
CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint());
|
||||||
Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0);
|
Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user