~aleteoryx/muditaos

22102c4ba5888a0e7aff06ef8c6dacab156f94c2 — Piotr Tanski 5 years ago 41e8e6d
[EGD-4200] Message handling refactored. (#974)

85 files changed, 518 insertions(+), 552 deletions(-)

M CMakeLists.txt
M changelog.md
M module-apps/Application.cpp
M module-apps/Application.hpp
M module-apps/application-antenna/ApplicationAntenna.cpp
M module-apps/application-antenna/ApplicationAntenna.hpp
M module-apps/application-calculator/ApplicationCalculator.cpp
M module-apps/application-calculator/ApplicationCalculator.hpp
M module-apps/application-calendar/ApplicationCalendar.cpp
M module-apps/application-calendar/ApplicationCalendar.hpp
M module-apps/application-call/ApplicationCall.cpp
M module-apps/application-call/ApplicationCall.hpp
M module-apps/application-calllog/ApplicationCallLog.cpp
M module-apps/application-calllog/ApplicationCallLog.hpp
M module-apps/application-clock/ApplicationClock.cpp
M module-apps/application-clock/ApplicationClock.hpp
M module-apps/application-desktop/ApplicationDesktop.cpp
M module-apps/application-desktop/ApplicationDesktop.hpp
M module-apps/application-meditation/ApplicationMeditation.cpp
M module-apps/application-meditation/ApplicationMeditation.hpp
M module-apps/application-messages/ApplicationMessages.cpp
M module-apps/application-messages/ApplicationMessages.hpp
M module-apps/application-music-player/ApplicationMusicPlayer.cpp
M module-apps/application-music-player/ApplicationMusicPlayer.hpp
M module-apps/application-notes/ApplicationNotes.cpp
M module-apps/application-notes/ApplicationNotes.hpp
M module-apps/application-phonebook/ApplicationPhonebook.cpp
M module-apps/application-phonebook/ApplicationPhonebook.hpp
M module-apps/application-settings-new/ApplicationSettings.cpp
M module-apps/application-settings-new/ApplicationSettings.hpp
M module-apps/application-settings/ApplicationSettings.cpp
M module-apps/application-settings/ApplicationSettings.hpp
M module-apps/application-settings/windows/Fota.cpp
M module-apps/application-special-input/ApplicationSpecialInput.cpp
M module-apps/application-special-input/ApplicationSpecialInput.hpp
M module-services/service-antenna/ServiceAntenna.cpp
M module-services/service-antenna/service-antenna/ServiceAntenna.hpp
M module-services/service-appmgr/model/ApplicationManager.cpp
M module-services/service-appmgr/service-appmgr/Message.hpp
M module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp
M module-services/service-audio/ServiceAudio.cpp
M module-services/service-audio/ServiceAudio.hpp
M module-services/service-bluetooth/ServiceBluetooth.cpp
M module-services/service-bluetooth/ServiceBluetooth.hpp
M module-services/service-bluetooth/messages/BluetoothMessage.hpp
M module-services/service-cellular/ServiceCellular.cpp
M module-services/service-cellular/ServiceCellular.hpp
M module-services/service-db/ServiceDB.cpp
M module-services/service-db/ServiceDB.hpp
M module-services/service-db/agents/file_indexer/FileIndexerAgent.cpp
M module-services/service-db/agents/file_indexer/FileIndexerAgent.hpp
M module-services/service-db/agents/settings/Settings.cpp
M module-services/service-db/agents/settings/Settings.hpp
M module-services/service-db/agents/settings/SettingsAgent.cpp
M module-services/service-db/agents/settings/SettingsAgent.hpp
M module-services/service-db/api/DBServiceAPI.hpp
M module-services/service-db/api/DBServiceAPI_GetByQuery.cpp
M module-services/service-db/test/test-service-db-settings-messages.cpp
M module-services/service-db/test/test-service-db-settings-testapps.hpp
M module-services/service-db/test/test-service-db-settings-testservices.hpp
M module-services/service-desktop/ServiceDesktop.cpp
M module-services/service-desktop/ServiceDesktop.hpp
M module-services/service-eink/ServiceEink.cpp
M module-services/service-eink/ServiceEink.hpp
M module-services/service-evtmgr/EventManager.cpp
M module-services/service-evtmgr/EventManager.hpp
M module-services/service-fileindexer/ServiceFileIndexer.cpp
M module-services/service-fileindexer/ServiceFileIndexer.hpp
M module-services/service-fota/ServiceFota.cpp
M module-services/service-fota/ServiceFota.hpp
M module-services/service-gui/ServiceGUI.cpp
M module-services/service-gui/ServiceGUI.hpp
M module-services/service-lwip/ServiceLwIP.cpp
M module-services/service-lwip/ServiceLwIP.hpp
M module-services/service-time/ServiceTime.cpp
M module-services/service-time/ServiceTime.hpp
M module-sys/README.md
M module-sys/Service/Bus.cpp
M module-sys/Service/Bus.hpp
M module-sys/Service/Message.cpp
M module-sys/Service/Message.hpp
M module-sys/Service/Service.cpp
M module-sys/Service/Service.hpp
M module-sys/SystemManager/SystemManager.cpp
M module-sys/SystemManager/SystemManager.hpp
M CMakeLists.txt => CMakeLists.txt +1 -1
@@ 96,7 96,7 @@ add_compile_options( ${TARGET_COMPILE_OPTIONS}
                     -fno-builtin
                     -fno-diagnostics-color
                     # warning flags
                     -Wall -Wextra -Werror -Wno-unused-parameter)
                     -Wall -Wextra -Werror -Wno-unused-parameter -Wno-error=deprecated-declarations)

target_compile_features(${PROJECT_NAME} PUBLIC
        ${TARGET_COMPILE_FEATURES})

M changelog.md => changelog.md +1 -0
@@ 10,6 10,7 @@
## Changed

* `[calendar]` Set 'all day' as a default option
* `[bus]` Message handling refactored.

### Fixed


M module-apps/Application.cpp => module-apps/Application.cpp +21 -22
@@ 76,9 76,8 @@ namespace app
        longPressTimer = std::make_unique<sys::Timer>("LongPress", this, key_timer_ms);
        longPressTimer->connect([&](sys::Timer &) { longPressTimerCallback(); });

        connect(typeid(AppRefreshMessage), [this](sys::DataMessage *msg, sys::ResponseMessage *) -> sys::Message_t {
            return handleAppRefresh(msg);
        });
        connect(typeid(AppRefreshMessage),
                [this](sys::Message *msg) -> sys::MessagePointer { return handleAppRefresh(msg); });
    }

    Application::~Application() = default;


@@ 197,7 196,7 @@ namespace app
        }
    }

    sys::Message_t Application::DataReceivedHandler(sys::DataMessage *msgl)
    sys::MessagePointer Application::DataReceivedHandler(sys::DataMessage *msgl)
    {
        auto msg = dynamic_cast<CellularNotificationMessage *>(msgl);
        if (msg != nullptr) {


@@ 253,7 252,7 @@ namespace app
        return msgNotHandled();
    }

    sys::Message_t Application::handleSignalStrengthUpdate(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleSignalStrengthUpdate(sys::Message *msgl)
    {
        if ((state == State::ACTIVE_FORGROUND) && getCurrentWindow()->updateSignalStrength()) {
            refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST);


@@ 261,7 260,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleNetworkAccessTechnologyUpdate(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleNetworkAccessTechnologyUpdate(sys::Message *msgl)
    {
        if ((state == State::ACTIVE_FORGROUND) && getCurrentWindow()->updateNetworkAccessTechnology()) {
            refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST);


@@ 269,7 268,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleInputEvent(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleInputEvent(sys::Message *msgl)
    {
        AppInputEventMessage *msg = reinterpret_cast<AppInputEventMessage *>(msgl);
        if (msg->getEvent().state == gui::InputEvent::State::keyPressed) {


@@ 284,7 283,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleKBDKeyEvent(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleKBDKeyEvent(sys::Message *msgl)
    {
        if (this->getState() != app::Application::State::ACTIVE_FORGROUND) {
            LOG_FATAL("!!! Terrible terrible damage! application with no focus grabbed key!");


@@ 297,7 296,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleBatteryLevel(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleBatteryLevel(sys::Message *msgl)
    {
        auto msg = static_cast<sevm::BatteryLevelMessage *>(msgl);
        LOG_INFO("Application battery level: %d", msg->levelPercents);


@@ 308,7 307,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleChargerPlugged(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleChargerPlugged(sys::Message *msgl)
    {
        auto *msg = static_cast<sevm::BatteryPlugMessage *>(msgl);
        if (msg->plugged == true) {


@@ 326,7 325,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleMinuteUpdated(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleMinuteUpdated(sys::Message *msgl)
    {
        auto *msg = static_cast<sevm::RtcMinuteAlarmMessage *>(msgl);
        getCurrentWindow()->updateTime(msg->timestamp, !settings.timeFormat12);


@@ 336,7 335,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleAction(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleAction(sys::Message *msgl)
    {
        auto *msg         = static_cast<AppActionRequest *>(msgl);
        const auto action = msg->getAction();


@@ 348,13 347,13 @@ namespace app
        catch (const std::out_of_range &) {
            LOG_ERROR("Application %s is not able to handle action #%d", GetName().c_str(), action);
        }
        return msgHandled();
        return msgNotHandled();
    }

    sys::Message_t Application::handleApplicationSwitch(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleApplicationSwitch(sys::Message *msgl)
    {
        auto *msg             = static_cast<AppSwitchMessage *>(msgl);
        bool handled          = false;
        auto *msg    = static_cast<AppSwitchMessage *>(msgl);
        bool handled = false;
        LOG_DEBUG("AppSwitch: %s", msg->getTargetApplicationName().c_str());
        // Application is starting or it is in the background. Upon switch command if name if correct it goes
        // foreground


@@ 398,7 397,7 @@ namespace app
        return msgNotHandled();
    }

    sys::Message_t Application::handleSwitchWindow(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleSwitchWindow(sys::Message *msgl)
    {
        auto msg = static_cast<AppSwitchWindowMessage *>(msgl);
        // check if specified window is in the application


@@ 433,14 432,14 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleAppClose(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleAppClose(sys::Message *msgl)
    {
        setState(State::DEACTIVATING);
        app::manager::Controller::confirmClose(this);
        return msgHandled();
    }

    sys::Message_t Application::handleAppRebuild(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleAppRebuild(sys::Message *msgl)
    {
        LOG_INFO("Application %s rebuilding gui", GetName().c_str());
        for (auto &[name, window] : windowsStack) {


@@ 455,7 454,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleAppRefresh(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleAppRefresh(sys::Message *msgl)
    {
        auto *msg = static_cast<AppRefreshMessage *>(msgl);
        assert(msg);


@@ 469,7 468,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleAppFocusLost(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleAppFocusLost(sys::Message *msgl)
    {
        if (state == State::ACTIVE_FORGROUND) {
            setState(State::ACTIVE_BACKGROUND);


@@ 478,7 477,7 @@ namespace app
        return msgHandled();
    }

    sys::Message_t Application::handleSIMMessage(sys::DataMessage *msgl)
    sys::MessagePointer Application::handleSIMMessage(sys::Message *msgl)
    {
        getCurrentWindow()->setSIM();
        refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST);

M module-apps/Application.hpp => module-apps/Application.hpp +20 -20
@@ 9,7 9,7 @@
#include "Interface/SettingsRecord.hpp"                 // for SettingsRecord
#include "Service/Bus.hpp"                              // for Bus
#include "Service/Common.hpp"                           // for ReturnCodes
#include "Service/Message.hpp"                          // for Message_t
#include "Service/Message.hpp"                          // for MessagePointer
#include "Service/Service.hpp"                          // for Service
#include "SwitchData.hpp"                               // for SwitchData
#include "SystemManager/SystemManager.hpp"              // for SystemManager


@@ 61,12 61,12 @@ namespace app
    class Application;
    class GuiTimer;

    inline auto msgHandled() -> sys::Message_t
    inline auto msgHandled() -> sys::MessagePointer
    {
        return std::make_shared<sys::ResponseMessage>();
    }

    inline auto msgNotHandled() -> sys::Message_t
    inline auto msgNotHandled() -> sys::MessagePointer
    {
        return std::make_shared<sys::ResponseMessage>(sys::ReturnCodes::Unresolved);
    }


@@ 154,27 154,27 @@ namespace app
        /// c_str() function for Application::State
        static const char *stateStr(State st);

        using OnActionReceived = std::function<void(manager::actions::ActionParamsPtr &&)>;
        using OnActionReceived = std::function<sys::MessagePointer(manager::actions::ActionParamsPtr &&)>;

      private:
        std::string default_window;
        State state = State::DEACTIVATED;

        sys::Message_t handleSignalStrengthUpdate(sys::DataMessage *msgl);
        sys::Message_t handleNetworkAccessTechnologyUpdate(sys::DataMessage *msgl);
        sys::Message_t handleInputEvent(sys::DataMessage *msgl);
        sys::Message_t handleKBDKeyEvent(sys::DataMessage *msgl);
        sys::Message_t handleBatteryLevel(sys::DataMessage *msgl);
        sys::Message_t handleChargerPlugged(sys::DataMessage *msgl);
        sys::Message_t handleMinuteUpdated(sys::DataMessage *msgl);
        sys::Message_t handleAction(sys::DataMessage *msgl);
        sys::Message_t handleApplicationSwitch(sys::DataMessage *msgl);
        sys::Message_t handleSwitchWindow(sys::DataMessage *msgl);
        sys::Message_t handleAppClose(sys::DataMessage *msgl);
        sys::Message_t handleAppRebuild(sys::DataMessage *msgl);
        sys::Message_t handleAppRefresh(sys::DataMessage *msgl);
        sys::Message_t handleAppFocusLost(sys::DataMessage *msgl);
        sys::Message_t handleSIMMessage(sys::DataMessage *msgl);
        sys::MessagePointer handleSignalStrengthUpdate(sys::Message *msgl);
        sys::MessagePointer handleNetworkAccessTechnologyUpdate(sys::Message *msgl);
        sys::MessagePointer handleInputEvent(sys::Message *msgl);
        sys::MessagePointer handleKBDKeyEvent(sys::Message *msgl);
        sys::MessagePointer handleBatteryLevel(sys::Message *msgl);
        sys::MessagePointer handleChargerPlugged(sys::Message *msgl);
        sys::MessagePointer handleMinuteUpdated(sys::Message *msgl);
        sys::MessagePointer handleAction(sys::Message *msgl);
        sys::MessagePointer handleApplicationSwitch(sys::Message *msgl);
        sys::MessagePointer handleSwitchWindow(sys::Message *msgl);
        sys::MessagePointer handleAppClose(sys::Message *msgl);
        sys::MessagePointer handleAppRebuild(sys::Message *msgl);
        sys::MessagePointer handleAppRefresh(sys::Message *msgl);
        sys::MessagePointer handleAppFocusLost(sys::Message *msgl);
        sys::MessagePointer handleSIMMessage(sys::Message *msgl);

        std::list<std::unique_ptr<app::GuiTimer>> gui_timers;
        std::unordered_map<manager::actions::ActionId, OnActionReceived> receivers;


@@ 234,7 234,7 @@ namespace app

        /// Mehtod to handle bus messages, all message types are defined in Message.hpp
        /// Message types are in MessageType
        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl);
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl);

        /// initialization function
        /// 1. it has to be called for each and every application instance, it registeres application in

M module-apps/application-antenna/ApplicationAntenna.cpp => module-apps/application-antenna/ApplicationAntenna.cpp +1 -1
@@ 48,7 48,7 @@ namespace app
    {}

    // Invoked upon receiving data message
    sys::Message_t ApplicationAntenna::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationAntenna::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        auto retMsg = Application::DataReceivedHandler(msgl);
        // if message was handled by application's template there is no need to process further.

M module-apps/application-antenna/ApplicationAntenna.hpp => module-apps/application-antenna/ApplicationAntenna.hpp +1 -1
@@ 50,7 50,7 @@ namespace app
                           StartInBackground startInBackground = {false});
        virtual ~ApplicationAntenna();

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-calculator/ApplicationCalculator.cpp => module-apps/application-calculator/ApplicationCalculator.cpp +1 -1
@@ 13,7 13,7 @@ namespace app
        : Application(name, parent, startInBackground, stack_size)
    {}

    sys::Message_t ApplicationCalculator::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationCalculator::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        return Application::DataReceivedHandler(msgl);
    }

M module-apps/application-calculator/ApplicationCalculator.hpp => module-apps/application-calculator/ApplicationCalculator.hpp +1 -1
@@ 18,7 18,7 @@ namespace app
                              StartInBackground startInBackground = {false});
        ~ApplicationCalculator() override = default;

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-calendar/ApplicationCalendar.cpp => module-apps/application-calendar/ApplicationCalendar.cpp +1 -1
@@ 52,7 52,7 @@ namespace app
        busChannels.push_back(sys::BusChannels::ServiceDBNotifications);
    }

    sys::Message_t ApplicationCalendar::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationCalendar::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        auto retMsg = Application::DataReceivedHandler(msgl);
        // if message was handled by application's template there is no need to process further.

M module-apps/application-calendar/ApplicationCalendar.hpp => module-apps/application-calendar/ApplicationCalendar.hpp +1 -1
@@ 29,7 29,7 @@ namespace app
                            uint32_t stackDepth                 = 8192,
                            sys::ServicePriority priority       = sys::ServicePriority::Idle);

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-call/ApplicationCall.cpp => module-apps/application-call/ApplicationCall.cpp +5 -3
@@ 33,8 33,10 @@ namespace app
    ApplicationCall::ApplicationCall(std::string name, std::string parent, StartInBackground startInBackground)
        : Application(name, parent, startInBackground, app::call_stack_size)
    {
        addActionReceiver(manager::actions::Call,
                          [this](auto data) { switchWindow(window::name_enterNumber, std::move(data)); });
        addActionReceiver(manager::actions::Call, [this](auto data) {
            switchWindow(window::name_enterNumber, std::move(data));
            return msgHandled();
        });
    }

    //  number of seconds after end call to switch back to previous application


@@ 71,7 73,7 @@ namespace app
    }

    // Invoked upon receiving data message
    sys::Message_t ApplicationCall::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationCall::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {

        auto retMsg = Application::DataReceivedHandler(msgl);

M module-apps/application-call/ApplicationCall.hpp => module-apps/application-call/ApplicationCall.hpp +1 -1
@@ 41,7 41,7 @@ namespace app
        ApplicationCall(std::string name                    = name_call,
                        std::string parent                  = {},
                        StartInBackground startInBackground = {false});
        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-calllog/ApplicationCallLog.cpp => module-apps/application-calllog/ApplicationCallLog.cpp +1 -1
@@ 33,7 33,7 @@ namespace app
    }

    // Invoked upon receiving data message
    sys::Message_t ApplicationCallLog::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationCallLog::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {

        auto retMsg = Application::DataReceivedHandler(msgl);

M module-apps/application-calllog/ApplicationCallLog.hpp => module-apps/application-calllog/ApplicationCallLog.hpp +1 -1
@@ 20,7 20,7 @@ namespace app
                           StartInBackground startInBackground = {false});
        ~ApplicationCallLog() override;

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-clock/ApplicationClock.cpp => module-apps/application-clock/ApplicationClock.cpp +1 -1
@@ 41,7 41,7 @@ namespace app
    }

    // Invoked upon receiving data message
    sys::Message_t ApplicationClock::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationClock::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {

        auto retMsg = Application::DataReceivedHandler(msgl);

M module-apps/application-clock/ApplicationClock.hpp => module-apps/application-clock/ApplicationClock.hpp +1 -1
@@ 24,7 24,7 @@ namespace app
                         uint32_t stackDepth                 = 4096,
                         sys::ServicePriority priority       = sys::ServicePriority::Idle);

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-desktop/ApplicationDesktop.cpp => module-apps/application-desktop/ApplicationDesktop.cpp +3 -3
@@ 38,7 38,7 @@ namespace app
    }

    // Invoked upon receiving data message
    sys::Message_t ApplicationDesktop::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationDesktop::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {

        auto retMsg = Application::DataReceivedHandler(msgl);


@@ 224,7 224,7 @@ namespace app
        createUserInterface();
        setActiveWindow(gui::name::window::main_window);

        connect(sdesktop::UpdateOsMessage(), [&](sys::DataMessage *msg, sys::ResponseMessage *resp) {
        connect(sdesktop::UpdateOsMessage(), [&](sys::Message *msg) {
            auto *updateMsg = dynamic_cast<sdesktop::UpdateOsMessage *>(msg);
            if (updateMsg != nullptr && updateMsg->messageType == updateos::UpdateMessageType::UpdateFoundOnBoot) {



@@ 241,7 241,7 @@ namespace app
                    getWindow(app::window::name::desktop_update)->handleSwitchData(data.get());
                }
            }
            return std::make_shared<sys::ResponseMessage>();
            return msgHandled();
        });

        auto msgToSend =

M module-apps/application-desktop/ApplicationDesktop.hpp => module-apps/application-desktop/ApplicationDesktop.hpp +1 -1
@@ 50,7 50,7 @@ namespace app
                           std::string parent                  = {},
                           StartInBackground startInBackground = {false});
        virtual ~ApplicationDesktop();
        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-meditation/ApplicationMeditation.cpp => module-apps/application-meditation/ApplicationMeditation.cpp +1 -1
@@ 28,7 28,7 @@ namespace app
    }

    auto ApplicationMeditation::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
        -> sys::Message_t
        -> sys::MessagePointer
    {
        return Application::DataReceivedHandler(msgl);
    }

M module-apps/application-meditation/ApplicationMeditation.hpp => module-apps/application-meditation/ApplicationMeditation.hpp +1 -1
@@ 20,7 20,7 @@ namespace app
                                       StartInBackground startInBackground = {false});

        auto InitHandler() -> sys::ReturnCodes override;
        auto DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::Message_t override;
        auto DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::MessagePointer override;
        auto SwitchPowerModeHandler(sys::ServicePowerMode mode) -> sys::ReturnCodes final;

        void createUserInterface() override;

M module-apps/application-messages/ApplicationMessages.cpp => module-apps/application-messages/ApplicationMessages.cpp +1 -1
@@ 46,7 46,7 @@ namespace app
    {}

    // Invoked upon receiving data message
    sys::Message_t ApplicationMessages::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationMessages::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        auto retMsg = Application::DataReceivedHandler(msgl);
        // if message was handled by application's template there is no need to process further.

M module-apps/application-messages/ApplicationMessages.hpp => module-apps/application-messages/ApplicationMessages.hpp +1 -1
@@ 43,7 43,7 @@ namespace app
                            StartInBackground startInBackground = {false});
        virtual ~ApplicationMessages();

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;

        sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final

M module-apps/application-music-player/ApplicationMusicPlayer.cpp => module-apps/application-music-player/ApplicationMusicPlayer.cpp +1 -1
@@ 26,7 26,7 @@ namespace app
        LOG_INFO("ApplicationMusicPlayer::destroy");
    }

    sys::Message_t ApplicationMusicPlayer::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationMusicPlayer::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        return Application::DataReceivedHandler(msgl);
    }

M module-apps/application-music-player/ApplicationMusicPlayer.hpp => module-apps/application-music-player/ApplicationMusicPlayer.hpp +1 -1
@@ 32,7 32,7 @@ namespace app
                               StartInBackground startInBackground = {false});
        virtual ~ApplicationMusicPlayer();

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-notes/ApplicationNotes.cpp => module-apps/application-notes/ApplicationNotes.cpp +1 -1
@@ 20,7 20,7 @@ namespace app
    }

    // Invoked upon receiving data message
    sys::Message_t ApplicationNotes::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ApplicationNotes::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {

        auto retMsg = Application::DataReceivedHandler(msgl);

M module-apps/application-notes/ApplicationNotes.hpp => module-apps/application-notes/ApplicationNotes.hpp +1 -1
@@ 18,7 18,7 @@ namespace app
                         std::string parent                  = {},
                         StartInBackground startInBackground = {false});
        virtual ~ApplicationNotes();
        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-phonebook/ApplicationPhonebook.cpp => module-apps/application-phonebook/ApplicationPhonebook.cpp +2 -1
@@ 28,7 28,8 @@ namespace app
    }

    // Invoked upon receiving data message
    auto ApplicationPhonebook::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::Message_t
    auto ApplicationPhonebook::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
        -> sys::MessagePointer
    {

        auto retMsg = Application::DataReceivedHandler(msgl);

M module-apps/application-phonebook/ApplicationPhonebook.hpp => module-apps/application-phonebook/ApplicationPhonebook.hpp +1 -1
@@ 36,7 36,7 @@ namespace app
                             StartInBackground startInBackground = {false});
        ~ApplicationPhonebook() override = default;

        auto DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::Message_t override;
        auto DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::MessagePointer override;
        auto InitHandler() -> sys::ReturnCodes override;

        auto SwitchPowerModeHandler(const sys::ServicePowerMode mode) -> sys::ReturnCodes final

M module-apps/application-settings-new/ApplicationSettings.cpp => module-apps/application-settings-new/ApplicationSettings.cpp +1 -1
@@ 38,7 38,7 @@ namespace app

    // Invoked upon receiving data message
    auto ApplicationSettingsNew::DataReceivedHandler(sys::DataMessage *msgl,
                                                     [[maybe_unused]] sys::ResponseMessage *resp) -> sys::Message_t
                                                     [[maybe_unused]] sys::ResponseMessage *resp) -> sys::MessagePointer
    {
        auto retMsg = Application::DataReceivedHandler(msgl);
        // if message was handled by application's template there is no need to process further.

M module-apps/application-settings-new/ApplicationSettings.hpp => module-apps/application-settings-new/ApplicationSettings.hpp +1 -1
@@ 53,7 53,7 @@ namespace app
        ApplicationSettingsNew(std::string name                    = name_settings_new,
                               std::string parent                  = {},
                               StartInBackground startInBackground = {false});
        auto DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::Message_t override;
        auto DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::MessagePointer override;
        auto InitHandler() -> sys::ReturnCodes override;

        auto SwitchPowerModeHandler(const sys::ServicePowerMode mode) -> sys::ReturnCodes final

M module-apps/application-settings/ApplicationSettings.cpp => module-apps/application-settings/ApplicationSettings.cpp +2 -1
@@ 42,7 42,8 @@ namespace app
    {}

    // Invoked upon receiving data message
    sys::Message_t ApplicationSettings::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage * /*resp*/)
    sys::MessagePointer ApplicationSettings::DataReceivedHandler(sys::DataMessage *msgl,
                                                                 sys::ResponseMessage * /*resp*/)
    {

        auto retMsg = Application::DataReceivedHandler(msgl);

M module-apps/application-settings/ApplicationSettings.hpp => module-apps/application-settings/ApplicationSettings.hpp +1 -1
@@ 22,7 22,7 @@ namespace app
                            std::string parent                  = {},
                            StartInBackground startInBackground = {false});
        virtual ~ApplicationSettings();
        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;


M module-apps/application-settings/windows/Fota.cpp => module-apps/application-settings/windows/Fota.cpp +4 -4
@@ 215,7 215,7 @@ void Fota::registerHandlers()
void Fota::handleInternetNotification()
{
    LOG_DEBUG("handle IntrntNotificationMassage");
    app->connect(FotaService::NotificationMessage(), [&](sys::DataMessage *req, sys::ResponseMessage * /*response*/) {
    app->connect(FotaService::NotificationMessage(), [&](sys::Message *req) {
        LOG_DEBUG("IntrntNotificationMassage");
        if (auto msg = dynamic_cast<FotaService::NotificationMessage *>(req)) {
            LOG_DEBUG("IntrntNotificationMassage: %s", msg->c_str());


@@ 250,7 250,7 @@ void Fota::handleInternetNotification()
void Fota::handleHTTPResponse()
{
    LOG_DEBUG("Handling http response");
    app->connect(FotaService::HTTPResponseMessage(), [&](sys::DataMessage *req, sys::ResponseMessage * /*response*/) {
    app->connect(FotaService::HTTPResponseMessage(), [&](sys::Message *req) {
        if (auto msg = dynamic_cast<FotaService::HTTPResponseMessage *>(req)) {
            LOG_DEBUG("HTTP Response to: %s", msg->url.c_str());
            LOG_DEBUG("HTPP AT Error   : %s", FotaService::toString(msg->httpError).c_str());


@@ 285,7 285,7 @@ void Fota::handleHTTPResponse()

void Fota::handleFotaProgres()
{
    app->connect(FotaService::FOTAProgres(), [&](sys::DataMessage *req, sys::ResponseMessage * /*response*/) {
    app->connect(FotaService::FOTAProgres(), [&](sys::Message *req) {
        if (auto msg = dynamic_cast<FotaService::FOTAProgres *>(req)) {
            parent->downloadProgress->setValue(msg->progress);
            app->refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST);


@@ 296,7 296,7 @@ void Fota::handleFotaProgres()

void Fota::handleFotaFinished()
{
    app->connect(FotaService::FOTAFinished(), [&](sys::DataMessage * /*req*/, sys::ResponseMessage * /*response*/) {
    app->connect(FotaService::FOTAFinished(), [&](sys::Message *) {
        LOG_DEBUG("Done!");
        currentState = State::Finished;
        parent->statusLabel->setText(getStateString());

M module-apps/application-special-input/ApplicationSpecialInput.cpp => module-apps/application-special-input/ApplicationSpecialInput.cpp +1 -1
@@ 19,7 19,7 @@ ApplicationSpecialInput::ApplicationSpecialInput(std::string name,
    setActiveWindow(app::char_select);
}

sys::Message_t ApplicationSpecialInput::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
sys::MessagePointer ApplicationSpecialInput::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
{
    auto retMsg = Application::DataReceivedHandler(msgl);
    if (dynamic_cast<sys::ResponseMessage *>(retMsg.get())->retCode == sys::ReturnCodes::Success) {

M module-apps/application-special-input/ApplicationSpecialInput.hpp => module-apps/application-special-input/ApplicationSpecialInput.hpp +1 -1
@@ 24,7 24,7 @@ namespace app
                                StartInBackground startInBackground = {true});
        virtual ~ApplicationSpecialInput() = default;

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;
        sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final

M module-services/service-antenna/ServiceAntenna.cpp => module-services/service-antenna/ServiceAntenna.cpp +1 -1
@@ 84,7 84,7 @@ ServiceAntenna::~ServiceAntenna()
}

// Invoked upon receiving data message
sys::Message_t ServiceAntenna::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
sys::MessagePointer ServiceAntenna::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
{
    bool handled = false;


M module-services/service-antenna/service-antenna/ServiceAntenna.hpp => module-services/service-antenna/service-antenna/ServiceAntenna.hpp +1 -1
@@ 81,7 81,7 @@ class ServiceAntenna : public sys::Service
    ServiceAntenna();
    ~ServiceAntenna();

    sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
    sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;

    // Invoked during initialization
    sys::ReturnCodes InitHandler() override;

M module-services/service-appmgr/model/ApplicationManager.cpp => module-services/service-appmgr/model/ApplicationManager.cpp +17 -18
@@ 190,73 190,72 @@ namespace app::manager
    }

    auto ApplicationManager::DataReceivedHandler([[maybe_unused]] sys::DataMessage *msgl,
                                                 [[maybe_unused]] sys::ResponseMessage *resp) -> sys::Message_t
                                                 [[maybe_unused]] sys::ResponseMessage *resp) -> sys::MessagePointer
    {
        return std::make_shared<sys::ResponseMessage>();
    }

    void ApplicationManager::registerMessageHandlers()
    {
        connect(typeid(ApplicationStatusRequest), [this](sys::DataMessage *request, sys::ResponseMessage *) {
            auto msg       = static_cast<ApplicationStatusRequest *>(request);
            auto ret       = std::make_shared<ApplicationStatusRequest>(GetName(), msg->checkAppName);
            ret->isRunning = getApplication(msg->checkAppName) != nullptr;
            return ret;
        connect(typeid(ApplicationStatusRequest), [this](sys::Message *request) {
            auto msg = static_cast<ApplicationStatusRequest *>(request);
            return std::make_shared<ApplicationStatusResponse>(msg->checkAppName,
                                                               getApplication(msg->checkAppName) != nullptr);
        });
        connect(typeid(PowerSaveModeInitRequest), [this](sys::DataMessage *, sys::ResponseMessage *) {
        connect(typeid(PowerSaveModeInitRequest), [this](sys::Message *) {
            handlePowerSavingModeInit();
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(PreventBlockingRequest), [this](sys::DataMessage *, sys::ResponseMessage *) {
        connect(typeid(PreventBlockingRequest), [this](sys::Message *) {
            blockingTimer->reload();
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(SwitchRequest), [this](sys::DataMessage *request, sys::ResponseMessage *) {
        connect(typeid(SwitchRequest), [this](sys::Message *request) {
            auto msg = static_cast<SwitchRequest *>(request);
            handleSwitchApplication(msg);
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(SwitchBackRequest), [this](sys::DataMessage *request, sys::ResponseMessage *) {
        connect(typeid(SwitchBackRequest), [this](sys::Message *request) {
            auto msg = static_cast<SwitchBackRequest *>(request);
            handleSwitchBack(msg);
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(SwitchConfirmation), [this](sys::DataMessage *request, sys::ResponseMessage *) {
        connect(typeid(SwitchConfirmation), [this](sys::Message *request) {
            auto msg = static_cast<SwitchConfirmation *>(request);
            handleSwitchConfirmation(msg);
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(CloseConfirmation), [this](sys::DataMessage *request, sys::ResponseMessage *) {
        connect(typeid(CloseConfirmation), [this](sys::Message *request) {
            auto msg = static_cast<CloseConfirmation *>(request);
            handleCloseConfirmation(msg);
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(ApplicationCloseRequest), [this](sys::DataMessage *request, sys::ResponseMessage *) {
        connect(typeid(ApplicationCloseRequest), [this](sys::Message *request) {
            auto msg = static_cast<ApplicationCloseRequest *>(request);
            closeService(msg->getApplication());
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(ApplicationInitialisation), [this](sys::DataMessage *request, sys::ResponseMessage *) {
        connect(typeid(ApplicationInitialisation), [this](sys::Message *request) {
            auto msg = static_cast<ApplicationInitialisation *>(request);
            handleInitApplication(msg);
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(DisplayLanguageChangeRequest), [this](sys::DataMessage *request, sys::ResponseMessage *) {
        connect(typeid(DisplayLanguageChangeRequest), [this](sys::Message *request) {
            auto msg = static_cast<DisplayLanguageChangeRequest *>(request);
            handleDisplayLanguageChange(msg);
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(InputLanguageChangeRequest), [this](sys::DataMessage *request, sys::ResponseMessage *) {
        connect(typeid(InputLanguageChangeRequest), [this](sys::Message *request) {
            auto msg = static_cast<InputLanguageChangeRequest *>(request);
            handleInputLanguageChange(msg);
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(ShutdownRequest), [this](sys::DataMessage *, sys::ResponseMessage *) {
        connect(typeid(ShutdownRequest), [this](sys::Message *) {
            closeApplications();
            closeServices();
            return std::make_shared<sys::ResponseMessage>();
        });
        connect(typeid(ActionRequest), [this](sys::DataMessage *request, sys::ResponseMessage *) {
        connect(typeid(ActionRequest), [this](sys::Message *request) {
            auto actionMsg = static_cast<ActionRequest *>(request);
            handleAction(actionMsg);
            return std::make_shared<sys::ResponseMessage>();

M module-services/service-appmgr/service-appmgr/Message.hpp => module-services/service-appmgr/service-appmgr/Message.hpp +12 -2
@@ 205,11 205,21 @@ namespace app::manager
    {
      public:
        ApplicationStatusRequest(const ApplicationName &senderName, ApplicationName applicationName)
            : Message(MessageType::APMCheckAppRunning, senderName),
              checkAppName(std::move(applicationName)), isRunning{false}
            : Message(MessageType::APMCheckAppRunning, senderName), checkAppName(std::move(applicationName))
        {}

        ApplicationName checkAppName;
    };

    class ApplicationStatusResponse : public sys::ResponseMessage
    {
      public:
        ApplicationStatusResponse(const ApplicationName &_applicationName, bool _isRunning)
            : sys::ResponseMessage(sys::ReturnCodes::Success, MessageType::APMCheckAppRunning),
              applicationName{std::move(_applicationName)}, isRunning{_isRunning}
        {}

        ApplicationName applicationName;
        bool isRunning;
    };


M module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp => module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp +1 -1
@@ 95,7 95,7 @@ namespace app::manager
        auto InitHandler() -> sys::ReturnCodes override;
        auto DeinitHandler() -> sys::ReturnCodes override;
        auto SwitchPowerModeHandler(const sys::ServicePowerMode mode) -> sys::ReturnCodes override;
        auto DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::Message_t override;
        auto DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) -> sys::MessagePointer override;

      private:
        auto startApplication(ApplicationHandle &app) -> bool;

M module-services/service-audio/ServiceAudio.cpp => module-services/service-audio/ServiceAudio.cpp +2 -2
@@ 450,9 450,9 @@ bool ServiceAudio::IsBusy()
    return false;
}

sys::Message_t ServiceAudio::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
sys::MessagePointer ServiceAudio::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
{
    sys::Message_t responseMsg;
    sys::MessagePointer responseMsg;
    bool isBusy = IsBusy();

    auto &msgType = typeid(*msgl);

M module-services/service-audio/ServiceAudio.hpp => module-services/service-audio/ServiceAudio.hpp +1 -1
@@ 25,7 25,7 @@ class ServiceAudio : public sys::Service

    ~ServiceAudio();

    sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp = nullptr) override;
    sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp = nullptr) override;

    sys::ReturnCodes InitHandler() override;


M module-services/service-bluetooth/ServiceBluetooth.cpp => module-services/service-bluetooth/ServiceBluetooth.cpp +2 -2
@@ 10,7 10,7 @@

#include "Constants.hpp"       // for bluetooth
#include "Service/Service.hpp" // for Service
#include "Service/Message.hpp" // for ResponseMessage, Message_t, DataMessage
#include "Service/Message.hpp" // for ResponseMessage, MessagePointer, DataMessage
#include "MessageType.hpp" // for MessageType, MessageType::BluetoothAddrResult, MessageType::BluetoothRequest, MessageType::BluetoothRequestStream
#include "messages/BluetoothMessage.hpp" // for BluetoothMessage, BluetoothRequestStreamResultMessage, BluetoothAddrMessage, BluetoothMessage::PAN, BluetoothMessage::Play, BluetoothMessage::Scan, BluetoothMessage::Start, BluetoothMessage::Stop, BluetoothMessage::StopScan, BluetoothMessage::Visible
#include "BluetoothWorker.hpp"           // for BluetoothWorker


@@ 42,7 42,7 @@ sys::ReturnCodes ServiceBluetooth::DeinitHandler()
    return sys::ReturnCodes::Success;
}

sys::Message_t ServiceBluetooth::DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
sys::MessagePointer ServiceBluetooth::DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
{
    try {
        switch (static_cast<MessageType>(msg->messageType)) {

M module-services/service-bluetooth/ServiceBluetooth.hpp => module-services/service-bluetooth/ServiceBluetooth.hpp +2 -2
@@ 8,7 8,7 @@
#include "Bluetooth/BluetoothWorker.hpp"
#include "Service/Service.hpp" // for Service
#include "Service/Common.hpp"  // for ReturnCodes, ServicePowerMode
#include "Service/Message.hpp" // for Message_t, DataMessage (ptr only), ResponseMessage (ptr only)
#include "Service/Message.hpp" // for MessagePointer, DataMessage (ptr only), ResponseMessage (ptr only)

class BluetoothWorker;



@@ 19,7 19,7 @@ class ServiceBluetooth : public sys::Service
    ServiceBluetooth();
    ~ServiceBluetooth();

    virtual sys::Message_t DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override;
    virtual sys::MessagePointer DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override;
    sys::ReturnCodes InitHandler() override;
    sys::ReturnCodes DeinitHandler() override;
    virtual sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override;

M module-services/service-bluetooth/messages/BluetoothMessage.hpp => module-services/service-bluetooth/messages/BluetoothMessage.hpp +1 -0
@@ 9,6 9,7 @@
#include <MessageType.hpp>

#include <utility>
#include <vector>

extern "C"
{

M module-services/service-cellular/ServiceCellular.cpp => module-services/service-cellular/ServiceCellular.cpp +5 -5
@@ 27,7 27,7 @@
#include <optional> // for optional, nullopt, operator==
#include <map>      // for map

#include "Service/Message.hpp" // for DataMessage, ResponseMessage, Message_t
#include "Service/Message.hpp" // for DataMessage, ResponseMessage, MessagePointer
#include "Service/Service.hpp" // for Service
#include "Service/Timer.hpp"   // for Timer
#include "ServiceCellular.hpp"


@@ 530,7 530,7 @@ auto ServiceCellular::handle(db::query::SMSSearchByTypeResult *response) -> bool
    return true;
}

sys::Message_t ServiceCellular::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
sys::MessagePointer ServiceCellular::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
{
    std::shared_ptr<sys::ResponseMessage> responseMsg;



@@ 653,7 653,7 @@ sys::Message_t ServiceCellular::DataReceivedHandler(sys::DataMessage *msgl, sys:
                ss >> pin;
                LOG_DEBUG("PIN SET %s", ss.str().c_str());

                sys::Message_t rmsg;
                sys::MessagePointer rmsg;

                if (Store::GSM::get()->selected == msg->getSimCard()) {



@@ 1624,14 1624,14 @@ bool ServiceCellular::transmitDtmfTone(uint32_t digit)

void ServiceCellular::handle_CellularGetChannelMessage()
{
    connect(CellularGetChannelMessage(), [&](sys::DataMessage *req, sys::ResponseMessage * /*response*/) {
    connect(CellularGetChannelMessage(), [&](sys::Message *req) {
        auto getChannelMsg = static_cast<CellularGetChannelMessage *>(req);
        LOG_DEBUG("Handle request for channel: %s", TS0710::name(getChannelMsg->dataChannel).c_str());
        std::shared_ptr<CellularGetChannelResponseMessage> channelResponsMessage =
            std::make_shared<CellularGetChannelResponseMessage>(cmux->get(getChannelMsg->dataChannel));
        LOG_DEBUG("chanel ptr: %p", channelResponsMessage->dataChannelPtr);
        sys::Bus::SendUnicast(std::move(channelResponsMessage), req->sender, this);
        return sys::Message_t();
        return sys::MessageNone{};
    });
}
bool ServiceCellular::handle_status_check(void)

M module-services/service-cellular/ServiceCellular.hpp => module-services/service-cellular/ServiceCellular.hpp +2 -2
@@ 22,7 22,7 @@
#include "bsp/common.hpp"               // for Board, Board::none
#include "Modem/TS0710/TS0710_types.h"  // for PS460800, PortSpeed_e
#include "Service/Common.hpp"           // for ReturnCodes, ServicePowerMode
#include "Service/Message.hpp"          // for Message_t, DataMessage (ptr only), ResponseMessage (ptr only)
#include "Service/Message.hpp"          // for MessagePointer, DataMessage (ptr only), ResponseMessage (ptr only)

class MuxDaemon;
namespace db


@@ 45,7 45,7 @@ class ServiceCellular : public sys::Service

    ~ServiceCellular() override;

    sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp = nullptr) override;
    sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp = nullptr) override;

    // Invoked during initialization
    sys::ReturnCodes InitHandler() override;

M module-services/service-db/ServiceDB.cpp => module-services/service-db/ServiceDB.cpp +1 -1
@@ 107,7 107,7 @@ db::Interface *ServiceDB::getInterface(db::Interface::Name interface)
}

// Invoked upon receiving data message
sys::Message_t ServiceDB::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
sys::MessagePointer ServiceDB::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
{

    std::shared_ptr<sys::ResponseMessage> responseMsg;

M module-services/service-db/ServiceDB.hpp => module-services/service-db/ServiceDB.hpp +2 -2
@@ 19,7 19,7 @@
#include "Interface/NotificationsRecord.hpp"
#include "Interface/EventsRecord.hpp"
#include "Interface/SettingsRecord_v2.hpp"
#include "Service/Message.hpp" // for Message_t, DataMessage (ptr only), ResponseMessage (ptr only)
#include "Service/Message.hpp" // for MessagePointer, DataMessage (ptr only), ResponseMessage (ptr only)
#include "Service/Service.hpp" // for Service
#include "messages/DBNotificationMessage.hpp"
#include "agents/DatabaseAgent.hpp"


@@ 86,7 86,7 @@ class ServiceDB : public sys::Service
    ServiceDB();
    ~ServiceDB() override;

    sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
    sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;

    sys::ReturnCodes InitHandler() override;


M module-services/service-db/agents/file_indexer/FileIndexerAgent.cpp => module-services/service-db/agents/file_indexer/FileIndexerAgent.cpp +14 -16
@@ 29,26 29,25 @@ void FileIndexerAgent::registerMessages()
{
    // connect handler & message in parent service
    using std::placeholders::_1;
    using std::placeholders::_2;

    // all API asynchronic
    parentService->connect(FileIndexer::Messages::GetListDirMessage(),
                           std::bind(&FileIndexerAgent::handleListDir, this, _1, _2));
                           std::bind(&FileIndexerAgent::handleListDir, this, _1));

    parentService->connect(FileIndexer::Messages::GetRecordMessage(),
                           std::bind(&FileIndexerAgent::handleGetRecord, this, _1, _2));
                           std::bind(&FileIndexerAgent::handleGetRecord, this, _1));
    parentService->connect(FileIndexer::Messages::SetRecordMessage(),
                           std::bind(&FileIndexerAgent::handleSetRecord, this, _1, _2));
                           std::bind(&FileIndexerAgent::handleSetRecord, this, _1));

    parentService->connect(FileIndexer::Messages::GetPropertyMessage(),
                           std::bind(&FileIndexerAgent::handleGetProperty, this, _1, _2));
                           std::bind(&FileIndexerAgent::handleGetProperty, this, _1));
    parentService->connect(FileIndexer::Messages::SetPropertyMessage(),
                           std::bind(&FileIndexerAgent::handleSetProperty, this, _1, _2));
                           std::bind(&FileIndexerAgent::handleSetProperty, this, _1));

    parentService->connect(FileIndexer::Messages::GetAllPropertiesMessage(),
                           std::bind(&FileIndexerAgent::handleGetAllProperties, this, _1, _2));
                           std::bind(&FileIndexerAgent::handleGetAllProperties, this, _1));
    parentService->connect(FileIndexer::Messages::SetPropertiesMessage(),
                           std::bind(&FileIndexerAgent::handleSetProperties, this, _1, _2));
                           std::bind(&FileIndexerAgent::handleSetProperties, this, _1));
}

auto FileIndexerAgent::getDbInitString() -> const std::string


@@ 98,7 97,7 @@ auto FileIndexerAgent::dbListDir(std::unique_ptr<FileIndexer::ListDirData> listD
    return listDir;
}

auto FileIndexerAgent::handleListDir(sys::DataMessage *req, sys::ResponseMessage * /*response*/) -> sys::Message_t
auto FileIndexerAgent::handleListDir(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<FileIndexer::Messages::GetListDirMessage *>(req)) {
        return std::make_shared<FileIndexer::Messages::GetListDirResponseMessage>(dbListDir(std::move(msg->listDir)));


@@ 152,7 151,7 @@ auto FileIndexerAgent::dbUpdateRecord(std::unique_ptr<FileIndexer::FileRecord> r
                             record->file_id);
}

auto FileIndexerAgent::handleGetRecord(sys::DataMessage *req, sys::ResponseMessage * /*response*/) -> sys::Message_t
auto FileIndexerAgent::handleGetRecord(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<FileIndexer::Messages::GetRecordMessage *>(req)) {
        auto record   = std::move(msg->record);


@@ 163,7 162,7 @@ auto FileIndexerAgent::handleGetRecord(sys::DataMessage *req, sys::ResponseMessa
    return std::make_shared<sys::ResponseMessage>();
}

auto FileIndexerAgent::handleSetRecord(sys::DataMessage *req, sys::ResponseMessage * /*response*/) -> sys::Message_t
auto FileIndexerAgent::handleSetRecord(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<FileIndexer::Messages::SetRecordMessage *>(req)) {
        auto recordPtr                 = std::move(msg->record);


@@ 256,7 255,7 @@ auto FileIndexerAgent::dbUpdateProperties(std::unique_ptr<FileIndexer::FileMetad
    return statusCode;
}

auto FileIndexerAgent::handleGetProperty(sys::DataMessage *req, sys::ResponseMessage * /*response*/) -> sys::Message_t
auto FileIndexerAgent::handleGetProperty(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<FileIndexer::Messages::GetPropertyMessage *>(req)) {
        auto metaDataPtr                   = std::move(msg->metaData);


@@ 268,8 267,7 @@ auto FileIndexerAgent::handleGetProperty(sys::DataMessage *req, sys::ResponseMes
    return std::make_shared<sys::ResponseMessage>();
}

auto FileIndexerAgent::handleGetAllProperties(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
    -> sys::Message_t
auto FileIndexerAgent::handleGetAllProperties(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<FileIndexer::Messages::GetPropertyMessage *>(req)) {
        auto metaDataPtr                   = std::move(msg->metaData);


@@ 281,7 279,7 @@ auto FileIndexerAgent::handleGetAllProperties(sys::DataMessage *req, sys::Respon
    return std::make_shared<sys::ResponseMessage>();
}

auto FileIndexerAgent::handleSetProperty(sys::DataMessage *req, sys::ResponseMessage * /*response*/) -> sys::Message_t
auto FileIndexerAgent::handleSetProperty(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<FileIndexer::Messages::SetPropertyMessage *>(req)) {
        auto metaDataPtr                   = std::move(msg->metaData);


@@ 304,7 302,7 @@ auto FileIndexerAgent::handleSetProperty(sys::DataMessage *req, sys::ResponseMes
    return std::make_shared<sys::ResponseMessage>();
}

auto FileIndexerAgent::handleSetProperties(sys::DataMessage *req, sys::ResponseMessage * /*response*/) -> sys::Message_t
auto FileIndexerAgent::handleSetProperties(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<FileIndexer::Messages::SetPropertyMessage *>(req)) {
        auto metaDataPtr                   = std::move(msg->metaData);

M module-services/service-db/agents/file_indexer/FileIndexerAgent.hpp => module-services/service-db/agents/file_indexer/FileIndexerAgent.hpp +7 -7
@@ 31,11 31,11 @@ class FileIndexerAgent : public DatabaseAgent
    auto getDbInitString() -> const std::string override;
    auto getDbFilePath() -> const std::string override;
    auto dbGetFilesCount() -> unsigned int;
    auto handleListDir(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleGetProperty(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleGetAllProperties(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleSetProperty(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleSetProperties(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleGetRecord(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleSetRecord(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleListDir(sys::Message *req) -> sys::MessagePointer;
    auto handleGetProperty(sys::Message *req) -> sys::MessagePointer;
    auto handleGetAllProperties(sys::Message *req) -> sys::MessagePointer;
    auto handleSetProperty(sys::Message *req) -> sys::MessagePointer;
    auto handleSetProperties(sys::Message *req) -> sys::MessagePointer;
    auto handleGetRecord(sys::Message *req) -> sys::MessagePointer;
    auto handleSetRecord(sys::Message *req) -> sys::MessagePointer;
};

M module-services/service-db/agents/settings/Settings.cpp => module-services/service-db/agents/settings/Settings.cpp +10 -12
@@ 37,18 37,16 @@ namespace Settings
    {
        using std::placeholders::_1;
        using std::placeholders::_2;
        app->connect(::Settings::Messages::VariableChanged(),
                     std::bind(&Settings::handleVariableChanged, this, _1, _2));
        app->connect(::Settings::Messages::VariableChanged(), std::bind(&Settings::handleVariableChanged, this, _1));
        app->connect(::Settings::Messages::CurrentProfileChanged(),
                     std::bind(&Settings::handleCurrentProfileChanged, this, _1, _2));
                     std::bind(&Settings::handleCurrentProfileChanged, this, _1));
        app->connect(::Settings::Messages::CurrentModeChanged(),
                     std::bind(&Settings::handleCurrentModeChanged, this, _1, _2));
                     std::bind(&Settings::handleCurrentModeChanged, this, _1));
        app->connect(::Settings::Messages::ProfileListResponse(),
                     std::bind(&Settings::handleProfileListResponse, this, _1, _2));
        app->connect(::Settings::Messages::ModeListResponse(),
                     std::bind(&Settings::handleModeListResponse, this, _1, _2));
                     std::bind(&Settings::handleProfileListResponse, this, _1));
        app->connect(::Settings::Messages::ModeListResponse(), std::bind(&Settings::handleModeListResponse, this, _1));
    }
    auto Settings::handleVariableChanged(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
    auto Settings::handleVariableChanged(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleVariableChanged");
        if (auto msg = dynamic_cast<::Settings::Messages::VariableChanged *>(req)) {


@@ 63,7 61,7 @@ namespace Settings
        }
        return std::make_shared<sys::ResponseMessage>();
    }
    auto Settings::handleCurrentProfileChanged(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
    auto Settings::handleCurrentProfileChanged(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleCurrentProfileChanged");
        if (auto msg = dynamic_cast<::Settings::Messages::CurrentProfileChanged *>(req)) {


@@ 73,7 71,7 @@ namespace Settings
        }
        return std::make_shared<sys::ResponseMessage>();
    }
    auto Settings::handleCurrentModeChanged(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
    auto Settings::handleCurrentModeChanged(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleCurrentModeChanged");
        if (auto msg = dynamic_cast<::Settings::Messages::CurrentModeChanged *>(req)) {


@@ 83,7 81,7 @@ namespace Settings
        }
        return std::make_shared<sys::ResponseMessage>();
    }
    auto Settings::handleProfileListResponse(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
    auto Settings::handleProfileListResponse(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleProfileListResponse");
        if (auto msg = dynamic_cast<::Settings::Messages::ProfileListResponse *>(req)) {


@@ 93,7 91,7 @@ namespace Settings
        }
        return std::make_shared<sys::ResponseMessage>();
    }
    auto Settings::handleModeListResponse(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
    auto Settings::handleModeListResponse(sys::Message *req) -> sys::MessagePointer
    {
        LOG_DEBUG("handleModeListResponse");
        if (auto msg = dynamic_cast<::Settings::Messages::ModeListResponse *>(req)) {

M module-services/service-db/agents/settings/Settings.hpp => module-services/service-db/agents/settings/Settings.hpp +6 -14
@@ 12,15 12,7 @@
#include <string>                     // for string
#include <optional>                   // for optional

namespace sys
{
    class Service;
    class Message;

    using Message_t = std::shared_ptr<Message>;
    class DataMessage;
    class ResponseMessage;
}; // namespace sys
#include <module-sys/Service/Message.hpp>

namespace Settings
{


@@ 75,10 67,10 @@ namespace Settings
        OnAllProfilesRetrievedCallback cbAllProfiles;
        void sendMsg(std::shared_ptr<::Settings::Messages::SettingsMessage> &&msg);
        void registerHandlers();
        auto handleVariableChanged(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
        auto handleCurrentProfileChanged(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
        auto handleCurrentModeChanged(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
        auto handleProfileListResponse(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
        auto handleModeListResponse(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
        auto handleVariableChanged(sys::Message *req) -> sys::MessagePointer;
        auto handleCurrentProfileChanged(sys::Message *req) -> sys::MessagePointer;
        auto handleCurrentModeChanged(sys::Message *req) -> sys::MessagePointer;
        auto handleProfileListResponse(sys::Message *req) -> sys::MessagePointer;
        auto handleModeListResponse(sys::Message *req) -> sys::MessagePointer;
    };
} // namespace Settings

M module-services/service-db/agents/settings/SettingsAgent.cpp => module-services/service-db/agents/settings/SettingsAgent.cpp +32 -38
@@ 54,41 54,37 @@ void SettingsAgent::registerMessages()
{
    // connect handler & message in parent service
    using std::placeholders::_1;
    using std::placeholders::_2;

    // single variable
    parentService->connect(Settings::Messages::GetVariable(),
                           std::bind(&SettingsAgent::handleGetVariable, this, _1, _2));
    parentService->connect(Settings::Messages::SetVariable(),
                           std::bind(&SettingsAgent::handleSetVariable, this, _1, _2));
    parentService->connect(Settings::Messages::GetVariable(), std::bind(&SettingsAgent::handleGetVariable, this, _1));
    parentService->connect(Settings::Messages::SetVariable(), std::bind(&SettingsAgent::handleSetVariable, this, _1));
    parentService->connect(Settings::Messages::RegisterOnVariableChange(),
                           std::bind(&SettingsAgent::handleRegisterOnVariableChange, this, _1, _2));
                           std::bind(&SettingsAgent::handleRegisterOnVariableChange, this, _1));
    parentService->connect(Settings::Messages::UnregisterOnVariableChange(),
                           std::bind(&SettingsAgent::handleUnregisterOnVariableChange, this, _1, _2));
                           std::bind(&SettingsAgent::handleUnregisterOnVariableChange, this, _1));
    // profile
    parentService->connect(Settings::Messages::RegisterOnProfileChange(),
                           std::bind(&SettingsAgent::handleRegisterProfileChange, this, _1, _2));
                           std::bind(&SettingsAgent::handleRegisterProfileChange, this, _1));
    parentService->connect(Settings::Messages::UnregisterOnProfileChange(),
                           std::bind(&SettingsAgent::handleUnregisterProfileChange, this, _1, _2));
                           std::bind(&SettingsAgent::handleUnregisterProfileChange, this, _1));
    parentService->connect(Settings::Messages::SetCurrentProfile(),
                           std::bind(&SettingsAgent::handleSetCurrentProfile, this, _1, _2));
                           std::bind(&SettingsAgent::handleSetCurrentProfile, this, _1));
    parentService->connect(Settings::Messages::GetCurrentProfile(),
                           std::bind(&SettingsAgent::handleGetCurrentProfile, this, _1, _2));
    parentService->connect(Settings::Messages::AddProfile(), std::bind(&SettingsAgent::handleAddProfile, this, _1, _2));
    parentService->connect(Settings::Messages::ListProfiles(),
                           std::bind(&SettingsAgent::handleListProfiles, this, _1, _2));
                           std::bind(&SettingsAgent::handleGetCurrentProfile, this, _1));
    parentService->connect(Settings::Messages::AddProfile(), std::bind(&SettingsAgent::handleAddProfile, this, _1));
    parentService->connect(Settings::Messages::ListProfiles(), std::bind(&SettingsAgent::handleListProfiles, this, _1));

    // mode
    parentService->connect(Settings::Messages::RegisterOnModeChange(),
                           std::bind(&SettingsAgent::handleRegisterOnModeChange, this, _1, _2));
                           std::bind(&SettingsAgent::handleRegisterOnModeChange, this, _1));
    parentService->connect(Settings::Messages::UnregisterOnModeChange(),
                           std::bind(&SettingsAgent::handleUnregisterOnModeChange, this, _1, _2));
                           std::bind(&SettingsAgent::handleUnregisterOnModeChange, this, _1));
    parentService->connect(Settings::Messages::SetCurrentMode(),
                           std::bind(&SettingsAgent::handleSetCurrentMode, this, _1, _2));
                           std::bind(&SettingsAgent::handleSetCurrentMode, this, _1));
    parentService->connect(Settings::Messages::GetCurrentMode(),
                           std::bind(&SettingsAgent::handleGetCurrentMode, this, _1, _2));
    parentService->connect(Settings::Messages::AddMode(), std::bind(&SettingsAgent::handleAddMode, this, _1, _2));
    parentService->connect(Settings::Messages::ListModes(), std::bind(&SettingsAgent::handleListModes, this, _1, _2));
                           std::bind(&SettingsAgent::handleGetCurrentMode, this, _1));
    parentService->connect(Settings::Messages::AddMode(), std::bind(&SettingsAgent::handleAddMode, this, _1));
    parentService->connect(Settings::Messages::ListModes(), std::bind(&SettingsAgent::handleListModes, this, _1));
}

auto SettingsAgent::getDbInitString() -> const std::string


@@ 220,7 216,7 @@ auto SettingsAgent::dbAddMode(const std::string &mode) -> bool
    return database->execute(Settings::Statements::addDictValue, Settings::DbPaths::phone_mode, mode.c_str());
}

auto SettingsAgent::handleGetVariable(sys::DataMessage *req, sys::ResponseMessage * /*response*/) -> sys::Message_t
auto SettingsAgent::handleGetVariable(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::GetVariable *>(req)) {



@@ 232,7 228,7 @@ auto SettingsAgent::handleGetVariable(sys::DataMessage *req, sys::ResponseMessag
    return std::make_shared<sys::ResponseMessage>();
};

auto SettingsAgent::handleSetVariable(sys::DataMessage *req, sys::ResponseMessage * /*response*/) -> sys::Message_t
auto SettingsAgent::handleSetVariable(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::SetVariable *>(req)) {



@@ 254,8 250,7 @@ auto SettingsAgent::handleSetVariable(sys::DataMessage *req, sys::ResponseMessag
    return std::make_shared<sys::ResponseMessage>();
};

auto SettingsAgent::handleRegisterOnVariableChange(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
    -> sys::Message_t
auto SettingsAgent::handleRegisterOnVariableChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::RegisterOnVariableChange *>(req)) {
        auto path = msg->getPath();


@@ 275,8 270,7 @@ auto SettingsAgent::handleRegisterOnVariableChange(sys::DataMessage *req, sys::R
    return std::make_shared<sys::ResponseMessage>();
}

auto SettingsAgent::handleUnregisterOnVariableChange(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
    -> sys::Message_t
auto SettingsAgent::handleUnregisterOnVariableChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::UnregisterOnVariableChange *>(req)) {
        auto path = msg->getPath();


@@ 291,7 285,7 @@ auto SettingsAgent::handleUnregisterOnVariableChange(sys::DataMessage *req, sys:
}

// profile
auto SettingsAgent::handleRegisterProfileChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleRegisterProfileChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::RegisterOnProfileChange *>(req)) {
        if (dbRegisterOnProfileChange(msg->sender)) {


@@ 302,7 296,7 @@ auto SettingsAgent::handleRegisterProfileChange(sys::DataMessage *req, sys::Resp
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleUnregisterProfileChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleUnregisterProfileChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::UnregisterOnProfileChange *>(req)) {
        if (dbUnregisterOnProfileChange(msg->sender)) {


@@ 311,7 305,7 @@ auto SettingsAgent::handleUnregisterProfileChange(sys::DataMessage *req, sys::Re
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleSetCurrentProfile(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleSetCurrentProfile(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::SetCurrentProfile *>(req)) {
        auto profile = msg->getProfileName();


@@ 326,7 320,7 @@ auto SettingsAgent::handleSetCurrentProfile(sys::DataMessage *req, sys::Response
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleGetCurrentProfile(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleGetCurrentProfile(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::GetCurrentProfile *>(req)) {
        auto service = profileChangedRecipents.find(req->sender);


@@ 337,7 331,7 @@ auto SettingsAgent::handleGetCurrentProfile(sys::DataMessage *req, sys::Response
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleAddProfile(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleAddProfile(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::AddProfile *>(req)) {
        if (dbAddProfile(msg->getProfileName())) {


@@ 352,7 346,7 @@ auto SettingsAgent::handleAddProfile(sys::DataMessage *req, sys::ResponseMessage
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleListProfiles(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleListProfiles(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::ListProfiles *>(req)) {
        profileChangedRecipents.insert(req->sender);


@@ 363,7 357,7 @@ auto SettingsAgent::handleListProfiles(sys::DataMessage *req, sys::ResponseMessa
}

// mode
auto SettingsAgent::handleRegisterOnModeChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleRegisterOnModeChange(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::RegisterOnModeChange *>(req)) {
        if (dbRegisterOnModeChange(msg->sender)) {


@@ 374,7 368,7 @@ auto SettingsAgent::handleRegisterOnModeChange(sys::DataMessage *req, sys::Respo
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleUnregisterOnModeChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleUnregisterOnModeChange(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::UnregisterOnModeChange *>(req)) {
        dbUnregisterOnModeChange(req->sender);


@@ 382,7 376,7 @@ auto SettingsAgent::handleUnregisterOnModeChange(sys::DataMessage *req, sys::Res
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleSetCurrentMode(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleSetCurrentMode(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::SetCurrentMode *>(req)) {
        auto newMode = msg->getProfileName();


@@ 399,7 393,7 @@ auto SettingsAgent::handleSetCurrentMode(sys::DataMessage *req, sys::ResponseMes
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleGetCurrentMode(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleGetCurrentMode(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::GetCurrentMode *>(req)) {
        if (modeChangeRecipents.end() != modeChangeRecipents.find(req->sender)) {


@@ 409,7 403,7 @@ auto SettingsAgent::handleGetCurrentMode(sys::DataMessage *req, sys::ResponseMes
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleAddMode(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleAddMode(sys::Message *req) -> sys::MessagePointer
{
    if (auto msg = dynamic_cast<Settings::Messages::AddMode *>(req)) {
        if (dbAddMode(msg->getProfileName())) {


@@ 424,7 418,7 @@ auto SettingsAgent::handleAddMode(sys::DataMessage *req, sys::ResponseMessage *)
    }
    return std::make_shared<sys::ResponseMessage>();
}
auto SettingsAgent::handleListModes(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t
auto SettingsAgent::handleListModes(sys::Message *req) -> sys::MessagePointer
{
    if (nullptr != dynamic_cast<Settings::Messages::ListModes *>(req)) {
        modeChangeRecipents.insert(req->sender);

M module-services/service-db/agents/settings/SettingsAgent.hpp => module-services/service-db/agents/settings/SettingsAgent.hpp +17 -17
@@ 8,7 8,7 @@

#include "messages/SettingsMessages.hpp"
#include "agents/DatabaseAgent.hpp" // for DatabaseAgent
#include "Service/Message.hpp"      // for DataMessage (ptr only), Message_t, ResponseMessage (ptr only)
#include "Service/Message.hpp"      // for DataMessage (ptr only), MessagePointer, ResponseMessage (ptr only)
#include <map>

namespace Settings


@@ 62,24 62,24 @@ class SettingsAgent : public DatabaseAgent

    // msg handlers
    // variable
    auto handleGetVariable(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleSetVariable(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleRegisterOnVariableChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleUnregisterOnVariableChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleGetVariable(sys::Message *req) -> sys::MessagePointer;
    auto handleSetVariable(sys::Message *req) -> sys::MessagePointer;
    auto handleRegisterOnVariableChange(sys::Message *req) -> sys::MessagePointer;
    auto handleUnregisterOnVariableChange(sys::Message *req) -> sys::MessagePointer;

    // profile
    auto handleRegisterProfileChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleUnregisterProfileChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleSetCurrentProfile(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleGetCurrentProfile(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleAddProfile(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleListProfiles(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleRegisterProfileChange(sys::Message *req) -> sys::MessagePointer;
    auto handleUnregisterProfileChange(sys::Message *req) -> sys::MessagePointer;
    auto handleSetCurrentProfile(sys::Message *req) -> sys::MessagePointer;
    auto handleGetCurrentProfile(sys::Message *req) -> sys::MessagePointer;
    auto handleAddProfile(sys::Message *req) -> sys::MessagePointer;
    auto handleListProfiles(sys::Message *req) -> sys::MessagePointer;

    // mode
    auto handleRegisterOnModeChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleUnregisterOnModeChange(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleSetCurrentMode(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleGetCurrentMode(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleAddMode(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleListModes(sys::DataMessage *req, sys::ResponseMessage *) -> sys::Message_t;
    auto handleRegisterOnModeChange(sys::Message *req) -> sys::MessagePointer;
    auto handleUnregisterOnModeChange(sys::Message *req) -> sys::MessagePointer;
    auto handleSetCurrentMode(sys::Message *req) -> sys::MessagePointer;
    auto handleGetCurrentMode(sys::Message *req) -> sys::MessagePointer;
    auto handleAddMode(sys::Message *req) -> sys::MessagePointer;
    auto handleListModes(sys::Message *req) -> sys::MessagePointer;
};

M module-services/service-db/api/DBServiceAPI.hpp => module-services/service-db/api/DBServiceAPI.hpp +5 -5
@@ 5,7 5,7 @@

#include <Common/Query.hpp>
#include <PhoneNumber.hpp>     // for PhoneNumber
#include <Service/Message.hpp> // for MessageRet_t
#include <Service/Message.hpp> // for SendResult
#include <stdint.h>            // for uint32_t
#include <sys/types.h>         // for time_t
#include <memory>              // for unique_ptr, shared_ptr


@@ 94,10 94,10 @@ class DBServiceAPI
    static uint32_t SMSTemplateGetCount(sys::Service *serv);
    static bool SMSTemplateGetLimitOffset(sys::Service *serv, uint32_t offset, uint32_t limit);
    static auto GetQuery(sys::Service *serv, db::Interface::Name database, std::unique_ptr<db::Query> query) -> bool;
    static sys::MessageRet_t GetQueryWithReply(sys::Service *serv,
                                               db::Interface::Name database,
                                               std::unique_ptr<db::Query> query,
                                               std::uint32_t timeout);
    static sys::SendResult GetQueryWithReply(sys::Service *serv,
                                             db::Interface::Name database,
                                             std::unique_ptr<db::Query> query,
                                             std::uint32_t timeout);

    /**
     * @brief Function is checking if new contact can be added to database. Function is blocking.

M module-services/service-db/api/DBServiceAPI_GetByQuery.cpp => module-services/service-db/api/DBServiceAPI_GetByQuery.cpp +5 -5
@@ 3,7 3,7 @@

#include <includes/DBServiceName.hpp> // for db
#include <messages/QueryMessage.hpp>  // for QueryMessage
#include <Service/Message.hpp>        // for MessageRet_t
#include <Service/Message.hpp>        // for SendResult
#include <stdint.h>                   // for uint32_t
#include <utility>                    // for move
#include <memory>                     // for make_shared, allocator, unique_ptr


@@ 27,10 27,10 @@ bool DBServiceAPI::GetQuery(sys::Service *serv, db::Interface::Name database, st
    return sys::Bus::SendUnicast(msg, service::name::db, serv);
}

sys::MessageRet_t DBServiceAPI::GetQueryWithReply(sys::Service *serv,
                                                  db::Interface::Name database,
                                                  std::unique_ptr<db::Query> query,
                                                  std::uint32_t timeout)
sys::SendResult DBServiceAPI::GetQueryWithReply(sys::Service *serv,
                                                db::Interface::Name database,
                                                std::unique_ptr<db::Query> query,
                                                std::uint32_t timeout)
{
    auto msg = std::make_shared<db::QueryMessage>(database, std::move(query));
    return sys::Bus::SendUnicast(msg, service::name::db, serv, timeout);

M module-services/service-db/test/test-service-db-settings-messages.cpp => module-services/service-db/test/test-service-db-settings-messages.cpp +8 -8
@@ 3,7 3,7 @@

#include <catch2/catch.hpp>           // for Section, SourceLineInfo, SECTION, SectionInfo, StringRef, TEST_CASE
#include <Service/Service.hpp>        // for Service
#include <Service/Message.hpp>        // for Message_t, ResponseMessage, DataMessage
#include <Service/Message.hpp>        // for MessagePointer, ResponseMessage, DataMessage
#include <module-sys/Service/Bus.hpp> // for Bus
#include <functional>                 // for _Bind_helper<>::type, _Placeholder, bind, _1, _2
#include <list>                       // for list


@@ 33,7 33,7 @@ namespace Settings
            return value;
        }

        sys::Message_t DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
        {
            return std::make_shared<sys::ResponseMessage>();
        }


@@ 43,8 43,8 @@ namespace Settings
            using std::placeholders::_1;
            using std::placeholders::_2;

            connect(Settings::Messages::GetVariable(), std::bind(&Service::handleGetVariable, this, _1, _2));
            connect(Settings::Messages::SetVariable(), std::bind(&Service::handleSetVariable, this, _1, _2));
            connect(Settings::Messages::GetVariable(), std::bind(&Service::handleGetVariable, this, _1));
            connect(Settings::Messages::SetVariable(), std::bind(&Service::handleSetVariable, this, _1));

            return sys::ReturnCodes::Success;
        }


@@ 59,7 59,7 @@ namespace Settings
            return sys::ReturnCodes::Success;
        }

        sys::Message_t handleGetVariable(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
        sys::MessagePointer handleGetVariable(sys::Message *req)
        {
            if (auto msg = dynamic_cast<Settings::Messages::GetVariable *>(req)) {



@@ 71,7 71,7 @@ namespace Settings
            return std::make_shared<sys::ResponseMessage>();
        };

        sys::Message_t handleSetVariable(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
        sys::MessagePointer handleSetVariable(sys::Message *req)
        {
            if (auto msg = dynamic_cast<Settings::Messages::SetVariable *>(req)) {



@@ 85,7 85,7 @@ namespace Settings
            return std::make_shared<sys::ResponseMessage>();
        };

        sys::Message_t handleListProfiles(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
        sys::MessagePointer handleListProfiles(sys::Message *req)
        {
            if (dynamic_cast<Settings::Messages::ListProfiles *>(req) != nullptr) {
                std::list<std::string> profiles = {"silent", "loud"};


@@ 94,7 94,7 @@ namespace Settings
            return std::make_shared<sys::ResponseMessage>();
        };

        sys::Message_t handleListModes(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
        sys::MessagePointer handleListModes(sys::Message *req)
        {
            if (dynamic_cast<Settings::Messages::ListProfiles *>(req) != nullptr) {
                std::list<std::string> modes = {"mode1", "mode2"};

M module-services/service-db/test/test-service-db-settings-testapps.hpp => module-services/service-db/test/test-service-db-settings-testapps.hpp +3 -3
@@ 22,7 22,7 @@ namespace Settings
        {
            return sys::ReturnCodes::Success;
        }
        sys::Message_t DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        {
            return std::make_shared<sys::ResponseMessage>();
        };


@@ 77,7 77,7 @@ namespace Settings
        {
            return sys::ReturnCodes::Success;
        }
        sys::Message_t DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
            if (nullptr != dynamic_cast<::Settings::UTMsg::UTMsgStart *>(msg)) {


@@ 150,7 150,7 @@ namespace Settings
                           std::shared_ptr<std::mutex> testStart)
            : AppTest(name, setter, getter, testStart)
        {}
        sys::Message_t DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
            if (nullptr != dynamic_cast<::Settings::UTMsg::UTMsgStart *>(msg)) {

M module-services/service-db/test/test-service-db-settings-testservices.hpp => module-services/service-db/test/test-service-db-settings-testservices.hpp +3 -3
@@ 23,7 23,7 @@ namespace Settings
                      << " [key, val] = (" << k << ", " << v << ")" << std::endl
                      << std::flush;
        }
        sys::Message_t DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        {
            if (auto msg = dynamic_cast<::Settings::UTMsg::ReqRegValChg *>(req)) {
                debug("ReqRegValChg", msg->name, msg->value);


@@ 79,7 79,7 @@ namespace Settings
        {}
        ::Settings::Settings::ListOfProfiles profiles;
        std::string profile;
        sys::Message_t DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        {
            if (auto msg = dynamic_cast<::Settings::UTMsg::ReqRegProfileChg *>(req)) {
                debug("ReqRegProfileChg", msg->name, msg->value);


@@ 134,7 134,7 @@ namespace Settings
        {}
        ::Settings::Settings::ListOfModes modes;
        std::string mode;
        sys::Message_t DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *req, sys::ResponseMessage *resp) override
        {
            if (auto msg = dynamic_cast<::Settings::UTMsg::ReqRegProfileChg *>(req)) {
                debug("ReqRegProfileChg", msg->name, msg->value);

M module-services/service-desktop/ServiceDesktop.cpp => module-services/service-desktop/ServiceDesktop.cpp +6 -6
@@ 41,7 41,7 @@ sys::ReturnCodes ServiceDesktop::InitHandler()
         {desktopWorker->SEND_QUEUE_BUFFER_NAME, sizeof(std::string *), sdesktop::cdc_queue_object_size}});
    desktopWorker->run();

    connect(sdesktop::developerMode::DeveloperModeRequest(), [&](sys::DataMessage *msg, sys::ResponseMessage *resp) {
    connect(sdesktop::developerMode::DeveloperModeRequest(), [&](sys::Message *msg) {
        auto request = static_cast<sdesktop::developerMode::DeveloperModeRequest *>(msg);
        if (request->event != nullptr) {
            request->event->send();


@@ 50,7 50,7 @@ sys::ReturnCodes ServiceDesktop::InitHandler()
        return std::make_shared<sys::ResponseMessage>();
    });

    connect(sdesktop::BackupMessage(), [&](sys::DataMessage *msg, sys::ResponseMessage *resp) {
    connect(sdesktop::BackupMessage(), [&](sys::Message *msg) {
        sdesktop::BackupMessage *backupMessage = dynamic_cast<sdesktop::BackupMessage *>(msg);
        if (backupMessage != nullptr) {



@@ 59,7 59,7 @@ sys::ReturnCodes ServiceDesktop::InitHandler()
        return std::make_shared<sys::ResponseMessage>();
    });

    connect(sdesktop::RestoreMessage(), [&](sys::DataMessage *msg, sys::ResponseMessage *resp) {
    connect(sdesktop::RestoreMessage(), [&](sys::Message *msg) {
        sdesktop::RestoreMessage *restoreMessage = dynamic_cast<sdesktop::RestoreMessage *>(msg);
        if (restoreMessage != nullptr) {



@@ 68,7 68,7 @@ sys::ReturnCodes ServiceDesktop::InitHandler()
        return std::make_shared<sys::ResponseMessage>();
    });

    connect(sdesktop::FactoryMessage(), [&](sys::DataMessage *msg, sys::ResponseMessage *resp) {
    connect(sdesktop::FactoryMessage(), [&](sys::Message *msg) {
        auto *factoryMessage = dynamic_cast<sdesktop::FactoryMessage *>(msg);
        if (factoryMessage != nullptr) {
            LOG_DEBUG("ServiceDesktop: FactoryMessage received");


@@ 77,7 77,7 @@ sys::ReturnCodes ServiceDesktop::InitHandler()
        return std::make_shared<sys::ResponseMessage>();
    });

    connect(sdesktop::UpdateOsMessage(), [&](sys::DataMessage *msg, sys::ResponseMessage *resp) {
    connect(sdesktop::UpdateOsMessage(), [&](sys::Message *msg) {
        sdesktop::UpdateOsMessage *updateOsMsg = dynamic_cast<sdesktop::UpdateOsMessage *>(msg);

        if (updateOsMsg != nullptr &&


@@ 119,7 119,7 @@ sys::ReturnCodes ServiceDesktop::SwitchPowerModeHandler(const sys::ServicePowerM
    return sys::ReturnCodes::Success;
}

sys::Message_t ServiceDesktop::DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
sys::MessagePointer ServiceDesktop::DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
{
    if (auto msg = dynamic_cast<cellular::RawCommandResp *>(resp)) {
        auto event = std::make_unique<sdesktop::developerMode::ATResponseEvent>(msg->response);

M module-services/service-desktop/ServiceDesktop.hpp => module-services/service-desktop/ServiceDesktop.hpp +2 -2
@@ 8,7 8,7 @@
#include "WorkerDesktop.hpp"
#include "module-services/service-desktop/endpoints/update/UpdateMuditaOS.hpp"
#include "Service/Common.hpp"  // for ReturnCodes, ServicePowerMode
#include "Service/Message.hpp" // for Message_t, DataMessage (ptr only), ResponseMessage (ptr only)
#include "Service/Message.hpp" // for MessagePointer, DataMessage (ptr only), ResponseMessage (ptr only)
#include "Service/Service.hpp" // for Service
#include "Constants.hpp"



@@ 30,7 30,7 @@ class ServiceDesktop : public sys::Service
    sys::ReturnCodes InitHandler() override;
    sys::ReturnCodes DeinitHandler() override;
    sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override;
    sys::Message_t DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override;
    sys::MessagePointer DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override;

    std::unique_ptr<UpdateMuditaOS> updateOS;
    std::unique_ptr<WorkerDesktop> desktopWorker;

M module-services/service-eink/ServiceEink.cpp => module-services/service-eink/ServiceEink.cpp +17 -26
@@ 42,34 42,25 @@ ServiceEink::ServiceEink(const std::string &name, std::string parent)
    waveformSettings.mode        = EinkWaveformGC16;
    waveformSettings.temperature = -1000;

    connect(typeid(service::eink::EinkModeMessage),
            [this](sys::DataMessage *message, sys::ResponseMessage *) -> sys::Message_t {
                auto msg          = static_cast<service::eink::EinkModeMessage *>(message);
                this->displayMode = msg->getMode() == service::eink::EinkModeMessage::Mode::Normal
                                        ? EinkDisplayColorMode_e::EinkDisplayColorModeStandard
                                        : EinkDisplayColorMode_e::EinkDisplayColorModeInverted;
                return sys::Message_t();
            });
    connect(typeid(service::eink::EinkModeMessage), [this](sys::Message *message) -> sys::MessagePointer {
        auto msg          = static_cast<service::eink::EinkModeMessage *>(message);
        this->displayMode = msg->getMode() == service::eink::EinkModeMessage::Mode::Normal
                                ? EinkDisplayColorMode_e::EinkDisplayColorModeStandard
                                : EinkDisplayColorMode_e::EinkDisplayColorModeInverted;
        return sys::MessageNone{};
    });

    connect(typeid(service::eink::EinkDMATransfer),
            [&](sys::DataMessage *request, sys::ResponseMessage *) -> sys::Message_t {
                return handleEinkDMATransfer(request);
            });
            [&](sys::Message *request) -> sys::MessagePointer { return handleEinkDMATransfer(request); });

    connect(typeid(service::eink::ImageMessage),
            [&](sys::DataMessage *request, sys::ResponseMessage *) -> sys::Message_t {
                return handleImageMessage(request);
            });
            [&](sys::Message *request) -> sys::MessagePointer { return handleImageMessage(request); });

    connect(typeid(service::eink::StateRequest),
            [&](sys::DataMessage *request, sys::ResponseMessage *) -> sys::Message_t {
                return handleStateRequest(request);
            });
            [&](sys::Message *request) -> sys::MessagePointer { return handleStateRequest(request); });

    connect(typeid(service::eink::TemperatureUpdate),
            [&](sys::DataMessage *request, sys::ResponseMessage *) -> sys::Message_t {
                return handleTemperatureUpdate(request);
            });
            [&](sys::Message *request) -> sys::MessagePointer { return handleTemperatureUpdate(request); });
}

ServiceEink::~ServiceEink()


@@ 81,7 72,7 @@ ServiceEink::~ServiceEink()
    waveformSettings.temperature = -1000;
}

sys::Message_t ServiceEink::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
sys::MessagePointer ServiceEink::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
{
    return std::make_shared<sys::ResponseMessage>();
}


@@ 291,7 282,7 @@ bool ServiceEink::deepClearScreen(int8_t temperature)
    return true;
}

sys::Message_t ServiceEink::handleEinkDMATransfer(sys::Message *message)
sys::MessagePointer ServiceEink::handleEinkDMATransfer(sys::Message *message)
{
    utils::time::Scoped scopedtimming("EinkDMATransfer");



@@ 344,7 335,7 @@ sys::Message_t ServiceEink::handleEinkDMATransfer(sys::Message *message)
    return nullptr;
}

sys::Message_t ServiceEink::handleImageMessage(sys::Message *request)
sys::MessagePointer ServiceEink::handleImageMessage(sys::Message *request)
{
    auto message = static_cast<service::eink::ImageMessage *>(request);



@@ 360,15 351,15 @@ sys::Message_t ServiceEink::handleImageMessage(sys::Message *request)
    if (suspendInProgress)
        LOG_DEBUG("Suspend In Progress");
    sys::Bus::SendUnicast(std::make_shared<service::eink::EinkDMATransfer>(), GetName(), this);
    return nullptr;
    return std::make_shared<sys::ResponseMessage>();
}

sys::Message_t ServiceEink::handleStateRequest(sys::Message *)
sys::MessagePointer ServiceEink::handleStateRequest(sys::Message *)
{
    return std::make_shared<service::gui::GUIDisplayReady>(suspendInProgress, shutdownInProgress);
}

sys::Message_t ServiceEink::handleTemperatureUpdate(sys::Message *)
sys::MessagePointer ServiceEink::handleTemperatureUpdate(sys::Message *)
{
    return nullptr;
}

M module-services/service-eink/ServiceEink.hpp => module-services/service-eink/ServiceEink.hpp +5 -5
@@ 57,14 57,14 @@ class ServiceEink : public sys::Service
    ServiceEink(const std::string &name, std::string parent = "");
    ~ServiceEink() override;

    sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
    sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
    sys::ReturnCodes InitHandler() override;
    sys::ReturnCodes DeinitHandler() override;
    sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final;

  private:
    sys::Message_t handleEinkDMATransfer(sys::Message *message);
    sys::Message_t handleImageMessage(sys::Message *message);
    sys::Message_t handleStateRequest(sys::Message *messge);
    sys::Message_t handleTemperatureUpdate(sys::Message *);
    sys::MessagePointer handleEinkDMATransfer(sys::Message *message);
    sys::MessagePointer handleImageMessage(sys::Message *message);
    sys::MessagePointer handleStateRequest(sys::Message *messge);
    sys::MessagePointer handleTemperatureUpdate(sys::Message *);
};

M module-services/service-evtmgr/EventManager.cpp => module-services/service-evtmgr/EventManager.cpp +2 -2
@@ 69,7 69,7 @@ std::string getSettingsTimeZone()
}

// Invoked upon receiving data message
sys::Message_t EventManager::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
sys::MessagePointer EventManager::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
{
    bool handled = false;



@@ 254,7 254,7 @@ sys::Message_t EventManager::DataReceivedHandler(sys::DataMessage *msgl, sys::Re
sys::ReturnCodes EventManager::InitHandler()
{

    connect(sdesktop::developerMode::DeveloperModeRequest(), [&](sys::DataMessage *msg, sys::ResponseMessage *resp) {
    connect(sdesktop::developerMode::DeveloperModeRequest(), [&](sys::Message *msg) {
        using namespace sdesktop::developerMode;
        auto req = static_cast<DeveloperModeRequest *>(msg);
        if (typeid(*req->event.get()) == typeid(AppFocusChangeEvent)) {

M module-services/service-evtmgr/EventManager.hpp => module-services/service-evtmgr/EventManager.hpp +2 -2
@@ 18,7 18,7 @@

#include "bsp/keyboard/key_codes.hpp"
#include "Service/Service.hpp" // for Service
#include "Service/Message.hpp" // for DataMessage (ptr only), Message_t, ResponseMessage (ptr only)
#include "Service/Message.hpp" // for DataMessage (ptr only), MessagePointer, ResponseMessage (ptr only)
#include "Service/Worker.hpp"
#include "MessageType.hpp"
#include "bsp/common.hpp"


@@ 52,7 52,7 @@ class EventManager : public sys::Service
    EventManager(const std::string &name);
    ~EventManager();

    sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
    sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;

    // Invoked during initialization
    sys::ReturnCodes InitHandler() override;

M module-services/service-fileindexer/ServiceFileIndexer.cpp => module-services/service-fileindexer/ServiceFileIndexer.cpp +1 -1
@@ 20,7 20,7 @@ namespace service
    }

    // When receive notification handler
    sys::Message_t ServiceFileIndexer::DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
    sys::MessagePointer ServiceFileIndexer::DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
    {
        auto fcm = dynamic_cast<msg::FileChangeMessage *>(msg);
        if (fcm) {

M module-services/service-fileindexer/ServiceFileIndexer.hpp => module-services/service-fileindexer/ServiceFileIndexer.hpp +1 -1
@@ 16,7 16,7 @@ namespace service
        virtual ~ServiceFileIndexer()                  = default;
        ServiceFileIndexer(const ServiceFileIndexer &) = delete;
        ServiceFileIndexer &operator=(const ServiceFileIndexer &) = delete;
        sys::Message_t DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override;
        sys::ReturnCodes InitHandler() override;
        sys::ReturnCodes DeinitHandler() override;
        sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override;

M module-services/service-fota/ServiceFota.cpp => module-services/service-fota/ServiceFota.cpp +17 -20
@@ 21,7 21,7 @@
#include "ServiceFota.hpp"
#include "FotaUrcHandler.hpp"        // FotaUrcHandler
#include "Service/Service.hpp"       // for Service
#include "Service/Message.hpp"       // for Message_t, DataMessage, ResponseMessage
#include "Service/Message.hpp"       // for MessagePointer, DataMessage, ResponseMessage
#include "MessageType.hpp"           // for MessageType, MessageType::CellularListCurrentCalls
#include "messages/FotaMessages.hpp" // for FotaResponseMessage, HTTPRequestMessage, ConfigureAPNMessage, HTTPResponseMessage, NotificationMessage, FOTAStart, FOTAProgres, FOTAFinished, FOTARawProgress, InternetRequestMessage, NotificationMessage::Type, ConnectMessage, NotificationMessage::Type::Configured, NotificationMessage::Type::Connected
#include "Commands.hpp"              // for AT, AT::QIGETERROR


@@ 76,19 76,17 @@ namespace FotaService
    {
        LOG_DEBUG("Registring Handlers for Fota::Service:");
        using std::placeholders::_1;
        using std::placeholders::_2;
        connect(CellularGetChannelResponseMessage(),
                std::bind(&Service::handleCellularGetChannelResponseMessage, this, _1, _2));
        connect(cellular::StateChange(), std::bind(&Service::handleServiceCellularNotifications, this, _1, _2));
        connect(ConfigureAPNMessage(), std::bind(&Service::handleConfigureAPN, this, _1, _2));
        connect(ConnectMessage(), std::bind(&Service::handleConnect, this, _1, _2));
        connect(HTTPRequestMessage(), std::bind(&Service::handleHttpGet, this, _1, _2));
        connect(FOTAStart(), std::bind(&Service::handleFotaStart, this, _1, _2));
        connect(FOTARawProgress(), std::bind(&Service::handleRawProgress, this, _1, _2));
                std::bind(&Service::handleCellularGetChannelResponseMessage, this, _1));
        connect(cellular::StateChange(), std::bind(&Service::handleServiceCellularNotifications, this, _1));
        connect(ConfigureAPNMessage(), std::bind(&Service::handleConfigureAPN, this, _1));
        connect(ConnectMessage(), std::bind(&Service::handleConnect, this, _1));
        connect(HTTPRequestMessage(), std::bind(&Service::handleHttpGet, this, _1));
        connect(FOTAStart(), std::bind(&Service::handleFotaStart, this, _1));
        connect(FOTARawProgress(), std::bind(&Service::handleRawProgress, this, _1));
    }

    sys::Message_t Service::handleCellularGetChannelResponseMessage(sys::DataMessage *req,
                                                                    sys::ResponseMessage * /*response*/)
    sys::MessagePointer Service::handleCellularGetChannelResponseMessage(sys::Message *req)
    {
        LOG_DEBUG("Handling channel response");
        auto responseMessage = static_cast<CellularGetChannelResponseMessage *>(req);


@@ 98,11 96,10 @@ namespace FotaService
        getApnConfiguration();
        setState();
        stopActiveContext();
        return sys::Message_t();
        return sys::MessageNone{};
    }

    sys::Message_t Service::handleServiceCellularNotifications(sys::DataMessage *req,
                                                               sys::ResponseMessage * /*response*/)
    sys::MessagePointer Service::handleServiceCellularNotifications(sys::Message *req)
    {
        if (auto msg = dynamic_cast<cellular::StateChange *>(req)) {
            LOG_DEBUG("cellular::StageChange: %s", cellular::State::c_str(msg->request));


@@ 120,7 117,7 @@ namespace FotaService
        return std::make_shared<sys::ResponseMessage>();
    }

    sys::Message_t Service::handleConfigureAPN(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
    sys::MessagePointer Service::handleConfigureAPN(sys::Message *req)
    {
        if (dataChannel != nullptr) {
            if (auto msg = dynamic_cast<ConfigureAPNMessage *>(req)) {


@@ 162,7 159,7 @@ namespace FotaService
        return std::make_shared<sys::ResponseMessage>();
    }

    sys::Message_t Service::handleConnect(sys::DataMessage * /*req*/, sys::ResponseMessage * /*response*/)
    sys::MessagePointer Service::handleConnect(sys::Message * /*req*/)
    {
        if (dataChannel) {
            LOG_DEBUG("ConnectMessage");


@@ 182,7 179,7 @@ namespace FotaService
        return std::make_shared<FotaResponseMessage>(false);
    }

    sys::Message_t Service::handleHttpGet(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
    sys::MessagePointer Service::handleHttpGet(sys::Message *req)
    {
        std::shared_ptr<sys::ResponseMessage> responseMsg;
        if (auto msg = dynamic_cast<HTTPRequestMessage *>(req)) {


@@ 274,7 271,7 @@ namespace FotaService
        parseQIND(response);
    }

    sys::Message_t Service::handleFotaStart(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
    sys::MessagePointer Service::handleFotaStart(sys::Message *req)
    {
        LOG_DEBUG("handle Fota Start");
        if (auto msg = dynamic_cast<FOTAStart *>(req)) {


@@ 290,7 287,7 @@ namespace FotaService
        return std::make_shared<FotaResponseMessage>(true);
    }

    sys::Message_t Service::handleRawProgress(sys::DataMessage *req, sys::ResponseMessage * /*response*/)
    sys::MessagePointer Service::handleRawProgress(sys::Message *req)
    {
        LOG_DEBUG("Handle Fota RawProgress message");
        if (auto msg = dynamic_cast<FOTARawProgress *>(req)) {


@@ 598,7 595,7 @@ namespace FotaService
        sys::Bus::SendUnicast(std::move(msg), receiver, this);
    }

    sys::Message_t Service::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage * /*resp*/)
    sys::MessagePointer Service::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage * /*resp*/)
    {
        std::shared_ptr<sys::ResponseMessage> responseMsg;


M module-services/service-fota/ServiceFota.hpp => module-services/service-fota/ServiceFota.hpp +9 -9
@@ 7,7 7,7 @@
#include <Modem/TS0710/DLC_channel.h>
#include <Modem/TS0710/TS0710.h>
#include <Service/Service.hpp> // for Service
#include <Service/Message.hpp> // for Message_t
#include <Service/Message.hpp> // for MessagePointer
#include <stdint.h>            // for uint32_t
#include <memory>              // for unique_ptr
#include <sstream>


@@ 46,7 46,7 @@ namespace FotaService

        ~Service();

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp = nullptr) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp = nullptr) override;

        sys::ReturnCodes InitHandler() override;



@@ 64,22 64,22 @@ namespace FotaService
      private:
        /** Get access to data channel
         */
        sys::Message_t handleCellularGetChannelResponseMessage(sys::DataMessage *req, sys::ResponseMessage *response);
        sys::MessagePointer handleCellularGetChannelResponseMessage(sys::Message *req);
        /** Do nothing until celular finishes it's startup
         */
        sys::Message_t handleServiceCellularNotifications(sys::DataMessage *req, sys::ResponseMessage *response);
        sys::Message_t handleConfigureAPN(sys::DataMessage *req, sys::ResponseMessage *response);
        sys::Message_t handleConnect(sys::DataMessage *req, sys::ResponseMessage *response);
        sys::Message_t handleHttpGet(sys::DataMessage *req, sys::ResponseMessage *response);
        sys::MessagePointer handleServiceCellularNotifications(sys::Message *req);
        sys::MessagePointer handleConfigureAPN(sys::Message *req);
        sys::MessagePointer handleConnect(sys::Message *req);
        sys::MessagePointer handleHttpGet(sys::Message *req);
        /** Send fota update command to modem
         */
        sys::Message_t handleFotaStart(sys::DataMessage *req, sys::ResponseMessage *response);
        sys::MessagePointer handleFotaStart(sys::Message *req);
        /** Handle URC from modem, support for asynchronious commands
         */
        void handleChannelNotifications(std::string &data);
        /** Handle fota progress notification (in cellular)
         */
        sys::Message_t handleRawProgress(sys::DataMessage *req, sys::ResponseMessage *response);
        sys::MessagePointer handleRawProgress(sys::Message *req);

        std::unique_ptr<sys::Timer> connectionTimer;
        void getApnConfiguration();

M module-services/service-gui/ServiceGUI.cpp => module-services/service-gui/ServiceGUI.cpp +8 -13
@@ 57,19 57,14 @@ namespace sgui
        gui::ImageManager &imageManager = gui::ImageManager::getInstance();
        imageManager.init("assets");

        connect(typeid(sgui::DrawMessage), [&](sys::DataMessage *request, sys::ResponseMessage *) -> sys::Message_t {
            return handleDrawMessage(request);
        });
        connect(typeid(sgui::DrawMessage),
                [&](sys::Message *request) -> sys::MessagePointer { return handleDrawMessage(request); });

        connect(typeid(service::gui::RenderingFinished),
                [&](sys::DataMessage *request, sys::ResponseMessage *) -> sys::Message_t {
                    return handleGUIRenderingFinished(request);
                });
                [&](sys::Message *request) -> sys::MessagePointer { return handleGUIRenderingFinished(request); });

        connect(typeid(service::gui::GUIDisplayReady),
                [&](sys::DataMessage *request, sys::ResponseMessage *) -> sys::Message_t {
                    return handleGUIDisplayReady(request);
                });
                [&](sys::Message *request) -> sys::MessagePointer { return handleGUIDisplayReady(request); });
    }

    ServiceGUI::~ServiceGUI()


@@ 108,7 103,7 @@ namespace sgui
        worker->send(static_cast<uint32_t>(WorkerGUICommands::Render), NULL);
    }

    sys::Message_t ServiceGUI::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ServiceGUI::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        return std::make_shared<sys::ResponseMessage>();
    }


@@ 163,7 158,7 @@ namespace sgui
        return sys::ReturnCodes::Success;
    }

    sys::Message_t ServiceGUI::handleDrawMessage(sys::Message *message)
    sys::MessagePointer ServiceGUI::handleDrawMessage(sys::Message *message)
    {
        auto dmsg = static_cast<sgui::DrawMessage *>(message);
        if (!dmsg->commands.empty()) {


@@ 203,7 198,7 @@ namespace sgui
        return nullptr;
    }

    sys::Message_t ServiceGUI::handleGUIRenderingFinished(sys::Message *message)
    sys::MessagePointer ServiceGUI::handleGUIRenderingFinished(sys::Message *message)
    {
        rendering = false;
        renderFrameCounter++;


@@ 218,7 213,7 @@ namespace sgui
        return nullptr;
    }

    sys::Message_t ServiceGUI::handleGUIDisplayReady(sys::Message *message)
    sys::MessagePointer ServiceGUI::handleGUIDisplayReady(sys::Message *message)
    {
        auto msg    = static_cast<service::gui::GUIDisplayReady *>(message);
        einkReady   = true;

M module-services/service-gui/ServiceGUI.hpp => module-services/service-gui/ServiceGUI.hpp +4 -4
@@ 84,7 84,7 @@ namespace sgui
                   uint32_t screenHeight = 600);
        ~ServiceGUI();

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override;

        sys::ReturnCodes InitHandler() override;



@@ 93,9 93,9 @@ namespace sgui
        sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final;

      private:
        sys::Message_t handleDrawMessage(sys::Message *message);
        sys::Message_t handleGUIRenderingFinished(sys::Message *message);
        sys::Message_t handleGUIDisplayReady(sys::Message *message);
        sys::MessagePointer handleDrawMessage(sys::Message *message);
        sys::MessagePointer handleGUIRenderingFinished(sys::Message *message);
        sys::MessagePointer handleGUIDisplayReady(sys::Message *message);
    };

} /* namespace sgui */

M module-services/service-lwip/ServiceLwIP.cpp => module-services/service-lwip/ServiceLwIP.cpp +2 -2
@@ 8,7 8,7 @@
#include <stddef.h>         // for NULL

#include "MessageType.hpp"     // for MessageType, MessageType::LwIP_request
#include "Service/Message.hpp" // for ResponseMessage, DataMessage, Message_t
#include "Service/Message.hpp" // for ResponseMessage, DataMessage, MessagePointer
#include "Service/Service.hpp" // for Service

extern "C"


@@ 76,7 76,7 @@ sys::ReturnCodes ServiceLwIP::DeinitHandler()
    return sys::ReturnCodes::Success;
}

sys::Message_t ServiceLwIP::DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
sys::MessagePointer ServiceLwIP::DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp)
{
    LOG_ERROR("TRY START LWIP");
    try {

M module-services/service-lwip/ServiceLwIP.hpp => module-services/service-lwip/ServiceLwIP.hpp +2 -2
@@ 6,7 6,7 @@
#include <memory>

#include "MessageType.hpp"     // for MessageType, MessageType::LwIP_request
#include "Service/Message.hpp" // for DataMessage, Message_t, ResponseMessage (ptr only)
#include "Service/Message.hpp" // for DataMessage, MessagePointer, ResponseMessage (ptr only)
#include "Service/Service.hpp" // for Service
#include "Service/Common.hpp"  // for ReturnCodes, ServicePowerMode



@@ 32,7 32,7 @@ class ServiceLwIP : public sys::Service
    ServiceLwIP();
    ~ServiceLwIP() = default;

    virtual sys::Message_t DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override;
    virtual sys::MessagePointer DataReceivedHandler(sys::DataMessage *msg, sys::ResponseMessage *resp) override;
    sys::ReturnCodes InitHandler() override;
    sys::ReturnCodes DeinitHandler() override;
    virtual sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override;

M module-services/service-time/ServiceTime.cpp => module-services/service-time/ServiceTime.cpp +1 -1
@@ 46,7 46,7 @@ namespace stm
        return sys::ReturnCodes::Success;
    }

    sys::Message_t ServiceTime::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    sys::MessagePointer ServiceTime::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)
    {
        std::shared_ptr<sys::ResponseMessage> responseMsg = nullptr;


M module-services/service-time/ServiceTime.hpp => module-services/service-time/ServiceTime.hpp +2 -2
@@ 13,7 13,7 @@
#include "MessageType.hpp"
#include "timeEvents/CalendarTimeEvents.hpp" // for CalendarTimeEvents
#include "Service/Common.hpp"                // for ReturnCodes, ServicePowerMode
#include "Service/Message.hpp"               // for Message_t, DataMessage (ptr only), ResponseMessage (ptr only)
#include "Service/Message.hpp"               // for MessagePointer, DataMessage (ptr only), ResponseMessage (ptr only)
#include "service-time/ServiceTime.hpp"

namespace service::name


@@ 36,7 36,7 @@ namespace stm
        sys::ReturnCodes DeinitHandler() override;
        sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final;

        sys::Message_t DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp = nullptr) override;
        sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp = nullptr) override;
    };

} /* namespace stm */

M module-sys/README.md => module-sys/README.md +4 -4
@@ 36,12 36,12 @@ enum class ServicePowerMode{

Important: Currently there is no distinction between `SuspendToRAM` and `SuspendsToNVM`. These two cases should be handled the same.  Additionally only `SuspendToNVM` can be received by service.

#### `Message_t DataReceivedHandler(DataMessage* msg,ResponseMessage* resp)`  
#### `MessagePointer DataReceivedHandler(DataMessage* msg,ResponseMessage* resp)`  
This is the main handler which should handle incoming messages.  
If `DataMessage* msg` is not nullptr then it contains valid message which was sent by using blocking Bus API.  
If `ResponseMessage* resp` is not nullptr then it contains valid message which was sent by using non-blocking Bus API.

This handler MUST return valid `Message_t`. In practice each service will return custom ResponseMessage which is created
This handler MUST return valid `MessagePointer`. In practice each service will return custom ResponseMessage which is created
by inheriting from base `sys::ResponseMessage` class.  

Please check existing services for more examples of use    


@@ 69,8 69,8 @@ Bus subsystem was developed in order for services to be able to communicate with
#### `bool SendUnicast(std::shared_ptr<Message> msg,const std::string& service,Service* s)`  
Non-blocking variant of sending messages to specified service.  
`Service* s` is pointer to API caller.
#### `MessageRet_t SendUnicast(std::shared_ptr<Message> msg,const std::string& service,Service* s,uint32_t timeout)`  
Blocking variant of sending messages to specified service. `timeout` is in ms. `MessageRet_t` is std::pair which consist return code and message hence
#### `SendResult SendUnicast(std::shared_ptr<Message> msg,const std::string& service,Service* s,uint32_t timeout)`  
Blocking variant of sending messages to specified service. `timeout` is in ms. `SendResult` is std::pair which consist return code and message hence
it is required to first check for return code before using message field. In case of timeout return code will be set to `Timeout`    
`Service* s` is pointer to API caller.
#### `void SendMulticast(std::shared_ptr<Message> msg,BusChannels channel,Service* s)`  

M module-sys/Service/Bus.cpp => module-sys/Service/Bus.cpp +15 -16
@@ 58,16 58,18 @@ namespace sys
        CriticalSection::Exit();
    }

    void Bus::SendResponse(std::shared_ptr<Message> msg, std::shared_ptr<Message> receivedMsg, Service *s)
    void Bus::SendResponse(std::shared_ptr<Message> response, std::shared_ptr<Message> request, Service *sender)
    {
        assert(msg != nullptr);
        assert(receivedMsg != nullptr);
        assert(s != nullptr);
        msg->sender    = s->GetName();
        msg->uniID     = receivedMsg->uniID;
        msg->transType = Message::TransmissionType ::Unicast;
        if (servicesRegistered.find(receivedMsg->sender) != servicesRegistered.end()) {
            servicesRegistered[receivedMsg->sender]->mailbox.push(msg);
        assert(response != nullptr);
        assert(request != nullptr);
        assert(sender != nullptr);

        response->id        = uniqueMsgId++;
        response->uniID     = request->uniID;
        response->sender    = sender->GetName();
        response->transType = Message::TransmissionType ::Unicast;
        if (servicesRegistered.find(request->sender) != servicesRegistered.end()) {
            servicesRegistered[request->sender]->mailbox.push(response);
        }
        else {
            // silently drop it


@@ 96,10 98,7 @@ namespace sys
        return true;
    }

    MessageRet_t Bus::SendUnicast(std::shared_ptr<Message> msg,
                                  const std::string &service,
                                  Service *s,
                                  uint32_t timeout)
    SendResult Bus::SendUnicast(std::shared_ptr<Message> msg, const std::string &service, Service *s, uint32_t timeout)
    {
        std::vector<std::shared_ptr<Message>> tempMsg;
        tempMsg.reserve(4); // reserve space for 4 elements to avoid costly memory allocations


@@ 155,7 154,7 @@ namespace sys

                // Register that we didn't receive response. Even if it arrives it will be dropped
                s->staleUniqueMsg.push_back(std::make_pair(unicastID, cpp_freertos::Ticks::GetTicks()));
                return CreateMessageRet(ReturnCodes::Timeout, nullptr);
                return CreateSendResult(ReturnCodes::Timeout, nullptr);
            }

            // Received response


@@ 166,14 165,14 @@ namespace sys
                    s->mailbox.push(w);
                }

                return CreateMessageRet(ReturnCodes::Success, rxmsg);
                return CreateSendResult(ReturnCodes::Success, rxmsg);
            }
            // Check for system messages
            else if (rxmsg->type == Message::Type::System) {

                SystemMessage *sysmsg = static_cast<SystemMessage *>(rxmsg.get());

                if (sysmsg->sysMsgType == SystemMessageType::Ping) {
                if (sysmsg->systemMessageType == SystemMessageType::Ping) {
                    rxmsg->Execute(s);
                }
                else {

M module-sys/Service/Bus.hpp => module-sys/Service/Bus.hpp +5 -5
@@ 24,10 24,10 @@ namespace sys
        static bool SendUnicast(std::shared_ptr<Message> msg, const std::string &service, Service *s);

        // Send message directly to specified service with timeout
        static MessageRet_t SendUnicast(std::shared_ptr<Message> msg,
                                        const std::string &service,
                                        Service *s,
                                        uint32_t timeout);
        static SendResult SendUnicast(std::shared_ptr<Message> msg,
                                      const std::string &service,
                                      Service *s,
                                      uint32_t timeout);

        // Send message to specific channel
        static void SendMulticast(std::shared_ptr<Message> msg, BusChannels channel, Service *source);


@@ 41,7 41,7 @@ namespace sys
        // Unregister specified service
        static void Remove(std::shared_ptr<Service> service);

        static void SendResponse(std::shared_ptr<Message> msg, std::shared_ptr<Message> receivedMsg, Service *s);
        static void SendResponse(std::shared_ptr<Message> response, std::shared_ptr<Message> request, Service *sender);

      private:
        Bus();

M module-sys/Service/Message.cpp => module-sys/Service/Message.cpp +29 -54
@@ 11,73 11,48 @@

namespace sys
{

    MessageRet_t CreateMessageRet(ReturnCodes retCode, Message_t msg)
    SendResult CreateSendResult(ReturnCodes retCode, MessagePointer msg)
    {
        return std::make_pair(retCode, msg);
    };
    }

    Message_t DataMessage::Execute(Service *service)
    {
    Message::Message(BusChannels channel) : channel{channel}
    {}

        // Ignore incoming data message if this service is not yet initialized
        if (service->isReady) {
            return Proxy::handle(service, this, nullptr);
        }
        else {
            return std::make_shared<ResponseMessage>();
        }
    MessagePointer Message::Execute(Service *service)
    {
        return Proxy::handleMessage(service, this);
    }

    Message_t SystemMessage::Execute(Service *service)
    SystemMessage::SystemMessage(SystemMessageType systemMessageType, ServicePowerMode pwrMode)
        : Message(BusChannels::System), systemMessageType(systemMessageType), powerMode(pwrMode)
    {
        type = Type::System;
    }

        ReturnCodes ret = ReturnCodes ::Success;

        switch (sysMsgType) {

        case SystemMessageType::Ping:
            service->pingTimestamp = cpp_freertos::Ticks::GetTicks();
            break;

        case SystemMessageType::SwitchPowerMode:
            service->SwitchPowerModeHandler(powerMode);
            break;

        case SystemMessageType::Exit:
            ret = service->DeinitHandler();
            service->CloseHandler();
            break;

        case SystemMessageType::Timer:
            ret = service->TimerHandle(*this);
            break;

        case SystemMessageType::Start:
            ret = service->InitHandler();
            if (ret == ReturnCodes::Success) {
                service->isReady = true;
            }
    MessagePointer SystemMessage::Execute(Service *service)
    {
        return Proxy::handleSystemMessage(service, this);
    }

            break;
        }
        return std::make_shared<ResponseMessage>(ret);
    DataMessage::DataMessage(MessageType messageType) : messageType{messageType}
    {
        type = Type::Data;
    }

    Message_t ResponseMessage::Execute(Service *service)
    DataMessage::DataMessage(BusChannels channel) : Message(channel)
    {
        // Ignore incoming data message if this service is not yet initialized
        if (service->isReady) {
            DataMessage dummy(MessageType::MessageTypeUninitialized);
            return Proxy::handle(service, &dummy, this);
        }
        else {
            return std::make_shared<ResponseMessage>();
        }
        type = Type::Data;
    }

#ifdef UNIT_TESTS
    uint32_t Message::unitestsMsgInstancesCount = 0;
#endif
    ResponseMessage::ResponseMessage(ReturnCodes retCode, MessageType responseTo)
        : retCode(retCode), responseTo(responseTo)
    {
        type = Type::Response;
    }

    MessagePointer ResponseMessage::Execute(Service *service)
    {
        return Proxy::handleMessage(service, nullptr, this);
    }
} // namespace sys

M module-sys/Service/Message.hpp => module-sys/Service/Message.hpp +35 -77
@@ 5,35 5,22 @@

#include "Common.hpp"
#include "MessageType.hpp"

#include <cstdint>
#include <memory>
#include <stdint.h>
#include <string>
#include <vector>

namespace sys
{

    class Service;
    class ResponseMessage;
    class Message;

    enum class SystemMessageType
    {
        Ping,
        SwitchPowerMode,
        Start,
        Timer,
        Exit
    };

    using Message_t    = std::shared_ptr<Message>;
    using MessageRet_t = std::pair<ReturnCodes, std::shared_ptr<Message>>;

    MessageRet_t CreateMessageRet(ReturnCodes retCode, Message_t msg);
    using MessagePointer = std::shared_ptr<Message>;
    using MessageNone    = std::nullptr_t;
    using SendResult     = std::pair<ReturnCodes, std::shared_ptr<Message>>;
    SendResult CreateSendResult(ReturnCodes retCode, MessagePointer msg);

    class Message
    {

      public:
        enum class TransmissionType
        {


@@ 41,7 28,6 @@ namespace sys
            Multicast,
            Broadcast
        };

        enum class Type
        {
            System,


@@ 49,93 35,65 @@ namespace sys
            Response
        };

        Message()
        {
#ifdef UNIT_TESTS
            unitestsMsgInstancesCount++;
#endif
        }
        Message() = default;
        explicit Message(BusChannels channel);
        virtual ~Message() noexcept = default;

        Message(BusChannels chan) : channel(chan)
        {
#ifdef UNIT_TESTS
            unitestsMsgInstancesCount++;
#endif
        }
        virtual MessagePointer Execute(Service *service);

        virtual ~Message()
        virtual operator std::string() const
        {
#ifdef UNIT_TESTS
            unitestsMsgInstancesCount--;
#endif
            return {"{}"};
        }

        virtual Message_t Execute(Service *service) = 0;

        std::uint64_t id;
        std::uint64_t uniID;
        Type type;
        TransmissionType transType;
        BusChannels channel;
        std::string sender;
        uint64_t id;
        uint64_t uniID;

        virtual operator std::string() const
        {
            return "{}";
        }
    };

#ifdef UNIT_TESTS
        static uint32_t unitestsMsgInstancesCount;
#endif
    enum class SystemMessageType
    {
        Ping,
        SwitchPowerMode,
        Start,
        Timer,
        Exit
    };

    class SystemMessage : public Message
    {
      public:
        SystemMessage(SystemMessageType sysMsgType, ServicePowerMode pwrMode = ServicePowerMode::Active)
            : Message(BusChannels ::System), sysMsgType(sysMsgType), powerMode(pwrMode)
        {
            type = Type::System;
        }
        explicit SystemMessage(SystemMessageType systemMessageType,
                               ServicePowerMode pwrMode = ServicePowerMode::Active);

        Message_t Execute(Service *service) override;
        MessagePointer Execute(Service *service) final;

        SystemMessageType sysMsgType;
        SystemMessageType systemMessageType;
        ServicePowerMode powerMode;
    };

    class DataMessage : public Message
    {
      public:
        explicit DataMessage(MessageType messageType);
        explicit DataMessage(BusChannels channel);

        // This field must by provided by the class that inherits DataMessage
        MessageType messageType = MessageType::MessageTypeUninitialized;

        DataMessage(MessageType messageType) : messageType{messageType}
        {
            type = Type::Data;
        }

        DataMessage(BusChannels channel) : Message(channel)
        {
            type = Type::Data;
        }

        Message_t Execute(Service *service) override final;
    };

    class ResponseMessage : public Message
    {
      public:
        ResponseMessage(ReturnCodes retCode    = ReturnCodes::Success,
                        MessageType responseTo = MessageType::MessageTypeUninitialized)
            : Message(), responseTo(responseTo), retCode(retCode)
        {
            type = Type::Response;
        }
        MessageType responseTo;
        ReturnCodes retCode;
        explicit ResponseMessage(ReturnCodes retCode    = ReturnCodes::Success,
                                 MessageType responseTo = MessageType::MessageTypeUninitialized);

        Message_t Execute(Service *service) override;
    };
        MessagePointer Execute(Service *service) final;

        ReturnCodes retCode;
        MessageType responseTo;
    };
} // namespace sys

M module-sys/Service/Service.cpp => module-sys/Service/Service.cpp +79 -31
@@ 7,7 7,7 @@
#include "MessageType.hpp"     // for MessageType, MessageType::MessageType...
#include "Service/Common.hpp"  // for BusChannels, ReturnCodes, ReturnCodes...
#include "Service/Mailbox.hpp" // for Mailbox
#include "Service/Message.hpp" // for Message, Message_t, DataMessage, Resp...
#include "Service/Message.hpp" // for Message, MessagePointer, DataMessage, Resp...
#include "Timer.hpp"           // for Timer
#include "TimerMessage.hpp"    // for TimerMessage
#include "log/debug.hpp"       // for DEBUG_SERVICE_MESSAGES


@@ 26,7 26,7 @@
#endif

// this could use Scoped() class from utils to print execution time too
void debug_msg(sys::Service *srvc, sys::DataMessage *&ptr)
void debug_msg(sys::Service *srvc, const sys::Message *ptr)
{
#if (DEBUG_SERVICE_MESSAGES > 0)



@@ 78,11 78,8 @@ namespace sys

    void Service::Run()
    {

        while (enableRunLoop) {

            auto msg = mailbox.pop();

            auto msg           = mailbox.pop();
            uint32_t timestamp = cpp_freertos::Ticks::GetTicks();

            // Remove all staled messages


@@ 94,40 91,56 @@ namespace sys
                                                }),
                                 staleUniqueMsg.end());

            /// this is the only place that uses Reponse messages (service manager doesnt...)
            auto ret = msg->Execute(this);
            if (ret == nullptr) {
                ret = std::make_shared<DataMessage>(MessageType::MessageTypeUninitialized);
            const bool respond = msg->type != Message::Type::Response && GetName() != msg->sender;
            auto response      = msg->Execute(this);
            if (response == nullptr || !respond) {
                continue;
            }

            // Unicast messages always need response with the same ID as received message
            // Don't send responses to themselves,
            // Don't send responses to responses
            if ((msg->transType == Message::TransmissionType ::Unicast) && (msg->type != Message::Type::Response) &&
                (GetName() != msg->sender)) {
                Bus::SendResponse(ret, msg, this);
            }
            Bus::SendResponse(response, msg, this);
        }

        Bus::Remove(shared_from_this());
    };

    auto Service::MessageEntry(DataMessage *message, ResponseMessage *response) -> Message_t
    auto Service::MessageEntry(Message *message, ResponseMessage *response) -> MessagePointer
    {
        return response == nullptr ? HandleMessage(message) : HandleResponse(response);
    }

    auto Service::HandleMessage(Message *message) -> MessagePointer
    {
        Message_t ret = std::make_shared<sys::ResponseMessage>(sys::ReturnCodes::Unresolved);
        auto idx      = type_index(typeid(*message));
        auto handler  = message_handlers.find(idx);
        debug_msg(this, message);
        if (handler != message_handlers.end()) {
            ret = message_handlers[idx](message, response);
            if (ret != nullptr) {
                ret->type = sys::Message::Type::Response;
            }

        if (const auto &[handled, ret] = ExecuteMessageHandler(message); handled) {
            return ret;
        }
        if (auto dataMsg = dynamic_cast<DataMessage *>(message); dataMsg != nullptr) {
            return DataReceivedHandler(dataMsg, nullptr);
        }

        LOG_ERROR("Failed to handle message of type [%s]", typeid(*message).name());
        return nullptr;
    }

    auto Service::HandleResponse(ResponseMessage *message) -> MessagePointer
    {
        debug_msg(this, message);

        if (const auto &[handled, ret] = ExecuteMessageHandler(message); handled) {
            return ret;
        }
        else {
            ret = DataReceivedHandler(message, response);
        DataMessage dummy(MessageType::MessageTypeUninitialized);
        return DataReceivedHandler(&dummy, message);
    }

    auto Service::ExecuteMessageHandler(Message *message) -> std::pair<bool, MessagePointer>
    {
        const auto idx = type_index(typeid(*message));
        if (const auto handler = message_handlers.find(idx); handler != message_handlers.end()) {
            const auto &handlerFunction = handler->second;
            return {true, handlerFunction(message)};
        }
        return ret;
        return {false, nullptr};
    }

    bool Service::connect(const type_info &type, MessageHandler handler)


@@ 150,7 163,7 @@ namespace sys

    bool Service::connect(Message &&msg, MessageHandler handler)
    {
        return Service::connect(&msg, handler);
        return connect(&msg, handler);
    }

    void Service::CloseHandler()


@@ 183,4 196,39 @@ namespace sys
            timer->stop();
        }
    }

    auto Proxy::handleMessage(Service *service, Message *message, ResponseMessage *response) -> MessagePointer
    {
        if (service->isReady) {
            return service->MessageEntry(message, response);
        }
        return std::make_shared<ResponseMessage>(ReturnCodes::ServiceDoesntExist);
    }

    auto Proxy::handleSystemMessage(Service *service, SystemMessage *message) -> MessagePointer
    {
        auto ret = ReturnCodes::Success;
        switch (message->systemMessageType) {
        case SystemMessageType::Ping:
            service->pingTimestamp = cpp_freertos::Ticks::GetTicks();
            break;
        case SystemMessageType::SwitchPowerMode:
            service->SwitchPowerModeHandler(message->powerMode);
            break;
        case SystemMessageType::Exit:
            ret = service->DeinitHandler();
            service->CloseHandler();
            break;
        case SystemMessageType::Timer:
            ret = service->TimerHandle(*message);
            break;
        case SystemMessageType::Start:
            ret = service->InitHandler();
            if (ret == ReturnCodes::Success) {
                service->isReady = true;
            }
            break;
        }
        return std::make_shared<ResponseMessage>(ret);
    }
} // namespace sys

M module-sys/Service/Service.hpp => module-sys/Service/Service.hpp +17 -9
@@ 5,7 5,7 @@

#include "Common.hpp"  // for ReturnCodes, ServicePriority, BusChannels
#include "Mailbox.hpp" // for Mailbox
#include "Message.hpp" // for Message_t
#include "Message.hpp" // for MessagePointer
#include "thread.hpp"  // for Thread
#include <algorithm>   // for find, max
#include <cstdint>     // for uint32_t, uint64_t


@@ 30,7 30,7 @@ namespace sys

namespace sys
{
    using MessageHandler = std::function<Message_t(DataMessage *, ResponseMessage *)>;
    using MessageHandler = std::function<MessagePointer(Message *)>;

    class Service : public cpp_freertos::Thread, public std::enable_shared_from_this<Service>
    {


@@ 46,7 46,8 @@ namespace sys

        // Invoked for not processed already messages
        // override should in in either callback, function or whatever...
        virtual Message_t DataReceivedHandler(DataMessage *msg, ResponseMessage *resp) = 0;
        [[deprecated("Use connect method instead.")]] virtual MessagePointer DataReceivedHandler(
            DataMessage *msg, ResponseMessage *resp) = 0;

        // Invoked during initialization
        virtual ReturnCodes InitHandler() = 0;


@@ 92,9 93,17 @@ namespace sys

      private:
        /// first point of enttry on messages - actually used method in run
        /// First calls message_hanlders
        /// First calls message_handlers
        /// If not - fallback to DataReceivedHandler
        virtual auto MessageEntry(DataMessage *message, ResponseMessage *response) -> Message_t final;
        auto MessageEntry(Message *message, ResponseMessage *response) -> MessagePointer;
        auto HandleMessage(Message *message) -> MessagePointer;
        auto HandleResponse(ResponseMessage *message) -> MessagePointer;
        /// Execute a message handler functor, if found one.
        /// \param message  Request message
        /// \return A pair of:
        /// - True if message handler called, false otherwise.
        /// - A response message on success, nullptr otherwise.
        auto ExecuteMessageHandler(Message *message) -> std::pair<bool, MessagePointer>;

        friend Proxy;



@@ 144,9 153,8 @@ namespace sys
    /// for service
    struct Proxy
    {
        static auto handle(Service *service, DataMessage *message, ResponseMessage *response) -> Message_t
        {
            return service->MessageEntry(message, response);
        }
        static auto handleMessage(Service *service, Message *message, ResponseMessage *response = nullptr)
            -> MessagePointer;
        static auto handleSystemMessage(Service *service, SystemMessage *message) -> MessagePointer;
    };
} // namespace sys

M module-sys/SystemManager/SystemManager.cpp => module-sys/SystemManager/SystemManager.cpp +7 -7
@@ 270,7 270,7 @@ namespace sys
    {
        isReady = true;

        connect(SystemManagerCmd(), [&](DataMessage *msg, ResponseMessage * /*resp*/) {
        connect(SystemManagerCmd(), [&](Message *msg) {
            if (msg->channel == BusChannels::SystemManagerRequests) {
                auto *data = static_cast<SystemManagerCmd *>(msg);



@@ 285,28 285,28 @@ namespace sys
                    break;
                }
            }
            return Message_t();
            return MessageNone{};
        });

        connect(sevm::KbdMessage(), [&](DataMessage * /*msg*/, ResponseMessage * /*resp*/) {
        connect(sevm::KbdMessage(), [&](Message *) {
            // we are in shutdown mode - we received that there was red key pressed -> we need to reboot
            if (state == State::Shutdown) {
                set(State::Reboot);
            }
            return Message_t();
            return MessageNone{};
        });

        connect(sevm::BatteryPlugMessage(), [&](DataMessage * /*msg*/, ResponseMessage * /*resp*/) {
        connect(sevm::BatteryPlugMessage(), [&](Message *) {
            if (state == State::Shutdown) {
                set(State::ShutdownReady);
            }
            return Message_t();
            return MessageNone{};
        });

        return ReturnCodes::Success;
    }

    Message_t SystemManager::DataReceivedHandler(DataMessage * /*msg*/, ResponseMessage * /*resp*/)
    MessagePointer SystemManager::DataReceivedHandler(DataMessage * /*msg*/, ResponseMessage * /*resp*/)
    {
        return std::make_shared<ResponseMessage>();
    }

M module-sys/SystemManager/SystemManager.hpp => module-sys/SystemManager/SystemManager.hpp +1 -2
@@ 91,8 91,7 @@ namespace sys
        void kill(std::shared_ptr<Service> const &toKill);

      private:

        Message_t DataReceivedHandler(DataMessage *msg, ResponseMessage *resp) override;
        MessagePointer DataReceivedHandler(DataMessage *msg, ResponseMessage *resp) override;

        ReturnCodes InitHandler() override;