diff options
Diffstat (limited to 'src/displayapp/DisplayApp.cpp')
-rw-r--r-- | src/displayapp/DisplayApp.cpp | 251 |
1 files changed, 170 insertions, 81 deletions
diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index da398dcf..9aaf77a6 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -22,11 +22,20 @@ #include "displayapp/screens/SystemInfo.h" #include "displayapp/screens/Tile.h" #include "displayapp/screens/Twos.h" +#include "displayapp/screens/FlashLight.h" +#include "displayapp/screens/BatteryInfo.h" #include "drivers/Cst816s.h" #include "drivers/St7789.h" #include "drivers/Watchdog.h" #include "systemtask/SystemTask.h" +#include "displayapp/screens/settings/QuickSettings.h" +#include "displayapp/screens/settings/Settings.h" +#include "displayapp/screens/settings/SettingWatchFace.h" +#include "displayapp/screens/settings/SettingTimeFormat.h" +#include "displayapp/screens/settings/SettingWakeUp.h" +#include "displayapp/screens/settings/SettingDisplay.h" + using namespace Pinetime::Applications; using namespace Pinetime::Applications::Display; @@ -40,23 +49,23 @@ DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Driver Pinetime::Controllers::MotionController& motionController) : lcd{lcd}, lvgl{lvgl}, + touchPanel{touchPanel}, batteryController{batteryController}, bleController{bleController}, dateTimeController{dateTimeController}, watchdog{watchdog}, - touchPanel{touchPanel}, - currentScreen{new Screens::Clock(this, dateTimeController, batteryController, bleController, notificationManager, settingsController, heartRateController, motionController) }, systemTask{systemTask}, notificationManager{notificationManager}, heartRateController{heartRateController}, settingsController{settingsController}, motionController{motionController} { msgQueue = xQueueCreate(queueSize, itemSize); - onClockApp = true; + // Start clock when smartwatch boots + LoadApp( Apps::Clock, DisplayApp::FullRefreshDirections::None ); } void DisplayApp::Start() { - if (pdPASS != xTaskCreate(DisplayApp::Process, "displayapp", 512, this, 0, &taskHandle)) + if (pdPASS != xTaskCreate(DisplayApp::Process, "displayapp", 800, this, 0, &taskHandle)) APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); } @@ -69,14 +78,13 @@ void DisplayApp::Process(void *instance) { xTaskNotifyGive(xTaskGetCurrentTaskHandle()); while (1) { - app->Refresh(); - } } void DisplayApp::InitHw() { brightnessController.Init(); + brightnessController.Set(settingsController.GetBrightness()); } uint32_t acc = 0; @@ -116,69 +124,57 @@ void DisplayApp::Refresh() { brightnessController.Restore(); state = States::Running; break; + case Messages::UpdateTimeOut: + systemTask.PushMessage(System::SystemTask::Messages::UpdateTimeOut); + break; case Messages::UpdateBleConnection: // clockScreen.SetBleConnectionState(bleController.IsConnected() ? Screens::Clock::BleConnectionStates::Connected : Screens::Clock::BleConnectionStates::NotConnected); break; case Messages::UpdateBatteryLevel: // clockScreen.SetBatteryPercentRemaining(batteryController.PercentRemaining()); break; - case Messages::NewNotification: { - if(onClockApp) { - currentScreen.reset(nullptr); - lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Up); - onClockApp = false; - currentScreen = std::make_unique<Screens::Notifications>(this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Preview); - } - } + case Messages::NewNotification: + LoadApp( Apps::NotificationsPreview, DisplayApp::FullRefreshDirections::Down ); break; case Messages::TouchEvent: { if (state != States::Running) break; auto gesture = OnTouchEvent(); if(!currentScreen->OnTouchEvent(gesture)) { - switch (gesture) { - case TouchEvents::SwipeUp: - currentScreen->OnButtonPushed(); - lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Up); - break; - case TouchEvents::SwipeDown: - currentScreen->OnButtonPushed(); - lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Down); - break; - default: - break; + if ( currentApp == Apps::Clock ) { + switch (gesture) { + case TouchEvents::SwipeUp: + LoadApp( Apps::Launcher, DisplayApp::FullRefreshDirections::Up ); + break; + case TouchEvents::SwipeDown: + LoadApp( Apps::Notifications, DisplayApp::FullRefreshDirections::Down ); + break; + case TouchEvents::SwipeRight: + LoadApp( Apps::QuickSettings, DisplayApp::FullRefreshDirections::RightAnim ); + break; + case TouchEvents::DoubleTap: + systemTask.PushMessage(System::SystemTask::Messages::GoToSleep); + break; + default: + break; + } + } else if ( returnTouchEvent == gesture ) { + LoadApp( returnToApp, returnDirection ); } } } break; case Messages::ButtonPushed: - if(onClockApp) - systemTask.PushMessage(System::SystemTask::Messages::GoToSleep); - else { - auto buttonUsedByApp = currentScreen->OnButtonPushed(); - if (!buttonUsedByApp) { - systemTask.PushMessage(System::SystemTask::Messages::GoToSleep); - } else { - lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Up); + if( currentApp == Apps::Clock ) { + systemTask.PushMessage(System::SystemTask::Messages::GoToSleep); + } else { + if ( !currentScreen->OnButtonPushed() ) { + LoadApp( returnToApp, returnDirection ); } } - -// lvgl.SetFullRefresh(components::LittleVgl::FullRefreshDirections::Down); -// currentScreen.reset(nullptr); -// if(toggle) { -// currentScreen = std::make_unique<Screens::Tile>(this); -// toggle = false; -// } else { -// currentScreen = std::make_unique<Screens::Clock>(this, dateTimeController, batteryController, bleController); -// toggle = true; -// } - break; - case Messages::BleFirmwareUpdateStarted: - lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Down); - currentScreen.reset(nullptr); - currentScreen = std::make_unique<Screens::FirmwareUpdate>(this, bleController); - onClockApp = false; + case Messages::BleFirmwareUpdateStarted: + LoadApp( Apps::FirmwareUpdate, DisplayApp::FullRefreshDirections::Down ); break; case Messages::UpdateDateTime: // Added to remove warning @@ -198,38 +194,124 @@ void DisplayApp::Refresh() { } void DisplayApp::RunningState() { -// clockScreen.SetCurrentDateTime(dateTimeController.CurrentDateTime()); - if(!currentScreen->Refresh()) { - currentScreen.reset(nullptr); - lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Up); - onClockApp = false; - switch(nextApp) { - case Apps::None: - case Apps::Launcher: currentScreen = std::make_unique<Screens::ApplicationList>(this, settingsController); break; - case Apps::Clock: - currentScreen = std::make_unique<Screens::Clock>(this, dateTimeController, batteryController, bleController, notificationManager, settingsController, heartRateController, motionController); - onClockApp = true; - break; - case Apps::SysInfo: currentScreen = std::make_unique<Screens::SystemInfo>(this, dateTimeController, batteryController, brightnessController, bleController, watchdog); break; - case Apps::Meter: currentScreen = std::make_unique<Screens::Meter>(this);break; - case Apps::StopWatch: currentScreen = std::make_unique<Screens::StopWatch>(this); break; - case Apps::Twos: currentScreen = std::make_unique<Screens::Twos>(this); break; - case Apps::Paint: currentScreen = std::make_unique<Screens::InfiniPaint>(this, lvgl); break; - case Apps::Paddle: currentScreen = std::make_unique<Screens::Paddle>(this, lvgl); break; - case Apps::Brightness : currentScreen = std::make_unique<Screens::Brightness>(this, brightnessController); break; - case Apps::Music : currentScreen = std::make_unique<Screens::Music>(this, systemTask.nimble().music()); break; - case Apps::Navigation : currentScreen = std::make_unique<Screens::Navigation>(this, systemTask.nimble().navigation()); break; - case Apps::FirmwareValidation: currentScreen = std::make_unique<Screens::FirmwareValidation>(this, validator); break; - case Apps::Notifications: currentScreen = std::make_unique<Screens::Notifications>(this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Normal); break; - case Apps::HeartRate: currentScreen = std::make_unique<Screens::HeartRate>(this, heartRateController); break; - case Apps::Motion: currentScreen = std::make_unique<Screens::Motion>(this, motionController); break; - } - nextApp = Apps::None; + LoadApp( returnToApp, returnDirection ); } lv_task_handler(); } +void DisplayApp::StartApp(Apps app, DisplayApp::FullRefreshDirections direction) { + LoadApp( app, direction ); +} + +void DisplayApp::returnApp(Apps app, DisplayApp::FullRefreshDirections direction, TouchEvents touchEvent) { + returnToApp = app; + returnDirection = direction; + returnTouchEvent = touchEvent; +} + +void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) { + currentScreen.reset(nullptr); + SetFullRefresh( direction ); + + // default return to launcher + returnApp(Apps::Launcher, FullRefreshDirections::Down, TouchEvents::SwipeDown); + + switch(app) { + case Apps::Launcher: + currentScreen = std::make_unique<Screens::ApplicationList>(this, settingsController, batteryController, dateTimeController); + returnApp(Apps::Clock, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; + case Apps::None: + case Apps::Clock: + currentScreen = std::make_unique<Screens::Clock>(this, dateTimeController, batteryController, bleController, notificationManager, settingsController, heartRateController, motionController); + break; + + case Apps::FirmwareValidation: + currentScreen = std::make_unique<Screens::FirmwareValidation>(this, validator); + returnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; + case Apps::FirmwareUpdate: + currentScreen = std::make_unique<Screens::FirmwareUpdate>(this, bleController); + break; + + case Apps::Notifications: + currentScreen = std::make_unique<Screens::Notifications>(this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Normal); + returnApp(Apps::Clock, FullRefreshDirections::Up, TouchEvents::SwipeUp); + break; + case Apps::NotificationsPreview: + currentScreen = std::make_unique<Screens::Notifications>(this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Preview); + returnApp(Apps::Clock, FullRefreshDirections::Up, TouchEvents::SwipeUp); + break; + + // Settings + case Apps::QuickSettings: + currentScreen = std::make_unique<Screens::QuickSettings>(this, batteryController, dateTimeController, brightnessController, settingsController); + returnApp(Apps::Clock, FullRefreshDirections::LeftAnim, TouchEvents::SwipeLeft); + break; + case Apps::Settings: + currentScreen = std::make_unique<Screens::Settings>(this, settingsController); + returnApp(Apps::QuickSettings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; + case Apps::SettingWatchFace: + currentScreen = std::make_unique<Screens::SettingWatchFace>(this, settingsController); + returnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; + case Apps::SettingTimeFormat: + currentScreen = std::make_unique<Screens::SettingTimeFormat>(this, settingsController); + returnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; + case Apps::SettingWakeUp: + currentScreen = std::make_unique<Screens::SettingWakeUp>(this, settingsController); + returnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; + case Apps::SettingDisplay: + currentScreen = std::make_unique<Screens::SettingDisplay>(this, settingsController); + returnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; + case Apps::BatteryInfo: + currentScreen = std::make_unique<Screens::BatteryInfo>(this, batteryController); + returnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; + case Apps::SysInfo: + currentScreen = std::make_unique<Screens::SystemInfo>(this, dateTimeController, batteryController, brightnessController, bleController, watchdog); + returnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; + // + + case Apps::FlashLight: + currentScreen = std::make_unique<Screens::FlashLight>(this, systemTask, brightnessController); + returnApp(Apps::Clock, FullRefreshDirections::Down, TouchEvents::None); + break; + case Apps::StopWatch: + currentScreen = std::make_unique<Screens::StopWatch>(this); + break; + case Apps::Twos: + currentScreen = std::make_unique<Screens::Twos>(this); + break; + case Apps::Paint: + currentScreen = std::make_unique<Screens::InfiniPaint>(this, lvgl); + break; + case Apps::Paddle: + currentScreen = std::make_unique<Screens::Paddle>(this, lvgl); + break; + case Apps::Music: + currentScreen = std::make_unique<Screens::Music>(this, systemTask.nimble().music()); + break; + case Apps::Navigation: + currentScreen = std::make_unique<Screens::Navigation>(this, systemTask.nimble().navigation()); + break; + case Apps::HeartRate: + currentScreen = std::make_unique<Screens::HeartRate>(this, heartRateController, systemTask); + break; + case Apps::Motion: + currentScreen = std::make_unique<Screens::Motion>(this, motionController); + break; + + } + currentApp = app; +} + void DisplayApp::IdleState() { } @@ -272,10 +354,6 @@ TouchEvents DisplayApp::OnTouchEvent() { return TouchEvents::None; } -void DisplayApp::StartApp(Apps app) { - nextApp = app; -} - void DisplayApp::SetFullRefresh(DisplayApp::FullRefreshDirections direction) { switch(direction){ case DisplayApp::FullRefreshDirections::Down: @@ -284,9 +362,20 @@ void DisplayApp::SetFullRefresh(DisplayApp::FullRefreshDirections direction) { case DisplayApp::FullRefreshDirections::Up: lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Up); break; + case DisplayApp::FullRefreshDirections::Left: + lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Left); + break; + case DisplayApp::FullRefreshDirections::Right: + lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Right); + break; + case DisplayApp::FullRefreshDirections::LeftAnim: + lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::LeftAnim); + break; + case DisplayApp::FullRefreshDirections::RightAnim: + lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::RightAnim); + break; default: break; } - } void DisplayApp::SetTouchMode(DisplayApp::TouchModes mode) { |