[EGD-7909] Fixed phone mode switching

Service cellular is holding minimum cpu frequency during
phone mode switch.
This commit is contained in:
Kuba
2021-11-17 13:43:44 +01:00
committed by Kuba Kleczkowski
parent 1e604614bf
commit 69cf2575cc
10 changed files with 50 additions and 6 deletions

View File

@@ -13,7 +13,7 @@ namespace at
namespace cmd
{
using namespace std::chrono_literals;
CFUN::CFUN(at::cmd::Modifier mod) noexcept : Cmd("AT+CFUN", mod, 150s)
CFUN::CFUN(at::cmd::Modifier mod) noexcept : Cmd("AT+CFUN", mod, 17s)
{}
CFUN::CFUN() noexcept : CFUN(at::cmd::Modifier::None)

View File

@@ -2277,3 +2277,7 @@ auto ServiceCellular::logTetheringCalls() -> void
tetheringCalllog.clear();
}
}
TaskHandle_t ServiceCellular::getTaskHandle()
{
return xTaskGetCurrentTaskHandle();
}

View File

@@ -7,6 +7,8 @@
auto ConnectionManager::onPhoneModeChange(sys::phone_modes::PhoneMode mode) -> bool
{
cellular->holdMinimumCpuFrequency();
if (mode == sys::phone_modes::PhoneMode::Offline) {
forceDismissCallsFlag = true;
return handleModeChangeToCommonOffline();
@@ -24,8 +26,8 @@ void ConnectionManager::onTimerTick()
minutesOfflineElapsed++;
if (minutesOfflineElapsed.count() >= connectionInterval.count()) {
minutesOfflineElapsed = static_cast<std::chrono::minutes>(0);
;
onlinePeriod = true;
cellular->holdMinimumCpuFrequency();
cellular->connectToNetwork();
return;
}
@@ -34,6 +36,7 @@ void ConnectionManager::onTimerTick()
if (minutesOnlineElapsed.count() >= connectedPeriod.count()) {
minutesOnlineElapsed = static_cast<std::chrono::minutes>(0);
onlinePeriod = false;
cellular->holdMinimumCpuFrequency();
cellular->disconnectFromNetwork();
}
}
@@ -43,9 +46,7 @@ void ConnectionManager::setInterval(const std::chrono::minutes interval)
{
connectionInterval = interval;
minutesOnlineElapsed = static_cast<std::chrono::minutes>(0);
;
minutesOfflineElapsed = static_cast<std::chrono::minutes>(0);
;
}
void ConnectionManager::setFlightMode(const bool mode)
@@ -67,9 +68,7 @@ auto ConnectionManager::handleModeChangeToCommonOffline() -> bool
}
minutesOfflineElapsed = static_cast<std::chrono::minutes>(0);
;
minutesOnlineElapsed = static_cast<std::chrono::minutes>(0);
;
if (isMessagesOnlyMode()) {
handleModeChangeToMessageOnlyMode();

View File

@@ -97,3 +97,12 @@ void ConnectionManagerCellularCommands::stopConnectionTimer()
{
cellular.connectionTimer.stop();
}
void ConnectionManagerCellularCommands::holdMinimumCpuFrequency()
{
auto handle = cellular.getTaskHandle();
if (cellular.cpuSentinel) {
cellular.cpuSentinel->HoldMinimumFrequencyAndWait(bsp::CpuFrequencyHz::Level_4, handle, 2000);
}
return;
}

View File

@@ -316,6 +316,7 @@ class ServiceCellular : public sys::Service
private:
std::unique_ptr<cellular::internal::ServiceCellularPriv> priv;
cellular::internal::SimpleCallManager callManager;
TaskHandle_t getTaskHandle();
};
namespace sys

View File

@@ -20,6 +20,7 @@ class ConnectionManagerCellularCommands : public ConnectionManagerCellularComman
auto isConnectionTimerActive() -> bool final;
void startConnectionTimer() final;
void stopConnectionTimer() final;
void holdMinimumCpuFrequency() final;
private:
ServiceCellular &cellular;

View File

@@ -49,4 +49,8 @@ class ConnectionManagerCellularCommandsInterface
* @brief Stops connectionTimer
*/
virtual void stopConnectionTimer() = 0;
/**
* @brief Holds minimum cpu frequency
*/
virtual void holdMinimumCpuFrequency() = 0;
};

View File

@@ -20,6 +20,7 @@ class MockCellular : public ConnectionManagerCellularCommandsInterface
MOCK_METHOD(bool, isConnectionTimerActive, (), (override));
MOCK_METHOD(void, startConnectionTimer, (), (override));
MOCK_METHOD(void, stopConnectionTimer, (), (override));
MOCK_METHOD(void, holdMinimumCpuFrequency, (), (override));
};
TEST(ConnectionManager, onPhoneModeChange)

View File

@@ -38,9 +38,27 @@ namespace sys
void CpuSentinel::CpuFrequencyHasChanged(bsp::CpuFrequencyHz newFrequency)
{
currentFrequency = newFrequency;
if (callback) {
callback(newFrequency);
}
if (taskHandle != nullptr && newFrequency >= currentFrequencyToHold) {
xTaskNotifyGive(taskHandle);
taskHandle = nullptr;
}
}
bool CpuSentinel::HoldMinimumFrequencyAndWait(bsp::CpuFrequencyHz frequencyToHold,
TaskHandle_t taskToNotify,
uint32_t timeout)
{
HoldMinimumFrequency(frequencyToHold);
if (currentFrequencyToHold < frequencyToHold) {
taskHandle = taskToNotify;
return ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(timeout)) == 0;
}
return true;
}
} // namespace sys

View File

@@ -8,6 +8,7 @@
#include <string>
#include <functional>
#include <atomic>
namespace sys
{
@@ -26,18 +27,24 @@ namespace sys
[[nodiscard]] auto GetName() const noexcept -> std::string;
void HoldMinimumFrequency(bsp::CpuFrequencyHz frequencyToHold);
bool HoldMinimumFrequencyAndWait(bsp::CpuFrequencyHz frequencyToHold,
TaskHandle_t taskToNotify,
uint32_t timeout);
void ReleaseMinimumFrequency();
void CpuFrequencyHasChanged(bsp::CpuFrequencyHz newFrequency);
protected:
const std::string name;
bsp::CpuFrequencyHz currentFrequencyToHold{bsp::CpuFrequencyHz::Level_0};
std::atomic<bsp::CpuFrequencyHz> currentFrequency{bsp::CpuFrequencyHz::Level_0};
sys::Service *owner{nullptr};
/// function called from the PowerManager context
/// to update resources immediately
/// critical section or mutex support necessary
std::function<void(bsp::CpuFrequencyHz)> callback;
TaskHandle_t taskHandle = nullptr;
};
} // namespace sys