diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index a3d5f49f..99bcb90b 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -63,9 +63,10 @@ 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("localhost", 4949, "RaceStream"); // sr = new StreamReceiver("csse-s302staff.canterbury.ac.nz", 4941, "RaceStream"); - sr = new StreamReceiver("livedata.americascup.com", 4941, "RaceStream"); +// sr = new StreamReceiver("csse-s302staff.canterbury.ac.nz", 4942, "RaceStream"); +// sr = new StreamReceiver("livedata.americascup.com", 4941, "RaceStream"); } sr.start(); diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index 96e719e6..604822db 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -214,7 +214,7 @@ public class CanvasController { for (BoatGroup boatGroup : boatGroups) { // some raceObjects will have multiple ID's (for instance gate marks) //checking if the current "ID" has any updates associated with it - if (StreamParser.boatPositions.containsKey(boatGroup.getRaceId())) { + if (StreamParser.boatLocations.containsKey(boatGroup.getRaceId())) { if (boatGroup.isStopped()) { updateBoatGroup(boatGroup); } @@ -223,7 +223,7 @@ public class CanvasController { } for (MarkGroup markGroup : markGroups) { for (Long id : markGroup.getRaceIds()) { - if (StreamParser.markPositions.containsKey(id)) { + if (StreamParser.markLocations.containsKey(id)) { updateMarkGroup(id, markGroup); } } @@ -240,7 +240,7 @@ public class CanvasController { } private void updateBoatGroup(BoatGroup boatGroup) { - PriorityBlockingQueue movementQueue = StreamParser.boatPositions.get(boatGroup.getRaceId()); + PriorityBlockingQueue movementQueue = StreamParser.boatLocations.get(boatGroup.getRaceId()); // giving the movementQueue a 5 packet buffer to account for slightly out of order packets if (movementQueue.size() > 0){ try { @@ -256,7 +256,7 @@ public class CanvasController { } void updateMarkGroup (long raceId, MarkGroup markGroup) { - PriorityBlockingQueue movementQueue = StreamParser.markPositions.get(raceId); + PriorityBlockingQueue movementQueue = StreamParser.markLocations.get(raceId); if (movementQueue.size() > 0){ try { BoatPositionPacket positionPacket = movementQueue.take(); diff --git a/src/main/java/seng302/controllers/Controller.java b/src/main/java/seng302/controllers/Controller.java index a222cfc3..73b3766b 100644 --- a/src/main/java/seng302/controllers/Controller.java +++ b/src/main/java/seng302/controllers/Controller.java @@ -34,6 +34,6 @@ public class Controller implements Initializable { public void initialize(URL location, ResourceBundle resources) { contentPane.getStylesheets().add(getClass().getResource("/css/master.css").toString()); setContentPane("/views/StartScreenView.fxml"); - StreamParser.boatPositions.clear(); + StreamParser.boatLocations.clear(); } } diff --git a/src/main/java/seng302/controllers/RaceViewController.java b/src/main/java/seng302/controllers/RaceViewController.java index 03b51cfa..363d5fea 100644 --- a/src/main/java/seng302/controllers/RaceViewController.java +++ b/src/main/java/seng302/controllers/RaceViewController.java @@ -67,7 +67,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel @FXML private CanvasController includedCanvasController; - private ArrayList startingBoats = new ArrayList<>(); + private static ArrayList startingBoats = new ArrayList<>(); private boolean displayFps; private Timeline timerTimeline; private Stage stage; @@ -221,7 +221,6 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel } }); - // Adds the new data series to the sparkline (and set the colour of the series) raceSparkLine.setCreateSymbols(false); positions.stream().filter(spark -> !raceSparkLine.getData().contains(spark)).forEach(spark -> { diff --git a/src/main/java/seng302/controllers/StartScreenController.java b/src/main/java/seng302/controllers/StartScreenController.java index 5fe0036c..b2238826 100644 --- a/src/main/java/seng302/controllers/StartScreenController.java +++ b/src/main/java/seng302/controllers/StartScreenController.java @@ -138,7 +138,7 @@ public class StartScreenController implements Initializable { } public void switchToRaceView() { - StreamParser.boatPositions.clear(); + StreamParser.boatLocations.clear(); switchedToRaceView = true; setContentPane("/views/RaceView.fxml"); } diff --git a/src/main/java/seng302/models/Yacht.java b/src/main/java/seng302/models/Yacht.java index c5bdcbb7..1c2fca0b 100644 --- a/src/main/java/seng302/models/Yacht.java +++ b/src/main/java/seng302/models/Yacht.java @@ -6,6 +6,7 @@ import seng302.controllers.RaceViewController; import java.text.DateFormat; import java.text.SimpleDateFormat; +import seng302.models.stream.StreamParser; /** * Yacht class for the racing boat. diff --git a/src/main/java/seng302/models/stream/StreamParser.java b/src/main/java/seng302/models/stream/StreamParser.java index 15b45237..b1be7f18 100644 --- a/src/main/java/seng302/models/stream/StreamParser.java +++ b/src/main/java/seng302/models/stream/StreamParser.java @@ -9,7 +9,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.Date; -import java.util.HashMap; import java.util.Map; import java.util.TimeZone; import java.util.TreeMap; @@ -34,8 +33,8 @@ import seng302.models.stream.packets.StreamPacket; */ public class StreamParser extends Thread { - public static ConcurrentHashMap> markPositions = new ConcurrentHashMap<>(); - public static ConcurrentHashMap> boatPositions = new ConcurrentHashMap<>(); + public static ConcurrentHashMap> markLocations = new ConcurrentHashMap<>(); + public static ConcurrentHashMap> boatLocations = new ConcurrentHashMap<>(); private String threadName; private Thread t; private static boolean newRaceXmlReceived = false; @@ -45,7 +44,7 @@ public class StreamParser extends Thread { private static boolean streamStatus = false; private static long timeSinceStart = -1; private static Map boats = new ConcurrentHashMap<>(); - private static Map boatsPos = new ConcurrentSkipListMap<>(); + private static Map boatsPos = new ConcurrentSkipListMap<>(); private static double windDirection = 0; private static Long currentTimeLong; private static String currentTimeString; @@ -145,6 +144,7 @@ public class StreamParser extends Thread { } } catch (NullPointerException e) { System.out.println("Error parsing packet"); + e.printStackTrace(); } } @@ -218,13 +218,12 @@ public class StreamParser extends Thread { int noBoats = payload[22]; int raceType = payload[23]; - boatsPos = new TreeMap<>(); for (int i = 0; i < noBoats; i++) { long boatStatusSourceID = bytesToLong( Arrays.copyOfRange(payload, 24 + (i * 20), 28 + (i * 20))); Yacht boat = boats.get((int) boatStatusSourceID); boat.setBoatStatus((int) payload[28 + (i * 20)]); - boat.setLegNumber((int) payload[29 + (i * 20)]); + setBoatLegPosition(boat, (int) payload[29 + (i * 20)]); boat.setPenaltiesAwarded((int) payload[30 + (i * 20)]); boat.setPenaltiesServed((int) payload[31 + (i * 20)]); Long estTimeAtNextMark = bytesToLong( @@ -233,6 +232,7 @@ public class StreamParser extends Thread { Long estTimeAtFinish = bytesToLong( Arrays.copyOfRange(payload, 38 + (i * 20), 44 + (i * 20))); boat.setEstimateTimeAtFinish(estTimeAtFinish); +// boatsPos.put(estTimeAtFinish, boat); // String boatStatus = "SourceID: " + boatStatusSourceID; // boatStatus += "\nBoat Status: " + (int)payload[28 + (i * 20)]; // boatStatus += "\nLegNumber: " + (int)payload[29 + (i * 20)]; @@ -242,16 +242,35 @@ public class StreamParser extends Thread { // boatStatus += "\nEstTimeAtFinish: " + bytesToLong(Arrays.copyOfRange(payload,37 + (i * 20),43+ (i * 20))); // boatStatuses.add(boatStatus); } - if (isRaceStarted()) { - int pos = 1; - for (Yacht yacht : boatsPos.values()) { - yacht.setPosition(String.valueOf(pos)); - pos++; - } - } else { - for (Yacht yacht : boatsPos.values()) { - yacht.setPosition("-"); +// if (isRaceStarted()) { +// int pos = 1; +// for (Yacht yacht : boatsPos.values()) { +// yacht.setPosition(String.valueOf(pos)); +// pos++; +// } +// } else { +// for (Yacht yacht : boatsPos.values()) { +// yacht.setPosition("-"); +// } +// } + } + + private static void setBoatLegPosition(Yacht updatingBoat, Integer leg){ + Integer placing = 1; + if (leg != updatingBoat.getLegNumber() && (raceStarted || raceFinished)) { + for (Yacht boat : boats.values()) { + if (boat.getLegNumber() != null && leg <= boat.getLegNumber()){ + placing += 1; + } } + System.out.println("updatingBoat.getBoatName() + = " + updatingBoat.getBoatName() + " " + placing); + updatingBoat.setPosition(placing.toString()); + updatingBoat.setLegNumber(leg); + boatsPos.putIfAbsent(placing, updatingBoat); + boatsPos.replace(placing, updatingBoat); + } else if(updatingBoat.getLegNumber() == null){ + updatingBoat.setPosition("1"); + updatingBoat.setLegNumber(leg); } } @@ -395,9 +414,9 @@ public class StreamParser extends Thread { BoatPositionPacket boatPacket = new BoatPositionPacket(boatId, timeValid, lat, lon, heading, groundSpeed); - //add a new priority que to the boatPositions HashMap - if (!boatPositions.containsKey(boatId)) { - boatPositions.put(boatId, + //add a new priority que to the boatLocations HashMap + if (!boatLocations.containsKey(boatId)) { + boatLocations.put(boatId, new PriorityBlockingQueue<>(256, new Comparator() { @Override public int compare(BoatPositionPacket p1, BoatPositionPacket p2) { @@ -405,14 +424,14 @@ public class StreamParser extends Thread { } })); } - boatPositions.get(boatId).put(boatPacket); + boatLocations.get(boatId).put(boatPacket); } else if (deviceType == 3) { BoatPositionPacket markPacket = new BoatPositionPacket(boatId, timeValid, lat, lon, heading, groundSpeed); - //add a new priority que to the boatPositions HashMap - if (!markPositions.containsKey(boatId)) { - markPositions.put(boatId, + //add a new priority que to the boatLocations HashMap + if (!markLocations.containsKey(boatId)) { + markLocations.put(boatId, new PriorityBlockingQueue<>(256, new Comparator() { @Override public int compare(BoatPositionPacket p1, BoatPositionPacket p2) { @@ -420,7 +439,7 @@ public class StreamParser extends Thread { } })); } - markPositions.get(boatId).put(markPacket); + markLocations.get(boatId).put(markPacket); } } @@ -592,7 +611,8 @@ public class StreamParser extends Thread { * * @return a map of time to finish and boat. */ - public static Map getBoatsPos() { + public static Map getBoatsPos() { + return boatsPos; } diff --git a/src/main/resources/views/RaceView.fxml b/src/main/resources/views/RaceView.fxml index b225ec98..59741514 100644 --- a/src/main/resources/views/RaceView.fxml +++ b/src/main/resources/views/RaceView.fxml @@ -25,7 +25,7 @@