Add Timer's Time Remaining to the StatusIcons bar

When a timer is active the time remaining will be displayed in the
StatusIcons bar along with an hour glass symbol, and will be set to
hidden when the timer's off.
This commit is contained in:
JustScott 2024-01-14 15:34:48 -06:00
parent a2356f2f4a
commit da482bab9a
13 changed files with 65 additions and 18 deletions

View file

@ -11,7 +11,7 @@ void Timer::StartTimer(std::chrono::milliseconds duration) {
xTimerStart(timer, 0);
}
std::chrono::milliseconds Timer::GetTimeRemaining() {
std::chrono::milliseconds Timer::GetTimeRemaining() const {
if (IsRunning()) {
TickType_t remainingTime = xTimerGetExpiryTime(timer) - xTaskGetTickCount();
return std::chrono::milliseconds(remainingTime * 1000 / configTICK_RATE_HZ);
@ -23,6 +23,6 @@ void Timer::StopTimer() {
xTimerStop(timer, 0);
}
bool Timer::IsRunning() {
bool Timer::IsRunning() const {
return (xTimerIsTimerActive(timer) == pdTRUE);
}

View file

@ -15,9 +15,9 @@ namespace Pinetime {
void StopTimer();
std::chrono::milliseconds GetTimeRemaining();
std::chrono::milliseconds GetTimeRemaining() const;
bool IsRunning();
bool IsRunning() const;
private:
TimerHandle_t timer;

View file

@ -505,6 +505,7 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio
batteryController,
bleController,
dateTimeController,
timer,
filesystem,
std::move(apps));
} break;
@ -558,7 +559,8 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio
brightnessController,
motorController,
settingsController,
bleController);
bleController,
timer);
break;
case Apps::Settings:
currentScreen = std::make_unique<Screens::Settings>(this, settingsController);

View file

@ -22,6 +22,7 @@ ApplicationList::ApplicationList(DisplayApp* app,
const Pinetime::Controllers::Battery& batteryController,
const Pinetime::Controllers::Ble& bleController,
Controllers::DateTime& dateTimeController,
Controllers::Timer& timer,
Pinetime::Controllers::FS& filesystem,
std::array<Tile::Applications, UserAppTypes::Count>&& apps)
: app {app},
@ -29,6 +30,7 @@ ApplicationList::ApplicationList(DisplayApp* app,
batteryController {batteryController},
bleController {bleController},
dateTimeController {dateTimeController},
timer {timer},
filesystem {filesystem},
apps {std::move(apps)},
screens {app, settingsController.GetAppMenu(), CreateScreenList(), Screens::ScreenListModes::UpDown} {
@ -60,5 +62,6 @@ std::unique_ptr<Screen> ApplicationList::CreateScreen(unsigned int screenNum) co
batteryController,
bleController,
dateTimeController,
pageApps);
pageApps,
timer);
}

View file

@ -19,6 +19,7 @@ namespace Pinetime {
const Pinetime::Controllers::Battery& batteryController,
const Pinetime::Controllers::Ble& bleController,
Controllers::DateTime& dateTimeController,
Pinetime::Controllers::Timer& timer,
Pinetime::Controllers::FS& filesystem,
std::array<Tile::Applications, UserAppTypes::Count>&& apps);
~ApplicationList() override;
@ -33,6 +34,7 @@ namespace Pinetime {
const Pinetime::Controllers::Battery& batteryController;
const Pinetime::Controllers::Ble& bleController;
Controllers::DateTime& dateTimeController;
Pinetime::Controllers::Timer& timer;
Pinetime::Controllers::FS& filesystem;
std::array<Tile::Applications, UserAppTypes::Count> apps;

View file

@ -30,8 +30,12 @@ Tile::Tile(uint8_t screenID,
const Controllers::Battery& batteryController,
const Controllers::Ble& bleController,
Controllers::DateTime& dateTimeController,
std::array<Applications, 6>& applications)
: app {app}, dateTimeController {dateTimeController}, pageIndicator(screenID, numScreens), statusIcons(batteryController, bleController) {
std::array<Applications, 6>& applications,
Controllers::Timer& timer)
: app {app},
dateTimeController {dateTimeController},
pageIndicator(screenID, numScreens),
statusIcons(batteryController, bleController, timer) {
settingsController.SetAppMenu(screenID);
@ -83,7 +87,7 @@ Tile::Tile(uint8_t screenID,
btnm1->user_data = this;
lv_obj_set_event_cb(btnm1, event_handler);
taskUpdate = lv_task_create(lv_update_task, 5000, LV_TASK_PRIO_MID, this);
taskUpdate = lv_task_create(lv_update_task, 500, LV_TASK_PRIO_MID, this);
UpdateScreen();
}

View file

@ -29,7 +29,8 @@ namespace Pinetime {
const Controllers::Battery& batteryController,
const Controllers::Ble& bleController,
Controllers::DateTime& dateTimeController,
std::array<Applications, 6>& applications);
std::array<Applications, 6>& applications,
Controllers::Timer& timer);
~Tile() override;

View file

@ -18,6 +18,7 @@ using namespace Pinetime::Applications::Screens;
WatchFaceDigital::WatchFaceDigital(Controllers::DateTime& dateTimeController,
const Controllers::Battery& batteryController,
const Controllers::Ble& bleController,
const Controllers::Timer& timer,
Controllers::NotificationManager& notificationManager,
Controllers::Settings& settingsController,
Controllers::HeartRateController& heartRateController,
@ -30,7 +31,7 @@ WatchFaceDigital::WatchFaceDigital(Controllers::DateTime& dateTimeController,
heartRateController {heartRateController},
motionController {motionController},
weatherService {weatherService},
statusIcons(batteryController, bleController) {
statusIcons(batteryController, bleController, timer) {
statusIcons.Create();

View file

@ -20,6 +20,7 @@ namespace Pinetime {
class NotificationManager;
class HeartRateController;
class MotionController;
class Timer;
}
namespace Applications {
@ -30,6 +31,7 @@ namespace Pinetime {
WatchFaceDigital(Controllers::DateTime& dateTimeController,
const Controllers::Battery& batteryController,
const Controllers::Ble& bleController,
const Controllers::Timer& timer,
Controllers::NotificationManager& notificationManager,
Controllers::Settings& settingsController,
Controllers::HeartRateController& heartRateController,
@ -84,6 +86,7 @@ namespace Pinetime {
return new Screens::WatchFaceDigital(controllers.dateTimeController,
controllers.batteryController,
controllers.bleController,
controllers.timer,
controllers.notificationManager,
controllers.settingsController,
controllers.heartRateController,

View file

@ -33,13 +33,14 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app,
Controllers::BrightnessController& brightness,
Controllers::MotorController& motorController,
Pinetime::Controllers::Settings& settingsController,
const Controllers::Ble& bleController)
const Controllers::Ble& bleController,
const Controllers::Timer& timer)
: app {app},
dateTimeController {dateTimeController},
brightness {brightness},
motorController {motorController},
settingsController {settingsController},
statusIcons(batteryController, bleController) {
statusIcons(batteryController, bleController, timer) {
statusIcons.Create();
@ -118,7 +119,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app,
lv_obj_set_style_local_text_font(lbl_btn, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48);
lv_label_set_text_static(lbl_btn, Symbols::settings);
taskUpdate = lv_task_create(lv_update_task, 5000, LV_TASK_PRIO_MID, this);
taskUpdate = lv_task_create(lv_update_task, 500, LV_TASK_PRIO_MID, this);
UpdateScreen();
}

View file

@ -23,7 +23,8 @@ namespace Pinetime {
Controllers::BrightnessController& brightness,
Controllers::MotorController& motorController,
Pinetime::Controllers::Settings& settingsController,
const Controllers::Ble& bleController);
const Controllers::Ble& bleController,
const Controllers::Timer& timer);
~QuickSettings() override;

View file

@ -3,11 +3,23 @@
using namespace Pinetime::Applications::Widgets;
StatusIcons::StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController)
: batteryIcon(true), batteryController {batteryController}, bleController {bleController} {
StatusIcons::StatusIcons(const Controllers::Battery& batteryController,
const Controllers::Ble& bleController,
const Controllers::Timer& timer)
: batteryIcon(true), batteryController {batteryController}, bleController {bleController}, timer {timer} {
}
void StatusIcons::Create() {
timerIcon = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(timerIcon, Screens::Symbols::hourGlass);
lv_obj_set_style_local_text_color(timerIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999));
lv_obj_align(timerIcon, lv_scr_act(), LV_ALIGN_IN_TOP_MID, -32, 0);
timeRemaining = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(timeRemaining, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999));
lv_label_set_text(timeRemaining, "00:00");
lv_obj_align(timeRemaining, nullptr, LV_ALIGN_IN_TOP_MID, 10, 0);
container = lv_cont_create(lv_scr_act(), nullptr);
lv_cont_set_layout(container, LV_LAYOUT_ROW_TOP);
lv_cont_set_fit(container, LV_FIT_TIGHT);
@ -26,6 +38,20 @@ void StatusIcons::Create() {
}
void StatusIcons::Update() {
if (timer.IsRunning()) {
auto secondsRemaining = std::chrono::duration_cast<std::chrono::seconds>(timer.GetTimeRemaining());
uint8_t minutes = secondsRemaining.count() / 60;
uint8_t seconds = secondsRemaining.count() % 60;
lv_label_set_text_fmt(timeRemaining, "%02d:%02d", minutes, seconds);
lv_obj_set_hidden(timeRemaining, false);
lv_obj_set_hidden(timerIcon, false);
} else {
lv_obj_set_hidden(timeRemaining, true);
lv_obj_set_hidden(timerIcon, true);
}
powerPresent = batteryController.IsPowerPresent();
if (powerPresent.IsUpdated()) {
lv_obj_set_hidden(batteryPlug, !powerPresent.Get());

View file

@ -13,7 +13,7 @@ namespace Pinetime {
namespace Widgets {
class StatusIcons {
public:
StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController);
StatusIcons(const Controllers::Battery& batteryController, const Controllers::Ble& bleController, const Controllers::Timer& timer);
void Align();
void Create();
@ -27,12 +27,15 @@ namespace Pinetime {
Screens::BatteryIcon batteryIcon;
const Pinetime::Controllers::Battery& batteryController;
const Controllers::Ble& bleController;
const Controllers::Timer& timer;
Utility::DirtyValue<uint8_t> batteryPercentRemaining {};
Utility::DirtyValue<bool> powerPresent {};
Utility::DirtyValue<bool> bleState {};
Utility::DirtyValue<bool> bleRadioEnabled {};
lv_obj_t* timerIcon;
lv_obj_t* timeRemaining;
lv_obj_t* bleIcon;
lv_obj_t* batteryPlug;
lv_obj_t* container;