diff --git a/mock/src/main/java/seng302/Data/BoatData.java b/mock/src/main/java/seng302/Data/BoatData.java
index 3f4d9b98..a9d0512a 100644
--- a/mock/src/main/java/seng302/Data/BoatData.java
+++ b/mock/src/main/java/seng302/Data/BoatData.java
@@ -180,7 +180,7 @@ public class BoatData {
private void appendBoatName(Element boat, int i) {
//BoatName attribute
Attr attrBoatName = doc.createAttribute("BoatName");
- attrBoatName.setValue(boatData.get(i).toString());
+ attrBoatName.setValue(boatData.get(i).getName());
boat.setAttributeNode(attrBoatName);
}
diff --git a/mock/src/main/java/seng302/MockOutput.java b/mock/src/main/java/seng302/MockOutput.java
index c72b811d..ead68b09 100644
--- a/mock/src/main/java/seng302/MockOutput.java
+++ b/mock/src/main/java/seng302/MockOutput.java
@@ -36,10 +36,15 @@ public class MockOutput implements Runnable
private int heartbeatSequenceNum = 1;
private int boatLocationSequenceNumber = 1;
private int raceStatusSequenceNumber = 1;
+ private String raceXml;
+ private String regattaXml;
+ private String boatsXml;
+
+
public MockOutput() throws IOException {
lastHeartbeatTime = System.currentTimeMillis();
- serverSocket = new ServerSocket(4942);
+ serverSocket = new ServerSocket(4945);
}
/**
* calculates the time since last heartbeat
@@ -131,48 +136,13 @@ public class MockOutput implements Runnable
/*******************************Test********************************/
- StringBuilder xmlString1;
+ while(boatsXml == null || regattaXml == null || raceXml == null) {
- BufferedReader br1 = new BufferedReader(new InputStreamReader(
- this.getClass().getResourceAsStream(("/raceXML/Boats.xml"))));
-
- String line1;
- xmlString1 = new StringBuilder();
- while((line1=br1.readLine())!= null){
- xmlString1.append(line1.trim());
}
- parseXMLString(xmlString1.toString(), XMLMessage.XMLTypeBoat);
-
-
-
- StringBuilder xmlString2;
-
- BufferedReader br2 = new BufferedReader(new InputStreamReader(
- this.getClass().getResourceAsStream(("/raceXML/Race.xml"))));
-
- String line2;
- xmlString2 = new StringBuilder();
- while((line2=br2.readLine())!= null){
- xmlString2.append(line2.trim());
- }
-
- parseXMLString(xmlString2.toString(), XMLMessage.XMLTypeRace);
-
-
-
- StringBuilder xmlString;
-
- BufferedReader br = new BufferedReader(new InputStreamReader(
- this.getClass().getResourceAsStream(("/raceXML/Regatta.xml"))));
-
- String line;
- xmlString = new StringBuilder();
- while((line=br.readLine())!= null){
- xmlString.append(line.trim());
- }
-
- parseXMLString(xmlString.toString(), XMLMessage.XMLTypeRegatta);
+ parseXMLString(raceXml, XMLMessage.XMLTypeRace);
+ parseXMLString(regattaXml, XMLMessage.XMLTypeRegatta);
+ parseXMLString(boatsXml, XMLMessage.XMLTypeBoat);
/*******************************Test********************************/
@@ -206,6 +176,20 @@ public class MockOutput implements Runnable
+ public void setRaceXml(String raceXml) {
+ this.raceXml = raceXml;
+ }
+
+
+ public void setRegattaXml(String regattaXml) {
+ this.regattaXml = regattaXml;
+ }
+
+
+ public void setBoatsXml(String boatsXml) {
+ this.boatsXml = boatsXml;
+ }
+
public static void main(String argv[]) throws Exception
{
MockOutput client = new MockOutput();
diff --git a/mock/src/main/java/seng302/Model/Event.java b/mock/src/main/java/seng302/Model/Event.java
index 3329e940..b0193fa7 100644
--- a/mock/src/main/java/seng302/Model/Event.java
+++ b/mock/src/main/java/seng302/Model/Event.java
@@ -53,6 +53,7 @@ public class Event {
System.setOut(System.out);
RegattaData regattaData = new RegattaData(regattaDataSource);
String xmlString = regattaData.createXML();
+ mockOutput.setRegattaXml(xmlString);
mockOutput.parseXMLString(xmlString, 26);
}
@@ -61,6 +62,8 @@ public class Event {
RaceData raceData = new RaceData(raceDataSource);
//Serialize race data to an XML as a string.
String xmlString = raceData.createXML();
+ System.out.println(xmlString);
+ mockOutput.setRaceXml(xmlString);
mockOutput.parseXMLString(xmlString, 26);
}
@@ -68,6 +71,8 @@ public class Event {
BoatData boatData = new BoatData(raceDataSource.getBoats());
//Serialize race data to an XML as a string.
String xmlString = boatData.createXML();
+ System.out.println(xmlString);
+ mockOutput.setBoatsXml(xmlString);
mockOutput.parseXMLString(xmlString, 26);
}
diff --git a/mock/src/main/resources/raceXML/bermuda_AC35.xml b/mock/src/main/resources/raceXML/bermuda_AC35.xml
index 27067d69..0520a500 100644
--- a/mock/src/main/resources/raceXML/bermuda_AC35.xml
+++ b/mock/src/main/resources/raceXML/bermuda_AC35.xml
@@ -2,7 +2,7 @@
5326
- ORACLE TEAM USA
+ Team 7
20
USA
121
diff --git a/visualiser/src/main/java/seng302/Controllers/MainController.java b/visualiser/src/main/java/seng302/Controllers/MainController.java
index 1ca8d4e9..6177af16 100644
--- a/visualiser/src/main/java/seng302/Controllers/MainController.java
+++ b/visualiser/src/main/java/seng302/Controllers/MainController.java
@@ -3,6 +3,7 @@ package seng302.Controllers;
import javafx.fxml.FXML;
import javafx.scene.layout.AnchorPane;
import seng302.RaceDataSource;
+import seng302.VisualiserInput;
import java.net.URL;
import java.util.ResourceBundle;
@@ -16,8 +17,8 @@ public class MainController extends Controller {
@FXML
RaceController raceController;
- public void beginRace(int scaleFactor, RaceDataSource raceData) {
- raceController.startRace(scaleFactor, raceData);
+ public void beginRace(VisualiserInput visualiserInput) {
+ raceController.startRace(visualiserInput);
}
diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java
index 9f1a55f7..892e62e0 100644
--- a/visualiser/src/main/java/seng302/Controllers/RaceController.java
+++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java
@@ -13,6 +13,7 @@ import seng302.Mock.StreamedRace;
import seng302.Model.*;
import seng302.RaceDataSource;
import seng302.RaceXMLReader;
+import seng302.VisualiserInput;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
@@ -114,13 +115,13 @@ public class RaceController extends Controller {
* Initializes and runs the race, based on the user's chosen scale factor
* Currently uses an example racecourse
*
- * @param scaleFactor scale value of race
+ * @param visualiserInput
*/
- public void startRace(int scaleFactor, RaceDataSource raceData) {
- StreamedRace newRace = new StreamedRace(raceData, this, scaleFactor);
+ public void startRace(VisualiserInput visualiserInput) {
+ StreamedRace newRace = new StreamedRace(visualiserInput, this);
//newRace.initialiseBoats();
- raceMap = new ResizableRaceCanvas(raceData);
+ raceMap = new ResizableRaceCanvas(visualiserInput.getCourse());
raceMap.setMouseTransparent(true);
raceMap.widthProperty().bind(canvasBase.widthProperty());
raceMap.heightProperty().bind(canvasBase.heightProperty());
@@ -133,8 +134,8 @@ public class RaceController extends Controller {
//Initialize save annotation array, fps listener, and annotation listeners
//timezone
- RaceClock raceClock = new RaceClock(raceData.getZonedDateTime());
- timeZone.setText(raceClock.getTimeZone());
+// RaceClock raceClock = new RaceClock(visualiserInput.getCourse().getZonedDateTime());
+// timeZone.setText(raceClock.getTimeZone());
initializeFPS();
initializeAnnotations();
diff --git a/visualiser/src/main/java/seng302/Controllers/StartController.java b/visualiser/src/main/java/seng302/Controllers/StartController.java
index 66a06b66..257d83fc 100644
--- a/visualiser/src/main/java/seng302/Controllers/StartController.java
+++ b/visualiser/src/main/java/seng302/Controllers/StartController.java
@@ -21,6 +21,8 @@ import seng302.RaceDataSource;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
import java.net.URL;
import java.text.ParseException;
import java.util.List;
@@ -53,6 +55,8 @@ public class StartController extends Controller implements Observer {
private StreamedCourse raceData;
private long timeLeft = 1;
+ private VisualiserInput visualiserInput;
+
/**
* Begins the race with a scale factor of 15
*/
@@ -88,7 +92,7 @@ public class StartController extends Controller implements Observer {
try {
raceData = new StreamedCourse();
raceData.addObserver(this);
- VisualiserInput visualiserInput = new VisualiserInput(raceData);
+ visualiserInput = new VisualiserInput(new Socket("livedata.americascup.com", 4941), raceData);
new Thread(visualiserInput).start();
// StreamedCourse streamedCourse = new StreamedCourse(new BoatXMLReader("mockXML/boatXML/boatTest.xml"));
// streamedCourse.setStreamedCourseXMLReader(new StreamedCourseXMLReader("mockXML/raceXML/raceTest.xml"));
@@ -150,7 +154,7 @@ public class StartController extends Controller implements Observer {
if (timeLeft <= 0) {
updateTime("Race is starting...");
stop();
- parent.beginRace(scaleFactor, raceData);
+ parent.beginRace(visualiserInput);
startWrapper.setVisible(false);
} else {
diff --git a/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java
index 8ba5392b..5c8ffbeb 100644
--- a/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java
+++ b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java
@@ -96,6 +96,7 @@ public class StreamedCourseXMLReader extends XMLReader {
private void readParticipants() {
Element nParticipants = (Element) doc.getElementsByTagName("Participants").item(0);
+ nParticipants.getChildNodes().getLength();
for (int i = 0; i < nParticipants.getChildNodes().getLength(); i++) {
int sourceID;
Node yacht = nParticipants.getChildNodes().item(i);
@@ -163,7 +164,8 @@ public class StreamedCourseXMLReader extends XMLReader {
* @return value of "compoundMarkID" attribute
*/
private int getCompoundMarkID(Element element) {
- return Integer.parseInt(element.getAttribute("CompoundMarkID"));
+ //return Integer.parseInt(element.getAttribute("CompoundMarkID"));
+ return 3;
}
/**
diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java
index 00d881ff..b7fb6d72 100644
--- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java
+++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java
@@ -6,7 +6,10 @@ import seng302.Constants;
import seng302.Controllers.RaceController;
import seng302.GPSCoordinate;
import seng302.Model.*;
+import seng302.Networking.MessageDecoders.BoatLocationDecoder;
+import seng302.Networking.Utils.BoatLocationMessage;
import seng302.RaceDataSource;
+import seng302.VisualiserInput;
import java.awt.geom.Point2D;
import java.util.*;
@@ -15,12 +18,12 @@ import java.util.*;
* Created by jjg64 on 21/04/17.
*/
public class StreamedRace extends Race {
- private RaceDataSource raceData;
+ private VisualiserInput visualiserInput;
+ private double MMPS_TO_KN = 0.001944;
- public StreamedRace(RaceDataSource raceData, RaceController controller, int scaleFactor) {
- super(raceData.getBoats(), raceData.getLegs(), controller, scaleFactor);
- this.raceData = raceData;
- this.scaleFactor = 1; // There will be no scaling in a live streamed race
+ public StreamedRace(VisualiserInput visualiserInput, RaceController controller) {
+ super(visualiserInput.getCourse(), controller, 1);
+ this.visualiserInput = visualiserInput;
}
public void initialiseBoats() {
@@ -72,8 +75,16 @@ public class StreamedRace extends Race {
* @param millisecondsElapsed time since last update
*/
protected void updatePosition(Boat boat, int millisecondsElapsed) {
- //TODO Grab info from network
- // setPosition(boat, coordinate);
+ int sourceID = boat.getSourceID();
+ BoatLocationMessage boatLocationMessage = visualiserInput.getBoatLocationMessage(sourceID);
+ if(boatLocationMessage != null) {
+ System.out.println(sourceID);
+ double lat = boatLocationMessage.getLatitudeDouble();
+ double lon = boatLocationMessage.getLongitudeDouble();
+ boat.setCurrentPosition(new GPSCoordinate(lat, lon));
+ boat.setHeading(boatLocationMessage.getHeadingDegrees());
+ boat.setVelocity(boatLocationMessage.getBoatSpeed() * MMPS_TO_KN);
+ }
}
protected void setPosition(Boat boat, GPSCoordinate coordinate) {
diff --git a/visualiser/src/main/java/seng302/Model/Race.java b/visualiser/src/main/java/seng302/Model/Race.java
index ed36fc92..83b2a41e 100644
--- a/visualiser/src/main/java/seng302/Model/Race.java
+++ b/visualiser/src/main/java/seng302/Model/Race.java
@@ -9,6 +9,7 @@ import org.geotools.referencing.GeodeticCalculator;
import seng302.Controllers.RaceController;
import seng302.GPSCoordinate;
import seng302.RaceDataSource;
+import seng302.VisualiserInput;
import java.awt.geom.Point2D;
import java.util.ArrayList;
@@ -31,7 +32,7 @@ public abstract class Race implements Runnable {
protected int scaleFactor;
- protected int PRERACE_TIME = 120000; //time in milliseconds to pause during pre-race
+ protected int PRERACE_TIME = 0; //time in milliseconds to pause during pre-race
private boolean timerEnabled = true; //boolean to determine if timer is ran
/**
@@ -69,6 +70,10 @@ public abstract class Race implements Runnable {
this(Arrays.asList(startingBoats), legs, controller, scaleFactor);
}
+ public void setController(RaceController controller) {
+ this.controller = controller;
+ }
+
public abstract void initialiseBoats();
/**
diff --git a/visualiser/src/main/java/seng302/VisualiserInput.java b/visualiser/src/main/java/seng302/VisualiserInput.java
index 58cf80eb..967cb05e 100644
--- a/visualiser/src/main/java/seng302/VisualiserInput.java
+++ b/visualiser/src/main/java/seng302/VisualiserInput.java
@@ -42,9 +42,10 @@ public class VisualiserInput implements Runnable
private Map boatStatus;
public VisualiserInput(StreamedCourse course) throws IOException{
+ public VisualiserInput(Socket socket, StreamedCourse course) throws IOException{
- //connectionSocket = new Socket(InetAddress.getLocalHost(), 4942);
- this.connectionSocket = new Socket("livedata.americascup.com",4941);
+ this.connectionSocket = socket;
+// this.connectionSocket = new Socket("livedata.americascup.com",4941);
this.course = course;
this.boatLocation = new HashMap<>();
@@ -154,7 +155,7 @@ public class VisualiserInput implements Runnable
lastHeartbeatTime = System.currentTimeMillis();
//note: if the program runs for over 340 years, this will crash.
heartbeatSeqNum = ByteConverter.bytesToLong(testDecoder.getMessage());
- System.out.println("HeartBeat Message! " + heartbeatSeqNum);
+// System.out.println("HeartBeat Message! " + heartbeatSeqNum);
break;
case RACESTATUS:
System.out.println("Race Status Message");
@@ -207,6 +208,7 @@ public class VisualiserInput implements Runnable
//no decoder
break;
case BOATLOCATION:
+ System.out.println("Boat Location!");
BoatLocationMessage msg = (BoatLocationMessage) data;
if (boatLocation.containsKey(msg.getSourceID())){
if (msg.getTime() > boatLocation.get(msg.getSourceID()).getTime()){
@@ -245,7 +247,8 @@ public class VisualiserInput implements Runnable
public static void main(String argv[]) throws Exception
{
- VisualiserInput receiver = new VisualiserInput(new StreamedCourse());
+ Socket socket = new Socket(InetAddress.getLocalHost(), 4942);
+ VisualiserInput receiver = new VisualiserInput(socket, new StreamedCourse());
receiver.run();
}
diff --git a/visualiser/src/test/java/seng302/Mock/BoatsXMLTest.java b/visualiser/src/test/java/seng302/Mock/BoatsXMLTest.java
index e4dc62a1..ed795d5a 100644
--- a/visualiser/src/test/java/seng302/Mock/BoatsXMLTest.java
+++ b/visualiser/src/test/java/seng302/Mock/BoatsXMLTest.java
@@ -44,4 +44,5 @@ public class BoatsXMLTest {
StreamedBoat boat = (StreamedBoat) boatXMLReader.getBoats().get(0);
assertEquals(boat.getSourceID(), 101);
}
+
}