Skip to content

Commit db14c67

Browse files
committed
GSM: implement full state machine
1 parent 4addca0 commit db14c67

File tree

1 file changed

+143
-20
lines changed

1 file changed

+143
-20
lines changed

src/GSMConnectionManager.h

Lines changed: 143 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,45 +31,168 @@ class GSMConnectionManager : public ConnectionManager {
3131
GSM gsmAccess;
3232
GPRS gprs;
3333
private:
34+
35+
void changeConnectionState(NetworkConnectionState _newState);
36+
37+
const int CHECK_INTERVAL_IDLE = 100;
38+
const int CHECK_INTERVAL_INIT = 100;
39+
const int CHECK_INTERVAL_CONNECTING = 500;
40+
const int CHECK_INTERVAL_GETTIME = 1000;
41+
const int CHECK_INTERVAL_CONNECTED = 10000;
42+
const int CHECK_INTERVAL_RETRYING = 5000;
43+
const int CHECK_INTERVAL_DISCONNECTED = 1000;
44+
const int CHECK_INTERVAL_ERROR = 500;
45+
3446
const char *pin, *apn, *login, *pass;
35-
unsigned long lastNetworkCheck, lastNetworkStep;
47+
unsigned long lastConnectionTickTime, lastNetworkStep;
48+
int connectionTickTimeInterval;
3649
};
3750

3851
static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000;
3952

4053
GSMConnectionManager::GSMConnectionManager(const char *pin, const char *apn, const char *login, const char *pass) :
41-
pin(pin), apn(apn), login(login), pass(pass), lastNetworkCheck(millis()) {
54+
pin(pin),
55+
apn(apn),
56+
login(login),
57+
pass(pass),
58+
lastConnectionTickTime(millis()),
59+
connectionTickTimeInterval(CHECK_INTERVAL_IDLE) {
4260
}
4361

4462
unsigned long GSMConnectionManager::getTime() {
4563
return gsmAccess.getTime();
4664
}
4765

4866
void GSMConnectionManager::init() {
49-
if (gsmAccess.begin(pin) == GSM_READY && gprs.attachGPRS(apn, login, pass) == GPRS_READY) {
50-
Serial.println("GPRS connected");
51-
int pingResult = gprs.ping("google.com");
52-
if (pingResult >= 0) {
53-
Serial.print("SUCCESS! RTT = ");
54-
Serial.print(pingResult);
55-
Serial.println(" ms");
56-
}
67+
char msgBuffer[120];
68+
if (gsmAccess.begin(pin) == GSM_READY) {
69+
*msgBuffer = 0;
70+
sprintf(msgBuffer, "SIM card ok");
71+
debugMessage(msgBuffer, 2);
72+
gsmAccess.setTimeout(CHECK_INTERVAL_RETRYING);
5773
} else {
58-
Serial.println("GPRS not connected");
74+
*msgBuffer = 0;
75+
sprintf(msgBuffer, "SIM not present");
76+
debugMessage(msgBuffer, 2);
5977
while(1);
6078
}
6179
}
6280

63-
void GSMConnectionManager::check() {
64-
if (millis() - lastNetworkCheck < NETWORK_CONNECTION_INTERVAL) {
65-
return;
81+
void GSMConnectionManager::changeConnectionState(NetworkConnectionState _newState) {
82+
netConnectionState = _newState;
83+
int newInterval = CHECK_INTERVAL_IDLE;
84+
switch (_newState) {
85+
case CONNECTION_STATE_INIT:
86+
newInterval = CHECK_INTERVAL_INIT;
87+
break;
88+
case CONNECTION_STATE_CONNECTING:
89+
newInterval = CHECK_INTERVAL_CONNECTING;
90+
break;
91+
case CONNECTION_STATE_GETTIME:
92+
newInterval = CHECK_INTERVAL_GETTIME;
93+
break;
94+
case CONNECTION_STATE_CONNECTED:
95+
newInterval = CHECK_INTERVAL_CONNECTED;
96+
break;
97+
case CONNECTION_STATE_DISCONNECTED:
98+
newInterval = CHECK_INTERVAL_DISCONNECTED;
99+
break;
66100
}
101+
connectionTickTimeInterval = newInterval;
102+
lastConnectionTickTime = millis();
103+
}
67104

68-
Serial.print("<<Network Status: ");
69-
if (gprs.attachGPRS(apn, login, pass) == GPRS_READY) {
70-
Serial.println("CONNECTED");
71-
lastNetworkCheck = millis();
72-
} else {
73-
Serial.println("NOT CONNECTED");
105+
void GSMConnectionManager::check() {
106+
char msgBuffer[120];
107+
unsigned long now = millis();
108+
int networkStatus = 0;
109+
if (now - lastConnectionTickTime > connectionTickTimeInterval) {
110+
switch (netConnectionState) {
111+
case CONNECTION_STATE_IDLE:
112+
init();
113+
changeConnectionState(CONNECTION_STATE_INIT);
114+
break;
115+
case CONNECTION_STATE_INIT:
116+
// blocking call with 4th parameter == true
117+
networkStatus = gprs.attachGPRS(apn, login, pass, true);
118+
*msgBuffer = 0;
119+
sprintf(msgBuffer, "GPRS.attachGPRS(): %d", networkStatus);
120+
debugMessage(msgBuffer, 2);
121+
if (networkStatus == ERROR) {
122+
debugMessage("GPRS attach failed\nMake sure the antenna is connected", 0);
123+
changeConnectionState(CONNECTION_STATE_INIT);
124+
lastConnectionTickTime = now;
125+
return;
126+
}
127+
changeConnectionState(CONNECTION_STATE_CONNECTING);
128+
break;
129+
case CONNECTION_STATE_CONNECTING:
130+
*msgBuffer = 0;
131+
sprintf(msgBuffer, "Trying to ping external world");
132+
debugMessage(msgBuffer, 2);
133+
134+
networkStatus = gprs.ping("google.com");
135+
*msgBuffer = 0;
136+
sprintf(msgBuffer, "GSM.ping(): %d", networkStatus);
137+
debugMessage(msgBuffer, 2);
138+
if (networkStatus < 0) {
139+
*msgBuffer = 0;
140+
sprintf(msgBuffer, "Ping failed");
141+
debugMessage(msgBuffer, 0);
142+
143+
*msgBuffer = 0;
144+
sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
145+
debugMessage(msgBuffer, 2);
146+
changeConnectionState(CONNECTION_STATE_INIT);
147+
return;
148+
} else {
149+
*msgBuffer = 0;
150+
sprintf(msgBuffer, "Connected!");
151+
debugMessage(msgBuffer, 2);
152+
changeConnectionState(CONNECTION_STATE_GETTIME);
153+
return;
154+
}
155+
break;
156+
case CONNECTION_STATE_GETTIME:
157+
debugMessage("Acquiring Time from Network", 3);
158+
unsigned long networkTime;
159+
networkTime = getTime();
160+
*msgBuffer = 0;
161+
sprintf(msgBuffer, "Network Time: %u", networkTime);
162+
debugMessage(msgBuffer, 3);
163+
if(networkTime > lastValidTimestamp){
164+
lastValidTimestamp = networkTime;
165+
changeConnectionState(CONNECTION_STATE_CONNECTED);
166+
}
167+
break;
168+
case CONNECTION_STATE_CONNECTED:
169+
// keep testing connection
170+
networkStatus = gsmAccess.isAccessAlive();
171+
*msgBuffer = 0;
172+
sprintf(msgBuffer, "GPRS.isAccessAlive(): %d", networkStatus);
173+
debugMessage(msgBuffer, 2);
174+
if (networkStatus != 1) {
175+
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
176+
return;
177+
}
178+
*msgBuffer = 0;
179+
sprintf(msgBuffer, "Still connected");
180+
debugMessage(msgBuffer, 2);
181+
break;
182+
case CONNECTION_STATE_DISCONNECTED:
183+
gprs.detachGPRS();
184+
185+
*msgBuffer = 0;
186+
sprintf(msgBuffer, "DISC | GPRS.status(): %d", gprs.status());
187+
debugMessage(msgBuffer, 1);
188+
*msgBuffer = 0;
189+
sprintf(msgBuffer, "Connection lost.");
190+
debugMessage(msgBuffer, 0);
191+
debugMessage("Attempting reconnection", 1);
192+
changeConnectionState(CONNECTION_STATE_CONNECTING);
193+
//wifiClient.stop();
194+
break;
195+
}
196+
lastConnectionTickTime = now;
74197
}
75198
}

0 commit comments

Comments
 (0)