commented out buffered code and cleaned up some other areas to try and make the boatgroup clear enough to modify #story[923]

This commit is contained in:
Peter Galloway
2017-05-15 17:53:11 +12:00
parent 85d4d63287
commit ed8d70c3b3
7 changed files with 61 additions and 165 deletions
@@ -106,7 +106,7 @@ public class CanvasController {
// TODO: 1/05/17 wmu16 - Change this call to now draw the marks as from the xml // TODO: 1/05/17 wmu16 - Change this call to now draw the marks as from the xml
drawBoats(); initializeBoats();
timer = new AnimationTimer() { timer = new AnimationTimer() {
@Override @Override
@@ -157,8 +157,8 @@ public class CanvasController {
SingleMark thisMark1 = new SingleMark("", thisPoint1.getLat(), thisPoint1.getLng(), thisPoint1.getSeqID()); SingleMark thisMark1 = new SingleMark("", thisPoint1.getLat(), thisPoint1.getLng(), thisPoint1.getSeqID());
Limit thisPoint2 = courseLimits.get(i+1); Limit thisPoint2 = courseLimits.get(i+1);
SingleMark thisMark2 = new SingleMark("", thisPoint2.getLat(), thisPoint2.getLng(), thisPoint2.getSeqID()); SingleMark thisMark2 = new SingleMark("", thisPoint2.getLat(), thisPoint2.getLng(), thisPoint2.getSeqID());
Point2D borderPoint1 = findScaledXY(thisMark1); Point2D borderPoint1 = latLonToXY(thisMark1.getLatitude(), thisMark1.getLongitude());
Point2D borderPoint2 = findScaledXY(thisMark2); Point2D borderPoint2 = latLonToXY(thisMark2.getLatitude(), thisMark2.getLongitude());
gc.strokeLine(borderPoint1.getX(), borderPoint1.getY(), gc.strokeLine(borderPoint1.getX(), borderPoint1.getY(),
borderPoint2.getX(), borderPoint2.getY()); borderPoint2.getX(), borderPoint2.getY());
xBoundaryPoints[i] = borderPoint1.getX(); xBoundaryPoints[i] = borderPoint1.getX();
@@ -168,8 +168,8 @@ public class CanvasController {
SingleMark thisMark1 = new SingleMark("", thisPoint1.getLat(), thisPoint1.getLng(), thisPoint1.getSeqID()); SingleMark thisMark1 = new SingleMark("", thisPoint1.getLat(), thisPoint1.getLng(), thisPoint1.getSeqID());
Limit thisPoint2 = courseLimits.get(0); Limit thisPoint2 = courseLimits.get(0);
SingleMark thisMark2 = new SingleMark("", thisPoint2.getLat(), thisPoint2.getLng(), thisPoint2.getSeqID()); SingleMark thisMark2 = new SingleMark("", thisPoint2.getLat(), thisPoint2.getLng(), thisPoint2.getSeqID());
Point2D borderPoint1 = findScaledXY(thisMark1); Point2D borderPoint1 = latLonToXY(thisMark1.getLatitude(), thisMark1.getLongitude());
Point2D borderPoint2 = findScaledXY(thisMark2); Point2D borderPoint2 = latLonToXY(thisMark2.getLatitude(), thisMark2.getLongitude());
gc.strokeLine(borderPoint1.getX(), borderPoint1.getY(), gc.strokeLine(borderPoint1.getX(), borderPoint1.getY(),
borderPoint2.getX(), borderPoint2.getY()); borderPoint2.getX(), borderPoint2.getY());
xBoundaryPoints[courseLimits.size()-1] = borderPoint1.getX(); xBoundaryPoints[courseLimits.size()-1] = borderPoint1.getX();
@@ -207,8 +207,8 @@ public class CanvasController {
singleMark1.getLongitude()); singleMark1.getLongitude());
markGroup = new MarkGroup(thisGateMark, markGroup = new MarkGroup(thisGateMark,
findScaledXY(thisGateMark.getSingleMark1()), latLonToXY(thisGateMark.getSingleMark1().getLatitude(), thisGateMark.getSingleMark1().getLongitude()),
findScaledXY(thisGateMark.getSingleMark2())); latLonToXY(thisGateMark.getSingleMark2().getLatitude(), thisGateMark.getSingleMark2().getLongitude()));
raceObjects.add(markGroup); raceObjects.add(markGroup);
raceMarks.add(thisGateMark); raceMarks.add(thisGateMark);
@@ -221,7 +221,7 @@ public class CanvasController {
singleMark.getTargetLng(), singleMark.getTargetLng(),
singleMark.getSourceID()); singleMark.getSourceID());
markGroup = new MarkGroup(thisSingleMark, findScaledXY(thisSingleMark)); markGroup = new MarkGroup(thisSingleMark, latLonToXY(thisSingleMark.getLatitude(), thisSingleMark.getLongitude()));
raceObjects.add(markGroup); raceObjects.add(markGroup);
raceMarks.add(thisSingleMark); raceMarks.add(thisSingleMark);
@@ -245,27 +245,30 @@ public class CanvasController {
private void move(long id, RaceObject raceObject){ private void move(long id, RaceObject raceObject){
PriorityBlockingQueue<BoatPositionPacket> movementQueue = StreamParser.boatPositions.get(id); PriorityBlockingQueue<BoatPositionPacket> movementQueue = StreamParser.boatPositions.get(id);
if (movementQueue.size() > 0){ if (movementQueue.size() > 0){
BoatPositionPacket positionPacket = movementQueue.peek(); // BoatPositionPacket positionPacket = movementQueue.peek();
//this code adds a delay to reading from the movementQueue //this code adds a delay to reading from the movementQueue
//in case things being put into the movement queue are slightly //in case things being put into the movement queue are slightly
//out of order //out of order
int delayTime = 1000; // int delayTime = 1000;
int loopTime = delayTime * 10; // int loopTime = delayTime * 10;
long timeDiff = (System.currentTimeMillis()%loopTime - positionPacket.getTimeValid()%loopTime); // long timeDiff = (System.currentTimeMillis()%loopTime - positionPacket.getTimeValid()%loopTime);
if (timeDiff < 0){ // if (timeDiff < 0){
timeDiff = loopTime + timeDiff; // timeDiff = loopTime + timeDiff;
} // }
if (timeDiff > delayTime) { // if (timeDiff > delayTime) {
try { try {
positionPacket = movementQueue.take(); BoatPositionPacket positionPacket = movementQueue.take();
if (id == 104){
System.out.println(positionPacket.getTimeValid());
}
Point2D p2d = latLonToXY(positionPacket.getLat(), positionPacket.getLon()); Point2D p2d = latLonToXY(positionPacket.getLat(), positionPacket.getLon());
double heading = 360.0 / 0xffff * positionPacket.getHeading(); double heading = 360.0 / 0xffff * positionPacket.getHeading();
raceObject.setDestination(p2d.getX(), p2d.getY(), heading, positionPacket.getGroundSpeed(), (int) id); raceObject.setDestination(p2d.getX(), p2d.getY(), heading, positionPacket.getGroundSpeed(), (int) id);
} catch (InterruptedException e){ } catch (InterruptedException e){
e.printStackTrace(); e.printStackTrace();
} }
} // }
} }
} }
@@ -320,20 +323,13 @@ public class CanvasController {
/** /**
* Draws all the boats. * Draws all the boats.
*/ */
private void drawBoats() { private void initializeBoats() {
// Map<Boat, TimelineInfo> timelineInfos = raceViewController.getTimelineInfos();
// List<Boat> boats = raceViewController.getStartingBoats();
Map<Integer, Yacht> boats = StreamParser.getBoats(); Map<Integer, Yacht> boats = StreamParser.getBoats();
Double startingX = raceObjects.get(0).getLayoutX();
Double startingY = raceObjects.get(0).getLayoutY();
Group boatAnnotations = new Group(); Group boatAnnotations = new Group();
for (Yacht boat : boats.values()) { for (Yacht boat : boats.values()) {
// for (Boat boat : boats) {
boat.setColour(Colors.getColor()); boat.setColour(Colors.getColor());
BoatGroup boatGroup = new BoatGroup(boat, boat.getColour()); BoatGroup boatGroup = new BoatGroup(boat, boat.getColour());
boatGroup.moveTo(startingX, startingY, 0d);
//boatGroup.setStage(raceViewController.getStage());
raceObjects.add(boatGroup); raceObjects.add(boatGroup);
boatAnnotations.getChildren().add(boatGroup.getLowPriorityAnnotations()); boatAnnotations.getChildren().add(boatGroup.getLowPriorityAnnotations());
} }
@@ -456,10 +452,12 @@ public class CanvasController {
if (!processed.contains(mark)) { if (!processed.contains(mark)) {
if (mark.getMarkType() != MarkType.SINGLE_MARK) { if (mark.getMarkType() != MarkType.SINGLE_MARK) {
GateMark gateMark = (GateMark) mark; GateMark gateMark = (GateMark) mark;
markGroup = new MarkGroup(mark, findScaledXY(gateMark.getSingleMark1()), findScaledXY(gateMark.getSingleMark2())); markGroup = new MarkGroup(mark,
latLonToXY(gateMark.getSingleMark1().getLatitude(), gateMark.getSingleMark1().getLongitude()),
latLonToXY(gateMark.getSingleMark2().getLatitude(), gateMark.getSingleMark2().getLongitude()));
raceObjects.add(markGroup); raceObjects.add(markGroup);
} else { } else {
markGroup = new MarkGroup(mark, findScaledXY(mark)); markGroup = new MarkGroup(mark, latLonToXY(mark.getLatitude(), mark.getLongitude()));
raceObjects.add(markGroup); raceObjects.add(markGroup);
} }
processed.add(mark); processed.add(mark);
@@ -467,19 +465,18 @@ public class CanvasController {
} }
} }
private Point2D findScaledXY (Mark unscaled) {
return findScaledXY (minLatPoint.getLatitude(), minLatPoint.getLongitude(),
unscaled.getLatitude(), unscaled.getLongitude());
}
private Point2D findScaledXY (double latA, double lonA, double latB, double lonB) {
private Point2D latLonToXY (double latitude, double longitude){
double distanceFromReference; double distanceFromReference;
double angleFromReference; double angleFromReference;
int xAxisLocation = (int) referencePointX; int xAxisLocation = (int) referencePointX;
int yAxisLocation = (int) referencePointY; int yAxisLocation = (int) referencePointY;
angleFromReference = Mark.calculateHeadingRad(latA, lonA, latB, lonB); double minLat = minLatPoint.getLatitude();
distanceFromReference = Mark.calculateDistance(latA, lonA, latB, lonB); double minLon = minLatPoint.getLongitude();
angleFromReference = Mark.calculateHeadingRad(minLat, minLon, latitude, longitude);
distanceFromReference = Mark.calculateDistance(minLat, minLon, latitude, longitude);
if (angleFromReference >= 0 && angleFromReference <= Math.PI / 2) { if (angleFromReference >= 0 && angleFromReference <= Math.PI / 2) {
xAxisLocation += (int) Math.round(distanceScaleFactor * Math.sin(angleFromReference) * distanceFromReference); xAxisLocation += (int) Math.round(distanceScaleFactor * Math.sin(angleFromReference) * distanceFromReference);
yAxisLocation -= (int) Math.round(distanceScaleFactor * Math.cos(angleFromReference) * distanceFromReference); yAxisLocation -= (int) Math.round(distanceScaleFactor * Math.cos(angleFromReference) * distanceFromReference);
@@ -529,10 +526,6 @@ public class CanvasController {
} }
} }
private Point2D latLonToXY (double latitude, double longitude) {
return findScaledXY(minLatPoint.getLatitude(), minLatPoint.getLongitude(), latitude, longitude);
}
List<RaceObject> getRaceObjects() { List<RaceObject> getRaceObjects() {
return raceObjects; return raceObjects;
} }
+5 -43
View File
@@ -122,7 +122,8 @@ public class BoatGroup extends RaceObject{
velocityObject.setLayoutY(velocityObject.getLayoutY() + dy); velocityObject.setLayoutY(velocityObject.getLayoutY() + dy);
wake.setLayoutX(wake.getLayoutX() + dx); wake.setLayoutX(wake.getLayoutX() + dx);
wake.setLayoutY(wake.getLayoutY() + dy); wake.setLayoutY(wake.getLayoutY() + dy);
rotateTo(rotation + currentRotation); currentRotation = rotation + currentRotation;
boatPoly.getTransforms().setAll(new Rotate(rotation));
} }
/** /**
@@ -132,16 +133,8 @@ public class BoatGroup extends RaceObject{
* @param rotation The heading in degrees from north the boat should rotate to. * @param rotation The heading in degrees from north the boat should rotate to.
*/ */
public void moveTo (double x, double y, double rotation) { public void moveTo (double x, double y, double rotation) {
rotateTo(rotation); currentRotation = rotation;
moveTo(x, y); boatPoly.getTransforms().setAll(new Rotate(rotation));
}
/**
* Moves the boat and its children annotations to coordinates specified
* @param x The X coordinate to move the boat to
* @param y The Y coordinate to move the boat to
*/
public void moveTo (double x, double y) {
boatPoly.setLayoutX(x); boatPoly.setLayoutX(x);
boatPoly.setLayoutY(y); boatPoly.setLayoutY(y);
teamNameObject.setLayoutX(x); teamNameObject.setLayoutX(x);
@@ -165,6 +158,7 @@ public class BoatGroup extends RaceObject{
double rotation = rotationalVelocity * timeInterval; double rotation = rotationalVelocity * timeInterval;
distanceTravelled += Math.abs(dx) + Math.abs(dy); distanceTravelled += Math.abs(dx) + Math.abs(dy);
moveGroupBy(dx, dy, rotation); moveGroupBy(dx, dy, rotation);
//Draw a new section of the trail every 20 pixels of movement. //Draw a new section of the trail every 20 pixels of movement.
if (distanceTravelled > 20) { if (distanceTravelled > 20) {
distanceTravelled = 0; distanceTravelled = 0;
@@ -203,12 +197,6 @@ public class BoatGroup extends RaceObject{
currentRotation = 360 - currentRotation; currentRotation = 360 - currentRotation;
double dx = newXValue - boatPoly.getLayoutX(); double dx = newXValue - boatPoly.getLayoutX();
double dy = newYValue - boatPoly.getLayoutY(); double dy = newYValue - boatPoly.getLayoutY();
//Check movement is reasonable. Assumes a 1000 * 1000 canvas
if (Math.abs(dx) > 50 || Math.abs(dy) > 50) {
dx = 0;
dy = 0;
moveTo(newXValue, newYValue);
}
pixelVelocityX = dx / expectedUpdateInterval; pixelVelocityX = dx / expectedUpdateInterval;
pixelVelocityY = dy / expectedUpdateInterval; pixelVelocityY = dy / expectedUpdateInterval;
@@ -217,7 +205,6 @@ public class BoatGroup extends RaceObject{
if (wakeGenerationDelay > 0) { if (wakeGenerationDelay > 0) {
wake.rotate(rotationalGoal); wake.rotate(rotationalGoal);
rotateTo(rotationalGoal); //Need to test with this removed.
rotationalVelocity = 0; rotationalVelocity = 0;
wakeGenerationDelay--; wakeGenerationDelay--;
} else { } else {
@@ -254,31 +241,6 @@ public class BoatGroup extends RaceObject{
} }
} }
public void setDestination (double newXValue, double newYValue, double groundSpeed, int... raceIDs) {
destinationSet = true;
if (hasRaceId(raceIDs)) {
double rotation = Math.abs(
Math.toDegrees(
Math.atan(
(newYValue - boatPoly.getLayoutY()) / (newXValue - boatPoly.getLayoutX())
)
)
);
setDestination(newXValue, newYValue, rotation, groundSpeed, raceIDs);
}
}
public void rotateTo (double rotation) {
currentRotation = rotation;
boatPoly.getTransforms().setAll(new Rotate(rotation));
}
public void forceRotation () {
rotateTo (rotationalGoal);
wake.rotate(rotationalGoal);
}
public void setTeamNameObjectVisible(Boolean visible) { public void setTeamNameObjectVisible(Boolean visible) {
teamNameObject.setVisible(visible); teamNameObject.setVisible(visible);
} }
+4 -16
View File
@@ -47,10 +47,10 @@ public abstract class RaceObject extends Group {
this.rotationalVelocity = (rotationalGoal - currentRotation) / expectedUpdateInterval; this.rotationalVelocity = (rotationalGoal - currentRotation) / expectedUpdateInterval;
} }
//Sometimes the rotation is too large to be realistic. In that case just do it instantly. //Sometimes the rotation is too large to be realistic. In that case just do it instantly.
if (Math.abs(rotationalVelocity) > 1) { // if (Math.abs(rotationalVelocity) > 1) {
rotationalVelocity = 0; // rotationalVelocity = 0;
rotateTo(rotationalGoal); // rotateTo(rotationalGoal);
} // }
} }
/** /**
@@ -62,25 +62,13 @@ public abstract class RaceObject extends Group {
* @param raceIds RaceID of the object to move. * @param raceIds RaceID of the object to move.
*/ */
public abstract void setDestination (double x, double y, double rotation, double groundSpeed, int... raceIds); public abstract void setDestination (double x, double y, double rotation, double groundSpeed, int... raceIds);
/**
* Sets the destination of everything within the RaceObject that has an ID in the array raceIds. The destination is
* set to the co-ordinates (x, y).
* @param x X co-ordinate to move the graphic to.
* @param y Y co-ordinate to move the graphic to.
* @param raceIds RaceID to the object to move.
*/
public abstract void setDestination (double x, double y, double groundSpeed, int... raceIds);
public abstract void updatePosition (long timeInterval); public abstract void updatePosition (long timeInterval);
public abstract void moveTo (double x, double y, double rotation); public abstract void moveTo (double x, double y, double rotation);
public abstract void moveTo (double x, double y);
public abstract void moveGroupBy(double x, double y, double rotation); public abstract void moveGroupBy(double x, double y, double rotation);
public abstract void rotateTo (double rotation);
public abstract boolean hasRaceId (int... raceIds); public abstract boolean hasRaceId (int... raceIds);
public abstract int[] getRaceIds (); public abstract int[] getRaceIds ();
@@ -92,16 +92,12 @@ public class MarkGroup extends RaceObject {
} }
public void setDestination (double x, double y, double rotation, double groundSpeed, int... raceIds) { public void setDestination (double x, double y, double rotation, double groundSpeed, int... raceIds) {
setDestination(x, y, 0, raceIds);
this.rotationalGoal = rotation;
calculateRotationalVelocity();
}
public void setDestination (double x, double y, double groundSpeed, int... raceIds) {
for (int i = 0; i < marks.size(); i++) for (int i = 0; i < marks.size(); i++)
for (int id : raceIds) for (int id : raceIds)
if (id == marks.get(i).getId()) if (id == marks.get(i).getId())
setDestinationChild(x, y, 0, Math.max(0, i-1)); setDestinationChild(x, y, 0, Math.max(0, i-1));
this.rotationalGoal = rotation;
calculateRotationalVelocity();
} }
@@ -1,44 +0,0 @@
package seng302.models.parsers;
/**
* Created by kre39 on 23/04/17.
*/
public class StreamPacket {
//Change int to an ENUM for the type
private PacketType type;
private long messageLength;
private long timeStamp;
private byte[] payload;
StreamPacket(int type, long messageLength, long timeStamp, byte[] payload) {
this.type = PacketType.assignPacketType(type);
this.messageLength = messageLength;
this.timeStamp = timeStamp;
this.payload = payload;
// System.out.println("type = " + this.type.toString());
//switch the packet type to deal with what ever specific packet you want to deal with
// if (this.type == PacketType.XML_MESSAGE){
// //System.out.println("--------");
// System.out.println(new String(payload));
// //StreamParser.parsePacket(this);
// }
}
PacketType getType() {
return type;
}
public long getMessageLength() {
return messageLength;
}
byte[] getPayload() {
return payload;
}
long getTimeStamp() {
return timeStamp;
}
}
@@ -66,20 +66,20 @@ public class StreamParser extends Thread{
Thread.sleep(1); Thread.sleep(1);
} }
while (appRunning){ while (appRunning){
StreamPacket packet = StreamReceiver.packetBuffer.peek(); // StreamPacket packet = StreamReceiver.packetBuffer.peek();
//this code adds a delay to reading from the packetBuffer so //this code adds a delay to reading from the packetBuffer so
//out of order packets have time to order themselves in the queue //out of order packets have time to order themselves in the queue
int delayTime = 1000; // int delayTime = 1000;
int loopTime = delayTime * 10; // int loopTime = delayTime * 10;
long transitTime = (System.currentTimeMillis()%loopTime - packet.getTimeStamp()%loopTime); // long transitTime = (System.currentTimeMillis()%loopTime - packet.getTimeStamp()%loopTime);
if (transitTime < 0){ // if (transitTime < 0){
transitTime = loopTime + transitTime; // transitTime = loopTime + transitTime;
} // }
if (transitTime < delayTime) { // if (transitTime < delayTime) {
long sleepTime = delayTime - (transitTime); // long sleepTime = delayTime - (transitTime);
Thread.sleep(sleepTime); // Thread.sleep(sleepTime);
} // }
packet = StreamReceiver.packetBuffer.take(); StreamPacket packet = StreamReceiver.packetBuffer.take();
parsePacket(packet); parsePacket(packet);
Thread.sleep(1); Thread.sleep(1);
while (StreamReceiver.packetBuffer.peek() == null) { while (StreamReceiver.packetBuffer.peek() == null) {
@@ -2,6 +2,7 @@ package seng302.models.parsers;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import seng302.models.parsers.packets.StreamPacket;
import java.io.*; import java.io.*;
import java.lang.reflect.Method; import java.lang.reflect.Method;