1515 * a commercial license, send an email to license@arduino.cc.
1616 */
1717
18+ /*
19+ TODO: REMOVE AFTER FIX [FOR REFERENCE ONLY]
20+ enum GSM3_NetworkStatus_t
21+ {
22+ ERROR,
23+ IDLE,
24+ CONNECTING,
25+ GSM_READY,
26+ GPRS_READY,
27+ TRANSPARENT_CONNECTED,
28+ GSM_OFF
29+ };
30+
31+ */
1832#include < MKRGSM.h>
1933#include " ConnectionManager.h"
2034
@@ -45,12 +59,14 @@ class GSMConnectionManager : public ConnectionManager {
4559 const int CHECK_INTERVAL_DISCONNECTED = 1000 ;
4660 const int CHECK_INTERVAL_ERROR = 500 ;
4761
62+ const int MAX_GETTIME_RETRY = 30 ;
63+
4864 const char *pin, *apn, *login, *pass;
4965 unsigned long lastConnectionTickTime, lastNetworkStep;
66+ unsigned long getTimeRetries;
5067 int connectionTickTimeInterval;
5168 GSMUDP Udp;
52- void sendNTPpacket (const char * address, uint8_t * packetBuffer);
53- unsigned long getNTPTime ();
69+
5470};
5571
5672static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000 ;
@@ -61,7 +77,8 @@ GSMConnectionManager::GSMConnectionManager(const char *pin, const char *apn, con
6177 login(login),
6278 pass(pass),
6379 lastConnectionTickTime(millis()),
64- connectionTickTimeInterval(CHECK_INTERVAL_IDLE) {
80+ connectionTickTimeInterval(CHECK_INTERVAL_IDLE),
81+ getTimeRetries(MAX_GETTIME_RETRY) {
6582}
6683
6784unsigned long GSMConnectionManager::getTime () {
@@ -71,85 +88,98 @@ unsigned long GSMConnectionManager::getTime() {
7188void GSMConnectionManager::init () {
7289 char msgBuffer[120 ];
7390 if (gsmAccess.begin (pin) == GSM_READY) {
74- *msgBuffer = 0 ;
75- sprintf (msgBuffer, " SIM card ok" );
76- debugMessage (msgBuffer, 2 );
91+ // sprintf(msgBuffer, "SIM card ok");
92+ debugMessage (" SIM card ok" , 2 );
7793 gsmAccess.setTimeout (CHECK_INTERVAL_RETRYING);
94+ changeConnectionState (CONNECTION_STATE_CONNECTING);
7895 } else {
79- *msgBuffer = 0 ;
80- sprintf (msgBuffer, " SIM not present" );
81- debugMessage (msgBuffer, 2 );
96+ // sprintf(msgBuffer, "SIM not present or wrong PIN");
97+ debugMessage (" SIM not present or wrong PIN" , 0 );
8298 while (1 );
8399 }
84100}
85101
86102void GSMConnectionManager::changeConnectionState (NetworkConnectionState _newState) {
87- netConnectionState = _newState ;
103+ char msgBuffer[ 120 ] ;
88104 int newInterval = CHECK_INTERVAL_IDLE;
89105 switch (_newState) {
90106 case CONNECTION_STATE_INIT:
91107 newInterval = CHECK_INTERVAL_INIT;
92108 break ;
93109 case CONNECTION_STATE_CONNECTING:
110+ sprintf (msgBuffer, " Connecting to Cellular Network" );
111+ debugMessage (msgBuffer, 2 );
94112 newInterval = CHECK_INTERVAL_CONNECTING;
95113 break ;
96114 case CONNECTION_STATE_GETTIME:
115+ debugMessage (" Acquiring Time from Network" , 3 );
97116 newInterval = CHECK_INTERVAL_GETTIME;
117+ getTimeRetries = MAX_GETTIME_RETRY;
98118 break ;
99119 case CONNECTION_STATE_CONNECTED:
100120 newInterval = CHECK_INTERVAL_CONNECTED;
101121 break ;
102122 case CONNECTION_STATE_DISCONNECTED:
123+ if (netConnectionState == CONNECTION_STATE_CONNECTED){
124+ debugMessage (" Disconnected from Cellular Network" , 0 );
125+ debugMessage (" Attempting reconnection" , 0 );
126+ }else if (netConnectionState == CONNECTION_STATE_GETTIME){
127+ debugMessage (" Connection to Cellular Network lost during Network Time acquisition.\n Attempting reconnection" , 0 );
128+ }
103129 newInterval = CHECK_INTERVAL_DISCONNECTED;
104130 break ;
131+ case CONNECTION_STATE_ERROR:
132+ debugMessage (" GPRS attach failed\n Make sure the antenna is connected" , 0 );
133+ break ;
105134 }
106135 connectionTickTimeInterval = newInterval;
107136 lastConnectionTickTime = millis ();
137+ netConnectionState = _newState;
108138}
109139
110140void GSMConnectionManager::check () {
111141 char msgBuffer[120 ];
112- unsigned long now = millis ();
113- int networkStatus = 0 ;
142+ unsigned long const now = millis ();
143+ // int networkStatus = 0;
144+ GSM3_NetworkStatus_t networkStatus = GSM3_NetworkStatus_t::IDLE;
145+ int gsmAccessAlive;
114146 if (now - lastConnectionTickTime > connectionTickTimeInterval) {
115147 switch (netConnectionState) {
116148 case CONNECTION_STATE_INIT:
117149 init ();
118- changeConnectionState (CONNECTION_STATE_CONNECTING);
119150 break ;
120151 case CONNECTION_STATE_CONNECTING:
121152 // blocking call with 4th parameter == true
122153 networkStatus = gprs.attachGPRS (apn, login, pass, true );
123- *msgBuffer = 0 ;
154+
124155 sprintf (msgBuffer, " GPRS.attachGPRS(): %d" , networkStatus);
125- debugMessage (msgBuffer, 2 );
126- if (networkStatus == ERROR) {
127- debugMessage (" GPRS attach failed\n Make sure the antenna is connected" , 0 );
128- changeConnectionState (CONNECTION_STATE_CONNECTING);
129- lastConnectionTickTime = now;
156+ debugMessage (msgBuffer, 3 );
157+ if (networkStatus == GSM3_NetworkStatus_t::ERROR) {
158+ changeConnectionState (CONNECTION_STATE_ERROR);
130159 return ;
131160 }
132- *msgBuffer = 0 ;
133- sprintf (msgBuffer, " Trying to ping external world" );
134- debugMessage (msgBuffer, 2 );
135-
136- networkStatus = gprs.ping (" google.com" );
137- *msgBuffer = 0 ;
138- sprintf (msgBuffer, " GSM.ping(): %d" , networkStatus);
161+
162+ // sprintf(msgBuffer, "Sending PING to network server ");
163+ debugMessage (" Sending PING to outer space..." , 2 );
164+
165+ int pingResult;
166+ pingResult = gprs.ping (" google.com" );
167+
168+ sprintf (msgBuffer, " GSM.ping(): %d" , pingResult);
139169 debugMessage (msgBuffer, 2 );
140- if (networkStatus < 0 ) {
141- *msgBuffer = 0 ;
142- sprintf (msgBuffer, " Ping failed" );
143- debugMessage (msgBuffer , 0 );
170+ if (pingResult < 0 ) {
171+
172+ // sprintf(msgBuffer, "Ping failed");
173+ debugMessage (" PING failed " , 0 );
144174
145- *msgBuffer = 0 ;
175+
146176 sprintf (msgBuffer, " Retrying in \" %d\" milliseconds" , connectionTickTimeInterval);
147177 debugMessage (msgBuffer, 2 );
148- changeConnectionState (CONNECTION_STATE_CONNECTING);
178+ // changeConnectionState(CONNECTION_STATE_CONNECTING);
149179 return ;
150180 } else {
151- *msgBuffer = 0 ;
152- sprintf (msgBuffer, " Connected! " );
181+
182+ sprintf (msgBuffer, " Connected to GPRS netowrk " );
153183 debugMessage (msgBuffer, 2 );
154184 changeConnectionState (CONNECTION_STATE_GETTIME);
155185 return ;
@@ -159,38 +189,38 @@ void GSMConnectionManager::check() {
159189 debugMessage (" Acquiring Time from Network" , 3 );
160190 unsigned long networkTime;
161191 networkTime = getTime ();
162- *msgBuffer = 0 ;
163- sprintf (msgBuffer, " Network Time: %u" , networkTime);
164- debugMessage (msgBuffer, 3 );
192+
193+ debugMessage (" ." , 3 , false , false );
165194 if (networkTime > lastValidTimestamp){
166195 lastValidTimestamp = networkTime;
196+ sprintf (msgBuffer, " Network Time: %u" , networkTime);
197+ debugMessage (msgBuffer, 3 );
167198 changeConnectionState (CONNECTION_STATE_CONNECTED);
199+ }else if (gsmAccess.isAccessAlive () != 1 ){
200+ changeConnectionState (CONNECTION_STATE_DISCONNECTED);
201+ }else if (!getTimeRetries--) {
202+ changeConnectionState (CONNECTION_STATE_DISCONNECTED);
168203 }
169204 break ;
170205 case CONNECTION_STATE_CONNECTED:
171206 // keep testing connection
172- networkStatus = gsmAccess.isAccessAlive ();
173- *msgBuffer = 0 ;
174- sprintf (msgBuffer, " GPRS.isAccessAlive(): %d" , networkStatus );
207+ gsmAccessAlive = gsmAccess.isAccessAlive ();
208+
209+ sprintf (msgBuffer, " GPRS.isAccessAlive(): %d" , gsmAccessAlive );
175210 debugMessage (msgBuffer, 4 );
176- if (networkStatus != 1 ) {
211+ if (gsmAccessAlive != 1 ) {
177212 changeConnectionState (CONNECTION_STATE_DISCONNECTED);
178213 return ;
179214 }
180- *msgBuffer = 0 ;
181- sprintf (msgBuffer, " Still connected " );
215+
216+ sprintf (msgBuffer, " Connected to Cellular Network " );
182217 debugMessage (msgBuffer, 4 );
183218 break ;
184219 case CONNECTION_STATE_DISCONNECTED:
185220 gprs.detachGPRS ();
186221
187- *msgBuffer = 0 ;
188- sprintf (msgBuffer, " DISC | GPRS.status(): %d" , gprs.status ());
189- debugMessage (msgBuffer, 1 );
190- *msgBuffer = 0 ;
191- sprintf (msgBuffer, " Connection lost." );
192- debugMessage (msgBuffer, 0 );
193- debugMessage (" Attempting reconnection" , 1 );
222+
223+
194224 changeConnectionState (CONNECTION_STATE_CONNECTING);
195225 // wifiClient.stop();
196226 break ;
0 commit comments