From 422dcd4501fa6f52d439d1177f15e44bc24b4e39 Mon Sep 17 00:00:00 2001 From: Kusal Ekanayake Date: Fri, 19 May 2017 15:15:05 +1200 Subject: [PATCH] Sparklines now update with boat position change. Need to make it work for any amount of boats in the race and to work when the race first starts as it currently only shows one boat. #story[952] --- src/main/java/seng302/App.java | 4 +- .../seng302/controllers/CanvasController.java | 7 +-- .../controllers/RaceViewController.java | 55 ++++++++++++++++--- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/main/java/seng302/App.java b/src/main/java/seng302/App.java index 524b3d40..108d44aa 100644 --- a/src/main/java/seng302/App.java +++ b/src/main/java/seng302/App.java @@ -63,8 +63,8 @@ public class App extends Application { //Change the StreamReceiver in this else block to change the default data source. else{ //sr = new StreamReceiver("localhost", 4949, "RaceStream"); - sr = new StreamReceiver("csse-s302staff.canterbury.ac.nz", 4941, "RaceStream"); -// sr = new StreamReceiver("livedata.americascup.com", 4941, "RaceStream"); +// sr = new StreamReceiver("csse-s302staff.canterbury.ac.nz", 4941, "RaceStream"); + sr = new StreamReceiver("livedata.americascup.com", 4941, "RaceStream"); } sr.start(); diff --git a/src/main/java/seng302/controllers/CanvasController.java b/src/main/java/seng302/controllers/CanvasController.java index aaea906b..4ba21c00 100644 --- a/src/main/java/seng302/controllers/CanvasController.java +++ b/src/main/java/seng302/controllers/CanvasController.java @@ -128,10 +128,7 @@ public class CanvasController { long elapsedNanosPerFrame = elapsedNanos / frameTimes.length ; Double frameRate = 1_000_000_000.0 / elapsedNanosPerFrame ; drawFps(frameRate.intValue()); - System.out.println(elapsedNanos); - if (elapsedNanos % 10 == 0) { - raceViewController.updateSparkLine(); - } + raceViewController.checkForPositionChange(); } // TODO: 1/05/17 cir27 - Make the RaceObjects update on the actual delay. @@ -319,6 +316,8 @@ public class CanvasController { } } + + private void drawFps(int fps){ if (raceViewController.isDisplayFps()){ gc.clearRect(5,5,50,20); diff --git a/src/main/java/seng302/controllers/RaceViewController.java b/src/main/java/seng302/controllers/RaceViewController.java index 61ada899..6eb3439f 100644 --- a/src/main/java/seng302/controllers/RaceViewController.java +++ b/src/main/java/seng302/controllers/RaceViewController.java @@ -1,5 +1,6 @@ package seng302.controllers; +import java.time.Year; import java.util.concurrent.ConcurrentLinkedQueue; import javafx.animation.KeyFrame; import javafx.animation.Timeline; @@ -7,6 +8,7 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; +import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; @@ -35,6 +37,7 @@ import seng302.models.parsers.StreamParser; import java.io.IOException; import java.util.*; +import java.util.stream.Collectors; /** * Created by ptg19 on 29/03/17. @@ -68,6 +71,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel private Race race; private Stage stage; private ArrayList> sparklineData = new ArrayList<>(); + private ArrayList positions; private int time; private int index = 0; @@ -83,7 +87,7 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel RaceController raceController = new RaceController(); raceController.initializeRace(); race = raceController.getRace(); - + positions = new ArrayList<>(); startingBoats = new ArrayList<>(Arrays.asList(race.getBoats())); includedCanvasController.setup(this); @@ -93,11 +97,10 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel initialiseAnnotationSlider(); initialiseBoatSelectionComboBox(); includedCanvasController.timer.start(); - initializeSparkline(); + time = 0; selectAnnotationBtn.setOnAction(event -> { loadSelectAnnotationView(); }); - time = 0; } /** @@ -189,21 +192,53 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel raceSparkLine.setTitle("Boat Positions"); for (Yacht yacht: startingBoats){ XYChart.Series yachtData = new XYChart.Series<>(); - yachtData.getData().add(new XYChart.Data<>(Integer.toString(time), Double.parseDouble(yacht.getPosition()))); + yachtData.setName(yacht.getBoatName()); + yachtData.getData().add(new XYChart.Data<>(Integer.toString(time), 1 + startingBoats.size() - Double.parseDouble(yacht.getPosition()))); sparklineData.add(yachtData); - System.out.println("Here"); } - for (Series spark: - sparklineData){ + for (Series spark: sparklineData){ raceSparkLine.getData().add(spark); + } + Set nodes = raceSparkLine.lookupAll(".series"); + for (Node n : nodes) { + StringBuilder style = new StringBuilder(); + style.append("-fx-stroke: red; -fx-background-color: red, white; "); + n.setStyle(style.toString()); + } + time++; + } + + public void checkForPositionChange(){ + // initialize position array + if (positions.size() == 0 && startingBoats.size() == 6){ + Boolean positionsAssigned = true; + for (Yacht yacht: startingBoats){ + if (Objects.equals(yacht.getPosition(), "-")) { + positionsAssigned = false; + } + } + if (positionsAssigned){ + initializeSparkline(); + positions.addAll(startingBoats.stream().map(Yacht::getPosition).collect(Collectors.toList())); + } + } else { + ArrayList currentPositions = startingBoats.stream().map(Yacht::getPosition).collect(Collectors.toCollection(ArrayList::new)); + if (!positions.equals(currentPositions)){ + updateSparkLine(); + } + positions.clear(); + positions.addAll(startingBoats.stream().map(Yacht::getPosition).collect(Collectors.toList())); } } + + public void updateSparkLine(){ for (int i = 0; i < startingBoats.size();i++){ - sparklineData.get(i).getData().add(new XYChart.Data<>(Integer.toString(time),Double.parseDouble(startingBoats.get(i).getPosition()))); - System.out.println("Here"); + if (!Objects.equals(startingBoats.get(i).getPosition(), "-")) { + sparklineData.get(i).getData().add(new XYChart.Data<>(Integer.toString(time), 1 + startingBoats.size() - Double.parseDouble(startingBoats.get(i).getPosition()))); + } } time++; } @@ -365,6 +400,8 @@ public class RaceViewController extends Thread implements ImportantAnnotationDel } + + public boolean isDisplayFps() { return displayFps; }