diff options
| author | Jean-François Milants <jf@codingfield.com> | 2021-01-10 16:57:26 (GMT) |
|---|---|---|
| committer | Jean-François Milants <jf@codingfield.com> | 2021-01-10 16:57:26 (GMT) |
| commit | 1a582815ba218d2a9047abae92b9f33a3301ffd5 (patch) | |
| tree | 18aa0aeba146d990a0302f4840e870cad1c4ad6f /src/displayapp/screens/HeartRate.cpp | |
| parent | 50ae0ae5e073ac48652e6c26549f9b19655e8da3 (diff) | |
First implementation of the HR sensor using 100% foss code (ported from waspos)
Diffstat (limited to 'src/displayapp/screens/HeartRate.cpp')
| -rw-r--r-- | src/displayapp/screens/HeartRate.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/displayapp/screens/HeartRate.cpp b/src/displayapp/screens/HeartRate.cpp new file mode 100644 index 0000000..2d25f89 --- /dev/null +++ b/src/displayapp/screens/HeartRate.cpp @@ -0,0 +1,76 @@ +#include <libs/lvgl/lvgl.h> +#include "HeartRate.h" +#include <components/heartrate/HeartRateController.h> + +#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_style_t *>(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; +} |
