From 033198ca2c7e2d2b877b2b14a35d7f4bd3ee633a Mon Sep 17 00:00:00 2001 From: Joseph Date: Fri, 28 Apr 2017 00:53:07 +1200 Subject: [PATCH 1/8] Linked the streamedRace course to the visualiser, linked the boats to the visualiser (this needs to be tests) #story[768] --- .../main/java/seng302/Mock/StreamedBoat.java | 46 ++++++--- .../main/java/seng302/Mock/StreamedRace.java | 95 ++++++++++++++++++- .../src/main/java/seng302/Model/Boat.java | 2 +- .../main/java/seng302/Model/BoatInRace.java | 4 +- .../seng302/Model/ResizableRaceCanvas.java | 75 +++++++++++---- 5 files changed, 180 insertions(+), 42 deletions(-) diff --git a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java index 0ff629a0..ad458e4b 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java @@ -1,44 +1,60 @@ package seng302.Mock; import javafx.scene.paint.Color; +import org.geotools.referencing.GeodeticCalculator; import seng302.GPSCoordinate; import seng302.Model.Boat; import seng302.Model.BoatInRace; +import seng302.Model.Leg; +import seng302.Model.Marker; /** * Created by Joseph on 24/04/2017. */ public class StreamedBoat extends BoatInRace { private int sourceID; - private boolean complete; + private boolean dnf = false; + + private void init() { + this.velocity = 0; + this.scaledVelocity = 0; + this.heading = 0; + this.setCurrentLeg(new Leg("None", -1)); + this.setCurrentPosition(new GPSCoordinate(0, 0)); + } public StreamedBoat(int sourceID, String name, Color colour, String abbrev) { super(name, colour, abbrev); this.sourceID = sourceID; - this.complete = true; + this.init(); } public StreamedBoat(int sourceID) { super("None", Color.BLACK, "None"); this.sourceID = sourceID; - this.complete = false; + this.init(); } - /** - * Overridden to ignore this function - * @deprecated - * @return 0 + * Calculates the azimuth of the travel via heading of the boat + * + * @return the direction that the boat is heading towards in degrees (-180 to 180). */ - public double getScaledVelocity() { - return 0; + public double calculateAzimuth() { + double azimuth; + if (heading <= 180) { + azimuth = heading; + } else { + azimuth = -heading + 180; + } + return azimuth; } - /** - * Overridden to ignore this function - * @deprecated - * @param velocity of boat - */ - public void setScaledVelocity(double velocity) { + public boolean isDnf() { + return dnf; + } + + public void setDnf(boolean dnf) { + this.dnf = dnf; } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index 56b6a114..c1035d7b 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -1,12 +1,14 @@ package seng302.Mock; import javafx.collections.FXCollections; +import org.geotools.referencing.GeodeticCalculator; +import seng302.Constants; import seng302.Controllers.RaceController; -import seng302.Model.BoatInRace; -import seng302.Model.Leg; -import seng302.Model.Race; +import seng302.GPSCoordinate; +import seng302.Model.*; import seng302.RaceDataSource; +import java.awt.geom.Point2D; import java.util.*; /** @@ -18,10 +20,23 @@ public class StreamedRace extends Race { public StreamedRace(RaceDataSource raceData, RaceController controller, int scaleFactor) { super(raceData.getBoats(), raceData.getLegs(), controller, scaleFactor); this.raceData = raceData; + this.scaleFactor = 1; // There will be no scaling in a live streamed race } public void initialiseBoats() { + Leg officialStart = legs.get(0); + String name = officialStart.getName(); + Marker endMarker = officialStart.getEndMarker(); + for (int i = 0; i < startingBoats.size(); i++) { + BoatInRace boat = startingBoats.get(i); + if (boat != null) { + Leg startLeg = new Leg(name, 0); + startLeg.setEndMarker(endMarker); + boat.setCurrentLeg(startLeg); + boat.setHeading(boat.calculateHeading()); + } + } } /** @@ -29,6 +44,7 @@ public class StreamedRace extends Race { * @return True if boat cannot finish the race */ protected boolean doNotFinish() { + // DNF is no longer random and is now determined by a dnf packet return false; } @@ -39,17 +55,86 @@ public class StreamedRace extends Race { * @param timeElapsed Time that has elapse since the start of the the race. * @see BoatInRace */ + protected void checkPosition(StreamedBoat boat, long timeElapsed) { + if (boat.getCurrentLeg().getName().toLowerCase().contains("finish")) { + //boat has finished + boatsFinished++; + boat.setFinished(true); + boat.setTimeFinished(timeElapsed); + } else if (boat.isDnf()) { + boatsFinished++; + boat.setFinished(true); + boat.setCurrentLeg(new Leg("DNF", -1)); + boat.setVelocity(0); + boat.setScaledVelocity(0); + } + //Update the boat display table in the GUI to reflect the leg change + updatePositions(); + } + + /** + * Updates the boat's gps coordinates + * + * @param boat to be updated + * @param millisecondsElapsed time since last update + */ + protected void updatePosition(StreamedBoat boat, int millisecondsElapsed) { + //distanceTravelled = velocity (nm p hr) * time taken to update loop + double distanceTravelled = (boat.getVelocity() * millisecondsElapsed) / 3600000; + + boolean finish = boat.getCurrentLeg().getName().toLowerCase().contains("finish"); + if (!finish) { + //Calculate boat's new position by adding the distance travelled onto the start point of the leg + boat.setCurrentPosition(calculatePosition(boat.getCurrentPosition(), distanceTravelled, boat.calculateAzimuth())); + } + } + + protected void setPostion(StreamedBoat boat, GPSCoordinate coordinate) { + boat.setCurrentPosition(coordinate); + } + + /** + * Calculates the boats next GPS position based on its distance travelled and heading + * + * @param oldCoordinates GPS coordinates of the boat's starting position + * @param distanceTravelled distance in nautical miles + * @param azimuth boat's current direction. Value between -180 and 180 + * @return The boat's new coordinate + */ + public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { + + //Find new coordinate using current heading and distance + + GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); + //Load start point into calculator + Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); + geodeticCalculator.setStartingGeographicPoint(startPoint); + //load direction and distance travelled into calculator + geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); + //get new point + Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); + + return new GPSCoordinate(endPoint.getY(), endPoint.getX()); + } + + /** + * Checks the position of the boat, this updates the boats current position. + * @deprecated + * @param boat Boat that the postion is to be updated for. + * @param timeElapsed Time that has elapse since the start of the the race. + * @see BoatInRace + */ protected void checkPosition(BoatInRace boat, long timeElapsed) { } /** * Updates the boat's gps coordinates - * + * @deprecated * @param boat to be updated * @param millisecondsElapsed time since last update */ - protected void updatePosition(BoatInRace boat, int millisecondsElapsed) { + protected void updatePosition(BoatInRace boat, int millisecondsElapsed){ } diff --git a/visualiser/src/main/java/seng302/Model/Boat.java b/visualiser/src/main/java/seng302/Model/Boat.java index a3e269d4..4ea9d8ab 100644 --- a/visualiser/src/main/java/seng302/Model/Boat.java +++ b/visualiser/src/main/java/seng302/Model/Boat.java @@ -9,7 +9,7 @@ import javafx.beans.property.StringProperty; public class Boat { private StringProperty name; - private double velocity; + protected double velocity; private StringProperty velocityProp; private String abbrev; diff --git a/visualiser/src/main/java/seng302/Model/BoatInRace.java b/visualiser/src/main/java/seng302/Model/BoatInRace.java index 6f835593..42d9fcb7 100644 --- a/visualiser/src/main/java/seng302/Model/BoatInRace.java +++ b/visualiser/src/main/java/seng302/Model/BoatInRace.java @@ -18,7 +18,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; public class BoatInRace extends Boat { protected Leg currentLeg; - private double scaledVelocity; + protected double scaledVelocity; protected double distanceTravelledInLeg; protected GPSCoordinate currentPosition; protected long timeFinished; @@ -111,7 +111,7 @@ public class BoatInRace extends Boat { * @return the direction that the boat is heading towards in degrees (0 to 360). */ public double calculateHeading() { - double azimuth = this.calculateAzimuth(); + double azimuth = calculateAzimuth(); return calculateHeading(azimuth); } diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index dd8287dc..1df65127 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -22,6 +22,7 @@ public class ResizableRaceCanvas extends Canvas { private GraphicsContext gc; private RaceMap map; private List boats; + private RaceDataSource raceData; private boolean raceAnno = true; private boolean annoName = true; private boolean annoAbbrev = true; @@ -41,6 +42,8 @@ public class ResizableRaceCanvas extends Canvas { double lat2 = raceData.getMapBottomRight().getLatitude(); double long2 = raceData.getMapBottomRight().getLongitude(); setMap(new RaceMap(lat1, long1, lat2, long2, (int) getWidth(), (int) getHeight())); + + this.raceData = raceData; } /** @@ -225,30 +228,64 @@ public class ResizableRaceCanvas extends Canvas { //finish line gc.setLineWidth(2); drawBoundaries(); - GraphCoordinate finishLineCoord1 = this.map.convertGPS(Constants.finishLineMarker1); - GraphCoordinate finishLineCoord2 = this.map.convertGPS(Constants.finishLineMarker2); - displayLine(finishLineCoord1, finishLineCoord2, Color.DARKRED); - //marks - GraphCoordinate markCoord = this.map.convertGPS(Constants.mark1); - GraphCoordinate windwardGate1 = this.map.convertGPS(Constants.windwardGate1); - GraphCoordinate windwardGate2 = this.map.convertGPS(Constants.windwardGate2); - GraphCoordinate leewardGate1 = this.map.convertGPS(Constants.leewardGate1); - GraphCoordinate leewardGate2 = this.map.convertGPS(Constants.leewardGate2); - displayMark(markCoord, Color.GOLD); - displayLine(windwardGate1, windwardGate2, Color.DARKCYAN); - displayLine(leewardGate1, leewardGate2, Color.DARKVIOLET); - //start line - GraphCoordinate startline1 = this.map.convertGPS(Constants.startLineMarker1); - GraphCoordinate startline2 = this.map.convertGPS(Constants.startLineMarker2); - - displayLine(startline1, startline2, Color.GREEN); - + drawPoints(); updateBoats(); //display wind direction arrow - specify origin point and angle - angle now set to random angle displayArrow(new GraphCoordinate((int) getWidth() - 40, 40), 150); } + private void drawPoints() { +// GraphCoordinate finishLineCoord1 = this.map.convertGPS(Constants.finishLineMarker1); +// GraphCoordinate finishLineCoord2 = this.map.convertGPS(Constants.finishLineMarker2); +// displayLine(finishLineCoord1, finishLineCoord2, Color.DARKRED); +// //marks +// GraphCoordinate markCoord = this.map.convertGPS(Constants.mark1); +// GraphCoordinate windwardGate1 = this.map.convertGPS(Constants.windwardGate1); +// GraphCoordinate windwardGate2 = this.map.convertGPS(Constants.windwardGate2); +// GraphCoordinate leewardGate1 = this.map.convertGPS(Constants.leewardGate1); +// GraphCoordinate leewardGate2 = this.map.convertGPS(Constants.leewardGate2); +// displayMark(markCoord, Color.GOLD); +// displayLine(windwardGate1, windwardGate2, Color.DARKCYAN); +// displayLine(leewardGate1, leewardGate2, Color.DARKVIOLET); +// //start line +// GraphCoordinate startline1 = this.map.convertGPS(Constants.startLineMarker1); +// GraphCoordinate startline2 = this.map.convertGPS(Constants.startLineMarker2); +// +// displayLine(startline1, startline2, Color.GREEN); + + for (Leg leg : raceData.getLegs()) { + boolean hasStart = false; + boolean hasEnd = false; + GraphCoordinate start1 = null; + GraphCoordinate start2 = null; + GraphCoordinate end1 = null; + GraphCoordinate end2 = null; + String legName = leg.getName().toLowerCase(); + if (leg.getStartMarker() != null) { + start1 = this.map.convertGPS(leg.getStartMarker().getMark1()); + start2 = this.map.convertGPS(leg.getStartMarker().getMark2()); + hasStart = true; + } if (leg.getEndMarker() != null) { + end1 = this.map.convertGPS(leg.getEndMarker().getMark1()); + end2 = this.map.convertGPS(leg.getEndMarker().getMark2()); + hasEnd = true; + } + + if (legName.contains("line") || legName.contains("gate")) { + if (hasStart && start1 != null && start2 != null) displayLine(start1, start2, Color.BLACK); + if (hasEnd && start1 != null && start2 != null) displayLine(end1, end2, Color.BLACK); + } else if (hasStart && start1 != null && start2 != null) { + if (legName.contains("start")) displayLine(start1, start2, Color.BLACK); + else displayMark(start1, Color.BLACK); + } + else if (hasEnd && end1 != null && end2 != null) { + if (legName.contains("finish")) displayLine(end1, end2, Color.BLACK); + else displayMark(end1, Color.BLACK); + } + } + } + /** * Draws a boat at a certain GPSCoordinate * @@ -319,7 +356,7 @@ public class ResizableRaceCanvas extends Canvas { */ public void updateBoats() { // TODO Remove null when boats are ready - boats = null; + //boats = null; if (boats != null) { for (BoatInRace boat : boats) { boolean finished = boat.getCurrentLeg().getName().equals("Finish") || boat.getCurrentLeg().getName().equals("DNF"); From f377cf6471584c60e4d763ebcb207ba9d8b79b83 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Fri, 28 Apr 2017 12:35:00 +1200 Subject: [PATCH 2/8] Changed it so Boat can be used as a superclass for StreamedBoat and BoatInRace properly and removed ConstantVelocityRace. Everything that used to use BoatInRace or StreamedBoat now uses it superclass (boat). #pair[jjg64, cbt24] #refactor #story[782] --- .../seng302/Controllers/RaceController.java | 12 +- .../seng302/Controllers/StartController.java | 12 +- .../main/java/seng302/Mock/BoatXMLReader.java | 5 + .../main/java/seng302/Mock/StreamedBoat.java | 18 +- .../java/seng302/Mock/StreamedCourse.java | 9 +- .../main/java/seng302/Mock/StreamedRace.java | 70 +-- .../src/main/java/seng302/Model/Boat.java | 140 +++++- .../main/java/seng302/Model/BoatInRace.java | 17 - .../seng302/Model/ConstantVelocityRace.java | 416 +++++++++--------- .../src/main/java/seng302/Model/Race.java | 39 +- .../main/java/seng302/Model/RaceClock.java | 1 + .../seng302/Model/ResizableRaceCanvas.java | 42 +- .../src/main/java/seng302/RaceDataSource.java | 3 +- .../src/main/java/seng302/RaceXMLReader.java | 4 +- .../Model/ConstantVelocityRaceTest.java | 280 ++++++------ .../test/java/seng302/Model/RaceXMLTest.java | 2 +- 16 files changed, 572 insertions(+), 498 deletions(-) diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index 69bbf74b..9f1a55f7 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -61,15 +61,15 @@ public class RaceController extends Controller { Button showSetAnno; @FXML - TableView boatInfoTable; + TableView boatInfoTable; @FXML - TableColumn boatPlacingColumn; + TableColumn boatPlacingColumn; @FXML - TableColumn boatTeamColumn; + TableColumn boatTeamColumn; @FXML - TableColumn boatMarkColumn; + TableColumn boatMarkColumn; @FXML - TableColumn boatSpeedColumn; + TableColumn boatSpeedColumn; /** * Updates the ResizableRaceCanvas (raceMap) with most recent data @@ -77,7 +77,7 @@ 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) { raceMap.setBoats(boats); raceMap.update(); } diff --git a/visualiser/src/main/java/seng302/Controllers/StartController.java b/visualiser/src/main/java/seng302/Controllers/StartController.java index 4c70a1a2..859b2264 100644 --- a/visualiser/src/main/java/seng302/Controllers/StartController.java +++ b/visualiser/src/main/java/seng302/Controllers/StartController.java @@ -14,7 +14,7 @@ import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import org.xml.sax.SAXException; import seng302.Mock.*; -import seng302.Model.BoatInRace; +import seng302.Model.Boat; import seng302.Model.RaceClock; import seng302.RaceDataSource; import seng302.RaceXMLReader; @@ -34,9 +34,9 @@ public class StartController extends Controller { @FXML private GridPane start; @FXML private AnchorPane startWrapper; - @FXML private TableView boatNameTable; - @FXML private TableColumn boatNameColumn; - @FXML private TableColumn boatCodeColumn; + @FXML private TableView boatNameTable; + @FXML private TableColumn boatNameColumn; + @FXML private TableColumn boatCodeColumn; @FXML private Label timeZoneTime; @FXML private Label timer; @FXML private int PRERACE_TIME = 15000; @@ -107,8 +107,8 @@ public class StartController extends Controller { } private void initialiseTables() { - List boats = raceData.getBoats(); - ObservableList observableBoats = FXCollections.observableArrayList(boats); + List boats = raceData.getBoats(); + ObservableList observableBoats = FXCollections.observableArrayList(boats); boatNameTable.setItems(observableBoats); boatNameColumn.setCellValueFactory(cellData -> cellData.getValue().getName()); diff --git a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java index a7d429dc..386eb3fa 100644 --- a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java @@ -5,6 +5,7 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; +import seng302.Model.Boat; import seng302.XMLReader; import javax.xml.parsers.ParserConfigurationException; @@ -153,4 +154,8 @@ public class BoatXMLReader extends XMLReader { public Map getStreamedBoatMap() { return streamedBoatMap; } + + public List getBoats() { + return new ArrayList<>(streamedBoatMap.values()); + } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java index ad458e4b..88b025be 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java @@ -11,26 +11,22 @@ import seng302.Model.Marker; /** * Created by Joseph on 24/04/2017. */ -public class StreamedBoat extends BoatInRace { +public class StreamedBoat extends Boat { private int sourceID; private boolean dnf = false; private void init() { this.velocity = 0; - this.scaledVelocity = 0; - this.heading = 0; - this.setCurrentLeg(new Leg("None", -1)); - this.setCurrentPosition(new GPSCoordinate(0, 0)); } public StreamedBoat(int sourceID, String name, Color colour, String abbrev) { - super(name, colour, abbrev); + super(name, abbrev); this.sourceID = sourceID; this.init(); } public StreamedBoat(int sourceID) { - super("None", Color.BLACK, "None"); + super("None", "None"); this.sourceID = sourceID; this.init(); } @@ -49,12 +45,4 @@ public class StreamedBoat extends BoatInRace { } return azimuth; } - - public boolean isDnf() { - return dnf; - } - - public void setDnf(boolean dnf) { - this.dnf = dnf; - } } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index f2bcfed0..fb46ee81 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -1,10 +1,7 @@ package seng302.Mock; import seng302.GPSCoordinate; -import seng302.Model.BoatInRace; -import seng302.Model.Leg; -import seng302.Model.Marker; -import seng302.Model.RaceClock; +import seng302.Model.*; import seng302.RaceDataSource; import java.time.ZonedDateTime; @@ -51,8 +48,8 @@ public class StreamedCourse implements RaceDataSource { return regattaXMLReader; } - public List getBoats() { - return new ArrayList<>(boatXMLReader.getStreamedBoatMap().values()); + public List getBoats() { + return boatXMLReader.getBoats(); } public List getLegs() { diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index c1035d7b..375d7502 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -29,12 +29,11 @@ public class StreamedRace extends Race { Marker endMarker = officialStart.getEndMarker(); for (int i = 0; i < startingBoats.size(); i++) { - BoatInRace boat = startingBoats.get(i); + Boat boat = startingBoats.get(i); if (boat != null) { Leg startLeg = new Leg(name, 0); startLeg.setEndMarker(endMarker); boat.setCurrentLeg(startLeg); - boat.setHeading(boat.calculateHeading()); } } } @@ -55,18 +54,12 @@ public class StreamedRace extends Race { * @param timeElapsed Time that has elapse since the start of the the race. * @see BoatInRace */ - protected void checkPosition(StreamedBoat boat, long timeElapsed) { + protected void checkPosition(Boat boat, long timeElapsed) { if (boat.getCurrentLeg().getName().toLowerCase().contains("finish")) { //boat has finished boatsFinished++; boat.setFinished(true); boat.setTimeFinished(timeElapsed); - } else if (boat.isDnf()) { - boatsFinished++; - boat.setFinished(true); - boat.setCurrentLeg(new Leg("DNF", -1)); - boat.setVelocity(0); - boat.setScaledVelocity(0); } //Update the boat display table in the GUI to reflect the leg change updatePositions(); @@ -78,64 +71,13 @@ public class StreamedRace extends Race { * @param boat to be updated * @param millisecondsElapsed time since last update */ - protected void updatePosition(StreamedBoat boat, int millisecondsElapsed) { - //distanceTravelled = velocity (nm p hr) * time taken to update loop - double distanceTravelled = (boat.getVelocity() * millisecondsElapsed) / 3600000; - - boolean finish = boat.getCurrentLeg().getName().toLowerCase().contains("finish"); - if (!finish) { - //Calculate boat's new position by adding the distance travelled onto the start point of the leg - boat.setCurrentPosition(calculatePosition(boat.getCurrentPosition(), distanceTravelled, boat.calculateAzimuth())); - } + protected void updatePosition(Boat boat, int millisecondsElapsed) { + //TODO Grab info from network + // setPostiion(boat, coordinate); } - protected void setPostion(StreamedBoat boat, GPSCoordinate coordinate) { + protected void setPostion(Boat boat, GPSCoordinate coordinate) { boat.setCurrentPosition(coordinate); } - /** - * Calculates the boats next GPS position based on its distance travelled and heading - * - * @param oldCoordinates GPS coordinates of the boat's starting position - * @param distanceTravelled distance in nautical miles - * @param azimuth boat's current direction. Value between -180 and 180 - * @return The boat's new coordinate - */ - public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { - - //Find new coordinate using current heading and distance - - GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); - //Load start point into calculator - Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); - geodeticCalculator.setStartingGeographicPoint(startPoint); - //load direction and distance travelled into calculator - geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); - //get new point - Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); - - return new GPSCoordinate(endPoint.getY(), endPoint.getX()); - } - - /** - * Checks the position of the boat, this updates the boats current position. - * @deprecated - * @param boat Boat that the postion is to be updated for. - * @param timeElapsed Time that has elapse since the start of the the race. - * @see BoatInRace - */ - protected void checkPosition(BoatInRace boat, long timeElapsed) { - - } - - /** - * Updates the boat's gps coordinates - * @deprecated - * @param boat to be updated - * @param millisecondsElapsed time since last update - */ - protected void updatePosition(BoatInRace boat, int millisecondsElapsed){ - - } - } diff --git a/visualiser/src/main/java/seng302/Model/Boat.java b/visualiser/src/main/java/seng302/Model/Boat.java index 4ea9d8ab..f55aa6a0 100644 --- a/visualiser/src/main/java/seng302/Model/Boat.java +++ b/visualiser/src/main/java/seng302/Model/Boat.java @@ -2,16 +2,39 @@ package seng302.Model; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; +import org.geotools.referencing.GeodeticCalculator; +import seng302.Constants; +import seng302.GPSCoordinate; + +import java.awt.geom.Point2D; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; /** * Created by fwy13 on 3/03/17. */ public class Boat { - private StringProperty name; + protected StringProperty name; protected double velocity; private StringProperty velocityProp; - private String abbrev; + protected String abbrev; + protected GPSCoordinate currentPosition; + protected double heading; + protected Leg currentLeg; + protected StringProperty currentLegName; + protected boolean finished = false; + protected long timeFinished; + protected StringProperty position; + protected boolean started = false; + private double wakeScale = 1 / 50; + + protected Queue track = new ConcurrentLinkedQueue<>(); + protected long nextValidTime = 0; + + protected static final float BASE_TRACK_POINT_TIME_INTERVAL = 5000; + protected static float trackPointTimeInterval = 5000; // every 1 seconds + protected final int TRACK_POINT_LIMIT = 10; /** * Boat initialiser which keeps all of the information of the boat. @@ -25,6 +48,8 @@ public class Boat { this.velocityProp = new SimpleStringProperty(String.valueOf(Math.round(velocity))); this.abbrev = abbrev; this.name = new SimpleStringProperty(name); + currentLegName = new SimpleStringProperty(""); + position = new SimpleStringProperty("-"); } /** @@ -34,8 +59,52 @@ public class Boat { * @param abbrev nam abbreviation */ public Boat(String name, String abbrev) { - this.abbrev = abbrev; - this.name = new SimpleStringProperty(name); + this(name, 0, abbrev); + } + + /** + * Returns the position of the end of the boat's wake, which is 180 degrees + * from the boat's heading, and whose length is proportional to the boat's + * speed. + * + * @return GPSCoordinate of wake endpoint. + */ + public GPSCoordinate getWake() { + double reverseHeading = getHeading() - 180; + double distance = wakeScale * getVelocity(); + + GeodeticCalculator calc = new GeodeticCalculator(); + calc.setStartingGeographicPoint( + new Point2D.Double(getCurrentPosition().getLongitude(), getCurrentPosition().getLatitude()) + ); + calc.setDirection(reverseHeading, distance); + Point2D endpoint = calc.getDestinationGeographicPoint(); + return new GPSCoordinate(endpoint.getY(), endpoint.getX()); + } + + /** + * Adds a new point to boat's track. + * @param coordinate of point on track + * @return whether add is successful + * @see seng302.Model.TrackPoint + */ + public boolean addTrackPoint(GPSCoordinate coordinate) { + Boolean added = System.currentTimeMillis() >= nextValidTime; + long currentTime = System.currentTimeMillis(); + if (added && this.started) { + nextValidTime = currentTime + (long) trackPointTimeInterval; + track.add(new TrackPoint(coordinate, currentTime, TRACK_POINT_LIMIT * (long) trackPointTimeInterval)); + } + return added; + } + + /** + * Returns the boat's sampled track between start of race and current time. + * @return queue of track points + * @see seng302.Model.TrackPoint + */ + public Queue getTrack() { + return track; } /** @@ -94,4 +163,67 @@ public class Boat { return abbrev; } + public GPSCoordinate getCurrentPosition() { + return currentPosition; + } + + public void setCurrentPosition(GPSCoordinate currentPosition) { + this.currentPosition = currentPosition; + } + + public double getHeading() { + return heading; + } + + public void setHeading(double heading) { + this.heading = heading; + } + + public Leg getCurrentLeg() { + return currentLeg; + } + + public void setCurrentLeg(Leg currentLeg) { + this.currentLeg = currentLeg; + this.currentLegName.setValue(currentLeg.getName()); + } + + public boolean isFinished() { + return finished; + } + + public void setFinished(boolean finished) { + this.finished = finished; + } + + public long getTimeFinished() { + return timeFinished; + } + + public void setTimeFinished(long timeFinished) { + this.timeFinished = timeFinished; + } + + public StringProperty positionProperty() { + return position; + } + + public void setPosition(String position) { + this.position.set(position); + } + + public boolean isStarted() { + return started; + } + + public void setStarted(boolean started) { + this.started = started; + } + + /** + * @return Name of boat's current leg + */ + public StringProperty getCurrentLegName() { + return currentLegName; + } } diff --git a/visualiser/src/main/java/seng302/Model/BoatInRace.java b/visualiser/src/main/java/seng302/Model/BoatInRace.java index 42d9fcb7..3cc3f8d7 100644 --- a/visualiser/src/main/java/seng302/Model/BoatInRace.java +++ b/visualiser/src/main/java/seng302/Model/BoatInRace.java @@ -35,7 +35,6 @@ public class BoatInRace extends Boat { protected static final float BASE_TRACK_POINT_TIME_INTERVAL = 5000; protected static float trackPointTimeInterval = 5000; // every 1 seconds protected final int TRACK_POINT_LIMIT = 10; - protected boolean trackVisible = true; /** * Constructor method. @@ -309,22 +308,6 @@ public class BoatInRace extends Boat { return track; } - /** - * Returns whether track is visible - * @return true if visible - */ - public boolean isTrackVisible() { - return trackVisible; - } - - /** - * Sets track visibility. - * @param trackVisible visible if true. - */ - public void setTrackVisible(boolean trackVisible) { - this.trackVisible = trackVisible; - } - /** * Get base track point time interval * @return base track point time interval diff --git a/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java b/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java index 84fdab19..47e699b3 100644 --- a/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java +++ b/visualiser/src/main/java/seng302/Model/ConstantVelocityRace.java @@ -1,208 +1,208 @@ -package seng302.Model; - -import org.geotools.referencing.GeodeticCalculator; -import seng302.Constants; -import seng302.Controllers.RaceController; -import seng302.GPSCoordinate; -import seng302.RaceDataSource; - -import java.awt.geom.Point2D; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; - -/** - * Created by cbt24 on 6/03/17. - * - * @deprecated - */ -public class ConstantVelocityRace extends Race { - - private int dnfChance = 0; //%percentage chance a boat fails at each checkpoint - - /** - * Initialiser for a constant velocity race without standard data source - * - * @param startingBoats in race - * @param legs in race - * @param controller for graphics - * @param scaleFactor of timer - */ - public ConstantVelocityRace(List startingBoats, List legs, RaceController controller, int scaleFactor) { - super(startingBoats, legs, controller, scaleFactor); - } - - /** - * Initialiser for legacy tests - * - * @param startingBoats in race - * @param legs in race - * @param controller for graphics - * @param scaleFactor of timer - * - * @deprecated Please use {@link #ConstantVelocityRace(List, List, RaceController, int) } for future tests. - */ - public ConstantVelocityRace(BoatInRace[] startingBoats, List legs, RaceController controller, int scaleFactor) { - super(Arrays.asList(startingBoats), legs, controller, scaleFactor); - } - - /** - * Initialiser for constant velocity race with standard data source - * @param raceData for race - * @param controller for graphics - * @param scaleFactor of timer - */ - public ConstantVelocityRace(RaceDataSource raceData, RaceController controller, int scaleFactor) { - super(raceData, controller, scaleFactor); - } - - public void initialiseBoats() { - Leg officialStart = legs.get(0); - String name = officialStart.getName(); - Marker endMarker = officialStart.getEndMarker(); - - BoatInRace.setTrackPointTimeInterval(BoatInRace.getBaseTrackPointTimeInterval() / scaleFactor); - - ArrayList startMarkers = getSpreadStartingPositions(); - for (int i = 0; i < startingBoats.size(); i++) { - BoatInRace boat = startingBoats.get(i); - if (boat != null) { - boat.setScaledVelocity(boat.getVelocity() * scaleFactor); - Leg startLeg = new Leg(name, 0); - boat.setCurrentPosition(startMarkers.get(i).getAverageGPSCoordinate()); - startLeg.setStartMarker(startMarkers.get(i)); - startLeg.setEndMarker(endMarker); - startLeg.calculateDistance(); - boat.setCurrentLeg(startLeg); - boat.setHeading(boat.calculateHeading()); - } - } - } - - /** - * Creates a list of starting positions for the different boats, so they do not appear cramped at the start line - * - * @return list of starting positions - */ - public ArrayList getSpreadStartingPositions() { - - int nBoats = startingBoats.size(); - Marker marker = legs.get(0).getStartMarker(); - - GeodeticCalculator initialCalc = new GeodeticCalculator(); - initialCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); - initialCalc.setDestinationGeographicPoint(marker.getMark2().getLongitude(), marker.getMark2().getLatitude()); - - double azimuth = initialCalc.getAzimuth(); - double distanceBetweenMarkers = initialCalc.getOrthodromicDistance(); - double distanceBetweenBoats = distanceBetweenMarkers / (nBoats + 1); - - GeodeticCalculator positionCalc = new GeodeticCalculator(); - positionCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); - ArrayList positions = new ArrayList<>(); - - for (int i = 0; i < nBoats; i++) { - positionCalc.setDirection(azimuth, distanceBetweenBoats); - Point2D position = positionCalc.getDestinationGeographicPoint(); - positions.add(new Marker(new GPSCoordinate(position.getY(), position.getX()))); - - positionCalc = new GeodeticCalculator(); - positionCalc.setStartingGeographicPoint(position); - } - return positions; - } - - /** - * Sets the chance each boat has of failing at a gate or marker - * @param chance percentage chance a boat has of failing per checkpoint. - */ - protected void setDnfChance(int chance) { - if (chance >= 0 && chance <= 100) { - dnfChance = chance; - } - } - - protected boolean doNotFinish() { - Random rand = new Random(); - return rand.nextInt(100) < dnfChance; - } - - /** - * Calculates the distance a boat has travelled and updates its current position according to this value. - * - * @param boat to be updated - * @param millisecondsElapsed since last update - */ - protected void updatePosition(BoatInRace boat, int millisecondsElapsed) { - - //distanceTravelled = velocity (nm p hr) * time taken to update loop - double distanceTravelled = (boat.getScaledVelocity() * millisecondsElapsed) / 3600000; - - double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg(); - - boolean finish = boat.getCurrentLeg().getName().equals("Finish"); - if (!finish) { - boat.setHeading(boat.calculateHeading()); - //update boat's distance travelled - boat.setDistanceTravelledInLeg(totalDistanceTravelled); - //Calculate boat's new position by adding the distance travelled onto the start point of the leg - boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartMarker().getAverageGPSCoordinate(), - totalDistanceTravelled, boat.calculateAzimuth())); - } - } - - protected void checkPosition(BoatInRace boat, long timeElapsed) { - if (boat.getDistanceTravelledInLeg() > boat.getCurrentLeg().getDistance()) { - //boat has passed onto new leg - if (boat.getCurrentLeg().getName().equals("Finish")) { - //boat has finished - boatsFinished++; - boat.setFinished(true); - boat.setTimeFinished(timeElapsed); - } else if (doNotFinish()) { - boatsFinished++; - boat.setFinished(true); - boat.setCurrentLeg(new Leg("DNF", -1)); - boat.setVelocity(0); - boat.setScaledVelocity(0); - } else { - //Calculate how much the boat overshot the marker by - boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg() - boat.getCurrentLeg().getDistance()); - //Move boat on to next leg - Leg nextLeg = legs.get(boat.getCurrentLeg().getLegNumber() + 1); - - boat.setCurrentLeg(nextLeg); - //Add overshoot distance into the distance travelled for the next leg - boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg()); - } - //Update the boat display table in the GUI to reflect the leg change - updatePositions(); - } - } - - /** - * Calculates the boats next GPS position based on its distance travelled and heading - * - * @param oldCoordinates GPS coordinates of the boat's starting position - * @param distanceTravelled distance in nautical miles - * @param azimuth boat's current direction. Value between -180 and 180 - * @return The boat's new coordinate - */ - public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { - - //Find new coordinate using current heading and distance - - GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); - //Load start point into calculator - Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); - geodeticCalculator.setStartingGeographicPoint(startPoint); - //load direction and distance tranvelled into calculator - geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); - //get new point - Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); - - return new GPSCoordinate(endPoint.getY(), endPoint.getX()); - } - -} \ No newline at end of file +//package seng302.Model; +// +//import org.geotools.referencing.GeodeticCalculator; +//import seng302.Constants; +//import seng302.Controllers.RaceController; +//import seng302.GPSCoordinate; +//import seng302.RaceDataSource; +// +//import java.awt.geom.Point2D; +//import java.util.ArrayList; +//import java.util.Arrays; +//import java.util.List; +//import java.util.Random; +// +///** +// * Created by cbt24 on 6/03/17. +// * +// * @deprecated +// */ +//public class ConstantVelocityRace extends Race { +// +// private int dnfChance = 0; //%percentage chance a boat fails at each checkpoint +// +// /** +// * Initialiser for a constant velocity race without standard data source +// * +// * @param startingBoats in race +// * @param legs in race +// * @param controller for graphics +// * @param scaleFactor of timer +// */ +// public ConstantVelocityRace(List startingBoats, List legs, RaceController controller, int scaleFactor) { +// super(startingBoats, legs, controller, scaleFactor); +// } +// +// /** +// * Initialiser for legacy tests +// * +// * @param startingBoats in race +// * @param legs in race +// * @param controller for graphics +// * @param scaleFactor of timer +// * +// * @deprecated Please use {@link #ConstantVelocityRace(List, List, RaceController, int) } for future tests. +// */ +// public ConstantVelocityRace(BoatInRace[] startingBoats, List legs, RaceController controller, int scaleFactor) { +// super(Arrays.asList(startingBoats), legs, controller, scaleFactor); +// } +// +// /** +// * Initialiser for constant velocity race with standard data source +// * @param raceData for race +// * @param controller for graphics +// * @param scaleFactor of timer +// */ +// public ConstantVelocityRace(RaceDataSource raceData, RaceController controller, int scaleFactor) { +// super(raceData, controller, scaleFactor); +// } +// +// public void initialiseBoats() { +// Leg officialStart = legs.get(0); +// String name = officialStart.getName(); +// Marker endMarker = officialStart.getEndMarker(); +// +// BoatInRace.setTrackPointTimeInterval(BoatInRace.getBaseTrackPointTimeInterval() / scaleFactor); +// +// ArrayList startMarkers = getSpreadStartingPositions(); +// for (int i = 0; i < startingBoats.size(); i++) { +// BoatInRace boat = startingBoats.get(i); +// if (boat != null) { +// boat.setScaledVelocity(boat.getVelocity() * scaleFactor); +// Leg startLeg = new Leg(name, 0); +// boat.setCurrentPosition(startMarkers.get(i).getAverageGPSCoordinate()); +// startLeg.setStartMarker(startMarkers.get(i)); +// startLeg.setEndMarker(endMarker); +// startLeg.calculateDistance(); +// boat.setCurrentLeg(startLeg); +// boat.setHeading(boat.calculateHeading()); +// } +// } +// } +// +// /** +// * Creates a list of starting positions for the different boats, so they do not appear cramped at the start line +// * +// * @return list of starting positions +// */ +// public ArrayList getSpreadStartingPositions() { +// +// int nBoats = startingBoats.size(); +// Marker marker = legs.get(0).getStartMarker(); +// +// GeodeticCalculator initialCalc = new GeodeticCalculator(); +// initialCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); +// initialCalc.setDestinationGeographicPoint(marker.getMark2().getLongitude(), marker.getMark2().getLatitude()); +// +// double azimuth = initialCalc.getAzimuth(); +// double distanceBetweenMarkers = initialCalc.getOrthodromicDistance(); +// double distanceBetweenBoats = distanceBetweenMarkers / (nBoats + 1); +// +// GeodeticCalculator positionCalc = new GeodeticCalculator(); +// positionCalc.setStartingGeographicPoint(marker.getMark1().getLongitude(), marker.getMark1().getLatitude()); +// ArrayList positions = new ArrayList<>(); +// +// for (int i = 0; i < nBoats; i++) { +// positionCalc.setDirection(azimuth, distanceBetweenBoats); +// Point2D position = positionCalc.getDestinationGeographicPoint(); +// positions.add(new Marker(new GPSCoordinate(position.getY(), position.getX()))); +// +// positionCalc = new GeodeticCalculator(); +// positionCalc.setStartingGeographicPoint(position); +// } +// return positions; +// } +// +// /** +// * Sets the chance each boat has of failing at a gate or marker +// * @param chance percentage chance a boat has of failing per checkpoint. +// */ +// protected void setDnfChance(int chance) { +// if (chance >= 0 && chance <= 100) { +// dnfChance = chance; +// } +// } +// +// protected boolean doNotFinish() { +// Random rand = new Random(); +// return rand.nextInt(100) < dnfChance; +// } +// +// /** +// * Calculates the distance a boat has travelled and updates its current position according to this value. +// * +// * @param boat to be updated +// * @param millisecondsElapsed since last update +// */ +// protected void updatePosition(BoatInRace boat, int millisecondsElapsed) { +// +// //distanceTravelled = velocity (nm p hr) * time taken to update loop +// double distanceTravelled = (boat.getScaledVelocity() * millisecondsElapsed) / 3600000; +// +// double totalDistanceTravelled = distanceTravelled + boat.getDistanceTravelledInLeg(); +// +// boolean finish = boat.getCurrentLeg().getName().equals("Finish"); +// if (!finish) { +// boat.setHeading(boat.calculateHeading()); +// //update boat's distance travelled +// boat.setDistanceTravelledInLeg(totalDistanceTravelled); +// //Calculate boat's new position by adding the distance travelled onto the start point of the leg +// boat.setCurrentPosition(calculatePosition(boat.getCurrentLeg().getStartMarker().getAverageGPSCoordinate(), +// totalDistanceTravelled, boat.calculateAzimuth())); +// } +// } +// +// protected void checkPosition(BoatInRace boat, long timeElapsed) { +// if (boat.getDistanceTravelledInLeg() > boat.getCurrentLeg().getDistance()) { +// //boat has passed onto new leg +// if (boat.getCurrentLeg().getName().equals("Finish")) { +// //boat has finished +// boatsFinished++; +// boat.setFinished(true); +// boat.setTimeFinished(timeElapsed); +// } else if (doNotFinish()) { +// boatsFinished++; +// boat.setFinished(true); +// boat.setCurrentLeg(new Leg("DNF", -1)); +// boat.setVelocity(0); +// boat.setScaledVelocity(0); +// } else { +// //Calculate how much the boat overshot the marker by +// boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg() - boat.getCurrentLeg().getDistance()); +// //Move boat on to next leg +// Leg nextLeg = legs.get(boat.getCurrentLeg().getLegNumber() + 1); +// +// boat.setCurrentLeg(nextLeg); +// //Add overshoot distance into the distance travelled for the next leg +// boat.setDistanceTravelledInLeg(boat.getDistanceTravelledInLeg()); +// } +// //Update the boat display table in the GUI to reflect the leg change +// updatePositions(); +// } +// } +// +// /** +// * Calculates the boats next GPS position based on its distance travelled and heading +// * +// * @param oldCoordinates GPS coordinates of the boat's starting position +// * @param distanceTravelled distance in nautical miles +// * @param azimuth boat's current direction. Value between -180 and 180 +// * @return The boat's new coordinate +// */ +// public static GPSCoordinate calculatePosition(GPSCoordinate oldCoordinates, double distanceTravelled, double azimuth) { +// +// //Find new coordinate using current heading and distance +// +// GeodeticCalculator geodeticCalculator = new GeodeticCalculator(); +// //Load start point into calculator +// Point2D startPoint = new Point2D.Double(oldCoordinates.getLongitude(), oldCoordinates.getLatitude()); +// geodeticCalculator.setStartingGeographicPoint(startPoint); +// //load direction and distance tranvelled into calculator +// geodeticCalculator.setDirection(azimuth, distanceTravelled * Constants.NMToMetersConversion); +// //get new point +// Point2D endPoint = geodeticCalculator.getDestinationGeographicPoint(); +// +// return new GPSCoordinate(endPoint.getY(), endPoint.getX()); +// } +// +//} \ No newline at end of file diff --git a/visualiser/src/main/java/seng302/Model/Race.java b/visualiser/src/main/java/seng302/Model/Race.java index c033c8a3..ed36fc92 100644 --- a/visualiser/src/main/java/seng302/Model/Race.java +++ b/visualiser/src/main/java/seng302/Model/Race.java @@ -21,8 +21,8 @@ import java.util.Random; * Created by fwy13 on 3/03/17. */ public abstract class Race implements Runnable { - //protected BoatInRace[] startingBoats; - protected ObservableList startingBoats; + //protected Boat[] startingBoats; + protected ObservableList startingBoats; protected List legs; protected RaceController controller; protected int boatsFinished = 0; @@ -42,7 +42,7 @@ public abstract class Race implements Runnable { * @param controller race controller * @param scaleFactor for race */ - public Race(List boats, List legs, RaceController controller, int scaleFactor) { + public Race(List boats, List legs, RaceController controller, int scaleFactor) { this.startingBoats = FXCollections.observableArrayList(boats); this.legs = legs; @@ -54,14 +54,21 @@ public abstract class Race implements Runnable { } } - public Race(BoatInRace[] startingBoats, List legs, RaceController controller, int scaleFactor) { - this(Arrays.asList(startingBoats), legs, controller, scaleFactor); - } - public Race(RaceDataSource raceData, RaceController controller, int scaleFactor) { this(raceData.getBoats(), raceData.getLegs(), controller, scaleFactor); } + /** + * @deprecated + * @param startingBoats + * @param legs + * @param controller + * @param scaleFactor + */ + public Race(Boat[] startingBoats, List legs, RaceController controller, int scaleFactor) { + this(Arrays.asList(startingBoats), legs, controller, scaleFactor); + } + public abstract void initialiseBoats(); /** @@ -75,9 +82,9 @@ public abstract class Race implements Runnable { * * @param boat Boat that the postion is to be updated for. * @param timeElapsed Time that has elapse since the start of the the race. - * @see BoatInRace + * @see Boat */ - protected abstract void checkPosition(BoatInRace boat, long timeElapsed); + protected abstract void checkPosition(Boat boat, long timeElapsed); /** * Updates the boat's gps coordinates @@ -85,7 +92,7 @@ public abstract class Race implements Runnable { * @param boat to be updated * @param millisecondsElapsed time since last update */ - protected abstract void updatePosition(BoatInRace boat, int millisecondsElapsed); + protected abstract void updatePosition(Boat boat, int millisecondsElapsed); /** * Runnable for the thread. @@ -189,7 +196,7 @@ public abstract class Race implements Runnable { System.setProperty("javafx.animation.fullspeed", "true"); - for (BoatInRace boat : startingBoats) { + for (Boat boat : startingBoats) { boat.setStarted(true); } @@ -205,7 +212,7 @@ public abstract class Race implements Runnable { if (boatsFinished < startingBoats.size()) { totalTimeElapsed = System.currentTimeMillis() - timeRaceStarted; - for (BoatInRace boat : startingBoats) { + for (Boat boat : startingBoats) { if (boat != null && !boat.isFinished()) { boat.addTrackPoint(boat.getCurrentPosition()); updatePosition(boat, Math.round(1000 / lastFPS) > 20 ? 15 : Math.round(1000 / lastFPS)); @@ -234,7 +241,7 @@ public abstract class Race implements Runnable { */ protected void updatePositions() { FXCollections.sort(startingBoats, (a, b) -> b.getCurrentLeg().getLegNumber() - a.getCurrentLeg().getLegNumber()); - for(BoatInRace boat: startingBoats) { + for(Boat boat: startingBoats) { if(boat != null) { boat.setPosition(Integer.toString(startingBoats.indexOf(boat) + 1)); if (boat.getCurrentLeg().getName().equals("DNF") || boat.getCurrentLeg().getLegNumber() == 0) @@ -253,11 +260,11 @@ public abstract class Race implements Runnable { /** * Returns the boats that have started the race. * - * @return ObservableList of BoatInRace class that participated in the race. + * @return ObservableList of Boat class that participated in the race. * @see ObservableList - * @see BoatInRace + * @see Boat */ - public ObservableList getStartingBoats() { + public ObservableList getStartingBoats() { return startingBoats; } } diff --git a/visualiser/src/main/java/seng302/Model/RaceClock.java b/visualiser/src/main/java/seng302/Model/RaceClock.java index c4ce751d..43013f7b 100644 --- a/visualiser/src/main/java/seng302/Model/RaceClock.java +++ b/visualiser/src/main/java/seng302/Model/RaceClock.java @@ -57,6 +57,7 @@ public class RaceClock { } public String getTimeZone() { + System.out.println(zoneId.toString()); return zoneId.toString(); } diff --git a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java index 66ccb518..dc062c20 100644 --- a/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java +++ b/visualiser/src/main/java/seng302/Model/ResizableRaceCanvas.java @@ -21,12 +21,13 @@ import java.util.List; public class ResizableRaceCanvas extends Canvas { private GraphicsContext gc; private RaceMap map; - private List boats; + private List boats; private boolean raceAnno = true; private boolean annoName = true; private boolean annoAbbrev = true; private boolean annoSpeed = true; private boolean annoPath = true; + private List colours; private List raceBoundaries; private List markers; double[] xpoints = {}, ypoints = {}; @@ -46,6 +47,7 @@ public class ResizableRaceCanvas extends Canvas { this.raceBoundaries = raceData.getBoundary(); this.markers = raceData.getMarkers(); + makeColours(); } /** @@ -53,7 +55,7 @@ public class ResizableRaceCanvas extends Canvas { * * @param boats in race */ - public void setBoats(List boats) { + public void setBoats(List boats) { this.boats = boats; } @@ -81,9 +83,9 @@ public class ResizableRaceCanvas extends Canvas { gc.fillOval(graphCoordinate.getX() - (d / 2), graphCoordinate.getY() - (d / 2), d, d); } - public void displayBoat(BoatInRace boat, double angle) { + public void displayBoat(Boat boat, double angle, Color colour) { GraphCoordinate pos = this.map.convertGPS(boat.getCurrentPosition()); - Paint paint = boat.getColour(); + Paint paint = colour; double[] x = {pos.getX() - 6, pos.getX(), pos.getX() + 6}; double[] y = {pos.getY() + 12, pos.getY() - 12, pos.getY() + 12}; @@ -322,27 +324,29 @@ public class ResizableRaceCanvas extends Canvas { * Draws boats while race in progress, when leg heading is set. */ public void updateBoats() { + int currentColour = 0; // TODO Remove null when boats are ready boats = null; if (boats != null) { - for (BoatInRace boat : boats) { + for (Boat boat : boats) { boolean finished = boat.getCurrentLeg().getName().equals("Finish") || boat.getCurrentLeg().getName().equals("DNF"); boolean isStart = boat.isStarted(); if (!finished && isStart) { - displayBoat(boat, boat.getHeading()); + displayBoat(boat, boat.getHeading(), colours.get(currentColour)); GraphCoordinate wakeFrom = this.map.convertGPS(boat.getCurrentPosition()); GraphCoordinate wakeTo = this.map.convertGPS(boat.getWake()); - displayLine(wakeFrom, wakeTo, boat.getColour()); + displayLine(wakeFrom, wakeTo, colours.get(currentColour)); } else if (!isStart) { - displayBoat(boat, boat.getHeading()); + displayBoat(boat, boat.getHeading(), colours.get(currentColour)); } else { - displayBoat(boat, 0); + displayBoat(boat, 0, colours.get(currentColour)); } if (raceAnno) displayText(boat.toString(), boat.getAbbrev(), boat.getVelocity(), this.map.convertGPS(boat.getCurrentPosition())); - if(boat.isTrackVisible()) drawTrack(boat); + drawTrack(boat, colours.get(currentColour)); + currentColour = (currentColour + 1) % colours.size(); } } } @@ -352,11 +356,11 @@ public class ResizableRaceCanvas extends Canvas { * @param boat whose track is displayed * @see seng302.Model.TrackPoint */ - private void drawTrack(BoatInRace boat) { + private void drawTrack(Boat boat, Color colour) { if (annoPath && raceAnno) { for (TrackPoint point : boat.getTrack()) { GraphCoordinate scaledCoordinate = this.map.convertGPS(point.getCoordinate()); - Color boatColour = boat.getColour(); + Color boatColour = colour; gc.setFill(new Color(boatColour.getRed(), boatColour.getGreen(), boatColour.getBlue(), point.getAlpha())); gc.fillOval(scaledCoordinate.getX(), scaledCoordinate.getY(), 5, 5); } @@ -381,6 +385,20 @@ public class ResizableRaceCanvas extends Canvas { } } + private void makeColours() { + colours = new ArrayList(Arrays.asList( + Color.BLUEVIOLET, + Color.BLACK, + Color.RED, + Color.ORANGE, + Color.DARKOLIVEGREEN, + Color.LIMEGREEN, + Color.PURPLE, + Color.DARKGRAY, + Color.YELLOW + )); + } + /** * Set the Canvas to resizable. * diff --git a/visualiser/src/main/java/seng302/RaceDataSource.java b/visualiser/src/main/java/seng302/RaceDataSource.java index c309661b..8d6a1d1c 100644 --- a/visualiser/src/main/java/seng302/RaceDataSource.java +++ b/visualiser/src/main/java/seng302/RaceDataSource.java @@ -1,5 +1,6 @@ package seng302; +import seng302.Model.Boat; import seng302.Model.BoatInRace; import seng302.Model.Leg; import seng302.Model.Marker; @@ -11,7 +12,7 @@ import java.util.List; * Created by connortaylorbrown on 19/04/17. */ public interface RaceDataSource { - List getBoats(); + List getBoats(); List getLegs(); List getMarkers(); List getBoundary(); diff --git a/visualiser/src/main/java/seng302/RaceXMLReader.java b/visualiser/src/main/java/seng302/RaceXMLReader.java index a3b0dfeb..8be2b022 100644 --- a/visualiser/src/main/java/seng302/RaceXMLReader.java +++ b/visualiser/src/main/java/seng302/RaceXMLReader.java @@ -17,7 +17,7 @@ import java.util.List; * @deprecated use {@link seng302.Mock.StreamedCourseXMLReader} */ public class RaceXMLReader extends XMLReader implements RaceDataSource { - private List boats = new ArrayList<>(); + private List boats = new ArrayList<>(); private Color[] colors = {Color.BLUEVIOLET, Color.BLACK, Color.RED, Color.ORANGE, Color.DARKOLIVEGREEN, Color.LIMEGREEN};//TODO make this established in xml or come up with a better system. private List legs = new ArrayList<>(); private GPSCoordinate mark, startPt1, startPt2, finishPt1, finishPt2, leewardPt1, leewardPt2, windwardPt1, windwardPt2; @@ -269,7 +269,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource { return null; } - public List getBoats() { + public List getBoats() { return boats; } diff --git a/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java b/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java index 76b1953d..3094dad4 100644 --- a/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java +++ b/visualiser/src/test/java/seng302/Model/ConstantVelocityRaceTest.java @@ -1,140 +1,140 @@ -package seng302.Model; - - -import javafx.scene.paint.Color; -import org.geotools.referencing.GeodeticCalculator; -import org.junit.Test; -import seng302.Constants; -import seng302.GPSCoordinate; - -import java.lang.reflect.Array; -import java.util.ArrayList; - -import static org.junit.Assert.assertEquals; - -/** - * Created by esa46 on 16/03/17. - */ -public class ConstantVelocityRaceTest { - - Marker START_MARKER = new Marker(new GPSCoordinate(0, 0)); - Marker END_MARKER = new Marker(new GPSCoordinate(10, 10)); - Leg START_LEG = new Leg("Start", START_MARKER, END_MARKER, 0); - - int ONE_HOUR = 3600000; //1 hour in milliseconds - - - private ArrayList generateLegsArray() { - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - return legs; - } - - @Test - public void updatePositionChangesDistanceTravelled() { - ArrayList legs = generateLegsArray(); - BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt"); - boat.setCurrentLeg(legs.get(0)); - boat.setDistanceTravelledInLeg(0); - BoatInRace[] boats = new BoatInRace[]{boat}; - - ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); - - race.updatePosition(boat, ONE_HOUR); - assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity(), 1e-8); - } - - - @Test - public void updatePositionHandlesNoChangeToDistanceTravelled() { - - ArrayList legs = generateLegsArray(); - BoatInRace boat = new BoatInRace("Test", 0, Color.ALICEBLUE, "tt"); - boat.setCurrentLeg(legs.get(0)); - boat.setDistanceTravelledInLeg(0); - BoatInRace[] boats = new BoatInRace[]{boat}; - - ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); - - race.updatePosition(boat, ONE_HOUR); - assertEquals(boat.getDistanceTravelledInLeg(), 0, 1e-8); - } - - @Test - public void changesToDistanceTravelledAreAdditive() { - - ArrayList legs = generateLegsArray(); - BoatInRace boat = new BoatInRace("Test", 5, Color.ALICEBLUE, "tt"); - boat.setCurrentLeg(legs.get(0)); - boat.setDistanceTravelledInLeg(50); - BoatInRace[] boats = new BoatInRace[]{boat}; - - ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); - - race.updatePosition(boat, ONE_HOUR); - assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity() + 50, 1e-8); - } - - @Test - public void travelling10nmNorthGivesCorrectNewCoordinates() { - GPSCoordinate oldPos = new GPSCoordinate(0, 0); - GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 0); - - GeodeticCalculator calc = new GeodeticCalculator(); - calc.setStartingGeographicPoint(0, 0); - calc.setDirection(0, 10 * Constants.NMToMetersConversion); - - assertEquals(newPos.getLongitude(), 0, 1e-8); - assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); - assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); - } - - - @Test - public void travelling10nmEastGivesCorrectNewCoordinates() { - GPSCoordinate oldPos = new GPSCoordinate(0, 0); - GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 90); - - GeodeticCalculator calc = new GeodeticCalculator(); - calc.setStartingGeographicPoint(0, 0); - calc.setDirection(90, 10 * Constants.NMToMetersConversion); - - - assertEquals(newPos.getLatitude(), 0, 1e-8); - assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); - assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); - } - - - @Test - public void travelling10nmWestGivesCorrectNewCoordinates() { - GPSCoordinate oldPos = new GPSCoordinate(0, 0); - GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, -90); - - GeodeticCalculator calc = new GeodeticCalculator(); - calc.setStartingGeographicPoint(0, 0); - calc.setDirection(-90, 10 * Constants.NMToMetersConversion); - - - assertEquals(newPos.getLatitude(), 0, 1e-8); - assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); - assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); - } - - - @Test - public void travelling10nmSouthGivesCorrectNewCoordinates() { - GPSCoordinate oldPos = new GPSCoordinate(0, 0); - GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 180); - - GeodeticCalculator calc = new GeodeticCalculator(); - calc.setStartingGeographicPoint(0, 0); - calc.setDirection(180, 10 * Constants.NMToMetersConversion); - - - assertEquals(newPos.getLongitude(), 0, 1e-8); - assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); - assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); - } - -} +//package seng302.Model; +// +// +//import javafx.scene.paint.Color; +//import org.geotools.referencing.GeodeticCalculator; +//import org.junit.Test; +//import seng302.Constants; +//import seng302.GPSCoordinate; +// +//import java.lang.reflect.Array; +//import java.util.ArrayList; +// +//import static org.junit.Assert.assertEquals; +// +///** +// * Created by esa46 on 16/03/17. +// */ +//public class ConstantVelocityRaceTest { +// +// Marker START_MARKER = new Marker(new GPSCoordinate(0, 0)); +// Marker END_MARKER = new Marker(new GPSCoordinate(10, 10)); +// Leg START_LEG = new Leg("Start", START_MARKER, END_MARKER, 0); +// +// int ONE_HOUR = 3600000; //1 hour in milliseconds +// +// +// private ArrayList generateLegsArray() { +// ArrayList legs = new ArrayList<>(); +// legs.add(START_LEG); +// return legs; +// } +// +// @Test +// public void updatePositionChangesDistanceTravelled() { +// ArrayList legs = generateLegsArray(); +// BoatInRace boat = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt"); +// boat.setCurrentLeg(legs.get(0)); +// boat.setDistanceTravelledInLeg(0); +// BoatInRace[] boats = new BoatInRace[]{boat}; +// +// ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); +// +// race.updatePosition(boat, ONE_HOUR); +// assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity(), 1e-8); +// } +// +// +// @Test +// public void updatePositionHandlesNoChangeToDistanceTravelled() { +// +// ArrayList legs = generateLegsArray(); +// BoatInRace boat = new BoatInRace("Test", 0, Color.ALICEBLUE, "tt"); +// boat.setCurrentLeg(legs.get(0)); +// boat.setDistanceTravelledInLeg(0); +// BoatInRace[] boats = new BoatInRace[]{boat}; +// +// ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); +// +// race.updatePosition(boat, ONE_HOUR); +// assertEquals(boat.getDistanceTravelledInLeg(), 0, 1e-8); +// } +// +// @Test +// public void changesToDistanceTravelledAreAdditive() { +// +// ArrayList legs = generateLegsArray(); +// BoatInRace boat = new BoatInRace("Test", 5, Color.ALICEBLUE, "tt"); +// boat.setCurrentLeg(legs.get(0)); +// boat.setDistanceTravelledInLeg(50); +// BoatInRace[] boats = new BoatInRace[]{boat}; +// +// ConstantVelocityRace race = new ConstantVelocityRace(boats, legs, null, 1); +// +// race.updatePosition(boat, ONE_HOUR); +// assertEquals(boat.getDistanceTravelledInLeg(), boat.getVelocity() + 50, 1e-8); +// } +// +// @Test +// public void travelling10nmNorthGivesCorrectNewCoordinates() { +// GPSCoordinate oldPos = new GPSCoordinate(0, 0); +// GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 0); +// +// GeodeticCalculator calc = new GeodeticCalculator(); +// calc.setStartingGeographicPoint(0, 0); +// calc.setDirection(0, 10 * Constants.NMToMetersConversion); +// +// assertEquals(newPos.getLongitude(), 0, 1e-8); +// assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); +// assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); +// } +// +// +// @Test +// public void travelling10nmEastGivesCorrectNewCoordinates() { +// GPSCoordinate oldPos = new GPSCoordinate(0, 0); +// GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 90); +// +// GeodeticCalculator calc = new GeodeticCalculator(); +// calc.setStartingGeographicPoint(0, 0); +// calc.setDirection(90, 10 * Constants.NMToMetersConversion); +// +// +// assertEquals(newPos.getLatitude(), 0, 1e-8); +// assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); +// assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); +// } +// +// +// @Test +// public void travelling10nmWestGivesCorrectNewCoordinates() { +// GPSCoordinate oldPos = new GPSCoordinate(0, 0); +// GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, -90); +// +// GeodeticCalculator calc = new GeodeticCalculator(); +// calc.setStartingGeographicPoint(0, 0); +// calc.setDirection(-90, 10 * Constants.NMToMetersConversion); +// +// +// assertEquals(newPos.getLatitude(), 0, 1e-8); +// assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); +// assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); +// } +// +// +// @Test +// public void travelling10nmSouthGivesCorrectNewCoordinates() { +// GPSCoordinate oldPos = new GPSCoordinate(0, 0); +// GPSCoordinate newPos = ConstantVelocityRace.calculatePosition(oldPos, 10, 180); +// +// GeodeticCalculator calc = new GeodeticCalculator(); +// calc.setStartingGeographicPoint(0, 0); +// calc.setDirection(180, 10 * Constants.NMToMetersConversion); +// +// +// assertEquals(newPos.getLongitude(), 0, 1e-8); +// assertEquals(newPos.getLatitude(), calc.getDestinationGeographicPoint().getY(), 1e-8); +// assertEquals(newPos.getLongitude(), calc.getDestinationGeographicPoint().getX(), 1e-8); +// } +// +//} diff --git a/visualiser/src/test/java/seng302/Model/RaceXMLTest.java b/visualiser/src/test/java/seng302/Model/RaceXMLTest.java index 618f2ff4..449c435f 100644 --- a/visualiser/src/test/java/seng302/Model/RaceXMLTest.java +++ b/visualiser/src/test/java/seng302/Model/RaceXMLTest.java @@ -30,7 +30,7 @@ public class RaceXMLTest { try { RaceXMLReader raceXMLReader = new RaceXMLReader("raceXML/bermuda_AC35.xml", false); raceXMLReader.readBoats(); - List boats = raceXMLReader.getBoats(); + List boats = raceXMLReader.getBoats(); assertTrue(boats.size() == 6); //test boat 1 assertEquals(boats.get(0).getName().getValue(), "ORACLE TEAM USA"); From b1bbef814bf4f512f3deeaea899b249878f8faca Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Fri, 28 Apr 2017 12:43:14 +1200 Subject: [PATCH 3/8] Switching to use networking modules #story[778] --- mock/src/main/java/seng302/App.java | 3 +- mock/src/main/java/seng302/Model/Event.java | 107 +----- mock/src/main/java/seng302/Model/Race.java | 67 +--- .../src/test/java/seng302/Model/RaceTest.java | 324 +++++++++--------- .../java/seng302/Networking/MockOutput.java | 2 +- .../seng302/Networking/VisualiserInput.java | 7 +- 6 files changed, 192 insertions(+), 318 deletions(-) diff --git a/mock/src/main/java/seng302/App.java b/mock/src/main/java/seng302/App.java index 5b8c94f4..6801dc71 100644 --- a/mock/src/main/java/seng302/App.java +++ b/mock/src/main/java/seng302/App.java @@ -29,11 +29,10 @@ public class App extends Application { @Override public void start(Stage primaryStage) { try { - OutputStream outputStream = System.out;//TEMP currently using System.out, but should replace this with tcp socket we are sending over. RaceDataSource raceData = new RaceXMLReader("raceXML/bermuda_AC35.xml"); RegattaDataSource regattaData = new RegattaXMLReader("mockXML/regattaTest.xml"); - Event raceEvent = new Event(raceData, regattaData, outputStream); + Event raceEvent = new Event(raceData, regattaData); raceEvent.start(); } catch (IOException e) { e.printStackTrace(); diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index 3e208500..f98f1ccc 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -9,6 +9,7 @@ import seng302.Exceptions.InvalidBoatDataException; import seng302.Exceptions.InvalidRaceDataException; import seng302.Exceptions.InvalidRegattaDataException; import seng302.Networking.MessageEncoders.XMLMessageEncoder; +import seng302.Networking.MockOutput; import seng302.Networking.Utils.XMLMessage; import java.io.IOException; @@ -25,20 +26,21 @@ public class Event { RaceDataSource raceDataSource; RegattaDataSource regattaDataSource; - ///The stream to which we send all data. - private OutputStream outputStream; //Sequence numbers for XML messages. private short regattaXMLSequenceNumber = 0; private short raceXMLSequenceNumber = 0; private short boatXMLSequenceNumber = 0; + MockOutput mockOutput; - - public Event(RaceDataSource raceData, RegattaDataSource regattaData, OutputStream outputStream) { + public Event(RaceDataSource raceData, RegattaDataSource regattaData) { this.raceDataSource = raceData; this.regattaDataSource = regattaData; - this.outputStream = outputStream; - + try { + mockOutput = new MockOutput(); + } catch (IOException e) { + e.printStackTrace(); + } } public void start() { @@ -51,7 +53,7 @@ public class Event { //System.out.println("RACE STARTING!!\n\n");//TEMP REMOVE debug - Race newRace = new Race(raceDataSource, 15, this.outputStream); + Race newRace = new Race(raceDataSource, 15, mockOutput); new Thread((newRace)).start(); } @@ -60,34 +62,9 @@ public class Event { RegattaData regattaData = new RegattaData(regattaDataSource); String xmlString = regattaData.createXML(); - - byte[] xmlStringUTF8 = new byte[0]; - try - { - xmlStringUTF8 = xmlString.getBytes("UTF-8"); - } - catch (UnsupportedEncodingException e) - { - throw new InvalidRegattaDataException(); - } - - //Create XML message object and serialize. - short ackNumber = 1;//TEMP need a more sensible way of getting ack number. Is it per packet type, or per packet? - - XMLMessageEncoder xmlMessageEncoder = new XMLMessageEncoder(ackNumber, System.currentTimeMillis(), XMLMessage.XMLTypeRegatta, getNextRegattaXMLSequenceNumber(), (short) xmlStringUTF8.length, xmlString); - - byte[] serializedMessage = xmlMessageEncoder.encode(); - - //Write it. - try - { - this.outputStream.write(serializedMessage); - } - catch (IOException e) - { - throw new InvalidRegattaDataException(); - } - + System.out.println("working"); + mockOutput.parseXMLString(xmlString, 26); + System.out.println("working"); } @@ -96,66 +73,18 @@ public class Event { RaceData raceData = new RaceData(raceDataSource); //Serialize race data to an XML as a string. String xmlString = raceData.createXML(); - - byte[] xmlStringUTF8 = new byte[0]; - try - { - xmlStringUTF8 = xmlString.getBytes("UTF-8"); - } - catch (UnsupportedEncodingException e) - { - throw new InvalidRaceDataException(); - } - - //Create XML message object and serialize. - short ackNumber = 1;//TEMP need a more sensible way of getting ack number. Is it per packet type, or per packet? - - XMLMessageEncoder xmlMessageEncoder = new XMLMessageEncoder(ackNumber, System.currentTimeMillis(), XMLMessage.XMLTypeRace, getNextRaceXMLSequenceNumber(), (short) xmlStringUTF8.length, xmlString); - - byte[] serializedMessage = xmlMessageEncoder.encode(); - - //Write it. - try - { - this.outputStream.write(serializedMessage); - } - catch (IOException e) - { - throw new InvalidRaceDataException(); - } + System.out.println("working"); + mockOutput.parseXMLString(xmlString, 26); + System.out.println("working"); } public void sendBoatData() throws InvalidBoatDataException { BoatData boatData = new BoatData(raceDataSource.getBoats()); //Serialize race data to an XML as a string. String xmlString = boatData.createXML(); - - byte[] xmlStringUTF8 = new byte[0]; - try - { - xmlStringUTF8 = xmlString.getBytes("UTF-8"); - } - catch (UnsupportedEncodingException e) - { - throw new InvalidBoatDataException(); - } - - //Create XML message object and serialize. - short ackNumber = 1;//TEMP need a more sensible way of getting ack number. Is it per packet type, or per packet? - - XMLMessageEncoder xmlMessageEncoder = new XMLMessageEncoder(ackNumber, System.currentTimeMillis(), XMLMessage.XMLTypeBoat, getNextBoatXMLSequenceNumber(), (short) xmlStringUTF8.length, xmlString); - - byte[] serializedMessage = xmlMessageEncoder.encode(); - - //Write it. - try - { - this.outputStream.write(serializedMessage); - } - catch (IOException e) - { - throw new InvalidBoatDataException(); - } + System.out.println("working"); + mockOutput.parseXMLString(xmlString, 26); + System.out.println("working"); } diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 0049ec82..6e1920c2 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -9,6 +9,7 @@ import seng302.DataInput.RaceDataSource; import SharedModel.*; import seng302.Networking.MessageEncoders.RaceVisionByteEncoder; +import seng302.Networking.MockOutput; import seng302.Networking.Utils.BoatLocationMessage; import java.awt.geom.Point2D; @@ -34,9 +35,7 @@ public class Race implements Runnable { protected int PRERACE_TIME = 120000; //time in milliseconds to pause during pre-race private int lastFPS = 20; private int dnfChance = 0; //percentage chance a boat fails at each checkpoint - - //Outputstream to write messages to. - private OutputStream outputStream; + private MockOutput mockOutput; /** @@ -46,13 +45,13 @@ public class Race implements Runnable { * @param legs Number of marks in order that the boats pass in order to complete the race. * @param scaleFactor for race */ - public Race(List boats, List legs, int scaleFactor, OutputStream outputStream) { + public Race(List boats, List legs, int scaleFactor, MockOutput mockOutput) { this.startingBoats = FXCollections.observableArrayList(boats); this.legs = legs; this.legs.add(new Leg("Finish", this.legs.size())); this.scaleFactor = scaleFactor; - this.outputStream = outputStream; + this.mockOutput = mockOutput; if (startingBoats != null && startingBoats.size() > 0) { @@ -61,8 +60,8 @@ public class Race implements Runnable { } - public Race(RaceDataSource raceData, int scaleFactor, OutputStream outputStream) { - this(raceData.getBoats(), raceData.getLegs(), scaleFactor, outputStream); + public Race(RaceDataSource raceData, int scaleFactor, MockOutput mockOutput) { + this(raceData.getBoats(), raceData.getLegs(), scaleFactor, mockOutput); } /** @@ -94,53 +93,12 @@ public class Race implements Runnable { */ public void run() { initialiseBoats(); - outputHeartbeat(); countdownTimer(); } /** * Starts the heartbeat timer, which sends a heartbeat message every so often (i.e., 5 seconds). */ - public void outputHeartbeat() { - long heartbeatPeriod = 5000; - AnimationTimer heartbeatTimer = new AnimationTimer() { - long currentHeartbeatTime = System.currentTimeMillis(); - long endHeartbeatTime = System.currentTimeMillis() + heartbeatPeriod; - - @Override - public void handle(long now) { - if (currentHeartbeatTime >= endHeartbeatTime) { - endHeartbeatTime = System.currentTimeMillis() + heartbeatPeriod; - - //Update heartbeat value. - heartbeat++; - - //Serialize heartbeat. - byte[] heartBeatMessage = RaceVisionByteEncoder.heartBeat(heartbeat); - - //Write it to stream. - try - { - outputStream.write(heartBeatMessage); - } - catch (IOException e) - {//TODO should probably handle this in a more sensible manner. - e.printStackTrace(); - } - - } - //TODO stop the animation at some point. - /*if (raceFinish) { - System.out.println("Heartbeat stopping"); - stop(); - }*/ - - currentHeartbeatTime = System.currentTimeMillis(); - } - }; - heartbeatTimer.start(); - } - /** * Countdown timer until race starts. Use PRERACE_TIME to set countdown duration. */ @@ -256,18 +214,7 @@ public class Race implements Runnable { //We have finished creating the message. - //Serialize. - byte[] boatLocationMessageSerialized = RaceVisionByteEncoder.boatLocation(boatLocationMessage); - //Write to stream. - - try - { - outputStream.write(boatLocationMessageSerialized); - } - catch (IOException e) - {//TODO should probably handle this in a more sensible manner. - e.printStackTrace(); - } + mockOutput.parseBoatLocation(); } else { diff --git a/mock/src/test/java/seng302/Model/RaceTest.java b/mock/src/test/java/seng302/Model/RaceTest.java index a26e21d0..53c68b4b 100644 --- a/mock/src/test/java/seng302/Model/RaceTest.java +++ b/mock/src/test/java/seng302/Model/RaceTest.java @@ -18,179 +18,179 @@ import static org.junit.Assert.assertTrue; * Created by esa46 on 15/03/17. */ public class RaceTest { - - Leg START_LEG = new Leg("Start", new Marker(new GPSCoordinate(0, 0)), new Marker(new GPSCoordinate(1, 1)), 0); - Leg FINISH_LEG = new Leg("Finish", new Marker(new GPSCoordinate(1, 1)), new Marker(new GPSCoordinate(2, 2)), 0); - - @Ignore - @Test - public void timerCanBeDisabled() { - BoatInRace boat1 = new BoatInRace("Test 1", 10000, Color.ALICEBLUE, "t1", 1); - BoatInRace boat2 = new BoatInRace("Test 2", 10000, Color.BURLYWOOD, "t2", 2); - //BoatInRace[] boats = new BoatInRace[]{boat1, boat2}; - List boats = new ArrayList<>(); - boats.add(boat1); - boats.add(boat2); - - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - legs.add(FINISH_LEG); - - Race race = new Race(boats, legs, 5, System.out); - race.setDnfChance(0); - long timeStarted = System.currentTimeMillis(); - race.run(); - assertTrue(System.currentTimeMillis() - timeStarted < 4000); - } - - @Test - public void checkPositionUpdatesNumberFinishedBoats() { - - BoatInRace finishedBoat = new BoatInRace("Test", 1000, Color.ALICEBLUE, "tt", 1); - finishedBoat.setDistanceTravelledInLeg(500); - - finishedBoat.setCurrentLeg(FINISH_LEG); - - ArrayList boats = new ArrayList<>(); - boats.add(finishedBoat); - - ArrayList legs = new ArrayList<>(); - legs.add(FINISH_LEG); - - Race race = new Race(boats, legs, 1, System.out); - race.setDnfChance(0); - assertEquals(race.boatsFinished, 0); - - - race.checkPosition(finishedBoat, 100000); - assertEquals(race.boatsFinished, 1); - assertEquals(finishedBoat.getTimeFinished(), 100000); - } - - @Test - public void checkPositionDoesntUpdateNumberFinishedBoats() { - - BoatInRace unFinishedBoat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt", 1); - unFinishedBoat.setDistanceTravelledInLeg(0); - - unFinishedBoat.setCurrentLeg(FINISH_LEG); - - ArrayList boats = new ArrayList<>(); - boats.add(unFinishedBoat); - - ArrayList legs = new ArrayList<>(); - legs.add(FINISH_LEG); - - Race race = new Race(boats, legs, 1, System.out); - race.setDnfChance(0); - assertEquals(race.boatsFinished, 0); - - race.checkPosition(unFinishedBoat, 100); - assertEquals(race.boatsFinished, 0); - } - - @Test - public void distanceTravelledBeforeUpdatingLegIsRetained() { - - ArrayList boats = new ArrayList<>(); - - ArrayList legs = new ArrayList<>(); - - legs.add(START_LEG); - legs.add(FINISH_LEG); - - Race race = new Race(boats, legs, 1, System.out); - race.setDnfChance(0); - - BoatInRace unFinishedBoat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt", 1); - unFinishedBoat.setDistanceTravelledInLeg(100); - unFinishedBoat.setCurrentLeg(START_LEG); - - race.checkPosition(unFinishedBoat, 100); - assertEquals(unFinishedBoat.getCurrentLeg().getName(), "Finish"); - assertTrue(unFinishedBoat.getDistanceTravelledInLeg() > 0); - assertTrue(unFinishedBoat.getDistanceTravelledInLeg() < 100); - - } - +// +// Leg START_LEG = new Leg("Start", new Marker(new GPSCoordinate(0, 0)), new Marker(new GPSCoordinate(1, 1)), 0); +// Leg FINISH_LEG = new Leg("Finish", new Marker(new GPSCoordinate(1, 1)), new Marker(new GPSCoordinate(2, 2)), 0); +// // @Ignore // @Test -// public void timerDelaysByHalfSecond() throws InterruptedException { +// public void timerCanBeDisabled() { +// BoatInRace boat1 = new BoatInRace("Test 1", 10000, Color.ALICEBLUE, "t1", 1); +// BoatInRace boat2 = new BoatInRace("Test 2", 10000, Color.BURLYWOOD, "t2", 2); +// //BoatInRace[] boats = new BoatInRace[]{boat1, boat2}; +// List boats = new ArrayList<>(); +// boats.add(boat1); +// boats.add(boat2); +// +// ArrayList legs = new ArrayList<>(); +// legs.add(START_LEG); +// legs.add(FINISH_LEG); +// +// Race race = new Race(boats, legs, 5, System.out); +// race.setDnfChance(0); +// long timeStarted = System.currentTimeMillis(); +// race.run(); +// assertTrue(System.currentTimeMillis() - timeStarted < 4000); +// } +// +// @Test +// public void checkPositionUpdatesNumberFinishedBoats() { +// +// BoatInRace finishedBoat = new BoatInRace("Test", 1000, Color.ALICEBLUE, "tt", 1); +// finishedBoat.setDistanceTravelledInLeg(500); +// +// finishedBoat.setCurrentLeg(FINISH_LEG); +// +// ArrayList boats = new ArrayList<>(); +// boats.add(finishedBoat); +// +// ArrayList legs = new ArrayList<>(); +// legs.add(FINISH_LEG); +// +// Race race = new Race(boats, legs, 1, System.out); +// race.setDnfChance(0); +// assertEquals(race.boatsFinished, 0); +// +// +// race.checkPosition(finishedBoat, 100000); +// assertEquals(race.boatsFinished, 1); +// assertEquals(finishedBoat.getTimeFinished(), 100000); +// } +// +// @Test +// public void checkPositionDoesntUpdateNumberFinishedBoats() { +// +// BoatInRace unFinishedBoat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt", 1); +// unFinishedBoat.setDistanceTravelledInLeg(0); +// +// unFinishedBoat.setCurrentLeg(FINISH_LEG); +// +// ArrayList boats = new ArrayList<>(); +// boats.add(unFinishedBoat); +// +// ArrayList legs = new ArrayList<>(); +// legs.add(FINISH_LEG); +// +// Race race = new Race(boats, legs, 1, System.out); +// race.setDnfChance(0); +// assertEquals(race.boatsFinished, 0); +// +// race.checkPosition(unFinishedBoat, 100); +// assertEquals(race.boatsFinished, 0); +// } +// +// @Test +// public void distanceTravelledBeforeUpdatingLegIsRetained() { // // ArrayList boats = new ArrayList<>(); // // ArrayList legs = new ArrayList<>(); +// // legs.add(START_LEG); +// legs.add(FINISH_LEG); // -// Race race = new Race(boats, legs, 1); -// race.PRERACE_TIME = 500; +// Race race = new Race(boats, legs, 1, System.out); +// race.setDnfChance(0); // -// long timeStarted = System.currentTimeMillis(); -// race.countdownTimer(); +// BoatInRace unFinishedBoat = new BoatInRace("Test", 10, Color.ALICEBLUE, "tt", 1); +// unFinishedBoat.setDistanceTravelledInLeg(100); +// unFinishedBoat.setCurrentLeg(START_LEG); // -// Thread.sleep(500); +// race.checkPosition(unFinishedBoat, 100); +// assertEquals(unFinishedBoat.getCurrentLeg().getName(), "Finish"); +// assertTrue(unFinishedBoat.getDistanceTravelledInLeg() > 0); +// assertTrue(unFinishedBoat.getDistanceTravelledInLeg() < 100); // -// assertTrue(System.currentTimeMillis() - timeStarted > 500); -// //System.out.println(System.currentTimeMillis() - timeStarted); +// } +// +//// @Ignore +//// @Test +//// public void timerDelaysByHalfSecond() throws InterruptedException { +//// +//// ArrayList boats = new ArrayList<>(); +//// +//// ArrayList legs = new ArrayList<>(); +//// legs.add(START_LEG); +//// +//// Race race = new Race(boats, legs, 1); +//// race.PRERACE_TIME = 500; +//// +//// long timeStarted = System.currentTimeMillis(); +//// race.countdownTimer(); +//// +//// Thread.sleep(500); +//// +//// assertTrue(System.currentTimeMillis() - timeStarted > 500); +//// //System.out.println(System.currentTimeMillis() - timeStarted); +//// +//// } +// +// @Test +// public void scalerScalesVelocityCorrectly() { +// +// int scaleFactor = 3; +// float vel1 = 0; +// float vel2 = (float) 1.999; +// float vel3 = (float) 32.5; +// float vel4 = 500; +// BoatInRace boat1 = new BoatInRace("test", vel1, Color.ALICEBLUE, "tt", 1); +// BoatInRace boat2 = new BoatInRace("test", vel2, Color.ALICEBLUE, "tt", 2); +// BoatInRace boat3 = new BoatInRace("test", vel3, Color.ALICEBLUE, "tt", 3); +// BoatInRace boat4 = new BoatInRace("test", vel4, Color.ALICEBLUE, "tt", 4); +// ArrayList boats = new ArrayList<>(); +// boats.add(boat1); +// boats.add(boat2); +// boats.add(boat3); +// boats.add(boat4); +// +// ArrayList legs = new ArrayList<>(); +// legs.add(START_LEG); +// +// Race race = new Race(boats, legs, scaleFactor, System.out); +// race.setDnfChance(0); +// +// assertEquals(race.getStartingBoats().get(0).getScaledVelocity(), vel1 * scaleFactor, 1e-6); +// assertEquals(race.getStartingBoats().get(1).getScaledVelocity(), vel2 * scaleFactor, 1e-6); +// assertEquals(race.getStartingBoats().get(2).getScaledVelocity(), vel3 * scaleFactor, 1e-6); +// assertEquals(race.getStartingBoats().get(3).getScaledVelocity(), vel4 * scaleFactor, 1e-6); +// } +// +// @Test +// public void scalerScalesRaceClockTo1MinCorrectly() { +// int scaleFactor = 10; +// +// ArrayList boats = new ArrayList<>(); +// +// ArrayList legs = new ArrayList<>(); +// legs.add(START_LEG); +// +// Race race = new Race(boats, legs, scaleFactor, System.out); +// race.totalTimeElapsed = 6000; //6 seconds +// assertTrue(race.calcTimer().equals("Race clock: 00:01:00")); +// } +// +// @Test +// public void scalerScalesRaceClockHoursMinutesAndSecondsCorrectly() { +// int scaleFactor = 3; +// +// ArrayList boats = new ArrayList<>(); +// +// ArrayList legs = new ArrayList<>(); +// legs.add(START_LEG); +// +// Race race = new Race(boats, legs, scaleFactor, System.out); +// race.totalTimeElapsed = 3213000; +// assertTrue(race.calcTimer().equals("Race clock: 02:40:39")); // // } - - @Test - public void scalerScalesVelocityCorrectly() { - - int scaleFactor = 3; - float vel1 = 0; - float vel2 = (float) 1.999; - float vel3 = (float) 32.5; - float vel4 = 500; - BoatInRace boat1 = new BoatInRace("test", vel1, Color.ALICEBLUE, "tt", 1); - BoatInRace boat2 = new BoatInRace("test", vel2, Color.ALICEBLUE, "tt", 2); - BoatInRace boat3 = new BoatInRace("test", vel3, Color.ALICEBLUE, "tt", 3); - BoatInRace boat4 = new BoatInRace("test", vel4, Color.ALICEBLUE, "tt", 4); - ArrayList boats = new ArrayList<>(); - boats.add(boat1); - boats.add(boat2); - boats.add(boat3); - boats.add(boat4); - - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - - Race race = new Race(boats, legs, scaleFactor, System.out); - race.setDnfChance(0); - - assertEquals(race.getStartingBoats().get(0).getScaledVelocity(), vel1 * scaleFactor, 1e-6); - assertEquals(race.getStartingBoats().get(1).getScaledVelocity(), vel2 * scaleFactor, 1e-6); - assertEquals(race.getStartingBoats().get(2).getScaledVelocity(), vel3 * scaleFactor, 1e-6); - assertEquals(race.getStartingBoats().get(3).getScaledVelocity(), vel4 * scaleFactor, 1e-6); - } - - @Test - public void scalerScalesRaceClockTo1MinCorrectly() { - int scaleFactor = 10; - - ArrayList boats = new ArrayList<>(); - - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - - Race race = new Race(boats, legs, scaleFactor, System.out); - race.totalTimeElapsed = 6000; //6 seconds - assertTrue(race.calcTimer().equals("Race clock: 00:01:00")); - } - - @Test - public void scalerScalesRaceClockHoursMinutesAndSecondsCorrectly() { - int scaleFactor = 3; - - ArrayList boats = new ArrayList<>(); - - ArrayList legs = new ArrayList<>(); - legs.add(START_LEG); - - Race race = new Race(boats, legs, scaleFactor, System.out); - race.totalTimeElapsed = 3213000; - assertTrue(race.calcTimer().equals("Race clock: 02:40:39")); - - } } diff --git a/network/src/main/java/seng302/Networking/MockOutput.java b/network/src/main/java/seng302/Networking/MockOutput.java index 2f3d2440..600d020e 100644 --- a/network/src/main/java/seng302/Networking/MockOutput.java +++ b/network/src/main/java/seng302/Networking/MockOutput.java @@ -31,7 +31,7 @@ public class MockOutput - MockOutput() throws IOException{ + public MockOutput() throws IOException{ /*******************************Test********************************/ StringBuilder xmlString; diff --git a/network/src/main/java/seng302/Networking/VisualiserInput.java b/network/src/main/java/seng302/Networking/VisualiserInput.java index bb317510..d39c7fad 100644 --- a/network/src/main/java/seng302/Networking/VisualiserInput.java +++ b/network/src/main/java/seng302/Networking/VisualiserInput.java @@ -32,12 +32,11 @@ public class VisualiserInput VisualiserInput() throws IOException{ - //sockets to connect to -// ServerSocket visualiserSocket = new ServerSocket(4942); -// Socket connectionSocket = visualiserSocket.accept(); + ServerSocket visualiserSocket = new ServerSocket(4942); + Socket connectionSocket = visualiserSocket.accept(); //this is the test data that streams form the AC35 website - Socket connectionSocket = new Socket("livedata.americascup.com",4941); +// Socket connectionSocket = new Socket("livedata.americascup.com",4941); //start Time From 39d3cc7c2850c0a4ca4378615b0124a4db568892 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Fri, 28 Apr 2017 12:44:53 +1200 Subject: [PATCH 4/8] Removed boats being able to store colour, this is now down the in the ResizableRaceCanvas. #refactor #story[782] --- .../main/java/seng302/Mock/BoatXMLReader.java | 23 ++----------------- .../main/java/seng302/Mock/StreamedBoat.java | 2 +- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java index 386eb3fa..9a614faa 100644 --- a/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/BoatXMLReader.java @@ -20,8 +20,6 @@ import java.util.*; public class BoatXMLReader extends XMLReader { Map streamedBoatMap = new HashMap<>(); Map participants = new HashMap<>(); - private List colours; - private static int currentColourIndex = 0; /** * Constructor for Boat XML Reader @@ -32,7 +30,6 @@ public class BoatXMLReader extends XMLReader { */ public BoatXMLReader(String filePath) throws IOException, SAXException, ParserConfigurationException, ParseException { this(filePath, false); - makeColours(); } /** @@ -45,7 +42,6 @@ public class BoatXMLReader extends XMLReader { */ public BoatXMLReader(String filePath, boolean read) throws IOException, SAXException, ParserConfigurationException, ParseException { super(filePath); - makeColours(); if (read) { read(); } @@ -82,7 +78,6 @@ public class BoatXMLReader extends XMLReader { Node boat = nBoats.getChildNodes().item(i); if (boat.getNodeName().equals("Boat")) { readSingleBoat(boat); - currentColourIndex = (currentColourIndex + 1) % colours.size(); } } } @@ -109,9 +104,9 @@ public class BoatXMLReader extends XMLReader { if (!streamedBoatMap.containsKey(sourceID)) { if (country != null) { - streamedBoat = new StreamedBoat(sourceID, boatName, colours.get(currentColourIndex), country); + streamedBoat = new StreamedBoat(sourceID, boatName, country); } else { - streamedBoat = new StreamedBoat(sourceID, boatName, colours.get(currentColourIndex), shortName); + streamedBoat = new StreamedBoat(sourceID, boatName, shortName); } streamedBoatMap.put(sourceID, streamedBoat); // Override boat with new boat @@ -133,20 +128,6 @@ public class BoatXMLReader extends XMLReader { // TODO Get relative point before implementing. (GPSposition is based off a relative point). } - private void makeColours() { - colours = new ArrayList(Arrays.asList( - Color.BLUEVIOLET, - Color.BLACK, - Color.RED, - Color.ORANGE, - Color.DARKOLIVEGREEN, - Color.LIMEGREEN, - Color.PURPLE, - Color.DARKGRAY, - Color.YELLOW - )); - } - public void setParticipants(Map participants) { this.participants = participants; } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java index 88b025be..19b27c9f 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedBoat.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedBoat.java @@ -19,7 +19,7 @@ public class StreamedBoat extends Boat { this.velocity = 0; } - public StreamedBoat(int sourceID, String name, Color colour, String abbrev) { + public StreamedBoat(int sourceID, String name, String abbrev) { super(name, abbrev); this.sourceID = sourceID; this.init(); From 3b13f5bac1e01863fc738594b325415813744117 Mon Sep 17 00:00:00 2001 From: hba56 Date: Fri, 28 Apr 2017 13:17:01 +1200 Subject: [PATCH 5/8] swapping sockets so mock is the server rather than visualiser #story[782] --- .../java/seng302/Networking/MockOutput.java | 73 +++++++++++-------- .../seng302/Networking/VisualiserInput.java | 4 +- 2 files changed, 46 insertions(+), 31 deletions(-) diff --git a/network/src/main/java/seng302/Networking/MockOutput.java b/network/src/main/java/seng302/Networking/MockOutput.java index 2f3d2440..3877ccdd 100644 --- a/network/src/main/java/seng302/Networking/MockOutput.java +++ b/network/src/main/java/seng302/Networking/MockOutput.java @@ -18,6 +18,7 @@ public class MockOutput private RaceVisionByteEncoder messageEncoder = new RaceVisionByteEncoder(); //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port + private ServerSocket serverSocket; private Socket mockSocket; private DataOutputStream outToVisualiser; @@ -32,48 +33,60 @@ public class MockOutput MockOutput() throws IOException{ - /*******************************Test********************************/ - StringBuilder xmlString; + /**************sockets*******************/ + //start Time + lastHeartbeatTime = System.currentTimeMillis(); - BufferedReader br = new BufferedReader(new InputStreamReader( - this.getClass().getResourceAsStream(("/raceXML/Regatta.xml")))); - String line; - xmlString = new StringBuilder(); - while((line=br.readLine())!= null){ - xmlString.append(line.trim()); - } +// mockSocket = new Socket("localhost", 4942); + serverSocket = new ServerSocket(4942); +// mockSocket = serverSocket.accept(); - parseXMLString(xmlString.toString(), 5); - /*******************************Test********************************/ - /**************sockets*******************/ - //start Time - lastHeartbeatTime = System.currentTimeMillis(); + //loop that sends + while (true){ + mockSocket = serverSocket.accept(); + outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); - mockSocket = new Socket("localhost", 4942); - outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); + /*******************************Test********************************/ + StringBuilder xmlString; + BufferedReader br = new BufferedReader(new InputStreamReader( + this.getClass().getResourceAsStream(("/raceXML/Regatta.xml")))); - //loop that sends - while(true) - { - //sends a heartbeat every 5 seconds - if (timeSinceHeartbeat() >= 5.00){ - outToVisualiser.write(heartbeat()); - lastHeartbeatTime = System.currentTimeMillis(); + String line; + xmlString = new StringBuilder(); + while((line=br.readLine())!= null){ + xmlString.append(line.trim()); } - //checks the buffer to see if there is anything to send - if (messagesToSendBuffer.size() > 0) { - for (byte[] binaryMessage : messagesToSendBuffer) { - //sends the message to the visualiser - outToVisualiser.write(binaryMessage); + parseXMLString(xmlString.toString(), 5); + + /*******************************Test********************************/ + + while(true) { + try { + //sends a heartbeat every 5 seconds + if (timeSinceHeartbeat() >= 5.00) { + outToVisualiser.write(heartbeat()); + lastHeartbeatTime = System.currentTimeMillis(); + } + + //checks the buffer to see if there is anything to send + if (messagesToSendBuffer.size() > 0) { + for (byte[] binaryMessage : messagesToSendBuffer) { + //sends the message to the visualiser + outToVisualiser.write(binaryMessage); + } + //cleans out buffer + messagesToSendBuffer.clear(); + } + }catch(SocketException e){ + break; } - //cleans out buffer - messagesToSendBuffer.clear(); + } } /**************sockets*******************/ diff --git a/network/src/main/java/seng302/Networking/VisualiserInput.java b/network/src/main/java/seng302/Networking/VisualiserInput.java index bb317510..c507bb43 100644 --- a/network/src/main/java/seng302/Networking/VisualiserInput.java +++ b/network/src/main/java/seng302/Networking/VisualiserInput.java @@ -36,8 +36,10 @@ public class VisualiserInput // ServerSocket visualiserSocket = new ServerSocket(4942); // Socket connectionSocket = visualiserSocket.accept(); + Socket connectionSocket = new Socket(InetAddress.getLocalHost(), 4942); + //this is the test data that streams form the AC35 website - Socket connectionSocket = new Socket("livedata.americascup.com",4941); +// Socket connectionSocket = new Socket("livedata.americascup.com",4941); //start Time From 9c24b0840e4f80ef6592f1f5ccc1bd7877bb7c06 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Fri, 28 Apr 2017 13:18:07 +1200 Subject: [PATCH 6/8] Changed MockInput to thread #story[778} --- mock/src/main/java/seng302/Model/Event.java | 9 +- .../java/seng302/Networking/MockOutput.java | 83 ++++++++++--------- .../seng302/Networking/VisualiserInput.java | 4 +- 3 files changed, 52 insertions(+), 44 deletions(-) diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java index f98f1ccc..f7400c34 100644 --- a/mock/src/main/java/seng302/Model/Event.java +++ b/mock/src/main/java/seng302/Model/Event.java @@ -38,15 +38,16 @@ public class Event { this.regattaDataSource = regattaData; try { mockOutput = new MockOutput(); + new Thread(mockOutput).start(); } catch (IOException e) { e.printStackTrace(); } } public void start() { - //System.out.println("\nREGATTA DATA\n");//TEMP REMOVE debug + System.out.println("\nREGATTA DATA\n");//TEMP REMOVE debug sendRegattaData(); - //System.out.println("\nRACE DATA\n");//TEMP REMOVE debug + System.out.println("\nRACE DATA\n");//TEMP REMOVE debug sendRaceData(); //System.out.println("\nBOAT DATA\n");//TEMP REMOVE debug sendBoatData(); @@ -60,12 +61,10 @@ public class Event { public void sendRegattaData() throws InvalidRegattaDataException { + System.setOut(System.out); RegattaData regattaData = new RegattaData(regattaDataSource); String xmlString = regattaData.createXML(); - System.out.println("working"); mockOutput.parseXMLString(xmlString, 26); - System.out.println("working"); - } diff --git a/network/src/main/java/seng302/Networking/MockOutput.java b/network/src/main/java/seng302/Networking/MockOutput.java index 600d020e..9c0b84c9 100644 --- a/network/src/main/java/seng302/Networking/MockOutput.java +++ b/network/src/main/java/seng302/Networking/MockOutput.java @@ -1,4 +1,5 @@ package seng302.Networking; +import com.sun.xml.internal.bind.v2.runtime.output.SAXOutput; import seng302.Networking.MessageEncoders.RaceVisionByteEncoder; import seng302.Networking.MessageEncoders.XMLMessageEncoder; import seng302.Networking.Utils.BoatLocationMessage; @@ -11,13 +12,13 @@ import java.util.ArrayList; /** * TCP client to recive information from AC35 data source */ -public class MockOutput +public class MockOutput implements Runnable { private long lastHeartbeatTime; private RaceVisionByteEncoder messageEncoder = new RaceVisionByteEncoder(); - //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port + //socket port 4945 as 4940 is ac35 live port and 4941 is ac35 test port private Socket mockSocket; private DataOutputStream outToVisualiser; @@ -25,13 +26,12 @@ public class MockOutput private ArrayList messagesToSendBuffer = new ArrayList<>(); private short messageNumber = 1; - private short xmlSequenceNumber = 1; private int heartbeatSequenceNum = 1; - public MockOutput() throws IOException{ + public MockOutput() throws IOException { /*******************************Test********************************/ StringBuilder xmlString; @@ -40,45 +40,13 @@ public class MockOutput String line; xmlString = new StringBuilder(); - while((line=br.readLine())!= null){ + while ((line = br.readLine()) != null) { xmlString.append(line.trim()); } parseXMLString(xmlString.toString(), 5); - /*******************************Test********************************/ - - /**************sockets*******************/ - //start Time - lastHeartbeatTime = System.currentTimeMillis(); - - - mockSocket = new Socket("localhost", 4942); - outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); - - - //loop that sends - while(true) - { - //sends a heartbeat every 5 seconds - if (timeSinceHeartbeat() >= 5.00){ - outToVisualiser.write(heartbeat()); - lastHeartbeatTime = System.currentTimeMillis(); - } - - //checks the buffer to see if there is anything to send - if (messagesToSendBuffer.size() > 0) { - for (byte[] binaryMessage : messagesToSendBuffer) { - //sends the message to the visualiser - outToVisualiser.write(binaryMessage); - } - //cleans out buffer - messagesToSendBuffer.clear(); - } - } - /**************sockets*******************/ } - /** * calculates the time since last heartbeat * @return time since last heartbeat @@ -126,6 +94,47 @@ public class MockOutput this.messagesToSendBuffer.add(messagesToSendBuffer); } + public void run() { + + try { + /*******************************Test********************************/ + + /**************sockets*******************/ + //start Time + lastHeartbeatTime = System.currentTimeMillis(); + + + mockSocket = new Socket("localhost", 4945); + outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); + + + //loop that sends + while (true) { + //sends a heartbeat every 5 seconds + if (timeSinceHeartbeat() >= 5.00) { + outToVisualiser.write(heartbeat()); + lastHeartbeatTime = System.currentTimeMillis(); + } + + //checks the buffer to see if there is anything to send + if (messagesToSendBuffer.size() > 0) { + for (byte[] binaryMessage : messagesToSendBuffer) { + //sends the message to the visualiser + outToVisualiser.write(binaryMessage); + } + //cleans out buffer + messagesToSendBuffer.clear(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + /**************sockets*******************/ + } + + + public static void main(String argv[]) throws Exception { MockOutput client = new MockOutput(); diff --git a/network/src/main/java/seng302/Networking/VisualiserInput.java b/network/src/main/java/seng302/Networking/VisualiserInput.java index d39c7fad..67a254b5 100644 --- a/network/src/main/java/seng302/Networking/VisualiserInput.java +++ b/network/src/main/java/seng302/Networking/VisualiserInput.java @@ -22,7 +22,7 @@ public class VisualiserInput //time since last heartbeat private long lastHeartbeatTime; - //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port + //socket port 4945 as 4940 is ac35 live port and 4941 is ac35 test port private ServerSocket visualiserSocket; private Socket connectionSocket; @@ -32,7 +32,7 @@ public class VisualiserInput VisualiserInput() throws IOException{ - ServerSocket visualiserSocket = new ServerSocket(4942); + ServerSocket visualiserSocket = new ServerSocket(4945); Socket connectionSocket = visualiserSocket.accept(); //this is the test data that streams form the AC35 website From bbd725d069c33fadac97ef419833f07f0ff6d5b3 Mon Sep 17 00:00:00 2001 From: Joseph Gardner Date: Fri, 28 Apr 2017 13:27:32 +1200 Subject: [PATCH 7/8] Merge --- visualiser/src/main/java/seng302/Mock/StreamedCourse.java | 1 - 1 file changed, 1 deletion(-) diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java index fb46ee81..2b66df3d 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourse.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourse.java @@ -14,7 +14,6 @@ public class StreamedCourse implements RaceDataSource { StreamedCourseXMLReader streamedCourseXMLReader = null; BoatXMLReader boatXMLReader = null; RegattaXMLReader regattaXMLReader = null; - List boundary = new ArrayList<>(); public StreamedCourse(StreamedCourseXMLReader streamedCourseXMLReader) { this.streamedCourseXMLReader = streamedCourseXMLReader; From 214e26ad90f551a08e502467837422a0e098b69d Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Fri, 28 Apr 2017 13:30:19 +1200 Subject: [PATCH 8/8] Switched port back to 4942 #story[778] --- .../src/main/java/seng302/Networking/MockOutput.java | 11 +++-------- .../main/java/seng302/Networking/VisualiserInput.java | 3 --- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/network/src/main/java/seng302/Networking/MockOutput.java b/network/src/main/java/seng302/Networking/MockOutput.java index f533a487..649a8ea4 100644 --- a/network/src/main/java/seng302/Networking/MockOutput.java +++ b/network/src/main/java/seng302/Networking/MockOutput.java @@ -1,8 +1,7 @@ package seng302.Networking; -import com.sun.xml.internal.bind.v2.runtime.output.SAXOutput; + import seng302.Networking.MessageEncoders.RaceVisionByteEncoder; import seng302.Networking.MessageEncoders.XMLMessageEncoder; -import seng302.Networking.Utils.BoatLocationMessage; import seng302.Networking.Utils.MessageType; import java.io.*; @@ -15,7 +14,6 @@ import java.util.ArrayList; public class MockOutput implements Runnable { private long lastHeartbeatTime; - private RaceVisionByteEncoder messageEncoder = new RaceVisionByteEncoder(); //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port @@ -30,17 +28,14 @@ public class MockOutput implements Runnable private short xmlSequenceNumber = 1; private int heartbeatSequenceNum = 1; - - - MockOutput() throws IOException { + public MockOutput() throws IOException { /**************sockets*******************/ //start Time lastHeartbeatTime = System.currentTimeMillis(); -// mockSocket = new Socket("localhost", 4942); serverSocket = new ServerSocket(4942); -// mockSocket = serverSocket.accept(); + } /** diff --git a/network/src/main/java/seng302/Networking/VisualiserInput.java b/network/src/main/java/seng302/Networking/VisualiserInput.java index 224c100d..778c5ca5 100644 --- a/network/src/main/java/seng302/Networking/VisualiserInput.java +++ b/network/src/main/java/seng302/Networking/VisualiserInput.java @@ -32,9 +32,6 @@ public class VisualiserInput VisualiserInput() throws IOException{ - ServerSocket visualiserSocket = new ServerSocket(4945); - Socket connectionSocket = visualiserSocket.accept(); - Socket connectionSocket = new Socket(InetAddress.getLocalHost(), 4942); //this is the test data that streams form the AC35 website