From d6fbf631f649c7e85db1584aef774deed7ecb757 Mon Sep 17 00:00:00 2001 From: Kuba Kleczkowski Date: Wed, 9 Nov 2022 11:37:14 +0100 Subject: [PATCH] [MOS-792] Added VoLTE setting in db VoLTE enabled/disabled state is now stored in settings database. VoLTE is enabled or disabled to mach setting during modem initialisation. --- image/user/db/settings_v2_002.sql | 3 +- .../service-cellular/ServiceCellular.cpp | 36 ++++++++++++++++--- .../service-cellular/CellularMessage.hpp | 26 ++++++++++++++ .../service-cellular/VolteState.hpp | 16 +++++++++ .../src/ServiceCellularPriv.cpp | 5 ++- .../service-cellular/src/VolteHandler.hpp | 13 ++++++- .../agents/settings/SystemSettings.hpp | 1 + pure_changelog.md | 1 + 8 files changed, 93 insertions(+), 8 deletions(-) create mode 100644 module-services/service-cellular/service-cellular/VolteState.hpp diff --git a/image/user/db/settings_v2_002.sql b/image/user/db/settings_v2_002.sql index b10565fee0a746665637ae72bfe2bcb587fa5b58..ba79afde6a4deed7d321017d44018c4c4097041c 100644 --- a/image/user/db/settings_v2_002.sql +++ b/image/user/db/settings_v2_002.sql @@ -45,7 +45,8 @@ INSERT OR IGNORE INTO settings_tab (path, value) VALUES ('gs_current_timezone_rules', ''), ('\ServiceTime\\gs_automatic_date_and_time_is_on', '1'), ('\ServiceEink\\display_inverted_mode', '0'), - ('display_lock_screen_deep_refresh_rate', '30'); + ('display_lock_screen_deep_refresh_rate', '30'), + ('cl_volte_enabled', '0'); diff --git a/module-services/service-cellular/ServiceCellular.cpp b/module-services/service-cellular/ServiceCellular.cpp index 6276c885a3c682c59fec0d0f0dad021af1b55bc7..a8c5519eec214f823687e7e162c8685cb0117bec 100644 --- a/module-services/service-cellular/ServiceCellular.cpp +++ b/module-services/service-cellular/ServiceCellular.cpp @@ -251,6 +251,12 @@ sys::ReturnCodes ServiceCellular::InitHandler() settings::Cellular::currentUID, std::to_string(static_cast(uid)), settings::SettingsScope::Global); }; + const auto rawVolteSetting = settings->getValue(settings::Cellular::volteEnabled, settings::SettingsScope::Global); + if (rawVolteSetting.empty()) { + LOG_ERROR("VoLTE setting missing, setting to default disabled"); + settings->setValue(settings::Cellular::volteEnabled, "0", settings::SettingsScope::Global); + } + cpuSentinel = std::make_shared(serviceName, this); ongoingCall = @@ -595,6 +601,27 @@ void ServiceCellular::registerMessageHandlers() return std::make_shared(ongoingCall && ongoingCall->active()); }); + connect(typeid(cellular::GetVolteStateRequest), [&](sys::Message *request) -> sys::MessagePointer { + return std::make_shared(priv->volteHandler->getVolteState()); + }); + + connect(typeid(cellular::SwitchVolteOnOffRequest), [&](sys::Message *request) -> sys::MessagePointer { + auto message = static_cast(request); + auto channel = cmux->get(CellularMux::Channel::Commands); + if (channel == nullptr) { + LOG_ERROR("Failed to get channel, skipping VoLTE request!"); + return sys::MessageNone{}; + } + settings->setValue( + settings::Cellular::volteEnabled, message->enable ? "1" : "0", settings::SettingsScope::Global); + if (not priv->volteHandler->switchVolte(*channel, message->enable)) { + auto notification = std::make_shared(priv->volteHandler->getVolteState()); + bus.sendMulticast(std::move(notification), sys::BusChannel::ServiceCellularNotifications); + priv->modemResetHandler->performHardReset(); + } + return sys::MessageNone{}; + }); + handle_CellularGetChannelMessage(); } @@ -870,12 +897,11 @@ bool ServiceCellular::handle_cellular_priv_init() priv->simContacts->setChannel(channel); priv->imeiGetHandler->setChannel(channel); -#if ENABLE_VOLTE == 1 - constexpr bool enableVolte = true; -#else - constexpr bool enableVolte = false; -#endif bool needReset = false; + + auto enableVolte = + settings->getValue(settings::Cellular::volteEnabled, settings::SettingsScope::Global) == "1" ? true : false; + try { needReset = !priv->tetheringHandler->configure() || !priv->volteHandler->switchVolte(*channel, enableVolte); } diff --git a/module-services/service-cellular/service-cellular/CellularMessage.hpp b/module-services/service-cellular/service-cellular/CellularMessage.hpp index f123ccff47cab7a64eb5519962e5ae162b308384..e3fc63e6fda738bf32b6bbd8e4b27c30ef44d656 100644 --- a/module-services/service-cellular/service-cellular/CellularMessage.hpp +++ b/module-services/service-cellular/service-cellular/CellularMessage.hpp @@ -5,6 +5,7 @@ #include "SignalStrength.hpp" #include +#include #include #include @@ -1055,4 +1056,29 @@ namespace cellular const bool active = false; }; + class GetVolteStateRequest : public sys::DataMessage + {}; + + struct GetVolteStateResponse : public sys::ResponseMessage + { + VolteState volteState; + explicit GetVolteStateResponse(VolteState volteState) : volteState(volteState) + {} + }; + + struct VolteStateNotification : public sys::DataMessage + { + VolteState volteState; + explicit VolteStateNotification(VolteState volteState) + : sys::DataMessage(MessageType::MessageTypeUninitialized), volteState(volteState) + {} + }; + + struct SwitchVolteOnOffRequest : public sys::DataMessage + { + bool enable = false; + explicit SwitchVolteOnOffRequest(bool enable) + : DataMessage(MessageType::MessageTypeUninitialized), enable(enable) + {} + }; } // namespace cellular diff --git a/module-services/service-cellular/service-cellular/VolteState.hpp b/module-services/service-cellular/service-cellular/VolteState.hpp new file mode 100644 index 0000000000000000000000000000000000000000..eb5a0ebac5bbeab8b710f2fd1ad9aec61ab3b838 --- /dev/null +++ b/module-services/service-cellular/service-cellular/VolteState.hpp @@ -0,0 +1,16 @@ +// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +namespace cellular +{ + enum class VolteState + { + On, + Off, + SwitchingToOff, + SwitchingToOn, + Undefined + }; +} diff --git a/module-services/service-cellular/src/ServiceCellularPriv.cpp b/module-services/service-cellular/src/ServiceCellularPriv.cpp index c68428a0d9cd36c1eef35efecff7400e39d48263..07863550caf5b54894bdc597ba5fb77b80e2f3db 100644 --- a/module-services/service-cellular/src/ServiceCellularPriv.cpp +++ b/module-services/service-cellular/src/ServiceCellularPriv.cpp @@ -37,7 +37,10 @@ namespace cellular::internal networkTime{std::make_unique()}, simContacts{std::make_unique()}, imeiGetHandler{std::make_unique()}, tetheringHandler{std::make_unique()}, - modemResetHandler{std::make_unique()}, csqHandler{std::make_unique()} + volteHandler{std::make_unique>()}, + modemResetHandler{std::make_unique()}, csqHandler{ + std::make_unique(), + } { initSimCard(); initSMSSendHandler(); diff --git a/module-services/service-cellular/src/VolteHandler.hpp b/module-services/service-cellular/src/VolteHandler.hpp index b0a3998c35fafd385bc87e429e5720ddcc133958..86a43cd520cd9c1946b487d76d0421e6d4fe57ba 100644 --- a/module-services/service-cellular/src/VolteHandler.hpp +++ b/module-services/service-cellular/src/VolteHandler.hpp @@ -3,6 +3,7 @@ #pragma once +#include #include #include #include @@ -35,7 +36,7 @@ namespace cellular::service template struct VolteHandler : private NonCopyable { - bool switchVolte(CmuxChannel &channel, bool enable) const + bool switchVolte(CmuxChannel &channel, bool enable) { ModemResponseParser const parser; @@ -77,15 +78,25 @@ namespace cellular::service throw std::runtime_error("[VoLTE] failed to " + std::string(enable ? "enable" : "disable") + " IMS"); } + volteState = enable ? cellular::VolteState::SwitchingToOn : cellular::VolteState::SwitchingToOff; + } + else { + volteState = enable ? cellular::VolteState::On : cellular::VolteState::Off; } return alreadyConfigured; } + auto getVolteState() -> cellular::VolteState + { + return volteState; + } + private: std::string imsStateToString(response::qcfg_ims::IMSState imsState) const { return std::to_string(magic_enum::enum_integer(imsState)); } + cellular::VolteState volteState = cellular::VolteState::Undefined; }; } // namespace cellular::service diff --git a/module-services/service-db/agents/settings/SystemSettings.hpp b/module-services/service-db/agents/settings/SystemSettings.hpp index c8ab38161371c2dac2e193c85575c4fbfe2e898d..770a8792a60704c1239e88ca04902e966339264f 100644 --- a/module-services/service-db/agents/settings/SystemSettings.hpp +++ b/module-services/service-db/agents/settings/SystemSettings.hpp @@ -48,6 +48,7 @@ namespace settings constexpr inline auto apn_list = "cl_apn_list"; constexpr inline auto offlineMode = "cl_offline_mode"; constexpr inline auto currentUID = "cl_current_uid"; + constexpr inline auto volteEnabled = "cl_volte_enabled"; } // namespace Cellular namespace Battery diff --git a/pure_changelog.md b/pure_changelog.md index 0a2c0a5648d47bc54b8ff86669ff11a2ee3e6852..c81fb7907df40c90aae98a98d5fe3dddbd370a71 100644 --- a/pure_changelog.md +++ b/pure_changelog.md @@ -41,6 +41,7 @@ * Added tethering information on the status bar * Added basic MMS handling * Added run-time statistics for tasks +* Added VoLTE state in settings database ## [1.3.0 2022-08-04]