diff --git a/mock/src/main/java/seng302/Data/BoatData.java b/mock/src/main/java/seng302/Data/BoatData.java index a9d0512a..e06a0663 100644 --- a/mock/src/main/java/seng302/Data/BoatData.java +++ b/mock/src/main/java/seng302/Data/BoatData.java @@ -10,6 +10,7 @@ import seng302.Model.Boat; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; @@ -56,6 +57,8 @@ public class BoatData { // write the content into xml file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); DOMSource source = new DOMSource(doc); //Serialize document. @@ -63,6 +66,8 @@ public class BoatData { StreamResult result = new StreamResult(stringWriter); transformer.transform(source, result); + + System.out.println(stringWriter.toString()); return stringWriter.toString(); diff --git a/mock/src/main/java/seng302/Data/RaceData.java b/mock/src/main/java/seng302/Data/RaceData.java index 58409c05..dfb99f49 100644 --- a/mock/src/main/java/seng302/Data/RaceData.java +++ b/mock/src/main/java/seng302/Data/RaceData.java @@ -11,6 +11,7 @@ import seng302.Model.Marker; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; @@ -20,7 +21,6 @@ import java.io.StringWriter; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; - /** * Created by esa46 on 21/04/17. */ @@ -59,6 +59,8 @@ public class RaceData { // write the content into xml file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); DOMSource source = new DOMSource(doc); //Serialize document. diff --git a/mock/src/main/java/seng302/Data/RegattaData.java b/mock/src/main/java/seng302/Data/RegattaData.java index 2c7fac56..a559bf00 100644 --- a/mock/src/main/java/seng302/Data/RegattaData.java +++ b/mock/src/main/java/seng302/Data/RegattaData.java @@ -8,6 +8,7 @@ import seng302.Exceptions.InvalidRegattaDataException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; @@ -51,6 +52,8 @@ public class RegattaData { // write the content into xml file TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); DOMSource source = new DOMSource(doc); //Serialize document. diff --git a/mock/src/main/java/seng302/Model/Race.java b/mock/src/main/java/seng302/Model/Race.java index 9b59c592..a23c4cfd 100644 --- a/mock/src/main/java/seng302/Model/Race.java +++ b/mock/src/main/java/seng302/Model/Race.java @@ -131,6 +131,7 @@ public class Race implements Runnable { boatOffset = (boatOffset + 1) % (startingBoats.size()); if (timeLeft <= 60000/scaleFactor && timeLeft > 0) { + System.out.println("Race status 2"); RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 2, 2, boatStatusMessages); mockOutput.parseRaceStatus(raceStatus); } @@ -142,6 +143,7 @@ public class Race implements Runnable { stop(); } else { + System.out.println("Race status 1"); RaceStatus raceStatus = new RaceStatus(System.currentTimeMillis(), raceId, 1, 2, boatStatusMessages); mockOutput.parseRaceStatus(raceStatus); } diff --git a/network/src/main/java/seng302/Networking/MessageDecoders/BoatLocationDecoder.java b/network/src/main/java/seng302/Networking/MessageDecoders/BoatLocationDecoder.java index 91c8088c..e2352640 100644 --- a/network/src/main/java/seng302/Networking/MessageDecoders/BoatLocationDecoder.java +++ b/network/src/main/java/seng302/Networking/MessageDecoders/BoatLocationDecoder.java @@ -61,6 +61,9 @@ public class BoatLocationDecoder { currentSet = Arrays.copyOfRange(encodedBoatLocation,52, 54); rudderAngle = Arrays.copyOfRange(encodedBoatLocation,54, 56); +// System.out.println(bytesToInt(sourceID)); +// System.out.println(bytesToInt(boatSpeed)); + message = new BoatLocationMessage(messageVersionNumber, bytesToLong(time), bytesToInt(sourceID), bytesToInt(seqNum), deviceType, bytesToInt(latitude), diff --git a/network/src/main/java/seng302/Networking/Utils/BoatLocationMessage.java b/network/src/main/java/seng302/Networking/Utils/BoatLocationMessage.java index 4f236747..2a60a528 100644 --- a/network/src/main/java/seng302/Networking/Utils/BoatLocationMessage.java +++ b/network/src/main/java/seng302/Networking/Utils/BoatLocationMessage.java @@ -166,7 +166,7 @@ public class BoatLocationMessage extends AC35Data this.roll = 0; this.boatSpeed = convertBoatSpeedDoubleToInt(boatSpeed); this.boatCOG = 0; - this.boatSOG = 0; + this.boatSOG = convertBoatSpeedDoubleToInt(boatSpeed); this.apparentWindSpeed = 0; this.apparentWindAngle = 0; this.trueWindSpeed = 0; @@ -190,8 +190,6 @@ public class BoatLocationMessage extends AC35Data int coordinateInt = (int) ((coordinate / 180.0) * 2147483648.0); return coordinateInt; - - } /** diff --git a/visualiser/src/main/java/seng302/Controllers/ConnectionController.java b/visualiser/src/main/java/seng302/Controllers/ConnectionController.java index afb417d9..4e4eb2d0 100644 --- a/visualiser/src/main/java/seng302/Controllers/ConnectionController.java +++ b/visualiser/src/main/java/seng302/Controllers/ConnectionController.java @@ -6,6 +6,7 @@ import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; +import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; import seng302.RaceConnection; @@ -31,16 +32,21 @@ public class ConnectionController extends Controller { @FXML private Button connectButton; - private List connections; + @FXML + private TextField urlField; + @FXML + private TextField portField; + + private ObservableList connections; @Override public void initialize(URL location, ResourceBundle resources) { // TODO - replace with config file - connections = new ArrayList<>(); + connections = FXCollections.observableArrayList(); connections.add(new RaceConnection("livedata.americascup.com", 4941)); connections.add(new RaceConnection("localhost", 4942)); - connectionTable.setItems(FXCollections.observableArrayList(connections)); + connectionTable.setItems(connections); hostnameColumn.setCellValueFactory(cellData -> cellData.getValue().hostnameProperty()); statusColumn.setCellValueFactory(cellData -> cellData.getValue().statusProperty()); @@ -60,6 +66,10 @@ public class ConnectionController extends Controller { } } + public AnchorPane startWrapper(){ + return connectionWrapper; + } + /** * Connects to host currently selected in table. Button enabled only if host is ready. */ @@ -71,4 +81,19 @@ public class ConnectionController extends Controller { parent.enterLobby(socket); } catch (IOException e) { /* Never reached */ } } + + /** + * adds a new connection + */ + public void addConnection(){ + String hostName = urlField.getText(); + String portString = portField.getText(); + try{ + int port = Integer.parseInt(portString); + connections.add(new RaceConnection(hostName, port)); + }catch(NumberFormatException e){ + System.err.println("Port number entered is not a number"); + } + + } } diff --git a/visualiser/src/main/java/seng302/Controllers/MainController.java b/visualiser/src/main/java/seng302/Controllers/MainController.java index 736fc5c2..22c9c2ed 100644 --- a/visualiser/src/main/java/seng302/Controllers/MainController.java +++ b/visualiser/src/main/java/seng302/Controllers/MainController.java @@ -43,5 +43,10 @@ public class MainController extends Controller { AnchorPane.setBottomAnchor(startController.startWrapper(), 0.0); AnchorPane.setLeftAnchor(startController.startWrapper(), 0.0); AnchorPane.setRightAnchor(startController.startWrapper(), 0.0); + + AnchorPane.setTopAnchor(connectionController.startWrapper(), 0.0); + AnchorPane.setBottomAnchor(connectionController.startWrapper(), 0.0); + AnchorPane.setLeftAnchor(connectionController.startWrapper(), 0.0); + AnchorPane.setRightAnchor(connectionController.startWrapper(), 0.0); } } diff --git a/visualiser/src/main/java/seng302/Controllers/RaceController.java b/visualiser/src/main/java/seng302/Controllers/RaceController.java index b893b3ad..e1195dab 100644 --- a/visualiser/src/main/java/seng302/Controllers/RaceController.java +++ b/visualiser/src/main/java/seng302/Controllers/RaceController.java @@ -6,8 +6,10 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import javafx.fxml.FXML; +import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.layout.GridPane; +import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import seng302.Mock.StreamedRace; import seng302.Model.*; @@ -129,7 +131,7 @@ public class RaceController extends Controller { raceMap.drawRaceMap(); raceMap.setVisible(true); - canvasBase.getChildren().add(raceMap); + canvasBase.getChildren().add(0, raceMap); race.setVisible(true); //Initialize save annotation array, fps listener, and annotation listeners diff --git a/visualiser/src/main/java/seng302/Controllers/StartController.java b/visualiser/src/main/java/seng302/Controllers/StartController.java index 8daf5afa..5903792b 100644 --- a/visualiser/src/main/java/seng302/Controllers/StartController.java +++ b/visualiser/src/main/java/seng302/Controllers/StartController.java @@ -22,10 +22,8 @@ import java.net.Socket; import java.net.URL; import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.util.List; -import java.util.Observable; -import java.util.Observer; -import java.util.ResourceBundle; +import java.time.format.DateTimeFormatter; +import java.util.*; /** * Created by esa46 on 6/04/17. @@ -35,6 +33,7 @@ public class StartController extends Controller implements Observer { @FXML private GridPane start; @FXML private AnchorPane startWrapper; @FXML private Label raceTitleLabel; + @FXML private Label raceStartLabel; @FXML private TableView boatNameTable; @FXML private TableColumn boatNameColumn; @@ -43,7 +42,7 @@ public class StartController extends Controller implements Observer { @FXML private Label timer; @FXML private int PRERACE_TIME = 10; - @FXML Button fifteenMinButton; + //@FXML Button fifteenMinButton; private RaceClock raceClock; @@ -56,12 +55,13 @@ public class StartController extends Controller implements Observer { * Begins the race with a scale factor of 1 */ public void startRaceNoScaling() { - startRace(1); + //startRace(1); + countdownTimer(1); } private void startRace(int raceScale){ - fifteenMinButton.setDisable(true); - countdownTimer(raceScale); + //fifteenMinButton.setDisable(true); + //countdownTimer(raceScale); } @Override @@ -103,15 +103,15 @@ public class StartController extends Controller implements Observer { long currentTime = System.currentTimeMillis(); long startTime = currentTime + (PRERACE_TIME/scaleFactor); DateFormat timerFormat = new SimpleDateFormat("'Race Clock:' -HH:mm:ss"); - @Override public void handle(long arg0) { timeLeft = startTime - currentTime; - if (timeLeft <= 0) { + if (visualiserInput.getRaceStatus().getRaceStatus()==2) { updateTime("Race is starting..."); stop(); parent.beginRace(visualiserInput); startWrapper.setVisible(false); + start.setVisible(false); } else { updateTime(timerFormat.format(currentTime)); @@ -122,7 +122,7 @@ public class StartController extends Controller implements Observer { }.start(); } - protected void setRaceClock() { + private void setRaceClock() { raceClock = new RaceClock(raceData.getZonedDateTime()); timeZoneTime.textProperty().bind(raceClock.timeStringProperty()); @@ -138,6 +138,20 @@ public class StartController extends Controller implements Observer { }.start(); } + private void setStartingTime() { + String dateFormat = "'Starting time:' HH:mm dd/MM/YYYY"; + Platform.runLater(()-> { + long utcTime = visualiserInput.getRaceStatus().getExpectedStartTime(); + raceStartLabel.setText(DateTimeFormatter.ofPattern(dateFormat).format(raceClock.getLocalTime(utcTime))); + }); + } + + private void setCurrentTime() { + Platform.runLater(()-> + raceClock.setTime(raceClock.getLocalTime(visualiserInput.getRaceStatus().getCurrentTime())) + ); + } + @Override public void update(Observable o, Object arg) { if(o instanceof StreamedCourse) { @@ -148,7 +162,12 @@ public class StartController extends Controller implements Observer { Platform.runLater(() -> raceTitleLabel.setText(((StreamedCourse)o).getRegattaName())); } if (((StreamedCourse) o).hasReadCourse()) { - Platform.runLater(() -> setRaceClock()); + Platform.runLater(() -> { + setRaceClock(); + while(visualiserInput.getRaceStatus() == null); + setStartingTime(); + setCurrentTime(); + }); } } } @@ -166,4 +185,5 @@ public class StartController extends Controller implements Observer { e.printStackTrace(); } } + } diff --git a/visualiser/src/main/java/seng302/Mock/StreamedRace.java b/visualiser/src/main/java/seng302/Mock/StreamedRace.java index 90f79355..c5194d5f 100644 --- a/visualiser/src/main/java/seng302/Mock/StreamedRace.java +++ b/visualiser/src/main/java/seng302/Mock/StreamedRace.java @@ -58,6 +58,10 @@ public class StreamedRace extends Race { int legNumber = boatStatusMessage.getLegNumber(); + if (legNumber >= 1 && legNumber < legs.size()) { + boat.setCurrentLeg(legs.get(legNumber)); + } + if (boatStatus == BoatStatus.DNF) { boat.setDnf(true); } else if (boatStatus == BoatStatus.FINISHED || legNumber > raceData.getLegs().size()) { @@ -84,7 +88,7 @@ public class StreamedRace extends Race { double lon = boatLocationMessage.getLongitudeDouble(); boat.setCurrentPosition(new GPSCoordinate(lat, lon)); boat.setHeading(boatLocationMessage.getHeadingDegrees()); - boat.setVelocity(boatLocationMessage.getBoatSpeed() * MMPS_TO_KN); + boat.setVelocity(boatLocationMessage.getBoatSOG() * MMPS_TO_KN); } } diff --git a/visualiser/src/main/java/seng302/Model/Race.java b/visualiser/src/main/java/seng302/Model/Race.java index 6cdd435b..edc40181 100644 --- a/visualiser/src/main/java/seng302/Model/Race.java +++ b/visualiser/src/main/java/seng302/Model/Race.java @@ -247,7 +247,7 @@ public abstract class Race implements Runnable { for(Boat boat: startingBoats) { if(boat != null) { boat.setPosition(Integer.toString(startingBoats.indexOf(boat) + 1)); - if (boat.getCurrentLeg().getName().equals("DNF") || boat.getCurrentLeg().getLegNumber() == 0) + if (boat.isDnf() || !boat.isStarted() || boat.getCurrentLeg().getLegNumber() < 0) boat.setPosition("-"); } } diff --git a/visualiser/src/main/resources/scenes/connect.fxml b/visualiser/src/main/resources/scenes/connect.fxml index e9e9cc52..86c25190 100644 --- a/visualiser/src/main/resources/scenes/connect.fxml +++ b/visualiser/src/main/resources/scenes/connect.fxml @@ -1,5 +1,10 @@ + + + + + @@ -11,7 +16,7 @@ - + @@ -22,6 +27,7 @@ + @@ -33,12 +39,12 @@ - -