Story 49 Marks move with boat location.
- Commented out blocking array as it was unecessary - Added Observable list for markers to the race canvas - Added SourceId's to Marker - Added updating Markers from the Streamed Race loop. #story[881] #pair[fwy13, jam339]
This commit is contained in:
@@ -48,8 +48,9 @@ public class RaceController extends Controller {
|
|||||||
* @param boats boats that are to be displayed in the race
|
* @param boats boats that are to be displayed in the race
|
||||||
* @see ResizableRaceCanvas
|
* @see ResizableRaceCanvas
|
||||||
*/
|
*/
|
||||||
public void updateMap(ObservableList<Boat> boats) {
|
public void updateMap(ObservableList<Boat> boats, ObservableList<Marker> boatMarkers) {
|
||||||
raceMap.setBoats(boats);
|
raceMap.setBoats(boats);
|
||||||
|
raceMap.setBoatMarkers(boatMarkers);
|
||||||
raceMap.update();
|
raceMap.update();
|
||||||
raceBoundaries.draw();
|
raceBoundaries.draw();
|
||||||
//stop if the visualiser is no longer running
|
//stop if the visualiser is no longer running
|
||||||
|
|||||||
@@ -165,8 +165,9 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
Marker marker;
|
Marker marker;
|
||||||
|
|
||||||
switch(nMarks.getLength()) {
|
switch(nMarks.getLength()) {
|
||||||
case 1: marker = new Marker(getCoordinate((Element)nMarks.item(0))); break;
|
case 1: marker = new Marker(getCoordinate((Element)nMarks.item(0)),getSourceId((Element)nMarks.item(0))); break;
|
||||||
case 2: marker = new Marker(getCoordinate((Element)nMarks.item(0)), getCoordinate((Element)nMarks.item(1))); break;
|
case 2: marker = new Marker(getCoordinate((Element)nMarks.item(0)), getCoordinate((Element)nMarks.item(1)),
|
||||||
|
getSourceId((Element)nMarks.item(0)), getSourceId((Element)nMarks.item(1))); break;
|
||||||
default: throw new StreamedCourseXMLException();
|
default: throw new StreamedCourseXMLException();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,6 +180,10 @@ public class StreamedCourseXMLReader extends XMLReader {
|
|||||||
return new GPSCoordinate(lat,lon);
|
return new GPSCoordinate(lat,lon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getSourceId(Element mark) {
|
||||||
|
return Integer.parseInt(mark.getAttribute("SourceID"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads "compoundMarkID" attribute of CompoundMark or Corner element
|
* Reads "compoundMarkID" attribute of CompoundMark or Corner element
|
||||||
* @param element with "compoundMarkID" attribute
|
* @param element with "compoundMarkID" attribute
|
||||||
|
|||||||
@@ -98,6 +98,28 @@ public class StreamedRace extends Race {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the boat's gps coordinates
|
||||||
|
*
|
||||||
|
* @param mark to be updated
|
||||||
|
*/
|
||||||
|
protected void updateMarker(Marker mark) {
|
||||||
|
int sourceID = mark.getSourceId1();
|
||||||
|
BoatLocation boatLocation1 = visualiserInput.getBoatLocationMessage(sourceID);
|
||||||
|
if(boatLocation1 != null) {
|
||||||
|
double lat = boatLocation1.getLatitudeDouble();
|
||||||
|
double lon = boatLocation1.getLongitudeDouble();
|
||||||
|
mark.setCurrentPosition1(new GPSCoordinate(lat, lon));
|
||||||
|
}
|
||||||
|
int sourceID2 = mark.getSourceId2();
|
||||||
|
BoatLocation boatLocation2 = visualiserInput.getBoatLocationMessage(sourceID2);
|
||||||
|
if(boatLocation1 != null) {
|
||||||
|
double lat = boatLocation2.getLatitudeDouble();
|
||||||
|
double lon = boatLocation2.getLongitudeDouble();
|
||||||
|
mark.setCurrentPosition2(new GPSCoordinate(lat, lon));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sets the position of a boat from coordinate
|
* sets the position of a boat from coordinate
|
||||||
* @param boat the boat to set
|
* @param boat the boat to set
|
||||||
|
|||||||
@@ -10,25 +10,42 @@ import java.awt.geom.Point2D;
|
|||||||
*/
|
*/
|
||||||
public class Marker {
|
public class Marker {
|
||||||
private final GPSCoordinate averageGPSCoordinate;
|
private final GPSCoordinate averageGPSCoordinate;
|
||||||
private final GPSCoordinate mark1;
|
private GPSCoordinate mark1;
|
||||||
private final GPSCoordinate mark2;
|
private GPSCoordinate mark2;
|
||||||
|
private final int sourceId1;
|
||||||
public Marker(GPSCoordinate mark1) {
|
private final int sourceId2;
|
||||||
|
|
||||||
this.mark1 = mark1;
|
|
||||||
this.mark2 = mark1;
|
|
||||||
this.averageGPSCoordinate = calculateAverage();
|
|
||||||
|
|
||||||
|
public Marker(GPSCoordinate mark1, int sourceId) {
|
||||||
|
this(mark1, mark1, sourceId, sourceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Marker(GPSCoordinate mark1, GPSCoordinate mark2) {
|
public Marker(GPSCoordinate mark1, GPSCoordinate mark2, int sourceId1, int sourceId2) {
|
||||||
|
|
||||||
this.mark1 = mark1;
|
this.mark1 = mark1;
|
||||||
this.mark2 = mark2;
|
this.mark2 = mark2;
|
||||||
this.averageGPSCoordinate = calculateAverage();
|
this.averageGPSCoordinate = calculateAverage();
|
||||||
|
this.sourceId1 = sourceId1;
|
||||||
|
this.sourceId2 = sourceId2;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* @param mark1 Mark coordinates.
|
||||||
|
*/
|
||||||
|
public Marker(GPSCoordinate mark1) {
|
||||||
|
this(mark1, mark1, 0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* @param mark1 Mark one coordinate
|
||||||
|
* @param mark2 Mark two coordinate
|
||||||
|
*/
|
||||||
|
public Marker(GPSCoordinate mark1, GPSCoordinate mark2) {
|
||||||
|
this(mark1, mark2, 0,0);
|
||||||
|
}
|
||||||
|
|
||||||
public GPSCoordinate getMark1() {
|
public GPSCoordinate getMark1() {
|
||||||
return mark1;
|
return mark1;
|
||||||
}
|
}
|
||||||
@@ -66,4 +83,19 @@ public class Marker {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setCurrentPosition1(GPSCoordinate gpsCoordinate){
|
||||||
|
mark1 = gpsCoordinate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCurrentPosition2(GPSCoordinate gpsCoordinate){
|
||||||
|
mark2 = gpsCoordinate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSourceId1() {
|
||||||
|
return sourceId1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSourceId2() {
|
||||||
|
return sourceId2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public abstract class Race implements Runnable {
|
public abstract class Race implements Runnable {
|
||||||
protected final ObservableList<Boat> startingBoats;
|
protected final ObservableList<Boat> startingBoats;
|
||||||
|
protected final ObservableList<Marker> boatMarkers;
|
||||||
protected final List<Leg> legs;
|
protected final List<Leg> legs;
|
||||||
private RaceController controller;
|
private RaceController controller;
|
||||||
protected FinishController finishController;
|
protected FinishController finishController;
|
||||||
@@ -33,9 +34,10 @@ public abstract class Race implements Runnable {
|
|||||||
* @param controller race controller
|
* @param controller race controller
|
||||||
* @param scaleFactor for race
|
* @param scaleFactor for race
|
||||||
*/
|
*/
|
||||||
private Race(List<Boat> boats, List<Leg> legs, RaceController controller, int scaleFactor) {
|
private Race(List<Boat> boats, List<Marker> boatMarkers, List<Leg> legs, RaceController controller, int scaleFactor) {
|
||||||
|
|
||||||
this.startingBoats = FXCollections.observableArrayList(boats);
|
this.startingBoats = FXCollections.observableArrayList(boats);
|
||||||
|
this.boatMarkers = FXCollections.observableArrayList(boatMarkers);
|
||||||
this.legs = legs;
|
this.legs = legs;
|
||||||
this.legs.add(new Leg("Finish", this.legs.size()));
|
this.legs.add(new Leg("Finish", this.legs.size()));
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
@@ -45,7 +47,7 @@ public abstract class Race implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected Race(RaceDataSource raceData, RaceController controller, int scaleFactor) {
|
protected Race(RaceDataSource raceData, RaceController controller, int scaleFactor) {
|
||||||
this(raceData.getBoats(), raceData.getLegs(), controller, scaleFactor);
|
this(raceData.getBoats(), raceData.getMarkers(), raceData.getLegs(), controller, scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,7 +58,7 @@ public abstract class Race implements Runnable {
|
|||||||
* @param scaleFactor factor to scale by
|
* @param scaleFactor factor to scale by
|
||||||
*/
|
*/
|
||||||
public Race(Boat[] startingBoats, List<Leg> legs, RaceController controller, int scaleFactor) {
|
public Race(Boat[] startingBoats, List<Leg> legs, RaceController controller, int scaleFactor) {
|
||||||
this(Arrays.asList(startingBoats), legs, controller, scaleFactor);
|
this(Arrays.asList(startingBoats), null, legs, controller, scaleFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setController(RaceController controller) {
|
public void setController(RaceController controller) {
|
||||||
@@ -80,6 +82,8 @@ public abstract class Race implements Runnable {
|
|||||||
*/
|
*/
|
||||||
protected abstract void checkPosition(Boat boat, long timeElapsed);
|
protected abstract void checkPosition(Boat boat, long timeElapsed);
|
||||||
|
|
||||||
|
protected abstract void updateMarker(Marker mark);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the boat's gps coordinates
|
* Updates the boat's gps coordinates
|
||||||
*
|
*
|
||||||
@@ -140,12 +144,17 @@ public abstract class Race implements Runnable {
|
|||||||
boatsFinished++;
|
boatsFinished++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (Marker mark: boatMarkers){
|
||||||
|
if (mark != null){
|
||||||
|
updateMarker(mark);
|
||||||
|
}
|
||||||
|
}
|
||||||
//System.out.println(boatsFinished + ":" + startingBoats.size());
|
//System.out.println(boatsFinished + ":" + startingBoats.size());
|
||||||
} else {
|
} else {
|
||||||
controller.finishRace(startingBoats);
|
controller.finishRace(startingBoats);
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
controller.updateMap(startingBoats);
|
controller.updateMap(startingBoats, boatMarkers);
|
||||||
fps++;
|
fps++;
|
||||||
if ((System.currentTimeMillis() - timeCurrent) > 1000) {
|
if ((System.currentTimeMillis() - timeCurrent) > 1000) {
|
||||||
updateFPS(fps);
|
updateFPS(fps);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package seng302.Model;
|
package seng302.Model;
|
||||||
|
|
||||||
|
|
||||||
|
import javafx.collections.ObservableList;
|
||||||
import javafx.scene.paint.Color;
|
import javafx.scene.paint.Color;
|
||||||
import javafx.scene.paint.Paint;
|
import javafx.scene.paint.Paint;
|
||||||
import javafx.scene.transform.Rotate;
|
import javafx.scene.transform.Rotate;
|
||||||
@@ -22,6 +23,7 @@ import java.util.List;
|
|||||||
public class ResizableRaceCanvas extends ResizableCanvas {
|
public class ResizableRaceCanvas extends ResizableCanvas {
|
||||||
private RaceMap map;
|
private RaceMap map;
|
||||||
private List<Boat> boats;
|
private List<Boat> boats;
|
||||||
|
private List<Marker> boatMarkers;
|
||||||
private boolean raceAnno = true;
|
private boolean raceAnno = true;
|
||||||
private boolean annoName = true;
|
private boolean annoName = true;
|
||||||
private boolean annoAbbrev = true;
|
private boolean annoAbbrev = true;
|
||||||
@@ -56,6 +58,16 @@ public class ResizableRaceCanvas extends ResizableCanvas {
|
|||||||
this.boats = boats;
|
this.boats = boats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the boat markers that are to be displayed in this race.
|
||||||
|
*
|
||||||
|
* @param boatMarkers in race
|
||||||
|
*/
|
||||||
|
public void setBoatMarkers(ObservableList<Marker> boatMarkers) {
|
||||||
|
this.boatMarkers = boatMarkers;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the RaceMap that the RaceCanvas is to be displaying for.
|
* Sets the RaceMap that the RaceCanvas is to be displaying for.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package seng302;
|
package seng302;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import seng302.Mock.*;
|
import seng302.Mock.*;
|
||||||
|
import seng302.Model.Boat;
|
||||||
import seng302.Networking.BinaryMessageDecoder;
|
import seng302.Networking.BinaryMessageDecoder;
|
||||||
import seng302.Networking.Exceptions.InvalidMessageException;
|
import seng302.Networking.Exceptions.InvalidMessageException;
|
||||||
import seng302.Networking.Messages.*;
|
import seng302.Networking.Messages.*;
|
||||||
@@ -13,6 +14,7 @@ import java.nio.ByteBuffer;
|
|||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ArrayBlockingQueue;
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
|
|
||||||
@@ -219,7 +221,7 @@ public class VisualiserInput implements Runnable {
|
|||||||
|
|
||||||
//If no heartbeat has been received in more the heartbeat period
|
//If no heartbeat has been received in more the heartbeat period
|
||||||
//then the connection will need to be restarted.
|
//then the connection will need to be restarted.
|
||||||
System.out.println("time since last heartbeat: " + timeSinceHeartbeat());//TEMP REMOVE
|
//System.out.println("time since last heartbeat: " + timeSinceHeartbeat());//TEMP REMOVE
|
||||||
long heartBeatPeriod = 10 * 1000;
|
long heartBeatPeriod = 10 * 1000;
|
||||||
if (timeSinceHeartbeat() > heartBeatPeriod) {
|
if (timeSinceHeartbeat() > heartBeatPeriod) {
|
||||||
System.out.println("Connection has stopped, trying to reconnect.");
|
System.out.println("Connection has stopped, trying to reconnect.");
|
||||||
@@ -258,10 +260,10 @@ public class VisualiserInput implements Runnable {
|
|||||||
System.err.println("Unable to read message: " + e.getMessage());
|
System.err.println("Unable to read message: " + e.getMessage());
|
||||||
//Continue to the next loop iteration/message.
|
//Continue to the next loop iteration/message.
|
||||||
continue;
|
continue;
|
||||||
}
|
}/*
|
||||||
|
|
||||||
//Add it to message queue.
|
//Add it to message queue.
|
||||||
this.messagesReceivedQueue.add(message);
|
this.messagesReceivedQueue.add(message);*/
|
||||||
|
|
||||||
|
|
||||||
//Checks which message is being received and does what is needed for that message.
|
//Checks which message is being received and does what is needed for that message.
|
||||||
@@ -379,7 +381,6 @@ public class VisualiserInput implements Runnable {
|
|||||||
//If the map _doesn't_ already contain a message for this boat, insert the message.
|
//If the map _doesn't_ already contain a message for this boat, insert the message.
|
||||||
this.boatLocationMap.put(boatLocation.getSourceID(), boatLocation);
|
this.boatLocationMap.put(boatLocation.getSourceID(), boatLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
//MarkRounding.
|
//MarkRounding.
|
||||||
else if (message instanceof MarkRounding) {
|
else if (message instanceof MarkRounding) {
|
||||||
|
|||||||
Reference in New Issue
Block a user