diff --git a/dedicatedServer/pom.xml b/dedicatedServer/pom.xml
index 8702f4f9..c7a7d668 100644
--- a/dedicatedServer/pom.xml
+++ b/dedicatedServer/pom.xml
@@ -106,6 +106,9 @@
org.apache.maven.pluginsmaven-project-info-reports-plugin2.8.1
+
+ false
+
diff --git a/pom.xml b/pom.xml
index 4f4983fc..ee4cba6f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,4 +14,12 @@
https://eng-git.canterbury.ac.nz/SENG302-2016/team-7
+
+
+ central
+ Maven Central
+ http://repo1.maven.org/maven2/
+
+
+
diff --git a/racevisionGame/pom.xml b/racevisionGame/pom.xml
index 41157414..8b195d5f 100644
--- a/racevisionGame/pom.xml
+++ b/racevisionGame/pom.xml
@@ -46,14 +46,17 @@
15.0
-
-
org.geotoolsgt-referencing9.0
+
+ JavaInteractiveMesh
+ STLImporter
+ 0.7
+
@@ -72,7 +75,11 @@
http://download.osgeo.org/webdav/geotools/
-
+
+ interactivemesh
+ Interactive Mesh
+ http://umbrasheep.com:8888/repository/internal/
+
@@ -163,6 +170,9 @@
org.apache.maven.pluginsmaven-project-info-reports-plugin2.8.1
+
+ false
+
diff --git a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java
index ee8ea216..b4ed1d2a 100644
--- a/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java
+++ b/racevisionGame/src/main/java/mock/app/ConnectionAcceptor.java
@@ -61,12 +61,7 @@ public class ConnectionAcceptor implements Runnable {
*/
private SourceIdAllocator sourceIdAllocator;
- //race xml sequence number
- private short raceXMLSequenceNumber;
- //boat xml sequence number
- private short boatXMLSequenceNumber;
- //regatta xml sequence number
- private short regattaXMLSequenceNumber;
+
//
private RaceLogic raceLogic = null;
@@ -209,77 +204,6 @@ public class ConnectionAcceptor implements Runnable {
}
}
}
-
- /**
- * Sets the Race XML to send.
- * @param raceXml XML to send to the Client.
- */
- public void setRaceXml(String raceXml) {
- //Create the message.
- XMLMessage message = this.createXMLMessage(raceXml, XMLMessageType.RACE);
- //Place it in LatestMessages.
- this.latestMessages.setRaceXMLMessage(message);
- }
-
- /**
- * Sets the Regatta XMl to send.
- * @param regattaXml XML to send to Client.
- */
- public void setRegattaXml(String regattaXml) {
- //Create the message.
- XMLMessage message = this.createXMLMessage(regattaXml, XMLMessageType.REGATTA);
- //Place it in LatestMessages.
- this.latestMessages.setRegattaXMLMessage(message);
- }
-
- /**
- * Sets the Boats XML to send.
- * @param boatsXml XMl to send to the Client.
- */
- public void setBoatsXml(String boatsXml) {
- //Create the message.
- XMLMessage message = this.createXMLMessage(boatsXml, XMLMessageType.BOAT);
-
- //Place it in LatestMessages.
- this.latestMessages.setBoatXMLMessage(message);
- }
-
- /**
- * Creates an XMLMessage of a specified subtype using the xml contents string.
- * @param xmlString The contents of the xml file.
- * @param messageType The subtype of xml message (race, regatta, boat).
- * @return The created XMLMessage object.
- */
- private XMLMessage createXMLMessage(String xmlString, XMLMessageType messageType) {
-
- //Get the correct sequence number to use, and increment it.
- short sequenceNumber = 0;
- if (messageType == XMLMessageType.RACE) {
- sequenceNumber = this.raceXMLSequenceNumber;
- this.raceXMLSequenceNumber++;
-
- } else if (messageType == XMLMessageType.BOAT) {
- sequenceNumber = this.boatXMLSequenceNumber;
- this.boatXMLSequenceNumber++;
-
- } else if (messageType == XMLMessageType.REGATTA) {
- sequenceNumber = this.regattaXMLSequenceNumber;
- this.regattaXMLSequenceNumber++;
-
- }
-
- //Create the message.
- XMLMessage message = new XMLMessage(
- XMLMessage.currentVersionNumber,
- AckSequencer.getNextAckNum(),
- System.currentTimeMillis(),
- messageType,
- sequenceNumber,
- xmlString);
-
-
- return message;
- }
}
diff --git a/racevisionGame/src/main/java/mock/app/Event.java b/racevisionGame/src/main/java/mock/app/Event.java
index c7f7d5ff..0bdcb8c1 100644
--- a/racevisionGame/src/main/java/mock/app/Event.java
+++ b/racevisionGame/src/main/java/mock/app/Event.java
@@ -25,6 +25,11 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
@@ -115,18 +120,10 @@ public class Event {
}
- this.sourceIdAllocator = new SourceIdAllocator(raceDataSource.getParticipants());
+
this.compositeCommand = new CompositeCommand();
this.latestMessages = new LatestMessages();
- //Create and start race.
-// WindGenerator windGenerator = new RandomWindGenerator(
-// Bearing.fromDegrees(225),
-// Bearing.fromDegrees(215),
-// Bearing.fromDegrees(235),
-// 12d,
-// 8d,
-// 16d );
WindGenerator windGenerator = new ShiftingWindGenerator(
Bearing.fromDegrees(225),
12
@@ -147,6 +144,7 @@ public class Event {
//Create connection acceptor.
+ this.sourceIdAllocator = new SourceIdAllocator(newRace.getRace());
try {
this.connectionAcceptor = new ConnectionAcceptor(latestMessages, compositeCommand, sourceIdAllocator, newRace);
@@ -159,8 +157,6 @@ public class Event {
this.connectionThread = new Thread(connectionAcceptor, "Event.Start()->ConnectionAcceptor thread");
connectionThread.start();
- sendXMLs();
-
}
@@ -173,18 +169,6 @@ public class Event {
- /**
- * Sends out each xml string, via the mock output
- */
- private void sendXMLs() {
-
- connectionAcceptor.setRegattaXml(regattaXML);
-
- connectionAcceptor.setRaceXml(raceXML);
-
- connectionAcceptor.setBoatsXml(boatXML);
- }
-
//TODO remove this after demo on 18th august!
/**
diff --git a/racevisionGame/src/main/java/mock/app/MockOutput.java b/racevisionGame/src/main/java/mock/app/MockOutput.java
index 68136ea0..023235cc 100644
--- a/racevisionGame/src/main/java/mock/app/MockOutput.java
+++ b/racevisionGame/src/main/java/mock/app/MockOutput.java
@@ -27,7 +27,12 @@ public class MockOutput implements RunnableWithFramePeriod {
*/
private LatestMessages latestMessages;
+ //These sequence number track the last race/boat/regatta xml message we've sent.
+ private int lastSentRaceNumber = -1;
+ private int lastSentBoatNumber = -1;
+
+ private int lastSentRegattaNumber = -1;
@@ -69,7 +74,6 @@ public class MockOutput implements RunnableWithFramePeriod {
long previousFrameTime = System.currentTimeMillis();
- boolean sentXMLs = false;
@@ -82,16 +86,26 @@ public class MockOutput implements RunnableWithFramePeriod {
previousFrameTime = currentFrameTime;
- //Send XML messages.
- if (!sentXMLs) {
+ //Send XML messages if needed.
+
+ if (lastSentRaceNumber != latestMessages.getRaceXMLMessage().getSequenceNumber()) {
+ lastSentRaceNumber = latestMessages.getRaceXMLMessage().getSequenceNumber();
outgoingMessages.put(latestMessages.getRaceXMLMessage());
- outgoingMessages.put(latestMessages.getRegattaXMLMessage());
+ }
+
+ if (lastSentBoatNumber != latestMessages.getBoatXMLMessage().getSequenceNumber()) {
+ lastSentBoatNumber = latestMessages.getBoatXMLMessage().getSequenceNumber();
outgoingMessages.put(latestMessages.getBoatXMLMessage());
+ }
- sentXMLs = true;
+ if (lastSentRegattaNumber != latestMessages.getRegattaXMLMessage().getSequenceNumber()) {
+ lastSentRegattaNumber = latestMessages.getRegattaXMLMessage().getSequenceNumber();
+ outgoingMessages.put(latestMessages.getRegattaXMLMessage());
}
+
+
List snapshot = latestMessages.getSnapshot();
for (AC35Data message : snapshot) {
outgoingMessages.put(message);
diff --git a/racevisionGame/src/main/java/mock/model/ClientConnection.java b/racevisionGame/src/main/java/mock/model/ClientConnection.java
index d2ca7609..2b0caacf 100644
--- a/racevisionGame/src/main/java/mock/model/ClientConnection.java
+++ b/racevisionGame/src/main/java/mock/model/ClientConnection.java
@@ -109,6 +109,11 @@ public class ClientConnection implements Runnable {
*/
private ConnectionStateEnum connectionState = ConnectionStateEnum.UNKNOWN;
+ /**
+ * The source ID that has been allocated to the client.
+ * 0 means not allocated.
+ */
+ private int allocatedSourceID = 0;
@@ -178,7 +183,7 @@ public class ClientConnection implements Runnable {
RequestToJoin requestToJoin = waitForRequestToJoin();
- int allocatedSourceID = 0;
+ allocatedSourceID = 0;
//If they want to participate, give them a source ID number.
if (requestToJoin.getRequestType() == RequestToJoinEnum.PARTICIPANT) {
@@ -283,6 +288,10 @@ public class ClientConnection implements Runnable {
if (this.controllerServerThread != null) {
this.controllerServerThread.interrupt();
}
+
+ if (allocatedSourceID != 0) {
+ sourceIdAllocator.returnSourceID(allocatedSourceID);
+ }
}
}
diff --git a/racevisionGame/src/main/java/mock/model/MockRace.java b/racevisionGame/src/main/java/mock/model/MockRace.java
index ed7b6fd2..f62a016d 100644
--- a/racevisionGame/src/main/java/mock/model/MockRace.java
+++ b/racevisionGame/src/main/java/mock/model/MockRace.java
@@ -1,6 +1,11 @@
package mock.model;
import mock.model.wind.WindGenerator;
+import javafx.animation.AnimationTimer;
+import mock.model.collider.ColliderRegistry;
+import mock.xml.*;
+import network.Messages.BoatLocation;
+import network.Messages.BoatStatus;
import network.Messages.Enums.BoatStatusEnum;
import network.Messages.Enums.RaceStatusEnum;
import shared.dataInput.BoatDataSource;
@@ -10,7 +15,6 @@ import shared.exceptions.BoatNotFoundException;
import shared.enums.RoundingType;
import shared.model.*;
import shared.model.Bearing;
-import shared.model.Race;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
@@ -24,7 +28,7 @@ import static java.lang.Math.cos;
* Has a course, boats, boundaries, etc...
* Is responsible for simulating the race, and sending messages to a MockOutput instance.
*/
-public class MockRace extends Race {
+public class MockRace extends RaceState {
/**
* An observable list of boats in the race.
@@ -37,6 +41,12 @@ public class MockRace extends Race {
private List shrinkBoundary;
+ /**
+ * Registry for all collider object in this race
+ */
+ private ColliderRegistry colliderRegistry;
+
+
/**
* The scale factor of the race.
* See {@link Constants#RaceTimeScale}.
@@ -48,6 +58,14 @@ public class MockRace extends Race {
*/
private WindGenerator windGenerator;
+
+ /**
+ * The polars file to use for each boat.
+ */
+ private Polars polars;
+
+
+
/**
* Constructs a race object with a given RaceDataSource, BoatDataSource, and RegattaDataSource and sends events to the given mockOutput.
* @param boatDataSource Data source for boat related data (yachts and marker boats).
@@ -59,13 +77,16 @@ public class MockRace extends Race {
*/
public MockRace(BoatDataSource boatDataSource, RaceDataSource raceDataSource, RegattaDataSource regattaDataSource, Polars polars, int timeScale, WindGenerator windGenerator) {
- super(boatDataSource, raceDataSource, regattaDataSource);
+ this.setBoatDataSource(boatDataSource);
+ this.setRaceDataSource(raceDataSource);
+ this.setRegattaDataSource(regattaDataSource);
+ this.polars = polars;
this.scaleFactor = timeScale;
- this.boats = this.generateMockBoats(boatDataSource.getBoats(), raceDataSource.getParticipants(), polars);
+ this.boats = new ArrayList<>();
- this.shrinkBoundary = GPSCoordinate.getShrinkBoundary(this.boundary);
+ this.shrinkBoundary = GPSCoordinate.getShrinkBoundary(this.getBoundary());
this.windGenerator = windGenerator;
@@ -73,35 +94,53 @@ public class MockRace extends Race {
//Wind.
this.setWind(windGenerator.generateBaselineWind());
+
+ // Set up colliders
+ this.colliderRegistry = new ColliderRegistry();
+
+ for(CompoundMark mark: this.getCompoundMarks()) {
+ colliderRegistry.addCollider(mark.getMark1());
+ if(mark.getMark2() != null) colliderRegistry.addCollider(mark.getMark2());
+ }
+
this.colliderRegistry.addAllColliders(boats);
}
+
/**
- * Generates a list of MockBoats given a list of Boats, and a list of participating boats.
- * @param boats The map of Boats describing boats that are potentially in the race. Maps boat sourceID to boat.
- * @param sourceIDs The list of boat sourceIDs describing which specific boats are actually participating.
- * @param polars The polars table to be used for boat simulation.
- * @return A list of MockBoats that are participating in the race.
+ * Generates a MockBoat from the BoatDataSource, given a source ID. Also adds it to the participant list.
+ * @param sourceID The source ID to assign the boat.
*/
- private List generateMockBoats(Map boats, List sourceIDs, Polars polars) {
+ public void generateMockBoat(Integer sourceID) {
- List mockBoats = new ArrayList<>(sourceIDs.size());
+ //Get the boat associated with the sourceID.
+ Boat boat = getBoatDataSource().getBoats().get(sourceID);
- //For each sourceID participating...
- for (int sourceID : sourceIDs) {
+ //Construct a MockBoat using the Boat and Polars.
+ MockBoat mockBoat = new MockBoat(boat, polars);
+ mockBoat.setCurrentLeg(this.getLegs().get(0));
- //Get the boat associated with the sourceID.
- Boat boat = boats.get(sourceID);
+ //Update participant list.
+ getRaceDataSource().getParticipants().add(sourceID);
- //Construct a MockBoat using the Boat and Polars.
- MockBoat mockBoat = new MockBoat(boat, polars);
+ this.boats.add(mockBoat);
- mockBoats.add(mockBoat);
+ getRaceDataSource().incrementSequenceNumber();
+ }
- }
+ /**
+ * Removes a MockBoat from the race, by sourceID. Also removes it from the participant list.
+ * @param sourceID Source ID of boat to remove.
+ */
+ public void removeMockBoat(Integer sourceID) {
+ this.boats.removeIf(mockBoat -> mockBoat.getSourceID() == sourceID);
+ getRaceDataSource().getParticipants().remove(sourceID);
+ getRaceDataSource().incrementSequenceNumber();
+ }
- return mockBoats;
+ public ColliderRegistry getColliderRegistry() {
+ return colliderRegistry;
}
@@ -110,7 +149,7 @@ public class MockRace extends Race {
* @param currentTime Milliseconds since unix epoch.
*/
public void updateRaceTime(long currentTime) {
- this.raceClock.setUTCTime(currentTime);
+ this.getRaceClock().setUTCTime(currentTime);
}
@@ -120,7 +159,7 @@ public class MockRace extends Race {
public void updateRaceStatusEnum() {
//The millisecond duration of the race. Negative means it hasn't started, so we flip sign.
- long timeToStart = - this.raceClock.getDurationMilli();
+ long timeToStart = - this.getRaceClock().getDurationMilli();
if (timeToStart > Constants.RacePreStartTime) {
@@ -191,7 +230,7 @@ public class MockRace extends Race {
//The boat starts on the first leg of the race.
- boat.setCurrentLeg(this.legs.get(0));
+ boat.setCurrentLeg(this.getLegs().get(0));
//Boats start with 0 knots speed.
boat.setCurrentSpeed(0d);
@@ -220,7 +259,7 @@ public class MockRace extends Race {
private List getSpreadStartingPositions() {
//The first compound marker of the race - the starting gate.
- CompoundMark compoundMark = this.legs.get(0).getStartCompoundMark();
+ CompoundMark compoundMark = this.getLegs().get(0).getStartCompoundMark();
//The position of the two markers from the compound marker.
GPSCoordinate mark1Position = compoundMark.getMark1Position();
@@ -482,7 +521,7 @@ public class MockRace extends Race {
roundingChecks.get(0), boat.getPosition(), legBearing) &&
gateCheck && boat.isBetweenGate(roundingMark, Mark.tempMark(roundingChecks.get(0)))) {
boat.increaseRoundingStatus();
- if (boat.getCurrentLeg().getLegNumber() + 2 >= legs.size()){
+ if (boat.getCurrentLeg().getLegNumber() + 2 >= getLegs().size()){
//boat has finished race
boat.increaseRoundingStatus();
}
@@ -500,7 +539,7 @@ public class MockRace extends Race {
case 2://has traveled 180 degrees around the mark
//Move boat on to next leg.
boat.resetRoundingStatus();
- Leg nextLeg = this.legs.get(boat.getCurrentLeg().getLegNumber() + 1);
+ Leg nextLeg = this.getLegs().get(boat.getCurrentLeg().getLegNumber() + 1);
boat.setCurrentLeg(nextLeg);
break;
}
@@ -527,7 +566,7 @@ public class MockRace extends Race {
gateCheck &&
boat.isBetweenGate(roundingMark, Mark.tempMark(roundingChecks.get(0)))) {
boat.increaseRoundingStatus();
- if (boat.getCurrentLeg().getLegNumber() + 2 >= legs.size()){
+ if (boat.getCurrentLeg().getLegNumber() + 2 >= getLegs().size()){
//boat has finished race
boat.increaseRoundingStatus();
}
@@ -544,7 +583,7 @@ public class MockRace extends Race {
case 2://has traveled 180 degrees around the mark
//Move boat on to next leg.
boat.resetRoundingStatus();
- Leg nextLeg = this.legs.get(boat.getCurrentLeg().getLegNumber() + 1);
+ Leg nextLeg = this.getLegs().get(boat.getCurrentLeg().getLegNumber() + 1);
boat.setCurrentLeg(nextLeg);
break;
}
@@ -582,7 +621,7 @@ public class MockRace extends Race {
GPSCoordinate roundCheck2;
try{
- Leg nextLeg = legs.get(legs.indexOf(boat.getCurrentLeg()) + 1);
+ Leg nextLeg = getLegs().get(getLegs().indexOf(boat.getCurrentLeg()) + 1);
GPSCoordinate startNextDirectionLinePoint = nextLeg.getStartCompoundMark().getMark1Position();
GPSCoordinate endNextDirectionLinePoint = nextLeg.getEndCompoundMark().getMark1Position();
@@ -678,7 +717,7 @@ public class MockRace extends Race {
*/
public void changeWindDirection() {
- Wind nextWind = windGenerator.generateNextWind(raceWind.getValue());
+ Wind nextWind = windGenerator.generateNextWind(windProperty().getValue());
setWind(nextWind);
}
@@ -699,13 +738,10 @@ public class MockRace extends Race {
long timeFromNow = (long) (1000 * boat.calculateDistanceToNextMarker() / velocityToMark);
//Calculate time at which it will reach mark.
- ZonedDateTime timeAtMark = this.raceClock.getCurrentTime().plus(timeFromNow, ChronoUnit.MILLIS);
+ ZonedDateTime timeAtMark = this.getRaceClock().getCurrentTime().plus(timeFromNow, ChronoUnit.MILLIS);
boat.setEstimatedTimeAtNextMark(timeAtMark);
}
}
- public List getCompoundMarks() {
- return compoundMarks;
- }
-}
\ No newline at end of file
+}
diff --git a/racevisionGame/src/main/java/mock/model/RaceLogic.java b/racevisionGame/src/main/java/mock/model/RaceLogic.java
index 5b35d449..d1ef39e0 100644
--- a/racevisionGame/src/main/java/mock/model/RaceLogic.java
+++ b/racevisionGame/src/main/java/mock/model/RaceLogic.java
@@ -48,6 +48,9 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer {
*/
@Override
public void run() {
+
+ prestartCountdown();
+
race.initialiseBoats();
countdown();
@@ -60,6 +63,37 @@ public class RaceLogic implements RunnableWithFramePeriod, Observer {
}
+ /**
+ * The countdown timer until the prestart period is finished. This timer will stop 3 minutes before the race starts, and players can no longer start participating.
+ */
+ private void prestartCountdown() {
+
+ long previousFrameTime = System.currentTimeMillis();
+
+ while (((race.getRaceStatusEnum() == RaceStatusEnum.PRESTART)
+ || (race.getRaceStatusEnum() == RaceStatusEnum.NOT_ACTIVE)
+ || (race.getRaceStatusEnum() == RaceStatusEnum.WARNING)) && loopBool) {
+
+ long currentTime = System.currentTimeMillis();
+
+ //Update race time.
+ race.updateRaceTime(currentTime);
+
+ //Update the race status based on the current time.
+ race.updateRaceStatusEnum();
+
+ //Provide boat's with an estimated time at next mark until the race starts.
+ race.setBoatsTimeNextMark(race.getRaceClock().getCurrentTime());
+
+ //Parse the race snapshot.
+ server.parseSnapshot();
+
+
+ waitForFramePeriod(previousFrameTime, currentTime, 50);
+ previousFrameTime = currentTime;
+ }
+ }
+
/**
* Countdown timer until race starts.
*/
diff --git a/racevisionGame/src/main/java/mock/model/RaceServer.java b/racevisionGame/src/main/java/mock/model/RaceServer.java
index cbbe1971..b7ccef12 100644
--- a/racevisionGame/src/main/java/mock/model/RaceServer.java
+++ b/racevisionGame/src/main/java/mock/model/RaceServer.java
@@ -1,13 +1,21 @@
package mock.model;
+import network.AckSequencer;
import network.Messages.*;
import network.Messages.Enums.BoatLocationDeviceEnum;
+import network.Messages.Enums.XMLMessageType;
import shared.model.Bearing;
import shared.model.CompoundMark;
import shared.model.Mark;
+import shared.xml.Race.RaceDataSourceToXML;
+import shared.xml.boats.BoatDataSourceToXML;
+import shared.xml.regatta.RegattaDataSourceToXML;
+import javax.xml.bind.JAXBException;
import java.util.ArrayList;
import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Created by connortaylorbrown on 2/08/17.
@@ -22,6 +30,21 @@ public class RaceServer {
*/
private int boatLocationSequenceNumber = 1;
+ /**
+ * The sequence number of race XML messages.
+ */
+ private int raceXMLSeqNumber = -1;
+
+ /**
+ * The sequence number of boat XML messages.
+ */
+ private int boatXMLSeqNumber = -1;
+
+ /**
+ * The sequence number of regatta XML messages.
+ */
+ private int regattaXMLSeqNumber = -1;
+
public RaceServer(MockRace race, LatestMessages latestMessages) {
this.race = race;
@@ -45,8 +68,77 @@ public class RaceServer {
snapshotMessages.add(parseRaceStatus());
latestMessages.setSnapshot(snapshotMessages);
+
+ updateXMLFiles();
+ }
+
+
+ /**
+ * Checks if the race/boat/regatta data sources have changed, and if they have, update their xml representations.
+ */
+ private void updateXMLFiles() {
+ updateRaceXMLFile();
+ updateBoatXMLFile();
+ updateRegattaXMLFile();
+ }
+
+ /**
+ * Checks if the race data source has changed, and if it has, updates LatestMessages' race xml message.
+ */
+ private void updateRaceXMLFile() {
+ if (raceXMLSeqNumber != race.getRaceDataSource().getSequenceNumber()) {
+
+ raceXMLSeqNumber = race.getRaceDataSource().getSequenceNumber();
+ try {
+ String raceXMLString = RaceDataSourceToXML.toString(race.getRaceDataSource());
+ XMLMessage message = createXMLMessage(raceXMLString, XMLMessageType.RACE);
+ latestMessages.setXMLMessage(message);
+
+ } catch (JAXBException e) {
+ Logger.getGlobal().log(Level.WARNING, "Could not serialise: " + race.getRaceDataSource(), e);
+ }
+
+ }
+ }
+
+ /**
+ * Checks if the boat data source has changed, and if it has, updates LatestMessages' boat xml message.
+ */
+ private void updateBoatXMLFile() {
+ if (boatXMLSeqNumber != race.getBoatDataSource().getSequenceNumber()) {
+
+ boatXMLSeqNumber = race.getBoatDataSource().getSequenceNumber();
+ try {
+ String boatXMLString = BoatDataSourceToXML.toString(race.getBoatDataSource());
+ XMLMessage message = createXMLMessage(boatXMLString, XMLMessageType.BOAT);
+ latestMessages.setXMLMessage(message);
+
+ } catch (JAXBException e) {
+ Logger.getGlobal().log(Level.WARNING, "Could not serialise: " + race.getBoatDataSource(), e);
+ }
+
+ }
}
+ /**
+ * Checks if the regatta data source has changed, and if it has, updates LatestMessages' regatta xml message.
+ */
+ private void updateRegattaXMLFile() {
+ if (regattaXMLSeqNumber != race.getRegattaDataSource().getSequenceNumber()) {
+
+ regattaXMLSeqNumber = race.getRegattaDataSource().getSequenceNumber();
+
+ try {
+ String regattaXMLString = RegattaDataSourceToXML.toString(race.getRegattaDataSource());
+ XMLMessage message = createXMLMessage(regattaXMLString, XMLMessageType.REGATTA);
+ latestMessages.setXMLMessage(message);
+
+ } catch (JAXBException e) {
+ Logger.getGlobal().log(Level.WARNING, "Could not serialise: " + race.getRegattaDataSource(), e);
+ }
+
+ }
+ }
/**
* Parses an individual marker boat, and returns it.
@@ -178,4 +270,41 @@ public class RaceServer {
return raceStatus;
}
+
+
+
+
+ /**
+ * Creates an XMLMessage of a specified subtype using the xml contents string.
+ * @param xmlString The contents of the xml file.
+ * @param messageType The subtype of xml message (race, regatta, boat).
+ * @return The created XMLMessage object.
+ */
+ private XMLMessage createXMLMessage(String xmlString, XMLMessageType messageType) {
+
+ //Get the correct sequence number to use.
+ int sequenceNumber = 0;
+ if (messageType == XMLMessageType.RACE) {
+ sequenceNumber = this.raceXMLSeqNumber;
+
+ } else if (messageType == XMLMessageType.BOAT) {
+ sequenceNumber = this.boatXMLSeqNumber;
+
+ } else if (messageType == XMLMessageType.REGATTA) {
+ sequenceNumber = this.regattaXMLSeqNumber;
+
+ }
+
+ //Create the message.
+ XMLMessage message = new XMLMessage(
+ XMLMessage.currentVersionNumber,
+ AckSequencer.getNextAckNum(),
+ System.currentTimeMillis(),
+ messageType,
+ sequenceNumber,
+ xmlString);
+
+
+ return message;
+ }
}
diff --git a/racevisionGame/src/main/java/mock/model/SourceIdAllocator.java b/racevisionGame/src/main/java/mock/model/SourceIdAllocator.java
index 3b62a8a7..17a7e85f 100644
--- a/racevisionGame/src/main/java/mock/model/SourceIdAllocator.java
+++ b/racevisionGame/src/main/java/mock/model/SourceIdAllocator.java
@@ -2,6 +2,7 @@ package mock.model;
import mock.exceptions.SourceIDAllocationException;
+import network.Messages.Enums.RaceStatusEnum;
import java.util.ArrayList;
import java.util.List;
@@ -13,24 +14,18 @@ public class SourceIdAllocator {
/**
- * This list contains all unallocated source IDs.
+ * The race we are allocating for.
*/
- List unallocatedIDs = new ArrayList<>();
+ private MockRace mockRace;
- /**
- * This list contains all allocated source IDs.
- */
- List allocatedIDs = new ArrayList<>();
-
/**
- * Creates a source ID allocator, using the given list of unallocated source IDs.
- * @param unallocatedIDs List of unallocated source IDs.
+ * Creates a SourceIdAllocator for a given race.
+ * @param mockRace Race to allocate source IDs for.
*/
- public SourceIdAllocator(List unallocatedIDs) {
- //We need to copy the list.
- this.unallocatedIDs.addAll(unallocatedIDs);
+ public SourceIdAllocator(MockRace mockRace) {
+ this.mockRace = mockRace;
}
@@ -41,11 +36,24 @@ public class SourceIdAllocator {
*/
public synchronized int allocateSourceID() throws SourceIDAllocationException {
+ if (!((mockRace.getRaceStatusEnum() == RaceStatusEnum.PRESTART)
+ || (mockRace.getRaceStatusEnum() == RaceStatusEnum.WARNING))) {
+ throw new SourceIDAllocationException("Could not allocate a source ID. Can only allocate during pre-start period. It is currently: " + mockRace.getRaceStatusEnum());
+ }
+
+ List allocatedIDs = mockRace.getRaceDataSource().getParticipants();
+ List allIDs = new ArrayList<>(mockRace.getBoatDataSource().getBoats().keySet());
+
+ //Get list of unallocated ids.
+ List unallocatedIDs = new ArrayList<>(allIDs);
+ unallocatedIDs.removeAll(allocatedIDs);
+
+
if (!unallocatedIDs.isEmpty()) {
int sourceID = unallocatedIDs.remove(0);
- allocatedIDs.add(sourceID);
+ mockRace.generateMockBoat(sourceID);
return sourceID;
@@ -61,10 +69,6 @@ public class SourceIdAllocator {
* @param sourceID Source ID to return.
*/
public void returnSourceID(Integer sourceID) {
-
- //We remove an Integer, not an int, so that we remove by value not by index.
- allocatedIDs.remove(sourceID);
-
- unallocatedIDs.add(sourceID);
+ mockRace.removeMockBoat(sourceID);
}
}
diff --git a/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java b/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java
index f1b83479..5cb74625 100644
--- a/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java
+++ b/racevisionGame/src/main/java/mock/xml/RaceXMLCreator.java
@@ -77,7 +77,8 @@ public class RaceXMLCreator {
public static String alterRaceToWind(String s, double degrees) throws XMLReaderException, InvalidRaceDataException, JAXBException, IOException, SAXException, ParserConfigurationException {
RaceXMLReader reader = new RaceXMLReader(s, XMLFileType.ResourcePath);
- XMLRace race = (XMLRace) XMLUtilities.xmlToClass(RaceXMLCreator.class.getClassLoader().getResourceAsStream(s),
+ XMLRace race = XMLUtilities.xmlToClass(
+ RaceXMLCreator.class.getClassLoader().getResourceAsStream(s),
RaceXMLCreator.class.getClassLoader().getResource("mock/mockXML/schema/raceSchema.xsd"),
XMLRace.class);
@@ -89,14 +90,7 @@ public class RaceXMLCreator {
alterRaceRotation(race, degreesToRotate);
- JAXBContext context = JAXBContext.newInstance(XMLRace.class);
- Marshaller jaxbMarshaller = context.createMarshaller();
- jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-
- StringWriter sw = new StringWriter();
-
- jaxbMarshaller.marshal(race, sw);
- return sw.toString();
+ return XMLUtilities.classToXML(race);
}
/**
diff --git a/racevisionGame/src/main/java/network/Messages/Enums/RaceTypeEnum.java b/racevisionGame/src/main/java/network/Messages/Enums/RaceTypeEnum.java
index 6a03b37e..4c75cc52 100644
--- a/racevisionGame/src/main/java/network/Messages/Enums/RaceTypeEnum.java
+++ b/racevisionGame/src/main/java/network/Messages/Enums/RaceTypeEnum.java
@@ -71,6 +71,8 @@ public enum RaceTypeEnum {
}
+
+
/**
* Stores a mapping between Byte values and RaceStatusEnum values.
*/
@@ -107,4 +109,14 @@ public enum RaceTypeEnum {
}
+ @Override
+ public String toString() {
+ if (fromByte(value) == FLEET_RACE) {
+ return "fleet";
+ } else if (fromByte(value) == MATCH_RACE) {
+ return "match";
+ } else {
+ return super.toString();
+ }
+ }
}
diff --git a/racevisionGame/src/main/java/network/Messages/LatestMessages.java b/racevisionGame/src/main/java/network/Messages/LatestMessages.java
index 738b3ae6..c16d722f 100644
--- a/racevisionGame/src/main/java/network/Messages/LatestMessages.java
+++ b/racevisionGame/src/main/java/network/Messages/LatestMessages.java
@@ -35,6 +35,7 @@ public class LatestMessages extends Observable {
+
/**
* Ctor.
*/
diff --git a/racevisionGame/src/main/java/shared/dataInput/BoatDataSource.java b/racevisionGame/src/main/java/shared/dataInput/BoatDataSource.java
index 40f12c75..17bb7c45 100644
--- a/racevisionGame/src/main/java/shared/dataInput/BoatDataSource.java
+++ b/racevisionGame/src/main/java/shared/dataInput/BoatDataSource.java
@@ -22,4 +22,16 @@ public interface BoatDataSource {
* @return Map between source ID and mark.
*/
Map getMarkerBoats();
+
+
+ /**
+ * Returns the sequence number associated with this data source. Used to indicate when it has changed.
+ * @return Sequence number.
+ */
+ int getSequenceNumber();
+
+ /**
+ * Increments the sequence number for this data source. Used to indicate that it has changed.
+ */
+ void incrementSequenceNumber();
}
diff --git a/racevisionGame/src/main/java/shared/dataInput/BoatXMLReader.java b/racevisionGame/src/main/java/shared/dataInput/BoatXMLReader.java
index 885309c0..25c956d9 100644
--- a/racevisionGame/src/main/java/shared/dataInput/BoatXMLReader.java
+++ b/racevisionGame/src/main/java/shared/dataInput/BoatXMLReader.java
@@ -29,6 +29,8 @@ public class BoatXMLReader extends XMLReader implements BoatDataSource {
private final Map markerMap = new HashMap<>();
+ private int sequenceNumber = 0;
+
/**
* Constructor for Boat XML using a file.
*
@@ -174,4 +176,15 @@ public class BoatXMLReader extends XMLReader implements BoatDataSource {
public Map getMarkerBoats() {
return markerMap;
}
+
+
+ @Override
+ public int getSequenceNumber() {
+ return sequenceNumber;
+ }
+
+ @Override
+ public void incrementSequenceNumber() {
+ sequenceNumber++;
+ }
}
diff --git a/racevisionGame/src/main/java/shared/dataInput/EmptyBoatDataSource.java b/racevisionGame/src/main/java/shared/dataInput/EmptyBoatDataSource.java
index 1de4251e..7a8d2151 100644
--- a/racevisionGame/src/main/java/shared/dataInput/EmptyBoatDataSource.java
+++ b/racevisionGame/src/main/java/shared/dataInput/EmptyBoatDataSource.java
@@ -22,6 +22,8 @@ public class EmptyBoatDataSource implements BoatDataSource {
private final Map markerMap = new HashMap<>();
+ private int sequenceNumber = 0;
+
public EmptyBoatDataSource() {
}
@@ -44,4 +46,15 @@ public class EmptyBoatDataSource implements BoatDataSource {
public Map getMarkerBoats() {
return markerMap;
}
+
+
+ @Override
+ public int getSequenceNumber() {
+ return sequenceNumber;
+ }
+
+ @Override
+ public void incrementSequenceNumber() {
+ sequenceNumber++;
+ }
}
diff --git a/racevisionGame/src/main/java/shared/dataInput/EmptyRaceDataSource.java b/racevisionGame/src/main/java/shared/dataInput/EmptyRaceDataSource.java
index 74ccbaf5..676d7e70 100644
--- a/racevisionGame/src/main/java/shared/dataInput/EmptyRaceDataSource.java
+++ b/racevisionGame/src/main/java/shared/dataInput/EmptyRaceDataSource.java
@@ -2,8 +2,10 @@ package shared.dataInput;
import network.Messages.Enums.RaceTypeEnum;
import shared.model.CompoundMark;
+import shared.model.Corner;
import shared.model.GPSCoordinate;
import shared.model.Leg;
+import shared.xml.Race.XMLCorner;
import java.time.ZonedDateTime;
import java.util.ArrayList;
@@ -48,6 +50,12 @@ public class EmptyRaceDataSource implements RaceDataSource {
*/
private final List legs = new ArrayList<>();
+ /**
+ * Corners in race.
+ */
+ private final List corners = new ArrayList<>();
+
+
/**
* The time that the race.xml file was created.
@@ -76,6 +84,8 @@ public class EmptyRaceDataSource implements RaceDataSource {
private RaceTypeEnum raceType = RaceTypeEnum.NOT_A_RACE_TYPE;
+ private int sequenceNumber = 0;
+
public EmptyRaceDataSource() {
}
@@ -98,6 +108,11 @@ public class EmptyRaceDataSource implements RaceDataSource {
return legs;
}
+ @Override
+ public List getCorners() {
+ return corners;
+ }
+
public List getCompoundMarks() {
return new ArrayList<>(compoundMarkMap.values());
}
@@ -126,4 +141,14 @@ public class EmptyRaceDataSource implements RaceDataSource {
public List getParticipants() {
return participants;
}
+
+ @Override
+ public int getSequenceNumber() {
+ return sequenceNumber;
+ }
+
+ @Override
+ public void incrementSequenceNumber() {
+ sequenceNumber++;
+ }
}
diff --git a/racevisionGame/src/main/java/shared/dataInput/EmptyRegattaDataSource.java b/racevisionGame/src/main/java/shared/dataInput/EmptyRegattaDataSource.java
index 05a0fcf9..1546972e 100644
--- a/racevisionGame/src/main/java/shared/dataInput/EmptyRegattaDataSource.java
+++ b/racevisionGame/src/main/java/shared/dataInput/EmptyRegattaDataSource.java
@@ -60,6 +60,8 @@ public class EmptyRegattaDataSource implements RegattaDataSource {
+ private int sequenceNumber = 0;
+
public EmptyRegattaDataSource() {
}
@@ -119,4 +121,15 @@ public class EmptyRegattaDataSource implements RegattaDataSource {
public GPSCoordinate getGPSCoordinate() {
return new GPSCoordinate(centralLatitude, centralLongitude);
}
+
+
+ @Override
+ public int getSequenceNumber() {
+ return sequenceNumber;
+ }
+
+ @Override
+ public void incrementSequenceNumber() {
+ sequenceNumber++;
+ }
}
diff --git a/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java b/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java
index b89dc45d..765098f2 100644
--- a/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java
+++ b/racevisionGame/src/main/java/shared/dataInput/RaceDataSource.java
@@ -2,8 +2,10 @@ package shared.dataInput;
import network.Messages.Enums.RaceTypeEnum;
import shared.model.CompoundMark;
+import shared.model.Corner;
import shared.model.GPSCoordinate;
import shared.model.Leg;
+import shared.xml.Race.XMLCorner;
import java.time.ZonedDateTime;
import java.util.List;
@@ -27,6 +29,12 @@ public interface RaceDataSource {
*/
List getLegs();
+ /**
+ * Returns the list of corners in the race - two adjacent corners form a leg.
+ * @return List of corners in race.
+ */
+ List getCorners();
+
/**
* Returns a list of coordinates representing the boundary of the race.
* @return The boundary of the race.
@@ -83,4 +91,16 @@ public interface RaceDataSource {
* @return Bottom right GPS coordinate.
*/
GPSCoordinate getMapBottomRight();
+
+
+ /**
+ * Returns the sequence number associated with this data source. Used to indicate when it has changed.
+ * @return Sequence number.
+ */
+ int getSequenceNumber();
+
+ /**
+ * Increments the sequence number for this data source. Used to indicate that it has changed.
+ */
+ void incrementSequenceNumber();
}
diff --git a/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java b/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java
index c2faea69..41d60e5f 100644
--- a/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java
+++ b/racevisionGame/src/main/java/shared/dataInput/RaceXMLReader.java
@@ -84,6 +84,8 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
private RaceTypeEnum raceType;
+ private int sequenceNumber = 0;
+
/**
@@ -343,7 +345,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
int cornerSeq = Integer.parseInt(getAttribute(cornerElement, "SeqID"));
- cornersList.add(new Corner(cornerID, cornerSeq, "SP", 3));
+ cornersList.add(new Corner(cornerID, cornerSeq, cornerRounding, 3));
//Gets the CompoundMark associated with this corner.
CompoundMark lastCompoundMark = this.compoundMarkMap.get(cornerID);
@@ -366,7 +368,7 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
cornerSeq = Integer.parseInt(getAttribute(cornerElement, "SeqID"));
- cornersList.add(new Corner(cornerID, cornerSeq, "Port", 3));
+ cornersList.add(new Corner(cornerID, cornerSeq, getCompoundMarkRounding(cornerElement), 3));
//gets the Rounding of this corner element
cornerRounding = getCompoundMarkRounding(cornerElement);
@@ -488,7 +490,17 @@ public class RaceXMLReader extends XMLReader implements RaceDataSource {
return participants;
}
- public List getCornersList() {
+ public List getCorners() {
return cornersList;
}
+
+ @Override
+ public int getSequenceNumber() {
+ return sequenceNumber;
+ }
+
+ @Override
+ public void incrementSequenceNumber() {
+ sequenceNumber++;
+ }
}
diff --git a/racevisionGame/src/main/java/shared/dataInput/RegattaDataSource.java b/racevisionGame/src/main/java/shared/dataInput/RegattaDataSource.java
index eb198cb2..9af55217 100644
--- a/racevisionGame/src/main/java/shared/dataInput/RegattaDataSource.java
+++ b/racevisionGame/src/main/java/shared/dataInput/RegattaDataSource.java
@@ -66,5 +66,15 @@ public interface RegattaDataSource {
float getMagneticVariation();
+ /**
+ * Returns the sequence number associated with this data source. Used to indicate when it has changed.
+ * @return Sequence number.
+ */
+ int getSequenceNumber();
+
+ /**
+ * Increments the sequence number for this data source. Used to indicate that it has changed.
+ */
+ void incrementSequenceNumber();
}
diff --git a/racevisionGame/src/main/java/shared/dataInput/RegattaXMLReader.java b/racevisionGame/src/main/java/shared/dataInput/RegattaXMLReader.java
index 0a756b03..36743105 100644
--- a/racevisionGame/src/main/java/shared/dataInput/RegattaXMLReader.java
+++ b/racevisionGame/src/main/java/shared/dataInput/RegattaXMLReader.java
@@ -59,6 +59,8 @@ public class RegattaXMLReader extends XMLReader implements RegattaDataSource {
private float magneticVariation;
+ private int sequenceNumber = 0;
+
/**
* Constructor for Regatta XML using a file.
@@ -209,4 +211,14 @@ public class RegattaXMLReader extends XMLReader implements RegattaDataSource {
public GPSCoordinate getGPSCoordinate() {
return new GPSCoordinate(centralLatitude, centralLongitude);
}
+
+ @Override
+ public int getSequenceNumber() {
+ return sequenceNumber;
+ }
+
+ @Override
+ public void incrementSequenceNumber() {
+ sequenceNumber++;
+ }
}
diff --git a/racevisionGame/src/main/java/shared/enums/RoundingType.java b/racevisionGame/src/main/java/shared/enums/RoundingType.java
index 8f8e719a..e9faef80 100644
--- a/racevisionGame/src/main/java/shared/enums/RoundingType.java
+++ b/racevisionGame/src/main/java/shared/enums/RoundingType.java
@@ -46,4 +46,19 @@ public enum RoundingType {
return null;
}
}
+
+ public static String getStringOf(RoundingType value) {
+ switch (value) {
+ case Port:
+ return "Port";
+ case Starboard:
+ return "Starboard";
+ case SP:
+ return "SP";
+ case PS:
+ return "PS";
+ default:
+ return null;
+ }
+ }
}
diff --git a/racevisionGame/src/main/java/shared/model/Constants.java b/racevisionGame/src/main/java/shared/model/Constants.java
index a6fe3844..bb7ec598 100644
--- a/racevisionGame/src/main/java/shared/model/Constants.java
+++ b/racevisionGame/src/main/java/shared/model/Constants.java
@@ -33,20 +33,23 @@ public class Constants {
* Frame periods are multiplied by this to get the amount of time a single frame represents.
* E.g., frame period = 20ms, scale = 5, frame represents 20 * 5 = 100ms, and so boats are simulated for 100ms, even though only 20ms actually occurred.
*/
- public static final int RaceTimeScale = 10;
+ public static final int RaceTimeScale = 2;//10;
/**
* The race pre-start time, in milliseconds. 3 minutes.
*/
- public static final long RacePreStartTime = 1 * 10 * 1000;
+ public static final long RacePreStartTime = 3 * 60 * 1000;
/**
- * The race preparatory time, in milliseconds. 1 minutes.
+ * The race preparatory time, in milliseconds. 1 minute.
*/
public static final long RacePreparatoryTime = 1 * 60 * 1000;
+
+
+
/**
* The number of milliseconds in one hour.
*
diff --git a/racevisionGame/src/main/java/shared/model/Race.java b/racevisionGame/src/main/java/shared/model/Race.java
deleted file mode 100644
index a15e2edd..00000000
--- a/racevisionGame/src/main/java/shared/model/Race.java
+++ /dev/null
@@ -1,318 +0,0 @@
-package shared.model;
-
-import javafx.beans.property.IntegerProperty;
-import javafx.beans.property.Property;
-import javafx.beans.property.SimpleIntegerProperty;
-import javafx.beans.property.SimpleObjectProperty;
-import mock.model.collider.ColliderRegistry;
-import network.Messages.Enums.RaceStatusEnum;
-import network.Messages.Enums.RaceTypeEnum;
-import shared.dataInput.BoatDataSource;
-import shared.dataInput.RaceDataSource;
-import shared.dataInput.RegattaDataSource;
-
-import java.util.List;
-
-
-/**
- * Represents a yacht race.
- * Has a course, state, wind, boundaries, etc.... Boats are added by inheriting classes (see {@link Boat}, {@link mock.model.MockBoat}, {@link visualiser.model.VisualiserBoat}.
- */
-public abstract class Race {
- /**
- * The source of race related data.
- */
- protected RaceDataSource raceDataSource;
- /**
- * The source of boat related data.
- */
- protected BoatDataSource boatDataSource;
- /**
- * The source of regatta related data.
- */
- protected RegattaDataSource regattaDataSource;
- /**
- * A list of compound marks in the race.
- */
- protected List compoundMarks;
- /**
- * A list of legs in the race.
- */
- protected List legs;
- /**
- * A list of coordinates describing the boundary of the course.
- */
- protected List boundary;
- /**
- * The clock which tracks the race's start time, current time, and elapsed duration.
- */
- protected RaceClock raceClock;
- /**
- * The race ID of the course.
- */
- protected int raceId;
- /**
- * The name of the regatta.
- */
- protected String regattaName;
- /**
- * The current status of the race.
- */
- protected RaceStatusEnum raceStatusEnum;
- /**
- * The type of race this is.
- */
- protected RaceTypeEnum raceType;
- /**
- * The race's wind.
- */
- protected Property raceWind = new SimpleObjectProperty<>();
- /**
- * Registry for all collider object in this race
- */
- protected ColliderRegistry colliderRegistry;
- /**
- * The number of frames per second.
- * We essentially track the number of frames generated per second, over a one second period. When {@link #lastFpsResetTime} reaches 1 second, currentFps is reset.
- */
- private int currentFps = 0;
- /**
- * The number of frames per second we generated over the last 1 second period.
- */
- private IntegerProperty lastFps = new SimpleIntegerProperty(0);
- /**
- * The time, in milliseconds, since we last reset our {@link #currentFps} counter.
- */
- private long lastFpsResetTime;
-
- /**
- * Constructs a race object with a given BoatDataSource, RaceDataSource, and RegattaDataSource.
- * @param boatDataSource Data source for boat related data (yachts and marker boats).
- * @param raceDataSource Data source for race related data (participating boats, legs, etc...).
- * @param regattaDataSource Data source for race related data (course name, location, timezone, etc...).
- */
- public Race(BoatDataSource boatDataSource, RaceDataSource raceDataSource, RegattaDataSource regattaDataSource) {
-
- //Keep a reference to data sources.
- this.raceDataSource = raceDataSource;
- this.boatDataSource = boatDataSource;
- this.regattaDataSource = regattaDataSource;
-
- //Marks.
- this.compoundMarks = raceDataSource.getCompoundMarks();
- //Boundaries.
- this.boundary = raceDataSource.getBoundary();
- //Legs.
- this.useLegsList(raceDataSource.getLegs());
- //Race ID.
- this.raceId = raceDataSource.getRaceId();
- //Regatta name.
- this.regattaName = regattaDataSource.getRegattaName();
- //Race clock.
- this.raceClock = new RaceClock(this.raceDataSource.getStartDateTime());
- //Race status.
- this.setRaceStatusEnum(RaceStatusEnum.NOT_ACTIVE);
- //Race type.
- this.raceType = raceDataSource.getRaceType();
- //Wind.
- this.setWind(Bearing.fromDegrees(0), 0);
- // Set up colliders
- this.colliderRegistry = new ColliderRegistry();
-
- for(CompoundMark mark: compoundMarks) {
- colliderRegistry.addCollider(mark.getMark1());
- if(mark.getMark2() != null) colliderRegistry.addCollider(mark.getMark2());
- }
- }
-
- public ColliderRegistry getColliderRegistry() {
- return colliderRegistry;
- }
-
- /**
- * Initialise the boats in the race.
- * This sets their starting positions and current legs.
- */
- protected abstract void initialiseBoats();
-
- /**
- * Updates the race to use a new list of legs, and adds a dummy "Finish" leg at the end.
- * @param legs The new list of legs to use.
- */
- protected void useLegsList(List legs) {
- //We add a "dummy" leg at the end of the race.
- this.legs = legs;
- this.legs.add(new Leg("Finish", this.legs.size()));
- }
-
- /**
- * Determines whether or not a specific leg is the last leg in the race.
- * @param leg The leg to check.
- * @return Returns true if it is the last, false otherwise.
- */
- protected boolean isLastLeg(Leg leg) {
-
- //Get the last leg.
- Leg lastLeg = this.legs.get(this.legs.size() - 1);
-
- //Check its ID.
- int lastLegID = lastLeg.getLegNumber();
-
- //Get the specified leg's ID.
- int legID = leg.getLegNumber();
-
-
- //Check if they are the same.
- return legID == lastLegID;
- }
-
- /**
- * Returns the current race status.
- * @return The current race status.
- */
- public RaceStatusEnum getRaceStatusEnum() {
- return raceStatusEnum;
- }
-
- /**
- * Sets the current race status.
- * @param raceStatusEnum The new status of the race.
- */
- public void setRaceStatusEnum(RaceStatusEnum raceStatusEnum) {
- this.raceStatusEnum = raceStatusEnum;
- }
-
- /**
- * Returns the type of race this is.
- * @return The type of race this is.
- */
- public RaceTypeEnum getRaceType() {
- return raceType;
- }
-
- /**
- * Returns the name of the regatta.
- * @return The name of the regatta.
- */
- public String getRegattaName() {
- return regattaName;
- }
-
- /**
- * Updates the race to have a specified wind bearing and speed.
- * @param windBearing New wind bearing.
- * @param windSpeedKnots New wind speed, in knots.
- */
- protected void setWind(Bearing windBearing, double windSpeedKnots) {
- Wind wind = new Wind(windBearing, windSpeedKnots);
- setWind(wind);
- }
-
- /**
- * Updates the race to have a specified wind (bearing and speed).
- * @param wind New wind.
- */
- protected void setWind(Wind wind) {
- this.raceWind.setValue(wind);
- }
-
- /**
- * Returns the wind bearing.
- * @return The wind bearing.
- */
- public Bearing getWindDirection() {
- return raceWind.getValue().getWindDirection();
- }
-
- /**
- * Returns the wind speed.
- * Measured in knots.
- * @return The wind speed.
- */
- public double getWindSpeed() {
- return raceWind.getValue().getWindSpeed();
- }
-
- /**
- * Returns the RaceClock for this race.
- * This is used to track the start time, current time, and elapsed duration of the race.
- * @return The RaceClock for the race.
- */
- public RaceClock getRaceClock() {
- return raceClock;
- }
-
- /**
- * Returns the RaceDataSource used for the race.
- * @return The RaceDataSource used for the race.
- */
- public RaceDataSource getRaceDataSource() {
- return raceDataSource;
- }
-
- /**
- * Returns the number of legs in the race.
- * @return The number of legs in the race.
- */
- public int getLegCount() {
- //We minus one, as we have added an extra "dummy" leg.
- return legs.size() - 1;
- }
-
- /**
- * Returns the race boundary.
- * @return The race boundary.
- */
- public List getBoundary() {
- return boundary;
- }
-
-
- /**
- * Returns the marks of the race.
- * @return Marks of the race.
- */
- public List getCompoundMarks() {
- return compoundMarks;
- }
-
- /**
- * Returns the legs of the race.
- * @return Legs of the race.
- */
- public List getLegs() {
- return legs;
- }
-
- /**
- * Returns the fps property.
- * @return The fps property.
- */
- public IntegerProperty fpsProperty() {
- return lastFps;
- }
-
- /**
- * Increments the FPS counter, and adds timePeriod milliseconds to our FPS reset timer.
- * @param timePeriod Time, in milliseconds, to add to {@link #lastFpsResetTime}.
- */
- protected void incrementFps(long timePeriod) {
- //Increment.
- this.currentFps++;
-
- //Add period to timer.
- this.lastFpsResetTime += timePeriod;
-
- //If we have reached 1 second period, snapshot the framerate and reset.
- if (this.lastFpsResetTime > 1000) {
- this.lastFps.set(this.currentFps);
-
- this.currentFps = 0;
- this.lastFpsResetTime = 0;
- }
- }
-
- public int getRaceId() {
- return raceId;
- }
-}
diff --git a/racevisionGame/src/main/java/shared/model/RaceState.java b/racevisionGame/src/main/java/shared/model/RaceState.java
index 19a1a52c..48361da2 100644
--- a/racevisionGame/src/main/java/shared/model/RaceState.java
+++ b/racevisionGame/src/main/java/shared/model/RaceState.java
@@ -188,7 +188,20 @@ public abstract class RaceState {
* @return List of mark boats.
*/
public List getMarks() {
- return new ArrayList<>(boatDataSource.getMarkerBoats().values());
+ //BoatDataSource contains a collection of Marks, and RaceDataSource contains a collection of Compound marks (which contain marks). RaceDataSource is the "definitive" source of mark data.
+ List marks = new ArrayList<>(getCompoundMarks().size() * 2);
+
+ for (CompoundMark compoundMark : getCompoundMarks()) {
+ if (compoundMark.getMark1() != null) {
+ marks.add(compoundMark.getMark1());
+ }
+
+ if (compoundMark.getMark2() != null) {
+ marks.add(compoundMark.getMark2());
+ }
+ }
+
+ return marks;
}
/**
diff --git a/racevisionGame/src/main/java/shared/xml/Race/RaceDataSourceToXML.java b/racevisionGame/src/main/java/shared/xml/Race/RaceDataSourceToXML.java
new file mode 100644
index 00000000..3e3b5f8c
--- /dev/null
+++ b/racevisionGame/src/main/java/shared/xml/Race/RaceDataSourceToXML.java
@@ -0,0 +1,131 @@
+package shared.xml.Race;
+
+import shared.dataInput.RaceDataSource;
+import shared.enums.RoundingType;
+import shared.model.CompoundMark;
+import shared.model.Corner;
+import shared.model.GPSCoordinate;
+import shared.model.Leg;
+import shared.xml.XMLUtilities;
+
+import javax.xml.bind.JAXBException;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+
+/**
+ * Has functions to convert a {@link shared.dataInput.RaceDataSource} to an {@link XMLRace} object.
+ */
+public class RaceDataSourceToXML {
+
+
+ /**
+ * Converts a race data source to an XMLRace object.
+ * @param raceDataSource The data source to convert.
+ * @return The XMLRace file.
+ */
+ public static XMLRace toXML(RaceDataSource raceDataSource) {
+
+ //Kind of ugly. Could be refactored/split up a bit.
+
+
+ XMLRace race = new XMLRace();
+
+
+ race.setRaceID(raceDataSource.getRaceId());
+ race.setRaceType(raceDataSource.getRaceType().toString());
+
+
+ race.setCreationTimeDate(raceDataSource.getCreationDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")));
+
+
+ XMLRaceStartTime startTime = new XMLRaceStartTime();
+ startTime.setPostpone(String.valueOf(raceDataSource.getPostponed()));
+ startTime.setTime(raceDataSource.getStartDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ")));
+ race.setRaceStartTime(startTime);
+
+
+ XMLParticipants participants = new XMLParticipants();
+ participants.yacht = new ArrayList<>();
+ for (int i : raceDataSource.getParticipants()) {
+ XMLYacht yacht = new XMLYacht();
+ yacht.setSourceID(i);
+ participants.yacht.add(yacht);
+ }
+ race.setParticipants(participants);
+
+
+ XMLCourseLimit courseLimit = new XMLCourseLimit();
+ courseLimit.limit = new ArrayList<>();
+ for (int i = 0; i < raceDataSource.getBoundary().size(); i++) {
+ XMLLimit limit = new XMLLimit();
+ limit.setLat(raceDataSource.getBoundary().get(i).getLatitude());
+ limit.setLon(raceDataSource.getBoundary().get(i).getLongitude());
+ limit.setSeqID(i + 1);
+ courseLimit.limit.add(limit);
+ }
+ race.setCourseLimit(courseLimit);
+
+
+ XMLCourse course = new XMLCourse();
+ course.compoundMark = new ArrayList<>();
+ for (CompoundMark compoundMark : raceDataSource.getCompoundMarks()) {
+ XMLCompoundMark xmlCompoundMark = new XMLCompoundMark();
+ xmlCompoundMark.setCompoundMarkID(compoundMark.getCompoundMarkID());
+ xmlCompoundMark.setName(compoundMark.getName());
+
+ if (compoundMark.getMark1() != null) {
+ XMLMark xmlMark = new XMLMark();
+ xmlMark.setName(compoundMark.getMark1().getName());
+ xmlMark.setSourceID(compoundMark.getMark1().getSourceID());
+ xmlMark.setSeqId(1);
+ xmlMark.setTargetLat(compoundMark.getMark1().getPosition().getLatitude());
+ xmlMark.setTargetLng(compoundMark.getMark1().getPosition().getLongitude());
+
+ xmlCompoundMark.getMark().add(xmlMark);
+ }
+ if (compoundMark.getMark2() != null) {
+ XMLMark xmlMark = new XMLMark();
+ xmlMark.setName(compoundMark.getMark2().getName());
+ xmlMark.setSourceID(compoundMark.getMark2().getSourceID());
+ xmlMark.setSeqId(2);
+ xmlMark.setTargetLat(compoundMark.getMark2().getPosition().getLatitude());
+ xmlMark.setTargetLng(compoundMark.getMark2().getPosition().getLongitude());
+
+ xmlCompoundMark.getMark().add(xmlMark);
+ }
+
+ course.compoundMark.add(xmlCompoundMark);
+ }
+ race.setCourse(course);
+
+ XMLCompoundMarkSequence compoundMarkSequence = new XMLCompoundMarkSequence();
+ compoundMarkSequence.corner = new ArrayList<>();
+ for (Corner corner : raceDataSource.getCorners()) {
+ XMLCorner xmlCorner = new XMLCorner();
+ xmlCorner.setZoneSize(corner.getZoneSize());
+ xmlCorner.setSeqID(corner.getSeqID());
+ xmlCorner.setCompoundMarkID(corner.getCompoundMarkID());
+ xmlCorner.setRounding(corner.getRounding());
+
+ compoundMarkSequence.corner.add(xmlCorner);
+ }
+ race.setCompoundMarkSequence(compoundMarkSequence);
+
+
+ return race;
+ }
+
+
+ /**
+ * Converts a race data source to an xml string.
+ * @param raceDataSource Data source to convert.
+ * @return String containing xml file.
+ * @throws JAXBException Thrown if it cannot be converted.
+ */
+ public static String toString(RaceDataSource raceDataSource) throws JAXBException {
+ XMLRace race = toXML(raceDataSource);
+ return XMLUtilities.classToXML(race);
+ }
+
+
+}
diff --git a/racevisionGame/src/main/java/shared/xml/XMLUtilities.java b/racevisionGame/src/main/java/shared/xml/XMLUtilities.java
index 8e01cb76..0a50f77d 100644
--- a/racevisionGame/src/main/java/shared/xml/XMLUtilities.java
+++ b/racevisionGame/src/main/java/shared/xml/XMLUtilities.java
@@ -20,10 +20,17 @@ import java.io.*;
import java.net.URL;
/**
- * Created by fwy13 on 13/08/17.
+ * Contains utility functions to convert between xml files and xml class objects.
*/
public class XMLUtilities {
+
+ /**
+ * Converts an XML class object to an XML string.
+ * @param o The XML class object to convert.
+ * @return String containing the serialised XML data.
+ * @throws JAXBException Thrown if the object is cannot be serialised to XML.
+ */
public static String classToXML(Object o) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(o.getClass());
Marshaller jaxbMarshaller = context.createMarshaller();
@@ -49,14 +56,26 @@ public class XMLUtilities {
return xmlToClass(document, schemaURL, c);
}
- public static Object xmlToClass(InputStream i, URL schemaURL, Class c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
+ /**
+ * Converts an XML file to an XML class (e.g., {@link shared.xml.Race.XMLRace}).
+ * @param i The input stream for the XML file.
+ * @param schemaURL URL for the XML schema.
+ * @param c The XML class to convert to.
+ * @param The XML class to convert to.
+ * @return The XML class object.
+ * @throws ParserConfigurationException
+ * @throws IOException
+ * @throws SAXException
+ * @throws JAXBException
+ */
+ public static T xmlToClass(InputStream i, URL schemaURL, Class c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(i);
return xmlToClass(document, schemaURL, c);
}
- public static Object xmlToClass(Document document, URL schemaURL, Class c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
+ public static T xmlToClass(Document document, URL schemaURL, Class c) throws ParserConfigurationException, IOException, SAXException, JAXBException {
JAXBContext jc = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = jc.createUnmarshaller();
@@ -64,7 +83,7 @@ public class XMLUtilities {
Schema schema = sf.newSchema(schemaURL);
unmarshaller.setSchema(schema);
- return unmarshaller.unmarshal(new DOMSource(document));
+ return (T) unmarshaller.unmarshal(new DOMSource(document));
}
public static boolean validateXML(String file, URL schemaURL){
diff --git a/racevisionGame/src/main/java/shared/xml/boats/BoatConfig.java b/racevisionGame/src/main/java/shared/xml/boats/BoatConfig.java
new file mode 100644
index 00000000..c0361b52
--- /dev/null
+++ b/racevisionGame/src/main/java/shared/xml/boats/BoatConfig.java
@@ -0,0 +1,533 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
+// See http://java.sun.com/xml/jaxb
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.09.01 at 11:12:43 PM NZST
+//
+
+
+package shared.xml.boats;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ *
Java class for anonymous complex type.
+ *
+ *
The following schema fragment specifies the expected content contained within this class.
+ *
+ *
+ *
+ *
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "", propOrder = {
+ "boat"
+ })
+ public static class Boats {
+
+ @XmlElement(name = "Boat", required = true)
+ protected List boat;
+
+ /**
+ * Gets the value of the boat property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set method for the boat property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getBoat().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link BoatConfig.Boats.Boat }
+ *
+ *
+ */
+ public List getBoat() {
+ if (boat == null) {
+ boat = new ArrayList();
+ }
+ return this.boat;
+ }
+
+
+ /**
+ *
Java class for anonymous complex type.
+ *
+ *
The following schema fragment specifies the expected content contained within this class.
+ *
+ *
+ *
+ *
+ */
+ @XmlAccessorType(XmlAccessType.FIELD)
+ @XmlType(name = "")
+ public static class GPSposition {
+
+ @XmlAttribute(name = "X", required = true)
+ protected Double x;
+ @XmlAttribute(name = "Y", required = true)
+ protected double y;
+ @XmlAttribute(name = "Z", required = true)
+ protected double z;
+
+ /**
+ * Gets the value of the x property.
+ *
+ * @return
+ * possible object is
+ * {@link Double }
+ *
+ */
+ public Double getX() {
+ return x;
+ }
+
+ /**
+ * Sets the value of the x property.
+ *
+ * @param value
+ * allowed object is
+ * {@link Double }
+ *
+ */
+ public void setX(Double value) {
+ this.x = value;
+ }
+
+ /**
+ * Gets the value of the y property.
+ *
+ */
+ public double getY() {
+ return y;
+ }
+
+ /**
+ * Sets the value of the y property.
+ *
+ */
+ public void setY(double value) {
+ this.y = value;
+ }
+
+ /**
+ * Gets the value of the z property.
+ *
+ */
+ public double getZ() {
+ return z;
+ }
+
+ /**
+ * Sets the value of the z property.
+ *
+ */
+ public void setZ(double value) {
+ this.z = value;
+ }
+
+ }
+
+ }
+
+ }
+
+}
diff --git a/racevisionGame/src/main/java/shared/xml/boats/BoatDataSourceToXML.java b/racevisionGame/src/main/java/shared/xml/boats/BoatDataSourceToXML.java
new file mode 100644
index 00000000..d24bee56
--- /dev/null
+++ b/racevisionGame/src/main/java/shared/xml/boats/BoatDataSourceToXML.java
@@ -0,0 +1,86 @@
+package shared.xml.boats;
+
+import shared.dataInput.BoatDataSource;
+import shared.dataInput.RaceDataSource;
+import shared.enums.RoundingType;
+import shared.model.Boat;
+import shared.model.CompoundMark;
+import shared.model.Leg;
+import shared.model.Mark;
+import shared.xml.Race.*;
+import shared.xml.XMLUtilities;
+
+import javax.xml.bind.JAXBException;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+
+/**
+ * Has functions to convert a {@link shared.dataInput.BoatDataSource} to an {@link BoatConfig} object.
+ */
+public class BoatDataSourceToXML {
+
+
+ /**
+ * Converts a boat data source to an XMLRace object.
+ * @param boatDataSource The data source to convert.
+ * @return The XMLRace file.
+ */
+ public static BoatConfig toXML(BoatDataSource boatDataSource) {
+ BoatConfig boatConfig = new BoatConfig();
+
+ boatConfig.boats = new BoatConfig.Boats();
+ boatConfig.boats.boat = new ArrayList<>();
+
+
+ for (Boat boat : boatDataSource.getBoats().values()) {
+ BoatConfig.Boats.Boat xmlBoat = new BoatConfig.Boats.Boat();
+
+ xmlBoat.setType("Yacht");
+ xmlBoat.setBoatName(boat.getName());
+ xmlBoat.setSourceID(boat.getSourceID());
+ xmlBoat.setStoweName(boat.getCountry());
+ xmlBoat.setShortName(boat.getCountry());
+
+ BoatConfig.Boats.Boat.GPSposition position = new BoatConfig.Boats.Boat.GPSposition();
+ position.setX(boat.getPosition().getLongitude());
+ position.setY(boat.getPosition().getLatitude());
+ position.setZ(0);
+ xmlBoat.setGPSposition(position);
+
+ boatConfig.boats.boat.add(xmlBoat);
+ }
+
+
+ for (Mark mark : boatDataSource.getMarkerBoats().values()) {
+ BoatConfig.Boats.Boat xmlBoat = new BoatConfig.Boats.Boat();
+
+ xmlBoat.setType("Mark");
+ xmlBoat.setBoatName(mark.getName());
+ xmlBoat.setSourceID(mark.getSourceID());
+
+ BoatConfig.Boats.Boat.GPSposition position = new BoatConfig.Boats.Boat.GPSposition();
+ position.setX(mark.getPosition().getLongitude());
+ position.setY(mark.getPosition().getLatitude());
+ position.setZ(0);
+ xmlBoat.setGPSposition(position);
+
+ boatConfig.boats.boat.add(xmlBoat);
+ }
+
+ return boatConfig;
+ }
+
+
+ /**
+ * Converts a boat data source to an xml string.
+ * @param boatDataSource Data source to convert.
+ * @return String containing xml file.
+ * @throws JAXBException Thrown if it cannot be converted.
+ */
+ public static String toString(BoatDataSource boatDataSource) throws JAXBException {
+ BoatConfig boats = toXML(boatDataSource);
+ return XMLUtilities.classToXML(boats);
+ }
+
+
+}
diff --git a/racevisionGame/src/main/java/shared/xml/boats/ObjectFactory.java b/racevisionGame/src/main/java/shared/xml/boats/ObjectFactory.java
new file mode 100644
index 00000000..0319de9a
--- /dev/null
+++ b/racevisionGame/src/main/java/shared/xml/boats/ObjectFactory.java
@@ -0,0 +1,71 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
+// See http://java.sun.com/xml/jaxb
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.09.01 at 11:12:43 PM NZST
+//
+
+
+package shared.xml.boats;
+
+import javax.xml.bind.annotation.XmlRegistry;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the aaa package.
+ *
An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups. Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+
+ /**
+ * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: aaa
+ *
+ */
+ public ObjectFactory() {
+ }
+
+ /**
+ * Create an instance of {@link BoatConfig }
+ *
+ */
+ public BoatConfig createBoatConfig() {
+ return new BoatConfig();
+ }
+
+ /**
+ * Create an instance of {@link BoatConfig.Boats }
+ *
+ */
+ public BoatConfig.Boats createBoatConfigBoats() {
+ return new BoatConfig.Boats();
+ }
+
+ /**
+ * Create an instance of {@link BoatConfig.Boats.Boat }
+ *
+ */
+ public BoatConfig.Boats.Boat createBoatConfigBoatsBoat() {
+ return new BoatConfig.Boats.Boat();
+ }
+
+ /**
+ * Create an instance of {@link BoatConfig.Boats.Boat.GPSposition }
+ *
+ */
+ public BoatConfig.Boats.Boat.GPSposition createBoatConfigBoatsBoatGPSposition() {
+ return new BoatConfig.Boats.Boat.GPSposition();
+ }
+
+}
diff --git a/racevisionGame/src/main/java/shared/xml/regatta/ObjectFactory.java b/racevisionGame/src/main/java/shared/xml/regatta/ObjectFactory.java
new file mode 100644
index 00000000..7fc72202
--- /dev/null
+++ b/racevisionGame/src/main/java/shared/xml/regatta/ObjectFactory.java
@@ -0,0 +1,47 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
+// See http://java.sun.com/xml/jaxb
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.09.01 at 10:37:23 PM NZST
+//
+
+
+package shared.xml.regatta;
+
+import javax.xml.bind.annotation.XmlRegistry;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the aaa package.
+ *
An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups. Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+
+ /**
+ * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: aaa
+ *
+ */
+ public ObjectFactory() {
+ }
+
+ /**
+ * Create an instance of {@link RegattaConfig }
+ *
+ */
+ public RegattaConfig createRegattaConfig() {
+ return new RegattaConfig();
+ }
+
+}
diff --git a/racevisionGame/src/main/java/shared/xml/regatta/RegattaConfig.java b/racevisionGame/src/main/java/shared/xml/regatta/RegattaConfig.java
new file mode 100644
index 00000000..d8cc1613
--- /dev/null
+++ b/racevisionGame/src/main/java/shared/xml/regatta/RegattaConfig.java
@@ -0,0 +1,219 @@
+//
+// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.8-b130911.1802
+// See http://java.sun.com/xml/jaxb
+// Any modifications to this file will be lost upon recompilation of the source schema.
+// Generated on: 2017.09.01 at 10:37:23 PM NZST
+//
+
+
+package shared.xml.regatta;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ *
Java class for anonymous complex type.
+ *
+ *
The following schema fragment specifies the expected content contained within this class.
+ *
+ *