#pragma once #include #include #include #include #include #include #include "components/settings/Settings.h" namespace Pinetime { namespace Drivers { class Hrs3300; } namespace Controllers { class HeartRateController; } namespace Applications { class HeartRateTask { public: enum class Messages : uint8_t { GoToSleep, WakeUp, Enable, Disable }; explicit HeartRateTask(Drivers::Hrs3300& heartRateSensor, Controllers::HeartRateController& controller, Controllers::Settings& settings); void Start(); void Work(); void PushMessage(Messages msg); private: enum class States : uint8_t { Disabled, Waiting, BackgroundMeasuring, ForegroundMeasuring }; static void Process(void* instance); void HandleSensorData(); void StartMeasurement(); void StopMeasurement(); [[nodiscard]] bool BackgroundMeasurementNeeded() const; [[nodiscard]] std::optional BackgroundMeasurementInterval() const; TickType_t CurrentTaskDelay(); TaskHandle_t taskHandle; QueueHandle_t messageQueue; bool valueCurrentlyShown; bool measurementSucceeded; States state = States::Disabled; uint16_t count; Drivers::Hrs3300& heartRateSensor; Controllers::HeartRateController& controller; Controllers::Settings& settings; Controllers::Ppg ppg; TickType_t lastMeasurementTime; TickType_t measurementStartTime; }; } }