From 5f34f5ad7cefdcc72d4a9bac1d9554885c0ac0af Mon Sep 17 00:00:00 2001 From: Kuba Date: Thu, 8 Jul 2021 09:36:58 +0200 Subject: [PATCH] [EGD-6889] Fix Fixed network time handling Fixed Network time handling. Automati Date and Time setting is handled in service-cellular. Enabling and diasbling time repotring is added. --- .../service-cellular/CMakeLists.txt | 1 + .../service-cellular/CellularUrcHandler.cpp | 11 +--- .../service-cellular/ServiceCellular.cpp | 19 +++--- .../service-cellular/src/NetworkTime.cpp | 62 +++++++++++++++++++ .../service-cellular/src/NetworkTime.hpp | 49 +++++++++++++++ .../src/ServiceCellularPriv.cpp | 29 ++++++++- .../src/ServiceCellularPriv.hpp | 6 ++ module-services/service-time/ServiceTime.cpp | 7 +++ module-services/service-time/ServiceTime.hpp | 1 + .../service-time/service-time/TimeMessage.hpp | 22 +++++++ 10 files changed, 185 insertions(+), 22 deletions(-) create mode 100644 module-services/service-cellular/src/NetworkTime.cpp create mode 100644 module-services/service-cellular/src/NetworkTime.hpp diff --git a/module-services/service-cellular/CMakeLists.txt b/module-services/service-cellular/CMakeLists.txt index fad0d8388fa5409c00c0039f13bc24d7bf473a4d..ae1b6a03a4128450e4bb2e7e8b837c98fd78dc00 100644 --- a/module-services/service-cellular/CMakeLists.txt +++ b/module-services/service-cellular/CMakeLists.txt @@ -6,6 +6,7 @@ set(SOURCES src/State.cpp src/SimCard.cpp src/CallManager.cpp + src/NetworkTime.cpp CellularCall.cpp CellularServiceAPI.cpp diff --git a/module-services/service-cellular/CellularUrcHandler.cpp b/module-services/service-cellular/CellularUrcHandler.cpp index 3236bf43ce8f79dfea8bf2179c8bcf8352998c2c..a2d214a2c274f62f4626d93079f3da104d4037b6 100644 --- a/module-services/service-cellular/CellularUrcHandler.cpp +++ b/module-services/service-cellular/CellularUrcHandler.cpp @@ -14,11 +14,6 @@ using namespace at::urc; -// this static function will be replaced by Settings API -static bool isSettingsAutomaticTimeSyncEnabled() -{ - return true; -} void CellularUrcHandler::Handle(Clip &urc) { @@ -103,14 +98,10 @@ void CellularUrcHandler::Handle(Ctze &urc) return; } - if (isSettingsAutomaticTimeSyncEnabled()) { auto msg = std::make_shared( urc.getGMTTime(), urc.getTimeZoneOffset(), urc.getTimeZoneString()); cellularService.bus.sendUnicast(msg, service::name::service_time); - } - else { - LOG_DEBUG("Timezone sync disabled."); - } + urc.setHandled(true); } diff --git a/module-services/service-cellular/ServiceCellular.cpp b/module-services/service-cellular/ServiceCellular.cpp index f71fe61709133c35adbca8f2f68258c4793879d5..f86fbba1c8692efb7ddd268806b9e6ded7e82e8e 100644 --- a/module-services/service-cellular/ServiceCellular.cpp +++ b/module-services/service-cellular/ServiceCellular.cpp @@ -73,6 +73,7 @@ #include #include #include +#include #include #include #include @@ -184,12 +185,6 @@ ServiceCellular::~ServiceCellular() LOG_INFO("[ServiceCellular] Cleaning resources"); } -// this static function will be replaced by Settings API -static bool isSettingsAutomaticTimeSyncEnabled() -{ - return true; -} - void ServiceCellular::SleepTimerHandler() { auto currentTime = cpp_freertos::Ticks::TicksToMs(cpp_freertos::Ticks::GetTicks()); @@ -302,6 +297,7 @@ void ServiceCellular::registerMessageHandlers() }); priv->connectSimCard(); + priv->connectNetworkTime(); connect(typeid(CellularStartOperatorsScanMessage), [&](sys::Message *request) -> sys::MessagePointer { auto msg = static_cast(request); @@ -386,6 +382,8 @@ void ServiceCellular::registerMessageHandlers() auto msg = static_cast(request); if (typeid(*msg->event.get()) == typeid(sdesktop::developerMode::CellularHotStartEvent)) { priv->simCard->setChannel(nullptr); + priv->networkTime->setChannel(nullptr); + cmux->closeChannels(); ///> change state - simulate hot start handle_power_up_request(); @@ -854,7 +852,7 @@ bool ServiceCellular::handle_audio_conf_procedure() LOG_DEBUG("[ServiceCellular] Modem is fully operational"); priv->simCard->setChannel(cmux->get(CellularMux::Channel::Commands)); - + priv->networkTime->setChannel(cmux->get(CellularMux::Channel::Commands)); // open channel - notifications DLCChannel *notificationsChannel = cmux->get(CellularMux::Channel::Notifications); if (notificationsChannel != nullptr) { @@ -1398,10 +1396,9 @@ bool ServiceCellular::handle_URCReady() { auto channel = cmux->get(CellularMux::Channel::Commands); bool ret = true; - if (isSettingsAutomaticTimeSyncEnabled()) { - ret = ret && channel->cmd(at::AT::ENABLE_TIME_ZONE_UPDATE); - ret = ret && channel->cmd(at::AT::SET_TIME_ZONE_REPORTING); - } + + priv->requestNetworkTimeSettings(); + ret = ret && channel->cmd(at::AT::ENABLE_NETWORK_REGISTRATION_URC); bus.sendMulticast(cellular::api::ModemState::Ready); diff --git a/module-services/service-cellular/src/NetworkTime.cpp b/module-services/service-cellular/src/NetworkTime.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9ec6bcda6ad78ef0cd398a9962d0081184a42f9e --- /dev/null +++ b/module-services/service-cellular/src/NetworkTime.cpp @@ -0,0 +1,62 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "NetworkTime.hpp" + +#include +#include +#include + +#include + +#include +namespace cellular::service +{ + + void NetworkTime::setChannel(at::BaseChannel *channel) + { + this->channel = channel; + } + + std::shared_ptr NetworkTime::createSettingsRequest() + { + return std::make_shared(); + } + + void NetworkTime::processSettings(bool newValue) + { + if (isAutomaticDateAndTime == newValue) { + return; + } + isAutomaticDateAndTime = newValue; + + if (isAutomaticDateAndTime) { + enableTimeReporting(); + } + else { + disableTimeReporting(); + } + } + + void NetworkTime::enableTimeReporting() + { + if (channel == nullptr) { + LOG_ERROR("No channel provided. Request ignored"); + return; + } + channel->cmd(at::AT::ENABLE_TIME_ZONE_UPDATE); + channel->cmd(at::AT::SET_TIME_ZONE_REPORTING); + channel->cmd(at::AT::CFUN_DISABLE_TRANSMITTING); + channel->cmd(at::AT::CFUN_FULL_FUNCTIONALITY); + } + + void NetworkTime::disableTimeReporting() + { + if (channel == nullptr) { + LOG_ERROR("No channel provided. Request ignored"); + return; + } + channel->cmd(at::AT::DISABLE_TIME_ZONE_UPDATE); + channel->cmd(at::AT::DISABLE_TIME_ZONE_REPORTING); + } +}; // namespace cellular::service diff --git a/module-services/service-cellular/src/NetworkTime.hpp b/module-services/service-cellular/src/NetworkTime.hpp new file mode 100644 index 0000000000000000000000000000000000000000..bcf98fe3ea76471fa260905ed75971c002cf607c --- /dev/null +++ b/module-services/service-cellular/src/NetworkTime.hpp @@ -0,0 +1,49 @@ +// 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 + +namespace at +{ + class Cmd; + class BaseChannel; +} // namespace at + +namespace sys +{ + class Message; +} +namespace cellular::service +{ + class NetworkTime + { + public: + /** Set cmd channel + * \param channel channel (or nullptr to block communication) + */ + void setChannel(at::BaseChannel *channel); + /** + * Requests settings related to Network Time synchronisation + */ + std::shared_ptr createSettingsRequest(); + /** + * Handles settings related to Network Time synchronisation change + * @param newValue Autoamitc Date and Time setting value + */ + void processSettings(bool newValue); + + private: + at::BaseChannel *channel = nullptr; + bool isAutomaticDateAndTime = false; + /** + * It enables Network Time reporting + */ + void enableTimeReporting(); + /** + * It disables Network Time reporting + */ + void disableTimeReporting(); + }; +} // namespace cellular::service diff --git a/module-services/service-cellular/src/ServiceCellularPriv.cpp b/module-services/service-cellular/src/ServiceCellularPriv.cpp index 47efb20034225f6e35ce5451c20d0f1e55e006a7..2aac3b19a268d3a53546e0bd46b65743d3d8940f 100644 --- a/module-services/service-cellular/src/ServiceCellularPriv.cpp +++ b/module-services/service-cellular/src/ServiceCellularPriv.cpp @@ -9,10 +9,16 @@ #include #include +#include +#include + +using service::name::service_time; + namespace cellular::internal { ServiceCellularPriv::ServiceCellularPriv(ServiceCellular *owner) - : owner{owner}, simCard{std::make_unique()}, state{std::make_unique(owner)} + : owner{owner}, simCard{std::make_unique()}, state{std::make_unique(owner)}, + networkTime{std::make_unique()} { initSimCard(); } @@ -88,4 +94,25 @@ namespace cellular::internal }); } + void ServiceCellularPriv::connectNetworkTime() + { + owner->connect(typeid(stm::message::AutomaticDateAndTimeChangedMessage), + [&](sys::Message *request) -> sys::MessagePointer { + auto message = static_cast(request); + networkTime->processSettings(message->getValue()); + return sys::MessageNone{}; + }); + owner->connect(typeid(stm::message::GetAutomaticDateAndTimeResponse), + [&](sys::Message *request) -> sys::MessagePointer { + auto message = static_cast(request); + networkTime->processSettings(message->isAutomaticDateAndTime()); + return sys::MessageNone{}; + }); + } + + void ServiceCellularPriv::requestNetworkTimeSettings() + { + owner->bus.sendUnicast(networkTime->createSettingsRequest(), service_time); + } + } // namespace cellular::internal diff --git a/module-services/service-cellular/src/ServiceCellularPriv.hpp b/module-services/service-cellular/src/ServiceCellularPriv.hpp index 3a2a085ba632e3083defada97bdebaca0171a459..7bf75f1a07fbdf906fd15a7ce5bf182b9f15eb87 100644 --- a/module-services/service-cellular/src/ServiceCellularPriv.hpp +++ b/module-services/service-cellular/src/ServiceCellularPriv.hpp @@ -7,9 +7,11 @@ #include #include "SimCard.hpp" +#include "NetworkTime.hpp" namespace cellular::internal { + using service::NetworkTime; using service::SimCard; using service::State; @@ -19,6 +21,7 @@ namespace cellular::internal std::unique_ptr simCard; std::unique_ptr state; + std::unique_ptr networkTime; State::PowerState nextPowerState = State::PowerState::Off; @@ -26,6 +29,9 @@ namespace cellular::internal ServiceCellularPriv(ServiceCellular *owner); void connectSimCard(); + void connectNetworkTime(); + + void requestNetworkTimeSettings(); private: void initSimCard(); diff --git a/module-services/service-time/ServiceTime.cpp b/module-services/service-time/ServiceTime.cpp index 400fd53d74cb34d8bd245562226d2b1fcd098564..5d958e567bdc7ac724de9861432e14b54f577303 100644 --- a/module-services/service-time/ServiceTime.cpp +++ b/module-services/service-time/ServiceTime.cpp @@ -104,6 +104,8 @@ namespace stm timeManager->handleTimeChangeRequest(message->getTime()); return std::make_shared(); }); + connect(typeid(stm::message::GetAutomaticDateAndTimeRequest), + [&](sys::Message *request) -> sys::MessagePointer { return handleGetAutomaticDateAndTimeRequest(); }); } auto ServiceTime::handleSetAutomaticDateAndTimeRequest(sys::Message *request) @@ -215,4 +217,9 @@ namespace stm timeManager->handleTimezoneChangeRequest(timezoneRules); } + auto ServiceTime::handleGetAutomaticDateAndTimeRequest() -> std::shared_ptr + { + return std::make_shared(stm::api::isAutomaticDateAndTime()); + } + } /* namespace stm */ diff --git a/module-services/service-time/ServiceTime.hpp b/module-services/service-time/ServiceTime.hpp index e3e5e96954010efb3e0010851fcf7fdcff72f3eb..3f93ec55e3063266b07f74ec6b09576c891d33c3 100644 --- a/module-services/service-time/ServiceTime.hpp +++ b/module-services/service-time/ServiceTime.hpp @@ -39,6 +39,7 @@ namespace stm auto handleSetDateFormatRequest(sys::Message *request) -> std::shared_ptr; auto handleSetTimezoneRequest(sys::Message *request) -> std::shared_ptr; auto handleCellularTimeNotificationMessage(sys::Message *request) -> std::shared_ptr; + auto handleGetAutomaticDateAndTimeRequest() -> std::shared_ptr; void initStaticData(); public: diff --git a/module-services/service-time/service-time/TimeMessage.hpp b/module-services/service-time/service-time/TimeMessage.hpp index 9910072d014d63ecf401c43bf3554d05d77e43f0..63d745856cf5975532df755569bc7a5cf74c56c0 100644 --- a/module-services/service-time/service-time/TimeMessage.hpp +++ b/module-services/service-time/service-time/TimeMessage.hpp @@ -162,4 +162,26 @@ namespace stm::message private: std::string timezone; }; + + class GetAutomaticDateAndTimeRequest : public sys::DataMessage + { + public: + explicit GetAutomaticDateAndTimeRequest() : sys::DataMessage(MessageType::MessageTypeUninitialized) + {} + }; + + class GetAutomaticDateAndTimeResponse : public sys::ResponseMessage + { + public: + explicit GetAutomaticDateAndTimeResponse(bool settingValue) + : sys::ResponseMessage(), isAutomaticDateAndTimeOn(settingValue) + {} + auto isAutomaticDateAndTime() const noexcept + { + return isAutomaticDateAndTimeOn; + } + + private: + bool isAutomaticDateAndTimeOn = false; + }; } // namespace stm::message