1 package ui.controllers;
4 import javafx.application.Platform;
5 import javafx.concurrent.Task;
6 import javafx.fxml.FXML;
7 import javafx.scene.chart.LineChart;
8 import javafx.scene.chart.XYChart;
9 import javafx.scene.text.Text;
12 import org.jetbrains.annotations.NotNull;
13 import org.slf4j.Logger;
14 import org.slf4j.LoggerFactory;
15 import org.springframework.beans.factory.annotation.Autowired;
18 import java.text.SimpleDateFormat;
19 import java.time.DateTimeException;
20 import java.time.Duration;
21 import java.util.concurrent.Executor;
32 private static final Logger log = LoggerFactory.getLogger
39 private static final Duration pressurePollingInterval =
40 Duration.ofMillis(1000);
45 private static final Duration voltagePollingInterval =
46 Duration.ofMillis(1000);
48 private static final Integer maximumNumberOfDataPointsInCharts = 30;
58 @FXML
private volatile Text reportedPressure;
63 @FXML
private volatile Text reportedVoltage;
68 @FXML
private LineChart<String, Float> pressureChart;
73 @FXML
private LineChart<String, Float> voltageChart;
78 private XYChart.Series<String, Float> pressureSeries;
83 private XYChart.Series<String, Float> voltageSeries;
90 configurePressureSeries();
91 if (kernel.getVariableProvidersView().hasPressureProvider()){
92 log.info(
"Found pressure provider. Reporting");
93 configurePressureProvider();
96 configureVoltageSeries();
97 if (kernel.getVariableProvidersView().hasVoltageProvider()){
98 log.info(
"Found voltage provider. Reporting");
99 configureVoltageProvider();
108 if (kernel.getVariableProvidersView().hasPressureProvider()){
109 log.info(
"Found pressure provider. Using this for reports");
110 configurePressureProvider();
112 if (kernel.getVariableProvidersView().hasVoltageProvider()){
113 log.info(
"Found voltage provider. Using this for reports");
114 configureVoltageProvider();
123 public void execute(@NotNull Runnable command){
124 Platform.runLater(command);
130 private void configureVoltageProvider(){
132 .getVoltageProvider();
137 error.printStackTrace();
146 private void configurePressureProvider(){
148 .getVariableProvidersView().getPressureProvider();
153 error.printStackTrace();
162 private void configureVoltageSeries(){
163 voltageSeries =
new XYChart.Series<>();
164 voltageSeries.setName(
"Voltage / V");
166 voltageChart.getData().add(voltageSeries);
172 private void configurePressureSeries(){
173 pressureSeries =
new XYChart.Series<>();
174 pressureSeries.setName(
"Pressure / mBar");
176 pressureChart.getData().add(pressureSeries);
183 private class VoltageChangeHandler
implements 190 private Executor taskExecutor;
196 public VoltageChangeHandler(Executor taskExecutor){
197 this.taskExecutor = taskExecutor;
204 public void onChange(
Voltage newVoltage){
205 if (voltageChart.isVisible() && reportedVoltage.isVisible()) {
206 Task<Void> task =
new UpdateVoltageTask(newVoltage);
207 this.taskExecutor.execute(task);
215 private class PressureChangeHandler
implements 221 private Executor taskExecutor;
226 public PressureChangeHandler(Executor taskExecutor){
227 this.taskExecutor = taskExecutor;
235 public void onChange(
Pressure newPressure){
236 if (pressureChart.isVisible() && reportedPressure.isVisible()) {
237 Task<Void> task =
new UpdatePressureTask(newPressure);
238 this.taskExecutor.execute(task);
246 private class UpdatePressureTask
extends Task<Void> {
255 public UpdatePressureTask(
Pressure newPressure){
256 this.newPressure = newPressure;
265 updatePressureText();
266 updatePressureChart();
273 private void updatePressureText(){
274 reportedPressure.setText(newPressure.getValue().toString());
282 private void updatePressureChart()
throws DateTimeException {
283 String xValue = getDateFromPressure();
284 Float yValue = newPressure.getValue();
285 XYChart.Data<String, Float> dataPoint =
new XYChart.Data<>(
288 pressureSeries.getData().add(dataPoint);
298 private String getDateFromPressure()
throws DateTimeException {
299 SimpleDateFormat formatter =
new SimpleDateFormat(
"HH:mm:ss");
300 return formatter.format(newPressure.getDate());
307 private class UpdateVoltageTask
extends Task<Void> {
316 public UpdateVoltageTask(
Voltage newVoltage){
317 this.newVoltage = newVoltage;
327 updateVoltageChart();
334 private void updateVoltageText(){
335 reportedVoltage.setText(newVoltage.getValue().toString());
341 private void updateVoltageChart(){
342 String xValue = getDateFromVoltage();
343 Float yValue = newVoltage.getValue().floatValue();
345 XYChart.Data<String, Float> dataPoint =
new XYChart.Data<>(
349 voltageSeries.getData().add(dataPoint);
357 private String getDateFromVoltage(){
358 SimpleDateFormat formatter =
new SimpleDateFormat(
"HH:mm:ss");
359 return formatter.format(newVoltage.getDate());
369 private static void checkSeriesSizeCorrect(XYChart.Series series){
370 Integer dataPointNumber = series.getData().size();
372 if (dataPointNumber > maximumNumberOfDataPointsInCharts){
373 series.getData().remove(0);
void handleRefreshButtonClicked()
void setPollingInterval(Duration pollingInterval)
void addOnChangeListener(VariableChangeEventListener< T > listener)
void execute(@NotNull Runnable command)