diff options
| author | Michele Bini <michele.bini@gmail.com> | 2022-03-30 20:50:42 (GMT) |
|---|---|---|
| committer | Michele Bini <michele.bini@gmail.com> | 2022-03-30 20:50:42 (GMT) |
| commit | 5db030547eeb0aae422447ddb63f0bd2f9d5f384 (patch) | |
| tree | 648bdc9654a3d826eaef1cefaa4b329495016569 /src/displayapp | |
| parent | e1cb4f64097a7d084f178f762546cecb5bd3c6be (diff) | |
Revert "sans heart"ultraredux-heart
This reverts commit 6ef420d2407a4685b56a233f6b0f849e90c6cf49.
Diffstat (limited to 'src/displayapp')
| -rw-r--r-- | src/displayapp/Apps.h | 1 | ||||
| -rw-r--r-- | src/displayapp/DisplayApp.cpp | 7 | ||||
| -rw-r--r-- | src/displayapp/DisplayApp.h | 3 | ||||
| -rw-r--r-- | src/displayapp/DisplayAppRecovery.cpp | 1 | ||||
| -rw-r--r-- | src/displayapp/DisplayAppRecovery.h | 2 | ||||
| -rw-r--r-- | src/displayapp/screens/ApplicationList.cpp | 1 | ||||
| -rw-r--r-- | src/displayapp/screens/Clock.cpp | 3 | ||||
| -rw-r--r-- | src/displayapp/screens/Clock.h | 3 | ||||
| -rw-r--r-- | src/displayapp/screens/HeartRate.cpp | 115 | ||||
| -rw-r--r-- | src/displayapp/screens/HeartRate.h | 40 | ||||
| -rw-r--r-- | src/displayapp/screens/WatchFaceDigital.cpp | 27 | ||||
| -rw-r--r-- | src/displayapp/screens/WatchFaceDigital.h | 7 |
12 files changed, 210 insertions, 0 deletions
diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h index c308c75..56a19ec 100644 --- a/src/displayapp/Apps.h +++ b/src/displayapp/Apps.h @@ -10,6 +10,7 @@ namespace Pinetime { FirmwareValidation, NotificationsPreview, Notifications, + HeartRate, QuickSettings, Settings, SettingTimeFormat, diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 574f964..fe1da06 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -1,5 +1,6 @@ #include "displayapp/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" @@ -68,6 +69,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, Controllers::DateTime& dateTimeController, Drivers::WatchdogView& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::HeartRateController& heartRateController, Controllers::Settings& settingsController, Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::MotionController& motionController, @@ -81,6 +83,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, dateTimeController {dateTimeController}, watchdog {watchdog}, notificationManager {notificationManager}, + heartRateController {heartRateController}, settingsController {settingsController}, motorController {motorController}, motionController {motionController}, @@ -296,6 +299,7 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) bleController, notificationManager, settingsController, + heartRateController, motionController); break; @@ -344,6 +348,9 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) currentScreen = std::make_unique<Screens::SettingDisplay>(this, settingsController); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; + case Apps::HeartRate: + currentScreen = std::make_unique<Screens::HeartRate>(this, heartRateController, *systemTask); + break; } currentApp = app; } diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index b79952d..60db552 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -31,6 +31,7 @@ namespace Pinetime { class Ble; class DateTime; class NotificationManager; + class HeartRateController; class MotionController; class TouchHandler; } @@ -52,6 +53,7 @@ namespace Pinetime { Controllers::DateTime& dateTimeController, Drivers::WatchdogView& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::HeartRateController& heartRateController, Controllers::Settings& settingsController, Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::MotionController& motionController, @@ -76,6 +78,7 @@ namespace Pinetime { Pinetime::Drivers::WatchdogView& watchdog; Pinetime::System::SystemTask* systemTask = nullptr; Pinetime::Controllers::NotificationManager& notificationManager; + Pinetime::Controllers::HeartRateController& heartRateController; Pinetime::Controllers::Settings& settingsController; Pinetime::Controllers::MotorController& motorController; Pinetime::Controllers::MotionController& motionController; diff --git a/src/displayapp/DisplayAppRecovery.cpp b/src/displayapp/DisplayAppRecovery.cpp index a33308f..f577679 100644 --- a/src/displayapp/DisplayAppRecovery.cpp +++ b/src/displayapp/DisplayAppRecovery.cpp @@ -17,6 +17,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd, Controllers::DateTime& dateTimeController, Drivers::WatchdogView& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::HeartRateController& heartRateController, Controllers::Settings& settingsController, Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::MotionController& motionController, diff --git a/src/displayapp/DisplayAppRecovery.h b/src/displayapp/DisplayAppRecovery.h index 8f25cbe..4e383e2 100644 --- a/src/displayapp/DisplayAppRecovery.h +++ b/src/displayapp/DisplayAppRecovery.h @@ -28,6 +28,7 @@ namespace Pinetime { class Ble; class DateTime; class NotificationManager; + class HeartRateController; class MotionController; class TouchHandler; class MotorController; @@ -50,6 +51,7 @@ namespace Pinetime { Controllers::DateTime& dateTimeController, Drivers::WatchdogView& watchdog, Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::HeartRateController& heartRateController, Controllers::Settings& settingsController, Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::MotionController& motionController, diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp index b7c8ebd..c8d608a 100644 --- a/src/displayapp/screens/ApplicationList.cpp +++ b/src/displayapp/screens/ApplicationList.cpp @@ -37,6 +37,7 @@ bool ApplicationList::OnTouchEvent(Pinetime::Applications::TouchEvents event) { std::unique_ptr<Screen> ApplicationList::CreateScreen1() { std::array<Screens::Tile::Applications, 6> applications {{ {Symbols::clock}, + {Symbols::heartBeat, Apps::HeartRate}, }}; return std::make_unique<Screens::Tile>(0, 1, app, settingsController, batteryController, dateTimeController, applications); diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index f390eed..0e9be3f 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -18,6 +18,7 @@ Clock::Clock(DisplayApp* app, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController) : Screen(app), dateTimeController {dateTimeController}, @@ -25,6 +26,7 @@ Clock::Clock(DisplayApp* app, bleController {bleController}, notificatioManager {notificatioManager}, settingsController {settingsController}, + heartRateController {heartRateController}, motionController {motionController}, screen {[this, &settingsController]() { switch (settingsController.GetClockFace()) { @@ -56,6 +58,7 @@ std::unique_ptr<Screen> Clock::WatchFaceDigitalScreen() { bleController, notificatioManager, settingsController, + heartRateController, motionController); } diff --git a/src/displayapp/screens/Clock.h b/src/displayapp/screens/Clock.h index 8d1a5b2..4ea1045 100644 --- a/src/displayapp/screens/Clock.h +++ b/src/displayapp/screens/Clock.h @@ -4,6 +4,7 @@ #include <chrono> #include <cstdint> #include <memory> +#include <components/heartrate/HeartRateController.h> #include "displayapp/screens/Screen.h" #include "components/datetime/DateTimeController.h" @@ -26,6 +27,7 @@ namespace Pinetime { Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController); ~Clock() override; @@ -38,6 +40,7 @@ namespace Pinetime { Controllers::Ble& bleController; Controllers::NotificationManager& notificatioManager; Controllers::Settings& settingsController; + Controllers::HeartRateController& heartRateController; Controllers::MotionController& motionController; std::unique_ptr<Screen> screen; diff --git a/src/displayapp/screens/HeartRate.cpp b/src/displayapp/screens/HeartRate.cpp new file mode 100644 index 0000000..513c40b --- /dev/null +++ b/src/displayapp/screens/HeartRate.cpp @@ -0,0 +1,115 @@ +#include "displayapp/screens/HeartRate.h" +#include <lvgl/lvgl.h> +#include <components/heartrate/HeartRateController.h> + +#include "displayapp/DisplayApp.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + 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..."; + case Pinetime::Controllers::HeartRateController::States::Stopped: + return "Stopped"; + } + return ""; + } + + static void btnStartStopEventHandler(lv_obj_t* obj, lv_event_t event) { + HeartRate* screen = static_cast<HeartRate*>(obj->user_data); + screen->OnStartStopEvent(event); + } +} + +HeartRate::HeartRate(Pinetime::Applications::DisplayApp* app, + Controllers::HeartRateController& heartRateController, + System::SystemTask& systemTask) + : Screen(app), heartRateController {heartRateController}, systemTask {systemTask} { + bool isHrRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; + label_hr = lv_label_create(lv_scr_act(), nullptr); + + lv_obj_set_style_local_text_font(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); + + if (isHrRunning) + lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); + else + lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + + lv_label_set_text(label_hr, "000"); + lv_obj_align(label_hr, nullptr, LV_ALIGN_CENTER, 0, -40); + + label_bpm = lv_label_create(lv_scr_act(), nullptr); + 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(), nullptr); + lv_obj_set_style_local_text_color(label_status, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x222222)); + lv_label_set_text(label_status, ToString(Pinetime::Controllers::HeartRateController::States::NotEnoughData)); + + lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); + + btn_startStop = lv_btn_create(lv_scr_act(), nullptr); + btn_startStop->user_data = this; + lv_obj_set_height(btn_startStop, 50); + lv_obj_set_event_cb(btn_startStop, btnStartStopEventHandler); + lv_obj_align(btn_startStop, nullptr, LV_ALIGN_IN_BOTTOM_MID, 0, 0); + + label_startStop = lv_label_create(btn_startStop, nullptr); + UpdateStartStopButton(isHrRunning); + if (isHrRunning) + systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping); + + taskRefresh = lv_task_create(RefreshTaskCallback, 100, LV_TASK_PRIO_MID, this); +} + +HeartRate::~HeartRate() { + lv_task_del(taskRefresh); + lv_obj_clean(lv_scr_act()); + systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping); +} + +void HeartRate::Refresh() { + + auto state = heartRateController.State(); + switch (state) { + case Controllers::HeartRateController::States::NoTouch: + case Controllers::HeartRateController::States::NotEnoughData: + // case Controllers::HeartRateController::States::Stopped: + lv_label_set_text(label_hr, "000"); + break; + default: + lv_label_set_text_fmt(label_hr, "%03d", heartRateController.HeartRate()); + } + + lv_label_set_text(label_status, ToString(state)); + lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); +} + +void HeartRate::OnStartStopEvent(lv_event_t event) { + if (event == LV_EVENT_CLICKED) { + if (heartRateController.State() == Controllers::HeartRateController::States::Stopped) { + heartRateController.Start(); + UpdateStartStopButton(heartRateController.State() != Controllers::HeartRateController::States::Stopped); + systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping); + lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); + } else { + heartRateController.Stop(); + UpdateStartStopButton(heartRateController.State() != Controllers::HeartRateController::States::Stopped); + systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping); + lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); + } + } +} + +void HeartRate::UpdateStartStopButton(bool isRunning) { + if (isRunning) + lv_label_set_text(label_startStop, "Stop"); + else + lv_label_set_text(label_startStop, "Start"); +} diff --git a/src/displayapp/screens/HeartRate.h b/src/displayapp/screens/HeartRate.h new file mode 100644 index 0000000..2ad0035 --- /dev/null +++ b/src/displayapp/screens/HeartRate.h @@ -0,0 +1,40 @@ +#pragma once + +#include <cstdint> +#include <chrono> +#include "displayapp/screens/Screen.h" +#include "systemtask/SystemTask.h" +#include <lvgl/src/lv_core/lv_style.h> +#include <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, System::SystemTask& systemTask); + ~HeartRate() override; + + void Refresh() override; + + void OnStartStopEvent(lv_event_t event); + + private: + Controllers::HeartRateController& heartRateController; + Pinetime::System::SystemTask& systemTask; + void UpdateStartStopButton(bool isRunning); + lv_obj_t* label_hr; + lv_obj_t* label_bpm; + lv_obj_t* label_status; + lv_obj_t* btn_startStop; + lv_obj_t* label_startStop; + + lv_task_t* taskRefresh; + }; + } + } +} diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 7c57d15..6048c60 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -10,6 +10,7 @@ #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" +#include "components/heartrate/HeartRateController.h" #include "components/motion/MotionController.h" #include "components/settings/Settings.h" using namespace Pinetime::Applications::Screens; @@ -20,6 +21,7 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController) : Screen(app), currentDateTime {{}}, @@ -28,6 +30,7 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, bleController {bleController}, notificatioManager {notificatioManager}, settingsController {settingsController}, + heartRateController {heartRateController}, motionController {motionController} { batteryIcon = lv_label_create(lv_scr_act(), nullptr); @@ -76,6 +79,16 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, lv_obj_set_pos(backgroundLabel, 0, 0); lv_label_set_text_static(backgroundLabel, ""); + heartbeatIcon = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(heartbeatIcon, Symbols::heartBeat); + lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B)); + lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); + + heartbeatValue = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(heartbeatValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B)); + lv_label_set_text_static(heartbeatValue, ""); + lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0); + taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); Refresh(); } @@ -174,4 +187,18 @@ void WatchFaceDigital::Refresh() { } } + heartbeat = heartRateController.HeartRate(); + heartbeatRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; + if (heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) { + if (heartbeatRunning.Get()) { + lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B)); + lv_label_set_text_fmt(heartbeatValue, "%d", heartbeat.Get()); + } else { + lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x1B1B1B)); + lv_label_set_text_static(heartbeatValue, ""); + } + + lv_obj_realign(heartbeatIcon); + lv_obj_realign(heartbeatValue); + } } diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index eb95e6f..50b646f 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -14,6 +14,7 @@ namespace Pinetime { class Battery; class Ble; class NotificationManager; + class HeartRateController; class MotionController; } @@ -28,6 +29,7 @@ namespace Pinetime { Controllers::Ble& bleController, Controllers::NotificationManager& notificatioManager, Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, Controllers::MotionController& motionController); ~WatchFaceDigital() override; @@ -50,6 +52,8 @@ namespace Pinetime { DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {}; DirtyValue<bool> motionSensorOk {}; DirtyValue<uint32_t> stepCount {}; + DirtyValue<uint8_t> heartbeat {}; + DirtyValue<bool> heartbeatRunning {}; DirtyValue<bool> notificationState {}; lv_obj_t* label_time; @@ -59,6 +63,8 @@ namespace Pinetime { lv_obj_t* batteryIcon; lv_obj_t* bleIcon; lv_obj_t* batteryPlug; + lv_obj_t* heartbeatIcon; + lv_obj_t* heartbeatValue; lv_obj_t* stepIcon; lv_obj_t* stepValue; lv_obj_t* notificationIcon; @@ -68,6 +74,7 @@ namespace Pinetime { Controllers::Ble& bleController; Controllers::NotificationManager& notificatioManager; Controllers::Settings& settingsController; + Controllers::HeartRateController& heartRateController; Controllers::MotionController& motionController; lv_task_t* taskRefresh; |
