From 1a582815ba218d2a9047abae92b9f33a3301ffd5 Mon Sep 17 00:00:00 2001 From: Jean-François Milants Date: Sun, 10 Jan 2021 17:57:26 +0100 Subject: First implementation of the HR sensor using 100% foss code (ported from waspos) --- src/displayapp/screens/ApplicationList.cpp | 2 +- src/displayapp/screens/HeartRate.cpp | 76 ++++++++++++++++++++++++++++++ src/displayapp/screens/HeartRate.h | 38 +++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/displayapp/screens/HeartRate.cpp create mode 100644 src/displayapp/screens/HeartRate.h (limited to 'src/displayapp/screens') diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp index 0b8face3..57fbde20 100644 --- a/src/displayapp/screens/ApplicationList.cpp +++ b/src/displayapp/screens/ApplicationList.cpp @@ -45,7 +45,7 @@ std::unique_ptr ApplicationList::CreateScreen1() { {Symbols::sun, Apps::Brightness}, {Symbols::list, Apps::SysInfo}, {Symbols::check, Apps::FirmwareValidation}, - {Symbols::none, Apps::None} + {Symbols::heartBeat, Apps::HeartRate} } diff --git a/src/displayapp/screens/HeartRate.cpp b/src/displayapp/screens/HeartRate.cpp new file mode 100644 index 00000000..2d25f89c --- /dev/null +++ b/src/displayapp/screens/HeartRate.cpp @@ -0,0 +1,76 @@ +#include +#include "HeartRate.h" +#include + +#include "../DisplayApp.h" + +using namespace Pinetime::Applications::Screens; +extern lv_font_t jetbrains_mono_extrabold_compressed; +extern lv_font_t jetbrains_mono_bold_20; + +const char* ToString(Pinetime::Controllers::HeartRateController::States s) { + switch(s) { + case Pinetime::Controllers::HeartRateController::States::NotEnoughData: return "Not enough data,\nplease wait..."; + case Pinetime::Controllers::HeartRateController::States::NoTouch: return "No touch detected"; + case Pinetime::Controllers::HeartRateController::States::Running: return "Measuring..."; + } + return ""; +} + +HeartRate::HeartRate(Pinetime::Applications::DisplayApp *app, Controllers::HeartRateController& heartRateController) : Screen(app), heartRateController{heartRateController} { + label_bpm = lv_label_create(lv_scr_act(), NULL); + + labelStyle = const_cast(lv_label_get_style(label_bpm, LV_LABEL_STYLE_MAIN)); + labelStyle->text.font = &jetbrains_mono_bold_20; + + lv_style_copy(&labelBigStyle, labelStyle); + labelBigStyle.text.font = &jetbrains_mono_extrabold_compressed; + + lv_label_set_style(label_bpm, LV_LABEL_STYLE_MAIN, labelStyle); + + label_hr = lv_label_create(lv_scr_act(), NULL); + lv_label_set_style(label_hr, LV_LABEL_STYLE_MAIN, &labelBigStyle); + lv_obj_align(label_hr, lv_scr_act(), LV_ALIGN_CENTER, -70, 0); + lv_label_set_text(label_hr, "000"); + + lv_label_set_text(label_bpm, "Heart rate BPM"); + lv_obj_align(label_bpm, label_hr, LV_ALIGN_OUT_TOP_MID, 0, -20); + + + label_status = lv_label_create(lv_scr_act(), NULL); + lv_label_set_text(label_status, ToString(Pinetime::Controllers::HeartRateController::States::NotEnoughData)); + lv_label_set_style(label_status, LV_LABEL_STYLE_MAIN, labelStyle); + lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + + heartRateController.Start(); +} + +HeartRate::~HeartRate() { + heartRateController.Stop(); + lv_obj_clean(lv_scr_act()); +} + +bool HeartRate::Refresh() { + char hr[4]; + + auto state = heartRateController.State(); + switch(state) { + case Controllers::HeartRateController::States::NoTouch: + case Controllers::HeartRateController::States::NotEnoughData: + lv_label_set_text(label_hr, "000"); + break; + default: + sprintf(hr, "%03d", heartRateController.HeartRate()); + lv_label_set_text(label_hr, hr); + } + + lv_label_set_text(label_status, ToString(state)); + lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + + return running; +} + +bool HeartRate::OnButtonPushed() { + running = false; + return true; +} diff --git a/src/displayapp/screens/HeartRate.h b/src/displayapp/screens/HeartRate.h new file mode 100644 index 00000000..41fd5bb3 --- /dev/null +++ b/src/displayapp/screens/HeartRate.h @@ -0,0 +1,38 @@ +#pragma once + +#include +#include +#include "Screen.h" +#include +#include +#include + +namespace Pinetime { + namespace Controllers { + class HeartRateController; + } + namespace Applications { + namespace Screens { + + class HeartRate : public Screen{ + public: + HeartRate(DisplayApp* app, Controllers::HeartRateController& HeartRateController); + ~HeartRate() override; + + bool Refresh() override; + bool OnButtonPushed() override; + + private: + Controllers::HeartRateController& heartRateController; + lv_obj_t* label_hr; + lv_obj_t* label_bpm; + lv_obj_t* label_status; + lv_style_t labelBigStyle; + lv_style_t* labelStyle; + + bool running = true; + + }; + } + } +} -- cgit v1.2.3-70-g09d2