~aleteoryx/muditaos

b8055d3eb0a0d0c8a3aa4893e79cd250003cb55d — Paweł Joński 4 years ago ad3f0f8
[BH-1124] Alarm changes outside homescreen

Alaram changes outside homescreen
M module-services/service-time/AlarmMessageHandler.cpp => module-services/service-time/AlarmMessageHandler.cpp +12 -0
@@ 30,6 30,18 @@ namespace alarms
            });
    }

    auto AlarmMessageHandler::handleGetAlarmWithStatus(AlarmGetWithStatusRequestMessage *request)
        -> std::shared_ptr<AlarmGetWithStatusResponseMessage>
    {
        return handleWithCallback<AlarmGetWithStatusRequestMessage,
                                  AlarmGetWithStatusResponseMessage,
                                  std::pair<AlarmEventRecord, AlarmStatus>>(
            request,
            [&](AlarmGetWithStatusRequestMessage *request, IAlarmOperations::OnGetAlarmWithStatusProcessed callback) {
                alarmOperations->getAlarmWithStatus(request->id, callback);
            });
    }

    auto AlarmMessageHandler::handleAddAlarm(AlarmAddRequestMessage *request)
        -> std::shared_ptr<AlarmAddResponseMessage>
    {

M module-services/service-time/AlarmMessageHandler.hpp => module-services/service-time/AlarmMessageHandler.hpp +2 -0
@@ 23,6 23,8 @@ namespace alarms

        auto handleTimeUpdate(TimePoint time) -> void;
        auto handleGetAlarm(AlarmGetRequestMessage *request) -> std::shared_ptr<AlarmGetResponseMessage>;
        auto handleGetAlarmWithStatus(AlarmGetWithStatusRequestMessage *request)
            -> std::shared_ptr<AlarmGetWithStatusResponseMessage>;
        auto handleAddAlarm(AlarmAddRequestMessage *request) -> std::shared_ptr<AlarmAddResponseMessage>;
        auto handleUpdateAlarm(AlarmUpdateRequestMessage *request) -> std::shared_ptr<AlarmUpdateResponseMessage>;
        auto handleRemoveAlarm(AlarmRemoveRequestMessage *request) -> std::shared_ptr<AlarmRemoveResponseMessage>;

M module-services/service-time/AlarmOperations.cpp => module-services/service-time/AlarmOperations.cpp +53 -27
@@ 41,6 41,38 @@ namespace alarms
        alarmEventsRepo->getAlarmEvent(alarmId, repoCallback);
    }

    void AlarmOperationsCommon::getAlarmWithStatus(const std::uint32_t alarmId, OnGetAlarmWithStatusProcessed callback)
    {
        OnGetAlarmEventCallback repoCallback = [this, callback](AlarmEventRecord record) {
            // Check if snoozed
            auto foundSnoozed = findSnoozedEventById(snoozedSingleEvents, record.ID);
            if (foundSnoozed != snoozedSingleEvents.end()) {
                callback(std::pair<AlarmEventRecord, AlarmStatus>(record, AlarmStatus::Snoozed));
                return;
            }

            // Check if ringing or queued
            auto foundOngoing = findSingleEventById(ongoingSingleEvents, record.ID);
            if (foundOngoing != ongoingSingleEvents.end()) {
                if (foundOngoing == ongoingSingleEvents.begin()) {
                    callback(std::pair<AlarmEventRecord, AlarmStatus>(record, AlarmStatus::Ringing));
                }
                else {
                    callback(std::pair<AlarmEventRecord, AlarmStatus>(record, AlarmStatus::Queued));
                }
                return;
            }

            if (record.enabled) {
                callback(std::pair<AlarmEventRecord, AlarmStatus>(record, AlarmStatus::Activated));
            }
            else {
                callback(std::pair<AlarmEventRecord, AlarmStatus>(record, AlarmStatus::Deactivated));
            }
        };
        alarmEventsRepo->getAlarmEvent(alarmId, repoCallback);
    }

    void AlarmOperationsCommon::addAlarm(AlarmEventRecord record, OnAddAlarmProcessed callback)
    {
        OnAddAlarmEventCallback repoCallback = [&, callback, record](bool success) mutable {


@@ 53,12 85,7 @@ namespace alarms
    void AlarmOperationsCommon::updateAlarm(AlarmEventRecord record, OnUpdateAlarmProcessed callback)
    {
        OnUpdateAlarmEventCallback repoCallback = [&, callback, record](bool success) mutable {
            auto found = std::find_if(nextSingleEvents.begin(),
                                      nextSingleEvents.end(),
                                      [recordId = record.ID](const std::unique_ptr<SingleEventRecord> &e) {
                                          return e->parent->ID == recordId;
                                      });

            auto found = findSingleEventById(nextSingleEvents, record.ID);
            if (found != std::end(nextSingleEvents)) {
                updateEventsCache(getCurrentTime());
            }


@@ 73,11 100,7 @@ namespace alarms
    void AlarmOperationsCommon::removeAlarm(const std::uint32_t alarmId, OnRemoveAlarmProcessed callback)
    {
        OnRemoveAlarmEventCallback repoCallback = [&, callback, alarmId](bool success) {
            auto found = std::find_if(
                nextSingleEvents.begin(),
                nextSingleEvents.end(),
                [alarmId](const std::unique_ptr<SingleEventRecord> &e) { return e->parent->ID == alarmId; });

            auto found = findSingleEventById(nextSingleEvents, alarmId);
            if (found != std::end(nextSingleEvents) && nextSingleEvents.size() == 1) {
                updateEventsCache(getCurrentTime());
            }


@@ 105,10 128,7 @@ namespace alarms

    void AlarmOperationsCommon::turnOffRingingAlarm(const std::uint32_t id, OnTurnOffRingingAlarm callback)
    {
        auto found =
            std::find_if(ongoingSingleEvents.begin(),
                         ongoingSingleEvents.end(),
                         [id](const std::unique_ptr<SingleEventRecord> &event) { return id == event->parent->ID; });
        auto found = findSingleEventById(ongoingSingleEvents, id);
        if (found == ongoingSingleEvents.end()) {
            LOG_ERROR("Trying to turn off nonexisting event");
            callback(false);


@@ 122,10 142,7 @@ namespace alarms

    void AlarmOperationsCommon::turnOffSnoozedAlarm(const std::uint32_t id, OnTurnOffRingingAlarm callback)
    {
        auto found = std::find_if(
            snoozedSingleEvents.begin(),
            snoozedSingleEvents.end(),
            [id](const std::unique_ptr<SnoozedAlarmEventRecord> &event) { return id == event->parent->ID; });
        auto found = findSnoozedEventById(snoozedSingleEvents, id);
        if (found == snoozedSingleEvents.end()) {
            LOG_ERROR("Trying to turn off nonexisting event");
            callback(false);


@@ 141,10 158,7 @@ namespace alarms
                                                   const TimePoint nextAlarmTime,
                                                   OnSnoozeRingingAlarm callback)
    {
        auto found =
            std::find_if(ongoingSingleEvents.begin(),
                         ongoingSingleEvents.end(),
                         [id](const std::unique_ptr<SingleEventRecord> &event) { return id == event->parent->ID; });
        auto found = findSingleEventById(ongoingSingleEvents, id);
        if (found == ongoingSingleEvents.end()) {
            LOG_ERROR("Trying to snooze nonexisting event");
            callback(false);


@@ 189,10 203,7 @@ namespace alarms
                                               const TimePoint nextAlarmTime,
                                               OnSnoozeRingingAlarm callback)
    {
        auto found = std::find_if(
            snoozedSingleEvents.begin(),
            snoozedSingleEvents.end(),
            [id](const std::unique_ptr<SnoozedAlarmEventRecord> &event) { return id == event->parent->ID; });
        auto found = findSnoozedEventById(snoozedSingleEvents, id);
        if (found == snoozedSingleEvents.end()) {
            LOG_ERROR("Trying to postpone nonexisting snooze");
            callback(false);


@@ 409,4 420,19 @@ namespace alarms
        }
        callback(std::move(snoozedEvents));
    }

    auto findSingleEventById(std::vector<std::unique_ptr<SingleEventRecord>> &events, const std::uint32_t id)
        -> std::vector<std::unique_ptr<SingleEventRecord>>::iterator
    {
        return std::find_if(events.begin(), events.end(), [id](const std::unique_ptr<SingleEventRecord> &event) {
            return id == event->parent->ID;
        });
    }
    auto findSnoozedEventById(std::vector<std::unique_ptr<SnoozedAlarmEventRecord>> &events, const std::uint32_t id)
        -> std::vector<std::unique_ptr<SnoozedAlarmEventRecord>>::iterator
    {
        return std::find_if(events.begin(), events.end(), [id](const std::unique_ptr<SnoozedAlarmEventRecord> &event) {
            return id == event->parent->ID;
        });
    }
} // namespace alarms

M module-services/service-time/AlarmOperations.hpp => module-services/service-time/AlarmOperations.hpp +9 -0
@@ 7,6 7,7 @@
#include "SnoozedAlarmEventRecord.hpp"

#include <service-time/AlarmHandlerFactory.hpp>
#include <service-time/AlarmStatus.hpp>

#include <module-db/Interface/AlarmEventRecord.hpp>



@@ 18,6 19,7 @@ namespace alarms
    {
      public:
        using OnGetAlarmProcessed           = std::function<void(AlarmEventRecord)>;
        using OnGetAlarmWithStatusProcessed = std::function<void(std::pair<AlarmEventRecord, AlarmStatus>)>;
        using OnGetAlarmsInRangeProcessed   = std::function<void(std::pair<std::vector<AlarmEventRecord>, uint32_t>)>;
        using OnAddAlarmProcessed           = std::function<void(bool)>;
        using OnUpdateAlarmProcessed        = std::function<void(bool)>;


@@ 38,6 40,7 @@ namespace alarms
        virtual void updateEventsCache(TimePoint now) = 0;

        virtual void getAlarm(const std::uint32_t alarmId, OnGetAlarmProcessed callback)              = 0;
        virtual void getAlarmWithStatus(const std::uint32_t alarmId, OnGetAlarmWithStatusProcessed callback) = 0;
        virtual void addAlarm(AlarmEventRecord record, OnAddAlarmProcessed callback)                  = 0;
        virtual void updateAlarm(AlarmEventRecord record, OnUpdateAlarmProcessed callback)            = 0;
        virtual void removeAlarm(const std::uint32_t alarmId, OnRemoveAlarmProcessed callback)        = 0;


@@ 83,6 86,7 @@ namespace alarms
        void updateEventsCache(TimePoint now) override;

        void getAlarm(const std::uint32_t alarmId, OnGetAlarmProcessed callback) override;
        void getAlarmWithStatus(const std::uint32_t alarmId, OnGetAlarmWithStatusProcessed callback) override;
        void addAlarm(AlarmEventRecord record, OnAddAlarmProcessed callback) override;
        void updateAlarm(AlarmEventRecord record, OnUpdateAlarmProcessed callback) override;
        void removeAlarm(const std::uint32_t alarmId, OnRemoveAlarmProcessed callback) override;


@@ 154,4 158,9 @@ namespace alarms
            std::unique_ptr<AbstractAlarmEventsRepository> &&alarmEventsRepo,
            IAlarmOperations::GetCurrentTime getCurrentTimeCallback) const override;
    };

    auto findSingleEventById(std::vector<std::unique_ptr<SingleEventRecord>> &events, const std::uint32_t id)
        -> std::vector<std::unique_ptr<SingleEventRecord>>::iterator;
    auto findSnoozedEventById(std::vector<std::unique_ptr<SnoozedAlarmEventRecord>> &events, const std::uint32_t id)
        -> std::vector<std::unique_ptr<SnoozedAlarmEventRecord>>::iterator;
} // namespace alarms

M module-services/service-time/CMakeLists.txt => module-services/service-time/CMakeLists.txt +1 -0
@@ 17,6 17,7 @@ set(SOURCES
    include/service-time/AlarmHandlerFactory.hpp
    include/service-time/AlarmMessage.hpp
    include/service-time/AlarmServiceAPI.hpp
    include/service-time/AlarmStatus.hpp
)

add_library(${PROJECT_NAME} STATIC ${SOURCES})

M module-services/service-time/ServiceTime.cpp => module-services/service-time/ServiceTime.cpp +4 -0
@@ 138,6 138,10 @@ namespace stm
        connect(typeid(alarms::AlarmGetRequestMessage), [&](sys::Message *request) -> sys::MessagePointer {
            return alarmMessageHandler->handleGetAlarm(static_cast<alarms::AlarmGetRequestMessage *>(request));
        });
        connect(typeid(alarms::AlarmGetWithStatusRequestMessage), [&](sys::Message *request) -> sys::MessagePointer {
            return alarmMessageHandler->handleGetAlarmWithStatus(
                static_cast<alarms::AlarmGetWithStatusRequestMessage *>(request));
        });
        connect(typeid(alarms::AlarmAddRequestMessage), [&](sys::Message *request) -> sys::MessagePointer {
            return alarmMessageHandler->handleAddAlarm(static_cast<alarms::AlarmAddRequestMessage *>(request));
        });

M module-services/service-time/include/service-time/AlarmMessage.hpp => module-services/service-time/include/service-time/AlarmMessage.hpp +17 -0
@@ 3,6 3,8 @@

#pragma once

#include "AlarmStatus.hpp"

#include <module-db/Interface/AlarmEventRecord.hpp>
#include <module-db/Interface/EventRecord.hpp>
#include <MessageType.hpp>


@@ 38,6 40,21 @@ namespace alarms
        const AlarmEventRecord alarm;
    };

    class AlarmGetWithStatusRequestMessage : public AlarmMessage
    {
      public:
        explicit AlarmGetWithStatusRequestMessage(const unsigned int id = 1) : id(id){};
        const unsigned int id;
    };

    class AlarmGetWithStatusResponseMessage : public AlarmResponse
    {
      public:
        AlarmGetWithStatusResponseMessage(const std::pair<AlarmEventRecord, AlarmStatus> p)
            : alarm(std::move(p.first)), status(p.second){};
        const AlarmEventRecord alarm;
        const AlarmStatus status;
    };
    class AlarmAddRequestMessage : public AlarmMessage
    {
      public:

A module-services/service-time/include/service-time/AlarmStatus.hpp => module-services/service-time/include/service-time/AlarmStatus.hpp +17 -0
@@ 0,0 1,17 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

namespace alarms
{
    enum class AlarmStatus
    {
        Invalid,
        Deactivated,
        Activated,
        Snoozed,
        Ringing,
        Queued
    };
}

M products/BellHybrid/apps/application-bell-main/presenters/HomeScreenPresenter.cpp => products/BellHybrid/apps/application-bell-main/presenters/HomeScreenPresenter.cpp +1 -1
@@ 65,7 65,7 @@ namespace app::home_screen

    void HomeScreenPresenter::onBeforeShow()
    {
        alarmModel->update([&]() { handleAlarmModelReady(); });
        stateController->resetStateMachine();
        getView()->setTimeFormat(timeModel->getTimeFormat());
        getView()->setTime(timeModel->getCurrentTime());
        getView()->setAlarmTimeFormat(timeModel->getTimeFormat());

M products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp => products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp +38 -5
@@ 32,10 32,23 @@ namespace app::home_screen
    {
        namespace Helpers
        {
            auto switchToMenu          = [](AbstractView &view) { view.switchToMenu(); };
            auto isDeactivated = [](AbstractAlarmModel &alarmModel) {
                return alarmModel.getAlarmStatus() == alarms::AlarmStatus::Deactivated;
            };
            auto isActivated = [](AbstractAlarmModel &alarmModel) {
                return alarmModel.getAlarmStatus() == alarms::AlarmStatus::Activated;
            };
            auto isSnoozed = [](AbstractAlarmModel &alarmModel) {
                return alarmModel.getAlarmStatus() == alarms::AlarmStatus::Snoozed;
            };
            auto isRinging = [](AbstractAlarmModel &alarmModel) {
                return alarmModel.getAlarmStatus() == alarms::AlarmStatus::Ringing;
            };

            auto switchToMenu         = [](AbstractView &view) { view.switchToMenu(); };
            auto makeAlarmEditable    = [](AbstractView &view) { view.setAlarmEdit(true); };
            auto makeAlarmNonEditable = [](AbstractView &view) { view.setAlarmEdit(false); };
            auto switchToBatteryStatus = [](AbstractView &view) { view.switchToBatteryStatus(); };
            auto makeAlarmEditable     = [](AbstractView &view) { view.setAlarmEdit(true); };
            auto makeAlarmNonEditable  = [](AbstractView &view) { view.setAlarmEdit(false); };
            auto updateBottomStats =
                [](AbstractView &view, AbstractBatteryModel &batteryModel, AbstractTemperatureModel &temperatureModel) {
                    view.setTemperature(temperatureModel.getTemperature());


@@ 96,6 109,8 @@ namespace app::home_screen
            {};
            struct ModelReady
            {};
            struct Reset
            {};
        } // namespace Events

        namespace Init


@@ 266,10 281,13 @@ namespace app::home_screen
                using namespace sml;
                // clang-format off
                return make_transition_table(*"Init"_s + sml::on_entry<_> / Init::entry,
                                             "Init"_s + event<Events::ModelReady> = "Deactivated"_s,
                                             "Init"_s + event<Events::ModelReady> [Helpers::isDeactivated] = "Deactivated"_s,
                                             "Init"_s + event<Events::ModelReady> [Helpers::isActivated] = "Activated"_s,
                                             "Init"_s + event<Events::ModelReady> [Helpers::isSnoozed] = "AlarmSnoozed"_s,
                                             "Init"_s + event<Events::ModelReady> [Helpers::isRinging] = "AlarmRinging"_s,

                                             "Deactivated"_s + sml::on_entry<_> / Deactivated::entry,
                                             "Deactivated"_s [Helpers::isAlarmActive] = "Activated"_s,
                                             "Deactivated"_s + event<Events::Reset> = "Init"_s,
                                             "Deactivated"_s + event<Events::LightPress>/ Helpers::switchToMenu,
                                             "Deactivated"_s + event<Events::RotateLeftPress> / Helpers::makeAlarmEditable = "DeactivatedEdit"_s,
                                             "Deactivated"_s + event<Events::RotateRightPress> / Helpers::makeAlarmEditable = "DeactivatedEdit"_s,


@@ 279,6 297,7 @@ namespace app::home_screen

                                             "DeactivatedWait"_s + sml::on_entry<_> / DeactivatedWait::entry,
                                             "DeactivatedWait"_s + sml::on_exit<_> / DeactivatedWait::exit,
                                             "DeactivatedWait"_s + event<Events::Reset> = "Init"_s,
                                             "DeactivatedWait"_s + event<Events::Timer> = "Deactivated"_s,
                                             "DeactivatedWait"_s + event<Events::LightPress>/ Helpers::switchToMenu = "Deactivated"_s,
                                             "DeactivatedWait"_s + event<Events::DeepUpPress> = "ActivatedWait"_s,


@@ 288,6 307,7 @@ namespace app::home_screen

                                             "DeactivatedEdit"_s + sml::on_entry<_> / AlarmEdit::entry,
                                             "DeactivatedEdit"_s + sml::on_exit<_> / AlarmEdit::exit,
                                             "DeactivatedEdit"_s + event<Events::Reset> = "Init"_s,
                                             "DeactivatedEdit"_s + event<Events::TimeUpdate> / Helpers::updateBottomStats,
                                             "DeactivatedEdit"_s + event<Events::RotateLeftPress> / AlarmEdit::processRotateLeft,
                                             "DeactivatedEdit"_s + event<Events::RotateRightPress> / AlarmEdit::processRotateRight,


@@ 297,6 317,7 @@ namespace app::home_screen

                                             "WaitForConfirmation"_s + sml::on_entry<_> / WaitForConfirmation::entry,
                                             "WaitForConfirmation"_s + sml::on_exit<_> / WaitForConfirmation::exit,
                                             "WaitForConfirmation"_s + event<Events::Reset> = "Init"_s,
                                             "WaitForConfirmation"_s + event<Events::Timer> / Helpers::makeAlarmNonEditable = "Deactivated"_s,
                                             "WaitForConfirmation"_s + event<Events::DeepUpPress> / WaitForConfirmation::action = "ActivatedWait"_s,
                                             "WaitForConfirmation"_s + event<Events::LightPress>/ Helpers::switchToMenu = "Deactivated"_s,


@@ 306,6 327,7 @@ namespace app::home_screen

                                             "ActivatedWait"_s + sml::on_entry<_> / ActivatedWait::entry,
                                             "ActivatedWait"_s + sml::on_exit<_> / ActivatedWait::exit,
                                             "ActivatedWait"_s + event<Events::Reset> = "Init"_s,
                                             "ActivatedWait"_s + event<Events::Timer> / Helpers::makeAlarmNonEditable = "Activated"_s,
                                             "ActivatedWait"_s + event<Events::LightPress>/ Helpers::switchToMenu = "Activated"_s,
                                             "ActivatedWait"_s + event<Events::DeepDownPress> = "DeactivatedWait"_s,


@@ 315,6 337,7 @@ namespace app::home_screen
                                             "ActivatedWait"_s + event<Events::AlarmRinging>  = "AlarmRinging"_s,

                                             "Activated"_s + sml::on_entry<_> / Activated::entry,
                                             "Activated"_s + event<Events::Reset> = "Init"_s,
                                             "Activated"_s [not Helpers::isAlarmActive] = "Deactivated"_s,
                                             "Activated"_s + event<Events::LightPress>/ Helpers::switchToMenu = "Activated"_s,
                                             "Activated"_s + event<Events::RotateLeftPress> / Helpers::makeAlarmEditable = "ActivatedEdit"_s,


@@ 326,6 349,7 @@ namespace app::home_screen

                                             "ActivatedEdit"_s + sml::on_entry<_> / AlarmEdit::entry,
                                             "ActivatedEdit"_s + sml::on_exit<_> / AlarmEdit::exit,
                                             "ActivatedEdit"_s + event<Events::Reset> = "Init"_s,
                                             "ActivatedEdit"_s + event<Events::TimeUpdate> / Helpers::updateBottomStats,
                                             "ActivatedEdit"_s + event<Events::RotateLeftPress> / AlarmEdit::processRotateLeft,
                                             "ActivatedEdit"_s + event<Events::RotateRightPress> / AlarmEdit::processRotateRight,


@@ 335,6 359,7 @@ namespace app::home_screen

                                             "AlarmRinging"_s + sml::on_entry<_> / AlarmRinging::entry,
                                             "AlarmRinging"_s + sml::on_exit<_> / AlarmRinging::exit,
                                             "AlarmRinging"_s + event<Events::Reset> = "Init"_s,
                                             "AlarmRinging"_s + event<Events::Timer> [Helpers::isSnoozeAllowed] / Helpers::snooze = "AlarmSnoozedWait"_s,
                                             "AlarmRinging"_s + event<Events::Timer> [!Helpers::isSnoozeAllowed] / Helpers::setDefaultAlarmTime  = "ActivatedWait"_s,
                                             "AlarmRinging"_s + event<Events::LightPress> = "AlarmSnoozedWait"_s,


@@ 344,6 369,7 @@ namespace app::home_screen

                                             "AlarmRingingDeactivatedWait"_s + sml::on_entry<_> / AlarmRingingDeactivatedWait::entry,
                                             "AlarmRingingDeactivatedWait"_s + sml::on_exit<_> / AlarmRingingDeactivatedWait::exit,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::Reset> = "Init"_s,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::Timer> = "Deactivated"_s,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::DeepDownPress> = "DeactivatedWait"_s,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::BackPress> = "Deactivated"_s,


@@ 353,6 379,7 @@ namespace app::home_screen

                                             "AlarmSnoozedWait"_s + sml::on_entry<_> / AlarmSnoozedWait::entry,
                                             "AlarmSnoozedWait"_s + sml::on_exit<_> / AlarmSnoozedWait::exit,
                                             "AlarmSnoozedWait"_s + event<Events::Reset> = "Init"_s,
                                             "AlarmSnoozedWait"_s + event<Events::Timer> = "AlarmSnoozed"_s,
                                             "AlarmSnoozedWait"_s + event<Events::DeepDownPress> = "DeactivatedWait"_s,
                                             "AlarmSnoozedWait"_s + event<Events::LightPress>/ Helpers::switchToMenu = "AlarmSnoozed"_s,


@@ 360,6 387,7 @@ namespace app::home_screen

                                             "AlarmSnoozed"_s + sml::on_entry<_> / AlarmSnoozed::entry,
                                             "AlarmSnoozed"_s + sml::on_entry<_> / AlarmSnoozed::exit,
                                             "AlarmSnoozed"_s + event<Events::Reset> = "Init"_s,
                                             "AlarmSnoozed"_s + event<Events::ModelReady> [not Helpers::isSnoozeActive] = "Activated"_s,
                                             "AlarmSnoozed"_s + event<Events::AlarmRinging>  = "AlarmRinging"_s,
                                             "AlarmSnoozed"_s + event<Events::DeepDownPress> = "DeactivatedWait"_s,


@@ 485,4 513,9 @@ namespace app::home_screen
        }
    }

    void StateController::resetStateMachine()
    {
        pimpl->sm.process_event(Events::Reset{});
    }

} // namespace app::home_screen

M products/BellHybrid/apps/application-bell-main/presenters/StateController.hpp => products/BellHybrid/apps/application-bell-main/presenters/StateController.hpp +3 -0
@@ 28,6 28,7 @@ namespace app::home_screen
      public:
        virtual ~AbstractController() noexcept = default;

        virtual void resetStateMachine()                                 = 0;
        virtual bool handleInputEvent(const gui::InputEvent &inputEvent) = 0;
        virtual bool handleTimerEvent()                                  = 0;
        virtual bool handleTimeUpdateEvent()                             = 0;


@@ 47,6 48,8 @@ namespace app::home_screen
                        AbstractAlarmModel &alarmModel,
                        AbstractTimeModel &timeModel);
        ~StateController();

        void resetStateMachine() override;
        bool handleInputEvent(const gui::InputEvent &inputEvent) override;
        bool handleTimerEvent() override;
        bool handleTimeUpdateEvent() override;

M products/BellHybrid/apps/common/CMakeLists.txt => products/BellHybrid/apps/common/CMakeLists.txt +1 -1
@@ 77,11 77,11 @@ target_link_libraries(application-bell-common
    PUBLIC
        apps-common
        service-db
        service-time

    PRIVATE
        bell::app-main
        bell::app-alarm
        module-gui
        service-time
        bell::db
        )

M products/BellHybrid/apps/common/include/common/models/AbstractAlarmModel.hpp => products/BellHybrid/apps/common/include/common/models/AbstractAlarmModel.hpp +3 -0
@@ 3,6 3,8 @@

#pragma once

#include <service-time/AlarmStatus.hpp>

#include <chrono>
#include <ctime>
#include <cstdint>


@@ 28,6 30,7 @@ namespace app
        virtual void turnOff()                    = 0;
        virtual void snooze()                     = 0;
        virtual std::chrono::seconds getTimeToNextSnooze() = 0;
        virtual alarms::AlarmStatus getAlarmStatus()       = 0;
        /// Command model to update its internal data
        virtual void update(AlarmModelReadyHandler callback = AlarmModelReadyHandler()) = 0;
    };

M products/BellHybrid/apps/common/include/common/models/AlarmModel.hpp => products/BellHybrid/apps/common/include/common/models/AlarmModel.hpp +4 -1
@@ 4,6 4,7 @@
#pragma once

#include "AbstractAlarmModel.hpp"
#include <service-time/AlarmStatus.hpp>

#include <apps-common/AsyncTask.hpp>
#include <module-db/Interface/AlarmEventRecord.hpp>


@@ 37,6 38,7 @@ namespace app
        void turnOff() override;
        void snooze() override;
        std::chrono::seconds getTimeToNextSnooze() override;
        alarms::AlarmStatus getAlarmStatus() override;

      private:
        enum class State


@@ 50,10 52,11 @@ namespace app
        AlarmEventRecord generateDefaultAlarm() const;
        std::shared_ptr<AlarmEventRecord> getAlarmPtr() const;
        void disableSnooze(AlarmEventRecord &alarm);
        void updateCache(const SingleEventRecord &record);
        void updateCache(const SingleEventRecord &record, alarms::AlarmStatus status);

        ApplicationCommon *app{};
        State state{State::Invalid};
        alarms::AlarmStatus alarmStatus{alarms::AlarmStatus::Invalid};
        SingleEventRecord cachedRecord;
        std::uint32_t snoozeCount = 0;
        TimePoint nextSnoozeTime  = TIME_POINT_INVALID;

M products/BellHybrid/apps/common/src/AlarmModel.cpp => products/BellHybrid/apps/common/src/AlarmModel.cpp +17 -6
@@ 22,11 22,11 @@ namespace app
    void AlarmModel::update(AlarmModelReadyHandler callback)
    {
        responseCallback = [this, callback](const auto response) -> bool {
            const auto resp = dynamic_cast<alarms::AlarmGetResponseMessage *>(response);
            const auto resp = dynamic_cast<alarms::AlarmGetWithStatusResponseMessage *>(response);
            if (resp) {
                if (resp->alarm.isValid()) {
                    auto alarm = resp->alarm;
                    updateCache(alarm.getNextSingleEvent(TimePointNow()));
                    updateCache(alarm.getNextSingleEvent(TimePointNow()), resp->status);
                    if (callback) {
                        callback();
                    }


@@ 46,7 46,7 @@ namespace app
            return true;
        };

        auto request = AsyncRequest::createFromMessage(std::make_unique<alarms::AlarmGetRequestMessage>(),
        auto request = AsyncRequest::createFromMessage(std::make_unique<alarms::AlarmGetWithStatusRequestMessage>(),
                                                       service::name::service_time);
        request->execute(app, this, responseCallback);
    }


@@ 75,7 75,11 @@ namespace app
        }
        alarmEventPtr->enabled = value;
        updateAlarm(*alarmEventPtr);
        if (!value) {
        if (value) {
            alarmStatus = alarms::AlarmStatus::Activated;
        }
        else {
            alarmStatus = alarms::AlarmStatus::Deactivated;
            disableSnooze(*alarmEventPtr);
        }
    }


@@ 137,6 141,7 @@ namespace app
        nextSnoozeTime =
            std::chrono::floor<std::chrono::minutes>(TimePointNow()) + std::chrono::minutes(snoozeDuration);
        alarms::AlarmServiceAPI::requestSnoozeRingingAlarm(app, cachedRecord.parent->ID, nextSnoozeTime);
        alarmStatus = alarms::AlarmStatus::Snoozed;
    }

    std::chrono::seconds AlarmModel::getTimeToNextSnooze()


@@ 170,12 175,13 @@ namespace app
    {
        return snoozeCount > 0;
    }
    void AlarmModel::updateCache(const SingleEventRecord &record)
    void AlarmModel::updateCache(const SingleEventRecord &record, alarms::AlarmStatus status)
    {
        if (record.startDate != cachedRecord.startDate) {
            snoozeCount  = 0;
            cachedRecord = record;
        }
        cachedRecord = record;
        alarmStatus  = status;
        state = State::Valid;
    }
    void AlarmModel::setDefaultAlarmTime()


@@ 188,4 194,9 @@ namespace app

        updateAlarm(*alarmEventPtr);
    }

    alarms::AlarmStatus AlarmModel::getAlarmStatus()
    {
        return alarmStatus;
    }
} // namespace app