Skip to content

Commit b141195

Browse files
committed
Separating GSMConnectionManager definition/implementation in a h/cpp file
1 parent bb2fb7d commit b141195

File tree

2 files changed

+186
-140
lines changed

2 files changed

+186
-140
lines changed

src/GSMConnectionManager.cpp

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
/*
2+
* This file is part of ArduinoIoTCloud.
3+
*
4+
* Copyright 2019 ARDUINO SA (http://www.arduino.cc/)
5+
*
6+
* This software is released under the GNU General Public License version 3,
7+
* which covers the main part of arduino-cli.
8+
* The terms of this license can be found at:
9+
* https://www.gnu.org/licenses/gpl-3.0.en.html
10+
*
11+
* You can be released from the requirements of the above licenses by purchasing
12+
* a commercial license. Buying such a license is mandatory if you want to modify or
13+
* otherwise use the software for commercial activities involving the Arduino
14+
* software without disclosing the source code of your own applications. To purchase
15+
* a commercial license, send an email to [email protected].
16+
*/
17+
18+
/******************************************************************************
19+
* INCLUDE
20+
******************************************************************************/
21+
22+
#include "GSMConnectionManager.h"
23+
24+
/******************************************************************************
25+
* CONSTANTS
26+
******************************************************************************/
27+
28+
static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000;
29+
30+
/******************************************************************************
31+
* CTOR/DTOR
32+
******************************************************************************/
33+
34+
GSMConnectionManager::GSMConnectionManager(const char *pin, const char *apn, const char *login, const char *pass) :
35+
pin(pin),
36+
apn(apn),
37+
login(login),
38+
pass(pass),
39+
lastConnectionTickTime(millis()),
40+
connectionTickTimeInterval(CHECK_INTERVAL_IDLE),
41+
getTimeRetries(MAX_GETTIME_RETRIES) {
42+
}
43+
44+
/******************************************************************************
45+
* PUBLIC MEMBER FUNCTIONS
46+
******************************************************************************/
47+
48+
void GSMConnectionManager::init() {
49+
char msgBuffer[120];
50+
if (gsmAccess.begin(pin) == GSM_READY) {
51+
debugMessage("SIM card ok", 2);
52+
gsmAccess.setTimeout(CHECK_INTERVAL_RETRYING);
53+
changeConnectionState(CONNECTION_STATE_CONNECTING);
54+
} else {
55+
debugMessage("SIM not present or wrong PIN", 0);
56+
while(1);
57+
}
58+
}
59+
60+
unsigned long GSMConnectionManager::getTime() {
61+
return gsmAccess.getTime();
62+
}
63+
64+
void GSMConnectionManager::check() {
65+
char msgBuffer[120];
66+
unsigned long const now = millis();
67+
int gsmAccessAlive;
68+
if (now - lastConnectionTickTime > connectionTickTimeInterval) {
69+
switch (netConnectionState) {
70+
case CONNECTION_STATE_INIT:
71+
init();
72+
break;
73+
case CONNECTION_STATE_CONNECTING:
74+
// NOTE: Blocking Call when 4th parameter == true
75+
GSM3_NetworkStatus_t networkStatus;
76+
networkStatus = gprs.attachGPRS(apn, login, pass, true);
77+
sprintf(msgBuffer, "GPRS.attachGPRS(): %d", networkStatus);
78+
debugMessage(msgBuffer, 3);
79+
if (networkStatus == GSM3_NetworkStatus_t::ERROR) {
80+
// NO FURTHER ACTION WILL FOLLOW THIS
81+
changeConnectionState(CONNECTION_STATE_ERROR);
82+
return;
83+
}
84+
debugMessage("Sending PING to outer space...", 2);
85+
int pingResult;
86+
pingResult = gprs.ping("time.arduino.cc");
87+
sprintf(msgBuffer, "GSM.ping(): %d", pingResult);
88+
debugMessage(msgBuffer, 2);
89+
if (pingResult < 0) {
90+
debugMessage("PING failed", 0);
91+
sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
92+
debugMessage(msgBuffer, 2);
93+
return;
94+
} else {
95+
sprintf(msgBuffer, "Connected to GPRS Network");
96+
debugMessage(msgBuffer, 2);
97+
changeConnectionState(CONNECTION_STATE_GETTIME);
98+
return;
99+
}
100+
break;
101+
case CONNECTION_STATE_GETTIME:
102+
debugMessage("Acquiring Time from Network", 3);
103+
unsigned long networkTime;
104+
networkTime = getTime();
105+
debugMessage(".", 3, false, false);
106+
if(networkTime > lastValidTimestamp){
107+
lastValidTimestamp = networkTime;
108+
sprintf(msgBuffer, "Network Time: %u", networkTime);
109+
debugMessage(msgBuffer, 3);
110+
changeConnectionState(CONNECTION_STATE_CONNECTED);
111+
}else if(gsmAccess.isAccessAlive() != 1){
112+
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
113+
}else if (!getTimeRetries--) {
114+
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
115+
}
116+
break;
117+
case CONNECTION_STATE_CONNECTED:
118+
gsmAccessAlive = gsmAccess.isAccessAlive();
119+
sprintf(msgBuffer, "GPRS.isAccessAlive(): %d", gsmAccessAlive);
120+
debugMessage(msgBuffer, 4);
121+
if (gsmAccessAlive != 1) {
122+
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
123+
return;
124+
}
125+
sprintf(msgBuffer, "Connected to Cellular Network");
126+
debugMessage(msgBuffer, 4);
127+
break;
128+
case CONNECTION_STATE_DISCONNECTED:
129+
gprs.detachGPRS();
130+
changeConnectionState(CONNECTION_STATE_CONNECTING);
131+
break;
132+
}
133+
lastConnectionTickTime = now;
134+
}
135+
}
136+
137+
/******************************************************************************
138+
* PRIVATE MEMBER FUNCTIONS
139+
******************************************************************************/
140+
141+
void GSMConnectionManager::changeConnectionState(NetworkConnectionState _newState) {
142+
char msgBuffer[120];
143+
int newInterval = CHECK_INTERVAL_IDLE;
144+
switch (_newState) {
145+
case CONNECTION_STATE_INIT:
146+
newInterval = CHECK_INTERVAL_INIT;
147+
break;
148+
case CONNECTION_STATE_CONNECTING:
149+
sprintf(msgBuffer, "Connecting to Cellular Network");
150+
debugMessage(msgBuffer, 2);
151+
newInterval = CHECK_INTERVAL_CONNECTING;
152+
break;
153+
case CONNECTION_STATE_GETTIME:
154+
debugMessage("Acquiring Time from Network", 3);
155+
newInterval = CHECK_INTERVAL_GETTIME;
156+
getTimeRetries = MAX_GETTIME_RETRIES;
157+
break;
158+
case CONNECTION_STATE_CONNECTED:
159+
newInterval = CHECK_INTERVAL_CONNECTED;
160+
break;
161+
case CONNECTION_STATE_DISCONNECTED:
162+
if(netConnectionState == CONNECTION_STATE_CONNECTED){
163+
debugMessage("Disconnected from Cellular Network", 0);
164+
debugMessage("Attempting reconnection", 0);
165+
}else if(netConnectionState == CONNECTION_STATE_GETTIME){
166+
debugMessage("Connection to Cellular Network lost during Time acquisition.\nAttempting reconnection", 0);
167+
}
168+
newInterval = CHECK_INTERVAL_DISCONNECTED;
169+
break;
170+
case CONNECTION_STATE_ERROR:
171+
debugMessage("GPRS attach failed\nMake sure the antenna is connected and reset your board.", 0);
172+
break;
173+
}
174+
connectionTickTimeInterval = newInterval;
175+
lastConnectionTickTime = millis();
176+
netConnectionState = _newState;
177+
}

src/GSMConnectionManager.h

Lines changed: 9 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,22 @@
1515
* a commercial license, send an email to [email protected].
1616
*/
1717

18+
/******************************************************************************
19+
* INCLUDE
20+
******************************************************************************/
21+
1822
#include "ConnectionManager.h"
1923

24+
/******************************************************************************
25+
* CLASS DECLARATION
26+
******************************************************************************/
27+
2028
class GSMConnectionManager : public ConnectionManager {
2129
public:
2230
GSMConnectionManager(const char *pin, const char *apn, const char *login, const char *pass);
2331

24-
virtual unsigned long getTime();
2532
virtual void init();
33+
virtual unsigned long getTime();
2634
virtual void check();
2735
virtual Client &getClient() { return networkClient; };
2836
virtual UDP &getUDP() { return udp; };
@@ -53,142 +61,3 @@ class GSMConnectionManager : public ConnectionManager {
5361
int connectionTickTimeInterval;
5462

5563
};
56-
57-
static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000;
58-
59-
GSMConnectionManager::GSMConnectionManager(const char *pin, const char *apn, const char *login, const char *pass) :
60-
pin(pin),
61-
apn(apn),
62-
login(login),
63-
pass(pass),
64-
lastConnectionTickTime(millis()),
65-
connectionTickTimeInterval(CHECK_INTERVAL_IDLE),
66-
getTimeRetries(MAX_GETTIME_RETRIES) {
67-
}
68-
69-
unsigned long GSMConnectionManager::getTime() {
70-
return gsmAccess.getTime();
71-
}
72-
73-
void GSMConnectionManager::init() {
74-
char msgBuffer[120];
75-
if (gsmAccess.begin(pin) == GSM_READY) {
76-
debugMessage("SIM card ok", 2);
77-
gsmAccess.setTimeout(CHECK_INTERVAL_RETRYING);
78-
changeConnectionState(CONNECTION_STATE_CONNECTING);
79-
} else {
80-
debugMessage("SIM not present or wrong PIN", 0);
81-
while(1);
82-
}
83-
}
84-
85-
void GSMConnectionManager::changeConnectionState(NetworkConnectionState _newState) {
86-
char msgBuffer[120];
87-
int newInterval = CHECK_INTERVAL_IDLE;
88-
switch (_newState) {
89-
case CONNECTION_STATE_INIT:
90-
newInterval = CHECK_INTERVAL_INIT;
91-
break;
92-
case CONNECTION_STATE_CONNECTING:
93-
sprintf(msgBuffer, "Connecting to Cellular Network");
94-
debugMessage(msgBuffer, 2);
95-
newInterval = CHECK_INTERVAL_CONNECTING;
96-
break;
97-
case CONNECTION_STATE_GETTIME:
98-
debugMessage("Acquiring Time from Network", 3);
99-
newInterval = CHECK_INTERVAL_GETTIME;
100-
getTimeRetries = MAX_GETTIME_RETRIES;
101-
break;
102-
case CONNECTION_STATE_CONNECTED:
103-
newInterval = CHECK_INTERVAL_CONNECTED;
104-
break;
105-
case CONNECTION_STATE_DISCONNECTED:
106-
if(netConnectionState == CONNECTION_STATE_CONNECTED){
107-
debugMessage("Disconnected from Cellular Network", 0);
108-
debugMessage("Attempting reconnection", 0);
109-
}else if(netConnectionState == CONNECTION_STATE_GETTIME){
110-
debugMessage("Connection to Cellular Network lost during Time acquisition.\nAttempting reconnection", 0);
111-
}
112-
newInterval = CHECK_INTERVAL_DISCONNECTED;
113-
break;
114-
case CONNECTION_STATE_ERROR:
115-
debugMessage("GPRS attach failed\nMake sure the antenna is connected and reset your board.", 0);
116-
break;
117-
}
118-
connectionTickTimeInterval = newInterval;
119-
lastConnectionTickTime = millis();
120-
netConnectionState = _newState;
121-
}
122-
123-
void GSMConnectionManager::check() {
124-
char msgBuffer[120];
125-
unsigned long const now = millis();
126-
int gsmAccessAlive;
127-
if (now - lastConnectionTickTime > connectionTickTimeInterval) {
128-
switch (netConnectionState) {
129-
case CONNECTION_STATE_INIT:
130-
init();
131-
break;
132-
case CONNECTION_STATE_CONNECTING:
133-
// NOTE: Blocking Call when 4th parameter == true
134-
GSM3_NetworkStatus_t networkStatus;
135-
networkStatus = gprs.attachGPRS(apn, login, pass, true);
136-
sprintf(msgBuffer, "GPRS.attachGPRS(): %d", networkStatus);
137-
debugMessage(msgBuffer, 3);
138-
if (networkStatus == GSM3_NetworkStatus_t::ERROR) {
139-
// NO FURTHER ACTION WILL FOLLOW THIS
140-
changeConnectionState(CONNECTION_STATE_ERROR);
141-
return;
142-
}
143-
debugMessage("Sending PING to outer space...", 2);
144-
int pingResult;
145-
pingResult = gprs.ping("time.arduino.cc");
146-
sprintf(msgBuffer, "GSM.ping(): %d", pingResult);
147-
debugMessage(msgBuffer, 2);
148-
if (pingResult < 0) {
149-
debugMessage("PING failed", 0);
150-
sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
151-
debugMessage(msgBuffer, 2);
152-
return;
153-
} else {
154-
sprintf(msgBuffer, "Connected to GPRS Network");
155-
debugMessage(msgBuffer, 2);
156-
changeConnectionState(CONNECTION_STATE_GETTIME);
157-
return;
158-
}
159-
break;
160-
case CONNECTION_STATE_GETTIME:
161-
debugMessage("Acquiring Time from Network", 3);
162-
unsigned long networkTime;
163-
networkTime = getTime();
164-
debugMessage(".", 3, false, false);
165-
if(networkTime > lastValidTimestamp){
166-
lastValidTimestamp = networkTime;
167-
sprintf(msgBuffer, "Network Time: %u", networkTime);
168-
debugMessage(msgBuffer, 3);
169-
changeConnectionState(CONNECTION_STATE_CONNECTED);
170-
}else if(gsmAccess.isAccessAlive() != 1){
171-
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
172-
}else if (!getTimeRetries--) {
173-
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
174-
}
175-
break;
176-
case CONNECTION_STATE_CONNECTED:
177-
gsmAccessAlive = gsmAccess.isAccessAlive();
178-
sprintf(msgBuffer, "GPRS.isAccessAlive(): %d", gsmAccessAlive);
179-
debugMessage(msgBuffer, 4);
180-
if (gsmAccessAlive != 1) {
181-
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
182-
return;
183-
}
184-
sprintf(msgBuffer, "Connected to Cellular Network");
185-
debugMessage(msgBuffer, 4);
186-
break;
187-
case CONNECTION_STATE_DISCONNECTED:
188-
gprs.detachGPRS();
189-
changeConnectionState(CONNECTION_STATE_CONNECTING);
190-
break;
191-
}
192-
lastConnectionTickTime = now;
193-
}
194-
}

0 commit comments

Comments
 (0)