From e37b244f45ed84e4c745f861cbec329bcbfc0a3f Mon Sep 17 00:00:00 2001 From: Michael Rausch Date: Thu, 4 May 2017 12:27:59 +1200 Subject: [PATCH] Fixed a bug where boat statuses were being sent incorrectly - Boats now have an estimated time until finish - Boat packets are being sent correctly Tags: #story[829] --- .../seng302/models/parsers/StreamParser.java | 91 ++++++++++--------- .../java/seng302/server/ServerThread.java | 4 +- .../server/messages/BoatSubMessage.java | 43 ++++----- .../java/seng302/server/messages/Message.java | 2 +- .../java/seng302/server/simulator/Boat.java | 6 ++ 5 files changed, 74 insertions(+), 72 deletions(-) diff --git a/src/main/java/seng302/models/parsers/StreamParser.java b/src/main/java/seng302/models/parsers/StreamParser.java index 642fc608..5613485a 100644 --- a/src/main/java/seng302/models/parsers/StreamParser.java +++ b/src/main/java/seng302/models/parsers/StreamParser.java @@ -1,7 +1,6 @@ package seng302.models.parsers; -import javafx.geometry.Point3D; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -12,7 +11,6 @@ import seng302.models.parsers.packets.StreamPacket; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringReader; import java.text.DateFormat; @@ -110,48 +108,53 @@ public class StreamParser extends Thread{ * @param packet the packet to be looked at */ private static void parsePacket(StreamPacket packet) { - switch (packet.getType()){ - case HEARTBEAT: - extractHeartBeat(packet); - break; - case RACE_STATUS: - extractRaceStatus(packet); - break; - case DISPLAY_TEXT_MESSAGE: - extractDisplayMessage(packet); - break; - case XML_MESSAGE: - extractXmlMessage(packet); - break; - case RACE_START_STATUS: - extractRaceStartStatus(packet); - break; - case YACHT_EVENT_CODE: - extractYachtEventCode(packet); - break; - case YACHT_ACTION_CODE: - extractYachtActionCode(packet); - break; - case CHATTER_TEXT: - extractChatterText(packet); - break; - case BOAT_LOCATION: - extractBoatLocation(packet); - break; - case MARK_ROUNDING: - extractMarkRounding(packet); - break; - case COURSE_WIND: - extractCourseWind(packet); - break; - case AVG_WIND: - extractAvgWind(packet); - break; - default: - break; - //System.out.println(packet.getType().toString()); - } - } + try{ + switch (packet.getType()){ + case HEARTBEAT: + extractHeartBeat(packet); + break; + case RACE_STATUS: + extractRaceStatus(packet); + break; + case DISPLAY_TEXT_MESSAGE: + extractDisplayMessage(packet); + break; + case XML_MESSAGE: + extractXmlMessage(packet); + break; + case RACE_START_STATUS: + extractRaceStartStatus(packet); + break; + case YACHT_EVENT_CODE: + extractYachtEventCode(packet); + break; + case YACHT_ACTION_CODE: + extractYachtActionCode(packet); + break; + case CHATTER_TEXT: + extractChatterText(packet); + break; + case BOAT_LOCATION: + extractBoatLocation(packet); + break; + case MARK_ROUNDING: + extractMarkRounding(packet); + break; + case COURSE_WIND: + extractCourseWind(packet); + break; + case AVG_WIND: + extractAvgWind(packet); + break; + default: + break; + //System.out.println(packet.getType().toString()); + } + } + catch (NullPointerException e){ + System.out.println("Error parsing packet"); + } + } /** * Extracts the seq num used in the heartbeat packet diff --git a/src/main/java/seng302/server/ServerThread.java b/src/main/java/seng302/server/ServerThread.java index d3d6fe00..4be92aa2 100644 --- a/src/main/java/seng302/server/ServerThread.java +++ b/src/main/java/seng302/server/ServerThread.java @@ -98,8 +98,8 @@ public class ServerThread implements Runnable, Observer { boatStatus = BoatStatus.PRESTART; thereAreBoatsNotFinished = true; } - - BoatSubMessage m = new BoatSubMessage(b.getSourceID(), boatStatus, b.getLastPassedCorner().getSeqID(), 0, 0, 0, 0); + + BoatSubMessage m = new BoatSubMessage(b.getSourceID(), boatStatus, b.getLastPassedCorner().getSeqID(), 0, 0, b.getEstimatedTimeTillFinish(), b.getEstimatedTimeTillFinish()); boatSubMessages.add(m); } diff --git a/src/main/java/seng302/server/messages/BoatSubMessage.java b/src/main/java/seng302/server/messages/BoatSubMessage.java index ebe0f6a2..0be35246 100644 --- a/src/main/java/seng302/server/messages/BoatSubMessage.java +++ b/src/main/java/seng302/server/messages/BoatSubMessage.java @@ -1,6 +1,5 @@ package seng302.server.messages; -import java.io.DataOutputStream; import java.nio.ByteBuffer; /** @@ -16,6 +15,8 @@ public class BoatSubMessage{ private long numberPenaltiesServed; private long estimatedTimeAtNextMark; private long estimatedTimeAtFinish; + private ByteBuffer buff = ByteBuffer.allocate(getSize()); + private int buffPos = 0; /** * Boat Sub message from section 4.2 of the AC35 streaming data interface spec @@ -45,47 +46,39 @@ public class BoatSubMessage{ return MESSAGE_SIZE; } + private void putInBuffer(byte[] bytes, long val){ + byte[] tmp = bytes.clone(); + Message.reverse(tmp); + + buff.put(tmp); + buffPos += tmp.length; + buff.position(buffPos); + } + /** * @return a ByteBuffer containing this boat status message */ public ByteBuffer getByteBuffer(){ - ByteBuffer buff = ByteBuffer.allocate(getSize()); - int buffPos = 0; - // Source ID, 4 bytes - buff.put(ByteBuffer.allocate(4).putInt((int) sourceId).array()); - buffPos += 4; - buff.position(buffPos); + putInBuffer(Message.intToByteArray(sourceId, 4), 4); // Boat Status, 1 byte - buff.put(ByteBuffer.allocate(1).put((byte) (boatStatus.getCode() & 0xff)).array()); - buffPos += 1; - buff.position(buffPos); + putInBuffer(ByteBuffer.allocate(1).put((byte) (boatStatus.getCode() & 0xff)).array(), 1); // Leg number, 1 byte - buff.put(ByteBuffer.allocate(1).put((byte) (legNumber & 0xff)).array()); - buffPos += 1; - buff.position(buffPos); + putInBuffer(ByteBuffer.allocate(1).put((byte) (legNumber & 0xff)).array(), 1); // Number of penalties awarded, 1 byte - buff.put(ByteBuffer.allocate(1).put((byte) (numberPenaltiesAwarded & 0xff)).array()); - buffPos += 1; - buff.position(buffPos); + putInBuffer(ByteBuffer.allocate(1).put((byte) (numberPenaltiesAwarded & 0xff)).array(), 1); // Number of penalties served, 1 byte - buff.put(ByteBuffer.allocate(1).put((byte) (numberPenaltiesServed & 0xff)).array()); - buffPos += 1; - buff.position(buffPos); + putInBuffer(ByteBuffer.allocate(1).put((byte) (numberPenaltiesServed & 0xff)).array(), 1); // Estimated time at next mark, 6 bytes - buff.put(ByteBuffer.allocate(6).putInt((int) estimatedTimeAtNextMark).array()); - buffPos += 6; - buff.position(buffPos); + putInBuffer(Message.intToByteArray((int) estimatedTimeAtNextMark, 6),6); // Estimated time at finish, 6 bytes - buff.put(ByteBuffer.allocate(6).putInt((int) estimatedTimeAtFinish).array()); - buffPos += 6; - buff.position(buffPos); + putInBuffer(Message.intToByteArray((int) estimatedTimeAtFinish, 6), 6); return buff; } diff --git a/src/main/java/seng302/server/messages/Message.java b/src/main/java/seng302/server/messages/Message.java index 6f4c7d4b..e1bf2b53 100644 --- a/src/main/java/seng302/server/messages/Message.java +++ b/src/main/java/seng302/server/messages/Message.java @@ -140,7 +140,7 @@ public abstract class Message { * @param size number of bytes */ void putBytes(ByteBuffer bytes, int size){ - buffer.put(bytes); + buffer.put(bytes.array()); moveBufferPositionBy(size); } diff --git a/src/main/java/seng302/server/simulator/Boat.java b/src/main/java/seng302/server/simulator/Boat.java index e4096c55..093b153c 100644 --- a/src/main/java/seng302/server/simulator/Boat.java +++ b/src/main/java/seng302/server/simulator/Boat.java @@ -11,6 +11,7 @@ public class Boat { private double speed; // in mm/sec private String boatName, shortName, shorterName; private boolean isFinished; + private long estimatedTimeTillFinish; private Corner lastPassedCorner, headingCorner; @@ -18,6 +19,7 @@ public class Boat { this.sourceID = sourceID; this.boatName = boatName; this.isFinished = false; + estimatedTimeTillFinish = 0; } /** @@ -116,4 +118,8 @@ public class Boat { public void setFinished(boolean finished) { isFinished = finished; } + + public long getEstimatedTimeTillFinish(){ + return (long) (getSpeed()) + System.currentTimeMillis(); + } }