From 759bee96be87ead9957a007251b7c8b55f9374b1 Mon Sep 17 00:00:00 2001 From: breichel Date: Thu, 7 Jan 2021 10:28:52 +0100 Subject: [PATCH] [EGD-4919] Add API functionality to set operator Functionality for set operator (with name) and set autoselect were added. --- module-cellular/at/response.hpp | 35 +++++++++++++ .../service-cellular/CellularServiceAPI.cpp | 15 ++++++ .../service-cellular/NetworkSettings.cpp | 28 ++++++++++ .../service-cellular/NetworkSettings.hpp | 3 ++ .../service-cellular/ServiceCellular.cpp | 18 +++++++ .../service-cellular/CellularMessage.hpp | 52 +++++++++++++++++++ .../service-cellular/CellularServiceAPI.hpp | 7 +++ .../service-cellular/ServiceCellular.hpp | 4 +- 8 files changed, 161 insertions(+), 1 deletion(-) diff --git a/module-cellular/at/response.hpp b/module-cellular/at/response.hpp index fd1b2402b2741f187dec59aa9f43db59a9522a1d..0c00036ff563d254fa3eebccaf4921a6b0e7874a 100644 --- a/module-cellular/at/response.hpp +++ b/module-cellular/at/response.hpp @@ -56,6 +56,13 @@ namespace at CDMA = 100 }; + enum class NameFormat + { + Long = 0, + Short = 1, + Numeric = 2 + }; + class Operator { public: @@ -64,6 +71,34 @@ namespace at std::string longName; std::string numericName; std::optional technology = std::nullopt; + + std::string getNameByFormat(NameFormat format) + { + switch (format) { + case NameFormat::Long: + return longName; + case NameFormat::Short: + return shortName; + case NameFormat::Numeric: + return numericName; + } + return {}; + } + + void setNameByFormat(NameFormat format, const std::string &name) + { + switch (format) { + case NameFormat::Long: + longName = name; + break; + case NameFormat::Short: + shortName = name; + break; + case NameFormat::Numeric: + numericName = name; + break; + } + } }; } // namespace cops diff --git a/module-services/service-cellular/CellularServiceAPI.cpp b/module-services/service-cellular/CellularServiceAPI.cpp index 1a42c258aa5967cd0caa6af7397b4901b1d049c2..55d242936fb5fd196cc282b90d529bb031404a46 100644 --- a/module-services/service-cellular/CellularServiceAPI.cpp +++ b/module-services/service-cellular/CellularServiceAPI.cpp @@ -119,6 +119,21 @@ void CellularServiceAPI::StartOperatorsScan(sys::Service *serv, bool fullInfo) sys::Bus::SendUnicast(msg, ServiceCellular::serviceName, serv); } +void CellularServiceAPI::SetOperatorAutoSelect(sys::Service *serv) +{ + auto msg = std::make_shared(); + sys::Bus::SendUnicast(msg, ServiceCellular::serviceName, serv); +} + +void CellularServiceAPI::SetOperator(sys::Service *serv, + at::response::cops::CopsMode mode, + at::response::cops::NameFormat format, + const std::string &name) +{ + auto msg = std::make_shared(mode, format, name); + sys::Bus::SendUnicast(msg, ServiceCellular::serviceName, serv); +} + bool CellularServiceAPI::SelectAntenna(sys::Service *serv, bsp::cellular::antenna antenna) { auto msg = std::make_shared(MessageType::CellularSelectAntenna); diff --git a/module-services/service-cellular/NetworkSettings.cpp b/module-services/service-cellular/NetworkSettings.cpp index 2d64aa60c12e366ea7e4ee55aae79c310fee6e5b..50f15840f64fc81d527f0d408c51053a879051b3 100644 --- a/module-services/service-cellular/NetworkSettings.cpp +++ b/module-services/service-cellular/NetworkSettings.cpp @@ -54,3 +54,31 @@ std::vector NetworkSettings::scanOperators(bool fullInfoList) return operatorNames; } + +bool NetworkSettings::setOperatorAutoSelect() +{ + auto channel = cellularService.cmux->get(TS0710::Channel::Commands); + if (!channel) { + return false; + } + + at::Cmd buildCmd = + at::factory(at::AT::COPS) + "=" + utils::to_string(static_cast(at::response::cops::CopsMode::Automatic)); + 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) +{ + auto channel = cellularService.cmux->get(TS0710::Channel::Commands); + if (!channel) { + return false; + } + + at::Cmd buildCmd = at::factory(at::AT::COPS) + "=" + utils::to_string(static_cast(mode)) + "," + + utils::to_string(static_cast(format)) + ",\"" + name + "\""; + + auto resp = channel->cmd(buildCmd); + return (resp.code == at::Result::Code::OK); +} diff --git a/module-services/service-cellular/NetworkSettings.hpp b/module-services/service-cellular/NetworkSettings.hpp index 3336600bd4d1d1a9b482e34693e86d452529aaca..1142dcf53f5d23e75c804d160274d6b2bbe87360 100644 --- a/module-services/service-cellular/NetworkSettings.hpp +++ b/module-services/service-cellular/NetworkSettings.hpp @@ -25,6 +25,9 @@ class NetworkSettings */ std::vector scanOperators(bool fullInfoList = false); + bool setOperatorAutoSelect(); + bool setOperator(at::response::cops::CopsMode mode, at::response::cops::NameFormat format, const std::string &name); + private: ServiceCellular &cellularService; }; diff --git a/module-services/service-cellular/ServiceCellular.cpp b/module-services/service-cellular/ServiceCellular.cpp index 486eca3290e8db7d2577121d7f63a65d8f8455da..9e7b498a0eeaab7177ca52cc3407fc0172318223 100644 --- a/module-services/service-cellular/ServiceCellular.cpp +++ b/module-services/service-cellular/ServiceCellular.cpp @@ -2100,3 +2100,21 @@ std::shared_ptr ServiceCellular::handleCellul { return std::make_shared(packetData->getActiveContexts()); } + +std::shared_ptr ServiceCellular::handleCellularSetOperatorAutoSelect( + CellularSetOperatorAutoSelectMessage *msg) +{ + LOG_INFO("CellularSetOperatorAutoSelect handled"); + + NetworkSettings networkSettings(*this); + return std::make_shared(networkSettings.setOperatorAutoSelect()); +} + +std::shared_ptr ServiceCellular::handleCellularSetOperator(CellularSetOperatorMessage *msg) +{ + LOG_INFO("CellularSetOperatorAutoSelect handled"); + + NetworkSettings networkSettings(*this); + return std::make_shared( + networkSettings.setOperator(msg->getMode(), msg->getFormat(), msg->getName())); +} diff --git a/module-services/service-cellular/service-cellular/CellularMessage.hpp b/module-services/service-cellular/service-cellular/CellularMessage.hpp index 8941859085cc8cd2c0695b351051407833b9fb1d..d7c39385e67ea2a7905a4c5d5819a1ab8aa1783c 100644 --- a/module-services/service-cellular/service-cellular/CellularMessage.hpp +++ b/module-services/service-cellular/service-cellular/CellularMessage.hpp @@ -14,6 +14,8 @@ #include #include +#include + #include #include @@ -86,6 +88,41 @@ class CellularNotificationMessage : public CellularMessage std::string data; }; +class CellularSetOperatorAutoSelectMessage : public sys::Message +{ + public: + CellularSetOperatorAutoSelectMessage() + {} +}; + +class CellularSetOperatorMessage : public sys::Message +{ + at::response::cops::CopsMode mode; + at::response::cops::NameFormat format; + const std::string name; + + public: + explicit CellularSetOperatorMessage(at::response::cops::CopsMode mode, + at::response::cops::NameFormat format, + std::string name) + : mode(mode), format(format), name(std::move(name)) + {} + + at::response::cops::CopsMode getMode() const noexcept + { + return mode; + } + at::response::cops::NameFormat getFormat() const noexcept + { + return format; + } + + std::string getName() const + { + return name; + } +}; + class CellularStartOperatorsScanMessage : public CellularMessage { bool fullInfo = false; @@ -622,6 +659,21 @@ class CellularMMIPushMessage : public CellularMMIDataMessage, public app::manage sender, app::manager::actions::ShowMMIPush, std::make_unique(params)); } }; + +class CellularSetOperatorAutoSelectResponse : public CellularResponseMessage +{ + public: + explicit CellularSetOperatorAutoSelectResponse(bool ret) : CellularResponseMessage(ret) + {} +}; + +class CellularSetOperatorResponse : public CellularResponseMessage +{ + public: + explicit CellularSetOperatorResponse(bool ret) : CellularResponseMessage(ret) + {} +}; + namespace cellular { diff --git a/module-services/service-cellular/service-cellular/CellularServiceAPI.hpp b/module-services/service-cellular/service-cellular/CellularServiceAPI.hpp index 1a5549de8616e086322e52e7dbd268363cb3931c..06419b7cddbc292d2f34a6882711a5c35c579505 100644 --- a/module-services/service-cellular/service-cellular/CellularServiceAPI.hpp +++ b/module-services/service-cellular/service-cellular/CellularServiceAPI.hpp @@ -50,6 +50,13 @@ namespace CellularServiceAPI * */ void StartOperatorsScan(sys::Service *serv, bool fullInfo = false); + + void SetOperatorAutoSelect(sys::Service *serv); + void SetOperator(sys::Service *serv, + at::response::cops::CopsMode mode, + at::response::cops::NameFormat format, + const std::string &name); + /* * @brief It calls service-cellulat to switch antenna * @param serv pointer to caller service. diff --git a/module-services/service-cellular/service-cellular/ServiceCellular.hpp b/module-services/service-cellular/service-cellular/ServiceCellular.hpp index 684f50519b54c36ae455c00e1dfeaac9b5a8496a..44ad9c4208eba975f098bc59258c54ed99dfbd94 100644 --- a/module-services/service-cellular/service-cellular/ServiceCellular.hpp +++ b/module-services/service-cellular/service-cellular/ServiceCellular.hpp @@ -269,9 +269,11 @@ class ServiceCellular : public sys::Service std::shared_ptr handleCellularStartOperatorsScan( CellularStartOperatorsScanMessage *msg); - + std::shared_ptr handleCellularSetOperatorAutoSelect( + CellularSetOperatorAutoSelectMessage *msg); std::shared_ptr handleCellularGetAPNMessage(CellularGetAPNMessage *msg); std::shared_ptr handleCellularSetAPNMessage(CellularSetAPNMessage *msg); + std::shared_ptr handleCellularSetOperator(CellularSetOperatorMessage *msg); std::shared_ptr handleCellularSetDataTransferMessage( CellularSetDataTransferMessage *msg); std::shared_ptr handleCellularGetDataTransferMessage(