diff --git a/CMakeLists.txt b/CMakeLists.txt index 83c6e98db8..9f95edadda 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,7 +5,7 @@ set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose Debug or Release") project(pinetime VERSION 1.13.0 LANGUAGES C CXX ASM) set(CMAKE_C_STANDARD 99) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) # set(CMAKE_GENERATOR "Unix Makefiles") set(CMAKE_C_EXTENSIONS OFF) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8e8e96863b..ea2dfe9c3e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -598,6 +598,7 @@ set(INCLUDE_FILES displayapp/Messages.h displayapp/TouchEvents.h displayapp/screens/Screen.h + displayapp/screens/AppController.h displayapp/screens/Clock.h displayapp/screens/Tile.h displayapp/screens/InfiniPaint.h diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h index f253bc0387..10de7bb184 100644 --- a/src/displayapp/Apps.h +++ b/src/displayapp/Apps.h @@ -2,7 +2,7 @@ namespace Pinetime { namespace Applications { - enum class Apps { + enum class Apps : uint8_t { None, Launcher, Clock, @@ -18,7 +18,6 @@ namespace Pinetime { Music, Paint, Paddle, - Twos, HeartRate, Navigation, StopWatch, @@ -37,7 +36,8 @@ namespace Pinetime { SettingChimes, SettingShakeThreshold, SettingBluetooth, - Error + Error, + Dynamic, }; } } diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index a930fe961c..e7833e1e64 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -107,9 +107,9 @@ void DisplayApp::Start(System::BootErrors error) { lvgl.Init(); if (error == System::BootErrors::TouchController) { - LoadNewScreen(Apps::Error, DisplayApp::FullRefreshDirections::None); + LoadNewScreen(static_cast(Apps::Error), DisplayApp::FullRefreshDirections::None); } else { - LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::None); + LoadNewScreen(static_cast(Apps::Clock), DisplayApp::FullRefreshDirections::None); } if (pdPASS != xTaskCreate(DisplayApp::Process, "displayapp", 800, this, 0, &taskHandle)) { @@ -240,31 +240,31 @@ void DisplayApp::Refresh() { // Screens::Clock::BleConnectionStates::NotConnected); break; case Messages::NewNotification: - LoadNewScreen(Apps::NotificationsPreview, DisplayApp::FullRefreshDirections::Down); + LoadNewScreen(static_cast(Apps::NotificationsPreview), DisplayApp::FullRefreshDirections::Down); break; case Messages::TimerDone: if (state != States::Running) { PushMessageToSystemTask(System::Messages::GoToRunning); } - if (currentApp == Apps::Timer) { + if (currentApp == static_cast(Apps::Timer)) { lv_disp_trig_activity(nullptr); auto* timer = static_cast(currentScreen.get()); timer->Reset(); } else { - LoadNewScreen(Apps::Timer, DisplayApp::FullRefreshDirections::Up); + LoadNewScreen(static_cast(Apps::Timer), DisplayApp::FullRefreshDirections::Up); } motorController.RunForDuration(35); break; case Messages::AlarmTriggered: - if (currentApp == Apps::Alarm) { + if (currentApp == static_cast(Apps::Alarm)) { auto* alarm = static_cast(currentScreen.get()); alarm->SetAlerting(); } else { - LoadNewScreen(Apps::Alarm, DisplayApp::FullRefreshDirections::None); + LoadNewScreen(static_cast(Apps::Alarm), DisplayApp::FullRefreshDirections::None); } break; case Messages::ShowPairingKey: - LoadNewScreen(Apps::PassKey, DisplayApp::FullRefreshDirections::Up); + LoadNewScreen(static_cast(Apps::PassKey), DisplayApp::FullRefreshDirections::Up); motorController.RunForDuration(35); break; case Messages::TouchEvent: { @@ -290,16 +290,16 @@ void DisplayApp::Refresh() { } }; if (!currentScreen->OnTouchEvent(gesture)) { - if (currentApp == Apps::Clock) { + if (currentApp == static_cast(Apps::Clock)) { switch (gesture) { case TouchEvents::SwipeUp: - LoadNewScreen(Apps::Launcher, DisplayApp::FullRefreshDirections::Up); + LoadNewScreen(static_cast(Apps::Launcher), DisplayApp::FullRefreshDirections::Up); break; case TouchEvents::SwipeDown: - LoadNewScreen(Apps::Notifications, DisplayApp::FullRefreshDirections::Down); + LoadNewScreen(static_cast(Apps::Notifications), DisplayApp::FullRefreshDirections::Down); break; case TouchEvents::SwipeRight: - LoadNewScreen(Apps::QuickSettings, DisplayApp::FullRefreshDirections::RightAnim); + LoadNewScreen(static_cast(Apps::QuickSettings), DisplayApp::FullRefreshDirections::RightAnim); break; case TouchEvents::DoubleTap: PushMessageToSystemTask(System::Messages::GoToSleep); @@ -316,7 +316,7 @@ void DisplayApp::Refresh() { } break; case Messages::ButtonPushed: if (!currentScreen->OnButtonPushed()) { - if (currentApp == Apps::Clock) { + if (currentApp == static_cast(Apps::Clock)) { PushMessageToSystemTask(System::Messages::GoToSleep); } else { LoadPreviousScreen(); @@ -324,13 +324,13 @@ void DisplayApp::Refresh() { } break; case Messages::ButtonLongPressed: - if (currentApp != Apps::Clock) { - if (currentApp == Apps::Notifications) { - LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::Up); - } else if (currentApp == Apps::QuickSettings) { - LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::LeftAnim); + if (currentApp != static_cast(Apps::Clock)) { + if (currentApp == static_cast(Apps::Notifications)) { + LoadNewScreen(static_cast(Apps::Clock), DisplayApp::FullRefreshDirections::Up); + } else if (currentApp == static_cast(Apps::QuickSettings)) { + LoadNewScreen(static_cast(Apps::Clock), DisplayApp::FullRefreshDirections::LeftAnim); } else { - LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::Down); + LoadNewScreen(static_cast(Apps::Clock), DisplayApp::FullRefreshDirections::Down); } appStackDirections.Reset(); returnAppStack.Reset(); @@ -338,16 +338,16 @@ void DisplayApp::Refresh() { break; case Messages::ButtonLongerPressed: // Create reboot app and open it instead - LoadNewScreen(Apps::SysInfo, DisplayApp::FullRefreshDirections::Up); + LoadNewScreen(static_cast(Apps::SysInfo), DisplayApp::FullRefreshDirections::Up); break; case Messages::ButtonDoubleClicked: - if (currentApp != Apps::Notifications && currentApp != Apps::NotificationsPreview) { - LoadNewScreen(Apps::Notifications, DisplayApp::FullRefreshDirections::Down); + if (currentApp != static_cast(Apps::Notifications) && currentApp != static_cast(Apps::NotificationsPreview)) { + LoadNewScreen(static_cast(Apps::Notifications), DisplayApp::FullRefreshDirections::Down); } break; case Messages::BleFirmwareUpdateStarted: - LoadNewScreen(Apps::FirmwareUpdate, DisplayApp::FullRefreshDirections::Down); + LoadNewScreen(static_cast(Apps::FirmwareUpdate), DisplayApp::FullRefreshDirections::Down); break; case Messages::BleRadioEnableToggle: PushMessageToSystemTask(System::Messages::BleRadioEnableToggle); @@ -357,7 +357,7 @@ void DisplayApp::Refresh() { // What should happen here? break; case Messages::Chime: - LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::None); + LoadNewScreen(static_cast(Apps::Clock), DisplayApp::FullRefreshDirections::None); motorController.RunForDuration(35); break; case Messages::OnChargingEvent: @@ -371,18 +371,18 @@ void DisplayApp::Refresh() { currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY()); } - if (nextApp != Apps::None) { + if (nextApp != static_cast(Apps::None)) { LoadNewScreen(nextApp, nextDirection); - nextApp = Apps::None; + nextApp = static_cast(Apps::None); } } -void DisplayApp::StartApp(Apps app, DisplayApp::FullRefreshDirections direction) { +void DisplayApp::StartApp(uint8_t app, DisplayApp::FullRefreshDirections direction) { nextApp = app; nextDirection = direction; } -void DisplayApp::LoadNewScreen(Apps app, DisplayApp::FullRefreshDirections direction) { +void DisplayApp::LoadNewScreen(uint8_t app, DisplayApp::FullRefreshDirections direction) { // Don't add the same screen to the stack back to back. // This is mainly to fix an issue with receiving two notifications at the same time // and shouldn't happen otherwise. @@ -393,7 +393,7 @@ void DisplayApp::LoadNewScreen(Apps app, DisplayApp::FullRefreshDirections direc LoadScreen(app, direction); } -void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections direction) { +void DisplayApp::LoadScreen(uint8_t app, DisplayApp::FullRefreshDirections direction) { lvgl.CancelTap(); lv_disp_trig_activity(nullptr); motorController.StopRinging(); @@ -401,10 +401,15 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio currentScreen.reset(nullptr); SetFullRefresh(direction); - switch (app) { + switch (static_cast(app)) { case Apps::Launcher: currentScreen = - std::make_unique(this, settingsController, batteryController, bleController, dateTimeController); + std::make_unique(this, + settingsController, + batteryController, + bleController, + dateTimeController, + appController); break; case Apps::Motion: // currentScreen = std::make_unique(motionController); @@ -519,9 +524,9 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio case Apps::StopWatch: currentScreen = std::make_unique(*systemTask); break; - case Apps::Twos: - currentScreen = std::make_unique(); - break; + // case Apps::Twos: + // currentScreen = std::make_unique(); + // break; case Apps::Paint: currentScreen = std::make_unique(lvgl, motorController); break; @@ -548,6 +553,22 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio case Apps::Steps: currentScreen = std::make_unique(motionController, settingsController); break; + default: + { + // Pinetime::Applications::AppInterface appInterface = { + // &lvgl, + // motorController, + // settingsController, + // alarmController, + // timer, + // heartRateController, + // systemTask, + // systemTask->nimble().music(), + // systemTask->nimble().navigation() + // }; + currentScreen = appController.Get(app - static_cast(Apps::Dynamic)); + } + break; } currentApp = app; } diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index f537651dbf..57547099e0 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -12,6 +12,7 @@ #include "components/firmwarevalidator/FirmwareValidator.h" #include "components/settings/Settings.h" #include "displayapp/screens/Screen.h" +#include "displayapp/screens/AppController.h" #include "components/timer/Timer.h" #include "components/alarm/AlarmController.h" #include "touchhandler/TouchHandler.h" @@ -68,7 +69,7 @@ namespace Pinetime { void Start(System::BootErrors error); void PushMessage(Display::Messages msg); - void StartApp(Apps app, DisplayApp::FullRefreshDirections direction); + void StartApp(uint8_t app, DisplayApp::FullRefreshDirections direction); void SetFullRefresh(FullRefreshDirections direction); @@ -91,6 +92,7 @@ namespace Pinetime { Pinetime::Controllers::BrightnessController& brightnessController; Pinetime::Controllers::TouchHandler& touchHandler; Pinetime::Controllers::FS& filesystem; + Pinetime::Applications::AppController appController; Pinetime::Controllers::FirmwareValidator validator; Pinetime::Components::LittleVgl lvgl; @@ -106,8 +108,8 @@ namespace Pinetime { std::unique_ptr currentScreen; - Apps currentApp = Apps::None; - Apps returnToApp = Apps::None; + uint8_t currentApp = static_cast(Apps::None); + uint8_t returnToApp = static_cast(Apps::None); FullRefreshDirections returnDirection = FullRefreshDirections::None; TouchEvents returnTouchEvent = TouchEvents::None; @@ -115,17 +117,17 @@ namespace Pinetime { static void Process(void* instance); void InitHw(); void Refresh(); - void LoadNewScreen(Apps app, DisplayApp::FullRefreshDirections direction); - void LoadScreen(Apps app, DisplayApp::FullRefreshDirections direction); + void LoadNewScreen(uint8_t app, DisplayApp::FullRefreshDirections direction); + void LoadScreen(uint8_t app, DisplayApp::FullRefreshDirections direction); void PushMessageToSystemTask(Pinetime::System::Messages message); - Apps nextApp = Apps::None; + uint8_t nextApp = static_cast(Apps::None); DisplayApp::FullRefreshDirections nextDirection; System::BootErrors bootError; void ApplyBrightness(); static constexpr size_t returnAppStackSize = 10; - Utility::StaticStack returnAppStack; + Utility::StaticStack returnAppStack; Utility::StaticStack appStackDirections; bool isDimmed = false; diff --git a/src/displayapp/screens/AppController.cpp b/src/displayapp/screens/AppController.cpp new file mode 100644 index 0000000000..0b80801122 --- /dev/null +++ b/src/displayapp/screens/AppController.cpp @@ -0,0 +1,9 @@ +#include "displayapp/screens/AppController.h" + +using namespace Pinetime::Applications; + +AppController::AppController() { + symbols[current_apps] = Twos::Symbol; + constructors[current_apps] = Twos::Get; + current_apps++; +}; diff --git a/src/displayapp/screens/AppController.h b/src/displayapp/screens/AppController.h new file mode 100644 index 0000000000..0a2270fef1 --- /dev/null +++ b/src/displayapp/screens/AppController.h @@ -0,0 +1,56 @@ +#pragma once + +#include +#include +#include +#include + +#include "displayapp/Apps.h" +#include "displayapp/screens/Twos.h" + + +namespace Pinetime { + namespace Applications { + class DisplayApp; + + using namespace Screens; + + struct AppInterface { + // Pinetime::Components::LittleVgl* lvgl; + // Pinetime::Controllers::MotorController& motorController; + // Pinetime::Controllers::Settings& settingsController; + // Pinetime::Controllers::AlarmController& alarmController; + // Pinetime::Controllers::Timer timer; + // Pinetime::Controllers::HeartRateController& heartRateController; + // Pinetime::System::SystemTask* systemTask; + // Pinetime::Controllers::MusicService& musicService; + // Pinetime::Controllers::NavigationService& navigationService; + // Pinetime::Controllers::WeatherService& weatherService; + }; + + class AppController { + public: + AppController(); + + const char* GetSymbol(uint8_t app) const { + app -= static_cast(Apps::Dynamic); + return symbols[app]; + }; + + std::unique_ptr Get(uint8_t app) const { + return constructors[app](); + }; + + uint8_t NApps() const { + return current_apps; + }; + + private: + uint8_t current_apps = 0; + static constexpr uint8_t MAX_APP_COUNT = 24; + + std::array symbols {}; + std::array()>, MAX_APP_COUNT> constructors {}; + }; + } +} diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp index 0a65a5d472..886d30470d 100644 --- a/src/displayapp/screens/ApplicationList.cpp +++ b/src/displayapp/screens/ApplicationList.cpp @@ -1,15 +1,22 @@ -#include "displayapp/screens/ApplicationList.h" #include #include +#include + +#include "displayapp/screens/ApplicationList.h" #include "displayapp/Apps.h" #include "displayapp/DisplayApp.h" using namespace Pinetime::Applications::Screens; -constexpr std::array ApplicationList::applications; +// constexpr std::array ApplicationList::applications; auto ApplicationList::CreateScreenList() const { - std::array()>, nScreens> screens; + const uint8_t nApps = appController.NApps(); + const uint8_t nScreens = nApps / appsPerScreen + !!(nApps % appsPerScreen); + + std::vector()>> screens; + screens.resize(nScreens); + for (size_t i = 0; i < screens.size(); i++) { screens[i] = [this, i]() -> std::unique_ptr { return CreateScreen(i); @@ -22,12 +29,14 @@ ApplicationList::ApplicationList(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController, const Pinetime::Controllers::Battery& batteryController, const Pinetime::Controllers::Ble& bleController, - Controllers::DateTime& dateTimeController) + Controllers::DateTime& dateTimeController, + Pinetime::Applications::AppController& appController) : app {app}, settingsController {settingsController}, batteryController {batteryController}, bleController {bleController}, dateTimeController {dateTimeController}, + appController {appController}, screens {app, settingsController.GetAppMenu(), CreateScreenList(), Screens::ScreenListModes::UpDown} { } @@ -42,9 +51,17 @@ bool ApplicationList::OnTouchEvent(Pinetime::Applications::TouchEvents event) { std::unique_ptr ApplicationList::CreateScreen(unsigned int screenNum) const { std::array apps; for (int i = 0; i < appsPerScreen; i++) { - apps[i] = applications[screenNum * appsPerScreen + i]; + if (i >= appController.NApps()) { + apps[i] = {nullptr, static_cast(Apps::None)}; + } else { + uint8_t appId = screenNum * appsPerScreen + i + static_cast(Apps::Dynamic); + apps[i] = {appController.GetSymbol(appId), appId}; + } } + const uint8_t nApps = appController.NApps(); + const uint8_t nScreens = nApps / appsPerScreen + !!(nApps % appsPerScreen); + return std::make_unique(screenNum, nScreens, app, diff --git a/src/displayapp/screens/ApplicationList.h b/src/displayapp/screens/ApplicationList.h index 7bdd115408..900137b14e 100644 --- a/src/displayapp/screens/ApplicationList.h +++ b/src/displayapp/screens/ApplicationList.h @@ -10,6 +10,7 @@ #include "components/battery/BatteryController.h" #include "displayapp/screens/Symbols.h" #include "displayapp/screens/Tile.h" +#include "displayapp/screens/AppController.h" namespace Pinetime { namespace Applications { @@ -20,7 +21,8 @@ namespace Pinetime { Pinetime::Controllers::Settings& settingsController, const Pinetime::Controllers::Battery& batteryController, const Pinetime::Controllers::Ble& bleController, - Controllers::DateTime& dateTimeController); + Controllers::DateTime& dateTimeController, + Pinetime::Applications::AppController& appController); ~ApplicationList() override; bool OnTouchEvent(TouchEvents event) override; @@ -33,30 +35,31 @@ namespace Pinetime { const Pinetime::Controllers::Battery& batteryController; const Pinetime::Controllers::Ble& bleController; Controllers::DateTime& dateTimeController; + const Pinetime::Applications::AppController& appController; static constexpr int appsPerScreen = 6; // Increment this when more space is needed - static constexpr int nScreens = 2; - - static constexpr std::array applications {{ - {Symbols::stopWatch, Apps::StopWatch}, - {Symbols::clock, Apps::Alarm}, - {Symbols::hourGlass, Apps::Timer}, - {Symbols::shoe, Apps::Steps}, - {Symbols::heartBeat, Apps::HeartRate}, - {Symbols::music, Apps::Music}, - - {Symbols::paintbrush, Apps::Paint}, - {Symbols::paddle, Apps::Paddle}, - {"2", Apps::Twos}, - {Symbols::drum, Apps::Metronome}, - {Symbols::map, Apps::Navigation}, - {Symbols::none, Apps::None}, - - // {"M", Apps::Motion}, - }}; - ScreenList screens; + // static constexpr int nScreens = 2; + + // static constexpr std::array applications {{ + // {Symbols::stopWatch, Apps::StopWatch}, + // {Symbols::clock, Apps::Alarm}, + // {Symbols::hourGlass, Apps::Timer}, + // {Symbols::shoe, Apps::Steps}, + // {Symbols::heartBeat, Apps::HeartRate}, + // {Symbols::music, Apps::Music}, + + // {Symbols::paintbrush, Apps::Paint}, + // {Symbols::paddle, Apps::Paddle}, + // {AppController::GetSymbol(static_cast(Apps::Dynamic)), Apps::Dynamic}, + // {Symbols::drum, Apps::Metronome}, + // {Symbols::map, Apps::Navigation}, + // {Symbols::none, Apps::None}, + + // // {"M", Apps::Motion}, + // }}; + ScreenList screens; }; } } diff --git a/src/displayapp/screens/List.cpp b/src/displayapp/screens/List.cpp index 264b4fc98b..28d9b6251c 100644 --- a/src/displayapp/screens/List.cpp +++ b/src/displayapp/screens/List.cpp @@ -40,7 +40,7 @@ List::List(uint8_t screenID, for (int i = 0; i < MAXLISTITEMS; i++) { apps[i] = applications[i].application; - if (applications[i].application != Apps::None) { + if (applications[i].application != static_cast(Apps::None)) { static constexpr int btnHeight = (LV_HOR_RES_MAX - ((MAXLISTITEMS - 1) * innerPad)) / MAXLISTITEMS; itemApps[i] = lv_btn_create(container, nullptr); @@ -75,7 +75,7 @@ List::~List() { void List::OnButtonEvent(lv_obj_t* object, lv_event_t event) { if (event == LV_EVENT_CLICKED) { for (int i = 0; i < MAXLISTITEMS; i++) { - if (apps[i] != Apps::None && object == itemApps[i]) { + if (apps[i] != static_cast(Apps::None) && object == itemApps[i]) { app->StartApp(apps[i], DisplayApp::FullRefreshDirections::Up); running = false; return; diff --git a/src/displayapp/screens/List.h b/src/displayapp/screens/List.h index 564229e694..321e56d3c1 100644 --- a/src/displayapp/screens/List.h +++ b/src/displayapp/screens/List.h @@ -18,7 +18,7 @@ namespace Pinetime { struct Applications { const char* icon; const char* name; - Pinetime::Applications::Apps application; + uint8_t application; }; explicit List(uint8_t screenID, @@ -33,7 +33,7 @@ namespace Pinetime { private: DisplayApp* app; Controllers::Settings& settingsController; - Pinetime::Applications::Apps apps[MAXLISTITEMS]; + uint8_t apps[MAXLISTITEMS]; lv_obj_t* itemApps[MAXLISTITEMS]; diff --git a/src/displayapp/screens/ScreenList.h b/src/displayapp/screens/ScreenList.h index 78f32314c7..99accd9d2b 100644 --- a/src/displayapp/screens/ScreenList.h +++ b/src/displayapp/screens/ScreenList.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include "displayapp/screens/Screen.h" @@ -12,12 +13,11 @@ namespace Pinetime { enum class ScreenListModes { UpDown, RightLeft, LongPress }; - template class ScreenList : public Screen { public: ScreenList(DisplayApp* app, uint8_t initScreen, - const std::array()>, N>&& screens, + const std::vector()>>&& screens, ScreenListModes mode) : app {app}, initScreen {initScreen}, @@ -104,7 +104,7 @@ namespace Pinetime { private: DisplayApp* app; uint8_t initScreen = 0; - const std::array()>, N> screens; + const std::vector()>> screens; ScreenListModes mode = ScreenListModes::UpDown; uint8_t screenIndex = 0; diff --git a/src/displayapp/screens/SystemInfo.h b/src/displayapp/screens/SystemInfo.h index 199af51e70..6c6c546af2 100644 --- a/src/displayapp/screens/SystemInfo.h +++ b/src/displayapp/screens/SystemInfo.h @@ -43,7 +43,7 @@ namespace Pinetime { Pinetime::Controllers::MotionController& motionController; const Pinetime::Drivers::Cst816S& touchPanel; - ScreenList<5> screens; + ScreenList screens; static bool sortById(const TaskStatus_t& lhs, const TaskStatus_t& rhs); diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp index 1266f379f8..f2b0468966 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -51,7 +51,7 @@ Tile::Tile(uint8_t screenID, if (i == 3) { btnmMap[btIndex++] = "\n"; } - if (applications[i].application == Apps::None) { + if (applications[i].application == static_cast(Apps::None)) { btnmMap[btIndex] = " "; } else { btnmMap[btIndex] = applications[i].icon; @@ -76,7 +76,7 @@ Tile::Tile(uint8_t screenID, for (uint8_t i = 0; i < 6; i++) { lv_btnmatrix_set_btn_ctrl(btnm1, i, LV_BTNMATRIX_CTRL_CLICK_TRIG); - if (applications[i].application == Apps::None) { + if (applications[i].application == static_cast(Apps::None)) { lv_btnmatrix_set_btn_ctrl(btnm1, i, LV_BTNMATRIX_CTRL_DISABLED); } } diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h index 91acb26c7b..d88cc2e271 100644 --- a/src/displayapp/screens/Tile.h +++ b/src/displayapp/screens/Tile.h @@ -4,7 +4,6 @@ #include #include #include "displayapp/screens/Screen.h" -#include "displayapp/Apps.h" #include "components/datetime/DateTimeController.h" #include "components/settings/Settings.h" #include "components/battery/BatteryController.h" @@ -18,7 +17,7 @@ namespace Pinetime { public: struct Applications { const char* icon; - Pinetime::Applications::Apps application; + uint8_t application; }; explicit Tile(uint8_t screenID, @@ -48,7 +47,7 @@ namespace Pinetime { Widgets::StatusIcons statusIcons; const char* btnmMap[8]; - Pinetime::Applications::Apps apps[6]; + uint8_t apps[6]; }; } } diff --git a/src/displayapp/screens/Twos.h b/src/displayapp/screens/Twos.h index e731eae62f..0cdd15c162 100644 --- a/src/displayapp/screens/Twos.h +++ b/src/displayapp/screens/Twos.h @@ -1,5 +1,7 @@ #pragma once +#include + #include #include "displayapp/screens/Screen.h" @@ -18,6 +20,12 @@ namespace Pinetime { bool OnTouchEvent(TouchEvents event) override; + static std::unique_ptr Get() { + return std::make_unique(); + } + + static constexpr const char* Symbol {"2"}; + private: static constexpr int nColors = 5; lv_style_t cellStyles[nColors]; diff --git a/src/displayapp/screens/Weather.h b/src/displayapp/screens/Weather.h index 459534aa2a..8f3e6bb5be 100644 --- a/src/displayapp/screens/Weather.h +++ b/src/displayapp/screens/Weather.h @@ -28,7 +28,7 @@ namespace Pinetime { Controllers::WeatherService& weatherService; - ScreenList<5> screens; + ScreenList screens; std::unique_ptr CreateScreenTemperature(); diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp index 0548488855..3dae25e7ff 100644 --- a/src/displayapp/screens/settings/QuickSettings.cpp +++ b/src/displayapp/screens/settings/QuickSettings.cpp @@ -137,7 +137,7 @@ void QuickSettings::UpdateScreen() { void QuickSettings::OnButtonEvent(lv_obj_t* object) { if (object == btn2) { - app->StartApp(Apps::FlashLight, DisplayApp::FullRefreshDirections::Up); + app->StartApp(static_cast(Apps::FlashLight), DisplayApp::FullRefreshDirections::Up); } else if (object == btn1) { brightness.Step(); @@ -163,6 +163,6 @@ void QuickSettings::OnButtonEvent(lv_obj_t* object) { } else if (object == btn4) { settingsController.SetSettingsMenu(0); - app->StartApp(Apps::Settings, DisplayApp::FullRefreshDirections::Up); + app->StartApp(static_cast(Apps::Settings), DisplayApp::FullRefreshDirections::Up); } } diff --git a/src/displayapp/screens/settings/SettingSetDateTime.h b/src/displayapp/screens/settings/SettingSetDateTime.h index 051b1abe4a..2dea5cae2b 100644 --- a/src/displayapp/screens/settings/SettingSetDateTime.h +++ b/src/displayapp/screens/settings/SettingSetDateTime.h @@ -24,7 +24,7 @@ namespace Pinetime { Controllers::DateTime& dateTimeController; Controllers::Settings& settingsController; - ScreenList<2> screens; + ScreenList screens; std::unique_ptr screenSetDate(); std::unique_ptr screenSetTime(); }; diff --git a/src/displayapp/screens/settings/SettingWatchFace.cpp b/src/displayapp/screens/settings/SettingWatchFace.cpp index 5498d06792..f21adf7ad2 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.cpp +++ b/src/displayapp/screens/settings/SettingWatchFace.cpp @@ -4,6 +4,7 @@ #include "displayapp/screens/Screen.h" #include "components/settings/Settings.h" #include "displayapp/WatchFaces.h" +#include using namespace Pinetime::Applications::Screens; @@ -11,7 +12,9 @@ constexpr const char* SettingWatchFace::title; constexpr const char* SettingWatchFace::symbol; auto SettingWatchFace::CreateScreenList() const { - std::array()>, nScreens> screens; + std::vector()>> screens; + screens.resize(nScreens); + for (size_t i = 0; i < screens.size(); i++) { screens[i] = [this, i]() -> std::unique_ptr { return CreateScreen(i); diff --git a/src/displayapp/screens/settings/SettingWatchFace.h b/src/displayapp/screens/settings/SettingWatchFace.h index 45a50e3d0b..522b8be0a6 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.h +++ b/src/displayapp/screens/settings/SettingWatchFace.h @@ -49,7 +49,7 @@ namespace Pinetime { {"Casio G7710", Applications::Screens::WatchFaceCasioStyleG7710::IsAvailable(filesystem)}, {"", false}, {"", false}}}; - ScreenList screens; + ScreenList screens; }; } } diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index 065417fa7c..1b85155a5e 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -9,7 +9,9 @@ using namespace Pinetime::Applications::Screens; constexpr std::array Settings::entries; auto Settings::CreateScreenList() const { - std::array()>, nScreens> screens; + std::vector()>> screens; + screens.resize(nScreens); + for (size_t i = 0; i < screens.size(); i++) { screens[i] = [this, i]() -> std::unique_ptr { return CreateScreen(i); diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h index 3f8097538e..f27d581aac 100644 --- a/src/displayapp/screens/settings/Settings.h +++ b/src/displayapp/screens/settings/Settings.h @@ -32,20 +32,20 @@ namespace Pinetime { static constexpr int nScreens = 3; static constexpr std::array entries {{ - {Symbols::sun, "Display", Apps::SettingDisplay}, - {Symbols::eye, "Wake Up", Apps::SettingWakeUp}, - {Symbols::clock, "Time format", Apps::SettingTimeFormat}, - {Symbols::home, "Watch face", Apps::SettingWatchFace}, + {Symbols::sun, "Display", static_cast(Apps::SettingDisplay)}, + {Symbols::eye, "Wake Up", static_cast(Apps::SettingWakeUp)}, + {Symbols::clock, "Time format", static_cast(Apps::SettingTimeFormat)}, + {Symbols::home, "Watch face", static_cast(Apps::SettingWatchFace)}, - {Symbols::shoe, "Steps", Apps::SettingSteps}, - {Symbols::clock, "Date&Time", Apps::SettingSetDateTime}, - {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}, - {Symbols::clock, "Chimes", Apps::SettingChimes}, + {Symbols::shoe, "Steps", static_cast(Apps::SettingSteps)}, + {Symbols::clock, "Date&Time", static_cast(Apps::SettingSetDateTime)}, + {Symbols::batteryHalf, "Battery", static_cast(Apps::BatteryInfo)}, + {Symbols::clock, "Chimes", static_cast(Apps::SettingChimes)}, - {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold}, - {Symbols::check, "Firmware", Apps::FirmwareValidation}, - {Symbols::bluetooth, "Bluetooth", Apps::SettingBluetooth}, - {Symbols::list, "About", Apps::SysInfo}, + {Symbols::tachometer, "Shake Calib.", static_cast(Apps::SettingShakeThreshold)}, + {Symbols::check, "Firmware", static_cast(Apps::FirmwareValidation)}, + {Symbols::bluetooth, "Bluetooth", static_cast(Apps::SettingBluetooth)}, + {Symbols::list, "About", static_cast(Apps::SysInfo)}, // {Symbols::none, "None", Apps::None}, // {Symbols::none, "None", Apps::None}, @@ -53,7 +53,7 @@ namespace Pinetime { // {Symbols::none, "None", Apps::None}, }}; - ScreenList screens; + ScreenList screens; }; } }