updated the visualiserinput to be a thread

#story[782]
main
hba56 9 years ago
parent db4792452f
commit 5bbdd6e00d

@ -14,7 +14,7 @@ import static seng302.Networking.Utils.ByteConverter.shortToBytes;
/** /**
* Created by hba56 on 21/04/17. * Created by hba56 on 21/04/17.
*/ */
public class BinaryMesageEncoder { public class BinaryMessageEncoder {
private byte[] fullMessage; private byte[] fullMessage;
private byte[] header; private byte[] header;
private byte[] message; private byte[] message;
@ -27,7 +27,7 @@ public class BinaryMesageEncoder {
private int headerSourceID; private int headerSourceID;
private short headerMessageLength; private short headerMessageLength;
public BinaryMesageEncoder(MessageType headerMessageType, long headerTimeStamp, int headerSourceID, short headerMessageLength, byte[] message){ public BinaryMessageEncoder(MessageType headerMessageType, long headerTimeStamp, int headerSourceID, short headerMessageLength, byte[] message){
//set the header //set the header
this.headerMessageType = headerMessageType.getValue(); this.headerMessageType = headerMessageType.getValue();
this.headerTimeStamp = headerTimeStamp; this.headerTimeStamp = headerTimeStamp;

@ -1,7 +1,9 @@
package seng302.Networking; package seng302.Networking;
import SharedModel.BoatInRace;
import seng302.Networking.MessageEncoders.RaceVisionByteEncoder; import seng302.Networking.MessageEncoders.RaceVisionByteEncoder;
import seng302.Networking.MessageEncoders.XMLMessageEncoder; import seng302.Networking.MessageEncoders.XMLMessageEncoder;
import seng302.Networking.Utils.BoatLocationMessage;
import seng302.Networking.Utils.MessageType; import seng302.Networking.Utils.MessageType;
import java.io.*; import java.io.*;
@ -27,6 +29,7 @@ public class MockOutput implements Runnable
private short messageNumber = 1; private short messageNumber = 1;
private short xmlSequenceNumber = 1; private short xmlSequenceNumber = 1;
private int heartbeatSequenceNum = 1; private int heartbeatSequenceNum = 1;
private int boatLocationSequenceNumber = 1;
public MockOutput() throws IOException { public MockOutput() throws IOException {
//start Time //start Time
@ -48,9 +51,9 @@ public class MockOutput implements Runnable
private byte[] heartbeat(){ private byte[] heartbeat(){
byte[] heartbeatMessage = messageEncoder.heartBeat(heartbeatSequenceNum); byte[] heartbeatMessage = messageEncoder.heartBeat(heartbeatSequenceNum);
heartbeatSequenceNum++; heartbeatSequenceNum++;
BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.HEARTBEAT, System.currentTimeMillis(), messageNumber, (short)heartbeatMessage.length, heartbeatMessage); BinaryMessageEncoder binaryMessageEncoder = new BinaryMessageEncoder(MessageType.HEARTBEAT, System.currentTimeMillis(), messageNumber, (short)heartbeatMessage.length, heartbeatMessage);
messageNumber++; messageNumber++;
return binaryMesageEncoder.getFullMessage(); return binaryMessageEncoder.getFullMessage();
} }
/** /**
@ -64,18 +67,32 @@ public class MockOutput implements Runnable
xmlSequenceNumber++; xmlSequenceNumber++;
byte[] encodedXML = encoder.encode(); byte[] encodedXML = encoder.encode();
BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.XMLMESSAGE, System.currentTimeMillis(), messageNumber, (short)encodedXML.length, encodedXML); BinaryMessageEncoder binaryMessageEncoder = new BinaryMessageEncoder(MessageType.XMLMESSAGE, System.currentTimeMillis(), messageNumber, (short)encodedXML.length, encodedXML);
//iterates the message number //iterates the message number
messageNumber++; messageNumber++;
addMessageToBufferToSend(binaryMesageEncoder.getFullMessage()); addMessageToBufferToSend(binaryMessageEncoder.getFullMessage());
} }
/** /**
* Used to give the mocOutput information about boat location to be made into a message and sent * Used to give the mocOutput information about boat location to be made into a message and sent
*/ */
public void parseBoatLocation(){ public void parseBoatLocation(BoatInRace boat){
/// TODO: 26/04/17 BoatLocationMessage boatLocationMessage = new BoatLocationMessage(boat, boatLocationSequenceNumber);
//iterates the sequence number
boatLocationSequenceNumber++;
//encodeds the messages
byte[] encodedBoatLoc = messageEncoder.boatLocation(boatLocationMessage);
//encodeds the full message with header
BinaryMessageEncoder binaryMessageEncoder = new BinaryMessageEncoder(MessageType.BOATLOCATION, System.currentTimeMillis(), messageNumber, (short)encodedBoatLoc.length,
encodedBoatLoc);
//iterates the message number
messageNumber++;
addMessageToBufferToSend(binaryMessageEncoder.getFullMessage());
} }
private void addMessageToBufferToSend(byte[] messagesToSendBuffer) { private void addMessageToBufferToSend(byte[] messagesToSendBuffer) {

@ -1,11 +1,8 @@
package seng302.Networking.PacketDump; package seng302.Networking.PacketDump;
import seng302.Networking.BinaryMesageEncoder;
import seng302.Networking.BinaryMessageDecoder; import seng302.Networking.BinaryMessageDecoder;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

@ -4,7 +4,9 @@ package seng302.Networking.Utils;
* Created by f123 on 21-Apr-17. * Created by f123 on 21-Apr-17.
*/ */
import SharedModel.BoatInRace;
import SharedModel.Constants; import SharedModel.Constants;
import SharedModel.GPSCoordinate;
/** /**
* Represents the information in a boat location message (AC streaming spec: 4.9). * Represents the information in a boat location message (AC streaming spec: 4.9).
@ -147,6 +149,33 @@ public class BoatLocationMessage extends AC35Data
this.rudderAngle = rudderAngle; this.rudderAngle = rudderAngle;
} }
public BoatLocationMessage(BoatInRace boat, long sequenceNumber) {
super(MessageType.BOATLOCATION);
this.messageVersionNumber = (byte) 1;
this.time = System.currentTimeMillis();
this.sourceID = boat.getSourceID();
this.sequenceNumber = sequenceNumber;
this.deviceType = 1;
this.latitude = 0;//boat.getCurrentPosition().getLatitude();
this.longitude = 0;//boat.getCurrentPosition().getLongitude();
this.altitude = 0;
this.heading = 0;
this.pitch = 0;
this.roll = 0;
this.boatSpeed = 0;
this.boatCOG = 0;
this.boatSOG = 0;
this.apparentWindSpeed = 0;
this.apparentWindAngle = 0;
this.trueWindSpeed = 0;
this.trueWindDirection = 0;
this.trueWindAngle = 0;
this.currentDrift = 0;
this.currentSet = 0;
this.rudderAngle = 0;
}
//Getters and setters for message properties. //Getters and setters for message properties.

@ -17,13 +17,12 @@ import static seng302.Networking.Utils.MessageType.*;
/** /**
* TCP server to act as the mock AC35 streaming interface * TCP server to act as the mock AC35 streaming interface
*/ */
public class VisualiserInput public class VisualiserInput implements Runnable
{ {
//time since last heartbeat //time since last heartbeat
private long lastHeartbeatTime; private long lastHeartbeatTime;
//socket port 4945 as 4940 is ac35 live port and 4941 is ac35 test port //socket port 4945 as 4940 is ac35 live port and 4941 is ac35 test port
private ServerSocket visualiserSocket;
private Socket connectionSocket; private Socket connectionSocket;
long heartbeatSeqNum; long heartbeatSeqNum;
@ -32,16 +31,47 @@ public class VisualiserInput
VisualiserInput() throws IOException{ VisualiserInput() throws IOException{
Socket connectionSocket = new Socket(InetAddress.getLocalHost(), 4942); // connectionSocket = new Socket(InetAddress.getLocalHost(), 4942);
//this is the test data that streams form the AC35 website //this is the test data that streams form the AC35 website
// Socket connectionSocket = new Socket("livedata.americascup.com",4941); connectionSocket = new Socket("livedata.americascup.com",4941);
//start Time //start Time
lastHeartbeatTime = System.currentTimeMillis(); lastHeartbeatTime = System.currentTimeMillis();
}
/**
* calculates the time since last heartbeat
* @return time since last heartbeat
*/
private double timeSinceHeartbeat() {
long now = System.currentTimeMillis();
return (now - lastHeartbeatTime) / 1000.0;
}
/**
* Takes an inputStream and reads the first 15 bytes (the header) and gets the message length
* for the whole message then reads that and returns the byte array
* @param inStream inputStream from socket
* @return encoded binary messsage bytes
* @throws IOException
*/
private static byte[] getBytes(InputStream inStream) throws IOException {
byte[] headerBytes = new byte[15];
int i = inStream.read(headerBytes);
byte[] messageLenBytes = Arrays.copyOfRange(headerBytes, 13, 15);
short messageLen = bytesToShort(messageLenBytes);
byte[] messageBytesWithCRC = new byte[messageLen+4];
int j = inStream.read(messageBytesWithCRC);
ByteBuffer binaryMessageBytes = ByteBuffer.allocate(headerBytes.length+messageBytesWithCRC.length);
binaryMessageBytes.put(headerBytes);
binaryMessageBytes.put(messageBytesWithCRC);
return binaryMessageBytes.array();
}
public void run(){
try{
//receiver loop that gets the input //receiver loop that gets the input
boolean receiverLoop = true; boolean receiverLoop = true;
while(receiverLoop) { while(receiverLoop) {
@ -68,45 +98,45 @@ public class VisualiserInput
System.out.println("HeartBeat Message! " + heartbeatSeqNum); System.out.println("HeartBeat Message! " + heartbeatSeqNum);
break; break;
case RACESTATUS: case RACESTATUS:
System.out.println("Race Status Message"); // System.out.println("Race Status Message");
break; break;
case DISPLAYTEXTMESSAGE: case DISPLAYTEXTMESSAGE:
System.out.println("Display Text Message"); // System.out.println("Display Text Message");
//no decoder for this. //no decoder for this.
break; break;
case XMLMESSAGE: case XMLMESSAGE:
System.out.println("XML Message!"); // System.out.println("XML Message!");
System.out.println(((XMLMessage)data).getXmlMessage()); System.out.println(((XMLMessage)data).getXmlMessage());
break; break;
case RACESTARTSTATUS: case RACESTARTSTATUS:
System.out.println("Race Start Status Message"); // System.out.println("Race Start Status Message");
break; break;
case YACHTEVENTCODE: case YACHTEVENTCODE:
System.out.println("Yacht Action Code!"); // System.out.println("Yacht Action Code!");
//no decoder //no decoder
break; break;
case YACHTACTIONCODE: case YACHTACTIONCODE:
System.out.println("Yacht Action Code!"); // System.out.println("Yacht Action Code!");
//no decoder //no decoder
break; break;
case CHATTERTEXT: case CHATTERTEXT:
System.out.println("Chatter Text Message!"); // System.out.println("Chatter Text Message!");
//no decoder //no decoder
break; break;
case BOATLOCATION: case BOATLOCATION:
System.out.println("Boat Location Message!"); // System.out.println("Boat Location Message!");
break; break;
case MARKROUNDING: case MARKROUNDING:
System.out.println("Mark Rounding Message!"); // System.out.println("Mark Rounding Message!");
break; break;
case COURSEWIND: case COURSEWIND:
System.out.println("Course Wind Message!"); // System.out.println("Course Wind Message!");
break; break;
case AVGWIND: case AVGWIND:
System.out.println("Average Wind Message!"); // System.out.println("Average Wind Message!");
break; break;
default: default:
System.out.println("Broken Message!"); // System.out.println("Broken Message!");
break; break;
} }
@ -117,40 +147,15 @@ public class VisualiserInput
receiverLoop = false; receiverLoop = false;
} }
} }
}catch(IOException e){
e.printStackTrace();
} }
/**
* calculates the time since last heartbeat
* @return time since last heartbeat
*/
private double timeSinceHeartbeat() {
long now = System.currentTimeMillis();
return (now - lastHeartbeatTime) / 1000.0;
}
/**
* Takes an inputStream and reads the first 15 bytes (the header) and gets the message length
* for the whole message then reads that and returns the byte array
* @param inStream inputStream from socket
* @return encoded binary messsage bytes
* @throws IOException
*/
private static byte[] getBytes(InputStream inStream) throws IOException {
byte[] headerBytes = new byte[15];
int i = inStream.read(headerBytes);
byte[] messageLenBytes = Arrays.copyOfRange(headerBytes, 13, 15);
short messageLen = bytesToShort(messageLenBytes);
byte[] messageBytesWithCRC = new byte[messageLen+4];
int j = inStream.read(messageBytesWithCRC);
ByteBuffer binaryMessageBytes = ByteBuffer.allocate(headerBytes.length+messageBytesWithCRC.length);
binaryMessageBytes.put(headerBytes);
binaryMessageBytes.put(messageBytesWithCRC);
return binaryMessageBytes.array();
} }
public static void main(String argv[]) throws Exception public static void main(String argv[]) throws Exception
{ {
VisualiserInput reciever = new VisualiserInput(); VisualiserInput reciever = new VisualiserInput();
reciever.run();
} }
} }

@ -2,7 +2,6 @@ package seng302.Networking;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.xml.sax.InputSource;
import seng302.Networking.MessageDecoders.XMLMessageDecoder; import seng302.Networking.MessageDecoders.XMLMessageDecoder;
import seng302.Networking.MessageEncoders.XMLMessageEncoder; import seng302.Networking.MessageEncoders.XMLMessageEncoder;
import seng302.Networking.Utils.MessageType; import seng302.Networking.Utils.MessageType;
@ -29,7 +28,7 @@ public class BinaryMessageDecoderTest {
byte[] encodedMessage = testEncoder.encode(); byte[] encodedMessage = testEncoder.encode();
BinaryMesageEncoder testMessage = new BinaryMesageEncoder(MessageType.XMLMESSAGE, time, 1, (short)encodedMessage.length, encodedMessage); BinaryMessageEncoder testMessage = new BinaryMessageEncoder(MessageType.XMLMESSAGE, time, 1, (short)encodedMessage.length, encodedMessage);
BinaryMessageDecoder testDecoder = new BinaryMessageDecoder(testMessage.getFullMessage()); BinaryMessageDecoder testDecoder = new BinaryMessageDecoder(testMessage.getFullMessage());
testDecoder.decode(); testDecoder.decode();

Loading…
Cancel
Save