From 1d28334346402d66e63aa1c7cc7d4a7116d9ae94 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Sat, 29 Apr 2017 20:10:39 +1200 Subject: [PATCH] Removed the parser from queing packets incorrectly. Used the marker boat location packets to get the live updates of the marker positions and implemented the markers being updated much like the boats currently are. This means the course more closely resembles the actual intended course design. #story[820] --- src/main/java/seng302/models/BoatGroup.java | 1 + src/main/java/seng302/models/mark/Mark.java | 4 +- .../java/seng302/models/mark/MarkGroup.java | 103 +++++++++++------- .../java/seng302/models/mark/SingleMark.java | 9 +- .../seng302/models/parsers/CourseParser.java | 3 +- .../seng302/models/parsers/StreamParser.java | 32 +++--- src/main/resources/config/course.xml | 9 ++ src/test/java/seng302/EventTest.java | 4 +- .../java/seng302/models/mark/MarkTest.java | 4 +- 9 files changed, 103 insertions(+), 66 deletions(-) diff --git a/src/main/java/seng302/models/BoatGroup.java b/src/main/java/seng302/models/BoatGroup.java index a262e61d..0cdb6d82 100644 --- a/src/main/java/seng302/models/BoatGroup.java +++ b/src/main/java/seng302/models/BoatGroup.java @@ -148,6 +148,7 @@ public class BoatGroup extends RaceObject{ public void setDestination (double newXValue, double newYValue, double rotation, int... raceIds) { destinationSet = true; boat.setVelocity(StreamParser.boatSpeeds.get((long)boat.getId())); + velocityObject.setText(String.valueOf(boat.getVelocity())); if (hasRaceId(raceIds)) { this.pixelVelocityX = (newXValue - boatPoly.getLayoutX()) / expectedUpdateInterval; this.pixelVelocityY = (newYValue - boatPoly.getLayoutY()) / expectedUpdateInterval; diff --git a/src/main/java/seng302/models/mark/Mark.java b/src/main/java/seng302/models/mark/Mark.java index 2c086b80..a32ba20f 100644 --- a/src/main/java/seng302/models/mark/Mark.java +++ b/src/main/java/seng302/models/mark/Mark.java @@ -17,10 +17,10 @@ public abstract class Mark { * @param name the name of the mark * @param markType the type of mark. either GATE_MARK or SINGLE_MARK. */ - public Mark (String name, MarkType markType) { + public Mark (String name, MarkType markType, int id) { this.name = name; this.markType = markType; - id = 0; + this.id = id; } public Mark(String name, MarkType markType, double latitude, double longitude) { diff --git a/src/main/java/seng302/models/mark/MarkGroup.java b/src/main/java/seng302/models/mark/MarkGroup.java index ab189034..6c36cb43 100644 --- a/src/main/java/seng302/models/mark/MarkGroup.java +++ b/src/main/java/seng302/models/mark/MarkGroup.java @@ -39,6 +39,9 @@ public class MarkGroup extends RaceObject { System.out.println("HERE ARE THE CHILDREN LOL"); if (mark.getMarkType() == MarkType.SINGLE_MARK) { super.getChildren().add(new Circle(0, 0, MARK_RADIUS, color)); + nodeDestinations = new Point2D[]{ + new Point2D(super.getChildren().get(0).getLayoutX() + , super.getChildren().get(0).getLayoutY())}; } else { marks.add(((GateMark) mark).getSingleMark1()); marks.add(((GateMark) mark).getSingleMark2()); @@ -96,6 +99,7 @@ public class MarkGroup extends RaceObject { setDestinationGroup(x, y); childrenIndex++; } + updateChildren(); } @@ -105,9 +109,13 @@ public class MarkGroup extends RaceObject { this.nodeDestinations[childIndex] = new Point2D(relativeX, relativeY); this.nodePixelVelocitiesX[childIndex] = (relativeX - super.getChildren().get(childIndex).getLayoutX()) / expectedUpdateInterval; this.nodePixelVelocitiesY[childIndex] = (relativeY - super.getChildren().get(childIndex).getLayoutY()) / expectedUpdateInterval; + } private void setDestinationGroup (double x, double y) { + double relativeX = x - super.getLayoutX(); + double relativeY = y - super.getLayoutY(); + this.nodeDestinations[0] = new Point2D(relativeX, relativeY); pixelVelocityX = (x - super.getLayoutX()) / expectedUpdateInterval; pixelVelocityY = (y - super.getLayoutY()) / expectedUpdateInterval; } @@ -119,11 +127,11 @@ public class MarkGroup extends RaceObject { } public void updatePosition (long timeInterval) { - double x = pixelVelocityX * timeInterval; - double y = pixelVelocityY * timeInterval; - double rotation = rotationalVelocity * timeInterval; - moveGroupBy(x, y, rotation); - updateChildren(timeInterval); +// double x = pixelVelocityX * timeInterval; +// double y = pixelVelocityY * timeInterval; +// double rotation = rotationalVelocity * timeInterval; +// moveGroupBy(x, y, rotation); +// updateChildren(timeInterval); } public void moveGroupBy (double x, double y, double rotation) { @@ -132,42 +140,59 @@ public class MarkGroup extends RaceObject { rotateTo(rotation); } - private void updateChildren (double timeInterval) { + private void updateChildren () { + if (mainMark.getMarkType() != MarkType.SINGLE_MARK) { + Line line = (Line) super.getChildren().get(2); + for (int childIndex = 0; childIndex < 2; childIndex++){ + Circle mark = (Circle) super.getChildren().get(childIndex); + Point2D dest = nodeDestinations[childIndex]; + mark.setCenterY(dest.getY()); + mark.setCenterX(dest.getX()); + } + line.setStartX(nodeDestinations[0].getX()); + line.setStartY(nodeDestinations[0].getY()); + line.setEndX(nodeDestinations[1].getX()); + line.setEndY(nodeDestinations[1].getY()); +// Circle mark = (Circle) super.getChildren().get(0); +// if (nodePixelVelocitiesX[0] > 0 && mark.getLayoutX() >= nodeDestinations[0].getX()) { +// nodePixelVelocitiesX[0] = 0; +// } else if (nodePixelVelocitiesX[0] < 0 && mark.getLayoutX() <= nodeDestinations[0].getX()) { +// nodePixelVelocitiesX[0] = 0; +// } else { +// mark.setLayoutX(mark.getLayoutX() + nodePixelVelocitiesX[0] * timeInterval); +// mark.setLayoutY(mark.getLayoutY() + nodePixelVelocitiesY[0] * timeInterval); +// } +// if (nodePixelVelocitiesY[0] >= 0 && mark.getLayoutY() > nodeDestinations[0].getY()) { +// nodePixelVelocitiesY[0] = 0; +// } else if (nodePixelVelocitiesY[0] < 0 && mark.getLayoutY() <= nodeDestinations[0].getY()) { +// nodePixelVelocitiesY[0] = 0; +// } else { +// mark.setLayoutX(mark.getLayoutX() + nodePixelVelocitiesX[0] * timeInterval); +// mark.setLayoutY(mark.getLayoutY() + nodePixelVelocitiesY[0] * timeInterval); +// } +// mark = (Circle) super.getChildren().get(1); +// if (nodePixelVelocitiesX[1] > 0 && mark.getLayoutX() >= nodeDestinations[1].getX()) { +// nodePixelVelocitiesX[1] = 0; +// } else if (nodePixelVelocitiesX[1] < 0 && mark.getLayoutX() <= nodeDestinations[1].getX()) { +// nodePixelVelocitiesX[1] = 0; +// } else { +// mark.setLayoutX(mark.getLayoutX() + nodePixelVelocitiesX[1] * timeInterval); +// mark.setLayoutY(mark.getLayoutY() + nodePixelVelocitiesY[1] * timeInterval); +// } +// if (nodePixelVelocitiesY[1] >= 0 && mark.getLayoutY() > nodeDestinations[1].getY()) { +// nodePixelVelocitiesY[1] = 0; +// } else if (nodePixelVelocitiesY[1] < 0 && mark.getLayoutY() <= nodeDestinations[1].getY()) { +// nodePixelVelocitiesY[1] = 0; +// } else { +// mark.setLayoutX(mark.getLayoutX() + nodePixelVelocitiesX[1] * timeInterval); +// mark.setLayoutY(mark.getLayoutY() + nodePixelVelocitiesY[1] * timeInterval); +// } + } else { Circle mark = (Circle) super.getChildren().get(0); - if (nodePixelVelocitiesX[0] > 0 && mark.getLayoutX() >= nodeDestinations[0].getX()) { - nodePixelVelocitiesX[0] = 0; - } else if (nodePixelVelocitiesX[0] < 0 && mark.getLayoutX() <= nodeDestinations[0].getX()) { - nodePixelVelocitiesX[0] = 0; - } else { - mark.setLayoutX(mark.getLayoutX() + nodePixelVelocitiesX[0] * timeInterval); - mark.setLayoutY(mark.getLayoutY() + nodePixelVelocitiesY[0] * timeInterval); - } - if (nodePixelVelocitiesY[0] >= 0 && mark.getLayoutY() > nodeDestinations[0].getY()) { - nodePixelVelocitiesY[0] = 0; - } else if (nodePixelVelocitiesY[0] < 0 && mark.getLayoutY() <= nodeDestinations[0].getY()) { - nodePixelVelocitiesY[0] = 0; - } else { - mark.setLayoutX(mark.getLayoutX() + nodePixelVelocitiesX[0] * timeInterval); - mark.setLayoutY(mark.getLayoutY() + nodePixelVelocitiesY[0] * timeInterval); - } - mark = (Circle) super.getChildren().get(1); - if (nodePixelVelocitiesX[1] > 0 && mark.getLayoutX() >= nodeDestinations[1].getX()) { - nodePixelVelocitiesX[1] = 0; - } else if (nodePixelVelocitiesX[1] < 0 && mark.getLayoutX() <= nodeDestinations[1].getX()) { - nodePixelVelocitiesX[1] = 0; - } else { - mark.setLayoutX(mark.getLayoutX() + nodePixelVelocitiesX[1] * timeInterval); - mark.setLayoutY(mark.getLayoutY() + nodePixelVelocitiesY[1] * timeInterval); - } - if (nodePixelVelocitiesY[1] >= 0 && mark.getLayoutY() > nodeDestinations[1].getY()) { - nodePixelVelocitiesY[1] = 0; - } else if (nodePixelVelocitiesY[1] < 0 && mark.getLayoutY() <= nodeDestinations[1].getY()) { - nodePixelVelocitiesY[1] = 0; - } else { - mark.setLayoutX(mark.getLayoutX() + nodePixelVelocitiesX[1] * timeInterval); - mark.setLayoutY(mark.getLayoutY() + nodePixelVelocitiesY[1] * timeInterval); - } + Point2D dest = nodeDestinations[0]; + mark.setCenterY(dest.getY()); + mark.setCenterX(dest.getX()); } } diff --git a/src/main/java/seng302/models/mark/SingleMark.java b/src/main/java/seng302/models/mark/SingleMark.java index 81f6f0b4..d4b4f3f2 100644 --- a/src/main/java/seng302/models/mark/SingleMark.java +++ b/src/main/java/seng302/models/mark/SingleMark.java @@ -9,6 +9,7 @@ public class SingleMark extends Mark { private double lat; private double lon; private String name; + private int id; /** @@ -18,10 +19,11 @@ public class SingleMark extends Mark { * @param lat, the latitude of the marker * @param lon, the longitude of the marker */ - public SingleMark(String name, double lat, double lon) { - super(name, MarkType.SINGLE_MARK); + public SingleMark(String name, double lat, double lon, int id) { + super(name, MarkType.SINGLE_MARK, id); this.lat = lat; this.lon = lon; + this.id = id; } /** @@ -30,9 +32,10 @@ public class SingleMark extends Mark { * @param name, the name of the marker */ public SingleMark(String name) { - super(name, MarkType.SINGLE_MARK); + super(name, MarkType.SINGLE_MARK, 0); this.lat = 0; this.lon = 0; + this.id = 0; } public double getLatitude() { diff --git a/src/main/java/seng302/models/parsers/CourseParser.java b/src/main/java/seng302/models/parsers/CourseParser.java index 04a40e0a..ae7f7856 100644 --- a/src/main/java/seng302/models/parsers/CourseParser.java +++ b/src/main/java/seng302/models/parsers/CourseParser.java @@ -35,7 +35,8 @@ public class CourseParser extends FileParser { String name = element.getElementsByTagName("name").item(0).getTextContent(); double lat = Double.valueOf(element.getElementsByTagName("latitude").item(0).getTextContent()); double lon = Double.valueOf(element.getElementsByTagName("longitude").item(0).getTextContent()); - SingleMark singleMark = new SingleMark(name, lat, lon); + int id = Integer.valueOf(element.getElementsByTagName("id").item(0).getTextContent()); + SingleMark singleMark = new SingleMark(name, lat, lon, id); return singleMark; } else { throw new NoSuchElementException("Cannot generate a mark by given node."); diff --git a/src/main/java/seng302/models/parsers/StreamParser.java b/src/main/java/seng302/models/parsers/StreamParser.java index 7cbfc90d..265e5c82 100644 --- a/src/main/java/seng302/models/parsers/StreamParser.java +++ b/src/main/java/seng302/models/parsers/StreamParser.java @@ -48,21 +48,20 @@ public class StreamParser extends Thread{ Thread.sleep(1); } while (StreamReceiver.packetBuffer.peek() != null){ - StreamPacket packet = StreamReceiver.packetBuffer.peek(); - int delayTime = 1000; - int loopTime = delayTime + 1000; - long sleepTime = 0; - long transitTime = (System.currentTimeMillis()%loopTime - packet.getTimeStamp()%loopTime); - if (transitTime < 0){ - transitTime = loopTime + delayTime; - } - if (transitTime < delayTime) { - sleepTime = delayTime - (transitTime); - Thread.sleep(sleepTime); - } - System.out.println(sleepTime); - - packet = StreamReceiver.packetBuffer.take(); +// StreamPacket packet = StreamReceiver.packetBuffer.peek(); +// int delayTime = 1000; +// int loopTime = delayTime + 1000; +// long sleepTime = 0; +// long transitTime = (System.currentTimeMillis()%loopTime - packet.getTimeStamp()%loopTime); +// if (transitTime < 0){ +// transitTime = loopTime + delayTime; +// } +// if (transitTime < delayTime) { +// sleepTime = delayTime - (transitTime); +// Thread.sleep(sleepTime); +// } +// System.out.println(sleepTime); + StreamPacket packet = StreamReceiver.packetBuffer.take(); parsePacket(packet); Thread.sleep(1); while (StreamReceiver.packetBuffer.peek() == null) { @@ -228,7 +227,6 @@ public class StreamParser extends Thread{ while (payloadStream.available() > 0 && (currentChar = payloadStream.read()) != 0) { xmlMessage += (char)currentChar; } - //Create XML document Object DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = null; @@ -323,7 +321,7 @@ public class StreamParser extends Thread{ // long speed = extractTimeStamp(speedBytes, 2); double groundSpeed = bytesToLong(groundSpeedBytes)/1000.0; short s = (short) ((groundSpeedBytes[1] & 0xFF) << 8 | (groundSpeedBytes[0] & 0xFF)); - if ((int)deviceType == 1 || (int)deviceType == 4){ + if ((int)deviceType == 1 || (int)deviceType == 3){ // System.out.println("boatId = " + boatId); // System.out.println("deviceType = " + (long)deviceType); // System.out.println("seq = " + seq); diff --git a/src/main/resources/config/course.xml b/src/main/resources/config/course.xml index e11a24cf..6e1a72fb 100644 --- a/src/main/resources/config/course.xml +++ b/src/main/resources/config/course.xml @@ -8,17 +8,20 @@ Start1 57.6703330 11.8278330 + 122 Start2 57.6706330 11.8281330 + 123 Mid Mark 57.6675700 11.8359880 + 131 Leeward Gate @@ -26,11 +29,13 @@ Leeward Gate1 57.6708220 11.8433900 + 124 Leeward Gate2 57.6711220 11.8436900 + 125 @@ -39,11 +44,13 @@ Windward Gate1 57.6650170 11.8279170 + 126 Windward Gate2 57.6653170 11.8282170 + 127 @@ -52,11 +59,13 @@ Finish1 57.6715240 11.8444950 + 128 Finish2 57.6718240 11.8447950 + 129 diff --git a/src/test/java/seng302/EventTest.java b/src/test/java/seng302/EventTest.java index 0be0fc98..2d53c8a3 100644 --- a/src/test/java/seng302/EventTest.java +++ b/src/test/java/seng302/EventTest.java @@ -23,7 +23,7 @@ public class EventTest { @Test public void testBoatHeading() throws Exception { Boat boat = new Boat("testBoat"); - Event event = new Event(1231242.2, boat, new SingleMark("mark1", 142.5, 122.1), new SingleMark("mark2", 121.9,99.2), 0); + Event event = new Event(1231242.2, boat, new SingleMark("mark1", 142.5, 122.1, 1), new SingleMark("mark2", 121.9,99.2, 2), 0); assertEquals(event.getBoatHeading(), 228.0266137055349, 1e-15); } @@ -31,7 +31,7 @@ public class EventTest { @Test public void testDistanceBetweenMarks() throws Exception { Boat boat = new Boat("testBoat"); - Event event = new Event(1231242.2, boat, new SingleMark("mark1", 142.5, 122.1), new SingleMark("mark2", 121.9,99.2), 0); + Event event = new Event(1231242.2, boat, new SingleMark("mark1", 142.5, 122.1, 1), new SingleMark("mark2", 121.9,99.2, 2), 0); assertEquals(event.getDistanceBetweenMarks(), 339059.653830461, 1e-15); } diff --git a/src/test/java/seng302/models/mark/MarkTest.java b/src/test/java/seng302/models/mark/MarkTest.java index b48f5818..3db92540 100644 --- a/src/test/java/seng302/models/mark/MarkTest.java +++ b/src/test/java/seng302/models/mark/MarkTest.java @@ -16,8 +16,8 @@ public class MarkTest { @Before public void setUp() throws Exception { - this.singleMark1 = new SingleMark("testMark_SM1", 12.23234, -34.342); - this.singleMark2 = new SingleMark("testMark_SM2", 12.23239, -34.352); + this.singleMark1 = new SingleMark("testMark_SM1", 12.23234, -34.342, 1); + this.singleMark2 = new SingleMark("testMark_SM2", 12.23239, -34.352, 2); this.gateMark = new GateMark("testMark_GM", MarkType.OPEN_GATE, singleMark1, singleMark2, singleMark1.getLatitude(), singleMark2.getLongitude()); }