add settings screen to choose heartrate measurement background

This commit is contained in:
Patric Gruber 2023-08-25 02:10:45 +02:00
parent 5dbe1f77b5
commit 27ee1eb2c8
9 changed files with 169 additions and 12 deletions

View file

@ -0,0 +1,85 @@
#include "displayapp/screens/settings/SettingHeartRate.h"
#include <lvgl/lvgl.h>
#include "displayapp/DisplayApp.h"
#include "displayapp/screens/Styles.h"
#include "displayapp/screens/Screen.h"
#include "displayapp/screens/Symbols.h"
#include <array>
#include <algorithm>
using namespace Pinetime::Applications::Screens;
constexpr const char* SettingHeartRate::title;
constexpr const char* SettingHeartRate::symbol;
namespace {
constexpr std::array<uint32_t, 6> intervalOptions = {{
0,
30 * 1000,
60 * 1000,
5 * 60 * 1000,
10 * 60 * 1000,
30 * 60 * 1000,
}};
constexpr std::array<CheckboxList::Item, 8> options = {{
{"Off", true},
{"30s", true},
{"1 min", true},
{"5 min", true},
{"10 min", true},
{"30 min", true},
{"", false},
{"", false},
}};
uint32_t GetDefaultOption(uint32_t currentInterval) {
for (size_t i = 0; i < intervalOptions.size(); i++) {
if (intervalOptions[i] == currentInterval) {
return i;
}
}
return 0;
}
}
auto SettingHeartRate::CreateScreenList() const {
std::array<std::function<std::unique_ptr<Screen>()>, nScreens> screens;
for (size_t i = 0; i < screens.size(); i++) {
screens[i] = [this, i]() -> std::unique_ptr<Screen> {
return CreateScreen(i);
};
}
return screens;
}
SettingHeartRate::SettingHeartRate(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settings)
: app {app}, settings {settings}, screens {app, 0, CreateScreenList(), Screens::ScreenListModes::UpDown} {
}
SettingHeartRate::~SettingHeartRate() {
lv_obj_clean(lv_scr_act());
}
bool SettingHeartRate::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
return screens.OnTouchEvent(event);
}
std::unique_ptr<Screen> SettingHeartRate::CreateScreen(unsigned int screenNum) const {
std::array<Screens::CheckboxList::Item, optionsPerScreen> optionsOnThisScreen;
for (int i = 0; i < optionsPerScreen; i++) {
optionsOnThisScreen[i] = options[screenNum * optionsPerScreen + i];
}
return std::make_unique<Screens::CheckboxList>(
screenNum,
nScreens,
title,
symbol,
GetDefaultOption(settings.GetHeartRateBackgroundMeasurementInterval()),
[&settings = settings](uint32_t index) {
settings.SetHeartRateBackgroundMeasurementInterval(intervalOptions[index]);
settings.SaveSettings();
},
optionsOnThisScreen);
}

View file

@ -0,0 +1,42 @@
#pragma once
#include <cstdint>
#include <lvgl/lvgl.h>
#include "components/settings/Settings.h"
#include "displayapp/screens/ScreenList.h"
#include "displayapp/screens/Screen.h"
#include "displayapp/screens/Symbols.h"
#include "displayapp/screens/CheckboxList.h"
namespace Pinetime {
namespace Applications {
namespace Screens {
class SettingHeartRate : public Screen {
public:
SettingHeartRate(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settings);
~SettingHeartRate() override;
bool OnTouchEvent(TouchEvents event) override;
private:
DisplayApp* app;
auto CreateScreenList() const;
std::unique_ptr<Screen> CreateScreen(unsigned int screenNum) const;
Pinetime::Controllers::Settings& settings;
static constexpr const char* title = "Backg. Interval";
static constexpr const char* symbol = Symbols::heartBeat;
static constexpr int optionsPerScreen = 4;
static constexpr int nScreens = 2;
ScreenList<nScreens> screens;
};
}
}
}

View file

@ -38,6 +38,7 @@ namespace Pinetime {
{Symbols::home, "Watch face", Apps::SettingWatchFace},
{Symbols::shoe, "Steps", Apps::SettingSteps},
{Symbols::heartBeat, "Heartrate", Apps::SettingHeartRate},
{Symbols::clock, "Date&Time", Apps::SettingSetDateTime},
{Symbols::cloudSunRain, "Weather", Apps::SettingWeatherFormat},
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo},
@ -49,9 +50,10 @@ namespace Pinetime {
{Symbols::list, "About", Apps::SysInfo},
// {Symbols::none, "None", Apps::None},
// {Symbols::none, "None", Apps::None},
// {Symbols::none, "None", Apps::None},
{Symbols::none, "None", Apps::None},
{Symbols::none, "None", Apps::None},
{Symbols::none, "None", Apps::None},
// {Symbols::none, "None", Apps::None},
}};