From 65119cb495f3417d8f5ef4f028990cd09ab8fbc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Ta=C5=84ski?= Date: Mon, 8 Feb 2021 09:48:46 +0100 Subject: [PATCH] [EGD-5027] Services synchronization introduced Dependencies between services are now supported. --- module-apps/ApplicationLauncher.hpp | 6 +- .../windows/AddDeviceWindow.cpp | 5 + .../windows/BtScanWindow.cpp | 5 + module-db/Database/Database.cpp | 4 +- .../service-antenna/ServiceAntenna.cpp | 10 +- .../service-antenna/api/AntennaServiceAPI.cpp | 6 +- .../service-antenna/ServiceAntenna.hpp | 24 ++- .../model/ApplicationManager.cpp | 15 -- .../model/ApplicationManager.hpp | 18 +- .../service-audio/AudioServiceAPI.cpp | 26 +-- .../service-audio/ServiceAudio.cpp | 6 +- .../service-audio/ServiceAudio.hpp | 24 ++- .../service-bluetooth/CMakeLists.txt | 1 + .../service-bluetooth/ServiceBluetooth.cpp | 1 - .../service-bluetooth/BluetoothMessage.cpp | 14 ++ .../service-bluetooth/BluetoothMessage.hpp | 10 +- .../service-bluetooth/ServiceBluetooth.hpp | 21 ++- .../service-cellular/ServiceCellular.hpp | 15 ++ module-services/service-db/ServiceDB.cpp | 3 +- module-services/service-db/ServiceDB.hpp | 21 ++- .../test-service-db-settings-api.cpp | 126 ++++++------- .../service-desktop/ServiceDesktop.hpp | 21 ++- module-services/service-eink/ServiceEink.hpp | 21 ++- .../service-evtmgr/EventManager.hpp | 22 ++- .../service-fileindexer/Constants.hpp | 4 +- .../ServiceFileIndexer.hpp | 19 +- .../service-fota/FotaServiceAPI.cpp | 14 +- module-services/service-fota/ServiceFota.cpp | 10 +- .../service-fota/service-fota/ServiceFota.hpp | 25 ++- module-services/service-gui/ServiceGUI.hpp | 21 ++- module-services/service-lwip/ServiceLwIP.cpp | 6 +- .../service-lwip/service-lwip/ServiceLwIP.hpp | 26 ++- module-services/service-time/ServiceTime.hpp | 18 +- module-sys/CMakeLists.txt | 5 + module-sys/Service/Service.hpp | 3 +- module-sys/Service/ServiceCreator.hpp | 57 ++++++ module-sys/Service/ServiceManifest.hpp | 45 +++++ module-sys/SystemManager/DependencyGraph.cpp | 32 ++++ module-sys/SystemManager/DependencyGraph.hpp | 42 +++++ module-sys/SystemManager/SystemManager.cpp | 60 ++++-- module-sys/SystemManager/SystemManager.hpp | 21 ++- .../doc/ServicesSynchronization.md | 25 +++ .../doc/services_synchronization.puml | 30 +++ .../SystemManager/graph/TopologicalSort.cpp | 75 ++++++++ .../SystemManager/graph/TopologicalSort.hpp | 32 ++++ module-sys/SystemManager/tests/CMakeLists.txt | 9 + .../tests/test-DependencyGraph.cpp | 175 ++++++++++++++++++ module-sys/SystemManager/tests/tests-main.cpp | 5 + services_synchronization.png | Bin 0 -> 28136 bytes source/main.cpp | 117 ++++++------ 50 files changed, 1048 insertions(+), 253 deletions(-) create mode 100644 module-services/service-bluetooth/service-bluetooth/BluetoothMessage.cpp create mode 100644 module-sys/Service/ServiceCreator.hpp create mode 100644 module-sys/Service/ServiceManifest.hpp create mode 100644 module-sys/SystemManager/DependencyGraph.cpp create mode 100644 module-sys/SystemManager/DependencyGraph.hpp create mode 100644 module-sys/SystemManager/doc/ServicesSynchronization.md create mode 100644 module-sys/SystemManager/doc/services_synchronization.puml create mode 100644 module-sys/SystemManager/graph/TopologicalSort.cpp create mode 100644 module-sys/SystemManager/graph/TopologicalSort.hpp create mode 100644 module-sys/SystemManager/tests/CMakeLists.txt create mode 100644 module-sys/SystemManager/tests/test-DependencyGraph.cpp create mode 100644 module-sys/SystemManager/tests/tests-main.cpp create mode 100644 services_synchronization.png diff --git a/module-apps/ApplicationLauncher.hpp b/module-apps/ApplicationLauncher.hpp index 5bebf306b1452945317d81d4257c3b2676ef2dcf..d2c1cf0768cf43785642a71dc58733f4833cd787 100644 --- a/module-apps/ApplicationLauncher.hpp +++ b/module-apps/ApplicationLauncher.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -79,14 +79,14 @@ namespace app { parent = (caller == nullptr ? "" : caller->GetName()); handle = std::make_shared(name, parent); - return sys::SystemManager::CreateService(handle, caller); + return sys::SystemManager::RunService(handle, caller); } bool runBackground(sys::Service *caller) override { parent = (caller == nullptr ? "" : caller->GetName()); handle = std::make_shared(name, parent, true); - return sys::SystemManager::CreateService(handle, caller); + return sys::SystemManager::RunService(handle, caller); } }; diff --git a/module-apps/application-settings-new/windows/AddDeviceWindow.cpp b/module-apps/application-settings-new/windows/AddDeviceWindow.cpp index 636baa6bc021e51c5d567dc4b90b7542596d4065..18b60374af3995009c592187a3c65fa37aa6521c 100644 --- a/module-apps/application-settings-new/windows/AddDeviceWindow.cpp +++ b/module-apps/application-settings-new/windows/AddDeviceWindow.cpp @@ -9,6 +9,11 @@ #include #include +extern "C" +{ +#include +} + namespace gui { diff --git a/module-apps/application-settings/windows/BtScanWindow.cpp b/module-apps/application-settings/windows/BtScanWindow.cpp index c6f59cea8bf2810c5163d1e971e63a612fb36b75..7024a685f79f6db8bfb59e7a6af42e8d7a590100 100644 --- a/module-apps/application-settings/windows/BtScanWindow.cpp +++ b/module-apps/application-settings/windows/BtScanWindow.cpp @@ -16,6 +16,11 @@ #include +extern "C" +{ +#include +} + namespace gui { diff --git a/module-db/Database/Database.cpp b/module-db/Database/Database.cpp index 665a7786fe2d3d338c5c64a6d20e08864548ef69..0ac50bc2242d0229948531e2a9af155fae551dfb 100644 --- a/module-db/Database/Database.cpp +++ b/module-db/Database/Database.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "Database.hpp" @@ -70,7 +70,7 @@ Database::Database(const char *name) { LOG_INFO("Creating database: %s", dbName.c_str()); if (const auto rc = sqlite3_open(name, &dbConnection); rc != SQLITE_OK) { - LOG_ERROR("SQLITE INITIALIZATION ERROR! rc=%d dbName=%s", rc, name); + LOG_ERROR("SQLITE INITIALIZATION ERROR! rc=%d ( %s ) dbName=%s", rc, sqlite3_errstr(rc), name); throw DatabaseInitialisationError{"Failed to initialize the sqlite db"}; } diff --git a/module-services/service-antenna/ServiceAntenna.cpp b/module-services/service-antenna/ServiceAntenna.cpp index da8044bc6fda6ec9eec181ad7f0c3cb0618e220f..d0721cb5fa40c688637ff0cdbb115bd2ad8ab299 100644 --- a/module-services/service-antenna/ServiceAntenna.cpp +++ b/module-services/service-antenna/ServiceAntenna.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "service-antenna/ServiceAntenna.hpp" @@ -25,8 +25,6 @@ #include #include -const char *ServiceAntenna::serviceName = "ServiceAntenna"; - namespace antenna { const char *c_str(antenna::State state) @@ -55,9 +53,9 @@ namespace antenna } } // namespace antenna -ServiceAntenna::ServiceAntenna() : sys::Service(serviceName) +ServiceAntenna::ServiceAntenna() : sys::Service(service::name::antenna) { - LOG_INFO("[%s] Initializing", serviceName); + LOG_INFO("[%s] Initializing", service::name::antenna); timer = std::make_unique("Antena", this, 5000, sys::Timer::Type::Periodic); timer->connect([&](sys::Timer &) { @@ -80,7 +78,7 @@ ServiceAntenna::ServiceAntenna() : sys::Service(serviceName) ServiceAntenna::~ServiceAntenna() { - LOG_INFO("[%s] Cleaning resources", serviceName); + LOG_INFO("[%s] Cleaning resources", service::name::antenna); } // Invoked upon receiving data message diff --git a/module-services/service-antenna/api/AntennaServiceAPI.cpp b/module-services/service-antenna/api/AntennaServiceAPI.cpp index 500960e9f41a5b9492397b6554844e036df01c9c..5997dfcfa4ec86b9fd40776669d65eb6397fdb33 100644 --- a/module-services/service-antenna/api/AntennaServiceAPI.cpp +++ b/module-services/service-antenna/api/AntennaServiceAPI.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include @@ -29,7 +29,7 @@ namespace AntennaServiceAPI bool LockRequest(sys::Service *serv, antenna::lockState request) { auto msg = std::make_shared(MessageType::AntennaLockService, request); - auto ret = serv->bus.sendUnicast(msg, ServiceAntenna::serviceName, 5000); + auto ret = serv->bus.sendUnicast(msg, service::name::antenna, 5000); if (ret.first == sys::ReturnCodes::Success) { return true; @@ -40,7 +40,7 @@ namespace AntennaServiceAPI bool GetLockState(sys::Service *serv, antenna::lockState &response) { auto msg = std::make_shared(MessageType::AntennaGetLockState); - auto ret = serv->bus.sendUnicast(msg, ServiceAntenna::serviceName, 5000); + auto ret = serv->bus.sendUnicast(msg, service::name::antenna, 5000); if (ret.first == sys::ReturnCodes::Success) { auto responseMsg = dynamic_cast(ret.second.get()); if (responseMsg != nullptr) { diff --git a/module-services/service-antenna/service-antenna/ServiceAntenna.hpp b/module-services/service-antenna/service-antenna/ServiceAntenna.hpp index 100f20f4648d443dd3fbfde6e31922d0b2af96fa..4717759a77567d23da269ed7c4857b6c22d3afe8 100644 --- a/module-services/service-antenna/service-antenna/ServiceAntenna.hpp +++ b/module-services/service-antenna/service-antenna/ServiceAntenna.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,11 @@ namespace utils } // namespace state } // namespace utils +namespace service::name +{ + constexpr inline auto antenna = "ServiceAntenna"; +} // namespace service::name + namespace antenna { enum class State @@ -76,8 +82,6 @@ class ServiceAntenna : public sys::Service bool suspended = false; public: - static const char *serviceName; - ServiceAntenna(); ~ServiceAntenna(); @@ -102,3 +106,17 @@ class ServiceAntenna : public sys::Service bool csqChangeStateHandler(void); bool lockedStateHandler(void); }; + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::antenna; + manifest.dependencies = {service::name::db}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-appmgr/model/ApplicationManager.cpp b/module-services/service-appmgr/model/ApplicationManager.cpp index e3a752f9095e108ac1258aefe13ec9dcdbe982e7..d3e5f12fde00775264ca846dd5ad2309a1bc4096 100644 --- a/module-services/service-appmgr/model/ApplicationManager.cpp +++ b/module-services/service-appmgr/model/ApplicationManager.cpp @@ -157,7 +157,6 @@ namespace app::manager }, ::settings::SettingsScope::Global); - startSystemServices(); startBackgroundApplications(); if (auto app = getApplication(rootApplicationName); app != nullptr) { Controller::sendAction(this, actions::Home); @@ -166,20 +165,6 @@ namespace app::manager return sys::ReturnCodes::Success; } - void ApplicationManager::startSystemServices() - { - if (bool ret = sys::SystemManager::CreateService( - std::make_shared(service::name::gui, GetName()), this); - !ret) { - LOG_ERROR("Failed to initialize GUI service"); - } - if (bool ret = sys::SystemManager::CreateService( - std::make_shared(service::name::eink, GetName()), this); - !ret) { - LOG_ERROR("Failed to initialize EInk service"); - } - } - void ApplicationManager::suspendSystemServices() { sys::SystemManager::SuspendService(service::name::gui, this); diff --git a/module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp b/module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp index 654f0bbf23b24d072f7d7c2aeed2db1764327164..2d705cb59a1ff3b8cc652fd3873b28b5f416b7d7 100644 --- a/module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp +++ b/module-services/service-appmgr/service-appmgr/model/ApplicationManager.hpp @@ -22,7 +22,10 @@ #include #include +#include #include +#include +#include namespace app { @@ -100,7 +103,6 @@ namespace app::manager private: auto startApplication(ApplicationHandle &app) -> bool; - void startSystemServices(); void startBackgroundApplications(); void rebuildActiveApplications(); void suspendSystemServices(); @@ -158,3 +160,17 @@ namespace app::manager std::string displayLanguage; }; } // namespace app::manager + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = app::manager::ApplicationManager::ServiceName; + manifest.dependencies = {service::name::db, service::name::gui, service::name::eink}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-audio/AudioServiceAPI.cpp b/module-services/service-audio/AudioServiceAPI.cpp index 226c9790f87c87386b15d43c9315998ea4948c76..8917f3fc23558aa33cae8c7b2b5a488391218b08 100644 --- a/module-services/service-audio/AudioServiceAPI.cpp +++ b/module-services/service-audio/AudioServiceAPI.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "service-audio/AudioServiceAPI.hpp" @@ -25,7 +25,7 @@ namespace AudioServiceAPI { auto msgType = static_cast(msg->type); LOG_DEBUG("Msg type %d", msgType); - auto ret = serv->bus.sendUnicast(msg, ServiceAudio::serviceName, sys::BusProxy::defaultTimeout); + auto ret = serv->bus.sendUnicast(msg, service::name::audio, sys::BusProxy::defaultTimeout); if (ret.first == sys::ReturnCodes::Success) { if (auto resp = std::dynamic_pointer_cast(ret.second)) { LOG_DEBUG("Msg type %d done", msgType); @@ -42,19 +42,19 @@ namespace AudioServiceAPI bool PlaybackStart(sys::Service *serv, const audio::PlaybackType &playbackType, const std::string &fileName) { auto msg = std::make_shared(fileName, playbackType); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } bool RecordingStart(sys::Service *serv, const std::string &fileName) { auto msg = std::make_shared(fileName); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } bool RoutingStart(sys::Service *serv) { auto msg = std::make_shared(); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } bool Stop(sys::Service *serv, const std::vector &stopVec) @@ -63,43 +63,43 @@ namespace AudioServiceAPI return true; } auto msg = std::make_shared(stopVec); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } bool Stop(sys::Service *serv, const audio::Token &token) { auto msg = std::make_shared(token); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } bool StopAll(sys::Service *serv) { auto msg = std::make_shared(); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } bool Pause(sys::Service *serv, const audio::Token &token) { auto msg = std::make_shared(token); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } bool Resume(sys::Service *serv, const audio::Token &token) { auto msg = std::make_shared(token); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } bool SendEvent(sys::Service *serv, std::shared_ptr evt) { auto msg = std::make_shared(std::move(evt)); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } bool SendEvent(sys::Service *serv, audio::EventType eType, audio::Event::DeviceState state) { auto msg = std::make_shared(eType, state); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } template @@ -164,7 +164,7 @@ namespace AudioServiceAPI bool KeyPressed(sys::Service *serv, const int step) { auto msg = std::make_shared(step); - return serv->bus.sendUnicast(msg, ServiceAudio::serviceName); + return serv->bus.sendUnicast(msg, service::name::audio); } } // namespace AudioServiceAPI diff --git a/module-services/service-audio/ServiceAudio.cpp b/module-services/service-audio/ServiceAudio.cpp index 6da6d5ecea2df8653e37a2d835a27d829d904fa9..45091b3ec27c93b283c7421f47a309ad2f08d488 100644 --- a/module-services/service-audio/ServiceAudio.cpp +++ b/module-services/service-audio/ServiceAudio.cpp @@ -13,12 +13,10 @@ #include -const char *ServiceAudio::serviceName = "ServiceAudio"; - using namespace audio; ServiceAudio::ServiceAudio() - : sys::Service(serviceName, "", 4096 * 2, sys::ServicePriority::Idle), + : sys::Service(service::name::audio, "", 4096 * 2, sys::ServicePriority::Idle), audioMux([this](auto... params) { return this->AudioServicesCallback(params...); }), settingsProvider(std::make_unique(this)) { @@ -426,7 +424,7 @@ void ServiceAudio::HandleNotification(const AudioNotificationMessage::Type &type } else { auto newMsg = std::make_shared(token); - bus.sendUnicast(newMsg, ServiceAudio::serviceName); + bus.sendUnicast(newMsg, service::name::audio); } return; } diff --git a/module-services/service-audio/service-audio/ServiceAudio.hpp b/module-services/service-audio/service-audio/ServiceAudio.hpp index b7f2ab7a527b328d6db59b4e862d5a18ccea1976..72abcbd9adcbd11a53890f0817a5e37f6fd3fed2 100644 --- a/module-services/service-audio/service-audio/ServiceAudio.hpp +++ b/module-services/service-audio/service-audio/ServiceAudio.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -21,6 +22,11 @@ namespace settings class Settings; } +namespace service::name +{ + constexpr inline auto audio = "ServiceAudio"; +} // namespace service::name + class ServiceAudio : public sys::Service { public: @@ -36,8 +42,6 @@ class ServiceAudio : public sys::Service sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override final; - static const char *serviceName; - private: enum class VibrationType { @@ -95,3 +99,17 @@ class ServiceAudio : public sys::Service void settingsChanged(const std::string &name, std::string value); }; + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::audio; + manifest.dependencies = {service::name::db}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-bluetooth/CMakeLists.txt b/module-services/service-bluetooth/CMakeLists.txt index 983d471f342dd4e12cf1d4ec327f52e2c183f386..459a56bb6ff3e8591c77b06f68389ca7698226af 100644 --- a/module-services/service-bluetooth/CMakeLists.txt +++ b/module-services/service-bluetooth/CMakeLists.txt @@ -6,6 +6,7 @@ set(SOURCES ServiceBluetooth.cpp service-bluetooth/SettingsHolder.cpp service-bluetooth/SettingsSerializer.cpp + service-bluetooth/BluetoothMessage.cpp ) add_library(${PROJECT_NAME} STATIC ${SOURCES}) diff --git a/module-services/service-bluetooth/ServiceBluetooth.cpp b/module-services/service-bluetooth/ServiceBluetooth.cpp index 9a162731c06f167fafdc095f5a96fa71cfd895f2..ea4157a573a9ea247f17832b350b30a975c128a1 100644 --- a/module-services/service-bluetooth/ServiceBluetooth.cpp +++ b/module-services/service-bluetooth/ServiceBluetooth.cpp @@ -1,7 +1,6 @@ // Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md -#include "Constants.hpp" #include "service-bluetooth/ServiceBluetooth.hpp" #include "service-bluetooth/BluetoothMessage.hpp" diff --git a/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.cpp b/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f63ccdc58ff1fc7a5b2ed5791d7b76da08a2935b --- /dev/null +++ b/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.cpp @@ -0,0 +1,14 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "BluetoothMessage.hpp" + +extern "C" +{ +#include +} + +BluetoothAddrMessage::BluetoothAddrMessage(std::string addr) : sys::DataMessage(MessageType::BluetoothAddrResult) +{ + sscanf_bd_addr(addr.c_str(), this->addr); +} diff --git a/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.hpp b/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.hpp index d54c73c3287fa78d23f6c393f876d296224daec4..1371a73a12253eef072802eb698c4bdf0468585c 100644 --- a/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.hpp +++ b/module-services/service-bluetooth/service-bluetooth/BluetoothMessage.hpp @@ -14,11 +14,6 @@ #include #include -extern "C" -{ -#include -}; - struct BluetoothStatus { enum class State @@ -80,10 +75,7 @@ class BluetoothAddrMessage : public sys::DataMessage { public: bd_addr_t addr; - explicit BluetoothAddrMessage(std::string addr) : sys::DataMessage(MessageType::BluetoothAddrResult) - { - sscanf_bd_addr(addr.c_str(), this->addr); - }; + explicit BluetoothAddrMessage(std::string addr); ~BluetoothAddrMessage() override = default; }; diff --git a/module-services/service-bluetooth/service-bluetooth/ServiceBluetooth.hpp b/module-services/service-bluetooth/service-bluetooth/ServiceBluetooth.hpp index e9e07b9dc04bce04beef7abc63fcaeecb89aa416..c0768d0cfddefa4a9250bfd8f10311a7f3352f6b 100644 --- a/module-services/service-bluetooth/service-bluetooth/ServiceBluetooth.hpp +++ b/module-services/service-bluetooth/service-bluetooth/ServiceBluetooth.hpp @@ -1,13 +1,16 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once -#include +#include "Constants.hpp" #include #include #include #include "service-bluetooth/SettingsHolder.hpp" +#include +#include +#include #include "BluetoothMessage.hpp" #include // for unique_ptr @@ -36,3 +39,17 @@ class ServiceBluetooth : public sys::Service private: std::unique_ptr worker; }; + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::bluetooth; + manifest.dependencies = {service::name::db, service::name::audio}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-cellular/service-cellular/ServiceCellular.hpp b/module-services/service-cellular/service-cellular/ServiceCellular.hpp index ed547b2d63d9f766f5faaf9fdc1d653e5747f12f..5783f627f9eeb55c528c4028d33eb841f636f452 100644 --- a/module-services/service-cellular/service-cellular/ServiceCellular.hpp +++ b/module-services/service-cellular/service-cellular/ServiceCellular.hpp @@ -27,6 +27,7 @@ #include // for vector #include #include +#include #include #include @@ -310,3 +311,17 @@ class ServiceCellular : public sys::Service void apnListChanged(const std::string &value); bool volteOn = false; }; + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = ServiceCellular::serviceName; + manifest.dependencies = {service::name::db}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-db/ServiceDB.cpp b/module-services/service-db/ServiceDB.cpp index f2230a70c30cda5583e380fbd1a4db62fda92865..0c03d758dac0d1c4db453ca773796d48b0826789 100644 --- a/module-services/service-db/ServiceDB.cpp +++ b/module-services/service-db/ServiceDB.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ServiceDB.hpp" @@ -11,7 +11,6 @@ #include "service-db/DBSMSMessage.hpp" #include "service-db/DBSMSTemplateMessage.hpp" #include "service-db/DBServiceMessage.hpp" -#include "service-db/DBServiceName.hpp" #include "service-db/DBThreadMessage.hpp" #include "service-db/QueryMessage.hpp" #include "service-db/DatabaseAgent.hpp" diff --git a/module-services/service-db/ServiceDB.hpp b/module-services/service-db/ServiceDB.hpp index 071db535bedab4d7eccf699d8546ce0530cb4037..6f4cb729b8206cc39abf64269237a5384dcdf80e 100644 --- a/module-services/service-db/ServiceDB.hpp +++ b/module-services/service-db/ServiceDB.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -7,6 +7,9 @@ #include "agents/settings/SettingsAgent.hpp" #include "service-db/DatabaseAgent.hpp" #include "service-db/DBNotificationMessage.hpp" +#include "service-db/DBServiceName.hpp" + +#include "service-fileindexer/Constants.hpp" #include #include @@ -91,3 +94,19 @@ class ServiceDB : public sys::Service bool StoreIntoBackup(const std::string &backupPath); void sendUpdateNotification(db::Interface::Name interface, db::Query::Type type); }; + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::db; +#if ENABLE_FILEINDEXER_SERVICE + manifest.dependencies = {service::name::file_indexer.data()}; +#endif + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-db/test/test-settings/test-service-db-settings-api.cpp b/module-services/service-db/test/test-settings/test-service-db-settings-api.cpp index 58598998ae106ce6663228c06f65881b1eb00d26..7c9d880d402a317bbbc17778991550cc35c7040a 100644 --- a/module-services/service-db/test/test-settings/test-service-db-settings-api.cpp +++ b/module-services/service-db/test/test-settings/test-service-db-settings-api.cpp @@ -26,7 +26,7 @@ TEST_CASE("SettingsApi") SECTION("variable/profile/mode register/set/get/unregister") { - auto manager = std::make_shared(); + auto manager = std::make_shared(std::vector>{}); std::shared_ptr varWritter; std::shared_ptr varReader; std::shared_ptr testVar; @@ -38,67 +38,69 @@ TEST_CASE("SettingsApi") std::shared_ptr testMode; std::shared_ptr testStart; - manager->StartSystem([manager, - &varWritter, - &varReader, - &testVar, - &profWritter, - &profReader, - &testProf, - &modeWritter, - &modeReader, - &testMode, - &testStart]() { - // preliminary - testStart = std::make_shared(); - testStart->lock(); - std::cout << "start thr_id: " << std::this_thread::get_id() << std::endl << std::flush; - auto ret = sys::SystemManager::CreateService(std::make_shared(service::name::evt_manager), - manager.get()); - ret &= sys::SystemManager::CreateService(std::make_shared(), manager.get()); - - varWritter = std::make_shared("writterVar"); - varReader = std::make_shared("readerVar"); - - ret &= sys::SystemManager::CreateService(varWritter, manager.get()); - ret &= sys::SystemManager::CreateService(varReader, manager.get()); - - testVar = std::make_shared("appTest", varWritter, varReader, testStart); - ret &= sys::SystemManager::CreateService(testVar, manager.get()); - - profWritter = std::make_shared("writterProf"); - profReader = std::make_shared("readerProf"); - - ret &= sys::SystemManager::CreateService(profWritter, manager.get()); - ret &= sys::SystemManager::CreateService(profReader, manager.get()); - - testProf = - std::make_shared("appTestProfile", profWritter, profReader, testStart); - ret &= sys::SystemManager::CreateService(testProf, manager.get()); - - modeWritter = std::make_shared("writterMode"); - modeReader = std::make_shared("readerMode"); - - ret &= sys::SystemManager::CreateService(modeWritter, manager.get()); - ret &= sys::SystemManager::CreateService(modeReader, manager.get()); - - testMode = - std::make_shared("appTestMode", modeWritter, modeReader, testStart); - ret &= sys::SystemManager::CreateService(testMode, manager.get()); - - std::cout << "koniec start thr_id: " << std::this_thread::get_id() << std::endl << std::flush; - testStart->unlock(); - auto msgStart = std::make_shared(); - manager->bus.sendUnicast(std::move(msgStart), "appTest"); - - msgStart = std::make_shared(); - manager->bus.sendUnicast(std::move(msgStart), "appTestProfile"); - - msgStart = std::make_shared(); - manager->bus.sendUnicast(std::move(msgStart), "appTestMode"); - - return ret; - }); + manager->StartSystem( + nullptr, + [manager, + &varWritter, + &varReader, + &testVar, + &profWritter, + &profReader, + &testProf, + &modeWritter, + &modeReader, + &testMode, + &testStart]() { + // preliminary + testStart = std::make_shared(); + testStart->lock(); + std::cout << "start thr_id: " << std::this_thread::get_id() << std::endl << std::flush; + auto ret = sys::SystemManager::RunService(std::make_shared(service::name::evt_manager), + manager.get()); + ret &= sys::SystemManager::RunService(std::make_shared(), manager.get()); + + varWritter = std::make_shared("writterVar"); + varReader = std::make_shared("readerVar"); + + ret &= sys::SystemManager::RunService(varWritter, manager.get()); + ret &= sys::SystemManager::RunService(varReader, manager.get()); + + testVar = std::make_shared("appTest", varWritter, varReader, testStart); + ret &= sys::SystemManager::RunService(testVar, manager.get()); + + profWritter = std::make_shared("writterProf"); + profReader = std::make_shared("readerProf"); + + ret &= sys::SystemManager::RunService(profWritter, manager.get()); + ret &= sys::SystemManager::RunService(profReader, manager.get()); + + testProf = std::make_shared( + "appTestProfile", profWritter, profReader, testStart); + ret &= sys::SystemManager::RunService(testProf, manager.get()); + + modeWritter = std::make_shared("writterMode"); + modeReader = std::make_shared("readerMode"); + + ret &= sys::SystemManager::RunService(modeWritter, manager.get()); + ret &= sys::SystemManager::RunService(modeReader, manager.get()); + + testMode = + std::make_shared("appTestMode", modeWritter, modeReader, testStart); + ret &= sys::SystemManager::RunService(testMode, manager.get()); + + std::cout << "koniec start thr_id: " << std::this_thread::get_id() << std::endl << std::flush; + testStart->unlock(); + auto msgStart = std::make_shared(); + manager->bus.sendUnicast(std::move(msgStart), "appTest"); + + msgStart = std::make_shared(); + manager->bus.sendUnicast(std::move(msgStart), "appTestProfile"); + + msgStart = std::make_shared(); + manager->bus.sendUnicast(std::move(msgStart), "appTestMode"); + + return ret; + }); // start application cpp_freertos::Thread::StartScheduler(); diff --git a/module-services/service-desktop/service-desktop/ServiceDesktop.hpp b/module-services/service-desktop/service-desktop/ServiceDesktop.hpp index b78dc388c513ef694000bb7ed4271bd1ce4b48c8..f830fce4d5a709db721bf673a6f73197e3abf827 100644 --- a/module-services/service-desktop/service-desktop/ServiceDesktop.hpp +++ b/module-services/service-desktop/service-desktop/ServiceDesktop.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -13,10 +13,7 @@ #include "Constants.hpp" #include "WorkerDesktop.hpp" #include -#include -#include -#include -#include +#include namespace settings { @@ -50,3 +47,17 @@ class ServiceDesktop : public sys::Service private: std::unique_ptr settings; }; + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::service_desktop; + manifest.dependencies = {service::name::db}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-eink/ServiceEink.hpp b/module-services/service-eink/ServiceEink.hpp index b7e139f97ed247efd55c3eb3345095c5778e75a2..da416dd80b3c1694b5600a546959a115cbca60b9 100644 --- a/module-services/service-eink/ServiceEink.hpp +++ b/module-services/service-eink/ServiceEink.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -9,6 +9,9 @@ #include "EinkDisplay.hpp" +#include +#include + #include #include #include @@ -18,7 +21,7 @@ namespace service::eink class ServiceEink : public sys::Service { public: - explicit ServiceEink(const std::string &name, std::string parent = {}); + explicit ServiceEink(const std::string &name = service::name::eink, std::string parent = {}); sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *response) override; sys::ReturnCodes InitHandler() override; @@ -60,3 +63,17 @@ namespace service::eink */ }; } // namespace service::eink + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::eink; + manifest.dependencies = {service::name::db, service::name::gui}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-evtmgr/service-evtmgr/EventManager.hpp b/module-services/service-evtmgr/service-evtmgr/EventManager.hpp index b6e267496391d2ccce6cc6ad1d5118b79edf8caa..22b7b33d635e1d247b5f3a1824fb96c603532b0b 100644 --- a/module-services/service-evtmgr/service-evtmgr/EventManager.hpp +++ b/module-services/service-evtmgr/service-evtmgr/EventManager.hpp @@ -1,8 +1,10 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once +#include "Constants.hpp" + #include #include #include @@ -13,6 +15,8 @@ #include #include +#include + #include #include #include @@ -44,7 +48,7 @@ class EventManager : public sys::Service std::unique_ptr screenLightControl; public: - EventManager(const std::string &name); + EventManager(const std::string &name = service::name::evt_manager); ~EventManager(); sys::MessagePointer DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp) override; @@ -62,3 +66,17 @@ class EventManager : public sys::Service */ static bool messageSetApplication(sys::Service *sender, const std::string &applicationName); }; + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::evt_manager; + manifest.dependencies = {service::name::db}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-fileindexer/Constants.hpp b/module-services/service-fileindexer/Constants.hpp index dd79b1ab8fa31e2984bcfcf3edb0a3e83bacd578..6f64e44612db809a05596e92bbdcc4b733fe9615 100644 --- a/module-services/service-fileindexer/Constants.hpp +++ b/module-services/service-fileindexer/Constants.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -7,4 +7,4 @@ namespace service::name { inline constexpr std::string_view file_indexer = "FileIndexer"; -} // namespace service::name \ No newline at end of file +} // namespace service::name diff --git a/module-services/service-fileindexer/ServiceFileIndexer.hpp b/module-services/service-fileindexer/ServiceFileIndexer.hpp index ce518e980d7201a6bc9aab7294f5e2d3964dfebf..300ed4c755c04235bbc2af7ec45596015803750a 100644 --- a/module-services/service-fileindexer/ServiceFileIndexer.hpp +++ b/module-services/service-fileindexer/ServiceFileIndexer.hpp @@ -1,9 +1,11 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include + +#include "Constants.hpp" #include "StartupIndexer.hpp" namespace service @@ -12,7 +14,7 @@ namespace service class ServiceFileIndexer final : public sys::Service { public: - ServiceFileIndexer(const std::string_view name); + ServiceFileIndexer(const std::string_view name = service::name::file_indexer); virtual ~ServiceFileIndexer() = default; ServiceFileIndexer(const ServiceFileIndexer &) = delete; ServiceFileIndexer &operator=(const ServiceFileIndexer &) = delete; @@ -30,3 +32,16 @@ namespace service }; }; // namespace service + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::file_indexer; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-fota/FotaServiceAPI.cpp b/module-services/service-fota/FotaServiceAPI.cpp index f07903f45b6c3ef4f45208f05bfa3f6b6df27ed4..e40d4d8a7d8b7f1f3ba89dd719a4dd396a96040f 100644 --- a/module-services/service-fota/FotaServiceAPI.cpp +++ b/module-services/service-fota/FotaServiceAPI.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "service-fota/FotaMessages.hpp" @@ -19,21 +19,21 @@ namespace FotaService { LOG_DEBUG("FOTA - Internet Config called"); std::shared_ptr msg = std::make_shared(config); - return serv->bus.sendUnicast(std::move(msg), FotaService::Service::serviceName); + return serv->bus.sendUnicast(std::move(msg), service::name::fota); } bool API::Connect(sys::Service *serv) { LOG_DEBUG("FOTA - Internet connection called"); auto msg = std::make_shared(); - return serv->bus.sendUnicast(std::move(msg), FotaService::Service::serviceName); + return serv->bus.sendUnicast(std::move(msg), service::name::fota); } bool API::Disconnect(sys::Service *serv) { std::shared_ptr msg = std::make_shared(MessageType::FotaInternetDisconnect); - return serv->bus.sendUnicast(std::move(msg), FotaService::Service::serviceName); + return serv->bus.sendUnicast(std::move(msg), service::name::fota); } void API::HTTPGET(sys::Service *serv, const std::string &url) @@ -42,7 +42,7 @@ namespace FotaService std::shared_ptr msg = std::make_shared(); msg->url = url; msg->method = FotaService::HTTPMethod::GET; - serv->bus.sendUnicast(std::move(msg), FotaService::Service::serviceName); + serv->bus.sendUnicast(std::move(msg), service::name::fota); } void API::FotaStart(sys::Service *serv, const std::string &url) @@ -52,7 +52,7 @@ namespace FotaService msg->url = url; - serv->bus.sendUnicast(std::move(msg), FotaService::Service::serviceName); + serv->bus.sendUnicast(std::move(msg), service::name::fota); } void API::sendRawProgress(sys::Service *serv, const std::string &rawQind) @@ -60,7 +60,7 @@ namespace FotaService LOG_DEBUG("Fota sending Raw progress"); std::shared_ptr msg = std::make_shared(); msg->qindRaw = rawQind; - serv->bus.sendUnicast(std::move(msg), FotaService::Service::serviceName); + serv->bus.sendUnicast(std::move(msg), service::name::fota); } std::string APN::toString(APN::AuthMethod authMethod) diff --git a/module-services/service-fota/ServiceFota.cpp b/module-services/service-fota/ServiceFota.cpp index ed0e030a0dcfe8725f818d16c27975489dd1d22f..7b57b26cee8260efba9dd9f768da723cb56f5209 100644 --- a/module-services/service-fota/ServiceFota.cpp +++ b/module-services/service-fota/ServiceFota.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "service-fota/FotaMessages.hpp" @@ -34,15 +34,13 @@ namespace FotaService { - - const char *Service::serviceName = "ServiceFota"; const TickType_t defaultTimer = 1000; const uint32_t QIDEACTTimeout = 40000; const uint32_t QIACTTimeout = 150000; const char *httpErrorCode200 = "200"; const uint32_t httpErrorCodeValue200 = 200; - Service::Service() : sys::Service(serviceName) + Service::Service() : sys::Service(service::name::fota) { LOG_INFO("[ServiceFota] Initializing"); @@ -53,7 +51,7 @@ namespace FotaService connectionTimer->connect([&](sys::Timer &) { std::shared_ptr msg = std::make_shared(MessageType::CellularListCurrentCalls); - bus.sendUnicast(msg, Service::serviceName); + bus.sendUnicast(msg, service::name::fota); }); registerMessageHandlers(); } @@ -598,7 +596,7 @@ namespace FotaService std::shared_ptr responseMsg; LOG_DEBUG("%s: DataRecieve: bus:%d | message:%d", - serviceName, + service::name::fota, static_cast(msgl->channel), static_cast(msgl->messageType)); return (responseMsg ? responseMsg : std::make_shared()); diff --git a/module-services/service-fota/service-fota/ServiceFota.hpp b/module-services/service-fota/service-fota/ServiceFota.hpp index 4b47dad605327ff2cefeee55894907fb0ae0f542..76fd520e5cd3cecf73244fec255f2d4927b0bd2c 100644 --- a/module-services/service-fota/service-fota/ServiceFota.hpp +++ b/module-services/service-fota/service-fota/ServiceFota.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -13,6 +13,8 @@ #include #include +#include + #include #include #include @@ -26,6 +28,11 @@ namespace sys class Timer; } // namespace sys +namespace service::name +{ + constexpr inline auto fota = "ServiceFota"; +} // namespace service::name + namespace FotaService { @@ -60,8 +67,6 @@ namespace FotaService void registerMessageHandlers(); - static const char *serviceName; - private: /** Get access to data channel */ @@ -121,3 +126,17 @@ namespace FotaService }; } // namespace FotaService + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::fota; + manifest.dependencies = {service::name::db}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-gui/ServiceGUI.hpp b/module-services/service-gui/ServiceGUI.hpp index 9ae45645534235d401ff198c56df4410571c6506..8ee24afab632d5c2b11812d1bf51ed5cf5ec621f 100644 --- a/module-services/service-gui/ServiceGUI.hpp +++ b/module-services/service-gui/ServiceGUI.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -9,10 +9,13 @@ #include #include +#include + #include "messages/RenderingFinished.hpp" #include "ContextPool.hpp" #include "DrawCommandsQueue.hpp" +#include "Common.hpp" #include #include @@ -33,7 +36,7 @@ namespace service::gui friend WorkerGUI; public: - explicit ServiceGUI(const std::string &name, std::string parent = {}); + explicit ServiceGUI(const std::string &name = service::name::gui, std::string parent = {}); ~ServiceGUI() noexcept override; sys::ReturnCodes InitHandler() override; @@ -88,3 +91,17 @@ namespace service::gui State currentState; }; } // namespace service::gui + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::gui; + manifest.dependencies = {service::name::db}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-lwip/ServiceLwIP.cpp b/module-services/service-lwip/ServiceLwIP.cpp index 70ea79b6ac1616c053c5e3671d55710111f62772..a327419b90202d7feb8efb0fec3fda13343d89c6 100644 --- a/module-services/service-lwip/ServiceLwIP.cpp +++ b/module-services/service-lwip/ServiceLwIP.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "service-lwip/ServiceLwIP.hpp" @@ -51,9 +51,7 @@ sys::ReturnCodes message_lwip(sys::Service *app, LwIP_message::Request req) return ret.first; } -const char *ServiceLwIP::serviceName = "ServiceLwIP"; - -ServiceLwIP::ServiceLwIP() : sys::Service(serviceName) +ServiceLwIP::ServiceLwIP() : sys::Service(service::name::lwip) { LOG_INFO("[ServiceLwIP] Initializing"); tcpip_init(nullptr, nullptr); diff --git a/module-services/service-lwip/service-lwip/ServiceLwIP.hpp b/module-services/service-lwip/service-lwip/ServiceLwIP.hpp index 531807b1249ec74e61f773f56d68741f794499a8..729e2ef7c6a8135165d82c14dc5d55e4766cbe7e 100644 --- a/module-services/service-lwip/service-lwip/ServiceLwIP.hpp +++ b/module-services/service-lwip/service-lwip/ServiceLwIP.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -8,8 +8,15 @@ #include #include +#include + #include +namespace service::name +{ + constexpr inline auto lwip = "ServiceLwIP"; +} // namespace service::name + class LwIP_message : public sys::DataMessage { public: @@ -36,7 +43,18 @@ class ServiceLwIP : public sys::Service sys::ReturnCodes InitHandler() override; sys::ReturnCodes DeinitHandler() override; virtual sys::ReturnCodes SwitchPowerModeHandler(const sys::ServicePowerMode mode) override; - - private: - static const char *serviceName; }; + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::lwip; + manifest.dependencies = {service::name::db}; + return manifest; + } + }; +} // namespace sys diff --git a/module-services/service-time/ServiceTime.hpp b/module-services/service-time/ServiceTime.hpp index 0af6f1cc11301d99a1eeb03e8449e55860c1ec3d..1e2981eb0c7afe3c60cf5c98666910ea442b2bd8 100644 --- a/module-services/service-time/ServiceTime.hpp +++ b/module-services/service-time/ServiceTime.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -6,6 +6,8 @@ #include "service-time/CalendarTimeEvents.hpp" #include "service-time/ServiceTime.hpp" +#include + #include #include #include @@ -41,3 +43,17 @@ namespace stm }; } /* namespace stm */ + +namespace sys +{ + template <> struct ManifestTraits + { + static auto GetManifest() -> ServiceManifest + { + ServiceManifest manifest; + manifest.name = service::name::service_time; + manifest.dependencies = {service::name::db}; + return manifest; + } + }; +} // namespace sys diff --git a/module-sys/CMakeLists.txt b/module-sys/CMakeLists.txt index 91e3e903428da50d42890071470be94178409e3e..ee5be4718d55e85024c6d7550c9350954fa11921 100644 --- a/module-sys/CMakeLists.txt +++ b/module-sys/CMakeLists.txt @@ -14,9 +14,11 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Service/Service.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Service/Timer.cpp ${CMAKE_CURRENT_SOURCE_DIR}/SystemManager/SystemManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/SystemManager/DependencyGraph.cpp ${CMAKE_CURRENT_SOURCE_DIR}/SystemManager/PowerManager.cpp ${CMAKE_CURRENT_SOURCE_DIR}/SystemManager/CpuStatistics.cpp ${CMAKE_CURRENT_SOURCE_DIR}/SystemManager/DeviceManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/SystemManager/graph/TopologicalSort.cpp ) @@ -67,3 +69,6 @@ target_include_directories(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR} ) +if (${ENABLE_TESTS}) + add_subdirectory(SystemManager/tests) +endif() diff --git a/module-sys/Service/Service.hpp b/module-sys/Service/Service.hpp index c764c042120b650d18c83544d38808c3c14ae113..70192657cd0120bc4ab4a125411203bd6183e208 100644 --- a/module-sys/Service/Service.hpp +++ b/module-sys/Service/Service.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once @@ -7,6 +7,7 @@ #include "Common.hpp" // for ReturnCodes, ServicePriority, BusChannels #include "Mailbox.hpp" // for Mailbox #include "Message.hpp" // for MessagePointer +#include "ServiceManifest.hpp" #include "thread.hpp" // for Thread #include // for find, max #include // for uint32_t, uint64_t diff --git a/module-sys/Service/ServiceCreator.hpp b/module-sys/Service/ServiceCreator.hpp new file mode 100644 index 0000000000000000000000000000000000000000..af37808864c10d79565f2cc3ad34bbed8e37c19b --- /dev/null +++ b/module-sys/Service/ServiceCreator.hpp @@ -0,0 +1,57 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include "ServiceManifest.hpp" + +#include + +namespace sys +{ + class Service; + + class BaseServiceCreator + { + public: + explicit BaseServiceCreator(ServiceManifest &&manifest) noexcept : manifest{std::move(manifest)} + {} + virtual ~BaseServiceCreator() noexcept = default; + + [[nodiscard]] virtual std::shared_ptr create() const = 0; + + [[nodiscard]] auto getName() const noexcept -> const ServiceManifest::ServiceName & + { + return manifest.name; + } + + [[nodiscard]] auto getDependencies() const noexcept -> const std::vector & + { + return manifest.dependencies; + } + + [[nodiscard]] auto getStartTimeout() const noexcept -> ServiceManifest::Timeout + { + return manifest.timeout; + } + + private: + ServiceManifest manifest; + }; + + template class ServiceCreator : public BaseServiceCreator + { + public: + using BaseServiceCreator::BaseServiceCreator; + + [[nodiscard]] auto create() const -> std::shared_ptr override + { + return std::make_shared(); + } + }; + + template std::unique_ptr CreatorFor() noexcept + { + return std::make_unique>(ManifestOf()); + } +} // namespace sys diff --git a/module-sys/Service/ServiceManifest.hpp b/module-sys/Service/ServiceManifest.hpp new file mode 100644 index 0000000000000000000000000000000000000000..eaffb784f0fd366820899b1f0d0160d32a8c9407 --- /dev/null +++ b/module-sys/Service/ServiceManifest.hpp @@ -0,0 +1,45 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include +#include + +namespace sys +{ + class Service; // Forward declaration + + struct ServiceManifest + { + using ServiceName = std::string; + using Timeout = std::chrono::milliseconds; + static constexpr auto DefaultTimeout = Timeout{5000}; + + std::vector dependencies; + ServiceName name; + Timeout timeout = DefaultTimeout; + }; + + /// Type traits pattern used to enforce user-defined types to implement "GetManifest" function. + template struct ManifestTraits; + + template struct HasManifest : std::false_type + {}; + + /// Checks whether T implements "GetManifest" static method. + /// Provides the member constant "value" that is equal to true if T implements "GetManifest" static method. + /// Otherwise, "value" is equal to false. + template + struct HasManifest::GetManifest)>> + : std::is_same::GetManifest())> + {}; + + /// Retrieves the manifest of T, if T implements ManifestTraits. + /// Otherwise, reports an error during compile time. + template ::value, int> = 0> auto ManifestOf() -> ServiceManifest + { + return ManifestTraits::GetManifest(); + } +} // namespace sys diff --git a/module-sys/SystemManager/DependencyGraph.cpp b/module-sys/SystemManager/DependencyGraph.cpp new file mode 100644 index 0000000000000000000000000000000000000000..eb7954942b1418f858c0ddd58d1ee60d773d8381 --- /dev/null +++ b/module-sys/SystemManager/DependencyGraph.cpp @@ -0,0 +1,32 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "DependencyGraph.hpp" + +#include +#include + +namespace sys +{ + namespace graph + { + Nodes nodesFrom(const std::vector> &services) + { + Nodes nodes; + nodes.reserve(services.size()); + std::transform(services.begin(), services.end(), std::back_inserter(nodes), [](const auto &service) { + return std::ref(*service); + }); + return nodes; + } + } // namespace graph + + DependencyGraph::DependencyGraph(graph::Nodes nodes, std::unique_ptr &&strategy) + : nodes{std::move(nodes)}, strategy{std::move(strategy)} + {} + + auto DependencyGraph::sort() const -> graph::Nodes + { + return strategy->sort(nodes); + } +} // namespace sys diff --git a/module-sys/SystemManager/DependencyGraph.hpp b/module-sys/SystemManager/DependencyGraph.hpp new file mode 100644 index 0000000000000000000000000000000000000000..70165cf931238bb18035be8ab8a65a4d2cee002d --- /dev/null +++ b/module-sys/SystemManager/DependencyGraph.hpp @@ -0,0 +1,42 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include "Service/ServiceCreator.hpp" + +#include +#include + +namespace sys +{ + class BaseServiceCreator; // Forward declaration + + namespace graph + { + using Node = std::reference_wrapper; + using Nodes = std::vector; + + Nodes nodesFrom(const std::vector> &services); + } // namespace graph + + class DependencySortingStrategy + { + public: + virtual ~DependencySortingStrategy() noexcept = default; + + [[nodiscard]] virtual auto sort(const graph::Nodes &nodes) -> graph::Nodes = 0; + }; + + class DependencyGraph + { + public: + DependencyGraph(graph::Nodes nodes, std::unique_ptr &&strategy); + + [[nodiscard]] auto sort() const -> graph::Nodes; + + private: + graph::Nodes nodes; + std::unique_ptr strategy; + }; +} // namespace sys diff --git a/module-sys/SystemManager/SystemManager.cpp b/module-sys/SystemManager/SystemManager.cpp index c7cbc0f1a89268d04be7b707480e3f748945f9cd..3b95dc1348ac9d1eba37236622c51cc49fdd4a50 100644 --- a/module-sys/SystemManager/SystemManager.cpp +++ b/module-sys/SystemManager/SystemManager.cpp @@ -3,6 +3,9 @@ #include "SystemManager.hpp" +#include "DependencyGraph.hpp" +#include "graph/TopologicalSort.hpp" + #include #include "thread.hpp" #include "ticks.hpp" @@ -18,6 +21,7 @@ #include #include "messages/CpuFrequencyMessage.hpp" #include "messages/DeviceRegistrationMessage.hpp" +#include