1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include <module-services/service-cellular/service-cellular/connection-manager/ConnectionManager.hpp>
#include <module-services/service-cellular/service-cellular/CellularMessage.hpp>
#include <module-cellular/at/Cmd.hpp>
auto ConnectionManager::onPhoneModeChange(sys::phone_modes::PhoneMode mode) -> bool
{
if (mode == sys::phone_modes::PhoneMode::Offline) {
forceDismissCallsFlag = true;
return handleModeChangeToCommonOffline();
}
forceDismissCallsFlag = false;
return handleModeChangeToConnected();
}
void ConnectionManager::onTimerTick()
{
if (connectionInterval.count() == 0 || isFlightMode) {
return;
}
minutesOfflineElapsed++;
if (minutesOfflineElapsed.count() >= connectionInterval.count()) {
minutesOfflineElapsed = static_cast<std::chrono::minutes>(0);
;
onlinePeriod = true;
cellular->connectToNetwork();
return;
}
if (onlinePeriod) {
minutesOnlineElapsed++;
if (minutesOnlineElapsed.count() >= connectedPeriod.count()) {
minutesOnlineElapsed = static_cast<std::chrono::minutes>(0);
onlinePeriod = false;
cellular->disconnectFromNetwork();
}
}
}
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)
{
isFlightMode = mode;
}
auto ConnectionManager::isMessagesOnlyMode() -> bool
{
return !isFlightMode && connectionInterval.count() != 0;
}
auto ConnectionManager::handleModeChangeToCommonOffline() -> bool
{
if (cellular->isConnectedToNetwork()) {
cellular->hangUpOngoingCall();
cellular->disconnectFromNetwork();
cellular->clearNetworkIndicator();
}
minutesOfflineElapsed = static_cast<std::chrono::minutes>(0);
;
minutesOnlineElapsed = static_cast<std::chrono::minutes>(0);
;
if (isMessagesOnlyMode()) {
handleModeChangeToMessageOnlyMode();
return true;
}
else {
handleModeChangeToOfflineMode();
return true;
}
}
void ConnectionManager::handleModeChangeToOfflineMode()
{
if (cellular->isConnectionTimerActive()) {
cellular->stopConnectionTimer();
onlinePeriod = false;
}
}
void ConnectionManager::handleModeChangeToMessageOnlyMode()
{
if (!cellular->isConnectionTimerActive()) {
cellular->startConnectionTimer();
}
}
auto ConnectionManager::handleModeChangeToConnected() -> bool
{
if (cellular->isConnectionTimerActive()) {
cellular->stopConnectionTimer();
onlinePeriod = false;
}
if (!cellular->isConnectedToNetwork()) {
cellular->connectToNetwork();
}
return true;
}
auto ConnectionManager::forceDismissCalls() -> bool
{
return forceDismissCallsFlag;
}