From b7330da36cb842a913ac82d9d97ab8f5c83708e6 Mon Sep 17 00:00:00 2001 From: Dawid Wojtas Date: Tue, 30 Aug 2022 09:23:29 +0200 Subject: [PATCH] [MOS-662][MOS-301] Fix E-ink shutdown while restoring data While restoring system data the timer can turn off power of E-ink to save the power. To avoid this situation we need to power on the E-ink before wiping out the display. The restore procedure also performs reversing services list to close. In this case we do it twice so the order is wrong. --- module-services/service-eink/ServiceEink.cpp | 2 ++ .../SystemManager/SystemManagerCommon.cpp | 22 ++++++++++++------- .../SystemManager/SystemManagerCommon.hpp | 1 + pure_changelog.md | 2 ++ 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/module-services/service-eink/ServiceEink.cpp b/module-services/service-eink/ServiceEink.cpp index e6cef1ebf460b2cdaeae8a6cd0068c02037705ef..e44221ddf5cfed18d2ddfc3482d384126701f944 100644 --- a/module-services/service-eink/ServiceEink.cpp +++ b/module-services/service-eink/ServiceEink.cpp @@ -111,6 +111,8 @@ namespace service::eink sys::ReturnCodes ServiceEink::DeinitHandler() { + // Eink must be turn on before wiping out the display + display->powerOn(); if (exitAction == ExitAction::WipeOut) { display->wipeOut(); } diff --git a/module-sys/SystemManager/SystemManagerCommon.cpp b/module-sys/SystemManager/SystemManagerCommon.cpp index 0ef6530b81294009efeab87ba4e44c6fd6379bde..7336a9b99a2a2af5cec706c72ca1c6353837a05d 100644 --- a/module-sys/SystemManager/SystemManagerCommon.cpp +++ b/module-sys/SystemManager/SystemManagerCommon.cpp @@ -67,11 +67,12 @@ namespace sys { namespace restore { - static constexpr std::array whitelist = {service::name::service_desktop, - service::name::evt_manager, - service::name::eink, - service::name::appmgr, - service::name::cellular}; + static constexpr std::array whitelist = { + service::name::service_desktop, // Handle restore procedure + service::name::evt_manager, // Workaround for charging battery after shutting down and turn on the phone + service::name::appmgr, + service::name::cellular, + }; } namespace regularClose @@ -704,7 +705,10 @@ namespace sys // We are going to remove services in reversed order of creation CriticalSection::Enter(); - std::reverse(servicesList.begin(), servicesList.end()); + if (not serviceListReversed) { + std::reverse(servicesList.begin(), servicesList.end()); + serviceListReversed = true; + } CriticalSection::Exit(); InitiateSystemCloseSequence(closeReason); @@ -741,10 +745,12 @@ namespace sys void SystemManagerCommon::RestoreSystemHandler() { LOG_INFO("Entering restore system state"); - // We are going to remove services in reversed order of creation CriticalSection::Enter(); - std::reverse(servicesList.begin(), servicesList.end()); + if (not serviceListReversed) { + std::reverse(servicesList.begin(), servicesList.end()); + serviceListReversed = true; + } CriticalSection::Exit(); DestroyServices(sys::state::restore::whitelist); diff --git a/module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp b/module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp index 9c6adefc6af8e848469ccf606bfd0438cfe6ab00..2d101e31d3d51db6820196574e3483ef601bb398 100644 --- a/module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp +++ b/module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp @@ -193,6 +193,7 @@ namespace sys void UpdateResourcesAfterCpuFrequencyChange(bsp::CpuFrequencyMHz newFrequency); bool cpuStatisticsTimerInit{false}; + bool serviceListReversed{false}; CloseReason closeReason{CloseReason::RegularPowerDown}; UpdateReason updateReason{UpdateReason::Update}; diff --git a/pure_changelog.md b/pure_changelog.md index b485bf1230abd3ce546471e36d1c4af3e07d3728..a7ede26e4b3aa5aca3ed8c5a40ff845c5dee9e3e 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -7,6 +7,8 @@ * Separated system volume from Bluetooth device volume for A2DP ### Fixed +* Fixed order of the services while closing system +* Fixed crash of the E-ink service while restoring system data * Fixed removing wrong sentinels * Fixed music player behaviour when connecting/disconnecting audio devices * Fixed dropping the call during the DND mode