From 185c65e54dd9459ddb5306a955dccd867a2100de Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Mon, 1 May 2017 18:15:36 +1200 Subject: [PATCH 1/3] Editing MockOutput to send actual generated boat/race/regatta xmls - Was previously sending from a static source file #story[778] --- mock/src/main/java/seng302/Data/BoatData.java | 2 +- mock/src/main/java/seng302/MockOutput.java | 62 +++++++------------ mock/src/main/java/seng302/Model/Event.java | 5 ++ .../seng302/Mock/StreamedCourseXMLReader.java | 1 + .../test/java/seng302/Mock/BoatsXMLTest.java | 1 + 5 files changed, 31 insertions(+), 40 deletions(-) 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..63fb0728 100644 --- a/mock/src/main/java/seng302/MockOutput.java +++ b/mock/src/main/java/seng302/MockOutput.java @@ -36,6 +36,11 @@ 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(); @@ -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(boatsXml, XMLMessage.XMLTypeBoat); + parseXMLString(raceXml, XMLMessage.XMLTypeRace); + parseXMLString(regattaXml, XMLMessage.XMLTypeRegatta); /*******************************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/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java index 3e88ad01..5223f04b 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java @@ -90,6 +90,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); 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); } + } From 060db182a857e6b21623ee393ededc4fb02a6e08 Mon Sep 17 00:00:00 2001 From: Erika Savell Date: Mon, 1 May 2017 18:35:39 +1200 Subject: [PATCH 2/3] Minor tweaks to get streaming from mock working - Key point there being boats, raceand regatta xml files are being read from mock #story[778] --- mock/src/main/java/seng302/MockOutput.java | 4 ++-- mock/src/main/resources/raceXML/bermuda_AC35.xml | 2 +- .../src/main/java/seng302/Mock/StreamedCourseXMLReader.java | 3 ++- visualiser/src/main/java/seng302/VisualiserInput.java | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/mock/src/main/java/seng302/MockOutput.java b/mock/src/main/java/seng302/MockOutput.java index 63fb0728..ead68b09 100644 --- a/mock/src/main/java/seng302/MockOutput.java +++ b/mock/src/main/java/seng302/MockOutput.java @@ -44,7 +44,7 @@ public class MockOutput implements Runnable public MockOutput() throws IOException { lastHeartbeatTime = System.currentTimeMillis(); - serverSocket = new ServerSocket(4942); + serverSocket = new ServerSocket(4945); } /** * calculates the time since last heartbeat @@ -140,9 +140,9 @@ public class MockOutput implements Runnable } - parseXMLString(boatsXml, XMLMessage.XMLTypeBoat); parseXMLString(raceXml, XMLMessage.XMLTypeRace); parseXMLString(regattaXml, XMLMessage.XMLTypeRegatta); + parseXMLString(boatsXml, XMLMessage.XMLTypeBoat); /*******************************Test********************************/ 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/Mock/StreamedCourseXMLReader.java b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java index b11c987b..7effcbda 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedCourseXMLReader.java @@ -161,7 +161,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/VisualiserInput.java b/visualiser/src/main/java/seng302/VisualiserInput.java index 98875037..e86ec82c 100644 --- a/visualiser/src/main/java/seng302/VisualiserInput.java +++ b/visualiser/src/main/java/seng302/VisualiserInput.java @@ -39,8 +39,8 @@ public class VisualiserInput implements Runnable public VisualiserInput(StreamedCourse course) throws IOException{ - //connectionSocket = new Socket(InetAddress.getLocalHost(), 4942); - this.connectionSocket = new Socket("livedata.americascup.com",4941); + this.connectionSocket = new Socket(InetAddress.getLocalHost(), 4945); +// this.connectionSocket = new Socket("livedata.americascup.com",4941); this.course = course; this.boatLocation = new HashMap<>(); From 2e7527b32550a3f83e814080a2e3955eb4be6660 Mon Sep 17 00:00:00 2001 From: cbt24 Date: Mon, 1 May 2017 18:52:52 +1200 Subject: [PATCH 3/3] Update boat position according to boat location messages in StreamedRace - Added StreamedRace constructor accepting VisualiserInput - Modified VisualiserInput constructor to accept Socket - Refactored controller setup of Race #story[782] --- .../seng302/Controllers/MainController.java | 5 ++-- .../seng302/Controllers/RaceController.java | 13 +++++----- .../seng302/Controllers/StartController.java | 8 ++++-- .../main/java/seng302/Mock/StreamedRace.java | 25 +++++++++++++------ .../src/main/java/seng302/Model/Race.java | 7 +++++- .../main/java/seng302/VisualiserInput.java | 16 ++++++------ 6 files changed, 49 insertions(+), 25 deletions(-) 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 a8363ca8..4d9c88de 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/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 8427b31a..58472acd 100644 --- a/visualiser/src/main/java/seng302/VisualiserInput.java +++ b/visualiser/src/main/java/seng302/VisualiserInput.java @@ -37,9 +37,9 @@ public class VisualiserInput implements Runnable private Map boatLocation; - public VisualiserInput(StreamedCourse course) throws IOException{ + public VisualiserInput(Socket socket, StreamedCourse course) throws IOException{ - connectionSocket = new Socket(InetAddress.getLocalHost(), 4942); + this.connectionSocket = socket; // this.connectionSocket = new Socket("livedata.americascup.com",4941); this.course = course; @@ -125,17 +125,17 @@ 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"); +// System.out.println("Race Status Message"); break; case DISPLAYTEXTMESSAGE: // System.out.println("Display Text Message"); //no decoder for this. break; case XMLMESSAGE: - System.out.println("XML Message!"); +// System.out.println("XML Message!"); XMLMessage xml = (XMLMessage) data; try { if (xml.getXmlMsgSubType() == xml.XMLTypeRegatta){ @@ -159,7 +159,7 @@ public class VisualiserInput implements Runnable } break; case RACESTARTSTATUS: - //System.out.println("Race Start Status Message"); + System.out.println("Race Start Status Message"); break; case YACHTEVENTCODE: // System.out.println("Yacht Action Code!"); @@ -174,6 +174,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()){ @@ -212,7 +213,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(); }