diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index ac264db6..28d7e923 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -63,7 +63,7 @@ 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("csse-s302staff.canterbury.ac.nz", 4941, "RaceStream"); } sr.start(); diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index ff7a294f..c7fbcb6e 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -1,6 +1,11 @@ package seng302.controllers; -import javafx.animation.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.PriorityBlockingQueue; +import javafx.animation.AnimationTimer; import javafx.beans.property.SimpleDoubleProperty; import javafx.fxml.FXML; import javafx.geometry.Point2D; @@ -10,15 +15,18 @@ import javafx.scene.canvas.GraphicsContext; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import javafx.scene.text.Font; -import seng302.models.*; -import seng302.models.mark.*; +import seng302.models.BoatGroup; +import seng302.models.Colors; +import seng302.models.Yacht; +import seng302.models.mark.GateMark; +import seng302.models.mark.Mark; +import seng302.models.mark.MarkGroup; +import seng302.models.mark.MarkType; +import seng302.models.mark.SingleMark; import seng302.models.stream.StreamParser; -import seng302.models.stream.packets.BoatPositionPacket; import seng302.models.stream.XMLParser; import seng302.models.stream.XMLParser.RaceXMLObject.Limit; -import seng302.models.mark.Mark; -import java.util.*; -import java.util.concurrent.PriorityBlockingQueue; +import seng302.models.stream.packets.BoatPositionPacket; /** * Created by ptg19 on 15/03/17. @@ -96,6 +104,7 @@ public class CanvasController { // TODO: 1/05/17 wmu16 - Change this call to now draw the marks as from the xml initializeBoats(); + initializeMarks(); timer = new AnimationTimer() { @Override @@ -179,8 +188,8 @@ public class CanvasController { boatGroup.move(); } for (MarkGroup markGroup : markGroups) { - for (int id : markGroup.getRaceIds()) { - if (StreamParser.boatPositions.containsKey(id)) { + for (long id : markGroup.getRaceIds()) { + if (StreamParser.markPositions.containsKey(id)) { UpdateMarkGroup(id, markGroup); } } @@ -214,8 +223,8 @@ public class CanvasController { } } - void UpdateMarkGroup (int raceId, MarkGroup markGroup) { - PriorityBlockingQueue movementQueue = StreamParser.boatPositions.get(raceId); + void UpdateMarkGroup (long raceId, MarkGroup markGroup) { + PriorityBlockingQueue movementQueue = StreamParser.markPositions.get(raceId); if (movementQueue.size() > 0){ try { BoatPositionPacket positionPacket = movementQueue.take(); @@ -244,6 +253,26 @@ public class CanvasController { group.getChildren().addAll(boatGroups); } + private void initializeMarks() { + Map allMarks = StreamParser.getXmlObject().getRaceXML().getCompoundMarks(); + + for (Mark mark : allMarks.values()) { + if (mark.getMarkType() == MarkType.SINGLE_MARK) { + SingleMark sMark = (SingleMark) mark; + + MarkGroup markGroup = new MarkGroup(mark, findScaledXY(sMark)); + markGroups.add(markGroup); + } else { + GateMark gMark = (GateMark) mark; + + MarkGroup markGroup = new MarkGroup(mark, findScaledXY(gMark.getSingleMark1()), + findScaledXY(gMark.getSingleMark2())); //should be 2 objects in the list. + markGroups.add(markGroup); + } + } + group.getChildren().addAll(markGroups); + } + class ResizableCanvas extends Canvas { ResizableCanvas() { diff --git a/src/main/java/seng302/models/mark/Mark.java b/src/main/java/seng302/models/mark/Mark.java index ce5a6f4a..1ca1f608 100644 --- a/src/main/java/seng302/models/mark/Mark.java +++ b/src/main/java/seng302/models/mark/Mark.java @@ -10,7 +10,7 @@ public abstract class Mark { private MarkType markType; private double latitude; private double longitude; - private int id; + private long id; /** * Create a mark instance by passing its name and type @@ -125,7 +125,7 @@ public abstract class Mark { return longitude; } - public int getId() { + public long getId() { return id; } diff --git a/src/main/java/seng302/models/mark/MarkGroup.java b/src/main/java/seng302/models/mark/MarkGroup.java index 0e886abc..bdd1491d 100644 --- a/src/main/java/seng302/models/mark/MarkGroup.java +++ b/src/main/java/seng302/models/mark/MarkGroup.java @@ -1,14 +1,12 @@ package seng302.models.mark; +import java.util.ArrayList; +import java.util.List; import javafx.geometry.Point2D; import javafx.scene.Group; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; -import javafx.scene.transform.Rotate; - -import java.util.ArrayList; -import java.util.List; /** * Created by CJIRWIN on 26/04/2017. @@ -72,7 +70,7 @@ public class MarkGroup extends Group { } } - public void moveMarkTo (double x, double y, int raceId) + public void moveMarkTo (double x, double y, long raceId) { if (mainMark.getMarkType() == MarkType.SINGLE_MARK) { Circle markCircle = (Circle) super.getChildren().get(0); @@ -104,8 +102,8 @@ public class MarkGroup extends Group { return false; } - public int[] getRaceIds () { - int[] idArray = new int[marks.size()]; + public long[] getRaceIds () { + long[] idArray = new long[marks.size()]; int i = 0; for (Mark mark : marks) idArray[i++] = mark.getId(); diff --git a/src/main/java/seng302/models/stream/StreamParser.java b/src/main/java/seng302/models/stream/StreamParser.java index f7093306..0b685da2 100644 --- a/src/main/java/seng302/models/stream/StreamParser.java +++ b/src/main/java/seng302/models/stream/StreamParser.java @@ -1,6 +1,23 @@ package seng302.models.stream; +import java.io.IOException; +import java.io.StringReader; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.Map; +import java.util.TimeZone; +import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.PriorityBlockingQueue; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -8,19 +25,6 @@ import seng302.models.Yacht; import seng302.models.stream.packets.BoatPositionPacket; import seng302.models.stream.packets.StreamPacket; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import java.io.IOException; -import java.io.StringReader; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentSkipListMap; -import java.util.concurrent.PriorityBlockingQueue; -import seng302.models.stream.XMLParser; - /** * The purpose of this class is to take in the stream of divided packets so they can be read * and parsed in by turning the byte arrays into useful data. There are two public static hashmaps @@ -29,6 +33,7 @@ import seng302.models.stream.XMLParser; */ public class StreamParser extends Thread{ + public static ConcurrentHashMap> markPositions = new ConcurrentHashMap<>(); public static ConcurrentHashMap> boatPositions = new ConcurrentHashMap<>(); private String threadName; private Thread t; @@ -400,6 +405,20 @@ public class StreamParser extends Thread{ })); } boatPositions.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, + new PriorityBlockingQueue<>(256, new Comparator() { + @Override + public int compare(BoatPositionPacket p1, BoatPositionPacket p2) { + return (int) (p1.getTimeValid() - p2.getTimeValid()); + } + })); + } + markPositions.get(boatId).put(markPacket); } } diff --git a/src/main/java/seng302/models/stream/XMLParser.java b/src/main/java/seng302/models/stream/XMLParser.java index 43595cea..53bb0889 100644 --- a/src/main/java/seng302/models/stream/XMLParser.java +++ b/src/main/java/seng302/models/stream/XMLParser.java @@ -1,6 +1,9 @@ package seng302.models.stream; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -9,10 +12,6 @@ import seng302.models.Yacht; import seng302.models.mark.GateMark; import seng302.models.mark.Mark; import seng302.models.mark.MarkType; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; import seng302.models.mark.SingleMark; /** @@ -349,7 +348,6 @@ public class XMLParser { } } - System.out.println(marksList.size()); if (marksList.size() == 1) { return marksList.get(0); } else if (marksList.size() == 2) {