~aleteoryx/muditaos

12ec20b0b22f4142f496978df4bbe6513cca1a4f — Mateusz Piesta 3 years ago b49c695
[BH-1408] Main alarm stops

Cherry pick of the missing PR.
M image/user/db/settings_bell_002.sql => image/user/db/settings_bell_002.sql +1 -1
@@ 40,7 40,7 @@ INSERT OR IGNORE INTO settings_tab (path, value) VALUES
    ('prewake_up_light_duration','0'),
    ('alarm_tone','Morning Dew'),
    ('alarm_light_active','1'),
    ('alarm_duration','10000'),
    ('alarm_duration','5'),
    ('bedtime_active','0'),
    ('bedtime_time','21:00'),
    ('bedtime_tone','Evening Horizon'),

M products/BellHybrid/alarms/src/actions/PlayAudioActions.cpp => products/BellHybrid/alarms/src/actions/PlayAudioActions.cpp +17 -17
@@ 13,16 13,16 @@ namespace alarms
    PlayAudioAction::PlayAudioAction(sys::Service &service,
                                     const std::filesystem::path &tonesDirPath,
                                     std::string_view toneSetting,
                                     std::string_view durationSetting,
                                     audio::PlaybackType playbackType)
                                     audio::PlaybackType playbackType,
                                     std::optional<std::string_view> durationSetting)
        : service{service}, soundsRepository{tonesDirPath}, toneSetting{toneSetting}, durationSetting{durationSetting},
          playbackType{playbackType}, settings{service::ServiceProxy{service.weak_from_this()}}
    {}

    bool PlayAudioAction::play(const std::filesystem::path &path, std::chrono::minutes duration)
    bool PlayAudioAction::play(const std::filesystem::path &path, std::optional<std::chrono::minutes> duration)
    {
        if (duration != InfiniteDuration && duration != NoDuration) {
            spawnTimer(duration);
        if (duration) {
            spawnTimer(*duration);
        }
        return service.bus.sendUnicast(std::make_shared<service::AudioStartPlaybackRequest>(path, playbackType),
                                       service::audioServiceName);


@@ 37,10 37,14 @@ namespace alarms
    }
    bool PlayAudioAction::execute()
    {
        const auto tone        = settings.getValue(toneSetting, settings::SettingsScope::Global);
        const auto durationStr = settings.getValue(durationSetting, settings::SettingsScope::Global);
        const auto durationVal = utils::getNumericValue<int>(durationStr);
        return play(soundsRepository.titleToPath(tone).value_or(""), std::chrono::minutes{durationVal});
        const auto tone = settings.getValue(toneSetting, settings::SettingsScope::Global);
        std::optional<std::chrono::minutes> duration{};
        if (durationSetting) {
            const auto durationStr = settings.getValue(*durationSetting, settings::SettingsScope::Global);
            duration.emplace(utils::getNumericValue<int>(durationStr));
        }

        return play(soundsRepository.titleToPath(tone).value_or(""), duration);
    }

    void PlayAudioAction::detachTimer()


@@ 67,29 71,25 @@ namespace alarms
            return std::make_unique<PlayAudioAction>(service,
                                                     paths::getPreWakeUpChimesDir(),
                                                     bell::settings::PrewakeUp::tone,
                                                     NoPlaybackTimeout,
                                                     audio::PlaybackType::PreWakeUp);
        }

        std::unique_ptr<PlayAudioAction> createSnoozeChimeAction(sys::Service &service)
        {
            return std::make_unique<PlayAudioAction>(service,
                                                     paths::getSnoozeChimesDir(),
                                                     bell::settings::Snooze::tone,
                                                     bell::settings::Snooze::length,
                                                     audio::PlaybackType::Snooze);
            return std::make_unique<PlayAudioAction>(
                service, paths::getSnoozeChimesDir(), bell::settings::Snooze::tone, audio::PlaybackType::Snooze);
        }
        std::unique_ptr<PlayAudioAction> createAlarmToneAction(sys::Service &service)
        {
            /// Alarm duration is controlled from the main application's state machine
            return std::make_unique<PlayAudioAction>(
                service, paths::getAlarmDir(), bell::settings::Alarm::tone, bell::settings::Alarm::duration);
                service, paths::getAlarmDir(), bell::settings::Alarm::tone, audio::PlaybackType::Alarm);
        }
        std::unique_ptr<PlayAudioAction> createBedtimeChimeAction(sys::Service &service)
        {
            return std::make_unique<PlayAudioAction>(service,
                                                     paths::getBedtimeReminderChimesDir(),
                                                     bell::settings::Bedtime::tone,
                                                     bell::settings::Bedtime::duration,
                                                     audio::PlaybackType::Bedtime);
        }
    } // namespace factory

M products/BellHybrid/alarms/src/actions/PlayAudioActions.hpp => products/BellHybrid/alarms/src/actions/PlayAudioActions.hpp +4 -8
@@ 23,14 23,11 @@ namespace alarms
        explicit PlayAudioAction(sys::Service &service,
                                 const std::filesystem::path &tonesDirPath,
                                 std::string_view toneSetting,
                                 std::string_view durationSetting,
                                 audio::PlaybackType = audio::PlaybackType::Alarm);
                                 audio::PlaybackType                             = audio::PlaybackType::Alarm,
                                 std::optional<std::string_view> durationSetting = {});

      private:
        static constexpr auto InfiniteDuration = std::chrono::minutes::max();
        static constexpr auto NoDuration       = std::chrono::minutes::zero();

        bool play(const std::filesystem::path &path, std::chrono::minutes duration = InfiniteDuration);
        bool play(const std::filesystem::path &path, std::optional<std::chrono::minutes> duration = {});
        void spawnTimer(std::chrono::minutes timeout);
        void detachTimer();



@@ 38,14 35,13 @@ namespace alarms
        sys::TimerHandle timer;
        SoundsRepository soundsRepository;
        const std::string toneSetting;
        const std::string durationSetting;
        const std::optional<std::string> durationSetting;
        const audio::PlaybackType playbackType;
        settings::Settings settings;
    };

    namespace factory
    {
        static constexpr auto NoPlaybackTimeout = "0";
        std::unique_ptr<PlayAudioAction> createAlarmToneAction(sys::Service &service);
        std::unique_ptr<PlayAudioAction> createPreWakeUpChimeAction(sys::Service &service);
        std::unique_ptr<PlayAudioAction> createSnoozeChimeAction(sys::Service &service);

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

    void HomeScreenPresenter::stopSnoozeTimer()
    {
        snoozeTimer->start();
        snoozeTimer->stop();
    }

    void HomeScreenPresenter::restartSnoozeTimer(std::chrono::seconds snoozeDuration)