From 4bf8623d4061d212b4ea090a4f2ad9db4aa744a0 Mon Sep 17 00:00:00 2001 From: Maciej Janicki Date: Wed, 11 Aug 2021 15:54:44 +0200 Subject: [PATCH] [BH-685] Add alarm handler factory This commit adds factory for alarm handlers with basic handlers draft for Bell. --- .../service-alarm/AlarmHandlerFactory.cpp | 25 ++++++++++++++ module-services/service-alarm/CMakeLists.txt | 12 ++++--- .../include/service-alarm/AlarmHandler.hpp | 25 ++++++++++++++ .../service-alarm/AlarmHandlerFactory.hpp | 27 +++++++++++++++ .../include/service-alarm/AlarmServiceAPI.hpp | 2 -- .../service-alarm/tests/CMakeLists.txt | 11 +++++++ .../service-alarm/tests/MockAlarmHandler.hpp | 20 +++++++++++ .../tests/tests-AlarmHandlerFactory.cpp | 30 +++++++++++++++++ .../service-alarm/tests/tests-main.cpp | 5 +++ products/BellHybrid/CMakeLists.txt | 1 + .../BellHybrid/alarms/AlarmHandlerActions.cpp | 28 ++++++++++++++++ .../BellHybrid/alarms/BellAlarmHandler.cpp | 33 +++++++++++++++++++ products/BellHybrid/alarms/CMakeLists.txt | 21 ++++++++++++ .../alarms/include/AlarmHandlerActions.hpp | 15 +++++++++ .../alarms/include/BellAlarmHandler.hpp | 22 +++++++++++++ 15 files changed, 271 insertions(+), 6 deletions(-) create mode 100644 module-services/service-alarm/AlarmHandlerFactory.cpp create mode 100644 module-services/service-alarm/include/service-alarm/AlarmHandler.hpp create mode 100644 module-services/service-alarm/include/service-alarm/AlarmHandlerFactory.hpp create mode 100644 module-services/service-alarm/tests/CMakeLists.txt create mode 100644 module-services/service-alarm/tests/MockAlarmHandler.hpp create mode 100644 module-services/service-alarm/tests/tests-AlarmHandlerFactory.cpp create mode 100644 module-services/service-alarm/tests/tests-main.cpp create mode 100644 products/BellHybrid/alarms/AlarmHandlerActions.cpp create mode 100644 products/BellHybrid/alarms/BellAlarmHandler.cpp create mode 100644 products/BellHybrid/alarms/CMakeLists.txt create mode 100644 products/BellHybrid/alarms/include/AlarmHandlerActions.hpp create mode 100644 products/BellHybrid/alarms/include/BellAlarmHandler.hpp diff --git a/module-services/service-alarm/AlarmHandlerFactory.cpp b/module-services/service-alarm/AlarmHandlerFactory.cpp new file mode 100644 index 0000000000000000000000000000000000000000..129a989fee54758029dbfc6042b21b722c4ce8b0 --- /dev/null +++ b/module-services/service-alarm/AlarmHandlerFactory.cpp @@ -0,0 +1,25 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include +#include + +#include "include/service-alarm/AlarmHandler.hpp" +#include "include/service-alarm/AlarmHandlerFactory.hpp" + +namespace alarms +{ + [[nodiscard]] auto AlarmHandlerFactory::getHandler(const AlarmType type) -> const std::shared_ptr + { + if (handlers.count(type) != 0u) { + return handlers.at(type); + } + LOG_ERROR("no such alarm type handler defined: %d", static_cast(type)); + return nullptr; + } + + auto AlarmHandlerFactory::addHandler(const AlarmType type, const std::shared_ptr handler) -> void + { + handlers.insert({type, handler}); + } +} // namespace alarms diff --git a/module-services/service-alarm/CMakeLists.txt b/module-services/service-alarm/CMakeLists.txt index ce95b808c0cb63b83856530450d376347a983d75..0c79455443d870b2076dc601ef911c1f614a4c14 100644 --- a/module-services/service-alarm/CMakeLists.txt +++ b/module-services/service-alarm/CMakeLists.txt @@ -8,18 +8,18 @@ target_sources(service-alarm PUBLIC include/service-alarm/AlarmMessage.hpp include/service-alarm/AlarmServiceAPI.hpp + include/service-alarm/AlarmHandler.hpp + include/service-alarm/AlarmHandlerFactory.hpp PRIVATE AlarmRepository.hpp + AlarmHandlerFactory.cpp ) target_include_directories(service-alarm PUBLIC $ PRIVATE - $ + $ ) target_link_libraries(service-alarm @@ -30,3 +30,7 @@ target_link_libraries(service-alarm messagetype module-sys ) + +if (${ENABLE_TESTS}) + add_subdirectory(tests) +endif () diff --git a/module-services/service-alarm/include/service-alarm/AlarmHandler.hpp b/module-services/service-alarm/include/service-alarm/AlarmHandler.hpp new file mode 100644 index 0000000000000000000000000000000000000000..6b53acfd9406214cf8feee501b55b8409d86fa3a --- /dev/null +++ b/module-services/service-alarm/include/service-alarm/AlarmHandler.hpp @@ -0,0 +1,25 @@ +// 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 + +namespace alarms +{ + enum class AlarmType + { + Clock, + Calendar, + EveningReminder, + None + }; + + class AlarmHandler + { + public: + virtual ~AlarmHandler() = default; + + virtual auto handle(const AlarmEventRecord &record) -> bool = 0; + }; +} // namespace alarms diff --git a/module-services/service-alarm/include/service-alarm/AlarmHandlerFactory.hpp b/module-services/service-alarm/include/service-alarm/AlarmHandlerFactory.hpp new file mode 100644 index 0000000000000000000000000000000000000000..95e54ccf29eeef8ea110fa2208b6b1afa2f6278b --- /dev/null +++ b/module-services/service-alarm/include/service-alarm/AlarmHandlerFactory.hpp @@ -0,0 +1,27 @@ +// 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 "AlarmHandler.hpp" + +#include + +#include + +namespace alarms +{ + class AlarmHandlerFactory + { + private: + std::map> handlers; + + public: + AlarmHandlerFactory() = default; + explicit AlarmHandlerFactory(const std::map> handlers) + : handlers{handlers} {}; + + [[nodiscard]] auto getHandler(const AlarmType type) -> const std::shared_ptr; + auto addHandler(const AlarmType type, const std::shared_ptr) -> void; + }; +} // namespace alarms diff --git a/module-services/service-alarm/include/service-alarm/AlarmServiceAPI.hpp b/module-services/service-alarm/include/service-alarm/AlarmServiceAPI.hpp index 9c6e4859299b1872a5f4c6046b5229c8c199d011..f6553502cb04bc79d27f83c31fa4766d52d4fa8f 100644 --- a/module-services/service-alarm/include/service-alarm/AlarmServiceAPI.hpp +++ b/module-services/service-alarm/include/service-alarm/AlarmServiceAPI.hpp @@ -1,5 +1,3 @@ -#pragma once - // Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md diff --git a/module-services/service-alarm/tests/CMakeLists.txt b/module-services/service-alarm/tests/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..48dad8a81c09210459dfc88b797e67b13a1206aa --- /dev/null +++ b/module-services/service-alarm/tests/CMakeLists.txt @@ -0,0 +1,11 @@ +add_catch2_executable( + NAME + service-alarm-tests + SRCS + tests-main.cpp + tests-AlarmHandlerFactory.cpp + MockAlarmHandler.hpp + LIBS + service-alarm + module-db +) diff --git a/module-services/service-alarm/tests/MockAlarmHandler.hpp b/module-services/service-alarm/tests/MockAlarmHandler.hpp new file mode 100644 index 0000000000000000000000000000000000000000..54c22ed4504e63795620b26e68b5e439c09f3030 --- /dev/null +++ b/module-services/service-alarm/tests/MockAlarmHandler.hpp @@ -0,0 +1,20 @@ +// 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 + +namespace alarms +{ + + class MockAlarmHandler : public AlarmHandler + { + public: + auto handle(const AlarmEventRecord &record) -> bool + { + LOG_DEBUG("MockAlarmHandler"); + return true; + } + }; +} // namespace alarms diff --git a/module-services/service-alarm/tests/tests-AlarmHandlerFactory.cpp b/module-services/service-alarm/tests/tests-AlarmHandlerFactory.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ed09265ff8caeb26caebab031a4e0b9786467946 --- /dev/null +++ b/module-services/service-alarm/tests/tests-AlarmHandlerFactory.cpp @@ -0,0 +1,30 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "MockAlarmHandler.hpp" + +#include + +#include + +TEST_CASE("AlarmHandlerFactory Tests") +{ + using namespace alarms; + + SECTION("Create AlarmHandlerFactory") + { + AlarmHandlerFactory alarmHandlerFactory; + REQUIRE(alarmHandlerFactory.getHandler(AlarmType::Clock) == nullptr); + } + + SECTION("Add/get handler") + { + AlarmHandlerFactory alarmHandlerFactory; + auto handler = std::make_shared(); + alarmHandlerFactory.addHandler(AlarmType::Clock, handler); + + REQUIRE(alarmHandlerFactory.getHandler(AlarmType::Clock) != nullptr); + REQUIRE(alarmHandlerFactory.getHandler(AlarmType::Clock) == handler); + REQUIRE(alarmHandlerFactory.getHandler(AlarmType::Calendar) == nullptr); + } +} diff --git a/module-services/service-alarm/tests/tests-main.cpp b/module-services/service-alarm/tests/tests-main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8a6ad34dd8ce49475f75635a46116fd419dafda9 --- /dev/null +++ b/module-services/service-alarm/tests/tests-main.cpp @@ -0,0 +1,5 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file +#include diff --git a/products/BellHybrid/CMakeLists.txt b/products/BellHybrid/CMakeLists.txt index 94799f6e2c658d5fefe84485368f07a0762c02db..3a6289ddc47e784fec84fd7b9eb7a22a7dddd9d4 100644 --- a/products/BellHybrid/CMakeLists.txt +++ b/products/BellHybrid/CMakeLists.txt @@ -84,3 +84,4 @@ add_standalone_image(BellHybrid) add_update_package(BellHybrid) add_subdirectory(services) +add_subdirectory(alarms) diff --git a/products/BellHybrid/alarms/AlarmHandlerActions.cpp b/products/BellHybrid/alarms/AlarmHandlerActions.cpp new file mode 100644 index 0000000000000000000000000000000000000000..85293fa9ef97867b8730339a8310e9bf30b5bef2 --- /dev/null +++ b/products/BellHybrid/alarms/AlarmHandlerActions.cpp @@ -0,0 +1,28 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "AlarmHandlerActions.hpp" + +#include + +namespace alarms +{ + + auto playAlarmSound(const std::string &soundPath) -> bool + { + // playAlarmSound after it will be implemented [BH-660] + return true; + } + + auto displayAlarmPopup() -> bool + { + // displayAlarmPopup after it will be implemented [BH-566] + return true; + } + + auto turnOnFrontlight() -> bool + { + // turnOnFrontlight after it will be implemented [BH-756] + return true; + } +} // namespace alarms diff --git a/products/BellHybrid/alarms/BellAlarmHandler.cpp b/products/BellHybrid/alarms/BellAlarmHandler.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cec4178390bed669057deefd5ff046d22ab587df --- /dev/null +++ b/products/BellHybrid/alarms/BellAlarmHandler.cpp @@ -0,0 +1,33 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include +#include + +namespace alarms +{ + + auto BellAlarmClockHandler::handle(const AlarmEventRecord &record) -> bool + { + LOG_DEBUG("BellAlarmClockHandler"); + + auto result = false; + + if (record.enabled) { + result = playAlarmSound(record.musicTone); + result = turnOnFrontlight(); + result = displayAlarmPopup(); + return result; + } + + return result; + } + + auto EveningReminderHandler::handle(const AlarmEventRecord &record) -> bool + { + LOG_DEBUG("EveningReminderHandler"); + // implement this alarm type handling here + return true; + } + +} // namespace alarms diff --git a/products/BellHybrid/alarms/CMakeLists.txt b/products/BellHybrid/alarms/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..ac091509b9afbba66ff8444d85d435b849eb86d2 --- /dev/null +++ b/products/BellHybrid/alarms/CMakeLists.txt @@ -0,0 +1,21 @@ +add_library(alarms STATIC) + +target_sources(alarms + PRIVATE + BellAlarmHandler.cpp + AlarmHandlerActions.cpp +) + +target_include_directories(alarms + PRIVATE + include + + PUBLIC + $ +) + +target_link_libraries(alarms + PUBLIC + module-db + service-alarm +) diff --git a/products/BellHybrid/alarms/include/AlarmHandlerActions.hpp b/products/BellHybrid/alarms/include/AlarmHandlerActions.hpp new file mode 100644 index 0000000000000000000000000000000000000000..1ca05dd004713927981d6f958e493c0a7634a29a --- /dev/null +++ b/products/BellHybrid/alarms/include/AlarmHandlerActions.hpp @@ -0,0 +1,15 @@ +// 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 + +namespace alarms +{ + + auto playAlarmSound(const std::string &soundPath) -> bool; + auto displayAlarmPopup() -> bool; + auto turnOnFrontlight() -> bool; + +} // namespace alarms diff --git a/products/BellHybrid/alarms/include/BellAlarmHandler.hpp b/products/BellHybrid/alarms/include/BellAlarmHandler.hpp new file mode 100644 index 0000000000000000000000000000000000000000..9e13429dde6945213f5c19fdaa861e65132da90a --- /dev/null +++ b/products/BellHybrid/alarms/include/BellAlarmHandler.hpp @@ -0,0 +1,22 @@ +// 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 + +namespace alarms +{ + + class BellAlarmClockHandler : public AlarmHandler + { + public: + auto handle(const AlarmEventRecord &record) -> bool; + }; + + class EveningReminderHandler : public AlarmHandler + { + public: + auto handle(const AlarmEventRecord &record) -> bool; + }; +} // namespace alarms