summaryrefslogtreecommitdiff
path: root/src/DisplayApp/Screens
diff options
context:
space:
mode:
authorJF <jf@codingfield.com>2020-08-14 09:46:37 +0200
committerJF <jf@codingfield.com>2020-08-14 09:46:37 +0200
commitf5328ec9eb9d55423b4e511910721d839cacadd8 (patch)
tree8cbc6faf0c87dca43fb33e0dcdaa6ea1e64d0b05 /src/DisplayApp/Screens
parent27fa273d8315f972931dba7971a99b0fbba7360e (diff)
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.
Diffstat (limited to 'src/DisplayApp/Screens')
-rw-r--r--src/DisplayApp/Screens/ApplicationList.cpp80
-rw-r--r--src/DisplayApp/Screens/ApplicationList.h32
-rw-r--r--src/DisplayApp/Screens/Label.h21
-rw-r--r--src/DisplayApp/Screens/ScreenList.h70
-rw-r--r--src/DisplayApp/Screens/Symbols.h4
-rw-r--r--src/DisplayApp/Screens/SystemInfo.cpp (renamed from src/DisplayApp/Screens/ScreenList.cpp)121
-rw-r--r--src/DisplayApp/Screens/SystemInfo.h47
-rw-r--r--src/DisplayApp/Screens/Tile.cpp65
-rw-r--r--src/DisplayApp/Screens/Tile.h41
9 files changed, 302 insertions, 179 deletions
diff --git a/src/DisplayApp/Screens/ApplicationList.cpp b/src/DisplayApp/Screens/ApplicationList.cpp
new file mode 100644
index 00000000..c7c096f4
--- /dev/null
+++ b/src/DisplayApp/Screens/ApplicationList.cpp
@@ -0,0 +1,80 @@
+#include <libs/lvgl/lvgl.h>
+#include <DisplayApp/DisplayApp.h>
+#include <functional>
+#include "ApplicationList.h"
+#include "Tile.h"
+#include "Symbols.h"
+
+using namespace Pinetime::Applications::Screens;
+
+ApplicationList::ApplicationList(Pinetime::Applications::DisplayApp *app) :
+ Screen(app),
+ screens{app, {
+ [this]() -> std::unique_ptr<Screen> { return CreateScreen1(); },
+ //[this]() -> std::unique_ptr<Screen> { return CreateScreen2(); },
+ //[this]() -> std::unique_ptr<Screen> { return CreateScreen3(); }
+ }
+ } {}
+
+
+ApplicationList::~ApplicationList() {
+ lv_obj_clean(lv_scr_act());
+}
+
+bool ApplicationList::Refresh() {
+ if(running)
+ running = screens.Refresh();
+ return running;
+}
+
+bool ApplicationList::OnButtonPushed() {
+ running = false;
+ app->StartApp(Apps::Clock);
+ return true;
+}
+
+bool ApplicationList::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
+ return screens.OnTouchEvent(event);
+}
+
+std::unique_ptr<Screen> ApplicationList::CreateScreen1() {
+ std::array<Screens::Tile::Applications, 6> applications {
+ {{Symbols::asterisk, Apps::Meter},
+ {Symbols::tachometer, Apps::Gauge},
+ {Symbols::clock, Apps::Clock},
+ {Symbols::music, Apps::Music},
+ {Symbols::list, Apps::SysInfo},
+ {Symbols::sun, Apps::Brightness}
+ }
+ };
+
+ return std::unique_ptr<Screen>(new Screens::Tile(app, applications));
+}
+
+std::unique_ptr<Screen> ApplicationList::CreateScreen2() {
+ std::array<Screens::Tile::Applications, 6> applications {
+ {{"0", Apps::Meter},
+ {"1", Apps::Gauge},
+ {"2", Apps::Clock},
+ {"3", Apps::Music},
+ {"4", Apps::SysInfo},
+ {"5", Apps::Brightness}
+ }
+ };
+
+ return std::unique_ptr<Screen>(new Screens::Tile(app, applications));
+}
+
+std::unique_ptr<Screen> ApplicationList::CreateScreen3() {
+ std::array<Screens::Tile::Applications, 6> applications {
+ {{"A", Apps::Meter},
+ {"B", Apps::Gauge},
+ {"C", Apps::Clock},
+ {"D", Apps::Music},
+ {"E", Apps::SysInfo},
+ {"F", Apps::Brightness}
+ }
+ };
+
+ return std::unique_ptr<Screen>(new Screens::Tile(app, applications));
+}
diff --git a/src/DisplayApp/Screens/ApplicationList.h b/src/DisplayApp/Screens/ApplicationList.h
new file mode 100644
index 00000000..372cbb7a
--- /dev/null
+++ b/src/DisplayApp/Screens/ApplicationList.h
@@ -0,0 +1,32 @@
+#pragma once
+
+#include <vector>
+#include <Components/Ble/NimbleController.h>
+#include "Screen.h"
+#include "Label.h"
+#include "ScreenList.h"
+#include "Gauge.h"
+#include "Meter.h"
+#include <functional>
+
+namespace Pinetime {
+ namespace Applications {
+ namespace Screens {
+ class ApplicationList : public Screen {
+ public:
+ explicit ApplicationList(DisplayApp* app);
+ ~ApplicationList() override;
+ bool Refresh() override;
+ bool OnButtonPushed() override;
+ bool OnTouchEvent(TouchEvents event) override;
+ private:
+ bool running = true;
+
+ ScreenList<1> screens;
+ std::unique_ptr<Screen> CreateScreen1();
+ std::unique_ptr<Screen> CreateScreen2();
+ std::unique_ptr<Screen> CreateScreen3();
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DisplayApp/Screens/Label.h b/src/DisplayApp/Screens/Label.h
index b73540f4..9d91974d 100644
--- a/src/DisplayApp/Screens/Label.h
+++ b/src/DisplayApp/Screens/Label.h
@@ -2,6 +2,7 @@
#include <vector>
#include "Screen.h"
+#include <lvgl/lvgl.h>
namespace Pinetime {
namespace Applications {
@@ -19,6 +20,26 @@ namespace Pinetime {
lv_obj_t * label = nullptr;
const char* text = nullptr;
};
+
+ class Label2 : 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());
+ }
+
+ bool Refresh() override {return false;}
+
+ private:
+ lv_obj_t * label = nullptr;
+ const char* text = nullptr;
+ };
}
}
} \ No newline at end of file
diff --git a/src/DisplayApp/Screens/ScreenList.h b/src/DisplayApp/Screens/ScreenList.h
index b0ee016b..d873336d 100644
--- a/src/DisplayApp/Screens/ScreenList.h
+++ b/src/DisplayApp/Screens/ScreenList.h
@@ -2,40 +2,64 @@
#include <vector>
#include <Components/Ble/NimbleController.h>
+#include <functional>
#include "Screen.h"
#include "Label.h"
namespace Pinetime {
namespace Applications {
namespace Screens {
+ template <size_t N>
class ScreenList : public Screen {
public:
- explicit ScreenList(DisplayApp* app,
- Pinetime::Controllers::DateTime& dateTimeController,
- Pinetime::Controllers::Battery& batteryController,
- Pinetime::Controllers::BrightnessController& brightnessController,
- Pinetime::Controllers::Ble& bleController,
- Pinetime::Drivers::WatchdogView& watchdog);
- ~ScreenList() override;
- bool Refresh() override;
- bool OnButtonPushed() override;
- bool OnTouchEvent(TouchEvents event) override;
- private:
- bool running = true;
- uint8_t screenIndex = 0;
+ ScreenList(DisplayApp* app, std::array<std::function<std::unique_ptr<Screen>()>, N>&& screens)
+ : Screen(app), screens{std::move(screens)}, current{this->screens[0]()} {
+
+ }
+
+ ~ScreenList() override {
- // TODO choose another container without dynamic alloc
- std::vector<Screens::Label> screens;
- Pinetime::Controllers::DateTime& dateTimeController;
- Pinetime::Controllers::Battery& batteryController;
- Pinetime::Controllers::BrightnessController& brightnessController;
- Pinetime::Controllers::Ble& bleController;
- Pinetime::Drivers::WatchdogView& watchdog;
+ }
+ bool Refresh() override {
+ running = current->Refresh();
+ return running;
+ }
- char t1[200];
- char t2[200];
- char t3[30];
+ bool OnButtonPushed() override {
+ running = false;
+ return true;
+ }
+
+ bool OnTouchEvent(TouchEvents event) override {
+ switch (event) {
+ case TouchEvents::SwipeDown:
+ if (screenIndex > 0) {
+ current.reset(nullptr);
+ app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down);
+ screenIndex--;
+ current = screens[screenIndex]();
+ }
+ return true;
+ case TouchEvents::SwipeUp:
+ if (screenIndex < screens.size() - 1) {
+ current.reset(nullptr);
+ app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up);
+ screenIndex++;
+ current = screens[screenIndex]();
+ }
+ return true;
+ default:
+ return false;
+ }
+ return false;
+ }
+
+ private:
+ bool running = true;
+ uint8_t screenIndex = 0;
+ std::array<std::function<std::unique_ptr<Screen>()>, N> screens;
+ std::unique_ptr<Screen> current;
};
}
}
diff --git a/src/DisplayApp/Screens/Symbols.h b/src/DisplayApp/Screens/Symbols.h
index 3104db87..940006d5 100644
--- a/src/DisplayApp/Screens/Symbols.h
+++ b/src/DisplayApp/Screens/Symbols.h
@@ -18,6 +18,10 @@ namespace Pinetime {
static constexpr char* info = "\xEF\x84\xA9";
static constexpr char* list = "\xEF\x80\xBA";
static constexpr char* sun = "\xEF\x86\x85";
+ static constexpr char* check = "\xEF\x95\xA0";
+ static constexpr char* music = "\xEF\x80\x81";
+ static constexpr char* tachometer = "\xEF\x8F\xBD";
+ static constexpr char* asterisk = "\xEF\x81\xA9";
}
}
}
diff --git a/src/DisplayApp/Screens/ScreenList.cpp b/src/DisplayApp/Screens/SystemInfo.cpp
index 754d5f7e..e146e2e6 100644
--- a/src/DisplayApp/Screens/ScreenList.cpp
+++ b/src/DisplayApp/Screens/SystemInfo.cpp
@@ -1,29 +1,48 @@
#include <libs/lvgl/lvgl.h>
#include <DisplayApp/DisplayApp.h>
-#include "ScreenList.h"
+#include <functional>
+#include "SystemInfo.h"
#include "../../Version.h"
+#include "Tile.h"
using namespace Pinetime::Applications::Screens;
-// TODO this class must be improved to receive the list of "sub screens" via pointer or
-// move operation.
-// It should accept many type of "sub screen" (it only supports Label for now).
-// The number of sub screen it supports must be dynamic.
-ScreenList::ScreenList(Pinetime::Applications::DisplayApp *app,
- Pinetime::Controllers::DateTime &dateTimeController,
- Pinetime::Controllers::Battery& batteryController,
- Pinetime::Controllers::BrightnessController& brightnessController,
+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) :
+ Pinetime::Drivers::WatchdogView& watchdog) :
Screen(app),
dateTimeController{dateTimeController}, batteryController{batteryController},
- brightnessController{brightnessController}, bleController{bleController}, watchdog{watchdog} {
- screens.reserve(3);
+ brightnessController{brightnessController}, bleController{bleController}, watchdog{watchdog},
+ screens{app, {
+ [this]() -> std::unique_ptr<Screen> { return CreateScreen1(); },
+ [this]() -> std::unique_ptr<Screen> { return CreateScreen2(); },
+ [this]() -> std::unique_ptr<Screen> { return CreateScreen3(); }
+ }
+ } {}
- // TODO all of this is far too heavy (string processing). This should be improved.
- // TODO the info (battery, time,...) should be updated in the Refresh method.
+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<Screen> SystemInfo::CreateScreen1() {
auto batteryPercent = static_cast<int16_t>(batteryController.PercentRemaining());
if(batteryPercent > 100) batteryPercent = 100;
else if(batteryPercent < 0) batteryPercent = 0;
@@ -34,7 +53,7 @@ ScreenList::ScreenList(Pinetime::Applications::DisplayApp *app,
case Controllers::BrightnessController::Levels::Medium: brightness = 2; break;
case Controllers::BrightnessController::Levels::High: brightness = 3; break;
}
- auto resetReason = [&watchdog]() {
+ auto resetReason = [this]() {
switch (watchdog.ResetReason()) {
case Drivers::Watchdog::ResetReasons::Watchdog: return "wtdg";
case Drivers::Watchdog::ResetReasons::HardReset: return "hardr";
@@ -72,68 +91,24 @@ ScreenList::ScreenList(Pinetime::Applications::DisplayApp *app,
"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);
-
- screens.emplace_back(t1);
+ 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<Screen>(new Screens::Label2(app, t1));
+}
+std::unique_ptr<Screen> 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]);
- screens.emplace_back(t2);
-
- strncpy(t3, "Hello from\nthe developper!", 27);
-
- screens.emplace_back(t3);
-
- auto &screen = screens[screenIndex];
- screen.Show();
-}
-
-ScreenList::~ScreenList() {
- lv_obj_clean(lv_scr_act());
+ return std::unique_ptr<Screen>(new Screens::Label2(app, t2));
}
-bool ScreenList::Refresh() {
- auto &screen = screens[screenIndex];
- screen.Refresh();
-
- return running;
-}
-
-bool ScreenList::OnButtonPushed() {
- running = false;
- return true;
-}
-
-bool ScreenList::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
- switch (event) {
- case TouchEvents::SwipeDown:
- if (screenIndex > 0) {
- app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down);
- auto &oldScreen = screens[screenIndex];
- oldScreen.Hide();
- screenIndex--;
- auto &newScreen = screens[screenIndex];
- newScreen.Show();
- }
- return true;
- case TouchEvents::SwipeUp:
- app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up);
- if (screenIndex < screens.size() - 1) {
- auto &oldScreen = screens[screenIndex];
- oldScreen.Hide();
- screenIndex++;
- auto &newScreen = screens[screenIndex];
- newScreen.Show();
- }
- return true;
- default:
- return false;
- }
- return false;
+std::unique_ptr<Screen> SystemInfo::CreateScreen3() {
+ strncpy(t3, "Hello from\nthe developper!", 27);
+ return std::unique_ptr<Screen>(new Screens::Label2(app, t3));
}
diff --git a/src/DisplayApp/Screens/SystemInfo.h b/src/DisplayApp/Screens/SystemInfo.h
new file mode 100644
index 00000000..ac8abae5
--- /dev/null
+++ b/src/DisplayApp/Screens/SystemInfo.h
@@ -0,0 +1,47 @@
+#pragma once
+
+#include <vector>
+#include <Components/Ble/NimbleController.h>
+#include "Screen.h"
+#include "Label.h"
+#include "ScreenList.h"
+#include "Gauge.h"
+#include "Meter.h"
+#include <functional>
+
+namespace Pinetime {
+ namespace Applications {
+ namespace Screens {
+ class SystemInfo : public Screen {
+ public:
+ explicit SystemInfo(DisplayApp* app,
+ Pinetime::Controllers::DateTime& dateTimeController,
+ Pinetime::Controllers::Battery& batteryController,
+ Pinetime::Controllers::BrightnessController& brightnessController,
+ Pinetime::Controllers::Ble& bleController,
+ Pinetime::Drivers::WatchdogView& watchdog);
+ ~SystemInfo() override;
+ bool Refresh() override;
+ bool OnButtonPushed() override;
+ bool OnTouchEvent(TouchEvents event) override;
+ private:
+ bool running = true;
+
+ Pinetime::Controllers::DateTime& dateTimeController;
+ Pinetime::Controllers::Battery& batteryController;
+ Pinetime::Controllers::BrightnessController& brightnessController;
+ Pinetime::Controllers::Ble& bleController;
+ Pinetime::Drivers::WatchdogView& watchdog;
+
+ char t1[200];
+ char t2[200];
+ char t3[30];
+
+ ScreenList<3> screens;
+ std::unique_ptr<Screen> CreateScreen1();
+ std::unique_ptr<Screen> CreateScreen2();
+ std::unique_ptr<Screen> CreateScreen3();
+ };
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DisplayApp/Screens/Tile.cpp b/src/DisplayApp/Screens/Tile.cpp
index c3a9d380..5d4da2cf 100644
--- a/src/DisplayApp/Screens/Tile.cpp
+++ b/src/DisplayApp/Screens/Tile.cpp
@@ -17,9 +17,16 @@ static void event_handler(lv_obj_t * obj, lv_event_t event) {
screen->OnObjectEvent(obj, event, eventData);
}
-static const char * btnm_map1[] = {Symbols::heartBeat, Symbols::shoe, Symbols::clock, "\n", Symbols::info, Symbols::list, Symbols::sun, ""};
-
-Tile::Tile(DisplayApp* app) : Screen(app) {
+Tile::Tile(DisplayApp* app, std::array<Applications, 6>& applications) : Screen(app) {
+ for(int i = 0, appIndex = 0; i < 8; i++) {
+ if(i == 3) btnm_map1[i] = "\n";
+ else if(i == 7) btnm_map1[i] = "";
+ else {
+ btnm_map1[i] = applications[appIndex].icon;
+ apps[appIndex] = applications[appIndex].application;
+ appIndex++;
+ }
+ }
modal.reset(new Modal(app));
btnm1 = lv_btnm_create(lv_scr_act(), NULL);
@@ -41,61 +48,15 @@ bool Tile::Refresh() {
void Tile::OnObjectEvent(lv_obj_t *obj, lv_event_t event, uint32_t buttonId) {
auto* tile = static_cast<Tile*>(obj->user_data);
if(event == LV_EVENT_VALUE_CHANGED) {
- switch(buttonId) {
- case 0:
- tile->StartMeterApp();
- break;
- case 1:
- tile->StartGaugeApp();
- break;
- case 2:
- tile->StartClockApp();
- break;
- case 3:
- char versionStr[20];
- sprintf(versionStr, "VERSION: %d.%d.%d", Version::Major(), Version::Minor(), Version::Patch());
- modal->Show(versionStr);
- break;
- case 4:
- tile->StartSysInfoApp();
- break;
- case 5:
- tile->StartBrightnessApp();
-
- break;
- }
- clickCount++;
+ app->StartApp(apps[buttonId]);
+ running = false;
}
}
bool Tile::OnButtonPushed() {
- app->StartApp(DisplayApp::Apps::Clock);
+ app->StartApp(Apps::Clock);
running = false;
return true;
}
-void Tile::StartClockApp() {
- app->StartApp(DisplayApp::Apps::Clock);
- running = false;
-}
-
-void Tile::StartSysInfoApp() {
- app->StartApp(DisplayApp::Apps::SysInfo);
- running = false;
-}
-
-void Tile::StartBrightnessApp() {
- app->StartApp(DisplayApp::Apps::Brightness);
- running = false;
-}
-
-void Tile::StartMeterApp() {
- app->StartApp(DisplayApp::Apps::Meter);
- running = false;
-}
-
-void Tile::StartGaugeApp() {
- app->StartApp(DisplayApp::Apps::Music);
- running = false;
-}
diff --git a/src/DisplayApp/Screens/Tile.h b/src/DisplayApp/Screens/Tile.h
index a04b58a8..3136d892 100644
--- a/src/DisplayApp/Screens/Tile.h
+++ b/src/DisplayApp/Screens/Tile.h
@@ -5,13 +5,19 @@
#include <bits/unique_ptr.h>
#include "Modal.h"
#include <lvgl/src/lv_core/lv_style.h>
+#include <DisplayApp/Apps.h>
namespace Pinetime {
namespace Applications {
namespace Screens {
class Tile : public Screen {
public:
- explicit Tile(DisplayApp* app);
+ struct Applications {
+ const char* icon;
+ Pinetime::Applications::Apps application;
+ };
+
+ explicit Tile(DisplayApp* app, std::array<Applications, 6>& applications);
~Tile() override;
bool Refresh() override;
@@ -20,40 +26,13 @@ namespace Pinetime {
void OnObjectEvent(lv_obj_t* obj, lv_event_t event, uint32_t buttonId);
private:
-
- lv_style_t* labelRelStyle;
- lv_style_t* labelPrStyle;
- lv_obj_t * label1;
- lv_obj_t * label2;
- lv_obj_t * label3;
-
- lv_obj_t* backgroundLabel;
- lv_obj_t * button;
- lv_obj_t * labelClick;
-
- lv_obj_t *tileview;
- lv_obj_t * tile1;
- lv_obj_t * tile2;
- lv_obj_t * list;
- lv_obj_t * list_btn;
- lv_obj_t * tile3;
- lv_obj_t * btn1;
- lv_obj_t * btn2;
- lv_obj_t * btn3;
-
lv_obj_t * btnm1;
- lv_obj_t * btnm2;
-
- uint32_t clickCount = 0 ;
- uint32_t previousClickCount = 0;
- void StartClockApp();
- void StartSysInfoApp();
- void StartMeterApp();
- void StartGaugeApp();
bool running = true;
std::unique_ptr<Modal> modal;
- void StartBrightnessApp();
+
+ const char* btnm_map1[8];
+ Pinetime::Applications::Apps apps[6];
};
}
}