diff --git a/module-apps/ApplicationLauncher.hpp b/module-apps/ApplicationLauncher.hpp index 5bebf306b..d2c1cf076 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 636baa6bc..18b60374a 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 c6f59cea8..7024a685f 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 665a7786f..0ac50bc22 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 da8044bc6..d0721cb5f 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 500960e9f..5997dfcfa 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 100f20f46..4717759a7 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 e3a752f90..d3e5f12fd 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 654f0bbf2..2d705cb59 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 226c9790f..8917f3fc2 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 6da6d5ece..45091b3ec 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 b7f2ab7a5..72abcbd9a 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 983d471f3..459a56bb6 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 9a162731c..ea4157a57 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 000000000..f63ccdc58 --- /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 d54c73c32..1371a73a1 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 e9e07b9dc..c0768d0cf 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 ed547b2d6..5783f627f 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 f2230a70c..0c03d758d 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 071db535b..6f4cb729b 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 58598998a..7c9d880d4 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()); + 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"); + varWritter = std::make_shared("writterVar"); + varReader = std::make_shared("readerVar"); - ret &= sys::SystemManager::CreateService(varWritter, manager.get()); - ret &= sys::SystemManager::CreateService(varReader, manager.get()); + 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::CreateService(testVar, 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"); + profWritter = std::make_shared("writterProf"); + profReader = std::make_shared("readerProf"); - ret &= sys::SystemManager::CreateService(profWritter, manager.get()); - ret &= sys::SystemManager::CreateService(profReader, manager.get()); + 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::CreateService(testProf, 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"); + modeWritter = std::make_shared("writterMode"); + modeReader = std::make_shared("readerMode"); - ret &= sys::SystemManager::CreateService(modeWritter, manager.get()); - ret &= sys::SystemManager::CreateService(modeReader, manager.get()); + 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::CreateService(testMode, 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"); + 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), "appTestProfile"); - msgStart = std::make_shared(); - manager->bus.sendUnicast(std::move(msgStart), "appTestMode"); + msgStart = std::make_shared(); + manager->bus.sendUnicast(std::move(msgStart), "appTestMode"); - return ret; - }); + 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 b78dc388c..f830fce4d 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 b7e139f97..da416dd80 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 b6e267496..22b7b33d6 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 dd79b1ab8..6f64e4461 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 ce518e980..300ed4c75 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 f07903f45..e40d4d8a7 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 ed0e030a0..7b57b26ce 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 4b47dad60..76fd520e5 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 9ae456455..8ee24afab 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 70ea79b6a..a327419b9 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 531807b12..729e2ef7c 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 0af6f1cc1..1e2981eb0 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 91e3e9034..ee5be4718 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 c764c0421..70192657c 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 000000000..af3780886 --- /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 000000000..eaffb784f --- /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 000000000..eb7954942 --- /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 000000000..70165cf93 --- /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 c7cbc0f1a..3b95dc134 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