From 081d7e3dcb2f426109963681d34216163e777f38 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Mon, 15 May 2017 14:52:57 +1200 Subject: [PATCH 1/2] Fixed the parsing of bytes being off by one byte in the stream parser fr the race status packet. #story[924] #pair[kre39,zyt10] --- src/main/java/seng302/App.java | 4 +++- src/main/java/seng302/models/Yacht.java | 8 ++++---- src/main/java/seng302/models/parsers/StreamParser.java | 8 ++++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index 1a400afd..60f22080 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -62,7 +62,9 @@ public class App extends Application } //Change the StreamReceiver in this else block to change the default data source. else{ - sr = new StreamReceiver("localhost", 4949, "RaceStream"); + sr = new StreamReceiver("livedata.americascup.com", 4941, "RaceStream"); + +// sr = new StreamReceiver("localhost", 4949, "RaceStream"); } sr.start(); diff --git a/src/main/java/seng302/models/Yacht.java b/src/main/java/seng302/models/Yacht.java index 68970268..31871684 100644 --- a/src/main/java/seng302/models/Yacht.java +++ b/src/main/java/seng302/models/Yacht.java @@ -114,10 +114,10 @@ public class Yacht { this.penaltiesServed = penaltiesServed; } - public Long getEstimateTimeAtNextMark() { -// DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); -// return format.format(estimateTimeAtNextMark); - return estimateTimeAtNextMark; + public String getEstimateTimeAtNextMark() { + DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + return format.format(estimateTimeAtNextMark); +// return estimateTimeAtNextMark; } public void setEstimateTimeAtNextMark(Long estimateTimeAtNextMark) { diff --git a/src/main/java/seng302/models/parsers/StreamParser.java b/src/main/java/seng302/models/parsers/StreamParser.java index deea3184..ab15722b 100644 --- a/src/main/java/seng302/models/parsers/StreamParser.java +++ b/src/main/java/seng302/models/parsers/StreamParser.java @@ -236,11 +236,11 @@ public class StreamParser extends Thread{ Yacht boat = boats.get((int)(long) boatStatusSourceID); boat.setBoatStatus((int)payload[28 + (i * 20)]); boat.setLegNumber((int)payload[29 + (i * 20)]); - boat.setPenaltiesAwarded((int)payload[29 + (i * 20)]); - boat.setPenaltiesServed((int)payload[30 + (i * 20)]); - Long estTimeAtNextMark = bytesToLong(Arrays.copyOfRange(payload,31 + (i * 20),37+ (i * 20))); + boat.setPenaltiesAwarded((int)payload[30 + (i * 20)]); + boat.setPenaltiesServed((int)payload[31 + (i * 20)]); + Long estTimeAtNextMark = bytesToLong(Arrays.copyOfRange(payload,32 + (i * 20),38+ (i * 20))); boat.setEstimateTimeAtNextMark(estTimeAtNextMark); - Long estTimeAtFinish = bytesToLong(Arrays.copyOfRange(payload,37 + (i * 20),43+ (i * 20))); + Long estTimeAtFinish = bytesToLong(Arrays.copyOfRange(payload,38 + (i * 20),44+ (i * 20))); boat.setEstimateTimeAtFinish(estTimeAtFinish); boatsPos.put(estTimeAtFinish, boat); // String boatStatus = "SourceID: " + boatStatusSourceID; From 2e914a7704b0d2fcab297ccfec4f97115075e0c8 Mon Sep 17 00:00:00 2001 From: Zhi You Tan Date: Mon, 15 May 2017 15:49:21 +1200 Subject: [PATCH 2/2] Fixed estimate time to next mark to match acceptance criteria which is countdown in minutes and seconds. #story[924] --- src/main/java/seng302/App.java | 4 ++-- src/main/java/seng302/models/BoatGroup.java | 11 +++++++++-- src/main/java/seng302/models/Yacht.java | 8 ++++---- .../java/seng302/models/parsers/StreamParser.java | 11 +++++++++++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index 60f22080..80163138 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -62,9 +62,9 @@ public class App extends Application } //Change the StreamReceiver in this else block to change the default data source. else{ - sr = new StreamReceiver("livedata.americascup.com", 4941, "RaceStream"); +// sr = new StreamReceiver("livedata.americascup.com", 4941, "RaceStream"); -// sr = new StreamReceiver("localhost", 4949, "RaceStream"); + sr = new StreamReceiver("localhost", 4949, "RaceStream"); } sr.start(); diff --git a/src/main/java/seng302/models/BoatGroup.java b/src/main/java/seng302/models/BoatGroup.java index 1d689c5f..8204a41c 100644 --- a/src/main/java/seng302/models/BoatGroup.java +++ b/src/main/java/seng302/models/BoatGroup.java @@ -8,7 +8,10 @@ import javafx.scene.shape.Polygon; import javafx.scene.text.Text; import javafx.scene.transform.Rotate; import javafx.stage.Stage; +import seng302.models.parsers.StreamParser; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; @@ -86,7 +89,9 @@ public class BoatGroup extends RaceObject{ teamNameObject = new Text(boat.getShortName()); velocityObject = new Text(String.valueOf(boat.getVelocity())); - estTimeToNextMarkObject = new Text(String.valueOf(boat.getEstimateTimeAtNextMark())); + DateFormat format = new SimpleDateFormat("mm:ss"); + String timeToNextMark = format.format(boat.getEstimateTimeAtNextMark() - StreamParser.getCurrentTimeLong()); + estTimeToNextMarkObject = new Text("Next mark: " + timeToNextMark); teamNameObject.setX(TEAMNAME_X_OFFSET); teamNameObject.setY(TEAMNAME_Y_OFFSET); @@ -236,7 +241,9 @@ public class BoatGroup extends RaceObject{ wake.setRotationalVelocity(rotationalVelocity, rotationalGoal, boat.getVelocity()); } velocityObject.setText(String.format("%.2f m/s", boat.getVelocity())); - estTimeToNextMarkObject.setText(String.valueOf(boat.getEstimateTimeAtNextMark())); + DateFormat format = new SimpleDateFormat("mm:ss"); + String timeToNextMark = format.format(boat.getEstimateTimeAtNextMark() - StreamParser.getCurrentTimeLong()); + estTimeToNextMarkObject.setText("Next mark: " + timeToNextMark); } else { setToInitialLocation = true; rotationalGoal = rotation; diff --git a/src/main/java/seng302/models/Yacht.java b/src/main/java/seng302/models/Yacht.java index 31871684..68970268 100644 --- a/src/main/java/seng302/models/Yacht.java +++ b/src/main/java/seng302/models/Yacht.java @@ -114,10 +114,10 @@ public class Yacht { this.penaltiesServed = penaltiesServed; } - public String getEstimateTimeAtNextMark() { - DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); - return format.format(estimateTimeAtNextMark); -// return estimateTimeAtNextMark; + public Long getEstimateTimeAtNextMark() { +// DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); +// return format.format(estimateTimeAtNextMark); + return estimateTimeAtNextMark; } public void setEstimateTimeAtNextMark(Long estimateTimeAtNextMark) { diff --git a/src/main/java/seng302/models/parsers/StreamParser.java b/src/main/java/seng302/models/parsers/StreamParser.java index ab15722b..1aca5826 100644 --- a/src/main/java/seng302/models/parsers/StreamParser.java +++ b/src/main/java/seng302/models/parsers/StreamParser.java @@ -39,6 +39,7 @@ public class StreamParser extends Thread{ private static Map boats = new HashMap<>(); private static Map boatsPos = new TreeMap<>(); private static double windDirection = 0; + private static Long currentTimeLong; private static String currentTimeString; private static boolean appRunning; @@ -199,6 +200,7 @@ public class StreamParser extends Thread{ // System.out.println("raceStatus = " + raceStatus); long expectedStartTime = bytesToLong(Arrays.copyOfRange(payload,12,18)); + currentTimeLong = currentTime; DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); if (xmlObject.getRegattaXML() != null) { format.setTimeZone(TimeZone.getTimeZone(getTimeZoneString())); @@ -575,6 +577,15 @@ public class StreamParser extends Thread{ return boatsPos; } + /** + * returns current time in stream in long + * + * @return a long value of current time + */ + public static Long getCurrentTimeLong() { + return currentTimeLong; + } + public static void appClose(){ appRunning = false; System.out.println("[CLIENT] Shutting down stream parser");