~aleteoryx/muditaos

65973af8b719bbdd2c272f10446dea9d6c29eaf0 — Mateusz Grzegorzek 4 years ago 6c2e931
[BH-838] Ringing alarm GUI part

Handle Alarm Ringing case in State Controller
M image/assets/lang/English.json => image/assets/lang/English.json +2 -1
@@ 570,5 570,6 @@
  "app_bell_settings_advanced_temp_scale": "Temperature scale",
  "app_bellmain_home_screen_bottom_desc": "Next alarm will ring in",
  "app_bellmain_home_screen_bottom_desc_dp": "Deep press to activate",
  "app_bell_alarm_deactivated": "Alarm deactivated"
  "app_bell_alarm_deactivated": "Alarm deactivated",
  "app_bell_alarm_ringing_deactivated": "Good morning!\nRise and shine"
}

M products/BellHybrid/alarms/AlarmHandlerActions.cpp => products/BellHybrid/alarms/AlarmHandlerActions.cpp +13 -4
@@ 3,20 3,29 @@

#include "AlarmHandlerActions.hpp"

#include <service-audio/AudioServiceAPI.hpp>
#include <BellAlarmHandler.hpp>
#include <application-bell-main/ApplicationBellMain.hpp>
#include <application-bell-main/data/AlarmRingingSwitchData.hpp>
#include <apps-common/windows/AppWindow.hpp>
#include <service-appmgr/include/service-appmgr/Constants.hpp>
#include <service-appmgr/messages/SwitchRequest.hpp>
#include <service-time/ServiceTime.hpp>

namespace alarms
{

    auto playAlarmSound(const std::string &soundPath) -> bool
    {
        // playAlarmSound after it will be implemented [BH-660]
        return true;
    }

    auto displayAlarmPopup() -> bool
    auto displayAlarmPopup(stm::ServiceTime *serviceTime) -> bool
    {
        // displayAlarmPopup after it will be implemented [BH-566]
        auto msg = std::make_shared<app::manager::SwitchRequest>(BellAlarmClockHandler::name,
                                                                 app::applicationBellName,
                                                                 gui::name::window::main_window,
                                                                 std::make_unique<AlarmRingingSwitchData>());
        serviceTime->bus.sendUnicast(std::move(msg), service::name::appmgr);
        return true;
    }


M products/BellHybrid/alarms/BellAlarmHandler.cpp => products/BellHybrid/alarms/BellAlarmHandler.cpp +4 -1
@@ 3,9 3,12 @@

#include <BellAlarmHandler.hpp>
#include <AlarmHandlerActions.hpp>
#include <service-time/ServiceTime.hpp>

namespace alarms
{
    BellAlarmClockHandler::BellAlarmClockHandler(stm::ServiceTime *serviceTime) : serviceTime(serviceTime)
    {}

    auto BellAlarmClockHandler::handle(const AlarmEventRecord &record) -> bool
    {


@@ 16,7 19,7 @@ namespace alarms
        if (record.enabled) {
            result = playAlarmSound(record.musicTone);
            result = turnOnFrontlight();
            result = displayAlarmPopup();
            result = displayAlarmPopup(serviceTime);
            return result;
        }


M products/BellHybrid/alarms/CMakeLists.txt => products/BellHybrid/alarms/CMakeLists.txt +2 -0
@@ 19,6 19,8 @@ target_include_directories(alarms
)

target_link_libraries(alarms
   PRIVATE
        application-bell-main
   PUBLIC
        module-db
        service-time

M products/BellHybrid/alarms/include/AlarmHandlerActions.hpp => products/BellHybrid/alarms/include/AlarmHandlerActions.hpp +6 -1
@@ 5,11 5,16 @@

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

namespace stm
{
    class ServiceTime;
}

namespace alarms
{

    auto playAlarmSound(const std::string &soundPath) -> bool;
    auto displayAlarmPopup() -> bool;
    auto displayAlarmPopup(stm::ServiceTime *serviceTime) -> bool;
    auto turnOnFrontlight() -> bool;

} // namespace alarms

M products/BellHybrid/alarms/include/BellAlarmHandler.hpp => products/BellHybrid/alarms/include/BellAlarmHandler.hpp +11 -0
@@ 5,13 5,24 @@

#include <service-time/AlarmHandler.hpp>

namespace stm
{
    class ServiceTime;
}

namespace alarms
{

    class BellAlarmClockHandler : public AlarmHandler
    {
      public:
        explicit BellAlarmClockHandler(stm::ServiceTime *serviceTime);
        auto handle(const AlarmEventRecord &record) -> bool;

        static constexpr auto name = "BellAlarmClockHandler";

      private:
        stm::ServiceTime *serviceTime;
    };

    class EveningReminderHandler : public AlarmHandler

M products/BellHybrid/apps/application-bell-main/CMakeLists.txt => products/BellHybrid/apps/application-bell-main/CMakeLists.txt +1 -0
@@ 25,6 25,7 @@ target_sources(application-bell-main

    PUBLIC
        include/application-bell-main/ApplicationBellMain.hpp
        include/application-bell-main/data/AlarmRingingSwitchData.hpp
)

target_include_directories(application-bell-main

A products/BellHybrid/apps/application-bell-main/include/application-bell-main/data/AlarmRingingSwitchData.hpp => products/BellHybrid/apps/application-bell-main/include/application-bell-main/data/AlarmRingingSwitchData.hpp +16 -0
@@ 0,0 1,16 @@
// 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 <SwitchData.hpp>

namespace alarms
{
    class AlarmRingingSwitchData : public gui::SwitchData
    {
      public:
        AlarmRingingSwitchData() : SwitchData()
        {}
    };
} // namespace alarms

M products/BellHybrid/apps/application-bell-main/presenters/HomeScreenPresenter.cpp => products/BellHybrid/apps/application-bell-main/presenters/HomeScreenPresenter.cpp +14 -0
@@ 28,15 28,23 @@ namespace app::home_screen
        : app{app}, alarmModel{std::move(alarmModel)},
          temperatureModel{std::move(temperatureModel)}, timeModel{std::move(timeModel)}
    {}

    void HomeScreenPresenter::handleUpdateTimeEvent()
    {
        getView()->setTime(timeModel->getCurrentTime());
        stateController->handleTimeUpdateEvent();
    }

    void HomeScreenPresenter::handleAlarmRingingEvent()
    {
        stateController->handleAlarmRingingEvent();
    }

    bool HomeScreenPresenter::handleInputEvent(const gui::InputEvent &inputEvent)
    {
        return stateController->handleInputEvent(inputEvent);
    }

    void HomeScreenPresenter::spawnTimer(std::chrono::milliseconds timeout)
    {
        if (not timer.isValid()) {


@@ 46,6 54,7 @@ namespace app::home_screen
        timer.stop();
        timer.start();
    }

    void HomeScreenPresenter::detachTimer()
    {
        if (timer.isValid()) {


@@ 53,10 62,12 @@ namespace app::home_screen
            timer.reset();
        }
    }

    HomeScreenPresenter::~HomeScreenPresenter()
    {
        detachTimer();
    }

    void HomeScreenPresenter::onBeforeShow()
    {
        getView()->setTimeFormat(timeModel->getTimeFormat());


@@ 64,6 75,7 @@ namespace app::home_screen
        getView()->setAlarmTimeFormat(timeModel->getTimeFormat());
        getView()->setTemperature(temperatureModel->getTemperature());
    }

    void HomeScreenPresenter::setDefaultAlarmTime()
    {
        const auto now     = timeModel->getCurrentTime();


@@ 77,12 89,14 @@ namespace app::home_screen
        }
        getView()->setAlarmTime(alarmTime);
    }

    void HomeScreenPresenter::createData()
    {
        setDefaultAlarmTime();
        stateController =
            std::make_unique<StateController>(*getView(), *this, *temperatureModel, *alarmModel, *timeModel);
    }

    void HomeScreenPresenter::refreshWindow()
    {
        app->refreshWindow(gui::RefreshModes::GUI_REFRESH_FAST);

M products/BellHybrid/apps/application-bell-main/presenters/HomeScreenPresenter.hpp => products/BellHybrid/apps/application-bell-main/presenters/HomeScreenPresenter.hpp +3 -0
@@ 37,6 37,7 @@ namespace app::home_screen

        /// Alarm widget related API
        virtual void setAlarmTriggered()                                     = 0;
        virtual void setAlarmSnoozed()                                       = 0;
        virtual void setAlarmActive(bool)                                    = 0;
        virtual void setAlarmEdit(bool)                                      = 0;
        virtual void setAlarmVisible(bool)                                   = 0;


@@ 70,6 71,7 @@ namespace app::home_screen
        virtual void refreshWindow()                                                = 0;
        virtual void spawnTimer(std::chrono::milliseconds timeout = defaultTimeout) = 0;
        virtual void detachTimer()                                                  = 0;
        virtual void handleAlarmRingingEvent()                                      = 0;

        static constexpr auto defaultTimeout = std::chrono::milliseconds{5000};
    };


@@ 96,6 98,7 @@ namespace app::home_screen

        void spawnTimer(std::chrono::milliseconds timeout) override;
        void detachTimer() override;
        void handleAlarmRingingEvent() override;

      private:
        void setDefaultAlarmTime();

M products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp => products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp +83 -9
@@ 19,7 19,6 @@ namespace app::home_screen
    {
        namespace Helpers
        {
            auto spawnTimer           = [](AbstractPresenter &presenter) { presenter.spawnTimer(); };
            auto detachTimer          = [](AbstractPresenter &presenter) { presenter.detachTimer(); };
            auto switchToMenu         = [](AbstractView &view) { view.switchToMenu(); };
            auto makeAlarmEditable    = [](AbstractView &view) { view.setAlarmEdit(true); };


@@ 63,6 62,8 @@ namespace app::home_screen
            {};
            struct TimeUpdate
            {};
            struct AlarmRinging
            {};
        } // namespace Events

        namespace Deactivated


@@ 77,10 78,7 @@ namespace app::home_screen

        namespace DeactivatedWait
        {
            auto entry = [](AbstractView &view,
                            AbstractPresenter &presenter,
                            AbstractAlarmModel &alarmModel,
                            AbstractTimeModel &timeModel) {
            auto entry = [](AbstractView &view, AbstractPresenter &presenter) {
                presenter.spawnTimer();
                view.setBottomDescription(utils::translate("app_bell_alarm_deactivated"));
                view.setAlarmActive(false);


@@ 96,7 94,7 @@ namespace app::home_screen
                view.setAlarmTimeVisible(true);
                view.setAlarmVisible(true);
            };
            auto exit = [](AbstractView &view, AbstractPresenter &presenter) { view.setAlarmEdit(false); };
            auto exit = [](AbstractView &view) { view.setAlarmEdit(false); };

            auto processRotateLeft = [](AbstractView &view, AbstractPresenter &presenter) {
                presenter.spawnTimer();


@@ 107,7 105,7 @@ namespace app::home_screen
                presenter.spawnTimer();
                view.incAlarmMinute();
            };
        }; // namespace AlarmEdit
        } // namespace AlarmEdit

        namespace WaitForConfirmation
        {


@@ 127,7 125,6 @@ namespace app::home_screen
        {
            auto entry = [](AbstractView &view,
                            AbstractPresenter &presenter,
                            AbstractAlarmModel &alarmModel,
                            AbstractTimeModel &timeModel) {
                presenter.spawnTimer();
                view.setBottomDescription(


@@ 147,6 144,51 @@ namespace app::home_screen
            };
        } // namespace Activated

        namespace AlarmRinging
        {
            auto entry = [](AbstractView &view, AbstractPresenter &presenter) {
                presenter.spawnTimer();
                view.setAlarmTimeVisible(false);
                view.setAlarmTriggered();
            };
            auto exit = [](AbstractPresenter &presenter) { presenter.detachTimer(); };
        } // namespace AlarmRinging

        namespace AlarmRingingDeactivatedWait
        {
            auto entry = [](AbstractView &view, AbstractPresenter &presenter) {
                presenter.spawnTimer();
                view.setBottomDescription(utils::translate("app_bell_alarm_ringing_deactivated"));
                view.setAlarmActive(false);
            };
            auto exit = [](AbstractPresenter &presenter) { presenter.detachTimer(); };
        } // namespace AlarmRingingDeactivatedWait

        namespace AlarmSnoozedWait
        {
            auto entry = [](AbstractView &view, AbstractPresenter &presenter) {
                presenter.spawnTimer();
                view.setAlarmTimeVisible(false);
                view.setAlarmSnoozed();
                const auto bottomDescription = utils::translate("app_bellmain_home_screen_bottom_desc") +
                                               " 10 min"; // TODO: Get duration from settings
                view.setBottomDescription(bottomDescription);
            };
            auto exit = [](AbstractPresenter &presenter) { presenter.detachTimer(); };
        } // namespace AlarmSnoozedWait

        namespace AlarmSnoozed
        {
            auto entry =
                [](AbstractView &view, AbstractPresenter &presenter, AbstractTemperatureModel &temperatureModel) {
                    presenter.spawnTimer();
                    view.setAlarmTimeVisible(false);
                    view.setAlarmSnoozed();
                    view.setTemperature(temperatureModel.getTemperature());
                };
            auto exit = [](AbstractPresenter &presenter) { presenter.detachTimer(); };
        } // namespace AlarmSnoozed

        class StateMachine
        {
          public:


@@ 189,6 231,7 @@ namespace app::home_screen
                                             "Activated"_s + event<Events::RotateRightPress> / Helpers::makeAlarmEditable = "ActivatedEdit"_s,
                                             "Activated"_s + event<Events::TimeUpdate> / Helpers::updateTemperature,
                                             "Activated"_s + event<Events::DeepDownPress> / Helpers::hideAlarmTime  = "DeactivatedWait"_s,
                                             "Activated"_s + event<Events::AlarmRinging>  = "AlarmRinging"_s,

                                             "ActivatedEdit"_s + sml::on_entry<_> / AlarmEdit::entry,
                                             "ActivatedEdit"_s + sml::on_exit<_> / AlarmEdit::exit,


@@ 196,7 239,30 @@ namespace app::home_screen
                                             "ActivatedEdit"_s + event<Events::RotateLeftPress> / AlarmEdit::processRotateLeft,
                                             "ActivatedEdit"_s + event<Events::RotateRightPress> / AlarmEdit::processRotateRight,
                                             "ActivatedEdit"_s + event<Events::Timer>  = "ActivatedWait"_s,
                                             "ActivatedEdit"_s + event<Events::LightPress> / Helpers::detachTimer = "ActivatedWait"_s
                                             "ActivatedEdit"_s + event<Events::LightPress> / Helpers::detachTimer = "ActivatedWait"_s,

                                             "AlarmRinging"_s + sml::on_entry<_> / AlarmRinging::entry,
                                             "AlarmRinging"_s + sml::on_exit<_> / AlarmRinging::exit,
                                             "AlarmRinging"_s + event<Events::Timer> = "AlarmSnoozedWait"_s,
                                             "AlarmRinging"_s + event<Events::LightPress> = "AlarmSnoozedWait"_s,
                                             "AlarmRinging"_s + event<Events::RotateLeftPress> = "AlarmSnoozedWait"_s,
                                             "AlarmRinging"_s + event<Events::RotateRightPress> = "AlarmSnoozedWait"_s,
                                             "AlarmRinging"_s + event<Events::DeepDownPress> = "AlarmRingingDeactivatedWait"_s,

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

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

                                             "AlarmSnoozed"_s + sml::on_entry<_> / AlarmSnoozed::entry,
                                             "AlarmSnoozed"_s + sml::on_entry<_> / AlarmSnoozed::exit,
                                             "AlarmSnoozed"_s + event<Events::Timer> = "AlarmRinging"_s,
                                             "AlarmSnoozed"_s + event<Events::DeepDownPress> = "DeactivatedWait"_s
                    );
                // clang-format on
            }


@@ 255,15 321,23 @@ namespace app::home_screen

        return true;
    }

    bool StateController::handleTimerEvent()
    {
        pimpl->sm.process_event(Events::Timer{});
        presenter.refreshWindow();
        return true;
    }

    bool StateController::handleTimeUpdateEvent()
    {
        pimpl->sm.process_event(Events::TimeUpdate{});
        return true;
    }

    bool StateController::handleAlarmRingingEvent()
    {
        pimpl->sm.process_event(Events::AlarmRinging{});
        return true;
    }
} // namespace app::home_screen

M products/BellHybrid/apps/application-bell-main/presenters/StateController.hpp => products/BellHybrid/apps/application-bell-main/presenters/StateController.hpp +2 -0
@@ 21,6 21,7 @@ namespace app::home_screen
        virtual bool handleInputEvent(const gui::InputEvent &inputEvent) = 0;
        virtual bool handleTimerEvent()                                  = 0;
        virtual bool handleTimeUpdateEvent()                             = 0;
        virtual bool handleAlarmRingingEvent()                           = 0;
    };

    class StateController : public AbstractController


@@ 35,6 36,7 @@ namespace app::home_screen
        bool handleInputEvent(const gui::InputEvent &inputEvent) override;
        bool handleTimerEvent() override;
        bool handleTimeUpdateEvent() override;
        bool handleAlarmRingingEvent() override;

      private:
        class Impl;

M products/BellHybrid/apps/application-bell-main/windows/BellHomeScreenWindow.cpp => products/BellHybrid/apps/application-bell-main/windows/BellHomeScreenWindow.cpp +28 -1
@@ 5,6 5,7 @@
#include "data/BellMainStyle.hpp"

#include <application-bell-main/ApplicationBellMain.hpp>
#include <application-bell-main/data/AlarmRingingSwitchData.hpp>
#include <apps-common/widgets/BellBaseLayout.hpp>
#include <gui/input/InputEvent.hpp>
#include <gui/widgets/TextFixedSize.hpp>


@@ 32,6 33,7 @@ namespace
            tm.tm_min = 0;
        }
    }

    void decreaseHour(struct tm &tm)
    {
        if (tm.tm_hour <= Locale::min_hour_24H_mode) {


@@ 43,6 45,7 @@ namespace
            tm.tm_min = utils::time::Locale::max_minutes;
        }
    }

    void handleMinuteIncrease(struct tm &tm)
    {
        if (tm.tm_min >= Locale::max_minutes) {


@@ 52,6 55,7 @@ namespace
            tm.tm_min++;
        }
    }

    void handleMinuteDecrease(struct tm &tm)
    {
        if (tm.tm_min <= 0) {


@@ 115,11 119,17 @@ namespace gui
        body->centerBox->resizeItems();
        body->lastBox->resizeItems();
    }

    void BellHomeScreenWindow::setAlarmTriggered()
    {
        alarm->setAlarmStatus(AlarmSetSpinner::Status::RINGING);
    }

    void BellHomeScreenWindow::setAlarmSnoozed()
    {
        alarm->setAlarmStatus(AlarmSetSpinner::Status::SNOOZE);
    }

    void BellHomeScreenWindow::setAlarmActive(bool val)
    {
        if (val) {


@@ 144,22 154,27 @@ namespace gui
    {
        bottomText->setText(utils::temperature::tempToStrDec(newTemp));
    }

    void BellHomeScreenWindow::setBottomDescription(const UTF8 &desc)
    {
        bottomText->setText(desc);
    }

    void BellHomeScreenWindow::setTime(std::time_t newTime)
    {
        time->setTime(newTime);
    }

    void BellHomeScreenWindow::setTimeFormat(utils::time::Locale::TimeFormat fmt)
    {
        time->setTimeFormat(fmt);
    }

    void BellHomeScreenWindow::setAlarmTimeFormat(utils::time::Locale::TimeFormat fmt)
    {
        alarm->setTimeFormat(fmt);
    }

    void BellHomeScreenWindow::setAlarmEdit(bool val)
    {
        if (not val) {


@@ 169,10 184,12 @@ namespace gui
            alarm->setEditMode(EditMode::Edit);
        };
    }

    void BellHomeScreenWindow::switchToMenu()
    {
        application->switchWindow(window::name::bell_main_menu, nullptr);
    }

    bool BellHomeScreenWindow::onInput(const InputEvent &inputEvent)
    {
        if (inputEvent.isShortRelease()) {


@@ 180,10 197,16 @@ namespace gui
        }
        return false;
    }
    void BellHomeScreenWindow::onBeforeShow(ShowMode, SwitchData *)

    void BellHomeScreenWindow::onBeforeShow(ShowMode, SwitchData *data)
    {
        presenter->onBeforeShow();
        const auto alarmRingingSwitchData = dynamic_cast<alarms::AlarmRingingSwitchData *>(data);
        if (alarmRingingSwitchData != nullptr) {
            presenter->handleAlarmRingingEvent();
        }
    }

    std::time_t BellHomeScreenWindow::getAlarmTime() const
    {
        const auto now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());


@@ 193,10 216,12 @@ namespace gui
        }
        return alarmTime;
    }

    void BellHomeScreenWindow::setAlarmTime(std::time_t newTime)
    {
        alarm->setTime(newTime);
    }

    bool BellHomeScreenWindow::updateTime()
    {
        if (presenter) {


@@ 204,6 229,7 @@ namespace gui
        }
        return true;
    }

    void BellHomeScreenWindow::incAlarmMinute()
    {
        const auto alarmTime = alarm->getTime();


@@ 211,6 237,7 @@ namespace gui
        handleMinuteIncrease(*newTime);
        alarm->setTime(std::mktime(newTime));
    }

    void BellHomeScreenWindow::decAlarmMinute()
    {
        const auto alarmTime = alarm->getTime();

M products/BellHybrid/apps/application-bell-main/windows/BellHomeScreenWindow.hpp => products/BellHybrid/apps/application-bell-main/windows/BellHomeScreenWindow.hpp +1 -0
@@ 28,6 28,7 @@ namespace gui
        void onBeforeShow(ShowMode mode, SwitchData *data) override;

        void setAlarmTriggered() override;
        void setAlarmSnoozed() override;
        void setAlarmActive(bool val) override;
        void setAlarmEdit(bool val) override;
        void setAlarmVisible(bool val) override;