aboutsummaryrefslogtreecommitdiffstats
path: root/src/components
diff options
context:
space:
mode:
authormark9064 <30447455+mark9064@users.noreply.github.com>2025-06-18 14:09:57 +0100
committermark9064 <30447455+mark9064@users.noreply.github.com>2025-11-05 10:34:49 +0000
commit8daddf87782c1228a44528da6f67d8dfce3edb40 (patch)
treedead2a56c55f5eec74c70f42389c89e379aa4ce7 /src/components
parent04afd22943cf4d6a826e09cf5fd246886ee7cacf (diff)
Background heartrate measurement
Co-Authored-By: Patric Gruber <me@patric-gruber.at>
Diffstat (limited to 'src/components')
-rw-r--r--src/components/heartrate/HeartRateController.cpp8
-rw-r--r--src/components/heartrate/HeartRateController.h6
-rw-r--r--src/components/heartrate/Ppg.cpp5
-rw-r--r--src/components/heartrate/Ppg.h1
-rw-r--r--src/components/settings/Settings.h20
5 files changed, 32 insertions, 8 deletions
diff --git a/src/components/heartrate/HeartRateController.cpp b/src/components/heartrate/HeartRateController.cpp
index e0d69272..c365e865 100644
--- a/src/components/heartrate/HeartRateController.cpp
+++ b/src/components/heartrate/HeartRateController.cpp
@@ -12,17 +12,17 @@ void HeartRateController::Update(HeartRateController::States newState, uint8_t h
}
}
-void HeartRateController::Start() {
+void HeartRateController::Enable() {
if (task != nullptr) {
state = States::NotEnoughData;
- task->PushMessage(Pinetime::Applications::HeartRateTask::Messages::StartMeasurement);
+ task->PushMessage(Pinetime::Applications::HeartRateTask::Messages::Enable);
}
}
-void HeartRateController::Stop() {
+void HeartRateController::Disable() {
if (task != nullptr) {
state = States::Stopped;
- task->PushMessage(Pinetime::Applications::HeartRateTask::Messages::StopMeasurement);
+ task->PushMessage(Pinetime::Applications::HeartRateTask::Messages::Disable);
}
}
diff --git a/src/components/heartrate/HeartRateController.h b/src/components/heartrate/HeartRateController.h
index f66c79f8..5bd3a8ef 100644
--- a/src/components/heartrate/HeartRateController.h
+++ b/src/components/heartrate/HeartRateController.h
@@ -15,11 +15,11 @@ namespace Pinetime {
namespace Controllers {
class HeartRateController {
public:
- enum class States { Stopped, NotEnoughData, NoTouch, Running };
+ enum class States : uint8_t { Stopped, NotEnoughData, NoTouch, Running };
HeartRateController() = default;
- void Start();
- void Stop();
+ void Enable();
+ void Disable();
void Update(States newState, uint8_t heartRate);
void SetHeartRateTask(Applications::HeartRateTask* task);
diff --git a/src/components/heartrate/Ppg.cpp b/src/components/heartrate/Ppg.cpp
index efbed852..25be6237 100644
--- a/src/components/heartrate/Ppg.cpp
+++ b/src/components/heartrate/Ppg.cpp
@@ -155,8 +155,12 @@ int8_t Ppg::Preprocess(uint16_t hrs, uint16_t als) {
int Ppg::HeartRate() {
if (dataIndex < dataLength) {
+ if (!enoughData) {
+ return -2;
+ }
return 0;
}
+ enoughData = true;
int hr = 0;
hr = ProcessHeartRate(resetSpectralAvg);
resetSpectralAvg = false;
@@ -171,6 +175,7 @@ int Ppg::HeartRate() {
void Ppg::Reset(bool resetDaqBuffer) {
if (resetDaqBuffer) {
dataIndex = 0;
+ enoughData = false;
}
avgIndex = 0;
dataAverage.fill(0.0f);
diff --git a/src/components/heartrate/Ppg.h b/src/components/heartrate/Ppg.h
index 373e7985..78935382 100644
--- a/src/components/heartrate/Ppg.h
+++ b/src/components/heartrate/Ppg.h
@@ -71,6 +71,7 @@ namespace Pinetime {
uint16_t dataIndex = 0;
float peakLocation;
bool resetSpectralAvg = true;
+ bool enoughData = false;
int ProcessHeartRate(bool init);
float HeartRateAverage(float hr);
diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h
index 093a3ac6..9133d3fe 100644
--- a/src/components/settings/Settings.h
+++ b/src/components/settings/Settings.h
@@ -1,6 +1,8 @@
#pragma once
#include <cstdint>
#include <bitset>
+#include <limits>
+#include <optional>
#include "components/brightness/BrightnessController.h"
#include "components/fs/FS.h"
#include "displayapp/apps/Apps.h"
@@ -334,10 +336,25 @@ namespace Pinetime {
return (settings.dfuAndFsEnabledOnBoot ? DfuAndFsMode::Enabled : DfuAndFsMode::Disabled);
};
+ std::optional<uint16_t> GetHeartRateBackgroundMeasurementInterval() const {
+ if (settings.heartRateBackgroundPeriod == std::numeric_limits<uint16_t>::max()) {
+ return std::nullopt;
+ }
+ return settings.heartRateBackgroundPeriod;
+ }
+
+ void SetHeartRateBackgroundMeasurementInterval(std::optional<uint16_t> newIntervalInSeconds) {
+ newIntervalInSeconds = newIntervalInSeconds.value_or(std::numeric_limits<uint16_t>::max());
+ if (newIntervalInSeconds != settings.heartRateBackgroundPeriod) {
+ settingsChanged = true;
+ }
+ settings.heartRateBackgroundPeriod = newIntervalInSeconds.value();
+ }
+
private:
Pinetime::Controllers::FS& fs;
- static constexpr uint32_t settingsVersion = 0x0009;
+ static constexpr uint32_t settingsVersion = 0x000a;
struct SettingsData {
uint32_t version = settingsVersion;
@@ -365,6 +382,7 @@ namespace Pinetime {
Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;
bool dfuAndFsEnabledOnBoot = false;
+ uint16_t heartRateBackgroundPeriod = std::numeric_limits<uint16_t>::max(); // Disabled by default
};
SettingsData settings;