From b0433a32df667b97ef45113621b15301b40f4653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20V=C3=A9lez=20Palacios?= Date: Tue, 24 May 2016 13:47:49 +0200 Subject: [PATCH] initial Dashboard distance -> time commit --- pom.xml | 5 - src/main/java/es/kauron/estraba/App.java | 1 + .../controller/DashboardController.java | 46 +++++-- .../estraba/controller/SplashController.java | 28 ++-- .../es/kauron/estraba/model/DataBundle.java | 18 ++- .../es/kauron/estraba/fxml/Dashboard.fxml | 122 +++++++++++++----- src/main/resources/general.properties | 1 + src/main/resources/general_ca.properties | 1 + src/main/resources/general_es.properties | 1 + 9 files changed, 157 insertions(+), 66 deletions(-) diff --git a/pom.xml b/pom.xml index e77cdb3..82b5741 100644 --- a/pom.xml +++ b/pom.xml @@ -58,11 +58,6 @@ controlsfx 8.40.10 - - jfree - jfreechart - 1.0.13 - com.github.rterp GMapsFX diff --git a/src/main/java/es/kauron/estraba/App.java b/src/main/java/es/kauron/estraba/App.java index 24ed1d5..f837507 100644 --- a/src/main/java/es/kauron/estraba/App.java +++ b/src/main/java/es/kauron/estraba/App.java @@ -61,6 +61,7 @@ public class App extends Application { stage.setResizable(false); stage.setScene(new Scene(root)); + if (getParameters().getUnnamed().size() == 1) { loader.getController().loadGPXFile(new File(getParameters().getUnnamed().get(0))); } diff --git a/src/main/java/es/kauron/estraba/controller/DashboardController.java b/src/main/java/es/kauron/estraba/controller/DashboardController.java index aad4c7c..57bb156 100644 --- a/src/main/java/es/kauron/estraba/controller/DashboardController.java +++ b/src/main/java/es/kauron/estraba/controller/DashboardController.java @@ -38,6 +38,7 @@ import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.scene.Node; import javafx.scene.chart.AreaChart; import javafx.scene.chart.LineChart; import javafx.scene.chart.PieChart; @@ -45,6 +46,7 @@ import javafx.scene.control.Label; import javafx.scene.control.Tab; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.input.MouseEvent; import javafx.scene.layout.AnchorPane; import jgpx.model.analysis.Chunk; @@ -58,38 +60,40 @@ import java.util.ResourceBundle; public class DashboardController implements Initializable, MapComponentInitializedListener { + final int N = 0, S = 1, E = 2, W = 3; + final double[] coord = new double[4]; @FXML private AnchorPane root; - @FXML private Tab tabDashboard, tabMap, tabGraph, tabSettings; - @FXML private ImageView imgHR, imgSpeed, imgCadence, imgDate, imgDistance, imgElevation; - @FXML private Label valueHRAvg, valueHRMin, valueHRMax, valueSpeedAvg, valueSpeedMax, valueCadenceAvg, valueCadenceMax, valueDate, valueTime, valueActiveTime, valueTotalTime, valueDistance, valueElevation, labelMotivationUpper, valueAscent, valueDescent, labelMotivatorLower; @FXML private JFXSpinner mapSpinner; - @FXML private PieChart zoneChart; - @FXML private GoogleMapView mapView; private ObservableList chunks; - @FXML private JFXButton elevationButton, speedButton, hrButton, cadenceButton; @FXML private AreaChart elevationChart; + @FXML + private AreaChart elevationTChart; + @FXML private LineChart speedChart, hrChart, cadenceChart, mapChart; + @FXML + private LineChart speedTChart, hrTChart, cadenceTChart; + @Override public void initialize(URL location, ResourceBundle resources) { // populate map icons @@ -105,6 +109,15 @@ public class DashboardController implements Initializable, MapComponentInitializ imgDate.setImage(new Image(App.class.getResourceAsStream("img/date.png"))); imgDistance.setImage(new Image(App.class.getResourceAsStream("img/distance.png"))); imgElevation.setImage(new Image(App.class.getResourceAsStream("img/elevation.png"))); + + + } + + @FXML + private void toggleChart(MouseEvent e) { + System.out.println("hi"); + for (Node n : ((Node) e.getSource()).getParent().getChildrenUnmodifiable()) + n.setVisible(!n.isVisible()); } @FXML @@ -149,9 +162,13 @@ public class DashboardController implements Initializable, MapComponentInitializ // populate the charts elevationChart.getData().add(bundle.elevationSeries); + elevationTChart.getData().add(bundle.elevationTSeries); speedChart.getData().add(bundle.speedSeries); + speedTChart.getData().add(bundle.speedTSeries); hrChart.getData().add(bundle.hrSeries); + hrTChart.getData().add(bundle.hrTSeries); cadenceChart.getData().add(bundle.cadenceSeries); + cadenceTChart.getData().add(bundle.cadenceTSeries); //initialize map chunks = bundle.chunks; @@ -161,8 +178,6 @@ public class DashboardController implements Initializable, MapComponentInitializ @Override public void mapInitialized() { // When the JS init is done - final int N = 0, S = 1, E = 2, W = 3; - final double[] coord = new double[4]; coord[0] = Double.MIN_VALUE; coord[1] = Double.MAX_VALUE; coord[2] = Double.MIN_VALUE; @@ -212,13 +227,20 @@ public class DashboardController implements Initializable, MapComponentInitializ chunks.get(chunks.size() - 1).getLastPoint().getLongitude())) .title("label.end"))); // Adjust the map to the correct center and zoom - map.fitBounds(new LatLongBounds( + mapView.setVisible(true); + mapSpinner.setVisible(false); + + mapView.heightProperty().addListener(e -> centerMap()); + mapView.widthProperty().addListener(e -> centerMap()); + centerMap(); + } + + private void centerMap() { + mapView.getMap().setZoom(getBoundsZoomLevel(coord, mapView.getHeight(), mapView.getWidth())); + mapView.getMap().fitBounds(new LatLongBounds( new LatLong(coord[S], coord[W]), new LatLong(coord[N], coord[E]) )); - map.setZoom(getBoundsZoomLevel(coord, mapView.getHeight(), mapView.getWidth())); - mapView.setVisible(true); - mapSpinner.setVisible(false); } /** diff --git a/src/main/java/es/kauron/estraba/controller/SplashController.java b/src/main/java/es/kauron/estraba/controller/SplashController.java index b199931..d521df9 100644 --- a/src/main/java/es/kauron/estraba/controller/SplashController.java +++ b/src/main/java/es/kauron/estraba/controller/SplashController.java @@ -30,7 +30,6 @@ import com.jfoenix.controls.JFXSnackbar; import com.jfoenix.controls.JFXSpinner; import es.kauron.estraba.App; import es.kauron.estraba.model.DataBundle; -import javafx.application.Platform; import javafx.concurrent.Task; import javafx.event.ActionEvent; import javafx.fxml.FXML; @@ -100,8 +99,14 @@ public class SplashController implements Initializable{ snackbar.show("Loading file", 5000); Thread th = new Thread(new Task() { @Override - protected DataBundle call() throws Exception { - return DataBundle.loadFrom(file); + protected DataBundle call() { + DataBundle db = null; + try { + db = DataBundle.loadFrom(file); + } catch (Exception e) { + e.printStackTrace(); + } + return db; } @Override @@ -117,6 +122,7 @@ public class SplashController implements Initializable{ loader.getController().load(bundle); ((Stage) root.getScene().getWindow()).setScene(new Scene(parent)); } catch (IOException e) { + e.printStackTrace(); errorLoading(); } } @@ -145,37 +151,33 @@ public class SplashController implements Initializable{ } }); - Platform.runLater(() -> root.getScene().setOnDragOver(e -> { + root.setOnDragOver(e -> { Dragboard db = e.getDragboard(); if (db.hasFiles()) { e.acceptTransferModes(TransferMode.COPY); } else { e.consume(); } - })); + }); // Dropping over surface - Platform.runLater(() -> root.getScene().setOnDragDropped(e -> { + root.setOnDragDropped(e -> { Dragboard db = e.getDragboard(); boolean success = false; if (db.hasFiles()) { success = true; - String filePath = null; - for (File file : db.getFiles()) { - filePath = file.getAbsolutePath(); - System.out.println(filePath); - } + loadGPXFile(db.getFiles().get(0).getAbsoluteFile()); } e.setDropCompleted(success); e.consume(); - })); + }); } private void errorLoading() { buttonLoad.setVisible(true); labelWelcome.setVisible(true); spinner.setVisible(false); - snackbar.show("Error loading file", 3000); + snackbar.show(App.GENERAL_BUNDLE.getString("error.file"), 3000); } } diff --git a/src/main/java/es/kauron/estraba/model/DataBundle.java b/src/main/java/es/kauron/estraba/model/DataBundle.java index 2a2a548..76b74c1 100644 --- a/src/main/java/es/kauron/estraba/model/DataBundle.java +++ b/src/main/java/es/kauron/estraba/model/DataBundle.java @@ -40,23 +40,24 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Unmarshaller; import java.io.File; +import java.time.Duration; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; + public class DataBundle { - public static final int N = 0, S = 1, E = 2, W = 3; private static final double DISTANCE_EPSILON = 1E-6; private static final double KILOMETER_CUTOFF = 10000; public String HRAvg, HRMax, HRMin, speedAvg, speedMax, cadenceAvg, cadenceMax; public String date, time, activeTime, totalTime, distance, elevation, ascent, descent; public XYChart.Series elevationSeries, speedSeries, hrSeries, cadenceSeries; + public XYChart.Series elevationTSeries, speedTSeries, hrTSeries, cadenceTSeries; public ObservableList pieData; public ObservableList chunks; private DataBundle(TrackData track) { - HRAvg = track.getAverageHeartrate() + App.GENERAL_BUNDLE.getString("unit.bpm"); HRMax = track.getMaxHeartrate() + App.GENERAL_BUNDLE.getString("unit.bpm"); HRMin = track.getMinHeartRate() + App.GENERAL_BUNDLE.getString("unit.bpm"); @@ -87,23 +88,34 @@ public class DataBundle { // traverse the chunks chunks = track.getChunks(); double currentDistance = 0.0; + Duration currentTime = Duration.ZERO; double currentHeight = chunks.get(0).getFirstPoint().getElevation(); elevationSeries = new XYChart.Series<>(); + elevationTSeries = new XYChart.Series<>(); cadenceSeries = new XYChart.Series<>(); + cadenceTSeries = new XYChart.Series<>(); hrSeries = new XYChart.Series<>(); + hrTSeries = new XYChart.Series<>(); speedSeries = new XYChart.Series<>(); + speedTSeries = new XYChart.Series<>(); pieData = FXCollections.observableArrayList(); for (Chunk chunk : chunks) { currentDistance += chunk.getDistance(); - if (chunk.getDistance() < DISTANCE_EPSILON) continue; + currentTime = currentTime.plus(chunk.getMovingTime()); + if (chunk.getDistance() < DISTANCE_EPSILON || + chunk.getMovingTime().getSeconds() < 1) continue; currentHeight += chunk.getAscent() - chunk.getDescend(); elevationSeries.getData().add(new XYChart.Data<>(currentDistance, currentHeight)); + elevationTSeries.getData().add(new XYChart.Data<>(currentTime.toMinutes(), currentHeight)); speedSeries.getData().add(new XYChart.Data<>(currentDistance, chunk.getSpeed()*3.6)); // m/s + speedTSeries.getData().add(new XYChart.Data<>(currentTime.toMinutes(), chunk.getSpeed() * 3.6)); // m/s hrSeries.getData().add(new XYChart.Data<>(currentDistance, chunk.getAvgHeartRate())); + hrTSeries.getData().add(new XYChart.Data<>(currentTime.toMinutes(), chunk.getAvgHeartRate())); cadenceSeries.getData().add(new XYChart.Data<>(currentDistance, chunk.getAvgCadence())); + cadenceTSeries.getData().add(new XYChart.Data<>(currentTime.toMinutes(), chunk.getAvgCadence())); String zone; if (chunk.getAvgHeartRate() > 170) zone = App.GENERAL_BUNDLE.getString("zone.anaerobic"); diff --git a/src/main/resources/es/kauron/estraba/fxml/Dashboard.fxml b/src/main/resources/es/kauron/estraba/fxml/Dashboard.fxml index 9f53176..3b9958f 100644 --- a/src/main/resources/es/kauron/estraba/fxml/Dashboard.fxml +++ b/src/main/resources/es/kauron/estraba/fxml/Dashboard.fxml @@ -365,7 +365,7 @@ - + @@ -422,38 +422,94 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/general.properties b/src/main/resources/general.properties index 39341a7..4156188 100644 --- a/src/main/resources/general.properties +++ b/src/main/resources/general.properties @@ -25,6 +25,7 @@ app.extension=GPX data files app.title=ESTRABA +error.file=Error loading file label.begin=Salida label.cadence=Cadence label.distance=Distance diff --git a/src/main/resources/general_ca.properties b/src/main/resources/general_ca.properties index 7e4699a..5cb615a 100644 --- a/src/main/resources/general_ca.properties +++ b/src/main/resources/general_ca.properties @@ -25,6 +25,7 @@ app.extension=Arxius GPX app.title=ESTRABA +error.file=Error label.begin=Salida label.cadence=Cadencia label.distance=Distancia diff --git a/src/main/resources/general_es.properties b/src/main/resources/general_es.properties index 20b3b56..c072112 100644 --- a/src/main/resources/general_es.properties +++ b/src/main/resources/general_es.properties @@ -25,6 +25,7 @@ app.extension=Archivos de datos GPX app.title=ESTRABA +error.file=Error al cargar el archivo label.begin=Salida label.cadence=Cadencia label.distance=Distancia