~aleteoryx/muditaos

462a7393d9395b9c776e14676c97988b7058637a — Lukasz Mastalerz 2 years ago 14046eb
[BH-1412] Fix system shutdown procedure

Changed startup services order.
Prevent handling multiple "close ready" messages from one service while closing
system.
Introduced a new state in ServiceGUI.
Fixed a problem with turning on Harmony with a connected USB cable.
M module-services/service-desktop/include/service-desktop/ServiceDesktopDependencies.hpp => module-services/service-desktop/include/service-desktop/ServiceDesktopDependencies.hpp +2 -2
@@ 4,7 4,7 @@
#pragma once

#include "ServiceDesktopName.hpp"
#include <service-eink/ServiceEinkDependencies.hpp>
#include <service-gui/ServiceGUIDependencies.hpp>
#include <string>
#include <vector>



@@ 16,7 16,7 @@ namespace sys::dependencies
    template <>
    inline std::vector<std::string> getDependenciesFor<ServiceDesktop>()
    {
        return sys::dependencies::getDependenciesTo<service::eink::ServiceEink>();
        return sys::dependencies::getDependenciesTo<service::gui::ServiceGUI>();
    }

    template <>

M module-services/service-gui/ServiceGUI.cpp => module-services/service-gui/ServiceGUI.cpp +10 -4
@@ 100,6 100,7 @@ namespace service::gui
    {
        if (isInState(ServiceGUIState::Idle)) {
            sendCloseReadyMessage(this);
            setState(ServiceGUIState::ReadyToClose);
            return;
        }
        else {


@@ 227,6 228,7 @@ namespace service::gui

    sys::MessagePointer ServiceGUI::handleImageDisplayedNotification(sys::Message *message)
    {
        setState(ServiceGUIState::Idle);
        const auto msg       = static_cast<eink::ImageDisplayedNotification *>(message);
        const auto contextId = msg->getContextId();
        contextPool->returnContext(contextId);


@@ 234,14 236,15 @@ namespace service::gui

        // Even if the next render is already cached, if any context in the pool is currently being processed, then
        // we better wait for it.
        if (isInState(ServiceGUIState::ReadyToClose)) {
            LOG_WARN("Post closing notification.");
        }
        if (isNextFrameReady() and not isAnyFrameBeingRenderedOrDisplayed()) {
            trySendNextFrame();
        }
        else if (isInState(ServiceGUIState::Closing)) {
            sendCloseReadyMessage(this);
        }
        else {
            setState(ServiceGUIState::Idle);
            setState(ServiceGUIState::ReadyToClose);
        }
        return sys::MessageNone{};
    }


@@ 267,7 270,10 @@ namespace service::gui

    void ServiceGUI::setState(const ServiceGUIState &nextState)
    {
        if (isInState(ServiceGUIState::Closing)) {
        if (isInState(ServiceGUIState::ReadyToClose)) {
            return;
        }
        if (isInState(ServiceGUIState::Closing) && (nextState != ServiceGUIState::ReadyToClose)) {
            return;
        }
        state = nextState;

M module-services/service-gui/service-gui/ServiceGUI.hpp => module-services/service-gui/service-gui/ServiceGUI.hpp +3 -2
@@ 34,10 34,11 @@ namespace service::gui

        enum class ServiceGUIState
        {
            Displaying,
            Idle = 0,
            Rendering,
            Displaying,
            Closing,
            Idle
            ReadyToClose
        };

      public:

M module-services/service-gui/service-gui/ServiceGUIDependencies.hpp => module-services/service-gui/service-gui/ServiceGUIDependencies.hpp +2 -2
@@ 3,7 3,7 @@

#pragma once

#include <service-desktop/ServiceDesktopDependencies.hpp>
#include <service-eink/ServiceEinkDependencies.hpp>
#include <service-gui/ServiceGUIName.hpp>
#include <string>
#include <vector>


@@ 17,7 17,7 @@ namespace sys::dependencies
    template <>
    inline std::vector<std::string> getDependenciesFor<service::gui::ServiceGUI>()
    {
        return sys::dependencies::getDependenciesTo<ServiceDesktop>();
        return sys::dependencies::getDependenciesTo<service::eink::ServiceEink>();
    }

    template <>

M module-sys/SystemManager/SystemManagerCommon.cpp => module-sys/SystemManager/SystemManagerCommon.cpp +4 -0
@@ 473,6 473,10 @@ namespace sys
            serviceCloseTimer.stop();

            const auto message = static_cast<ReadyToCloseMessage *>(msg);
            if (std::find(servicesToClose.begin(), servicesToClose.end(), message->sender) == servicesToClose.end()) {
                LOG_ERROR("%s is not on the list. Further processing skipped.", message->sender.c_str());
                return;
            }
            LOG_INFO("ready to close %s", message->sender.c_str());
            servicesToClose.erase(std::remove(servicesToClose.begin(), servicesToClose.end(), message->sender),
                                  servicesToClose.end());

M products/BellHybrid/apps/application-bell-main/ApplicationBellMain.cpp => products/BellHybrid/apps/application-bell-main/ApplicationBellMain.cpp +3 -1
@@ 80,7 80,9 @@ namespace app
        });

        connect(typeid(sdesktop::usb::USBConfigured), [&](sys::Message *msg) -> sys::MessagePointer {
            homeScreenPresenter->setUSBStatusConnected();
            if (getCurrentWindow()->getName() == gui::name::window::main_window) {
                homeScreenPresenter->setUSBStatusConnected();
            }
            return sys::msgHandled();
        });
        connect(typeid(AlarmDeactivated), [this](sys::Message *request) -> sys::MessagePointer {