Various bug fixes

- Made canvas fill entire screen
- Made window scale to screens that aren't 1920x1080
- Changed boat speeds in mock so they aren't too fast
- Added command line options to switch server

Tags: #story[829]
This commit is contained in:
Michael Rausch
2017-05-03 21:56:51 +12:00
parent f0d6312fa5
commit d992422efd
11 changed files with 78 additions and 36 deletions
+19 -6
View File
@@ -16,27 +16,40 @@ public class App extends Application
Parent root = FXMLLoader.load(getClass().getResource("/views/MainView.fxml")); Parent root = FXMLLoader.load(getClass().getResource("/views/MainView.fxml"));
primaryStage.setTitle("RaceVision"); primaryStage.setTitle("RaceVision");
primaryStage.setScene(new Scene(root)); primaryStage.setScene(new Scene(root));
primaryStage.setMaximized(true);
primaryStage.show(); primaryStage.show();
} }
public static void main(String[] args) { public static void main(String[] args) {
StreamReceiver sr; StreamReceiver sr = null;
new ServerThread("Racevision Test Server"); new ServerThread("Racevision Test Server");
try { try {
Thread.sleep(2000); Thread.sleep(2000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
if (args.length > 1){ if (args.length == 3 && args[0].equals("-server")){
sr = new StreamReceiver("localhost", 8085, "RaceStream"); sr = new StreamReceiver(args[1], Integer.valueOf(args[2]), "RaceStream");
}
else if(args.length == 2 && args[0].equals("-server")){
switch (args[1]) {
case "internal":
sr = new StreamReceiver("localhost", 8085, "RaceStream");
break;
case "staffserver":
sr = new StreamReceiver("csse-s302staff.canterbury.ac.nz", 4941, "RaceStream");
break;
case "official":
sr = new StreamReceiver("livedata.americascup.com", 4941, "RaceStream");
break;
}
} }
else{ else{
// sr = new StreamReceiver("csse-s302staff.canterbury.ac.nz", 4941,"RaceStream"); sr = new StreamReceiver("localhost", 8085, "RaceStream");
sr = new StreamReceiver("livedata.americascup.com", 4941, "RaceStream");
// sr = new StreamReceiver("localhost", 8085, "RaceStream");
} }
sr.start(); sr.start();
@@ -132,7 +132,7 @@ public class CanvasController {
} }
}; };
for (Mark m : raceViewController.getRace().getCourse()) { for (Mark m : raceViewController.getRace().getCourse()) {
System.out.println(m.getName()); //System.out.println(m.getName());
} }
//timer.start(); //timer.start();
} }
-2
View File
@@ -21,8 +21,6 @@ public class Event {
private final double ORIGIN_LON = -64.857063; private final double ORIGIN_LON = -64.857063;
private final double SCALE = 16000; private final double SCALE = 16000;
/** /**
* Event class containing the time of specific event, related team/boat, and * Event class containing the time of specific event, related team/boat, and
* event location such as leg. * event location such as leg.
@@ -57,7 +57,7 @@ public class StreamParser extends Thread{
*/ */
public void run(){ public void run(){
try { try {
System.out.println("START OF STREAM"); System.out.println("[CLIENT] Start of stream");
streamStatus = true; streamStatus = true;
xmlObject = new XMLParser(); xmlObject = new XMLParser();
while (StreamReceiver.packetBuffer == null || StreamReceiver.packetBuffer.size() < 1) { while (StreamReceiver.packetBuffer == null || StreamReceiver.packetBuffer.size() < 1) {
@@ -94,7 +94,7 @@ public class StreamParser extends Thread{
* *
*/ */
public void start () { public void start () {
System.out.println("Starting " + threadName ); System.out.println("[CLIENT] Starting " + threadName );
if (t == null) { if (t == null) {
t = new Thread (this, threadName); t = new Thread (this, threadName);
t.start (); t.start ();
@@ -181,18 +181,18 @@ public class StreamParser extends Thread{
currentTimeString = format.format((new Date (currentTime)).getTime()); currentTimeString = format.format((new Date (currentTime)).getTime());
if (timeTillStart > 0) { if (timeTillStart > 0) {
timeSinceStart = timeTillStart; timeSinceStart = timeTillStart;
System.out.println("Time till start: " + timeTillStart + " Seconds"); //System.out.println("Time till start: " + timeTillStart + " Seconds");
} else { } else {
if (raceStatus == 4 || raceStatus == 8){ if (raceStatus == 4 || raceStatus == 8){
raceFinished = true; raceFinished = true;
raceStarted = false; raceStarted = false;
System.out.println("RACE HAS FINISHED"); System.out.println("[CLIENT] Race has finished");
} else if (!raceStarted){ } else if (!raceStarted){
raceStarted = true; raceStarted = true;
raceFinished = false; raceFinished = false;
System.out.println("RACE HAS STARTED"); System.out.println("[CLIENT] Race has started");
} }
System.out.println("Time since start: " + -1 * timeTillStart + " Seconds"); //System.out.println("Time since start: " + -1 * timeTillStart + " Seconds");
timeSinceStart = timeTillStart; timeSinceStart = timeTillStart;
} }
long windDir = bytesToLong(Arrays.copyOfRange(payload,18,20)); long windDir = bytesToLong(Arrays.copyOfRange(payload,18,20));
@@ -24,6 +24,7 @@ public class StreamReceiver extends Thread {
public StreamReceiver(String hostAddress, int hostPort, String threadName) { public StreamReceiver(String hostAddress, int hostPort, String threadName) {
this.threadName = threadName; this.threadName = threadName;
this.setDaemon(true);
try { try {
host = new Socket(hostAddress, hostPort); host = new Socket(hostAddress, hostPort);
} catch (IOException e) { } catch (IOException e) {
@@ -44,7 +45,7 @@ public class StreamReceiver extends Thread {
} }
public void start () { public void start () {
System.out.println("Starting " + threadName ); System.out.println("[CLIENT] Starting " + threadName );
if (t == null) { if (t == null) {
t = new Thread (this, threadName); t = new Thread (this, threadName);
t.start (); t.start ();
@@ -95,7 +96,6 @@ public class StreamReceiver extends Thread {
} catch (Exception e) { } catch (Exception e) {
moreBytes = false; moreBytes = false;
} }
} }
} }
+30 -3
View File
@@ -20,9 +20,10 @@ public class ServerThread implements Runnable, Observer {
Map<Integer,Boolean> boatsFinished = new HashMap<>(); Map<Integer,Boolean> boatsFinished = new HashMap<>();
private List<Boat> boats; private List<Boat> boats;
private Simulator raceSimulator; private Simulator raceSimulator;
private boolean sendingRaceFinishedLocationMessages = true;
private final int HEARTBEAT_PERIOD = 5000; private final int HEARTBEAT_PERIOD = 5000;
private final int RACE_STATUS_PERIOD = 1000; private final int RACE_STATUS_PERIOD = 1000/2;
private final int RACE_START_STATUS_PERIOD = 1000; private final int RACE_START_STATUS_PERIOD = 1000;
private final int BOAT_LOCATION_PERIOD = 1000/5; private final int BOAT_LOCATION_PERIOD = 1000/5;
private final int PORT_NUMBER = 8085; private final int PORT_NUMBER = 8085;
@@ -31,6 +32,8 @@ public class ServerThread implements Runnable, Observer {
public ServerThread(String threadName){ public ServerThread(String threadName){
runner = new Thread(this, threadName); runner = new Thread(this, threadName);
runner.setDaemon(true);
serverLog("Spawning Server", 0); serverLog("Spawning Server", 0);
raceSimulator = new Simulator(BOAT_LOCATION_PERIOD); raceSimulator = new Simulator(BOAT_LOCATION_PERIOD);
@@ -128,7 +131,7 @@ public class ServerThread implements Runnable, Observer {
raceStatus = RaceStatus.TERMINATED; raceStatus = RaceStatus.TERMINATED;
} }
return new RaceStatusMessage(1, raceStatus, startTime, WindDirection.EAST, return new RaceStatusMessage(1, raceStatus, startTime, WindDirection.SOUTH,
100, boats.size(), RaceType.MATCH_RACE, 1, boatSubMessages); 100, boats.size(), RaceType.MATCH_RACE, 1, boatSubMessages);
} }
@@ -256,6 +259,30 @@ public class ServerThread implements Runnable, Observer {
startSendingRaceStatusMessages(); startSendingRaceStatusMessages();
} }
/**
* Start sending static boat position updates when race has finished
*/
private void startSendingRaceFinishedBoatPostions(){
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
try {
for (Boat b : raceSimulator.getBoats()){
Message m = new BoatLocationMessage(b.getSourceID(), server.getSequenceNumber(), b.getLat(),
b.getLng(), b.getLastPassedCorner().getBearingToNextCorner(),
((long) 0));
server.send(m);
}
} catch (IOException e) {
System.out.print("");
}
}
}, 0, BOAT_LOCATION_PERIOD);
}
/** /**
* Send a boat location message when they are updated by the simulator * Send a boat location message when they are updated by the simulator
* @param o . * @param o .
@@ -271,7 +298,7 @@ public class ServerThread implements Runnable, Observer {
for (Boat b : (List<Boat>) arg){ for (Boat b : (List<Boat>) arg){
try { try {
Message m = new BoatLocationMessage(b.getSourceID(), 1, b.getLat(), Message m = new BoatLocationMessage(b.getSourceID(), server.getSequenceNumber(), b.getLat(),
b.getLng(), b.getLastPassedCorner().getBearingToNextCorner(), b.getLng(), b.getLastPassedCorner().getBearingToNextCorner(),
((long) b.getSpeed())); ((long) b.getSpeed()));
server.send(m); server.send(m);
@@ -42,6 +42,7 @@ public class BoatLocationMessage extends Message {
* @param boatSpeed The boats speed * @param boatSpeed The boats speed
*/ */
public BoatLocationMessage(int sourceId, int sequenceNum, double latitude, double longitude, double heading, long boatSpeed){ public BoatLocationMessage(int sourceId, int sequenceNum, double latitude, double longitude, double heading, long boatSpeed){
boatSpeed /= 10;
messageVersionNumber = 1; messageVersionNumber = 1;
time = System.currentTimeMillis() / 1000L; time = System.currentTimeMillis() / 1000L;
this.sourceId = sourceId; this.sourceId = sourceId;
@@ -54,8 +55,8 @@ public class BoatLocationMessage extends Message {
this.pitch = 0; this.pitch = 0;
this.roll = 0; this.roll = 0;
this.boatSpeed = boatSpeed; this.boatSpeed = boatSpeed;
this.COG = 0; this.COG = 2;
this.SOG = 0; this.SOG = boatSpeed ;
this.apparentWindSpeed = 0; this.apparentWindSpeed = 0;
this.apparentWindAngle = 0; this.apparentWindAngle = 0;
this.trueWindSpeed = 0; this.trueWindSpeed = 0;
@@ -146,7 +147,7 @@ public class BoatLocationMessage extends Message {
putInt(headingToSend, 2); putInt(headingToSend, 2);
putInt((int) pitch, 2); putInt((int) pitch, 2);
putInt((int) roll, 2); putInt((int) roll, 2);
putUnsignedInt((int) boatSpeed, 2); putInt((int) boatSpeed, 2);
putUnsignedInt((int) COG, 2); putUnsignedInt((int) COG, 2);
putUnsignedInt((int) SOG, 2); putUnsignedInt((int) SOG, 2);
putUnsignedInt((int) apparentWindSpeed, 2); putUnsignedInt((int) apparentWindSpeed, 2);
@@ -185,7 +185,6 @@ public abstract class Message {
* @return * @return
*/ */
public static byte[] intToByteArray(long val, int len){ public static byte[] intToByteArray(long val, int len){
long vor = val;
int index = 0; int index = 0;
byte[] data = new byte[len]; byte[] data = new byte[len];
@@ -210,4 +209,8 @@ public abstract class Message {
} }
} }
public int wat(){
return bufferPosition;
}
} }
@@ -37,7 +37,7 @@ public class Simulator extends Observable implements Runnable {
boat.setLng(startLng); boat.setLng(startLng);
boat.setLastPassedCorner(course.get(0)); boat.setLastPassedCorner(course.get(0));
boat.setHeadingCorner(course.get(1)); boat.setHeadingCorner(course.get(1));
boat.setSpeed(ThreadLocalRandom.current().nextInt(400000, 600000 + 1)); boat.setSpeed(ThreadLocalRandom.current().nextInt(40000, 60000 + 1));
} }
} }
+10 -10
View File
@@ -7,21 +7,21 @@
<?import java.lang.*?> <?import java.lang.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<AnchorPane fx:id="contentPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="1080.0" prefWidth="1920.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.controllers.Controller"> <AnchorPane fx:id="contentPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="seng302.controllers.Controller">
<children> <children>
<GridPane nodeOrientation="LEFT_TO_RIGHT" prefHeight="1080.0" prefWidth="1920.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> <GridPane nodeOrientation="LEFT_TO_RIGHT" prefWidth="800.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints> </columnConstraints>
<rowConstraints> <rowConstraints>
<RowConstraints maxHeight="170.0" minHeight="170.0" prefHeight="170.0" vgrow="SOMETIMES" /> <RowConstraints percentHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="52.0" minHeight="52.0" prefHeight="52.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="52.0" minHeight="52.0" prefHeight="52.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="102.0" minHeight="102.0" prefHeight="102.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="0.0" percentHeight="8.0" prefHeight="0.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="28.0" minHeight="20.0" prefHeight="28.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="28.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="55.0" minHeight="55.0" prefHeight="55.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="55.0" minHeight="55.0" percentHeight="5.0" prefHeight="55.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="318.0" minHeight="318.0" prefHeight="318.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="0.0" minHeight="0.0" percentHeight="23.0" prefHeight="0.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="93.0" minHeight="93.0" prefHeight="93.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="93.0" minHeight="72.0" prefHeight="72.0" vgrow="SOMETIMES" />
<RowConstraints maxHeight="262.0" minHeight="262.0" prefHeight="262.0" vgrow="SOMETIMES" /> <RowConstraints maxHeight="283.0" minHeight="262.0" prefHeight="283.0" vgrow="SOMETIMES" />
</rowConstraints> </rowConstraints>
<children> <children>
<Label alignment="CENTER" text="Welcome to Race Vision" GridPane.halignment="CENTER" GridPane.valignment="BOTTOM"> <Label alignment="CENTER" text="Welcome to Race Vision" GridPane.halignment="CENTER" GridPane.valignment="BOTTOM">
@@ -46,7 +46,7 @@
</Label> </Label>
<Button fx:id="streamButton" mnemonicParsing="false" onAction="#startStream" text="Click to stream" GridPane.halignment="CENTER" GridPane.rowIndex="4" /> <Button fx:id="streamButton" mnemonicParsing="false" onAction="#startStream" text="Click to stream" GridPane.halignment="CENTER" GridPane.rowIndex="4" />
<Button fx:id="switchToRaceViewButton" disable="true" mnemonicParsing="false" onAction="#switchToRaceView" text="Watch Race" GridPane.halignment="CENTER" GridPane.rowIndex="7" GridPane.valignment="TOP" /> <Button fx:id="switchToRaceViewButton" disable="true" mnemonicParsing="false" onAction="#switchToRaceView" text="Watch Race" GridPane.halignment="CENTER" GridPane.rowIndex="7" GridPane.valignment="TOP" />
<TableView fx:id="teamList" maxWidth="500.0" prefHeight="200.0" prefWidth="200.0" GridPane.halignment="CENTER" GridPane.rowIndex="5"> <TableView fx:id="teamList" maxWidth="510.0" prefHeight="200.0" prefWidth="210.0" GridPane.halignment="CENTER" GridPane.rowIndex="5">
<columns> <columns>
<TableColumn fx:id="boatNameCol" editable="false" prefWidth="250.0" sortable="false" text="Boat Name" /> <TableColumn fx:id="boatNameCol" editable="false" prefWidth="250.0" sortable="false" text="Boat Name" />
<TableColumn fx:id="shortNameCol" editable="false" prefWidth="125.0" sortable="false" text="Short Name" /> <TableColumn fx:id="shortNameCol" editable="false" prefWidth="125.0" sortable="false" text="Short Name" />
+1 -1
View File
@@ -60,7 +60,7 @@
<Label layoutX="10.0" layoutY="499.0" text="Annotations" /> <Label layoutX="10.0" layoutY="499.0" text="Annotations" />
</children> </children>
</AnchorPane> </AnchorPane>
<AnchorPane fx:id="contentAnchorPane" prefHeight="960.0" prefWidth="1280.0" GridPane.columnIndex="1" GridPane.halignment="LEFT" GridPane.rowSpan="2147483647" GridPane.valignment="TOP"> <AnchorPane fx:id="contentAnchorPane" prefHeight="960.0" prefWidth="1280.0" style="-fx-background-color: skyblue;" GridPane.columnIndex="1" GridPane.halignment="LEFT" GridPane.rowSpan="2147483647" GridPane.valignment="TOP">
<children> <children>
<fx:include fx:id="includedCanvas" source="CanvasView.fxml" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" /> <fx:include fx:id="includedCanvas" source="CanvasView.fxml" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children></AnchorPane> </children></AnchorPane>