From 8daddf87782c1228a44528da6f67d8dfce3edb40 Mon Sep 17 00:00:00 2001 From: mark9064 <30447455+mark9064@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:09:57 +0100 Subject: Background heartrate measurement Co-Authored-By: Patric Gruber --- src/components/heartrate/HeartRateController.cpp | 8 ++++---- src/components/heartrate/HeartRateController.h | 6 +++--- src/components/heartrate/Ppg.cpp | 5 +++++ src/components/heartrate/Ppg.h | 1 + src/components/settings/Settings.h | 20 +++++++++++++++++++- 5 files changed, 32 insertions(+), 8 deletions(-) (limited to 'src/components') 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 #include +#include +#include #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 GetHeartRateBackgroundMeasurementInterval() const { + if (settings.heartRateBackgroundPeriod == std::numeric_limits::max()) { + return std::nullopt; + } + return settings.heartRateBackgroundPeriod; + } + + void SetHeartRateBackgroundMeasurementInterval(std::optional newIntervalInSeconds) { + newIntervalInSeconds = newIntervalInSeconds.value_or(std::numeric_limits::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::max(); // Disabled by default }; SettingsData settings; -- cgit v1.2.3-70-g09d2