diff --git a/module-services/service-appmgr/ApplicationManager.hpp b/module-services/service-appmgr/ApplicationManager.hpp index f2b6e1b98..3c1d85db7 100644 --- a/module-services/service-appmgr/ApplicationManager.hpp +++ b/module-services/service-appmgr/ApplicationManager.hpp @@ -100,7 +100,9 @@ public: sys::ReturnCodes DeinitHandler() override; - sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{return sys::ReturnCodes::Success;} + sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{ + LOG_FATAL("[ServiceAudio] PowerModeHandler: %d", static_cast(mode)); + return sys::ReturnCodes::Success;} /** * @brief Sends request to application manager to switch from current application to specific window in application with specified name . diff --git a/module-services/service-audio/ServiceAudio.hpp b/module-services/service-audio/ServiceAudio.hpp index 8539cd6cc..2ec00c346 100644 --- a/module-services/service-audio/ServiceAudio.hpp +++ b/module-services/service-audio/ServiceAudio.hpp @@ -35,7 +35,10 @@ public: sys::ReturnCodes DeinitHandler() override; - sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{return sys::ReturnCodes::Success;} + sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{ + LOG_FATAL("[ServiceAudio] PowerModeHandler: %d", static_cast(mode)); + return sys::ReturnCodes::Success; + } static const char *serviceName; diff --git a/module-services/service-cellular/ServiceCellular.hpp b/module-services/service-cellular/ServiceCellular.hpp index fc120331f..13efe26d1 100644 --- a/module-services/service-cellular/ServiceCellular.hpp +++ b/module-services/service-cellular/ServiceCellular.hpp @@ -44,7 +44,9 @@ public: sys::ReturnCodes DeinitHandler() override; - sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{return sys::ReturnCodes::Success;} + sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{ + LOG_FATAL("[ServiceAudio] PowerModeHandler: %d", static_cast(mode)); + return sys::ReturnCodes::Success;} static const char *serviceName; diff --git a/module-services/service-db/ServiceDB.hpp b/module-services/service-db/ServiceDB.hpp index 1c6c04dfc..81e080d41 100644 --- a/module-services/service-db/ServiceDB.hpp +++ b/module-services/service-db/ServiceDB.hpp @@ -53,7 +53,9 @@ public: sys::ReturnCodes DeinitHandler() override; - sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{return sys::ReturnCodes::Success;} + sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{ + LOG_FATAL("[ServiceAudio] PowerModeHandler: %d", static_cast(mode)); + return sys::ReturnCodes::Success;} static const char* serviceName; diff --git a/module-services/service-eink/ServiceEink.hpp b/module-services/service-eink/ServiceEink.hpp index 0ff86be12..a1f80bcdb 100644 --- a/module-services/service-eink/ServiceEink.hpp +++ b/module-services/service-eink/ServiceEink.hpp @@ -56,7 +56,9 @@ public: sys::ReturnCodes DeinitHandler() override; - sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{return sys::ReturnCodes::Success;} + sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{ + LOG_FATAL("[ServiceAudio] PowerModeHandler: %d", static_cast(mode)); + return sys::ReturnCodes::Success;} }; #endif /* MODULE_SERVICES_SERVICE_EINK_SERVICEEINK_HPP_ */ diff --git a/module-services/service-evtmgr/EventManager.hpp b/module-services/service-evtmgr/EventManager.hpp index 4a4b43601..a43f7413d 100644 --- a/module-services/service-evtmgr/EventManager.hpp +++ b/module-services/service-evtmgr/EventManager.hpp @@ -45,7 +45,9 @@ public: sys::ReturnCodes DeinitHandler() override; - sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{return sys::ReturnCodes::Success;} + sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{ + LOG_FATAL("[ServiceAudio] PowerModeHandler: %d", static_cast(mode)); + return sys::ReturnCodes::Success;} /** diff --git a/module-services/service-gui/ServiceGUI.hpp b/module-services/service-gui/ServiceGUI.hpp index 060b2dc93..d14f1dfd1 100644 --- a/module-services/service-gui/ServiceGUI.hpp +++ b/module-services/service-gui/ServiceGUI.hpp @@ -73,7 +73,9 @@ public: sys::ReturnCodes DeinitHandler() override; - sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{return sys::ReturnCodes::Success;} + sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final{ + LOG_FATAL("[ServiceAudio] PowerModeHandler: %d", static_cast(mode)); + return sys::ReturnCodes::Success;} }; } /* namespace sgui */ diff --git a/module-sys/SystemManager/SystemManager.cpp b/module-sys/SystemManager/SystemManager.cpp index 8a1cf9292..6ae627815 100644 --- a/module-sys/SystemManager/SystemManager.cpp +++ b/module-sys/SystemManager/SystemManager.cpp @@ -75,25 +75,29 @@ namespace sys { bool SystemManager::SuspendSystem(Service *caller) { - for(const auto &w : servicesList){ - if(w->GetName() != caller->GetName()){ + for (auto w = servicesList.rbegin(); w != servicesList.rend(); ++w) + { + if((*w)->parent == "" && (*w)->GetName() != caller->GetName()){ auto ret = Bus::SendUnicast(std::make_shared(SystemMessageType::SwitchPowerMode,ServicePowerMode::SuspendToRAM), - w->GetName(), caller); - if(!ret){ - LOG_FATAL("Service %s failed to enter low-power mode",w->GetName().c_str()); + (*w)->GetName(), caller,1000); + + auto resp = std::static_pointer_cast(ret.second); + if (ret.first != ReturnCodes::Success && (resp->retCode != ReturnCodes::Success)){ + LOG_FATAL("Service %s failed to enter low-power mode",(*w)->GetName().c_str()); } } - } } bool SystemManager::ResumeSystem(Service *caller) { for(const auto &w : servicesList){ - if(w->GetName() != caller->GetName()){ + if(w->parent == "" && w->GetName() != caller->GetName()){ auto ret = Bus::SendUnicast(std::make_shared(SystemMessageType::SwitchPowerMode,ServicePowerMode::Active), - w->GetName(), caller); - if(!ret){ + w->GetName(), caller,1000); + auto resp = std::static_pointer_cast(ret.second); + + if (ret.first != ReturnCodes::Success && (resp->retCode != ReturnCodes::Success)){ LOG_FATAL("Service %s failed to exit low-power mode",w->GetName().c_str()); } } @@ -102,6 +106,26 @@ namespace sys { } } + bool SystemManager::SuspendService(const std::string &name, sys::Service *caller) { + auto ret = Bus::SendUnicast(std::make_shared(SystemMessageType::SwitchPowerMode,ServicePowerMode::SuspendToRAM), + name, caller,1000); + auto resp = std::static_pointer_cast(ret.second); + + if (ret.first != ReturnCodes::Success && (resp->retCode != ReturnCodes::Success)){ + LOG_FATAL("Service %s failed to exit low-power mode",name.c_str()); + } + } + + bool SystemManager::ResumeService(const std::string &name, sys::Service *caller){ + auto ret = Bus::SendUnicast(std::make_shared(SystemMessageType::SwitchPowerMode,ServicePowerMode::Active), + name, caller,1000); + auto resp = std::static_pointer_cast(ret.second); + + if (ret.first != ReturnCodes::Success && (resp->retCode != ReturnCodes::Success)){ + LOG_FATAL("Service %s failed to exit low-power mode",name.c_str()); + } + } + bool SystemManager::CreateService(std::shared_ptr service, Service *caller, TickType_t timeout) { diff --git a/module-sys/SystemManager/SystemManager.hpp b/module-sys/SystemManager/SystemManager.hpp index 0eb5fe906..29361073d 100644 --- a/module-sys/SystemManager/SystemManager.hpp +++ b/module-sys/SystemManager/SystemManager.hpp @@ -53,6 +53,10 @@ public: static bool ResumeSystem(Service* caller); + static bool SuspendService(const std::string& name,Service* caller); + + static bool ResumeService(const std::string& name,Service* caller); + // Create new service static bool CreateService(std::shared_ptr service,Service* caller,TickType_t timeout=5000); diff --git a/source/main.cpp b/source/main.cpp index 008d504a7..074d6891e 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -47,7 +47,7 @@ class BlinkyService : public sys::Service { public: BlinkyService(const std::string &name) : sys::Service(name) { - timer_id = CreateTimer(500, true); + timer_id = CreateTimer(5000, true); ReloadTimer(timer_id); } @@ -57,11 +57,11 @@ public: // Invoked upon receiving data message sys::Message_t DataReceivedHandler(sys::DataMessage *msgl,sys::ResponseMessage* resp=nullptr) override { -#if 0 // M.P: left here on purpose +#if 1 // M.P: left here on purpose //auto ret = AudioServiceAPI::PlaybackStart(this,"/home/mateusz/Music/limowreck.mp3"); - auto ret = AudioServiceAPI::PlaybackStart(this,"sys/audio/limowreck.flac"); +/* auto ret = AudioServiceAPI::PlaybackStart(this,"sys/audio/limowreck.flac"); AudioServiceAPI::Stop(this); - AudioServiceAPI::PlaybackStart(this,"sys/audio/limowreck.flac"); + AudioServiceAPI::PlaybackStart(this,"sys/audio/limowreck.flac");*/ //vTaskDelay(3000); //AudioServiceAPI::SetOutputVolume(this,0.6); //auto ret = AudioServiceAPI::RecordingStart(this,"sys/audio/rec1mono.wav"); @@ -82,13 +82,16 @@ public: #endif //sys::SystemManager::DestroyService(ServiceAudio::serviceName,this); + sys::SystemManager::SuspendSystem(this); + sys::SystemManager::ResumeSystem(this); + return std::make_shared(); } // Invoked when timer ticked void TickHandler(uint32_t id) override { -#if 0 // M.P: left here on purpose +#if 1 // M.P: left here on purpose LOG_DEBUG("Blinky service tick!"); stopTimer(timer_id);