diff --git a/mock/src/main/java/seng302/MockOutput.java b/mock/src/main/java/seng302/MockOutput.java index 5db50826..92003851 100644 --- a/mock/src/main/java/seng302/MockOutput.java +++ b/mock/src/main/java/seng302/MockOutput.java @@ -16,40 +16,49 @@ import java.net.*; import java.util.concurrent.ArrayBlockingQueue; /** - * TCP client to recive information from AC35 data source + * TCP server to send race information to connected clients. */ public class MockOutput implements Runnable { + ///Timestamp of the last sent heartbeat message. private long lastHeartbeatTime; - private RaceVisionByteEncoder messageEncoder = new RaceVisionByteEncoder(); - //socket port 5003 as 4940 is ac35 live port and 4941 is ac35 test port + ///Port to expose server on. + private int serverPort = 4942; + ///Socket used to listen for clients on. private ServerSocket serverSocket; + ///Socket used to communicate with a client. private Socket mockSocket; + ///Output stream which wraps around mockSocket outstream. private DataOutputStream outToVisualiser; - //a buffer that contains items that are waiting to be sent + ///A queue that contains items that are waiting to be sent. private ArrayBlockingQueue messagesToSendBuffer = new ArrayBlockingQueue<>(99999999); + ///Sequence numbers used in messages. private short messageNumber = 1; private short xmlSequenceNumber = 1; private int heartbeatSequenceNum = 1; private int boatLocationSequenceNumber = 1; private int raceStatusSequenceNumber = 1; + ///Strings containing XML data as strings. private String raceXml; private String regattaXml; private String boatsXml; - + /** + * Ctor. + * @throws IOException if server socket cannot be opened. + */ public MockOutput() throws IOException { lastHeartbeatTime = System.currentTimeMillis(); - serverSocket = new ServerSocket(4942); + serverSocket = new ServerSocket(serverPort); } /** - * calculates the time since last heartbeat - * @return time since last heartbeat + * Calculates the time since last heartbeat message, in seconds. + * @return Time since last heartbeat message, in seconds. */ private double timeSinceHeartbeat() { long now = System.currentTimeMillis(); @@ -63,7 +72,7 @@ public class MockOutput implements Runnable * @return message for heartbeat data */ private byte[] heartbeat(){ - byte[] heartbeatMessage = messageEncoder.heartBeat(heartbeatSequenceNum); + byte[] heartbeatMessage = RaceVisionByteEncoder.heartBeat(heartbeatSequenceNum); heartbeatSequenceNum++; BinaryMessageEncoder binaryMessageEncoder = new BinaryMessageEncoder(MessageType.HEARTBEAT, System.currentTimeMillis(), messageNumber, (short)heartbeatMessage.length, heartbeatMessage); messageNumber++; @@ -103,7 +112,7 @@ public class MockOutput implements Runnable boatLocationSequenceNumber++; //encodeds the messages - byte[] encodedBoatLoc = messageEncoder.boatLocation(boatLocationMessage); + byte[] encodedBoatLoc = RaceVisionByteEncoder.boatLocation(boatLocationMessage); //encodeds the full message with header BinaryMessageEncoder binaryMessageEncoder = new BinaryMessageEncoder(MessageType.BOATLOCATION, System.currentTimeMillis(), messageNumber, (short)encodedBoatLoc.length, @@ -125,7 +134,7 @@ public class MockOutput implements Runnable raceStatusSequenceNumber++; //encodeds the messages - byte[] encodedRaceStatus = messageEncoder.raceStatus(raceStatus); + byte[] encodedRaceStatus = RaceVisionByteEncoder.raceStatus(raceStatus); //encodeds the full message with header BinaryMessageEncoder binaryMessageEncoder = new BinaryMessageEncoder(MessageType.RACESTATUS, System.currentTimeMillis(), messageNumber, (short)encodedRaceStatus.length,