From 1bf4594a93f53742d24a81f33512622a8d221437 Mon Sep 17 00:00:00 2001 From: naumueller <> Date: Sun, 2 Nov 2025 19:09:09 +0100 Subject: [PATCH] Heartrate Simulator with visuals added --- .../controller/HeartRateController.java | 38 +++++++++++++++ .../gesundheitsassistent/model/HeartRate.java | 46 ++++++++++++++++++ .../viewmodel/HeartRateViewModel.java | 48 +++++++++++++++++++ .../view/HeartRateDashboard.fxml | 29 +++++++++++ 4 files changed, 161 insertions(+) create mode 100644 src/main/java/efi/projekt/gesundheitsassistent/controller/HeartRateController.java create mode 100644 src/main/java/efi/projekt/gesundheitsassistent/model/HeartRate.java create mode 100644 src/main/java/efi/projekt/gesundheitsassistent/viewmodel/HeartRateViewModel.java create mode 100644 src/main/resources/efi/projekt/gesundheitsassistent/view/HeartRateDashboard.fxml diff --git a/src/main/java/efi/projekt/gesundheitsassistent/controller/HeartRateController.java b/src/main/java/efi/projekt/gesundheitsassistent/controller/HeartRateController.java new file mode 100644 index 0000000..ba92935 --- /dev/null +++ b/src/main/java/efi/projekt/gesundheitsassistent/controller/HeartRateController.java @@ -0,0 +1,38 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/javafx/FXMLController.java to edit this template + */ +package efi.projekt.gesundheitsassistent.controller; + +import efi.projekt.gesundheitsassistent.viewmodel.HeartRateViewModel; +import java.net.URL; +import java.util.ResourceBundle; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.chart.LineChart; + +/** + * FXML Controller class + * + * @author naumueller + */ +public class HeartRateController implements Initializable { + + @FXML private LineChart heartRateChart; + + private HeartRateViewModel viewModel; + + /** + * Initializes the controller class. + */ + @Override + public void initialize(URL url, ResourceBundle rb) { + viewModel = new HeartRateViewModel(); + } + + @FXML + private void startSimulation() { + heartRateChart.getData().add(viewModel.getHeartRateSeries()); + } + +} diff --git a/src/main/java/efi/projekt/gesundheitsassistent/model/HeartRate.java b/src/main/java/efi/projekt/gesundheitsassistent/model/HeartRate.java new file mode 100644 index 0000000..ea3ec6b --- /dev/null +++ b/src/main/java/efi/projekt/gesundheitsassistent/model/HeartRate.java @@ -0,0 +1,46 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package efi.projekt.gesundheitsassistent.model; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * + * @author naumueller + */ +public class HeartRate { + private List heartRateData = new ArrayList<>(); + private int time = 0; + private Random random = new Random(); + + public HeartRate() {} + + /** Neue Herzfrequenz simulieren */ + public int simulateHeartRate() { + int base = 70; + int fluctuation = random.nextInt(30) - 10; // -10 bis +20 + int bpm = base + fluctuation; + addData(bpm); + return bpm; + } + + private void addData(int bpm) { + heartRateData.add(bpm); + time++; + if (heartRateData.size() > 60) { + heartRateData.remove(0); // nur letzte 60 Werte behalten + } + } + + public List getHeartRateData() { + return heartRateData; + } + + public int getTime() { + return time; + } +} diff --git a/src/main/java/efi/projekt/gesundheitsassistent/viewmodel/HeartRateViewModel.java b/src/main/java/efi/projekt/gesundheitsassistent/viewmodel/HeartRateViewModel.java new file mode 100644 index 0000000..ebb2e9c --- /dev/null +++ b/src/main/java/efi/projekt/gesundheitsassistent/viewmodel/HeartRateViewModel.java @@ -0,0 +1,48 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package efi.projekt.gesundheitsassistent.viewmodel; + +import efi.projekt.gesundheitsassistent.model.HeartRate; +import java.util.Random; +import java.util.Timer; +import java.util.TimerTask; +import javafx.application.Platform; +import javafx.scene.chart.XYChart; + +/** + * + * @author naumueller + */ +public class HeartRateViewModel { + private HeartRate heartRate; + private XYChart.Series heartRateSeries = new XYChart.Series<>(); + private Timer timer = new Timer(true); + + public HeartRateViewModel() { + this.heartRate = new HeartRate(); + heartRateSeries.setName("Herzfrequenz"); + startSimulation(); + } + + public XYChart.Series getHeartRateSeries() { return heartRateSeries; } + + private void startSimulation() { + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + int bpm = heartRate.simulateHeartRate(); + int time = heartRate.getTime(); + Platform.runLater(() -> addHeartRateData(time, bpm)); + } + }, 0, 1000); + } + + private void addHeartRateData(int time, int bpm) { + heartRateSeries.getData().add(new XYChart.Data<>(String.valueOf(time),bpm)); + if (heartRateSeries.getData().size() > 60) { + heartRateSeries.getData().remove(0); + } + } +} diff --git a/src/main/resources/efi/projekt/gesundheitsassistent/view/HeartRateDashboard.fxml b/src/main/resources/efi/projekt/gesundheitsassistent/view/HeartRateDashboard.fxml new file mode 100644 index 0000000..cda2991 --- /dev/null +++ b/src/main/resources/efi/projekt/gesundheitsassistent/view/HeartRateDashboard.fxml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + +