summaryrefslogtreecommitdiff
path: root/src/displayapp/screens/HeartRate.cpp
diff options
context:
space:
mode:
authorJean-François Milants <jf@codingfield.com>2021-01-10 16:57:26 (GMT)
committerJean-François Milants <jf@codingfield.com>2021-01-10 16:57:26 (GMT)
commit1a582815ba218d2a9047abae92b9f33a3301ffd5 (patch)
tree18aa0aeba146d990a0302f4840e870cad1c4ad6f /src/displayapp/screens/HeartRate.cpp
parent50ae0ae5e073ac48652e6c26549f9b19655e8da3 (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.cpp76
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;
+}