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()); }