From b58c3b98ede09447dff99004a6ba738cf1ee8659 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Thu, 25 May 2017 12:53:40 +1200 Subject: [PATCH] Integrated changes from story33-estimateTime branch - Used refactored bearing methods - Sent accurate current time to visualiser #story[875] --- mock/src/main/java/seng302/Constants.java | 2 +- mock/src/main/java/seng302/MockOutput.java | 4 ++-- mock/src/main/java/seng302/Model/Boat.java | 9 ++++++++ mock/src/main/java/seng302/Model/Race.java | 23 +++++++++++++++---- .../src/test/java/seng302/Model/RaceTest.java | 2 +- .../Networking/Messages/BoatLocation.java | 4 ++-- .../Networking/Messages/BoatStatus.java | 4 ++-- 7 files changed, 36 insertions(+), 12 deletions(-) diff --git a/mock/src/main/java/seng302/Constants.java b/mock/src/main/java/seng302/Constants.java index ab86b6d4..f6ff1d27 100644 --- a/mock/src/main/java/seng302/Constants.java +++ b/mock/src/main/java/seng302/Constants.java @@ -30,7 +30,7 @@ public class Constants { /** * The race pre-start time, in milliseconds. 3 minutes. */ - public static final long RacePreStartTime = 3 * 60 * 1000; + public static final long RacePreStartTime = 1 * 60 * 1000; /** diff --git a/mock/src/main/java/seng302/MockOutput.java b/mock/src/main/java/seng302/MockOutput.java index 4bb23af1..4e3d9508 100644 --- a/mock/src/main/java/seng302/MockOutput.java +++ b/mock/src/main/java/seng302/MockOutput.java @@ -109,9 +109,9 @@ public class MockOutput implements Runnable * @param heading heading of boat * @param speed speed of boat */ - public synchronized void parseBoatLocation(int sourceID, double lat, double lon, double heading, double speed){ + public synchronized void parseBoatLocation(int sourceID, double lat, double lon, double heading, double speed, long time){ - BoatLocation boatLocation = new BoatLocation(sourceID, lat, lon, boatLocationSequenceNumber, heading, speed); + BoatLocation boatLocation = new BoatLocation(sourceID, lat, lon, boatLocationSequenceNumber, heading, speed, time); //iterates the sequence number boatLocationSequenceNumber++; diff --git a/mock/src/main/java/seng302/Model/Boat.java b/mock/src/main/java/seng302/Model/Boat.java index 7e9fc9b6..1cc95a1e 100644 --- a/mock/src/main/java/seng302/Model/Boat.java +++ b/mock/src/main/java/seng302/Model/Boat.java @@ -81,6 +81,8 @@ public class Boat { */ private long timeSinceTackChange = 0; + private long estimatedTime = 0; + /** * Constructs a boat object with a given sourceID, name, country/team abbreviation, and polars table. @@ -442,4 +444,11 @@ public class Boat { return distanceTravelledMeters; } + public long getEstimatedTime() { + return estimatedTime; + } + + public void setEstimatedTime(long estimatedTime) { + this.estimatedTime = estimatedTime; + } } diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 64e97f74..105de796 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -18,6 +18,8 @@ import java.util.Iterator; import java.util.List; import java.util.Random; +import static java.lang.Math.cos; + /** * Represents a yacht race. @@ -173,7 +175,7 @@ public class Race implements Runnable { */ private void parseIndividualMark(Mark mark) { - this.mockOutput.parseBoatLocation(mark.getSourceID(), mark.getPosition().getLatitude(), mark.getPosition().getLongitude(),0,0); + this.mockOutput.parseBoatLocation(mark.getSourceID(), mark.getPosition().getLatitude(), mark.getPosition().getLongitude(),0,0, totalTimeElapsed+startTime); } @@ -202,7 +204,8 @@ public class Race implements Runnable { boat.getCurrentPosition().getLatitude(), boat.getCurrentPosition().getLongitude(), boat.getBearing().degrees(), - boat.getCurrentSpeed() + boat.getCurrentSpeed(), + startTime + totalTimeElapsed ); } @@ -253,7 +256,7 @@ public class Race implements Runnable { //Add each boat status to the status list. for (Boat boat : boats) { - BoatStatus boatStatus = new BoatStatus(boat.getSourceID(), boat.getStatus(), boat.getCurrentLeg().getLegNumber()); + BoatStatus boatStatus = new BoatStatus(boat.getSourceID(), boat.getStatus(), boat.getCurrentLeg().getLegNumber(), boat.getEstimatedTime()); boatStatuses.add(boatStatus); } @@ -625,7 +628,7 @@ public class Race implements Runnable { //Check the boats position (update leg and stuff). this.checkPosition(boat, totalTimeElapsed); - + this.updateEstimatedTime(boat); } } @@ -899,4 +902,16 @@ public class Race implements Runnable { protected int getWind(){ return windDir; } + + /** + * Updates the boat's estimated time to next mark if positive + * @param boat to estimate time given its velocity + */ + private void updateEstimatedTime(Boat boat) { + double velocityToMark = boat.getCurrentSpeed() * cos(boat.getBearing().radians() - boat.calculateBearingToNextMarker().radians()) / Constants.KnotsToMMPerSecond; + if (velocityToMark > 0) { + long timeFromNow = (long)(1000*boat.calculateDistanceToNextMarker()/velocityToMark); + boat.setEstimatedTime(startTime + totalTimeElapsed + timeFromNow); + } + } } \ No newline at end of file diff --git a/mock/src/test/java/seng302/Model/RaceTest.java b/mock/src/test/java/seng302/Model/RaceTest.java index 7365e320..f1bf440f 100644 --- a/mock/src/test/java/seng302/Model/RaceTest.java +++ b/mock/src/test/java/seng302/Model/RaceTest.java @@ -57,7 +57,7 @@ public class RaceTest{ Race testRace = new Race(raceDataSource, mockOutput); testRace.initialiseBoats(); testRace.countdownTimer.handle(1); - verify(mockOutput, atLeast(boatDataSource.getBoats().size())).parseBoatLocation(anyInt(), anyDouble(), anyDouble(), anyDouble(), anyDouble()); + verify(mockOutput, atLeast(boatDataSource.getBoats().size())).parseBoatLocation(anyInt(), anyDouble(), anyDouble(), anyDouble(), anyDouble(), anyLong()); } catch (ParserConfigurationException | IOException | SAXException | ParseException | StreamedCourseXMLException e) { e.printStackTrace(); diff --git a/network/src/main/java/seng302/Networking/Messages/BoatLocation.java b/network/src/main/java/seng302/Networking/Messages/BoatLocation.java index 9cb0bc78..5e8c9914 100644 --- a/network/src/main/java/seng302/Networking/Messages/BoatLocation.java +++ b/network/src/main/java/seng302/Networking/Messages/BoatLocation.java @@ -152,11 +152,11 @@ public class BoatLocation extends AC35Data { this.rudderAngle = rudderAngle; } - public BoatLocation(int sourceID, double lat, double lon, long sequenceNumber, double heading, double boatSpeed) { + public BoatLocation(int sourceID, double lat, double lon, long sequenceNumber, double heading, double boatSpeed, long time) { super(MessageType.BOATLOCATION); this.messageVersionNumber = (byte) 1; - this.time = System.currentTimeMillis(); + this.time = time; this.sourceID = sourceID; this.sequenceNumber = sequenceNumber; this.deviceType = 1; diff --git a/network/src/main/java/seng302/Networking/Messages/BoatStatus.java b/network/src/main/java/seng302/Networking/Messages/BoatStatus.java index dacb5d5e..291bc50b 100644 --- a/network/src/main/java/seng302/Networking/Messages/BoatStatus.java +++ b/network/src/main/java/seng302/Networking/Messages/BoatStatus.java @@ -27,14 +27,14 @@ public class BoatStatus { } - public BoatStatus(int sourceID, BoatStatusEnum boatStatusEnum, int legNum) { + public BoatStatus(int sourceID, BoatStatusEnum boatStatusEnum, int legNum, long estTimeAtNextMark) { this.sourceID = sourceID; this.boatStatus = boatStatusEnum.getValue(); this.legNumber = ByteConverter.intToBytes(legNum)[0]; this.numPenaltiesAwarded = 0; this.numPenaltiesServed = 0; this.estTimeAtFinish = 0; - this.estTimeAtNextMark = 0; + this.estTimeAtNextMark = estTimeAtNextMark; }