diff options
Diffstat (limited to 'src/displayapp/widgets')
-rw-r--r-- | src/displayapp/widgets/StatusIcons.cpp | 55 | ||||
-rw-r--r-- | src/displayapp/widgets/StatusIcons.h | 38 |
2 files changed, 93 insertions, 0 deletions
diff --git a/src/displayapp/widgets/StatusIcons.cpp b/src/displayapp/widgets/StatusIcons.cpp new file mode 100644 index 00000000..d8f294b5 --- /dev/null +++ b/src/displayapp/widgets/StatusIcons.cpp @@ -0,0 +1,55 @@ +#include "displayapp/widgets/StatusIcons.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Widgets; + +StatusIcons::StatusIcons(Controllers::Battery& batteryController, Controllers::Ble& bleController) + : batteryController {batteryController}, bleController {bleController} { +} + +void StatusIcons::Align() { + lv_obj_t* lastIcon = batteryIcon.GetObject(); + + for (auto& icon : icons) { + if (!lv_obj_get_hidden(icon)) { + lv_obj_align(icon, lastIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0); + lastIcon = icon; + } + } +} + +void StatusIcons::Create() { + batteryIcon.Create(lv_scr_act()); + lv_obj_align(batteryIcon.GetObject(), lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0); + + icons[Icons::BatteryPlug] = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(icons[Icons::BatteryPlug], LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xFF0000)); + lv_label_set_text_static(icons[Icons::BatteryPlug], Screens::Symbols::plug); + + icons[Icons::BleIcon] = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(icons[Icons::BleIcon], LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x0082FC)); + lv_label_set_text_static(icons[Icons::BleIcon], Screens::Symbols::bluetooth); + + Align(); +} + +void StatusIcons::Update() { + powerPresent = batteryController.IsPowerPresent(); + if (powerPresent.IsUpdated()) { + lv_obj_set_hidden(icons[Icons::BatteryPlug], !powerPresent.Get()); + } + + batteryPercentRemaining = batteryController.PercentRemaining(); + if (batteryPercentRemaining.IsUpdated()) { + auto batteryPercent = batteryPercentRemaining.Get(); + batteryIcon.SetBatteryPercentage(batteryPercent); + } + + bleState = bleController.IsConnected(); + bleRadioEnabled = bleController.IsRadioEnabled(); + if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) { + lv_obj_set_hidden(icons[Icons::BleIcon], !bleState.Get()); + } + + Align(); +} diff --git a/src/displayapp/widgets/StatusIcons.h b/src/displayapp/widgets/StatusIcons.h new file mode 100644 index 00000000..b6e713e2 --- /dev/null +++ b/src/displayapp/widgets/StatusIcons.h @@ -0,0 +1,38 @@ +#pragma once + +#include <lvgl/lvgl.h> + +#include "displayapp/screens/Screen.h" +#include "components/battery/BatteryController.h" +#include "components/ble/BleController.h" +#include "displayapp/screens/BatteryIcon.h" + +namespace Pinetime { + namespace Applications { + namespace Widgets { + class StatusIcons { + public: + StatusIcons(Controllers::Battery& batteryController, Controllers::Ble& bleController); + void Align(); + void Create(); + lv_obj_t* GetObject() { + return batteryIcon.GetObject(); + } + void Update(); + + private: + Screens::BatteryIcon batteryIcon; + Pinetime::Controllers::Battery& batteryController; + Controllers::Ble& bleController; + + Screens::DirtyValue<uint8_t> batteryPercentRemaining {}; + Screens::DirtyValue<bool> powerPresent {}; + Screens::DirtyValue<bool> bleState {}; + Screens::DirtyValue<bool> bleRadioEnabled {}; + + enum Icons { BatteryPlug, BleIcon }; + lv_obj_t* icons[2]; + }; + } + } +} |