diff --git a/visualiser/src/main/java/seng302/Constants.java b/visualiser/src/main/java/seng302/Constants.java deleted file mode 100644 index 096e5a2b..00000000 --- a/visualiser/src/main/java/seng302/Constants.java +++ /dev/null @@ -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")}; -} diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index a108b592..1657a671 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -48,8 +48,9 @@ public class RaceController extends Controller { * @param boats boats that are to be displayed in the race * @see ResizableRaceCanvas */ - public void updateMap(ObservableList boats) { + public void updateMap(ObservableList boats, ObservableList boatMarkers) { raceMap.setBoats(boats); + raceMap.setBoatMarkers(boatMarkers); raceMap.update(); raceBoundaries.draw(); //stop if the visualiser is no longer running diff --git a/visualiser/src/main/java/seng302/Controllers/StartController.java b/visualiser/src/main/java/seng302/Controllers/StartController.java index f264cded..aaf6ae2a 100644 --- a/visualiser/src/main/java/seng302/Controllers/StartController.java +++ b/visualiser/src/main/java/seng302/Controllers/StartController.java @@ -19,7 +19,6 @@ import seng302.VisualiserInput; import java.io.IOException; import java.net.Socket; import java.net.URL; -import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Observable; @@ -43,8 +42,6 @@ public class StartController extends Controller implements Observer { @FXML private Label timer; @FXML private Label raceStatusLabel; - private ZonedDateTime startingTime; - //@FXML Button fifteenMinButton; private RaceClock raceClock; @@ -61,17 +58,11 @@ public class StartController extends Controller implements Observer { * Begins the race with a scale factor of 1 */ private void startRaceNoScaling() { - //startRace(1); while(visualiserInput.getRaceStatus() == null);//TODO probably remove this. countdownTimer(); } - private void startRace(int raceScale){ - //fifteenMinButton.setDisable(true); - //countdownTimer(raceScale); - } - @Override public void initialize(URL location, ResourceBundle resources){ raceData = new StreamedCourse(); diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index 6301f584..28ea85da 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -21,14 +21,6 @@ public class StreamedCourse extends Observable implements RaceDataSource { public StreamedCourse() {} - public StreamedCourse(StreamedCourseXMLReader streamedCourseXMLReader) { - this.streamedCourseXMLReader = streamedCourseXMLReader; - } - - public StreamedCourse(BoatXMLReader boatXMLReader) { - this.boatXMLReader = boatXMLReader; - } - public void setBoatXMLReader(BoatXMLReader boatXMLReader) { this.boatXMLReader = boatXMLReader; if (streamedCourseXMLReader != null && boatXMLReader != null) { diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java index 9a0a8f4b..d2cac2ad 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java @@ -6,14 +6,13 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import seng302.GPSCoordinate; -import seng302.Model.CompoundMark; import seng302.Model.Leg; +import seng302.Model.Marker; import seng302.XMLReader; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.InputStream; -import java.text.ParseException; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -25,29 +24,16 @@ public class StreamedCourseXMLReader extends XMLReader { private static final double COORDINATEPADDING = 0.000; private GPSCoordinate mapTopLeft, mapBottomRight; private final List boundary = new ArrayList<>(); - private final Map compoundMarkMap = new HashMap<>(); + private final Map compoundMarks = new HashMap<>(); private final Map participants = new HashMap<>(); private final List legs = new ArrayList<>(); - private final List compoundMarks = new ArrayList<>(); + private final List markers = new ArrayList<>(); private ZonedDateTime creationTimeDate; private ZonedDateTime raceStartTime; private int raceID; private String raceType; 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 * @param filePath file path to read @@ -55,10 +41,9 @@ public class StreamedCourseXMLReader extends XMLReader { * @throws IOException error * @throws SAXException error * @throws ParserConfigurationException error - * @throws ParseException 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); if (read) { read(); @@ -71,10 +56,9 @@ public class StreamedCourseXMLReader extends XMLReader { * @throws IOException error * @throws SAXException error * @throws ParserConfigurationException error - * @throws ParseException 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); 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. - * @see CompoundMark + * @see seng302.Model.Marker */ private void readCompoundMarks() throws StreamedCourseXMLException { Element nCourse = (Element) doc.getElementsByTagName("Course").item(0); @@ -146,27 +130,28 @@ public class StreamedCourseXMLReader extends XMLReader { Node compoundMark = nCourse.getChildNodes().item(i); if(compoundMark.getNodeName().equals("CompoundMark")) { int compoundMarkID = getCompoundMarkID((Element) compoundMark); - compoundMarkMap.put(compoundMarkID, (Element)compoundMark); - compoundMarks.add(getMarker(compoundMarkID)); + compoundMarks.put(compoundMarkID, (Element)compoundMark); + 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 - * @return generated CompoundMark + * @return generated Marker * @throws StreamedCourseXMLException if CompoundMark element contains unhandled number of compoundMarks - * @see CompoundMark + * @see seng302.Model.Marker */ - private CompoundMark getMarker(int compoundMarkID) throws StreamedCourseXMLException { - Element compoundMark = compoundMarkMap.get(compoundMarkID); + private Marker getMarker(int compoundMarkID) throws StreamedCourseXMLException { + Element compoundMark = compoundMarks.get(compoundMarkID); NodeList nMarks = compoundMark.getElementsByTagName("Mark"); - CompoundMark marker; + Marker marker; switch(nMarks.getLength()) { - case 1: marker = new CompoundMark(getCoordinate((Element)nMarks.item(0))); break; - case 2: marker = new CompoundMark(getCoordinate((Element)nMarks.item(0)), getCoordinate((Element)nMarks.item(1))); break; + case 1: marker = new Marker(getCoordinate((Element)nMarks.item(0)),getSourceId((Element)nMarks.item(0))); 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(); } @@ -179,6 +164,14 @@ public class StreamedCourseXMLReader extends XMLReader { 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 * @param element with "compoundMarkID" attribute @@ -194,24 +187,24 @@ public class StreamedCourseXMLReader extends XMLReader { * @return value of "name" attribute */ 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. - * @throws StreamedCourseXMLException if compoundMarks cannot be resolved from CompoundMark + * @throws StreamedCourseXMLException if markers cannot be resolved from CompoundMark */ private void readCompoundMarkSequence() throws StreamedCourseXMLException { Element nCompoundMarkSequence = (Element) doc.getElementsByTagName("CompoundMarkSequence").item(0); NodeList nCorners = nCompoundMarkSequence.getElementsByTagName("Corner"); Element markXML = (Element)nCorners.item(0); - CompoundMark lastCompoundMark = getMarker(getCompoundMarkID(markXML)); + Marker lastMarker = getMarker(getCompoundMarkID(markXML)); String legName = getCompoundMarkName(getCompoundMarkID(markXML)); for(int i = 1; i < nCorners.getLength(); i++) { markXML = (Element)nCorners.item(i); - CompoundMark currentCompoundMark = getMarker(getCompoundMarkID(markXML)); - legs.add(new Leg(legName, lastCompoundMark, currentCompoundMark, i-1)); - lastCompoundMark = currentCompoundMark; + Marker currentMarker = getMarker(getCompoundMarkID(markXML)); + legs.add(new Leg(legName, lastMarker, currentMarker, i-1)); + lastMarker = currentMarker; legName = getCompoundMarkName(getCompoundMarkID(markXML)); } } @@ -253,16 +246,12 @@ public class StreamedCourseXMLReader extends XMLReader { return legs; } - public List getCompoundMarks() { return compoundMarks; } + public List getMarkers() { return markers; } public Double getPadding() { return COORDINATEPADDING; } - public ZonedDateTime getCreationTimeDate() { - return creationTimeDate; - } - public ZonedDateTime getRaceStartTime() { return raceStartTime; } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index c84ac8cd..0c16c594 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -27,8 +27,7 @@ public class StreamedRace extends Race { String name = officialStart.getName(); CompoundMark endCompoundMark = officialStart.getEndCompoundMark(); - for (int i = 0; i < startingBoats.size(); i++) { - Boat boat = startingBoats.get(i); + for (Boat boat : startingBoats) { if (boat != null) { Leg startLeg = new Leg(name, 0); 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 * @param boat the boat to set diff --git a/visualiser/src/main/java/seng302/Model/BoatInRace.java b/visualiser/src/main/java/seng302/Model/BoatInRace.java index 3afc5e08..c1db16a2 100644 --- a/visualiser/src/main/java/seng302/Model/BoatInRace.java +++ b/visualiser/src/main/java/seng302/Model/BoatInRace.java @@ -4,7 +4,6 @@ import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.scene.paint.Color; import org.geotools.referencing.GeodeticCalculator; -import seng302.Constants; import seng302.GPSCoordinate; import java.awt.geom.Point2D; @@ -28,6 +27,7 @@ public class BoatInRace extends Boat { private boolean started = false; private final StringProperty position; private double heading; + private static final double WAKE_SCALE = 10; private final Queue track = new ConcurrentLinkedQueue<>(); private long nextValidTime = 0; @@ -50,20 +50,6 @@ public class BoatInRace extends Boat { 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 * @@ -122,7 +108,7 @@ public class BoatInRace extends Boat { */ public GPSCoordinate getWake() { double reverseHeading = getHeading() - 180; - double distance = Constants.wakeScale * getVelocity(); + double distance = WAKE_SCALE * getVelocity(); GeodeticCalculator calc = new GeodeticCalculator(); calc.setStartingGeographicPoint( diff --git a/visualiser/src/main/java/seng302/Model/CompoundMark.java b/visualiser/src/main/java/seng302/Model/CompoundMark.java index 6e635dde..8816807b 100644 --- a/visualiser/src/main/java/seng302/Model/CompoundMark.java +++ b/visualiser/src/main/java/seng302/Model/CompoundMark.java @@ -8,25 +8,42 @@ import java.awt.geom.Point2D; /** * Created by esa46 on 29/03/17. */ -public class CompoundMark { +public class Marker { private final GPSCoordinate averageGPSCoordinate; - private final GPSCoordinate mark1; - private final GPSCoordinate mark2; - - public CompoundMark(GPSCoordinate mark1) { - - this.mark1 = mark1; - this.mark2 = mark1; - this.averageGPSCoordinate = calculateAverage(); + private GPSCoordinate mark1; + private GPSCoordinate mark2; + private final int sourceId1; + private final int sourceId2; + 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.mark2 = mark2; 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() { @@ -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; + } } diff --git a/visualiser/src/main/java/seng302/Model/Leg.java b/visualiser/src/main/java/seng302/Model/Leg.java index 82f2024e..2702a09f 100644 --- a/visualiser/src/main/java/seng302/Model/Leg.java +++ b/visualiser/src/main/java/seng302/Model/Leg.java @@ -1,7 +1,6 @@ package seng302.Model; import org.geotools.referencing.GeodeticCalculator; -import seng302.Constants; import seng302.GPSCoordinate; /** @@ -13,6 +12,8 @@ public class Leg { private CompoundMark startCompoundMark; private CompoundMark endCompoundMark; private final int legNumber; + // 1 nautical mile = 1852 meters + public static final int NM_TO_METERS = 1852; /** * Leg Initializer @@ -97,7 +98,7 @@ public class Leg { GPSCoordinate endMarker = this.endCompoundMark.getAverageGPSCoordinate(); calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude()); calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude()); - this.distance = calc.getOrthodromicDistance() / Constants.NMToMetersConversion; + this.distance = calc.getOrthodromicDistance() / NM_TO_METERS; } diff --git a/visualiser/src/main/java/seng302/Model/Race.java b/visualiser/src/main/java/seng302/Model/Race.java index 13e0463e..6d6ca022 100644 --- a/visualiser/src/main/java/seng302/Model/Race.java +++ b/visualiser/src/main/java/seng302/Model/Race.java @@ -17,6 +17,7 @@ import java.util.List; */ public abstract class Race implements Runnable { protected final ObservableList startingBoats; + protected final ObservableList boatMarkers; protected final List legs; private RaceController controller; protected FinishController finishController; @@ -33,9 +34,10 @@ public abstract class Race implements Runnable { * @param controller race controller * @param scaleFactor for race */ - private Race(List boats, List legs, RaceController controller, int scaleFactor) { + private Race(List boats, List boatMarkers, List legs, RaceController controller, int scaleFactor) { this.startingBoats = FXCollections.observableArrayList(boats); + this.boatMarkers = FXCollections.observableArrayList(boatMarkers); this.legs = legs; this.legs.add(new Leg("Finish", this.legs.size())); this.controller = controller; @@ -45,7 +47,7 @@ public abstract class Race implements Runnable { } 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 */ public Race(Boat[] startingBoats, List 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) { @@ -80,6 +82,8 @@ public abstract class Race implements Runnable { */ protected abstract void checkPosition(Boat boat, long timeElapsed); + protected abstract void updateMarker(Marker mark); + /** * Updates the boat's gps coordinates * @@ -140,12 +144,17 @@ public abstract class Race implements Runnable { boatsFinished++; } } + for (Marker mark: boatMarkers){ + if (mark != null){ + updateMarker(mark); + } + } //System.out.println(boatsFinished + ":" + startingBoats.size()); } else { controller.finishRace(startingBoats); stop(); } - controller.updateMap(startingBoats); + controller.updateMap(startingBoats, boatMarkers); fps++; if ((System.currentTimeMillis() - timeCurrent) > 1000) { updateFPS(fps); diff --git a/visualiser/src/main/java/seng302/Model/RaceClock.java b/visualiser/src/main/java/seng302/Model/RaceClock.java index bef6c206..f17b9e12 100644 --- a/visualiser/src/main/java/seng302/Model/RaceClock.java +++ b/visualiser/src/main/java/seng302/Model/RaceClock.java @@ -34,13 +34,6 @@ public class RaceClock implements Runnable { 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) { TimeZoneLookup timeZoneLookup = new TimeZoneLookup(); TimeZoneResult timeZoneResult = timeZoneLookup.getTimeZone(gpsCoordinate.getLatitude(), gpsCoordinate.getLongitude()); diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index be569b60..b4815d22 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -1,10 +1,10 @@ package seng302.Model; +import javafx.collections.ObservableList; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.transform.Rotate; -import seng302.GPSCoordinate; import seng302.GraphCoordinate; import seng302.Mock.StreamedCourse; import seng302.RaceDataSource; @@ -22,14 +22,14 @@ import java.util.List; public class ResizableRaceCanvas extends ResizableCanvas { private RaceMap map; private List boats; + private List boatMarkers; private boolean raceAnno = true; private boolean annoName = true; private boolean annoAbbrev = true; private boolean annoSpeed = true; private boolean annoPath = true; private List colours; - private final List compoundMarks; - double[] xpoints = {}, ypoints = {}; + private final List markers; private final 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())); - this.compoundMarks = raceData.getMarkers(); + this.markers = raceData.getMarkers(); makeColours(); this.raceData = raceData; } @@ -56,29 +56,23 @@ public class ResizableRaceCanvas extends ResizableCanvas { this.boats = boats; } + /** - * Sets the RaceMap that the RaceCanvas is to be displaying for. + * Sets the boat markers that are to be displayed in this race. * - * @param map race map + * @param boatMarkers in race */ - private void setMap(RaceMap map) { - this.map = map; + public void setBoatMarkers(ObservableList boatMarkers) { + this.boatMarkers = boatMarkers; } /** - * Displays the mark of a race as a circle. + * Sets the RaceMap that the RaceCanvas is to be displaying for. * - * @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 + * @param map race map */ - 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 setMap(RaceMap map) { + this.map = map; } private void displayBoat(Boat boat, double angle, Color colour) { @@ -201,15 +195,15 @@ public class ResizableRaceCanvas extends ResizableCanvas { } /** - * Draw race compoundMarks + * Draw race markers */ private void drawMarkers() { - for(CompoundMark compoundMark : compoundMarks) { - GraphCoordinate mark1 = this.map.convertGPS(compoundMark.getMark1()); + for(Marker marker: markers) { + GraphCoordinate mark1 = this.map.convertGPS(marker.getMark1()); // removed drawing of lines between the marks as only // the start and finish line should have a line drawn - if(compoundMark.isCompoundMark()) { - GraphCoordinate mark2 = this.map.convertGPS(compoundMark.getMark2()); + if(marker.isCompoundMark()) { + GraphCoordinate mark2 = this.map.convertGPS(marker.getMark2()); displayPoint(mark1, Color.LIMEGREEN); displayPoint(mark2, Color.LIMEGREEN); } 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 */ diff --git a/visualiser/src/main/java/seng302/VisualiserInput.java b/visualiser/src/main/java/seng302/VisualiserInput.java index e35c4b7f..4f2b3ce9 100644 --- a/visualiser/src/main/java/seng302/VisualiserInput.java +++ b/visualiser/src/main/java/seng302/VisualiserInput.java @@ -10,7 +10,6 @@ import java.io.DataInputStream; import java.io.IOException; import java.net.Socket; import java.nio.ByteBuffer; -import java.text.ParseException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -219,6 +218,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 long heartBeatPeriod = 10 * 1000; if (timeSinceHeartbeat() > heartBeatPeriod) { 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()); //Continue to the next loop iteration/message. continue; - } + }/* //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. @@ -314,7 +314,7 @@ public class VisualiserInput implements Runnable { course.setStreamedCourseXMLReader(new StreamedCourseXMLReader(xmlMessage.getXmlMessage())); } //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()); //Continue to the next loop iteration/message. } @@ -368,8 +368,6 @@ public class VisualiserInput implements Runnable { BoatLocation boatLocation = (BoatLocation) message; //System.out.println("Boat Location!"); - //System.out.println(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 (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. this.boatLocationMap.put(boatLocation.getSourceID(), boatLocation); } - } //MarkRounding. else if (message instanceof MarkRounding) { diff --git a/visualiser/src/test/java/seng302/Model/LegTest.java b/visualiser/src/test/java/seng302/Model/LegTest.java index bba971ae..5df351e4 100644 --- a/visualiser/src/test/java/seng302/Model/LegTest.java +++ b/visualiser/src/test/java/seng302/Model/LegTest.java @@ -2,12 +2,12 @@ package seng302.Model; import org.geotools.referencing.GeodeticCalculator; import org.junit.Test; -import seng302.Constants; import seng302.GPSCoordinate; import java.awt.geom.Point2D; import static junit.framework.TestCase.assertEquals; +import static seng302.Model.Leg.NM_TO_METERS; /** * Created by esa46 on 22/03/17. @@ -20,7 +20,7 @@ public class LegTest { public void calculateDistanceHandles5nmNorth() { GeodeticCalculator calc = new GeodeticCalculator(); calc.setStartingGeographicPoint(0, 0); - calc.setDirection(0, 5 * Constants.NMToMetersConversion); + calc.setDirection(0, 5 * NM_TO_METERS); CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); @@ -31,7 +31,7 @@ public class LegTest { public void calculateDistanceHandles12nmEast() { GeodeticCalculator calc = new GeodeticCalculator(); calc.setStartingGeographicPoint(0, 0); - calc.setDirection(90, 12 * Constants.NMToMetersConversion); + calc.setDirection(90, 12 * NM_TO_METERS); CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); @@ -42,7 +42,7 @@ public class LegTest { public void calculateDistanceHandlesHalfnmSouth() { GeodeticCalculator calc = new GeodeticCalculator(); calc.setStartingGeographicPoint(0, 0); - calc.setDirection(180, 0.5 * Constants.NMToMetersConversion); + calc.setDirection(180, 0.5 * NM_TO_METERS); CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0); @@ -53,7 +53,7 @@ public class LegTest { public void calculateDistanceHandlesPoint1nmWest() { GeodeticCalculator calc = new GeodeticCalculator(); calc.setStartingGeographicPoint(0, 0); - calc.setDirection(-90, 0.1 * Constants.NMToMetersConversion); + calc.setDirection(-90, 0.1 * NM_TO_METERS); CompoundMark endCompoundMark = getEndMarker(calc.getDestinationGeographicPoint()); Leg test = new Leg("Test", ORIGIN_CompoundMark, endCompoundMark, 0);