Moved several classes from seng302.model to its own module - sharedModel (this is supposed to contain any shared data model code between mock and visualiser). Specifically, Regatta, Boat, BoatInRace, Constants, GPSCoordinate, Leg, Marker.
Updated RaceVisionByteEncoder.raceStatus to accept a Racestatus object rather than a bunch of parameters. Added getters to RaceStatus class. Updated some tests. Removed Network tests from Mock, as they were duplicated.
This commit is contained in:
@@ -46,6 +46,18 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>seng302</groupId>
|
||||
<artifactId>network</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>seng302</groupId>
|
||||
<artifactId>sharedModel</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
package seng302;
|
||||
|
||||
/**
|
||||
* Constants that are used throughout the program
|
||||
* Created by Erika on 19-Mar-17.
|
||||
*/
|
||||
public class Constants {
|
||||
|
||||
public static final int NMToMetersConversion = 1852; // 1 nautical mile = 1852 meters
|
||||
|
||||
//Knots x this = meters per second.
|
||||
public static final double KnotsToMetersPerSecondConversionFactor = 0.514444;
|
||||
|
||||
public static final double wakeScale = 10;
|
||||
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import org.w3c.dom.Attr;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import seng302.Exceptions.InvalidBoatDataException;
|
||||
import seng302.Model.BoatInRace;
|
||||
import SharedModel.BoatInRace;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
|
||||
@@ -4,9 +4,9 @@ import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import seng302.DataInput.RaceDataSource;
|
||||
import seng302.Exceptions.InvalidRaceDataException;
|
||||
import seng302.Model.BoatInRace;
|
||||
import seng302.Model.GPSCoordinate;
|
||||
import seng302.Model.Marker;
|
||||
import SharedModel.BoatInRace;
|
||||
import SharedModel.GPSCoordinate;
|
||||
import SharedModel.Marker;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package seng302.DataInput;
|
||||
|
||||
import seng302.Model.BoatInRace;
|
||||
import seng302.Model.GPSCoordinate;
|
||||
import seng302.Model.Leg;
|
||||
import seng302.Model.Marker;
|
||||
import SharedModel.BoatInRace;
|
||||
import SharedModel.GPSCoordinate;
|
||||
import SharedModel.Leg;
|
||||
import SharedModel.Marker;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@@ -4,10 +4,10 @@ import javafx.scene.paint.Color;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.SAXException;
|
||||
import seng302.Model.BoatInRace;
|
||||
import seng302.Model.GPSCoordinate;
|
||||
import seng302.Model.Leg;
|
||||
import seng302.Model.Marker;
|
||||
import SharedModel.BoatInRace;
|
||||
import SharedModel.GPSCoordinate;
|
||||
import SharedModel.Leg;
|
||||
import SharedModel.Marker;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package seng302.DataInput;
|
||||
|
||||
import seng302.Model.Regatta;
|
||||
import SharedModel.Regatta;
|
||||
|
||||
/**
|
||||
* Created by zwu18 on 25/04/17.
|
||||
|
||||
@@ -3,7 +3,7 @@ package seng302.DataInput;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.SAXException;
|
||||
import seng302.Model.Regatta;
|
||||
import SharedModel.Regatta;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
package seng302.Model;
|
||||
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
|
||||
/**
|
||||
* Created by fwy13 on 3/03/17.
|
||||
*/
|
||||
public class Boat {
|
||||
|
||||
private StringProperty name;
|
||||
private double velocity;
|
||||
private StringProperty velocityProp;
|
||||
private String abbrev;
|
||||
private int sourceID;
|
||||
|
||||
/**
|
||||
* Boat initialiser which keeps all of the information of the boat.
|
||||
*
|
||||
* @param name Name of the Boat.
|
||||
* @param velocity Speed in m/s that the boat travels at.
|
||||
* @param abbrev nam abbreviation
|
||||
*/
|
||||
public Boat(String name, double velocity, String abbrev, int sourceID) {
|
||||
this.velocity = velocity;
|
||||
this.velocityProp = new SimpleStringProperty(String.valueOf(Math.round(velocity)));
|
||||
this.abbrev = abbrev;
|
||||
this.name = new SimpleStringProperty(name);
|
||||
this.sourceID = sourceID;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Name of the boat
|
||||
*/
|
||||
public StringProperty getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the boat name
|
||||
*
|
||||
* @param name of boat
|
||||
*/
|
||||
public void setName(String name) {
|
||||
this.name.setValue(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Speed of the boat.
|
||||
*/
|
||||
public double getVelocity() {
|
||||
return velocity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the speed of the boat in knots.
|
||||
*
|
||||
* @param velocity speed in knots
|
||||
*/
|
||||
public void setVelocity(double velocity) {
|
||||
this.velocity = velocity;
|
||||
this.velocityProp.setValue(String.valueOf(Math.round(velocity)));
|
||||
}
|
||||
|
||||
public int getSourceID() {
|
||||
return sourceID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print method prints the name of the boat
|
||||
*
|
||||
* @return Name of the boat.
|
||||
*/
|
||||
public String toString() {
|
||||
return getName().getValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Velocity String Property of the boat
|
||||
*/
|
||||
public StringProperty getVelocityProp() {
|
||||
return velocityProp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Abbreviation of the boat
|
||||
*/
|
||||
public String getAbbrev() {
|
||||
return abbrev;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,280 +0,0 @@
|
||||
package seng302.Model;
|
||||
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import javafx.scene.paint.Color;
|
||||
import org.geotools.referencing.GeodeticCalculator;
|
||||
import seng302.Constants;
|
||||
|
||||
import java.awt.geom.Point2D;
|
||||
|
||||
/**
|
||||
* Boat in the Race extends Boat.
|
||||
* Created by esa46 on 15/03/17.
|
||||
*/
|
||||
public class BoatInRace extends Boat {
|
||||
|
||||
private Leg currentLeg;
|
||||
private double scaledVelocity;
|
||||
private double distanceTravelledInLeg;
|
||||
private GPSCoordinate currentPosition;
|
||||
private long timeFinished;
|
||||
private Color colour;
|
||||
private boolean finished = false;
|
||||
private StringProperty currentLegName;
|
||||
private boolean started = false;
|
||||
private StringProperty position;
|
||||
private double heading;
|
||||
|
||||
///While generating BoatLocationMessages, each one needs a sequence number relating to each boat.
|
||||
private long sequenceNumber = 0;
|
||||
|
||||
private boolean trackVisible = true;
|
||||
|
||||
/**
|
||||
* Constructor method.
|
||||
*
|
||||
* @param name Name of the boat.
|
||||
* @param velocity Speed that the boat travels.
|
||||
* @param colour Colour the boat will be displayed as on the map
|
||||
* @param abbrev of boat
|
||||
*/
|
||||
public BoatInRace(String name, double velocity, Color colour, String abbrev, int sourceID) {
|
||||
super(name, velocity, abbrev, sourceID);
|
||||
setColour(colour);
|
||||
currentLegName = new SimpleStringProperty("");
|
||||
position = new SimpleStringProperty("-");
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an azimuth to a bearing
|
||||
*
|
||||
* @param azimuth azimuth value to be converted
|
||||
* @return the bearings in degrees (0 to 360).
|
||||
*/
|
||||
public static double calculateHeading(double azimuth) {
|
||||
if (azimuth >= 0) {
|
||||
return azimuth;
|
||||
} else {
|
||||
return azimuth + 360;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the azimuth of the travel via map coordinates of the raceMarkers
|
||||
*
|
||||
* @return the direction that the boat is heading towards in degrees (-180 to 180).
|
||||
*/
|
||||
public double calculateAzimuth() {
|
||||
|
||||
GeodeticCalculator calc = new GeodeticCalculator();
|
||||
GPSCoordinate start = currentLeg.getStartMarker().getAverageGPSCoordinate();
|
||||
GPSCoordinate end = currentLeg.getEndMarker().getAverageGPSCoordinate();
|
||||
|
||||
calc.setStartingGeographicPoint(start.getLongitude(), start.getLatitude());
|
||||
calc.setDestinationGeographicPoint(end.getLongitude(), end.getLatitude());
|
||||
|
||||
return calc.getAzimuth();
|
||||
}
|
||||
|
||||
public double getHeading() {
|
||||
return heading;
|
||||
}
|
||||
|
||||
public void setHeading(double heading) {
|
||||
this.heading = heading;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the bearing of the travel via map coordinates of the raceMarkers
|
||||
*
|
||||
* @return the direction that the boat is heading towards in degrees (0 to 360).
|
||||
*/
|
||||
public double calculateHeading() {
|
||||
double azimuth = this.calculateAzimuth();
|
||||
return calculateHeading(azimuth);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the position of the end of the boat's wake, which is 180 degrees
|
||||
* from the boat's heading, and whose length is proportional to the boat's
|
||||
* speed.
|
||||
*
|
||||
* @return GPSCoordinate of wake endpoint.
|
||||
*/
|
||||
public GPSCoordinate getWake() {
|
||||
double reverseHeading = getHeading() - 180;
|
||||
double distance = Constants.wakeScale * getVelocity();
|
||||
|
||||
GeodeticCalculator calc = new GeodeticCalculator();
|
||||
calc.setStartingGeographicPoint(
|
||||
new Point2D.Double(getCurrentPosition().getLongitude(), getCurrentPosition().getLatitude())
|
||||
);
|
||||
calc.setDirection(reverseHeading, distance);
|
||||
Point2D endpoint = calc.getDestinationGeographicPoint();
|
||||
return new GPSCoordinate(endpoint.getY(), endpoint.getX());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Scaled velocity of the boat
|
||||
*/
|
||||
public double getScaledVelocity() {
|
||||
return scaledVelocity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the boat's scaled velocity
|
||||
*
|
||||
* @param velocity of boat
|
||||
*/
|
||||
public void setScaledVelocity(double velocity) {
|
||||
this.scaledVelocity = velocity;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Returns the current position of the boat in a GPSCoordinate Class.
|
||||
* @see GPSCoordinate
|
||||
*/
|
||||
public GPSCoordinate getCurrentPosition() {
|
||||
return currentPosition;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the current position on the GPS that the boat.
|
||||
*
|
||||
* @param position GPSCoordinate of the position that the boat is currently on.
|
||||
* @see GPSCoordinate
|
||||
*/
|
||||
public void setCurrentPosition(GPSCoordinate position) {
|
||||
this.currentPosition = position;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Returns the time that the boat finished the race.
|
||||
*/
|
||||
public long getTimeFinished() {
|
||||
return timeFinished;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the time that the boat finished the race.
|
||||
*
|
||||
* @param timeFinished Time the boat finished the race.
|
||||
*/
|
||||
public void setTimeFinished(long timeFinished) {
|
||||
this.timeFinished = timeFinished;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Returns the colour of the boat.
|
||||
*/
|
||||
public Color getColour() {
|
||||
return colour;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the colour that boat will be shown as when drawn on the ResizableRaceCanvas.
|
||||
*
|
||||
* @param colour Colour that the boat is to be set to.
|
||||
*/
|
||||
public void setColour(Color colour) {
|
||||
this.colour = colour;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current leg that the boat is on.
|
||||
*
|
||||
* @return returns the leg the boat is on in a Leg class
|
||||
* @see Leg
|
||||
*/
|
||||
public Leg getCurrentLeg() {
|
||||
return currentLeg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the boat's current leg.
|
||||
*
|
||||
* @param currentLeg Leg class that the boat is currently on.
|
||||
* @see Leg
|
||||
*/
|
||||
public void setCurrentLeg(Leg currentLeg) {
|
||||
this.currentLeg = currentLeg;
|
||||
this.currentLegName.setValue(currentLeg.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Name of boat's current leg
|
||||
*/
|
||||
public StringProperty getCurrentLegName() {
|
||||
return currentLegName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the distance travelled by the boat in the leg.
|
||||
*
|
||||
* @return Returns the value in nautical miles (1.852km) that the boat has traversed.
|
||||
*/
|
||||
public double getDistanceTravelledInLeg() {
|
||||
return distanceTravelledInLeg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the distance travelled by the boat in the leg in nautical miles (1.852km)
|
||||
*
|
||||
* @param distanceTravelledInLeg Distance travelled by the boat in nautical miles.
|
||||
*/
|
||||
public void setDistanceTravelledInLeg(double distanceTravelledInLeg) {
|
||||
this.distanceTravelledInLeg = distanceTravelledInLeg;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return true if boat has finished, false if not
|
||||
*/
|
||||
public boolean isFinished() {
|
||||
return this.finished;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether boat is finished or not
|
||||
*
|
||||
* @param bool is finished value
|
||||
*/
|
||||
public void setFinished(boolean bool) {
|
||||
this.finished = bool;
|
||||
}
|
||||
|
||||
public boolean isStarted() {
|
||||
return started;
|
||||
}
|
||||
|
||||
public void setStarted(boolean started) {
|
||||
this.started = started;
|
||||
}
|
||||
|
||||
public String getPosition() {
|
||||
return position.get();
|
||||
}
|
||||
|
||||
public void setPosition(String position) {
|
||||
this.position.set(position);
|
||||
}
|
||||
|
||||
public StringProperty positionProperty() {
|
||||
return position;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current sequence number, and increments the internal value, such that that next call will return a value 1 larger than the current call.
|
||||
*
|
||||
* @return Current sequence number.
|
||||
*/
|
||||
public long getNextSequenceNumber() {
|
||||
//Make a copy of current value.
|
||||
long oldNumber = this.sequenceNumber;
|
||||
//Increment.
|
||||
this.sequenceNumber += 1;
|
||||
//Return the previous value.
|
||||
return oldNumber;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
package seng302.Model;
|
||||
|
||||
/**
|
||||
* GPS Coordinate for the world map.
|
||||
* Created by esa46 on 15/03/17.
|
||||
*/
|
||||
public class GPSCoordinate {
|
||||
|
||||
private double latitude;
|
||||
private double longitude;
|
||||
|
||||
/**
|
||||
* Constructor Method
|
||||
*
|
||||
* @param latitude latitude the coordinate is located at.
|
||||
* @param longitude Longitude that the coordinate is located at.
|
||||
*/
|
||||
public GPSCoordinate(double latitude, double longitude) {
|
||||
this.latitude = latitude;
|
||||
this.longitude = longitude;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Latitude that the Coordinate is at.
|
||||
*
|
||||
* @return Returns the latitude of the Coordinate.
|
||||
*/
|
||||
public double getLatitude() {
|
||||
return latitude;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the Longitude that the Coordinate is at.
|
||||
*
|
||||
* @return Returns the longitude of the Coordinate.
|
||||
*/
|
||||
public double getLongitude() {
|
||||
return longitude;
|
||||
}
|
||||
|
||||
/**
|
||||
* To String method of the Coordinate in the form Latitude: $f, Longitude: $f.
|
||||
*
|
||||
* @return A String representation of the GPSCoordinate Class.
|
||||
*/
|
||||
public String toString() {
|
||||
return String.format("Latitude: %f, Longitude: %f", latitude, longitude);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
GPSCoordinate that = (GPSCoordinate) o;
|
||||
|
||||
if (Math.abs(this.latitude - that.latitude) > 1e-7) return false;
|
||||
return (Math.abs(this.longitude - that.longitude) < 1e-7);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result;
|
||||
long temp;
|
||||
temp = Double.doubleToLongBits(latitude);
|
||||
result = (int) (temp ^ (temp >>> 32));
|
||||
temp = Double.doubleToLongBits(longitude);
|
||||
result = 31 * result + (int) (temp ^ (temp >>> 32));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,103 +0,0 @@
|
||||
package seng302.Model;
|
||||
|
||||
import org.geotools.referencing.GeodeticCalculator;
|
||||
import seng302.Constants;
|
||||
|
||||
/**
|
||||
* Created by cbt24 on 6/03/17.
|
||||
*/
|
||||
public class Leg {
|
||||
private String name; //nautical miles
|
||||
private double distance;
|
||||
private Marker startMarker;
|
||||
private Marker endMarker;
|
||||
private int legNumber;
|
||||
|
||||
/**
|
||||
* Leg Initialiser
|
||||
*
|
||||
* @param name Name of the Leg
|
||||
* @param start marker
|
||||
* @param end marker
|
||||
* @param number Leg's position in race
|
||||
*/
|
||||
public Leg(String name, Marker start, Marker end, int number) {
|
||||
this.name = name;
|
||||
this.startMarker = start;
|
||||
this.endMarker = end;
|
||||
this.legNumber = number;
|
||||
calculateDistance();
|
||||
}
|
||||
|
||||
/**
|
||||
* Construction Method
|
||||
*
|
||||
* @param name Name of the Leg
|
||||
* @param number leg number
|
||||
*/
|
||||
public Leg(String name, int number) {
|
||||
this.name = name;
|
||||
this.legNumber = number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the Leg
|
||||
*
|
||||
* @return Returns the name of the Leg
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the distance in nautical miles
|
||||
*
|
||||
* @return Returns the total distance of the leg.
|
||||
*/
|
||||
public double getDistance() {
|
||||
return distance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the leg number that the leg exists in the Race
|
||||
*
|
||||
* @return Returns the Leg
|
||||
* @see Race
|
||||
*/
|
||||
public int getLegNumber() {
|
||||
return legNumber;
|
||||
}
|
||||
|
||||
|
||||
public Marker getStartMarker() {
|
||||
return startMarker;
|
||||
}
|
||||
|
||||
public void setStartMarker(Marker startMarker) {
|
||||
this.startMarker = startMarker;
|
||||
}
|
||||
|
||||
public Marker getEndMarker() {
|
||||
return endMarker;
|
||||
}
|
||||
|
||||
public void setEndMarker(Marker endMarker) {
|
||||
this.endMarker = endMarker;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the distance that the legs are in nautical miles (1.852 km).
|
||||
*/
|
||||
public void calculateDistance() {
|
||||
|
||||
GeodeticCalculator calc = new GeodeticCalculator();
|
||||
//Load start and end of leg
|
||||
GPSCoordinate startMarker = this.startMarker.getAverageGPSCoordinate();
|
||||
GPSCoordinate endMarker = this.endMarker.getAverageGPSCoordinate();
|
||||
calc.setStartingGeographicPoint(startMarker.getLongitude(), startMarker.getLatitude());
|
||||
calc.setDestinationGeographicPoint(endMarker.getLongitude(), endMarker.getLatitude());
|
||||
this.distance = calc.getOrthodromicDistance() / Constants.NMToMetersConversion;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,75 +0,0 @@
|
||||
package seng302.Model;
|
||||
|
||||
import org.geotools.referencing.GeodeticCalculator;
|
||||
|
||||
import java.awt.geom.Point2D;
|
||||
|
||||
/**
|
||||
* Created by esa46 on 29/03/17.
|
||||
*/
|
||||
public class Marker {
|
||||
|
||||
private GPSCoordinate averageGPSCoordinate;
|
||||
private GPSCoordinate mark1;
|
||||
private GPSCoordinate mark2;
|
||||
private String name;
|
||||
private boolean doubleMarker = false;
|
||||
|
||||
public Marker(GPSCoordinate mark1) {
|
||||
|
||||
this.mark1 = mark1;
|
||||
this.mark2 = mark1;
|
||||
this.averageGPSCoordinate = calculateAverage();
|
||||
|
||||
}
|
||||
|
||||
public Marker(GPSCoordinate mark1, GPSCoordinate mark2) {
|
||||
|
||||
this.mark1 = mark1;
|
||||
this.mark2 = mark2;
|
||||
this.averageGPSCoordinate = calculateAverage();
|
||||
|
||||
}
|
||||
|
||||
public Marker(String name, GPSCoordinate mark1, GPSCoordinate mark2) {
|
||||
|
||||
this.name = name;
|
||||
this.mark1 = mark1;
|
||||
this.mark2 = mark2;
|
||||
this.averageGPSCoordinate = calculateAverage();
|
||||
|
||||
}
|
||||
|
||||
public GPSCoordinate getMark1() {
|
||||
return mark1;
|
||||
}
|
||||
|
||||
public GPSCoordinate getMark2() {
|
||||
return mark2;
|
||||
}
|
||||
|
||||
public GPSCoordinate getAverageGPSCoordinate() {
|
||||
return averageGPSCoordinate;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
private GPSCoordinate calculateAverage() {
|
||||
|
||||
GeodeticCalculator calc = new GeodeticCalculator();
|
||||
calc.setStartingGeographicPoint(mark1.getLongitude(), mark1.getLatitude());
|
||||
calc.setDestinationGeographicPoint(mark2.getLongitude(), mark2.getLatitude());
|
||||
double azimuth = calc.getAzimuth();
|
||||
double distance = calc.getOrthodromicDistance();
|
||||
|
||||
GeodeticCalculator middleCalc = new GeodeticCalculator();
|
||||
middleCalc.setStartingGeographicPoint(mark1.getLongitude(), mark1.getLatitude());
|
||||
middleCalc.setDirection(azimuth, distance / 2);
|
||||
Point2D middlePoint = middleCalc.getDestinationGeographicPoint();
|
||||
return new GPSCoordinate(middlePoint.getY(), middlePoint.getX());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,9 +5,11 @@ import javafx.animation.AnimationTimer;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import org.geotools.referencing.GeodeticCalculator;
|
||||
import seng302.Constants;
|
||||
import seng302.DataInput.RaceDataSource;
|
||||
import seng302.RaceEventMessages.BoatLocationMessage;
|
||||
|
||||
import SharedModel.*;
|
||||
import seng302.Networking.MessageEncoders.RaceVisionByteEncoder;
|
||||
import seng302.Networking.Utils.BoatLocationMessage;
|
||||
|
||||
import java.awt.geom.Point2D;
|
||||
import java.util.ArrayList;
|
||||
@@ -220,6 +222,7 @@ public class Race implements Runnable {
|
||||
boatLocationMessage.setApparentWindSpeed(0);//Junk value.
|
||||
boatLocationMessage.setApparentWindAngle((short) 0);//Junk value.
|
||||
boatLocationMessage.setTrueWindSpeed(0);//Junk value.
|
||||
boatLocationMessage.setTrueWindDirection(0);//Junk value.
|
||||
boatLocationMessage.setTrueWindAngle((short) 0);//Junk value.
|
||||
|
||||
boatLocationMessage.setCurrentDrift(0);//Junk value.
|
||||
@@ -232,8 +235,6 @@ public class Race implements Runnable {
|
||||
|
||||
|
||||
} else {
|
||||
System.out.println("Race is over");//TEMP debug print
|
||||
//raceFinish = true;
|
||||
stop();
|
||||
}
|
||||
}
|
||||
@@ -250,7 +251,7 @@ public class Race implements Runnable {
|
||||
for (BoatInRace boat : startingBoats) {
|
||||
if (boat != null) {
|
||||
boat.setPosition(Integer.toString(startingBoats.indexOf(boat) + 1));
|
||||
System.out.println(boat.toString() + " " + boat.getPosition());
|
||||
System.out.println(boat.toString() + " " + boat.getPosition());//TEMP debug print
|
||||
if (boat.getCurrentLeg().getName().equals("DNF") || boat.getCurrentLeg().getLegNumber() == 0)
|
||||
boat.setPosition("-");
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.github.bfsmith.geotimezone.TimeZoneLookup;
|
||||
import com.github.bfsmith.geotimezone.TimeZoneResult;
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
import SharedModel.GPSCoordinate;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
|
||||
@@ -1,99 +0,0 @@
|
||||
package seng302.Model;
|
||||
|
||||
/**
|
||||
* Created by jjg64 on 19/04/17.
|
||||
*/
|
||||
public class Regatta {
|
||||
int regattaID;
|
||||
String RegattaName;
|
||||
int raceID = 0;
|
||||
String courseName;
|
||||
double centralLatitude;
|
||||
double centralLongitude;
|
||||
double centralAltitude;
|
||||
float utcOffset;
|
||||
float magneticVariation;
|
||||
|
||||
public Regatta(int regattaID, String regattaName, String courseName, double centralLatitude, double centralLongitude, double centralAltitude, float utcOffset, float magneticVariation) {
|
||||
this.regattaID = regattaID;
|
||||
this.RegattaName = regattaName;
|
||||
this.courseName = courseName;
|
||||
this.centralLatitude = centralLatitude;
|
||||
this.centralLongitude = centralLongitude;
|
||||
this.centralAltitude = centralAltitude;
|
||||
this.utcOffset = utcOffset;
|
||||
this.magneticVariation = magneticVariation;
|
||||
}
|
||||
|
||||
public int getRegattaID() {
|
||||
return regattaID;
|
||||
}
|
||||
|
||||
public void setRegattaID(int ID) {
|
||||
this.regattaID = ID;
|
||||
}
|
||||
|
||||
public String getRegattaName() {
|
||||
return RegattaName;
|
||||
}
|
||||
|
||||
public void setRegattaName(String regattaName) {
|
||||
RegattaName = regattaName;
|
||||
}
|
||||
|
||||
public int getRaceID() {
|
||||
return raceID;
|
||||
}
|
||||
|
||||
public void setRaceID(int raceID) {
|
||||
this.raceID = raceID;
|
||||
}
|
||||
|
||||
public String getCourseName() {
|
||||
return courseName;
|
||||
}
|
||||
|
||||
public void setCourseName(String courseName) {
|
||||
this.courseName = courseName;
|
||||
}
|
||||
|
||||
public double getCentralLatitude() {
|
||||
return centralLatitude;
|
||||
}
|
||||
|
||||
public void setCentralLatitude(double centralLatitude) {
|
||||
this.centralLatitude = centralLatitude;
|
||||
}
|
||||
|
||||
public double getCentralLongitude() {
|
||||
return centralLongitude;
|
||||
}
|
||||
|
||||
public void setCentralLongitude(double centralLongitude) {
|
||||
this.centralLongitude = centralLongitude;
|
||||
}
|
||||
|
||||
public double getCentralAltitude() {
|
||||
return centralAltitude;
|
||||
}
|
||||
|
||||
public void setCentralAltitude(double centralAltitude) {
|
||||
this.centralAltitude = centralAltitude;
|
||||
}
|
||||
|
||||
public float getUtcOffset() {
|
||||
return utcOffset;
|
||||
}
|
||||
|
||||
public void setUtcOffset(float utcOffset) {
|
||||
this.utcOffset = utcOffset;
|
||||
}
|
||||
|
||||
public float getMagneticVariation() {
|
||||
return magneticVariation;
|
||||
}
|
||||
|
||||
public void setMagneticVariation(float magneticVariation) {
|
||||
this.magneticVariation = magneticVariation;
|
||||
}
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
package seng302.Networking;
|
||||
|
||||
|
||||
import seng302.Networking.Utils.MessageType;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
import java.util.zip.CRC32;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 21/04/17.
|
||||
*/
|
||||
public class BinaryMesageEncoder {
|
||||
private byte[] fullMessage;
|
||||
private byte[] header;
|
||||
private byte[] message;
|
||||
//private byte[] crc;
|
||||
|
||||
private byte headerSync1 = (byte) 0x47;
|
||||
private byte headerSync2 = (byte) 0x83;
|
||||
private byte headerMessageType;
|
||||
private long headerTimeStamp;
|
||||
private int headerSourceID;
|
||||
private short headerMessageLength;
|
||||
|
||||
public BinaryMesageEncoder(MessageType headerMessageType, long headerTimeStamp, int headerSourceID, short headerMessageLength, byte[] message) {
|
||||
//set the header
|
||||
this.headerMessageType = headerMessageType.getValue();
|
||||
this.headerTimeStamp = headerTimeStamp;
|
||||
this.headerSourceID = headerSourceID;
|
||||
this.headerMessageLength = headerMessageLength;
|
||||
|
||||
ByteBuffer tempHeaderByteBuffer = ByteBuffer.allocate(15);
|
||||
tempHeaderByteBuffer.put(this.headerSync1);
|
||||
tempHeaderByteBuffer.put(this.headerSync2);
|
||||
tempHeaderByteBuffer.put(this.headerMessageType);
|
||||
tempHeaderByteBuffer.put(longToSixBytes(this.headerTimeStamp));
|
||||
tempHeaderByteBuffer.putInt(this.headerSourceID);
|
||||
tempHeaderByteBuffer.put(shortToBytes(this.headerMessageLength));
|
||||
|
||||
|
||||
this.header = tempHeaderByteBuffer.array();
|
||||
|
||||
//set the message
|
||||
this.message = message;
|
||||
|
||||
//set full message
|
||||
ByteBuffer tempMessageByteBuffer = ByteBuffer.allocate(19 + this.headerMessageLength);
|
||||
tempMessageByteBuffer.put(this.header);
|
||||
tempMessageByteBuffer.put(this.message);
|
||||
|
||||
CRC32 crc = new CRC32();
|
||||
crc.reset();
|
||||
byte[] messageAndHeader = new byte[this.header.length + this.message.length];
|
||||
System.arraycopy(this.header, 0, messageAndHeader, 0, this.header.length);
|
||||
System.arraycopy(this.message, 0, messageAndHeader, this.header.length, this.message.length);
|
||||
crc.update(messageAndHeader);
|
||||
//System.out.println(Arrays.toString(messageAndHeader));
|
||||
|
||||
tempMessageByteBuffer.put(intToBytes((int) crc.getValue()));
|
||||
this.fullMessage = tempMessageByteBuffer.array();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private byte[] longToSixBytes(long x) {
|
||||
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
|
||||
buffer.putLong(x);
|
||||
return Arrays.copyOfRange(buffer.array(), 2, 8);
|
||||
}
|
||||
|
||||
private byte[] shortToBytes(short x) {
|
||||
ByteBuffer buffer = ByteBuffer.allocate(Short.BYTES);
|
||||
buffer.putShort(x);
|
||||
return buffer.array();
|
||||
}
|
||||
|
||||
private byte[] intToBytes(int x) {
|
||||
ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES);
|
||||
buffer.putInt(x);
|
||||
return buffer.array();
|
||||
}
|
||||
|
||||
public byte[] getFullMessage() {
|
||||
return fullMessage;
|
||||
}
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
package seng302.Networking;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 21/04/17.
|
||||
*/
|
||||
public class BinaryMessageDecoder {
|
||||
private byte[] fullMessage;
|
||||
private byte[] header;
|
||||
private byte[] message;
|
||||
private byte[] crc;
|
||||
|
||||
private byte headerSync1;
|
||||
private byte headerSync2;
|
||||
private byte headerMessageType;
|
||||
private byte[] headerTimeStamp;
|
||||
private byte[] headerSourceID;
|
||||
private byte[] headerMessageLength;
|
||||
|
||||
|
||||
public BinaryMessageDecoder(byte[] fullMessage) {
|
||||
this.fullMessage = fullMessage;
|
||||
}
|
||||
|
||||
public void decode() throws IndexOutOfBoundsException {
|
||||
//get the header
|
||||
this.header = Arrays.copyOfRange(this.fullMessage, 0, 15);
|
||||
|
||||
this.headerSync1 = this.header[0];
|
||||
this.headerSync2 = this.header[1];
|
||||
this.headerMessageType = this.header[2];
|
||||
this.headerTimeStamp = Arrays.copyOfRange(this.header, 3, 9);
|
||||
this.headerSourceID = Arrays.copyOfRange(this.header, 9, 13);
|
||||
this.headerMessageLength = Arrays.copyOfRange(this.header, 13, 15);
|
||||
|
||||
//get message
|
||||
this.message = Arrays.copyOfRange(this.fullMessage, 15, this.fullMessage.length - 4);
|
||||
|
||||
//get crc
|
||||
this.crc = Arrays.copyOfRange(this.fullMessage, this.fullMessage.length - 4, fullMessage.length);
|
||||
|
||||
//run through the checks
|
||||
if (this.message.length != bytesToShort(this.headerMessageLength)) {
|
||||
System.err.println("message length in header does not equal the message length");
|
||||
System.err.println("message length in header: " + bytesToInt(this.headerMessageLength));
|
||||
System.err.println("message length: " + this.message.length);
|
||||
} else if (this.headerSync1 != 0x47) {
|
||||
System.err.println("Sync byte 1 is wrong");
|
||||
} else if (this.headerSync2 != (byte) 0x83) {
|
||||
System.err.println("Sync byte 2 is wrong");
|
||||
} else if (false) {
|
||||
//todo check crc
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private short bytesToShort(byte[] bytesShort) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(bytesShort);
|
||||
short num = wrapped.getShort();
|
||||
return num;
|
||||
}
|
||||
|
||||
private int bytesToInt(byte[] bytesInt) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(bytesInt);
|
||||
int num = wrapped.getInt();
|
||||
return num;
|
||||
}
|
||||
|
||||
private long bytesToLong(byte[] bytesLong) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesLong[0]);
|
||||
byteBuffer.put(bytesLong[1]);
|
||||
byteBuffer.put(bytesLong[2]);
|
||||
byteBuffer.put(bytesLong[3]);
|
||||
byteBuffer.put(bytesLong[4]);
|
||||
byteBuffer.put(bytesLong[5]);
|
||||
long longVal = byteBuffer.getLong(0);
|
||||
return longVal;
|
||||
}
|
||||
|
||||
public long getTimeStamp() {
|
||||
return bytesToLong(this.headerTimeStamp);
|
||||
}
|
||||
|
||||
public int getSourceID() {
|
||||
return bytesToInt(this.headerSourceID);
|
||||
}
|
||||
|
||||
public short getMessageLength() {
|
||||
return bytesToShort(this.headerMessageLength);
|
||||
}
|
||||
|
||||
public int getMessageType() {
|
||||
return (int) this.headerMessageType;
|
||||
}
|
||||
|
||||
public byte[] getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 23/04/17.
|
||||
*/
|
||||
public class AverageWindDecoder {
|
||||
byte messageVersionNumber;
|
||||
byte[] byteTime;
|
||||
byte[] byteRawPeriod;
|
||||
byte[] byteRawSpeed;
|
||||
byte[] bytePeriod2;
|
||||
byte[] byteSpeed2;
|
||||
byte[] bytePeriod3;
|
||||
byte[] byteSpeed3;
|
||||
byte[] bytePeriod4;
|
||||
byte[] byteSpeed4;
|
||||
|
||||
public AverageWindDecoder(byte[] encodedAverageWind) {
|
||||
messageVersionNumber = encodedAverageWind[0];
|
||||
byteTime = Arrays.copyOfRange(encodedAverageWind, 1, 7);
|
||||
byteRawPeriod = Arrays.copyOfRange(encodedAverageWind, 7, 9);
|
||||
byteRawSpeed = Arrays.copyOfRange(encodedAverageWind, 9, 11);
|
||||
bytePeriod2 = Arrays.copyOfRange(encodedAverageWind, 11, 13);
|
||||
byteSpeed2 = Arrays.copyOfRange(encodedAverageWind, 13, 15);
|
||||
bytePeriod3 = Arrays.copyOfRange(encodedAverageWind, 15, 17);
|
||||
byteSpeed3 = Arrays.copyOfRange(encodedAverageWind, 17, 19);
|
||||
bytePeriod4 = Arrays.copyOfRange(encodedAverageWind, 19, 21);
|
||||
byteSpeed4 = Arrays.copyOfRange(encodedAverageWind, 21, 23);
|
||||
}
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import seng302.Networking.Utils.BoatLocationMessage;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 21/04/17.
|
||||
*/
|
||||
public class BoatLocationDecoder {
|
||||
private byte messageVersionNumber;
|
||||
private byte[] time;
|
||||
private byte[] sourceID;
|
||||
private byte[] seqNum;
|
||||
private byte deviceType;
|
||||
private byte[] latitude;
|
||||
private byte[] longitude;
|
||||
private byte[] altitude;
|
||||
private byte[] heading;
|
||||
private byte[] pitch;
|
||||
private byte[] roll;
|
||||
private byte[] boatSpeed;
|
||||
private byte[] cog;
|
||||
private byte[] sog;
|
||||
private byte[] apparentWindSpeed;
|
||||
private byte[] apparentWindAngle;
|
||||
private byte[] trueWindSpeed;
|
||||
private byte[] trueWindDirection;
|
||||
private byte[] trueWindAngle;
|
||||
private byte[] currentDrift;
|
||||
private byte[] currentSet;
|
||||
private byte[] rudderAngle;
|
||||
|
||||
private BoatLocationMessage message;
|
||||
|
||||
public BoatLocationDecoder(byte[] encodedBoatLocation) {
|
||||
messageVersionNumber = encodedBoatLocation[0];
|
||||
time = Arrays.copyOfRange(encodedBoatLocation, 1, 7);
|
||||
sourceID = Arrays.copyOfRange(encodedBoatLocation, 7, 11);
|
||||
seqNum = Arrays.copyOfRange(encodedBoatLocation, 11, 15);
|
||||
deviceType = encodedBoatLocation[15];
|
||||
latitude = Arrays.copyOfRange(encodedBoatLocation, 16, 20);
|
||||
longitude = Arrays.copyOfRange(encodedBoatLocation, 20, 24);
|
||||
altitude = Arrays.copyOfRange(encodedBoatLocation, 24, 28);
|
||||
heading = Arrays.copyOfRange(encodedBoatLocation, 28, 30);
|
||||
pitch = Arrays.copyOfRange(encodedBoatLocation, 30, 32);
|
||||
roll = Arrays.copyOfRange(encodedBoatLocation, 32, 34);
|
||||
boatSpeed = Arrays.copyOfRange(encodedBoatLocation, 34, 36);
|
||||
cog = Arrays.copyOfRange(encodedBoatLocation, 36, 38);
|
||||
sog = Arrays.copyOfRange(encodedBoatLocation, 38, 40);
|
||||
apparentWindSpeed = Arrays.copyOfRange(encodedBoatLocation, 40, 42);
|
||||
apparentWindAngle = Arrays.copyOfRange(encodedBoatLocation, 42, 44);
|
||||
trueWindSpeed = Arrays.copyOfRange(encodedBoatLocation, 44, 46);
|
||||
trueWindDirection = Arrays.copyOfRange(encodedBoatLocation, 46, 48);
|
||||
trueWindAngle = Arrays.copyOfRange(encodedBoatLocation, 48, 50);
|
||||
currentDrift = Arrays.copyOfRange(encodedBoatLocation, 50, 52);
|
||||
currentSet = Arrays.copyOfRange(encodedBoatLocation, 52, 54);
|
||||
rudderAngle = Arrays.copyOfRange(encodedBoatLocation, 54, 56);
|
||||
|
||||
message = new BoatLocationMessage(messageVersionNumber, bytesToLong(time),
|
||||
bytesToInt(sourceID), bytesToInt(seqNum),
|
||||
deviceType, bytesToInt(latitude),
|
||||
bytesToInt(longitude), bytesToInt(altitude),
|
||||
twoByteToInt(heading), bytesToShort(pitch),
|
||||
bytesToShort(roll), twoByteToInt(boatSpeed),
|
||||
twoByteToInt(cog), twoByteToInt(sog),
|
||||
twoByteToInt(apparentWindSpeed), bytesToShort(apparentWindAngle),
|
||||
twoByteToInt(trueWindSpeed), bytesToShort(trueWindDirection),
|
||||
bytesToShort(trueWindAngle), twoByteToInt(currentDrift),
|
||||
twoByteToInt(currentSet), bytesToShort(rudderAngle)
|
||||
);
|
||||
}
|
||||
|
||||
private int twoByteToInt(byte[] bytesInt) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesInt);
|
||||
int num = byteBuffer.getInt(0);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
private int bytesToInt(byte[] bytesInt) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(bytesInt);
|
||||
int num = wrapped.getInt();
|
||||
return num;
|
||||
}
|
||||
|
||||
private short bytesToShort(byte[] bytesShort) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(bytesShort);
|
||||
short num = wrapped.getShort();
|
||||
return num;
|
||||
}
|
||||
|
||||
|
||||
private long bytesToLong(byte[] bytesLong) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesLong);
|
||||
// byteBuffer.put(bytesLong[0]);
|
||||
// byteBuffer.put(bytesLong[1]);
|
||||
// byteBuffer.put(bytesLong[2]);
|
||||
// byteBuffer.put(bytesLong[3]);
|
||||
// byteBuffer.put(bytesLong[4]);
|
||||
// byteBuffer.put(bytesLong[5]);
|
||||
long longVal = byteBuffer.getLong(0);
|
||||
return longVal;
|
||||
}
|
||||
|
||||
public BoatLocationMessage getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import seng302.Networking.Utils.CourseWind;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 23/04/17.
|
||||
*/
|
||||
public class CourseWindDecoder {
|
||||
byte messageVersionNumber;
|
||||
byte byteWindID;
|
||||
byte loopCount;
|
||||
ArrayList<CourseWind> loopMessages = new ArrayList();
|
||||
|
||||
public CourseWindDecoder(byte[] encodedCourseWind) {
|
||||
final int lengthInBytesOfMessages = 20;
|
||||
|
||||
messageVersionNumber = encodedCourseWind[0];
|
||||
byteWindID = encodedCourseWind[1];
|
||||
loopCount = encodedCourseWind[2];
|
||||
byte[] loopMessagesBytes = Arrays.copyOfRange(encodedCourseWind, 3, lengthInBytesOfMessages * loopCount + 3);
|
||||
int messageLoopIndex = 0;
|
||||
|
||||
for (int i = 0; i < loopCount; i++) {
|
||||
byte[] messageBytes = Arrays.copyOfRange(loopMessagesBytes, messageLoopIndex, messageLoopIndex + 20);
|
||||
ArrayList test = new ArrayList();
|
||||
byte[] windId = Arrays.copyOfRange(messageBytes, 0, 1);
|
||||
byte[] time = Arrays.copyOfRange(messageBytes, 1, 7);
|
||||
byte[] raceID = Arrays.copyOfRange(messageBytes, 7, 11);
|
||||
byte[] windDirection = Arrays.copyOfRange(messageBytes, 11, 13);
|
||||
byte[] windSpeed = Arrays.copyOfRange(messageBytes, 13, 15);
|
||||
byte[] bestUpwindAngle = Arrays.copyOfRange(messageBytes, 15, 17);
|
||||
byte[] bestDownwindAngle = Arrays.copyOfRange(messageBytes, 17, 19);
|
||||
byte[] flags = Arrays.copyOfRange(messageBytes, 19, 20);
|
||||
|
||||
CourseWind message = new CourseWind(windId[0], bytesToLong(time),
|
||||
bytesToInt(raceID), twoByteToInt(windDirection),
|
||||
twoByteToInt(windSpeed), twoByteToInt(bestUpwindAngle),
|
||||
twoByteToInt(bestDownwindAngle), flags[0]);
|
||||
|
||||
loopMessages.add(message);
|
||||
messageLoopIndex += 20;
|
||||
}
|
||||
}
|
||||
|
||||
private int twoByteToInt(byte[] bytesInt) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesInt);
|
||||
int num = byteBuffer.getInt(0);
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
|
||||
private int bytesToInt(byte[] bytesInt) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(bytesInt);
|
||||
int num = wrapped.getInt();
|
||||
return num;
|
||||
}
|
||||
|
||||
private long bytesToLong(byte[] bytesLong) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesLong[0]);
|
||||
byteBuffer.put(bytesLong[1]);
|
||||
byteBuffer.put(bytesLong[2]);
|
||||
byteBuffer.put(bytesLong[3]);
|
||||
byteBuffer.put(bytesLong[4]);
|
||||
byteBuffer.put(bytesLong[5]);
|
||||
long longVal = byteBuffer.getLong(0);
|
||||
return longVal;
|
||||
}
|
||||
|
||||
public ArrayList<CourseWind> getLoopMessages() {
|
||||
return loopMessages;
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 23/04/17.
|
||||
*/
|
||||
public class MarkRoundingDecoder {
|
||||
byte messageVersionNumber;
|
||||
byte[] byteTime;
|
||||
byte[] byteAck;
|
||||
byte[] byteRaceID;
|
||||
byte[] byteSourceID;
|
||||
byte byteBoatStatus;
|
||||
byte byteRoundingSide;
|
||||
byte byteMarkType;
|
||||
byte byteMarkID;
|
||||
|
||||
public MarkRoundingDecoder(byte[] encodedMarkRounding) {
|
||||
messageVersionNumber = encodedMarkRounding[0];
|
||||
byteTime = Arrays.copyOfRange(encodedMarkRounding, 1, 7);
|
||||
byteAck = Arrays.copyOfRange(encodedMarkRounding, 7, 9);
|
||||
byteRaceID = Arrays.copyOfRange(encodedMarkRounding, 9, 13);
|
||||
byteSourceID = Arrays.copyOfRange(encodedMarkRounding, 13, 18);
|
||||
byteBoatStatus = encodedMarkRounding[18];
|
||||
byteRoundingSide = encodedMarkRounding[19];
|
||||
byteMarkType = encodedMarkRounding[20];
|
||||
byteMarkID = encodedMarkRounding[21];
|
||||
}
|
||||
}
|
||||
@@ -1,99 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 21/04/17.
|
||||
*/
|
||||
public class RaceStartStatusDecoder {
|
||||
private byte messageVersion;
|
||||
private byte[] timestamp;
|
||||
private byte[] ackNumber;
|
||||
private byte[] raceStartTime;
|
||||
private byte[] raceIdentifier;
|
||||
private byte notificationType;
|
||||
|
||||
private long time;
|
||||
private short ack;
|
||||
private long startTime;
|
||||
private int raceID;
|
||||
private char notification;
|
||||
|
||||
|
||||
public RaceStartStatusDecoder(byte[] encodedRaceStartStatus) {
|
||||
messageVersion = encodedRaceStartStatus[0];
|
||||
timestamp = Arrays.copyOfRange(encodedRaceStartStatus, 1, 7);
|
||||
ackNumber = Arrays.copyOfRange(encodedRaceStartStatus, 7, 9);
|
||||
raceStartTime = Arrays.copyOfRange(encodedRaceStartStatus, 9, 15);
|
||||
raceIdentifier = Arrays.copyOfRange(encodedRaceStartStatus, 15, 19);
|
||||
notificationType = encodedRaceStartStatus[19];
|
||||
|
||||
time = bytesToLong(timestamp);
|
||||
ack = bytesToShort(ackNumber);
|
||||
startTime = bytesToLong(raceStartTime);
|
||||
raceID = bytesToInt(raceIdentifier);
|
||||
notification = byteToChar(notificationType);
|
||||
}
|
||||
|
||||
private char byteToChar(byte bytesInt) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesInt);
|
||||
char num = byteBuffer.getChar(0);
|
||||
return num;
|
||||
}
|
||||
|
||||
private short bytesToShort(byte[] bytesShort) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(bytesShort);
|
||||
short num = wrapped.getShort();
|
||||
return num;
|
||||
}
|
||||
|
||||
private int bytesToInt(byte[] bytesInt) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(bytesInt);
|
||||
int num = wrapped.getInt();
|
||||
return num;
|
||||
}
|
||||
|
||||
private long bytesToLong(byte[] bytesLong) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesLong[0]);
|
||||
byteBuffer.put(bytesLong[1]);
|
||||
byteBuffer.put(bytesLong[2]);
|
||||
byteBuffer.put(bytesLong[3]);
|
||||
byteBuffer.put(bytesLong[4]);
|
||||
byteBuffer.put(bytesLong[5]);
|
||||
long longVal = byteBuffer.getLong(0);
|
||||
return longVal;
|
||||
}
|
||||
|
||||
public byte getMessageVersion() {
|
||||
return messageVersion;
|
||||
}
|
||||
|
||||
public long getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public short getAck() {
|
||||
return ack;
|
||||
}
|
||||
|
||||
public long getStartTime() {
|
||||
return startTime;
|
||||
}
|
||||
|
||||
public int getRaceID() {
|
||||
return raceID;
|
||||
}
|
||||
|
||||
public char getNotification() {
|
||||
return notification;
|
||||
}
|
||||
}
|
||||
@@ -1,150 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import seng302.Networking.Utils.BoatStatus;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 21/04/17.
|
||||
*/
|
||||
public class RaceStatusDecoder {
|
||||
private byte versionNum;
|
||||
private byte[] timeBytes;
|
||||
private byte[] raceID;
|
||||
private byte raceStatus;
|
||||
private byte[] expectedStart;
|
||||
private byte[] raceWind;
|
||||
private byte[] windSpeed;
|
||||
private byte numBoats;
|
||||
private byte bytesRaceType;
|
||||
private byte[] boatsBytes;
|
||||
|
||||
private long time;
|
||||
private int race;
|
||||
private int raceState;
|
||||
private long startTime;
|
||||
private short raceWindDir;
|
||||
private short raceWindSpeed;
|
||||
private int numberOfBoats;
|
||||
private int raceType;
|
||||
private ArrayList<BoatStatus> boats = new ArrayList<>();
|
||||
|
||||
|
||||
public RaceStatusDecoder(byte[] encodedRaceStatus) {
|
||||
versionNum = encodedRaceStatus[0];
|
||||
timeBytes = Arrays.copyOfRange(encodedRaceStatus, 1, 7);
|
||||
raceID = Arrays.copyOfRange(encodedRaceStatus, 7, 11);
|
||||
raceStatus = encodedRaceStatus[11];
|
||||
expectedStart = Arrays.copyOfRange(encodedRaceStatus, 12, 18);
|
||||
raceWind = Arrays.copyOfRange(encodedRaceStatus, 18, 20);
|
||||
windSpeed = Arrays.copyOfRange(encodedRaceStatus, 20, 22);
|
||||
numBoats = encodedRaceStatus[22];
|
||||
bytesRaceType = encodedRaceStatus[23];
|
||||
boatsBytes = Arrays.copyOfRange(encodedRaceStatus, 24, 25 + 20 * this.numBoats);
|
||||
|
||||
time = bytesToLong(timeBytes);
|
||||
race = bytesToInt(raceID);
|
||||
raceState = byteToInt(raceStatus);
|
||||
startTime = bytesToLong(expectedStart);
|
||||
raceWindDir = bytesToShort(raceWind);
|
||||
raceWindSpeed = bytesToShort(windSpeed);
|
||||
numberOfBoats = byteToInt(numBoats);
|
||||
|
||||
int boatLoopIndex = 0;
|
||||
|
||||
for (int i = 0; i < numberOfBoats; i++) {
|
||||
byte[] boatBytes = Arrays.copyOfRange(boatsBytes, boatLoopIndex, boatLoopIndex + 20);
|
||||
|
||||
byte[] sourceID = Arrays.copyOfRange(boatBytes, 1, 5);
|
||||
byte boatStatus = boatBytes[5];
|
||||
byte legNumber = boatBytes[6];
|
||||
byte numPenaltiesAwarded = boatBytes[7];
|
||||
byte numPenaltiesServed = boatBytes[8];
|
||||
byte[] estTimeAtNextMark = Arrays.copyOfRange(boatBytes, 9, 15);
|
||||
byte[] estTimeAtFinish = Arrays.copyOfRange(boatBytes, 15, 20);
|
||||
|
||||
BoatStatus boat = new BoatStatus(bytesToInt(sourceID), boatStatus,
|
||||
legNumber, numPenaltiesAwarded, numPenaltiesServed,
|
||||
bytesToLong(estTimeAtNextMark), bytesToLong(estTimeAtFinish));
|
||||
|
||||
boats.add(boat);
|
||||
boatLoopIndex += 20;
|
||||
}
|
||||
}
|
||||
|
||||
private int byteToInt(byte bytesInt) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesInt);
|
||||
int intVal = byteBuffer.getInt(0);
|
||||
return intVal;
|
||||
}
|
||||
|
||||
private short bytesToShort(byte[] bytesShort) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(bytesShort);
|
||||
short num = wrapped.getShort();
|
||||
return num;
|
||||
}
|
||||
|
||||
private int bytesToInt(byte[] bytesInt) {
|
||||
ByteBuffer wrapped = ByteBuffer.wrap(bytesInt);
|
||||
int num = wrapped.getInt();
|
||||
return num;
|
||||
}
|
||||
|
||||
private long bytesToLong(byte[] bytesLong) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesLong);
|
||||
long longVal = byteBuffer.getLong(0);
|
||||
return longVal;
|
||||
}
|
||||
|
||||
public byte getVersionNum() {
|
||||
return versionNum;
|
||||
}
|
||||
|
||||
public long getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public int getRace() {
|
||||
return race;
|
||||
}
|
||||
|
||||
public int getRaceState() {
|
||||
return raceState;
|
||||
}
|
||||
|
||||
public long getStartTime() {
|
||||
return startTime;
|
||||
}
|
||||
|
||||
public short getRaceWindDir() {
|
||||
return raceWindDir;
|
||||
}
|
||||
|
||||
public short getRaceWindSpeed() {
|
||||
return raceWindSpeed;
|
||||
}
|
||||
|
||||
public int getNumberOfBoats() {
|
||||
return numberOfBoats;
|
||||
}
|
||||
|
||||
public int getRaceType() {
|
||||
return raceType;
|
||||
}
|
||||
|
||||
public ArrayList<BoatStatus> getBoats() {
|
||||
return boats;
|
||||
}
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 20/04/17.
|
||||
*/
|
||||
public class XMLMessageDecoder {
|
||||
private byte messageVersionNumber;
|
||||
private short ackNumber;
|
||||
private long timeStamp;
|
||||
private byte xmlMsgSubType;
|
||||
private short sequenceNumber;
|
||||
private short xmlMsgLength;
|
||||
private String xmlMessage;
|
||||
|
||||
private byte[] bytes;
|
||||
|
||||
public XMLMessageDecoder(byte[] bytes) {
|
||||
this.bytes = bytes;
|
||||
}
|
||||
|
||||
public void decode() {
|
||||
byte[] ackNumberBytes = Arrays.copyOfRange(bytes, 1, 3);
|
||||
byte[] timeStampBytes = Arrays.copyOfRange(bytes, 3, 9);
|
||||
byte[] sequenceNumberBytes = Arrays.copyOfRange(bytes, 10, 12);
|
||||
byte[] xmlMsgLengthBytes = Arrays.copyOfRange(bytes, 12, 14);
|
||||
byte[] xmlMessagebytes = Arrays.copyOfRange(bytes, 14, bytes.length);
|
||||
|
||||
this.xmlMsgSubType = bytes[9];
|
||||
this.messageVersionNumber = bytes[0];
|
||||
this.ackNumber = bytesToShort(ackNumberBytes);
|
||||
|
||||
this.timeStamp = bytesToLong(timeStampBytes);
|
||||
|
||||
this.sequenceNumber = bytesToShort(sequenceNumberBytes);
|
||||
this.xmlMsgLength = bytesToShort(xmlMsgLengthBytes);
|
||||
this.xmlMessage = new String(xmlMessagebytes);
|
||||
}
|
||||
|
||||
private short bytesToShort(byte[] bytesShort) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(2);
|
||||
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||
byteBuffer.put(bytesShort[0]);
|
||||
byteBuffer.put(bytesShort[1]);
|
||||
short shortVal = byteBuffer.getShort(0);
|
||||
return shortVal;
|
||||
}
|
||||
|
||||
private long bytesToLong(byte[] bytesLong) {
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
||||
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put((byte) 0);
|
||||
byteBuffer.put(bytesLong[0]);
|
||||
byteBuffer.put(bytesLong[1]);
|
||||
byteBuffer.put(bytesLong[2]);
|
||||
byteBuffer.put(bytesLong[3]);
|
||||
byteBuffer.put(bytesLong[4]);
|
||||
byteBuffer.put(bytesLong[5]);
|
||||
|
||||
// System.out.println("====decode====");
|
||||
// for (byte i:byteBuffer.array()
|
||||
// ) {
|
||||
// System.out.println(i);
|
||||
// }
|
||||
// System.out.println("====decode====");
|
||||
|
||||
long longVal = byteBuffer.getLong(0);
|
||||
return longVal;
|
||||
}
|
||||
|
||||
public byte getMessageVersionNumber() {
|
||||
return messageVersionNumber;
|
||||
}
|
||||
|
||||
public short getAckNumber() {
|
||||
return ackNumber;
|
||||
}
|
||||
|
||||
public long getTimeStamp() {
|
||||
return timeStamp;
|
||||
}
|
||||
|
||||
public byte getXmlMsgSubType() {
|
||||
return xmlMsgSubType;
|
||||
}
|
||||
|
||||
public short getSequenceNumber() {
|
||||
return sequenceNumber;
|
||||
}
|
||||
|
||||
public short getXmlMsgLength() {
|
||||
return xmlMsgLength;
|
||||
}
|
||||
|
||||
public String getXmlMessage() {
|
||||
return xmlMessage;
|
||||
}
|
||||
}
|
||||
@@ -1,347 +0,0 @@
|
||||
package seng302.Networking.MessageEncoders;
|
||||
|
||||
import seng302.Model.BoatInRace;
|
||||
import seng302.Networking.Utils.BoatLocationMessage;
|
||||
import seng302.Networking.Utils.CourseWind;
|
||||
import seng302.Networking.Utils.RaceMessage;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Created by fwy13 on 19/04/17.
|
||||
*/
|
||||
public class RaceVisionByteEncoder {
|
||||
|
||||
public byte[] heartBeat(int seq) {
|
||||
ByteBuffer heartBeat = ByteBuffer.allocate(4);
|
||||
heartBeat.putInt(seq);
|
||||
byte[] result = heartBeat.array();
|
||||
return result;
|
||||
}
|
||||
|
||||
public byte[] raceStatus(long time, int race, int raceState, long startTime, short raceWindDir, short raceWindSpeed, int raceType, ArrayList<BoatInRace> boats) {
|
||||
ByteBuffer raceStatusMessage = ByteBuffer.allocate(24 + 20 * boats.size());
|
||||
//Version Number 1 bytes
|
||||
byte versionNum = 0b10; //this changes with the pdf. (2)
|
||||
byte[] timeBytes = convert(time, 6);//time (6 bytes)
|
||||
byte[] raceID = ByteBuffer.allocate(4).putInt(race).array();//race identifier incase multiple races are going at once.
|
||||
byte[] raceStatus = convert(raceState, 1);//race status 0 - 10
|
||||
byte[] expectedStart = convert(startTime, 6);//number of milliseconds from Jan 1, 1970 for when the data is valid
|
||||
byte[] raceWind = ByteBuffer.allocate(2).putShort(raceWindDir).array();//North = 0x0000 East = 0x4000 South = 0x8000
|
||||
byte[] windSpeed = ByteBuffer.allocate(2).putShort(raceWindSpeed).array();//mm/sec
|
||||
byte[] numBoats = convert(boats.size(), 1);
|
||||
byte[] bytesRaceType = convert(raceType, 1);//1 match race, 2 fleet race
|
||||
|
||||
raceStatusMessage.put(versionNum);
|
||||
raceStatusMessage.put(timeBytes);
|
||||
raceStatusMessage.put(raceID);
|
||||
raceStatusMessage.put(raceStatus);
|
||||
raceStatusMessage.put(expectedStart);
|
||||
raceStatusMessage.put(raceWind);
|
||||
raceStatusMessage.put(windSpeed);
|
||||
raceStatusMessage.put(numBoats);
|
||||
raceStatusMessage.put(bytesRaceType);
|
||||
|
||||
for (int i = 0; i < boats.size(); i++) {
|
||||
int sourceID = 0; //TODO use boats source id.
|
||||
byte[] legNum = convert(boats.get(i).getCurrentLeg().getLegNumber(), 1);
|
||||
byte[] numPenalties = convert(0, 1); //TODO use boats in race penalties class
|
||||
byte[] numPenaltiesServed = convert(0, 1);//TODO use boats in race penalites served.
|
||||
byte[] estNextMarkTime = convert((long) 0, 6);//TODO use boats estimated time to next mark.
|
||||
byte[] estFinishTime = convert((long) 0, 6);//TODO use boats estimated time to the finish.
|
||||
|
||||
raceStatusMessage.putInt(sourceID);
|
||||
raceStatusMessage.put(legNum);
|
||||
raceStatusMessage.put(numPenalties);
|
||||
raceStatusMessage.put(numPenaltiesServed);
|
||||
raceStatusMessage.put(estNextMarkTime);
|
||||
raceStatusMessage.put(estFinishTime);
|
||||
}
|
||||
|
||||
return raceStatusMessage.array();
|
||||
}
|
||||
|
||||
public byte[] displayTextMessage(RaceMessage[] message) {
|
||||
//ByteBuffer result = ByteBuffer.allocate(4 + numLines * 32);
|
||||
int messageVersionNumber = 0b1;//version number
|
||||
short ackNum = 0;//no clue what this does just a placeholder for 2 bytes.
|
||||
byte[] messLines = convert(message.length, 1);
|
||||
|
||||
// result.putInt(messageVersionNumber);
|
||||
// result.putShort(ackNum);
|
||||
// result.put(messLines);
|
||||
|
||||
ArrayList<byte[]> messages = new ArrayList<byte[]>();
|
||||
int size = 4;
|
||||
|
||||
for (int i = 0; i < message.length; i++) {
|
||||
int messageLen = message[i].getMessageText().getBytes().length;
|
||||
byte[] messageAsBytes = message[i].getMessageText().getBytes();
|
||||
if (messageLen < 30) {
|
||||
messageLen = 30;
|
||||
}
|
||||
ByteBuffer mess = ByteBuffer.allocate(2 + messageLen);
|
||||
mess.put(convert(message[i].getLineNumber(), 1));
|
||||
mess.put(convert(messageLen, 1));
|
||||
for (int j = 0; j < messageLen; j++) {
|
||||
mess.put(messageAsBytes[j]);
|
||||
}
|
||||
messages.add(mess.array());
|
||||
size += 2 + messageLen;
|
||||
}
|
||||
|
||||
ByteBuffer result = ByteBuffer.allocate(size);
|
||||
result.put(convert(messageVersionNumber, 1));
|
||||
result.putShort(ackNum);
|
||||
result.put(messLines);
|
||||
|
||||
for (byte[] mess : messages) {
|
||||
result.put(mess);
|
||||
}
|
||||
|
||||
return result.array();
|
||||
}
|
||||
|
||||
public byte[] raceStartStatus(long time, short ack, long startTime, int raceID, char notification) {
|
||||
int messageVersion = 0b1;
|
||||
byte[] timestamp = convert(time, 6);
|
||||
byte[] ackNumber = convert(ack, 2);
|
||||
byte[] raceStartTime = convert(startTime, 6);
|
||||
int raceIdentifier = raceID;
|
||||
byte[] notificationType = convert(notification, 1);
|
||||
|
||||
ByteBuffer result = ByteBuffer.allocate(20);
|
||||
result.put(convert(messageVersion, 1));
|
||||
result.put(timestamp);
|
||||
result.put(ackNumber);
|
||||
result.put(raceStartTime);
|
||||
result.putInt(raceIdentifier);
|
||||
result.put(notificationType);
|
||||
|
||||
return result.array();
|
||||
}
|
||||
|
||||
public byte[] yachtEventCode(long time, short acknowledgeNumber, int raceID, int destSourceID, int incidentID,
|
||||
int eventID) {
|
||||
int messageVersion = 0b10;
|
||||
byte[] encodeTime = convert(time, 6);
|
||||
short ackNum = acknowledgeNumber;
|
||||
int raceUID = raceID;//TODO chekc if this is an into for a 4 char string.
|
||||
int destSource = destSourceID;
|
||||
int incident = incidentID;
|
||||
byte[] event = convert(eventID, 1);
|
||||
|
||||
ByteBuffer result = ByteBuffer.allocate(22);
|
||||
result.put(convert(messageVersion, 1));
|
||||
result.put(encodeTime);
|
||||
result.putShort(ackNum);
|
||||
result.putInt(raceUID);
|
||||
result.putInt(destSource);
|
||||
result.putInt(incident);
|
||||
result.put(event);
|
||||
return result.array();
|
||||
}
|
||||
|
||||
public byte[] chatterText(int messageType, String message) {
|
||||
int messageVersion = 0b1;
|
||||
byte[] type = convert(messageType, 1);
|
||||
byte[] length = convert(message.length(), 1);
|
||||
byte[] text = convert(message, length[0]);
|
||||
|
||||
ByteBuffer result = ByteBuffer.allocate(3 + text.length);
|
||||
result.put(convert(messageVersion, 1));
|
||||
result.put(type);
|
||||
result.put(length);
|
||||
result.put(text);
|
||||
|
||||
return result.array();
|
||||
}
|
||||
|
||||
public byte[] boatLocation(BoatLocationMessage boatLocationMessage) {
|
||||
int messageVersionNumber = 0b1;
|
||||
byte[] time = convert(boatLocationMessage.getTime(), 6);
|
||||
byte[] sourceID = convert(boatLocationMessage.getSourceID(), 4);
|
||||
byte[] seqNum = convert(boatLocationMessage.getSequenceNumber(), 4);
|
||||
byte deviceType = boatLocationMessage.getDeviceType();
|
||||
byte[] latitude = convert(boatLocationMessage.getLatitude(), 4);
|
||||
byte[] longitude = convert(boatLocationMessage.getLongitude(), 4);
|
||||
byte[] altitude = convert(boatLocationMessage.getAltitude(), 4);
|
||||
byte[] heading = convert(boatLocationMessage.getHeading(), 2);
|
||||
byte[] pitch = convert(boatLocationMessage.getPitch(), 2);
|
||||
byte[] roll = convert(boatLocationMessage.getRoll(), 2);
|
||||
byte[] boatSpeed = convert(boatLocationMessage.getBoatSpeed(), 2);
|
||||
byte[] cog = convert(boatLocationMessage.getBoatCOG(), 2);
|
||||
byte[] sog = convert(boatLocationMessage.getBoatSOG(), 2);
|
||||
byte[] apparentWindSpeed = convert(boatLocationMessage.getApparentWindSpeed(), 2);
|
||||
byte[] apparentWindAngle = convert(boatLocationMessage.getApparentWindAngle(), 2);
|
||||
byte[] trueWindSpeed = convert(boatLocationMessage.getTrueWindSpeed(), 2);
|
||||
byte[] trueWindDirection = convert(boatLocationMessage.getTrueWindDirection(), 2);
|
||||
byte[] trueWindAngle = convert(boatLocationMessage.getTrueWindAngle(), 2);
|
||||
byte[] currentDrift = convert(boatLocationMessage.getCurrentDrift(), 2);
|
||||
byte[] currentSet = convert(boatLocationMessage.getCurrentSet(), 2);
|
||||
byte[] rudderAngle = convert(boatLocationMessage.getRudderAngle(), 2);
|
||||
|
||||
ByteBuffer result = ByteBuffer.allocate(56);
|
||||
result.put(convert(messageVersionNumber, 1));
|
||||
result.put(time);
|
||||
result.put(sourceID);
|
||||
result.put(seqNum);
|
||||
result.put(deviceType);
|
||||
result.put(latitude);
|
||||
result.put(longitude);
|
||||
result.put(altitude);
|
||||
result.put(heading);
|
||||
result.put(pitch);
|
||||
result.put(roll);
|
||||
result.put(boatSpeed);
|
||||
result.put(cog);
|
||||
result.put(sog);
|
||||
result.put(apparentWindSpeed);
|
||||
result.put(apparentWindAngle);
|
||||
result.put(trueWindSpeed);
|
||||
result.put(trueWindDirection);
|
||||
result.put(trueWindAngle);
|
||||
result.put(currentDrift);
|
||||
result.put(currentSet);
|
||||
result.put(rudderAngle);
|
||||
return result.array();
|
||||
}
|
||||
|
||||
public byte[] markRounding(int time, int ackNumber, int raceID, int sourceID, int boatStatus, int roundingSide, int markType, int markID) {
|
||||
int messageVersionNumber = 0b1;
|
||||
byte[] byteTime = convert(time, 6);
|
||||
byte[] byteAck = convert(ackNumber, 2);
|
||||
byte[] byteRaceID = convert(raceID, 4);
|
||||
byte[] byteSourceID = convert(sourceID, 4);
|
||||
byte[] byteBoatStatus = convert(boatStatus, 1);
|
||||
byte[] byteRoundingSide = convert(roundingSide, 1);
|
||||
byte[] byteMarkType = convert(markType, 1);
|
||||
byte[] byteMarkID = convert(markID, 1);
|
||||
|
||||
ByteBuffer result = ByteBuffer.allocate(21);
|
||||
result.put(convert(messageVersionNumber, 1));
|
||||
result.put(byteTime);
|
||||
result.put(byteAck);
|
||||
result.put(byteRaceID);
|
||||
result.put(byteSourceID);
|
||||
result.put(byteBoatStatus);
|
||||
result.put(byteRoundingSide);
|
||||
result.put(byteMarkType);
|
||||
result.put(byteMarkID);
|
||||
return result.array();
|
||||
}
|
||||
|
||||
public byte[] courseWind(byte windID, ArrayList<CourseWind> courseWinds) {
|
||||
int messageVersionNumber = 0b1;
|
||||
byte byteWindID = windID;
|
||||
byte[] loopcount = convert(courseWinds.size(), 1);
|
||||
ByteBuffer result = ByteBuffer.allocate(3 + 20 * courseWinds.size());
|
||||
result.put(convert(messageVersionNumber, 1));
|
||||
result.put(byteWindID);
|
||||
result.put(loopcount);
|
||||
for (CourseWind wind : courseWinds) {
|
||||
result.put(convert(wind.getID(), 1));
|
||||
result.put(convert(wind.getTime(), 6));
|
||||
result.put(convert(wind.getRaceID(), 4));
|
||||
result.put(convert(wind.getWindDirection(), 2));
|
||||
result.put(convert(wind.getWindSpeed(), 2));
|
||||
result.put(convert(wind.getBestUpwindAngle(), 2));
|
||||
result.put(convert(wind.getBestDownwindAngle(), 2));
|
||||
result.put(convert(wind.getFlags(), 1));
|
||||
}
|
||||
return result.array();
|
||||
}
|
||||
|
||||
public byte[] averageWind(int time, int rawPeriod, int rawSampleSpeed, int period2, int speed2, int period3, int speed3, int period4, int speed4) {
|
||||
int messageVersionNumber = 0b1;
|
||||
byte[] byteTime = convert(time, 6);
|
||||
byte[] byteRawPeriod = convert(rawPeriod, 2);
|
||||
byte[] byteRawSpeed = convert(rawSampleSpeed, 2);
|
||||
byte[] bytePeriod2 = convert(period2, 2);
|
||||
byte[] byteSpeed2 = convert(speed2, 2);
|
||||
byte[] bytePeriod3 = convert(period3, 2);
|
||||
byte[] byteSpeed3 = convert(speed3, 2);
|
||||
byte[] bytePeriod4 = convert(period4, 2);
|
||||
byte[] byteSpeed4 = convert(speed4, 2);
|
||||
|
||||
ByteBuffer result = ByteBuffer.allocate(23);
|
||||
result.put(convert(messageVersionNumber, 1));
|
||||
result.put(byteTime);
|
||||
result.put(byteRawPeriod);
|
||||
result.put(byteRawSpeed);
|
||||
result.put(bytePeriod2);
|
||||
result.put(byteSpeed2);
|
||||
result.put(bytePeriod3);
|
||||
result.put(byteSpeed3);
|
||||
result.put(bytePeriod4);
|
||||
result.put(byteSpeed4);
|
||||
return result.array();
|
||||
}
|
||||
|
||||
public byte[] convert(String s, int size) {
|
||||
byte[] m = s.getBytes(Charset.forName("UTF-8"));
|
||||
int length = m.length;
|
||||
byte[] result;
|
||||
if (length > 255) {
|
||||
length = 255;
|
||||
} else if (size < 1) {
|
||||
result = new byte[0];
|
||||
return result;
|
||||
}
|
||||
result = Arrays.copyOfRange(m, 0, length + 1);
|
||||
return result;
|
||||
}
|
||||
|
||||
public byte[] convert(int n, int size) {
|
||||
byte[] result;
|
||||
if (size > 4) {
|
||||
result = new byte[4];
|
||||
return result;
|
||||
} else if (size < 1) {
|
||||
result = new byte[0];
|
||||
return result;
|
||||
}
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
|
||||
byteBuffer.putInt(n);
|
||||
byte[] bytes = byteBuffer.array();
|
||||
result = Arrays.copyOfRange(bytes, 4 - size, 4);
|
||||
return result;
|
||||
}
|
||||
|
||||
public byte[] convert(long n, int size) {
|
||||
byte[] result;
|
||||
if (size > 8) {
|
||||
result = new byte[8];
|
||||
return result;
|
||||
} else if (size < 1) {
|
||||
result = new byte[0];
|
||||
return result;
|
||||
}
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
||||
byteBuffer.putLong(n);
|
||||
byte[] bytes = byteBuffer.array();
|
||||
result = Arrays.copyOfRange(bytes, 8 - size, 8);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public byte[] convert(short n, int size) {
|
||||
byte[] result;
|
||||
if (size > 2) {
|
||||
result = new byte[2];
|
||||
return result;
|
||||
} else if (size < 1) {
|
||||
result = new byte[0];
|
||||
return result;
|
||||
}
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(2);
|
||||
byteBuffer.putShort(n);
|
||||
byte[] bytes = byteBuffer.array();
|
||||
result = Arrays.copyOfRange(bytes, 2 - size, 2);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
package seng302.Networking.MessageEncoders;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* Encodes a XML file into a message of AC35 format
|
||||
*/
|
||||
public class XMLMessageEncoder {
|
||||
private byte messageVersionNumber;
|
||||
private short ackNumber;
|
||||
private long timeStamp;
|
||||
private byte xmlMsgSubType;
|
||||
private short sequenceNumber;
|
||||
private short xmlMsgLength;
|
||||
private String xmlMessage;
|
||||
|
||||
public XMLMessageEncoder(byte messageVersionNumber, short ackNumber, long timeStamp, byte xmlMsgSubType, short sequenceNumber, short xmlMsgLenght, String xmlMessage) {
|
||||
this.messageVersionNumber = messageVersionNumber;
|
||||
this.ackNumber = ackNumber;
|
||||
this.timeStamp = timeStamp;
|
||||
this.xmlMsgSubType = xmlMsgSubType;
|
||||
this.sequenceNumber = sequenceNumber;
|
||||
this.xmlMsgLength = xmlMsgLenght;
|
||||
this.xmlMessage = xmlMessage;
|
||||
}
|
||||
|
||||
public byte[] encode() {
|
||||
byte[] messageBytes = xmlMessage.getBytes();
|
||||
if (messageBytes.length > this.xmlMsgLength) {
|
||||
//System.err.println("Xml message is to big");
|
||||
return null;
|
||||
}
|
||||
ByteBuffer tempOutputByteBuffer = ByteBuffer.allocate(14 + messageBytes.length);
|
||||
|
||||
//ackNumber converted to bytes
|
||||
byte[] ackNumberBytes = new byte[2];
|
||||
ackNumberBytes[0] = (byte) (ackNumber & 0xff);
|
||||
ackNumberBytes[1] = (byte) ((ackNumber >> 8) & 0xff);
|
||||
|
||||
//sequenceNumber converted to bytes
|
||||
byte[] sequenceNumberBytes = new byte[2];
|
||||
sequenceNumberBytes[0] = (byte) (sequenceNumber & 0xff);
|
||||
sequenceNumberBytes[1] = (byte) ((sequenceNumber >> 8) & 0xff);
|
||||
|
||||
//xmlMsgLength converted to bytes
|
||||
byte[] xmlMsgLengthBytes = new byte[2];
|
||||
xmlMsgLengthBytes[0] = (byte) (xmlMsgLength & 0xff);
|
||||
xmlMsgLengthBytes[1] = (byte) ((xmlMsgLength >> 8) & 0xff);
|
||||
|
||||
|
||||
tempOutputByteBuffer.put(messageVersionNumber);
|
||||
tempOutputByteBuffer.put(ackNumberBytes);
|
||||
tempOutputByteBuffer.put(longToSixBytes(timeStamp));
|
||||
tempOutputByteBuffer.put(xmlMsgSubType);
|
||||
tempOutputByteBuffer.put(sequenceNumberBytes);
|
||||
tempOutputByteBuffer.put(xmlMsgLengthBytes);
|
||||
tempOutputByteBuffer.put(messageBytes);
|
||||
|
||||
return tempOutputByteBuffer.array();
|
||||
}
|
||||
|
||||
private byte[] longToSixBytes(long x) {
|
||||
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
|
||||
buffer.putLong(x);
|
||||
|
||||
// System.out.println("====encode====");
|
||||
// for (byte i:buffer.array()
|
||||
// ) {
|
||||
// System.out.println(i);
|
||||
// }
|
||||
// System.out.println("====encode====");
|
||||
|
||||
return Arrays.copyOfRange(buffer.array(), 2, 8);
|
||||
}
|
||||
}
|
||||
@@ -1,313 +0,0 @@
|
||||
package seng302.Networking.Utils;
|
||||
|
||||
/**
|
||||
* Created by f123 on 21-Apr-17.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Represents the information in a boat location message (AC streaming spec: 4.9).
|
||||
*/
|
||||
public class BoatLocationMessage {
|
||||
///Version number of the message - is always 1.
|
||||
private byte messageVersionNumber = 1;
|
||||
|
||||
///Time of the event - milliseconds since jan 1 1970. Proper type is 6 byte int.
|
||||
private long time;
|
||||
|
||||
///Source ID of the boat.
|
||||
private int sourceID;
|
||||
|
||||
///Sequence number of the message.
|
||||
private int sequenceNumber;
|
||||
|
||||
///Device type of the message (physical source of the message).
|
||||
private byte deviceType;
|
||||
|
||||
///Latitude of the boat.
|
||||
private int latitude;
|
||||
|
||||
///Longitude of the boat.
|
||||
private int longitude;
|
||||
|
||||
///Altitude of the boat.
|
||||
private int altitude;
|
||||
|
||||
///Heading of the boat. Clockwise, 0 = north. Proper type is unsigned 2 byte int.
|
||||
private int heading;
|
||||
|
||||
///Pitch of the boat.
|
||||
private short pitch;
|
||||
|
||||
///Roll of the boat.
|
||||
private short roll;
|
||||
|
||||
///Speed of the boat. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int boatSpeed;
|
||||
|
||||
///Course over ground (COG) of the boat. Proper type is unsigned 2 byte int.
|
||||
private int boatCOG;
|
||||
|
||||
///Speed over ground (SOG) of the boat. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int boatSOG;
|
||||
|
||||
///Apparent wind speed at time of event. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int apparentWindSpeed;
|
||||
|
||||
///Apparent wind angle at time of the event. Wind over starboard = positive.
|
||||
private short apparentWindAngle;
|
||||
|
||||
///True wind speed. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int trueWindSpeed;
|
||||
|
||||
private short trueWindDirection;
|
||||
|
||||
///True wind angle. Clockwise compass direction, 0 = north.
|
||||
private short trueWindAngle;
|
||||
|
||||
///Current drift. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int currentDrift;
|
||||
|
||||
///Current set. Proper type is unsigned 2 byte int. Clockwise compass direction, 0 = north.
|
||||
private int currentSet;
|
||||
|
||||
///Rudder angle. Positive is rudder set to turn yacht to port.
|
||||
private short rudderAngle;
|
||||
|
||||
|
||||
/**
|
||||
* Ctor.
|
||||
*/
|
||||
public BoatLocationMessage() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Ctor, with all parameters.
|
||||
*
|
||||
* @param messageVersionNumber
|
||||
* @param time
|
||||
* @param sourceID
|
||||
* @param sequenceNumber
|
||||
* @param deviceType
|
||||
* @param latitude
|
||||
* @param longitude
|
||||
* @param altitude
|
||||
* @param heading
|
||||
* @param pitch
|
||||
* @param roll
|
||||
* @param boatSpeed
|
||||
* @param boatCOG
|
||||
* @param boatSOG
|
||||
* @param apparentWindSpeed
|
||||
* @param apparentWindAngle
|
||||
* @param trueWindSpeed
|
||||
* @param trueWindDirection
|
||||
* @param trueWindAngle
|
||||
* @param currentDrift
|
||||
* @param currentSet
|
||||
* @param rudderAngle
|
||||
*/
|
||||
public BoatLocationMessage(byte messageVersionNumber, long time, int sourceID, int sequenceNumber, byte deviceType, int latitude, int longitude, int altitude, int heading, short pitch, short roll, int boatSpeed, int boatCOG, int boatSOG, int apparentWindSpeed, short apparentWindAngle, int trueWindSpeed, short trueWindDirection, short trueWindAngle, int currentDrift, int currentSet, short rudderAngle) {
|
||||
this.messageVersionNumber = messageVersionNumber;
|
||||
this.time = time;
|
||||
this.sourceID = sourceID;
|
||||
this.sequenceNumber = sequenceNumber;
|
||||
this.deviceType = deviceType;
|
||||
this.latitude = latitude;
|
||||
this.longitude = longitude;
|
||||
this.altitude = altitude;
|
||||
this.heading = heading;
|
||||
this.pitch = pitch;
|
||||
this.roll = roll;
|
||||
this.boatSpeed = boatSpeed;
|
||||
this.boatCOG = boatCOG;
|
||||
this.boatSOG = boatSOG;
|
||||
this.apparentWindSpeed = apparentWindSpeed;
|
||||
this.apparentWindAngle = apparentWindAngle;
|
||||
this.trueWindSpeed = trueWindSpeed;
|
||||
this.trueWindDirection = trueWindDirection;
|
||||
this.trueWindAngle = trueWindAngle;
|
||||
this.currentDrift = currentDrift;
|
||||
this.currentSet = currentSet;
|
||||
this.rudderAngle = rudderAngle;
|
||||
}
|
||||
|
||||
|
||||
//Getters and setters for message properties.
|
||||
|
||||
|
||||
public byte getMessageVersionNumber() {
|
||||
return messageVersionNumber;
|
||||
}
|
||||
|
||||
public void setMessageVersionNumber(byte messageVersionNumber) {
|
||||
this.messageVersionNumber = messageVersionNumber;
|
||||
}
|
||||
|
||||
public long getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public void setTime(long time) {
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
public int getSourceID() {
|
||||
return sourceID;
|
||||
}
|
||||
|
||||
public void setSourceID(int sourceID) {
|
||||
this.sourceID = sourceID;
|
||||
}
|
||||
|
||||
public int getSequenceNumber() {
|
||||
return sequenceNumber;
|
||||
}
|
||||
|
||||
public void setSequenceNumber(int sequenceNumber) {
|
||||
this.sequenceNumber = sequenceNumber;
|
||||
}
|
||||
|
||||
public byte getDeviceType() {
|
||||
return deviceType;
|
||||
}
|
||||
|
||||
public void setDeviceType(byte deviceType) {
|
||||
this.deviceType = deviceType;
|
||||
}
|
||||
|
||||
public int getLatitude() {
|
||||
return latitude;
|
||||
}
|
||||
|
||||
public void setLatitude(int latitude) {
|
||||
this.latitude = latitude;
|
||||
}
|
||||
|
||||
public int getLongitude() {
|
||||
return longitude;
|
||||
}
|
||||
|
||||
public void setLongitude(int longitude) {
|
||||
this.longitude = longitude;
|
||||
}
|
||||
|
||||
public int getAltitude() {
|
||||
return altitude;
|
||||
}
|
||||
|
||||
public void setAltitude(int altitude) {
|
||||
this.altitude = altitude;
|
||||
}
|
||||
|
||||
public int getHeading() {
|
||||
return heading;
|
||||
}
|
||||
|
||||
public void setHeading(int heading) {
|
||||
this.heading = heading;
|
||||
}
|
||||
|
||||
public short getPitch() {
|
||||
return pitch;
|
||||
}
|
||||
|
||||
public void setPitch(short pitch) {
|
||||
this.pitch = pitch;
|
||||
}
|
||||
|
||||
public short getRoll() {
|
||||
return roll;
|
||||
}
|
||||
|
||||
public void setRoll(short roll) {
|
||||
this.roll = roll;
|
||||
}
|
||||
|
||||
public int getBoatSpeed() {
|
||||
return boatSpeed;
|
||||
}
|
||||
|
||||
public void setBoatSpeed(int boatSpeed) {
|
||||
this.boatSpeed = boatSpeed;
|
||||
}
|
||||
|
||||
public int getBoatCOG() {
|
||||
return boatCOG;
|
||||
}
|
||||
|
||||
public void setBoatCOG(int boatCOG) {
|
||||
this.boatCOG = boatCOG;
|
||||
}
|
||||
|
||||
public int getBoatSOG() {
|
||||
return boatSOG;
|
||||
}
|
||||
|
||||
public void setBoatSOG(int boatSOG) {
|
||||
this.boatSOG = boatSOG;
|
||||
}
|
||||
|
||||
public int getApparentWindSpeed() {
|
||||
return apparentWindSpeed;
|
||||
}
|
||||
|
||||
public void setApparentWindSpeed(int apparentWindSpeed) {
|
||||
this.apparentWindSpeed = apparentWindSpeed;
|
||||
}
|
||||
|
||||
public short getApparentWindAngle() {
|
||||
return apparentWindAngle;
|
||||
}
|
||||
|
||||
public void setApparentWindAngle(short apparentWindAngle) {
|
||||
this.apparentWindAngle = apparentWindAngle;
|
||||
}
|
||||
|
||||
public int getTrueWindSpeed() {
|
||||
return trueWindSpeed;
|
||||
}
|
||||
|
||||
public void setTrueWindSpeed(int trueWindSpeed) {
|
||||
this.trueWindSpeed = trueWindSpeed;
|
||||
}
|
||||
|
||||
public short getTrueWindDirection() {
|
||||
return trueWindDirection;
|
||||
}
|
||||
|
||||
public void setTrueWindDirection(short trueWindDirection) {
|
||||
this.trueWindDirection = trueWindDirection;
|
||||
}
|
||||
|
||||
public short getTrueWindAngle() {
|
||||
return trueWindAngle;
|
||||
}
|
||||
|
||||
public void setTrueWindAngle(short trueWindAngle) {
|
||||
this.trueWindAngle = trueWindAngle;
|
||||
}
|
||||
|
||||
public int getCurrentDrift() {
|
||||
return currentDrift;
|
||||
}
|
||||
|
||||
public void setCurrentDrift(int currentDrift) {
|
||||
this.currentDrift = currentDrift;
|
||||
}
|
||||
|
||||
public int getCurrentSet() {
|
||||
return currentSet;
|
||||
}
|
||||
|
||||
public void setCurrentSet(int currentSet) {
|
||||
this.currentSet = currentSet;
|
||||
}
|
||||
|
||||
public short getRudderAngle() {
|
||||
return rudderAngle;
|
||||
}
|
||||
|
||||
public void setRudderAngle(short rudderAngle) {
|
||||
this.rudderAngle = rudderAngle;
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
package seng302.Networking.Utils;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 23/04/17.
|
||||
*/
|
||||
public class BoatStatus {
|
||||
private int sourceID;
|
||||
private byte boatStatus;
|
||||
private byte legNumber;
|
||||
private byte numPenaltiesAwarded;
|
||||
private byte numPenaltiesServed;
|
||||
private long estTimeAtNextMark;
|
||||
private long estTimeAtFinish;
|
||||
|
||||
public BoatStatus(int sourceID, byte boatStatus, byte legNumber, byte numPenaltiesAwarded, byte numPenaltiesServed, long estTimeAtNextMark, long estTimeAtFinish) {
|
||||
this.sourceID = sourceID;
|
||||
this.boatStatus = boatStatus;
|
||||
this.legNumber = legNumber;
|
||||
this.numPenaltiesAwarded = numPenaltiesAwarded;
|
||||
this.numPenaltiesServed = numPenaltiesServed;
|
||||
this.estTimeAtNextMark = estTimeAtNextMark;
|
||||
this.estTimeAtFinish = estTimeAtFinish;
|
||||
}
|
||||
|
||||
public int getSourceID() {
|
||||
return sourceID;
|
||||
}
|
||||
|
||||
public byte getBoatStatus() {
|
||||
return boatStatus;
|
||||
}
|
||||
|
||||
public byte getLegNumber() {
|
||||
return legNumber;
|
||||
}
|
||||
|
||||
public byte getNumPenaltiesAwarded() {
|
||||
return numPenaltiesAwarded;
|
||||
}
|
||||
|
||||
public byte getNumPenaltiesServed() {
|
||||
return numPenaltiesServed;
|
||||
}
|
||||
|
||||
public long getEstTimeAtNextMark() {
|
||||
return estTimeAtNextMark;
|
||||
}
|
||||
|
||||
public long getEstTimeAtFinish() {
|
||||
return estTimeAtFinish;
|
||||
}
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
package seng302.Networking.Utils;
|
||||
|
||||
/**
|
||||
* Created by fwy13 on 21/04/17.
|
||||
*/
|
||||
public class CourseWind {
|
||||
|
||||
private int ID, raceID, windDirection, windSpeed, bestUpwindAngle, bestDownwindAngle, flags;
|
||||
private long time;
|
||||
|
||||
public CourseWind(int ID, long time, int raceID, int windDirection, int windSpeed, int bestUpwindAngle, int bestDownwindAngle,
|
||||
int flags) {
|
||||
this.ID = ID;
|
||||
this.time = time;
|
||||
this.raceID = raceID;
|
||||
this.windDirection = windDirection;
|
||||
this.windSpeed = windSpeed;
|
||||
this.bestUpwindAngle = bestUpwindAngle;
|
||||
this.bestDownwindAngle = bestDownwindAngle;
|
||||
this.flags = flags;
|
||||
}
|
||||
|
||||
public int getID() {
|
||||
return ID;
|
||||
}
|
||||
|
||||
public int getRaceID() {
|
||||
return raceID;
|
||||
}
|
||||
|
||||
public int getWindDirection() {
|
||||
return windDirection;
|
||||
}
|
||||
|
||||
public int getWindSpeed() {
|
||||
return windSpeed;
|
||||
}
|
||||
|
||||
public int getBestUpwindAngle() {
|
||||
return bestUpwindAngle;
|
||||
}
|
||||
|
||||
public int getBestDownwindAngle() {
|
||||
return bestDownwindAngle;
|
||||
}
|
||||
|
||||
public int getFlags() {
|
||||
return flags;
|
||||
}
|
||||
|
||||
public long getTime() {
|
||||
return time;
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package seng302.Networking.Utils;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 21/04/17.
|
||||
*/
|
||||
public enum MessageType {
|
||||
HEARTBEAT(1), RACESTATUS(12), DISPLAYTEXTMESSAGE(20),
|
||||
XMLMESSAGE(26), RACESTARTSTATUS(27), YACHTEVENTCODE(29), YACHTACTIONCODE(31),
|
||||
CHATTERTEXT(36), BOATLOCATION(37), MARKROUNDING(38), COURSEWIND(44), AVGWIND(47);
|
||||
|
||||
private byte value;
|
||||
|
||||
private MessageType(int value) {
|
||||
this.value = (byte) value;
|
||||
}
|
||||
|
||||
public byte getValue() {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
package seng302.Networking.Utils;
|
||||
|
||||
/**
|
||||
* Created by fwy13 on 19/04/17.
|
||||
*/
|
||||
public class RaceMessage {
|
||||
|
||||
private int lineNumber;
|
||||
private String messageText;
|
||||
|
||||
public RaceMessage(int lineNumber, String messageText) {
|
||||
this.lineNumber = lineNumber;
|
||||
this.messageText = messageText;
|
||||
}
|
||||
|
||||
public int getLineNumber() {
|
||||
return lineNumber;
|
||||
}
|
||||
|
||||
public String getMessageText() {
|
||||
return messageText;
|
||||
}
|
||||
}
|
||||
@@ -1,494 +0,0 @@
|
||||
package seng302.RaceEventMessages;
|
||||
|
||||
/**
|
||||
* Created by f123 on 21-Apr-17.
|
||||
*/
|
||||
|
||||
import seng302.Constants;
|
||||
|
||||
/**
|
||||
* Represents the information in a boat location message (AC streaming spec: 4.9).
|
||||
*/
|
||||
public class BoatLocationMessage {
|
||||
public static final byte Unknown = 0;
|
||||
public static final byte RacingYacht = 1;
|
||||
public static final byte CommitteeBoat = 2;
|
||||
public static final byte Mark = 3;
|
||||
public static final byte Pin = 4;
|
||||
public static final byte ChaseBoat = 5;
|
||||
public static final byte MedicalBoat = 6;
|
||||
public static final byte MarshallBoat = 7;
|
||||
public static final byte UmpireBoat = 8;
|
||||
public static final byte UmpireSoftwareApplication = 9;
|
||||
public static final byte PrincipalRaceOfficerApplication = 10;
|
||||
public static final byte WeatherStation = 11;
|
||||
public static final byte Helicopter = 12;
|
||||
public static final byte DataProcessingApplication = 13;
|
||||
///Version number of the message - is always 1.
|
||||
private byte messageVersionNumber = 1;
|
||||
///Time of the event - milliseconds since jan 1 1970. Proper type is 6 byte int.
|
||||
private long time;
|
||||
///Source ID of the boat.
|
||||
private int sourceID;
|
||||
///Sequence number of the message.
|
||||
private long sequenceNumber;
|
||||
///Device type of the message (physical source of the message).
|
||||
private byte deviceType;
|
||||
///Latitude of the boat.
|
||||
private int latitude;
|
||||
|
||||
///Longitude of the boat.
|
||||
private int longitude;
|
||||
|
||||
///Altitude of the boat.
|
||||
private int altitude;
|
||||
|
||||
///Heading of the boat. Clockwise, 0 = north. Proper type is unsigned 2 byte int.
|
||||
private int heading;
|
||||
|
||||
///Pitch of the boat.
|
||||
private short pitch;
|
||||
|
||||
///Roll of the boat.
|
||||
private short roll;
|
||||
|
||||
///Speed of the boat. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int boatSpeed;
|
||||
|
||||
///Course over ground (COG) of the boat. Proper type is unsigned 2 byte int.
|
||||
private int boatCOG;
|
||||
|
||||
///Speed over ground (SOG) of the boat. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int boatSOG;
|
||||
|
||||
///Apparent wind speed at time of event. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int apparentWindSpeed;
|
||||
|
||||
///Apparent wind angle at time of the event. Wind over starboard = positive.
|
||||
private short apparentWindAngle;
|
||||
|
||||
///True wind speed. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int trueWindSpeed;
|
||||
|
||||
///True wind angle. Clockwise compass direction, 0 = north.
|
||||
private short trueWindAngle;
|
||||
|
||||
///Current drift. Proper type is unsigned 2 byte int. millimeters per second.
|
||||
private int currentDrift;
|
||||
|
||||
///Current set. Proper type is unsigned 2 byte int. Clockwise compass direction, 0 = north.
|
||||
private int currentSet;
|
||||
|
||||
///Rudder angle. Positive is rudder set to turn yacht to port.
|
||||
private short rudderAngle;
|
||||
|
||||
|
||||
/**
|
||||
* Ctor. Default.
|
||||
*/
|
||||
public BoatLocationMessage() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Ctor, with all parameters.
|
||||
*
|
||||
* @param messageVersionNumber
|
||||
* @param time
|
||||
* @param sourceID
|
||||
* @param sequenceNumber
|
||||
* @param deviceType
|
||||
* @param latitude
|
||||
* @param longitude
|
||||
* @param altitude
|
||||
* @param heading
|
||||
* @param pitch
|
||||
* @param roll
|
||||
* @param boatSpeed
|
||||
* @param boatCOG
|
||||
* @param boatSOG
|
||||
* @param apparentWindSpeed
|
||||
* @param apparentWindAngle
|
||||
* @param trueWindSpeed
|
||||
* @param trueWindAngle
|
||||
* @param currentDrift
|
||||
* @param currentSet
|
||||
* @param rudderAngle
|
||||
*/
|
||||
public BoatLocationMessage(byte messageVersionNumber, long time, int sourceID, long sequenceNumber, byte deviceType, int latitude, int longitude, int altitude, int heading, short pitch, short roll, int boatSpeed, int boatCOG, int boatSOG, int apparentWindSpeed, short apparentWindAngle, int trueWindSpeed, short trueWindAngle, int currentDrift, int currentSet, short rudderAngle) {
|
||||
this.messageVersionNumber = messageVersionNumber;
|
||||
this.time = time;
|
||||
this.sourceID = sourceID;
|
||||
this.sequenceNumber = sequenceNumber;
|
||||
this.deviceType = deviceType;
|
||||
this.latitude = latitude;
|
||||
this.longitude = longitude;
|
||||
this.altitude = altitude;
|
||||
this.heading = heading;
|
||||
this.pitch = pitch;
|
||||
this.roll = roll;
|
||||
this.boatSpeed = boatSpeed;
|
||||
this.boatCOG = boatCOG;
|
||||
this.boatSOG = boatSOG;
|
||||
this.apparentWindSpeed = apparentWindSpeed;
|
||||
this.apparentWindAngle = apparentWindAngle;
|
||||
this.trueWindSpeed = trueWindSpeed;
|
||||
this.trueWindAngle = trueWindAngle;
|
||||
this.currentDrift = currentDrift;
|
||||
this.currentSet = currentSet;
|
||||
this.rudderAngle = rudderAngle;
|
||||
}
|
||||
|
||||
|
||||
//Getters and setters for message properties.
|
||||
|
||||
/**
|
||||
* Converts a double representing a latitude or longitude coordinate to an int, as required by the streaming spec format.
|
||||
*
|
||||
* @param coordinate Latitude or longitude to convert. Double.
|
||||
* @return int representation of coordinate.
|
||||
*/
|
||||
public static int convertCoordinateDoubleToInt(double coordinate) {
|
||||
int coordinateInt = (int) ((coordinate / 180.0) * 2147483648.0);
|
||||
|
||||
return coordinateInt;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an int representing a latitude or longitude coordinate to a double, as required by the streaming spec format.
|
||||
*
|
||||
* @param coordinate Latitude or longitude to convert. int.
|
||||
* @return double representation of coordinate.
|
||||
*/
|
||||
public static double convertCoordinateIntToDouble(int coordinate) {
|
||||
double coordinateDouble = (double) ((coordinate * 180.0) / 2147483648.0);
|
||||
|
||||
return coordinateDouble;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an int representing a heading to a double, as required by the streaming spec format.
|
||||
*
|
||||
* @param heading Heading to convert. int.
|
||||
* @return double representation of heading.
|
||||
*/
|
||||
public static double convertHeadingIntToDouble(int heading) {
|
||||
|
||||
double headingDouble = (double) ((heading * 360.0) / 65536.0);
|
||||
|
||||
return headingDouble;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a double representing a heading to an int, as required by the streaming spec format.
|
||||
*
|
||||
* @param heading Heading to convert. double.
|
||||
* @return int representation of heading.
|
||||
*/
|
||||
public static int convertHeadingDoubleToInt(double heading) {
|
||||
|
||||
int headingInt = (int) ((heading / 360.0) * 65536.0);
|
||||
|
||||
return headingInt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a short representing the wind's true angle to a double, as required by the streaming spec format.
|
||||
*
|
||||
* @param angle Angle to convert. short.
|
||||
* @return double representation of heading.
|
||||
*/
|
||||
public static double convertTrueWindAngleShortToDouble(short angle) {
|
||||
|
||||
double angleDouble = (double) ((angle * 180.0) / 32768.0);
|
||||
|
||||
return angleDouble;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a double representing the wind's true angle to a short, as required by the streaming spec format.
|
||||
*
|
||||
* @param angle Angle to convert. double.
|
||||
* @return short representation of heading.
|
||||
*/
|
||||
public static short convertTrueWindAngleShortToDouble(double angle) {
|
||||
|
||||
short angleShort = (short) ((angle / 180.0) * 32768.0);
|
||||
|
||||
return angleShort;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a double representing the speed of a boat in knots to an int in millimeters per second, as required by the streaming spec format.
|
||||
*
|
||||
* @param speed Speed in knots, stored as a double.
|
||||
* @return Speed in millimeters per second, stored as an int (using only the two least significant bytes).
|
||||
*/
|
||||
public static int convertBoatSpeedDoubleToInt(double speed) {
|
||||
//Calculate meters per second.
|
||||
double metersPerSecond = speed * Constants.KnotsToMetersPerSecondConversionFactor;
|
||||
|
||||
//Calculate millimeters per second.
|
||||
double millimetersPerSecond = metersPerSecond * 1000.0;
|
||||
|
||||
//Convert to an int.
|
||||
int millimetersPerSecondInt = (int) Math.round(millimetersPerSecond);
|
||||
|
||||
return millimetersPerSecondInt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an int representing the speed of a boat in millimeters per second to a double in knots, as required by the streaming spec format.
|
||||
*
|
||||
* @param speed Speed in millimeters per second, stored as an int.
|
||||
* @return Speed in knots, stored as a double.
|
||||
*/
|
||||
public static double convertBoatSpeedIntToDouble(int speed) {
|
||||
//Calculate meters per second.
|
||||
double metersPerSecond = speed / 1000.0;
|
||||
|
||||
//Calculate knots.
|
||||
double knots = metersPerSecond / Constants.KnotsToMetersPerSecondConversionFactor;
|
||||
|
||||
return knots;
|
||||
}
|
||||
|
||||
public byte getMessageVersionNumber() {
|
||||
return messageVersionNumber;
|
||||
}
|
||||
|
||||
public void setMessageVersionNumber(byte messageVersionNumber) {
|
||||
this.messageVersionNumber = messageVersionNumber;
|
||||
}
|
||||
|
||||
public long getTime() {
|
||||
return time;
|
||||
}
|
||||
|
||||
public void setTime(long time) {
|
||||
this.time = time;
|
||||
}
|
||||
|
||||
public int getSourceID() {
|
||||
return sourceID;
|
||||
}
|
||||
|
||||
public void setSourceID(int sourceID) {
|
||||
this.sourceID = sourceID;
|
||||
}
|
||||
|
||||
public long getSequenceNumber() {
|
||||
return sequenceNumber;
|
||||
}
|
||||
|
||||
public void setSequenceNumber(long sequenceNumber) {
|
||||
this.sequenceNumber = sequenceNumber;
|
||||
}
|
||||
|
||||
public byte getDeviceType() {
|
||||
return deviceType;
|
||||
}
|
||||
|
||||
public void setDeviceType(byte deviceType) {
|
||||
this.deviceType = deviceType;
|
||||
}
|
||||
|
||||
public int getLatitude() {
|
||||
return latitude;
|
||||
}
|
||||
|
||||
public void setLatitude(int latitude) {
|
||||
this.latitude = latitude;
|
||||
}
|
||||
|
||||
public int getLongitude() {
|
||||
return longitude;
|
||||
}
|
||||
|
||||
public void setLongitude(int longitude) {
|
||||
this.longitude = longitude;
|
||||
}
|
||||
|
||||
public int getAltitude() {
|
||||
return altitude;
|
||||
}
|
||||
|
||||
public void setAltitude(int altitude) {
|
||||
this.altitude = altitude;
|
||||
}
|
||||
|
||||
public int getHeading() {
|
||||
return heading;
|
||||
}
|
||||
|
||||
public void setHeading(int heading) {
|
||||
this.heading = heading;
|
||||
}
|
||||
|
||||
public short getPitch() {
|
||||
return pitch;
|
||||
}
|
||||
|
||||
public void setPitch(short pitch) {
|
||||
this.pitch = pitch;
|
||||
}
|
||||
|
||||
public short getRoll() {
|
||||
return roll;
|
||||
}
|
||||
|
||||
public void setRoll(short roll) {
|
||||
this.roll = roll;
|
||||
}
|
||||
|
||||
public int getBoatSpeed() {
|
||||
return boatSpeed;
|
||||
}
|
||||
|
||||
public void setBoatSpeed(int boatSpeed) {
|
||||
this.boatSpeed = boatSpeed;
|
||||
}
|
||||
|
||||
public int getBoatCOG() {
|
||||
return boatCOG;
|
||||
}
|
||||
|
||||
public void setBoatCOG(int boatCOG) {
|
||||
this.boatCOG = boatCOG;
|
||||
}
|
||||
|
||||
public int getBoatSOG() {
|
||||
return boatSOG;
|
||||
}
|
||||
|
||||
public void setBoatSOG(int boatSOG) {
|
||||
this.boatSOG = boatSOG;
|
||||
}
|
||||
|
||||
public int getApparentWindSpeed() {
|
||||
return apparentWindSpeed;
|
||||
}
|
||||
|
||||
public void setApparentWindSpeed(int apparentWindSpeed) {
|
||||
this.apparentWindSpeed = apparentWindSpeed;
|
||||
}
|
||||
|
||||
public short getApparentWindAngle() {
|
||||
return apparentWindAngle;
|
||||
}
|
||||
|
||||
public void setApparentWindAngle(short apparentWindAngle) {
|
||||
this.apparentWindAngle = apparentWindAngle;
|
||||
}
|
||||
|
||||
public int getTrueWindSpeed() {
|
||||
return trueWindSpeed;
|
||||
}
|
||||
|
||||
public void setTrueWindSpeed(int trueWindSpeed) {
|
||||
this.trueWindSpeed = trueWindSpeed;
|
||||
}
|
||||
|
||||
public short getTrueWindAngle() {
|
||||
return trueWindAngle;
|
||||
}
|
||||
|
||||
public void setTrueWindAngle(short trueWindAngle) {
|
||||
this.trueWindAngle = trueWindAngle;
|
||||
}
|
||||
|
||||
public int getCurrentDrift() {
|
||||
return currentDrift;
|
||||
}
|
||||
|
||||
public void setCurrentDrift(int currentDrift) {
|
||||
this.currentDrift = currentDrift;
|
||||
}
|
||||
|
||||
public int getCurrentSet() {
|
||||
return currentSet;
|
||||
}
|
||||
|
||||
public void setCurrentSet(int currentSet) {
|
||||
this.currentSet = currentSet;
|
||||
}
|
||||
|
||||
public short getRudderAngle() {
|
||||
return rudderAngle;
|
||||
}
|
||||
|
||||
public void setRudderAngle(short rudderAngle) {
|
||||
this.rudderAngle = rudderAngle;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
builder.append("Message version number: ");
|
||||
builder.append(this.getMessageVersionNumber());
|
||||
|
||||
builder.append("\nTime: ");
|
||||
builder.append(this.getTime());
|
||||
|
||||
builder.append("\nSource ID: ");
|
||||
builder.append(this.getSourceID());
|
||||
|
||||
builder.append("\nSequence number: ");
|
||||
builder.append(this.getSequenceNumber());
|
||||
|
||||
builder.append("\nDevice type: ");
|
||||
builder.append(this.getDeviceType());
|
||||
|
||||
builder.append("\nLatitude: ");
|
||||
builder.append(this.getLatitude());
|
||||
|
||||
builder.append("\nLongitude: ");
|
||||
builder.append(this.getLongitude());
|
||||
|
||||
builder.append("\nAltitude: ");
|
||||
builder.append(this.getAltitude());
|
||||
|
||||
builder.append("\nHeading: ");
|
||||
builder.append(this.getHeading());
|
||||
|
||||
builder.append("\nPitch: ");
|
||||
builder.append(this.getPitch());
|
||||
|
||||
builder.append("\nRoll: ");
|
||||
builder.append(this.getRoll());
|
||||
|
||||
builder.append("\nBoat speed (mm/sec): ");
|
||||
builder.append(this.getBoatSpeed());
|
||||
|
||||
builder.append("\nBoat COG: ");
|
||||
builder.append(this.getBoatCOG());
|
||||
|
||||
builder.append("\nBoat SOG: ");
|
||||
builder.append(this.getBoatSOG());
|
||||
|
||||
builder.append("\nApparent wind speed: ");
|
||||
builder.append(this.getApparentWindSpeed());
|
||||
|
||||
builder.append("\nApparent wind angle: ");
|
||||
builder.append(this.getApparentWindAngle());
|
||||
|
||||
builder.append("\nTrue wind speed: ");
|
||||
builder.append(this.getTrueWindSpeed());
|
||||
|
||||
builder.append("\nTrue wind angle: ");
|
||||
builder.append(this.getTrueWindAngle());
|
||||
|
||||
builder.append("\nCurrent drift: ");
|
||||
builder.append(this.getCurrentDrift());
|
||||
|
||||
builder.append("\nCurrent set: ");
|
||||
builder.append(this.getCurrentSet());
|
||||
|
||||
builder.append("\nRudder angle: ");
|
||||
builder.append(this.getRudderAngle());
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
@@ -2,8 +2,7 @@ package seng302.DataInput;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import seng302.DataInput.RegattaXMLReader;
|
||||
import seng302.Model.Regatta;
|
||||
import SharedModel.Regatta;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package seng302.Model;
|
||||
|
||||
import javafx.scene.paint.Color;
|
||||
import org.junit.Test;
|
||||
import SharedModel.*;
|
||||
|
||||
import static junit.framework.TestCase.*;
|
||||
|
||||
@@ -151,4 +152,4 @@ public class BoatInRaceTest {
|
||||
boat.setVelocity(20);
|
||||
assertEquals(2 * endpointAt10Kn, boat.getWake().getLatitude(), 1e-8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,10 @@ package seng302.Model;
|
||||
|
||||
import org.geotools.referencing.GeodeticCalculator;
|
||||
import org.junit.Test;
|
||||
import seng302.Constants;
|
||||
import SharedModel.Constants;
|
||||
import SharedModel.GPSCoordinate;
|
||||
import SharedModel.Leg;
|
||||
import SharedModel.Marker;
|
||||
|
||||
import java.awt.geom.Point2D;
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@ package seng302.Model;
|
||||
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import SharedModel.GPSCoordinate;
|
||||
import SharedModel.Marker;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ package seng302.Model;/**
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import seng302.DataInput.RaceXMLReader;
|
||||
import SharedModel.BoatInRace;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -92,4 +93,4 @@ public class RaceXMLTest {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
package seng302.Networking;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import seng302.Networking.MessageDecoders.XMLMessageDecoder;
|
||||
import seng302.Networking.MessageEncoders.XMLMessageEncoder;
|
||||
import seng302.Networking.Utils.MessageType;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 21/04/17.
|
||||
*/
|
||||
public class BinaryMessageDecoderTest {
|
||||
@Test
|
||||
public void decodeTest() {
|
||||
try {
|
||||
StringBuilder xmlString;
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(
|
||||
this.getClass().getResourceAsStream(("../../raceXML/Regatta.xml"))));
|
||||
String line;
|
||||
xmlString = new StringBuilder();
|
||||
while ((line = br.readLine()) != null) {
|
||||
xmlString.append(line.trim());
|
||||
}
|
||||
long time = System.currentTimeMillis();
|
||||
XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte) 1, (short) 1, time, (byte) 7, (short) 1, (short) xmlString.length(), xmlString.toString());
|
||||
|
||||
byte[] encodedMessage = testEncoder.encode();
|
||||
|
||||
BinaryMesageEncoder testMessage = new BinaryMesageEncoder(MessageType.XMLMESSAGE, time, 1, (short) encodedMessage.length, encodedMessage);
|
||||
|
||||
BinaryMessageDecoder testDecoder = new BinaryMessageDecoder(testMessage.getFullMessage());
|
||||
testDecoder.decode();
|
||||
|
||||
//message length
|
||||
Assert.assertEquals((short) encodedMessage.length, testDecoder.getMessageLength());
|
||||
//time stamp
|
||||
Assert.assertEquals(time, testDecoder.getTimeStamp());
|
||||
//source ID
|
||||
Assert.assertEquals((short) 1, testDecoder.getSourceID());
|
||||
//message type
|
||||
Assert.assertEquals(26, testDecoder.getMessageType());
|
||||
|
||||
XMLMessageDecoder decoderXML = new XMLMessageDecoder(testDecoder.getMessage());
|
||||
decoderXML.decode();
|
||||
|
||||
//tests from seng302.Networking.MessageDecoders.XMLMessageDecoderTest to make sure the file is still good
|
||||
Assert.assertEquals((byte) 1, decoderXML.getMessageVersionNumber());
|
||||
Assert.assertEquals((short) 1, decoderXML.getAckNumber());
|
||||
Assert.assertEquals(time, decoderXML.getTimeStamp());
|
||||
Assert.assertEquals((byte) 7, decoderXML.getXmlMsgSubType());
|
||||
Assert.assertEquals((short) 1, decoderXML.getSequenceNumber());
|
||||
Assert.assertEquals((short) xmlString.length(), decoderXML.getXmlMsgLength());
|
||||
Assert.assertEquals(xmlString.toString(), decoderXML.getXmlMessage());
|
||||
|
||||
} catch (IOException e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import seng302.Networking.MessageEncoders.RaceVisionByteEncoder;
|
||||
import seng302.Networking.Utils.BoatLocationMessage;
|
||||
|
||||
|
||||
/**
|
||||
* Created by hba56 on 23/04/17.
|
||||
*/
|
||||
public class BoatLocationDecoderTest {
|
||||
@Test
|
||||
public void getByteArrayTest() {
|
||||
long time = System.currentTimeMillis();
|
||||
BoatLocationMessage testMessage = new BoatLocationMessage((byte) 1, time, (byte) 2,
|
||||
3, (byte) 1, 180, -180, 4, (short) 5,
|
||||
(short) 6, (short) 7, 8, 9, 10, 11,
|
||||
(short) 12, 13, (short) 14, (short) 15,
|
||||
16, 17, (short) 18);
|
||||
RaceVisionByteEncoder raceVisionByteEncoder = new RaceVisionByteEncoder();
|
||||
byte[] testEncodedMessage = raceVisionByteEncoder.boatLocation(testMessage);
|
||||
|
||||
BoatLocationDecoder testDecoder = new BoatLocationDecoder(testEncodedMessage);
|
||||
BoatLocationMessage decodedTest = testDecoder.getMessage();
|
||||
|
||||
Assert.assertEquals(testMessage.getMessageVersionNumber(), decodedTest.getMessageVersionNumber());
|
||||
Assert.assertEquals(testMessage.getTime(), decodedTest.getTime());
|
||||
Assert.assertEquals(testMessage.getSequenceNumber(), decodedTest.getSequenceNumber());
|
||||
Assert.assertEquals(testMessage.getDeviceType(), decodedTest.getDeviceType());
|
||||
Assert.assertEquals(testMessage.getLatitude(), decodedTest.getLatitude());
|
||||
Assert.assertEquals(testMessage.getLongitude(), decodedTest.getLongitude());
|
||||
Assert.assertEquals(testMessage.getAltitude(), decodedTest.getAltitude());
|
||||
Assert.assertEquals(testMessage.getHeading(), decodedTest.getHeading());
|
||||
Assert.assertEquals(testMessage.getPitch(), decodedTest.getPitch());
|
||||
Assert.assertEquals(testMessage.getRoll(), decodedTest.getRoll());
|
||||
Assert.assertEquals(testMessage.getBoatSpeed(), decodedTest.getBoatSpeed());
|
||||
|
||||
Assert.assertEquals(testMessage.getBoatCOG(), decodedTest.getBoatCOG());
|
||||
Assert.assertEquals(testMessage.getBoatSOG(), decodedTest.getBoatSOG());
|
||||
Assert.assertEquals(testMessage.getApparentWindSpeed(), decodedTest.getApparentWindSpeed());
|
||||
Assert.assertEquals(testMessage.getTrueWindSpeed(), decodedTest.getTrueWindSpeed());
|
||||
Assert.assertEquals(testMessage.getTrueWindDirection(), decodedTest.getTrueWindDirection());
|
||||
Assert.assertEquals(testMessage.getTrueWindAngle(), decodedTest.getTrueWindAngle());
|
||||
Assert.assertEquals(testMessage.getCurrentDrift(), decodedTest.getCurrentDrift());
|
||||
Assert.assertEquals(testMessage.getCurrentSet(), decodedTest.getCurrentSet());
|
||||
Assert.assertEquals(testMessage.getRudderAngle(), decodedTest.getRudderAngle());
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import seng302.Networking.MessageEncoders.RaceVisionByteEncoder;
|
||||
import seng302.Networking.Utils.CourseWind;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
||||
/**
|
||||
* Created by hba56 on 23/04/17.
|
||||
*/
|
||||
public class CourseWindDecoderTest {
|
||||
@Test
|
||||
public void getByteArrayTest() {
|
||||
long time = System.currentTimeMillis();
|
||||
CourseWind testCourseWind1 = new CourseWind(1, time, 2,
|
||||
3, 4, 5,
|
||||
7, 6);
|
||||
|
||||
long time2 = System.currentTimeMillis();
|
||||
CourseWind testCourseWind2 = new CourseWind(2, time2, 2,
|
||||
3, 4, 5,
|
||||
7, 6);
|
||||
|
||||
ArrayList<CourseWind> testCourseWinds = new ArrayList<CourseWind>();
|
||||
testCourseWinds.add(testCourseWind1);
|
||||
testCourseWinds.add(testCourseWind2);
|
||||
|
||||
|
||||
RaceVisionByteEncoder raceVisionByteEncoder = new RaceVisionByteEncoder();
|
||||
|
||||
byte[] testEncodedCourseWind = raceVisionByteEncoder.courseWind((byte) 1, testCourseWinds);
|
||||
|
||||
CourseWindDecoder testDecoder = new CourseWindDecoder(testEncodedCourseWind);
|
||||
|
||||
ArrayList<CourseWind> testDecodedCourseWinds = testDecoder.getLoopMessages();
|
||||
|
||||
Assert.assertEquals(testCourseWinds.get(0).getID(), testDecodedCourseWinds.get(0).getID());
|
||||
Assert.assertEquals(testCourseWinds.get(0).getTime(), testDecodedCourseWinds.get(0).getTime());
|
||||
Assert.assertEquals(testCourseWinds.get(0).getRaceID(), testDecodedCourseWinds.get(0).getRaceID());
|
||||
Assert.assertEquals(testCourseWinds.get(0).getWindDirection(), testDecodedCourseWinds.get(0).getWindDirection());
|
||||
Assert.assertEquals(testCourseWinds.get(0).getWindSpeed(), testDecodedCourseWinds.get(0).getWindSpeed());
|
||||
Assert.assertEquals(testCourseWinds.get(0).getBestUpwindAngle(), testDecodedCourseWinds.get(0).getBestUpwindAngle());
|
||||
Assert.assertEquals(testCourseWinds.get(0).getBestDownwindAngle(), testDecodedCourseWinds.get(0).getBestDownwindAngle());
|
||||
Assert.assertEquals(testCourseWinds.get(0).getFlags(), testDecodedCourseWinds.get(0).getFlags());
|
||||
|
||||
Assert.assertEquals(testCourseWinds.get(1).getID(), testDecodedCourseWinds.get(1).getID());
|
||||
Assert.assertEquals(testCourseWinds.get(1).getTime(), testDecodedCourseWinds.get(1).getTime());
|
||||
Assert.assertEquals(testCourseWinds.get(1).getRaceID(), testDecodedCourseWinds.get(1).getRaceID());
|
||||
Assert.assertEquals(testCourseWinds.get(1).getWindDirection(), testDecodedCourseWinds.get(1).getWindDirection());
|
||||
Assert.assertEquals(testCourseWinds.get(1).getWindSpeed(), testDecodedCourseWinds.get(1).getWindSpeed());
|
||||
Assert.assertEquals(testCourseWinds.get(1).getBestUpwindAngle(), testDecodedCourseWinds.get(1).getBestUpwindAngle());
|
||||
Assert.assertEquals(testCourseWinds.get(1).getBestDownwindAngle(), testDecodedCourseWinds.get(1).getBestDownwindAngle());
|
||||
Assert.assertEquals(testCourseWinds.get(1).getFlags(), testDecodedCourseWinds.get(1).getFlags());
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import seng302.Networking.MessageEncoders.RaceVisionByteEncoder;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 23/04/17.
|
||||
*/
|
||||
public class RaceStartStatusDecoderTest {
|
||||
@Test
|
||||
public void getByteArrayTest() {
|
||||
long time = System.currentTimeMillis();
|
||||
|
||||
RaceVisionByteEncoder raceVisionByteEncoder = new RaceVisionByteEncoder();
|
||||
long time2 = System.currentTimeMillis();
|
||||
byte[] encodedRaceStartStatus = raceVisionByteEncoder.raceStartStatus(time, (short) 1,
|
||||
time2, 2, (char) 3);
|
||||
|
||||
RaceStartStatusDecoder testDecoder = new RaceStartStatusDecoder(encodedRaceStartStatus);
|
||||
|
||||
Assert.assertEquals(0b1, testDecoder.getMessageVersion());
|
||||
Assert.assertEquals(time, testDecoder.getTime());
|
||||
Assert.assertEquals(1, testDecoder.getAck());
|
||||
Assert.assertEquals(time2, testDecoder.getStartTime());
|
||||
Assert.assertEquals(2, testDecoder.getRaceID());
|
||||
Assert.assertEquals((char) 3, testDecoder.getNotification());
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import javafx.scene.paint.Color;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import seng302.Model.BoatInRace;
|
||||
import seng302.Model.Leg;
|
||||
import seng302.Networking.MessageEncoders.RaceVisionByteEncoder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 23/04/17.
|
||||
*/
|
||||
public class RaceStatusDecoderTest {
|
||||
@Test
|
||||
public void getByteArrayTest() {
|
||||
long time = System.currentTimeMillis();
|
||||
BoatInRace boat1 = new BoatInRace("Test", 1, Color.ALICEBLUE, "tt", 1);
|
||||
Leg testLeg = new Leg("test leg", 1);
|
||||
boat1.setCurrentLeg(testLeg);
|
||||
BoatInRace boat2 = new BoatInRace("Test2", 1, Color.ALICEBLUE, "tt", 1);
|
||||
boat2.setCurrentLeg(testLeg);
|
||||
ArrayList boats = new ArrayList();
|
||||
boats.add(boat1);
|
||||
boats.add(boat2);
|
||||
long time2 = System.currentTimeMillis();
|
||||
|
||||
RaceVisionByteEncoder raceVisionByteEncoder = new RaceVisionByteEncoder();
|
||||
|
||||
byte[] encodedRaceStatus = raceVisionByteEncoder.raceStatus(time, 1, 2, time2,
|
||||
(short) 2, (short) 3, 4, boats);
|
||||
|
||||
RaceStatusDecoder decoderTest = new RaceStatusDecoder(encodedRaceStatus);
|
||||
|
||||
Assert.assertEquals(0b10, decoderTest.getVersionNum());
|
||||
Assert.assertEquals(time, decoderTest.getTime());
|
||||
Assert.assertEquals(1, decoderTest.getRace());
|
||||
Assert.assertEquals(2, decoderTest.getRaceState());
|
||||
Assert.assertEquals(time2, decoderTest.getStartTime());
|
||||
Assert.assertEquals((short) 2, decoderTest.getRaceWindDir());
|
||||
Assert.assertEquals((short) 3, decoderTest.getRaceWindSpeed());
|
||||
|
||||
Assert.assertEquals(0, decoderTest.getBoats().get(0).getBoatStatus());
|
||||
Assert.assertEquals(0, decoderTest.getBoats().get(0).getLegNumber());
|
||||
Assert.assertEquals(0, decoderTest.getBoats().get(0).getNumPenaltiesAwarded());
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
package seng302.Networking.MessageDecoders;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import seng302.Networking.MessageEncoders.XMLMessageEncoder;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 20/04/17.
|
||||
*/
|
||||
public class XMLMessageDecoderTest {
|
||||
@Test
|
||||
public void getByteArrayTest() {
|
||||
try {
|
||||
StringBuilder xmlString;
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(
|
||||
this.getClass().getResourceAsStream(("../../../raceXML/Regatta.xml"))));
|
||||
String line;
|
||||
xmlString = new StringBuilder();
|
||||
while ((line = br.readLine()) != null) {
|
||||
xmlString.append(line.trim());
|
||||
}
|
||||
long time = System.currentTimeMillis();
|
||||
XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte) 1, (short) 1, time, (byte) 7, (short) 1, (short) xmlString.length(), xmlString.toString());
|
||||
|
||||
byte[] encodedXML = testEncoder.encode();
|
||||
|
||||
XMLMessageDecoder decoderXML = new XMLMessageDecoder(encodedXML);
|
||||
decoderXML.decode();
|
||||
|
||||
|
||||
Assert.assertEquals((byte) 1, decoderXML.getMessageVersionNumber());
|
||||
Assert.assertEquals((short) 1, decoderXML.getAckNumber());
|
||||
Assert.assertEquals(time, decoderXML.getTimeStamp());
|
||||
Assert.assertEquals((byte) 7, decoderXML.getXmlMsgSubType());
|
||||
Assert.assertEquals((short) 1, decoderXML.getSequenceNumber());
|
||||
Assert.assertEquals((short) xmlString.length(), decoderXML.getXmlMsgLength());
|
||||
Assert.assertEquals(xmlString.toString(), decoderXML.getXmlMessage());
|
||||
|
||||
} catch (IOException e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
package seng302.Networking;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import seng302.Networking.MessageEncoders.XMLMessageEncoder;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
/**
|
||||
* Created by hba56 on 19/04/17.
|
||||
*/
|
||||
public class XMLMessageEncoderTest {
|
||||
@Test
|
||||
public void getByteArrayTest() {
|
||||
StringBuilder xmlString;
|
||||
try {
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(
|
||||
this.getClass().getResourceAsStream(("../../raceXML/Regatta.xml"))));
|
||||
String line;
|
||||
xmlString = new StringBuilder();
|
||||
while ((line = br.readLine()) != null) {
|
||||
xmlString.append(line.trim());
|
||||
}
|
||||
XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte) 1, (short) 1, System.currentTimeMillis(), (byte) 7, (short) 1, (short) xmlString.length(), xmlString.toString());
|
||||
|
||||
byte[] encodedXML = testEncoder.encode();
|
||||
|
||||
//1 + 2 + 6 + 1 + 2 + 2 + 374
|
||||
Assert.assertEquals(388, encodedXML.length);
|
||||
} catch (IOException e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getByteArrayNullTest() {
|
||||
StringBuilder xmlString;
|
||||
try {
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(
|
||||
this.getClass().getResourceAsStream(("../../raceXML/Regatta.xml"))));
|
||||
String line;
|
||||
xmlString = new StringBuilder();
|
||||
while ((line = br.readLine()) != null) {
|
||||
xmlString.append(line.trim());
|
||||
}
|
||||
XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte) 1, (short) 1, System.currentTimeMillis(), (byte) 7, (short) 1, (short) 1, xmlString.toString());
|
||||
|
||||
byte[] encodedXML = testEncoder.encode();
|
||||
|
||||
Assert.assertEquals(null, encodedXML);
|
||||
} catch (IOException e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user