~aleteoryx/muditaos

81542432050e4d484f6e2c4f6f04b3d768ee6561 — Marcin Zieliński 3 years ago 7fff20a
[MOS-770] Replace VoLTE state switching mechanism

Thrown out the previous implementation.
M module-apps/CMakeLists.txt => module-apps/CMakeLists.txt +0 -5
@@ 58,11 58,6 @@ if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
    endforeach()
endif()

option(ENABLE_VOLTE "Enable VoLTE" OFF)
if(${ENABLE_VOLTE})
    target_compile_definitions(${PROJECT_NAME} PUBLIC ENABLE_VOLTE=1)
endif()

option(DISABLED_SETTINGS_OPTIONS "Enable Disabled Settings Options" OFF)
if(${DISABLED_SETTINGS_OPTIONS})
    target_compile_definitions(${PROJECT_NAME} PUBLIC DISABLED_SETTINGS_OPTIONS=1)

M module-apps/application-settings/ApplicationSettings.cpp => module-apps/application-settings/ApplicationSettings.cpp +0 -22
@@ 322,10 322,6 @@ namespace app
        settings->registerValueChange(settings::operators_on,
                                      [this](const std::string &value) { operatorOnChanged(value); });
        settings->registerValueChange(
            ::settings::Cellular::volte_on,
            [this](const std::string &value) { volteChanged(value); },
            ::settings::SettingsScope::Global);
        settings->registerValueChange(
            ::settings::Cellular::offlineMode,
            [this](const std::string &value) { flightModeOn = utils::getNumericValue<bool>(value); },
            ::settings::SettingsScope::Global);


@@ 635,24 631,6 @@ namespace app
        settings->setValue(settings::operators_on, std::to_string(static_cast<int>(value)));
    }

    void ApplicationSettings::setVoLTEOn(bool value)
    {
        voLteStateOn = value;
        CellularServiceAPI::SetVoLTE(this, voLteStateOn);
    };

    bool ApplicationSettings::getVoLTEOn() const noexcept
    {
        return voLteStateOn;
    }

    void ApplicationSettings::volteChanged(const std::string &value)
    {
        if (!value.empty()) {
            voLteStateOn = utils::getNumericValue<bool>(value);
        }
    }

    void ApplicationSettings::setOsUpdateVersion(const std::string &value)
    {
        LOG_DEBUG("[ApplicationSettings::setOsUpdateVersion] to value=%s", value.c_str());

M module-apps/application-settings/include/application-settings/ApplicationSettings.hpp => module-apps/application-settings/include/application-settings/ApplicationSettings.hpp +0 -6
@@ 37,8 37,6 @@ namespace app
            virtual ~OperatorsSettings()                               = default;
            virtual void setOperatorsOn(bool value)                    = 0;
            [[nodiscard]] virtual bool getOperatorsOn() const noexcept = 0;
            virtual void setVoLTEOn(bool value)                        = 0;
            [[nodiscard]] virtual bool getVoLTEOn() const noexcept     = 0;
        };
        class ScreenLightSettings
        {


@@ 154,9 152,6 @@ namespace app
        void operatorOnChanged(const std::string &value);
        void setOperatorsOn(bool value) override;
        bool getOperatorsOn() const noexcept override;
        void setVoLTEOn(bool value) override;
        bool getVoLTEOn() const noexcept override;
        void volteChanged(const std::string &value);
        void setOsUpdateVersion(const std::string &value);

        ScreenLightSettings::Values getCurrentValues() override;


@@ 197,7 192,6 @@ namespace app
        std::string selectedSimNumber = {};

        bool operatorsOn                                               = false;
        bool voLteStateOn                                              = false;
        bool notificationsWhenLocked                                   = true;
        bool callsFromFavorites                                        = false;
        int connectionFrequency                                        = 0;

M module-apps/application-settings/windows/network/NetworkWindow.cpp => module-apps/application-settings/windows/network/NetworkWindow.cpp +0 -14
@@ 63,20 63,6 @@ namespace gui
        }
#endif // DISABLED_SETTINGS_OPTIONS

#if ENABLE_VOLTE == 1
        auto voLteOn = operatorsSettings->getVoLTEOn();
        optList.emplace_back(std::make_unique<gui::option::OptionSettings>(
            utils::translate("app_settings_network_voice_over_lte"),
            [=](gui::Item &item) {
                operatorsSettings->setVoLTEOn(!voLteOn);
                refreshOptionsList();
                return true;
            },
            nullptr,
            nullptr,
            voLteOn ? gui::option::SettingRightItem::On : gui::option::SettingRightItem::Off));
#endif // ENABLE_VOLTE

        optList.emplace_back(std::make_unique<gui::option::OptionSettings>(
            utils::translate("app_settings_network_apn_settings"),
            [=](gui::Item &item) {

M module-services/service-cellular/CellularServiceAPI.cpp => module-services/service-cellular/CellularServiceAPI.cpp +0 -6
@@ 313,12 313,6 @@ bool CellularServiceAPI::GetDataTransfer(sys::Service *serv)
    return serv->bus.sendUnicast(std::make_shared<cellular::GetDataTransferMessage>(), ServiceCellular::serviceName);
}

bool CellularServiceAPI::SetVoLTE(sys::Service *serv, bool voLTE)
{
    return serv->bus.sendUnicast(std::make_shared<cellular::ChangeVoLTEDataMessage>(voLTE),
                                 ServiceCellular::serviceName);
}

bool CellularServiceAPI::ChangeModulePowerState(sys::Service *serv, cellular::service::State::PowerState newState)
{
    return serv->bus.sendUnicast(std::make_shared<cellular::PowerStateChange>(newState), ServiceCellular::serviceName);

M module-services/service-cellular/NetworkSettings.cpp => module-services/service-cellular/NetworkSettings.cpp +1 -160
@@ 2,7 2,6 @@
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "NetworkSettings.hpp"
#include "QMBNManager.hpp"
#include <unordered_map>
#include <at/ATFactory.hpp>
#include <at/cmd/QNWINFO.hpp>


@@ 184,6 183,7 @@ bool NetworkSettings::setOperatorAutoSelect()
    auto resp = channel->cmd(buildCmd);
    return (resp.code == at::Result::Code::OK);
}

bool NetworkSettings::setOperator(at::response::cops::CopsMode mode,
                                  at::response::cops::NameFormat format,
                                  const std::string &name)


@@ 199,162 199,3 @@ bool NetworkSettings::setOperator(at::response::cops::CopsMode mode,
    auto resp = channel->cmd(buildCmd);
    return (resp.code == at::Result::Code::OK);
}

at::Result::Code NetworkSettings::getPreferredVoiceDomain(VoiceDomainPreference &pref)
{
    auto channel = cellularService.cmux->get(CellularMux::Channel::Commands);
    if (!channel) {
        return at::Result::Code::ERROR;
    }

    QMBNManager qmbn(channel);
    std::uint8_t retval;
    auto ret = qmbn.readNVByte(nv_paths::voice_domain_pref, retval);
    if (ret == at::Result::Code::OK) {
        pref = static_cast<VoiceDomainPreference>(retval);
    }

    return ret;
}

at::Result::Code NetworkSettings::setPreferredVoiceDomain(VoiceDomainPreference pref)
{
    auto channel = cellularService.cmux->get(CellularMux::Channel::Commands);
    if (!channel) {
        return at::Result::Code::ERROR;
    }

    QMBNManager qmbn(channel);
    auto ret = qmbn.writeNVByte(nv_paths::voice_domain_pref, static_cast<std::uint8_t>(pref));
    return ret;
}

at::Result::Code NetworkSettings::getPreferredSMSDomain(SMSDomainPreference &pref)
{
    auto channel = cellularService.cmux->get(CellularMux::Channel::Commands);
    if (!channel) {
        return at::Result::Code::ERROR;
    }

    QMBNManager qmbn(channel);
    std::uint8_t retval;
    auto ret = qmbn.readNVByte(nv_paths::sms_domain_pref, retval);
    if (ret == at::Result::Code::OK) {
        pref = static_cast<SMSDomainPreference>(retval);
    }

    return ret;
}

at::Result::Code NetworkSettings::setPreferredSMSDomain(SMSDomainPreference pref)
{
    auto channel = cellularService.cmux->get(CellularMux::Channel::Commands);
    if (!channel) {
        return at::Result::Code::ERROR;
    }

    QMBNManager qmbn(channel);
    auto ret = qmbn.writeNVByte(nv_paths::sms_domain_pref, static_cast<std::uint8_t>(pref));
    return ret;
}

at::Result::Code NetworkSettings::setIMSState(at::response::qcfg_ims::IMSState state)
{
    auto channel = cellularService.cmux->get(CellularMux::Channel::Commands);
    if (!channel) {
        return at::Result::Code::ERROR;
    }
    at::Cmd buildCmd = at::factory(at::AT::QCFG_IMS) + "," + utils::to_string(static_cast<int>(state));
    auto resp        = channel->cmd(buildCmd);
    return resp.code;
}

std::optional<std::pair<at::response::qcfg_ims::IMSState, at::response::qcfg_ims::VoLTEIMSState>> NetworkSettings::
    getIMSState()
{
    std::vector<std::string> operatorNames;
    auto channel = cellularService.cmux->get(CellularMux::Channel::Commands);
    if (channel) {

        at::Cmd buildCmd = at::factory(at::AT::QCFG_IMS);
        auto resp        = channel->cmd(buildCmd);
        std::pair<at::response::qcfg_ims::IMSState, at::response::qcfg_ims::VoLTEIMSState> ret;
        if ((resp.code == at::Result::Code::OK) && (at::response::parseQCFG_IMS(resp, ret))) {
            return ret;
        }
    }

    return std::nullopt;
}

at::Result::Code NetworkSettings::setVoLTEState(VoLTEState state)
{
    /**
     * VoLTE On scenario
     * 1^) auto select off
     * 2) voice domain pref to PS,  [sms domain pref to PS - optional]
     * 3) NV enable VoLTE
     * 4^) select ROW_Generic_3GPP, also could be Volte_OpenMkt-Comercial-CMCC  << could need reboot
     * 5) set QCFG ims to 1
     * 6) If need reboot modem AT+CFUN=1,1
     *
     * ^ optional if not work, should be tested with operator
     *
     *VoLTE off switch
     * 1) "ims" QCFG to 0
     * 2) autoselect of MBN to On
     * 3) Reboot
     */

    auto channel = cellularService.cmux->get(CellularMux::Channel::Commands);
    if (!channel) {
        return at::Result::Code::ERROR;
    }

    QMBNManager qmbn(channel);
    if (state == VoLTEState::On) {
        setPreferredVoiceDomain(VoiceDomainPreference::PSPreferred);
        qmbn.setAutoSelect(at::response::qmbncfg::MBNAutoSelect::On);
        setIMSState(at::response::qcfg_ims::IMSState::Enable);
    }
    else {
        setIMSState(at::response::qcfg_ims::IMSState::Disable);
        qmbn.setAutoSelect(at::response::qmbncfg::MBNAutoSelect::On);
    }
    LOG_DEBUG("Modem soft reboot");
    return at::Result::Code::OK;
}

VoLTEState NetworkSettings::getVoLTEConfigurationState()
{
    /** VoLTE on could be detect in general by one parameter,
     * based on enable IP multimedia services ON (via QCFG="ims")
     * but could be completed based on
     * NV state of VoLTE Disable
     *
     * This is information about configuration setup, not information
     * about whether the VoLTE actually works in the selected network
     *
     */
    if (auto state = getIMSState(); state) {
        /// check disable in any other state VoLTE is likely
        return state->first == at::response::qcfg_ims::IMSState::Disable ? VoLTEState::Off : VoLTEState::On;
    }
    return VoLTEState::Unknown;
}

std::string NetworkSettings::printVoLTEDebug()
{
    auto channel = cellularService.cmux->get(CellularMux::Channel::Commands);
    if (channel) {
        auto resp = channel->cmd("AT+QVOLTEDBG");
        if (resp.code == at::Result::Code::OK) {
            std::string buffer = "";
            for (auto el : resp.response) {
                buffer = el + "\r\n";
            }
            return buffer;
        }
    }
    return {};
}

M module-services/service-cellular/NetworkSettings.hpp => module-services/service-cellular/NetworkSettings.hpp +0 -15
@@ 56,27 56,12 @@ class NetworkSettings
     * @return
     */
    std::vector<std::string> scanOperators(bool fullInfoList = false);
    at::Result::Code setVoLTEState(VoLTEState state);

    /// This is information about configuration setup, not information
    /// about whether the VoLTE actually works in the selected network
    VoLTEState getVoLTEConfigurationState();

    at::Result::Code getPreferredVoiceDomain(VoiceDomainPreference &pref);
    at::Result::Code setPreferredVoiceDomain(VoiceDomainPreference pref);

    bool setOperatorAutoSelect();
    std::string getCurrentOperatorName() const;
    std::optional<at::response::cops::Operator> getCurrentOperator() const;
    at::Result::Code getPreferredSMSDomain(SMSDomainPreference &pref);
    at::Result::Code setPreferredSMSDomain(SMSDomainPreference pref);
    bool setOperator(at::response::cops::CopsMode mode, at::response::cops::NameFormat format, const std::string &name);

    at::Result::Code setIMSState(at::response::qcfg_ims::IMSState state);
    std::optional<std::pair<at::response::qcfg_ims::IMSState, at::response::qcfg_ims::VoLTEIMSState>> getIMSState();

    std::string printVoLTEDebug();

    enum class SimpleNAT
    {
        GSM,

M module-services/service-cellular/ServiceCellular.cpp => module-services/service-cellular/ServiceCellular.cpp +0 -33
@@ 239,10 239,6 @@ sys::ReturnCodes ServiceCellular::InitHandler()

    priv->state->set(State::ST::WaitForStartPermission);
    settings->registerValueChange(
        settings::Cellular::volte_on,
        [this](const std::string &value) { volteChanged(value); },
        ::settings::SettingsScope::Global);
    settings->registerValueChange(
        settings::Cellular::apn_list,
        [this](const std::string &value) { apnListChanged(value); },
        ::settings::SettingsScope::Global);


@@ 388,27 384,6 @@ void ServiceCellular::registerMessageHandlers()
        return handleCellularDeactivateContextMessage(msg);
    });

    connect(typeid(cellular::ChangeVoLTEDataMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<cellular::ChangeVoLTEDataMessage *>(request);
        volteOn  = msg->getVoLTEon();
        settings->setValue(settings::Cellular::volte_on, std::to_string(volteOn), settings::SettingsScope::Global);
        NetworkSettings networkSettings(*this);
        auto vstate = networkSettings.getVoLTEConfigurationState();
        if ((vstate != VoLTEState::On) && volteOn) {
            LOG_DEBUG("VoLTE On");
            if (networkSettings.setVoLTEState(VoLTEState::On) == at::Result::Code::OK) {
                priv->modemResetHandler->performSoftReset();
            }
        }
        else if (!volteOn) {
            LOG_DEBUG("VoLTE Off");
            if (networkSettings.setVoLTEState(VoLTEState::Off) == at::Result::Code::OK) {
                priv->modemResetHandler->performSoftReset();
            }
        }
        return std::make_shared<cellular::ResponseMessage>(true);
    });

    connect(typeid(cellular::SetFlightModeMessage), [&](sys::Message *request) -> sys::MessagePointer {
        auto msg = static_cast<cellular::SetFlightModeMessage *>(request);
        return handleCellularSetFlightModeMessage(msg);


@@ 1741,14 1716,6 @@ std::shared_ptr<cellular::SetOperatorResponse> ServiceCellular::handleCellularSe
        networkSettings.setOperator(msg->getMode(), msg->getFormat(), msg->getName()));
}

void ServiceCellular::volteChanged(const std::string &value)
{
    if (!value.empty()) {
        LOG_INFO("VoLTE setting state changed to '%s'.", value.c_str());
        volteOn = utils::getNumericValue<bool>(value);
    }
}

void ServiceCellular::apnListChanged(const std::string &value)
{
    if (!value.empty()) {

M module-services/service-cellular/service-cellular/CellularMessage.hpp => module-services/service-cellular/service-cellular/CellularMessage.hpp +0 -21
@@ 46,7 46,6 @@ class CellularMessage : public sys::DataMessage

        ListCurrentCalls,
        SimResponse, // Send to PIN window (show, error state, hide)
        SetVoLTE,
        SetFlightMode,

        PacketData, ///< for all PacketData messages


@@ 467,26 466,6 @@ namespace cellular
        {}
    };

    class VoLTEDataMessage : public CellularMessage
    {
        bool VoLTEon = false;

      public:
        explicit VoLTEDataMessage(bool VoLTEon) : CellularMessage{Type::SetVoLTE}, VoLTEon{VoLTEon}
        {}
        [[nodiscard]] bool getVoLTEon() const noexcept
        {
            return VoLTEon;
        }
    };

    class ChangeVoLTEDataMessage : public VoLTEDataMessage
    {
      public:
        explicit ChangeVoLTEDataMessage(bool VoLTEon) : VoLTEDataMessage{VoLTEon}
        {}
    };

    class CheckIfStartAllowedMessage : public sys::DataMessage
    {};


M module-services/service-cellular/service-cellular/CellularServiceAPI.hpp => module-services/service-cellular/service-cellular/CellularServiceAPI.hpp +0 -1
@@ 138,7 138,6 @@ namespace CellularServiceAPI

    bool SetDataTransfer(sys::Service *serv, packet_data::DataTransfer dt);
    bool GetDataTransfer(sys::Service *serv);
    bool SetVoLTE(sys::Service *serv, bool value);

    bool ChangeModulePowerState(sys::Service *serv, cellular::service::State::PowerState newState);


M module-services/service-cellular/service-cellular/ServiceCellular.hpp => module-services/service-cellular/service-cellular/ServiceCellular.hpp +0 -2
@@ 255,9 255,7 @@ class ServiceCellular : public sys::Service
    friend class ConnectionManagerCellularCommands;
    friend class cellular::Api;

    void volteChanged(const std::string &value);
    void apnListChanged(const std::string &value);
    bool volteOn = false;

    auto handleCellularAnswerIncomingCallMessage(CellularMessage *msg) -> std::shared_ptr<cellular::ResponseMessage>;
    auto handleCellularCallRequestMessage(cellular::CallRequestMessage *msg)

M module-services/service-db/agents/settings/SystemSettings.hpp => module-services/service-db/agents/settings/SystemSettings.hpp +0 -1
@@ 45,7 45,6 @@ namespace settings

    namespace Cellular
    {
        constexpr inline auto volte_on    = "cl_volte_on";
        constexpr inline auto apn_list    = "cl_apn_list";
        constexpr inline auto offlineMode = "cl_offline_mode";
        constexpr inline auto currentUID  = "cl_current_uid";