From f5328ec9eb9d55423b4e511910721d839cacadd8 Mon Sep 17 00:00:00 2001 From: JF Date: Fri, 14 Aug 2020 09:46:37 +0200 Subject: Refactor ScreenList to make it more generic : it can now contain any Screen type. Integrate this new ScreenList in SystemInfo. Add ApplicationList, which is a ScreenList of Tile. This allows to display a menu of more than 6 applications. --- src/DisplayApp/Screens/SystemInfo.cpp | 114 ++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 src/DisplayApp/Screens/SystemInfo.cpp (limited to 'src/DisplayApp/Screens/SystemInfo.cpp') diff --git a/src/DisplayApp/Screens/SystemInfo.cpp b/src/DisplayApp/Screens/SystemInfo.cpp new file mode 100644 index 00000000..e146e2e6 --- /dev/null +++ b/src/DisplayApp/Screens/SystemInfo.cpp @@ -0,0 +1,114 @@ +#include +#include +#include +#include "SystemInfo.h" +#include "../../Version.h" +#include "Tile.h" + +using namespace Pinetime::Applications::Screens; + +SystemInfo::SystemInfo(Pinetime::Applications::DisplayApp *app, + Pinetime::Controllers::DateTime &dateTimeController, + Pinetime::Controllers::Battery& batteryController, + Pinetime::Controllers::BrightnessController& brightnessController, + Pinetime::Controllers::Ble& bleController, + Pinetime::Drivers::WatchdogView& watchdog) : + Screen(app), + dateTimeController{dateTimeController}, batteryController{batteryController}, + brightnessController{brightnessController}, bleController{bleController}, watchdog{watchdog}, + screens{app, { + [this]() -> std::unique_ptr { return CreateScreen1(); }, + [this]() -> std::unique_ptr { return CreateScreen2(); }, + [this]() -> std::unique_ptr { return CreateScreen3(); } + } + } {} + + +SystemInfo::~SystemInfo() { + lv_obj_clean(lv_scr_act()); +} + +bool SystemInfo::Refresh() { + screens.Refresh(); + return running; +} + +bool SystemInfo::OnButtonPushed() { + running = false; + return true; +} + +bool SystemInfo::OnTouchEvent(Pinetime::Applications::TouchEvents event) { + return screens.OnTouchEvent(event); +} + +std::unique_ptr SystemInfo::CreateScreen1() { + auto batteryPercent = static_cast(batteryController.PercentRemaining()); + if(batteryPercent > 100) batteryPercent = 100; + else if(batteryPercent < 0) batteryPercent = 0; + + uint8_t brightness = 0; + switch(brightnessController.Level()) { + case Controllers::BrightnessController::Levels::Low: brightness = 1; break; + case Controllers::BrightnessController::Levels::Medium: brightness = 2; break; + case Controllers::BrightnessController::Levels::High: brightness = 3; break; + } + auto resetReason = [this]() { + switch (watchdog.ResetReason()) { + case Drivers::Watchdog::ResetReasons::Watchdog: return "wtdg"; + case Drivers::Watchdog::ResetReasons::HardReset: return "hardr"; + case Drivers::Watchdog::ResetReasons::NFC: return "nfc"; + case Drivers::Watchdog::ResetReasons::SoftReset: return "softr"; + case Drivers::Watchdog::ResetReasons::CpuLockup: return "cpulock"; + case Drivers::Watchdog::ResetReasons::SystemOff: return "off"; + case Drivers::Watchdog::ResetReasons::LpComp: return "lpcomp"; + case Drivers::Watchdog::ResetReasons::DebugInterface: return "dbg"; + case Drivers::Watchdog::ResetReasons::ResetPin: return "rst"; + default: return "?"; + } + }(); + + // uptime + static constexpr uint32_t secondsInADay = 60*60*24; + static constexpr uint32_t secondsInAnHour = 60*60; + static constexpr uint32_t secondsInAMinute = 60; + uint32_t uptimeSeconds = dateTimeController.Uptime().count(); + uint32_t uptimeDays = (uptimeSeconds / secondsInADay); + uptimeSeconds = uptimeSeconds % secondsInADay; + uint32_t uptimeHours = uptimeSeconds / secondsInAnHour; + uptimeSeconds = uptimeSeconds % secondsInAnHour; + uint32_t uptimeMinutes = uptimeSeconds / secondsInAMinute; + uptimeSeconds = uptimeSeconds % secondsInAMinute; + // TODO handle more than 100 days of uptime + + sprintf(t1, "Pinetime\n" + "Version:%d.%d.%d\n" + "Build: %s\n" + " %s\n" + "Date: %02d/%02d/%04d\n" + "Time: %02d:%02d:%02d\n" + "Uptime: %02lud %02lu:%02lu:%02lu\n" + "Battery: %d%%\n" + "Backlight: %d/3\n" + "Last reset: %s\n", + Version::Major(), Version::Minor(), Version::Patch(), + __DATE__, __TIME__, + dateTimeController.Day(), dateTimeController.Month(), dateTimeController.Year(), + dateTimeController.Hours(), dateTimeController.Minutes(), dateTimeController.Seconds(), + uptimeDays, uptimeHours, uptimeMinutes, uptimeSeconds, + batteryPercent, brightness, resetReason); + + return std::unique_ptr(new Screens::Label2(app, t1)); +} + +std::unique_ptr SystemInfo::CreateScreen2() { + auto& bleAddr = bleController.Address(); + sprintf(t2, "BLE MAC: \n %2x:%2x:%2x:%2x:%2x:%2x", + bleAddr[5], bleAddr[4], bleAddr[3], bleAddr[2], bleAddr[1], bleAddr[0]); + return std::unique_ptr(new Screens::Label2(app, t2)); +} + +std::unique_ptr SystemInfo::CreateScreen3() { + strncpy(t3, "Hello from\nthe developper!", 27); + return std::unique_ptr(new Screens::Label2(app, t3)); +} -- cgit v1.2.3-70-g09d2 From 6c678e872d51247f5e47730218598209e96bdd0a Mon Sep 17 00:00:00 2001 From: JF Date: Fri, 14 Aug 2020 10:05:44 +0200 Subject: Screens::Label is now a subclass of Screen. --- src/DisplayApp/Screens/Label.cpp | 17 ++--------------- src/DisplayApp/Screens/Label.h | 28 +++------------------------- src/DisplayApp/Screens/SystemInfo.cpp | 6 +++--- 3 files changed, 8 insertions(+), 43 deletions(-) (limited to 'src/DisplayApp/Screens/SystemInfo.cpp') diff --git a/src/DisplayApp/Screens/Label.cpp b/src/DisplayApp/Screens/Label.cpp index ba35279d..780ee88e 100644 --- a/src/DisplayApp/Screens/Label.cpp +++ b/src/DisplayApp/Screens/Label.cpp @@ -3,26 +3,13 @@ using namespace Pinetime::Applications::Screens; - -Label::Label(const char* text) : text{text} { - -} - -Label::~Label() { - -} - -void Label::Refresh() { - -} - -void Label::Show() { +Label::Label(Pinetime::Applications::DisplayApp *app, const char *text) : Screen(app), text{text} { label = lv_label_create(lv_scr_act(), NULL); lv_label_set_align(label, LV_LABEL_ALIGN_LEFT); lv_obj_set_size(label, 240, 240); lv_label_set_text(label, text); } -void Label::Hide() { +Label::~Label() { lv_obj_clean(lv_scr_act()); } diff --git a/src/DisplayApp/Screens/Label.h b/src/DisplayApp/Screens/Label.h index 9d91974d..3e7b3797 100644 --- a/src/DisplayApp/Screens/Label.h +++ b/src/DisplayApp/Screens/Label.h @@ -7,33 +7,11 @@ namespace Pinetime { namespace Applications { namespace Screens { - class Label { - public: - Label() = default; - explicit Label(const char* text); - ~Label(); - void Refresh(); - - void Hide(); - void Show(); - private: - lv_obj_t * label = nullptr; - const char* text = nullptr; - }; - class Label2 : public Screen { + class Label : public Screen { public: - Label2(DisplayApp* app, const char* text) : Screen(app), text{text} { - label = lv_label_create(lv_scr_act(), NULL); - lv_label_set_align(label, LV_LABEL_ALIGN_LEFT); - lv_obj_set_size(label, 240, 240); - lv_label_set_text(label, text); - } - - ~Label2() override { - lv_obj_clean(lv_scr_act()); - } - + Label(DisplayApp* app, const char* text); + ~Label() override; bool Refresh() override {return false;} private: diff --git a/src/DisplayApp/Screens/SystemInfo.cpp b/src/DisplayApp/Screens/SystemInfo.cpp index e146e2e6..b355f419 100644 --- a/src/DisplayApp/Screens/SystemInfo.cpp +++ b/src/DisplayApp/Screens/SystemInfo.cpp @@ -98,17 +98,17 @@ std::unique_ptr SystemInfo::CreateScreen1() { uptimeDays, uptimeHours, uptimeMinutes, uptimeSeconds, batteryPercent, brightness, resetReason); - return std::unique_ptr(new Screens::Label2(app, t1)); + return std::unique_ptr(new Screens::Label(app, t1)); } std::unique_ptr SystemInfo::CreateScreen2() { auto& bleAddr = bleController.Address(); sprintf(t2, "BLE MAC: \n %2x:%2x:%2x:%2x:%2x:%2x", bleAddr[5], bleAddr[4], bleAddr[3], bleAddr[2], bleAddr[1], bleAddr[0]); - return std::unique_ptr(new Screens::Label2(app, t2)); + return std::unique_ptr(new Screens::Label(app, t2)); } std::unique_ptr SystemInfo::CreateScreen3() { strncpy(t3, "Hello from\nthe developper!", 27); - return std::unique_ptr(new Screens::Label2(app, t3)); + return std::unique_ptr(new Screens::Label(app, t3)); } -- cgit v1.2.3-70-g09d2