summaryrefslogtreecommitdiff
path: root/src/displayapp
diff options
context:
space:
mode:
Diffstat (limited to 'src/displayapp')
-rw-r--r--src/displayapp/Apps.h2
-rw-r--r--src/displayapp/DisplayApp.cpp8
-rw-r--r--src/displayapp/DisplayApp.h5
-rw-r--r--src/displayapp/screens/ApplicationList.cpp2
-rw-r--r--src/displayapp/screens/HeartRate.cpp76
-rw-r--r--src/displayapp/screens/HeartRate.h38
6 files changed, 126 insertions, 5 deletions
diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h
index f5fb24d0..fcadf2a2 100644
--- a/src/displayapp/Apps.h
+++ b/src/displayapp/Apps.h
@@ -2,6 +2,6 @@
namespace Pinetime {
namespace Applications {
- enum class Apps {None, Launcher, Clock, SysInfo, Meter, Gauge, Brightness, Music, FirmwareValidation, Paint, Paddle, Notifications, Twos};
+ enum class Apps {None, Launcher, Clock, SysInfo, Meter, Gauge, Brightness, Music, FirmwareValidation, Paint, Paddle, Notifications, Twos, HeartRate};
}
}
diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp
index 162d0226..b10b1e1a 100644
--- a/src/displayapp/DisplayApp.cpp
+++ b/src/displayapp/DisplayApp.cpp
@@ -1,5 +1,6 @@
#include "DisplayApp.h"
#include <libraries/log/nrf_log.h>
+#include <displayapp/screens/HeartRate.h>
#include "components/battery/BatteryController.h"
#include "components/ble/BleController.h"
#include "components/datetime/DateTimeController.h"
@@ -29,7 +30,8 @@ DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Driver
Controllers::Battery &batteryController, Controllers::Ble &bleController,
Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog,
System::SystemTask &systemTask,
- Pinetime::Controllers::NotificationManager& notificationManager) :
+ Pinetime::Controllers::NotificationManager& notificationManager,
+ Pinetime::Controllers::HeartRateController& heartRateController) :
lcd{lcd},
lvgl{lvgl},
batteryController{batteryController},
@@ -39,7 +41,8 @@ DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Driver
touchPanel{touchPanel},
currentScreen{new Screens::Clock(this, dateTimeController, batteryController, bleController, notificationManager) },
systemTask{systemTask},
- notificationManager{notificationManager} {
+ notificationManager{notificationManager},
+ heartRateController{heartRateController} {
msgQueue = xQueueCreate(queueSize, itemSize);
onClockApp = true;
modal.reset(new Screens::Modal(this));
@@ -211,6 +214,7 @@ void DisplayApp::RunningState() {
case Apps::Music : currentScreen.reset(new Screens::Music(this, systemTask.nimble().music())); break;
case Apps::FirmwareValidation: currentScreen.reset(new Screens::FirmwareValidation(this, validator)); break;
case Apps::Notifications: currentScreen.reset(new Screens::Notifications(this, notificationManager, Screens::Notifications::Modes::Normal)); break;
+ case Apps::HeartRate: currentScreen.reset(new Screens::HeartRate(this, heartRateController)); break;
}
nextApp = Apps::None;
}
diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h
index 25cd2813..da5a7b22 100644
--- a/src/displayapp/DisplayApp.h
+++ b/src/displayapp/DisplayApp.h
@@ -23,6 +23,7 @@ namespace Pinetime {
class Ble;
class DateTime;
class NotificationManager;
+ class HeartRateController;
}
namespace System {
@@ -42,7 +43,8 @@ namespace Pinetime {
Controllers::Battery &batteryController, Controllers::Ble &bleController,
Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog,
System::SystemTask &systemTask,
- Pinetime::Controllers::NotificationManager& notificationManager);
+ Pinetime::Controllers::NotificationManager& notificationManager,
+ Pinetime::Controllers::HeartRateController& heartRateController);
void Start();
void PushMessage(Messages msg);
@@ -87,6 +89,7 @@ namespace Pinetime {
Pinetime::Controllers::NotificationManager& notificationManager;
Pinetime::Controllers::FirmwareValidator validator;
TouchModes touchMode = TouchModes::Gestures;
+ Pinetime::Controllers::HeartRateController& heartRateController;
};
}
}
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<Screen> 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 <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;
+}
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 <cstdint>
+#include <chrono>
+#include "Screen.h"
+#include <bits/unique_ptr.h>
+#include <libs/lvgl/src/lv_core/lv_style.h>
+#include <libs/lvgl/src/lv_core/lv_obj.h>
+
+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;
+
+ };
+ }
+ }
+}