32
32
#define LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT 1000
33
33
#define LTE_SHIELD_SET_BAUD_TIMEOUT 500
34
34
#define LTE_SHIELD_POWER_PULSE_PERIOD 3200
35
+ #define LTE_RESET_PULSE_PERIOD 10000
35
36
#define LTE_SHIELD_IP_CONNECT_TIMEOUT 60000
36
37
#define LTE_SHIELD_POLL_DELAY 1
37
38
#define LTE_SHIELD_SOCKET_WRITE_TIMEOUT 10000
@@ -449,18 +450,32 @@ String LTE_Shield::clock(void)
449
450
sprintf (command, " %s?" , LTE_SHIELD_COMMAND_CLOCK);
450
451
451
452
response = lte_calloc_char (48 );
452
- if (response == NULL ) return " " ;
453
+ if (response == NULL )
454
+ {
455
+ free (command);
456
+ return " " ;
457
+ }
453
458
454
459
err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK,
455
460
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
456
461
if (err != LTE_SHIELD_ERROR_SUCCESS) return " " ;
457
462
458
463
// Response format: \r\n+CCLK: "YY/MM/DD,HH:MM:SS-TZ"\r\n\r\nOK\r\n
459
464
clockBegin = strchr (response, ' \" ' ); // Find first quote
460
- if (clockBegin == NULL ) return " " ;
465
+ if (clockBegin == NULL )
466
+ {
467
+ free (command);
468
+ free (response);
469
+ return " " ;
470
+ }
461
471
clockBegin += 1 ; // Increment pointer to begin at first number
462
472
clockEnd = strchr (clockBegin, ' \" ' ); // Find last quote
463
- if (clockEnd == NULL ) return " " ;
473
+ if (clockEnd == NULL )
474
+ {
475
+ free (command);
476
+ free (response);
477
+ return " " ;
478
+ }
464
479
*(clockEnd) = ' \0 ' ; // Set last quote to null char -- end string
465
480
466
481
free (command);
@@ -485,7 +500,11 @@ LTE_Shield_error_t LTE_Shield::clock(uint8_t * y, uint8_t * mo, uint8_t * d,
485
500
sprintf (command, " %s?" , LTE_SHIELD_COMMAND_CLOCK);
486
501
487
502
response = lte_calloc_char (48 );
488
- if (response == NULL ) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
503
+ if (response == NULL )
504
+ {
505
+ free (command);
506
+ return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
507
+ }
489
508
490
509
err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK,
491
510
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
@@ -1069,12 +1088,21 @@ LTE_Shield::LTE_Shield_gpio_mode_t LTE_Shield::getGpioMode(LTE_Shield_gpio_t gpi
1069
1088
sprintf (command, " %s?" , LTE_SHIELD_COMMAND_GPIO);
1070
1089
1071
1090
response = lte_calloc_char (96 );
1072
- if (response == NULL ) return GPIO_MODE_INVALID;
1091
+ if (response == NULL )
1092
+ {
1093
+ free (command);
1094
+ return GPIO_MODE_INVALID;
1095
+ }
1073
1096
1074
1097
err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK,
1075
1098
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
1076
1099
1077
- if (err != LTE_SHIELD_ERROR_SUCCESS) return GPIO_MODE_INVALID;
1100
+ if (err != LTE_SHIELD_ERROR_SUCCESS)
1101
+ {
1102
+ free (command);
1103
+ free (response);
1104
+ return GPIO_MODE_INVALID;
1105
+ }
1078
1106
1079
1107
sprintf (gpioChar, " %d" , gpio); // Convert GPIO to char array
1080
1108
gpioStart = strstr (response, gpioChar); // Find first occurence of GPIO in response
@@ -1100,15 +1128,29 @@ int LTE_Shield::socketOpen(lte_shield_socket_protocol_t protocol, unsigned int l
1100
1128
sprintf (command, " %s=%d,%d" , LTE_SHIELD_CREATE_SOCKET, protocol, localPort);
1101
1129
1102
1130
response = lte_calloc_char (24 );
1103
- if (response == NULL ) return -1 ;
1131
+ if (response == NULL )
1132
+ {
1133
+ free (command);
1134
+ return -1 ;
1135
+ }
1104
1136
1105
1137
err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK,
1106
1138
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
1107
1139
1108
- if (err != LTE_SHIELD_ERROR_SUCCESS) return -1 ;
1140
+ if (err != LTE_SHIELD_ERROR_SUCCESS)
1141
+ {
1142
+ free (command);
1143
+ free (response);
1144
+ return -1 ;
1145
+ }
1109
1146
1110
1147
responseStart = strstr (response, " +USOCR" );
1111
- if (responseStart == NULL ) return -1 ;
1148
+ if (responseStart == NULL )
1149
+ {
1150
+ free (command);
1151
+ free (response);
1152
+ return -1 ;
1153
+ }
1112
1154
1113
1155
sscanf (responseStart, " +USOCR: %d" , &sockId);
1114
1156
@@ -1120,27 +1162,35 @@ int LTE_Shield::socketOpen(lte_shield_socket_protocol_t protocol, unsigned int l
1120
1162
1121
1163
LTE_Shield_error_t LTE_Shield::socketClose (int socket, int timeout)
1122
1164
{
1165
+ LTE_Shield_error_t err;
1123
1166
char * command;
1124
1167
1125
1168
command = lte_calloc_char (strlen (LTE_SHIELD_CLOSE_SOCKET) + 10 );
1126
1169
if (command == NULL ) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1127
1170
sprintf (command, " %s=%d" , LTE_SHIELD_CLOSE_SOCKET, socket);
1128
1171
1129
- return sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK,
1130
- NULL , timeout);
1172
+ err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK, NULL , timeout);
1173
+
1174
+ free (command);
1175
+
1176
+ return err;
1131
1177
}
1132
1178
1133
1179
LTE_Shield_error_t LTE_Shield::socketConnect (int socket, const char * address,
1134
1180
unsigned int port)
1135
1181
{
1182
+ LTE_Shield_error_t err;
1136
1183
char * command;
1137
1184
1138
1185
command = lte_calloc_char (strlen (LTE_SHIELD_CONNECT_SOCKET) + strlen (address) + 11 );
1139
1186
if (command == NULL ) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1140
1187
sprintf (command, " %s=%d,\" %s\" ,%d" , LTE_SHIELD_CONNECT_SOCKET, socket, address, port);
1141
1188
1142
- return sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK,
1143
- NULL , LTE_SHIELD_IP_CONNECT_TIMEOUT);
1189
+ err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK, NULL , LTE_SHIELD_IP_CONNECT_TIMEOUT);
1190
+
1191
+ free (command);
1192
+
1193
+ return err;
1144
1194
}
1145
1195
1146
1196
LTE_Shield_error_t LTE_Shield::socketWrite (int socket, const char * str)
@@ -1181,20 +1231,32 @@ LTE_Shield_error_t LTE_Shield::socketRead(int socket, int length, char * readDes
1181
1231
sprintf (command, " %s=%d,%d" , LTE_SHIELD_READ_SOCKET, socket, length);
1182
1232
1183
1233
response = lte_calloc_char (length + strlen (LTE_SHIELD_READ_SOCKET) + 24 );
1184
- if (response == NULL ) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1234
+ if (response == NULL )
1235
+ {
1236
+ free (command);
1237
+ return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1238
+ }
1185
1239
1186
1240
err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK, response,
1187
1241
LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
1188
1242
1189
- if (err != LTE_SHIELD_ERROR_SUCCESS) return err;
1190
-
1191
- // Find the first double-quote:
1192
- strBegin = strchr (response, ' \" ' );
1193
- if (strBegin == NULL ) return LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE;
1194
- while ((readIndex < length) && (readIndex < strlen (strBegin)))
1243
+ if (err == LTE_SHIELD_ERROR_SUCCESS)
1195
1244
{
1196
- readDest[readIndex] = strBegin[1 + readIndex];
1197
- readIndex += 1 ;
1245
+ // Find the first double-quote:
1246
+ strBegin = strchr (response, ' \" ' );
1247
+
1248
+ if (strBegin == NULL )
1249
+ {
1250
+ free (command);
1251
+ free (response);
1252
+ return LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE;
1253
+ }
1254
+
1255
+ while ((readIndex < length) && (readIndex < strlen (strBegin)))
1256
+ {
1257
+ readDest[readIndex] = strBegin[1 + readIndex];
1258
+ readIndex += 1 ;
1259
+ }
1198
1260
}
1199
1261
1200
1262
free (command);
@@ -1236,7 +1298,11 @@ boolean LTE_Shield::gpsOn(void)
1236
1298
sprintf (command, " %s?" , LTE_SHIELD_GPS_POWER);
1237
1299
1238
1300
response = lte_calloc_char (24 );
1239
- if (response == NULL ) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1301
+ if (response == NULL )
1302
+ {
1303
+ free (command);
1304
+ return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1305
+ }
1240
1306
1241
1307
err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK, response,
1242
1308
LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
@@ -1361,7 +1427,11 @@ LTE_Shield_error_t LTE_Shield::gpsGetRmc(struct PositionData * pos, struct Speed
1361
1427
sprintf (command, " %s?" , LTE_SHIELD_GPS_GPRMC);
1362
1428
1363
1429
response = lte_calloc_char (96 );
1364
- if (response == NULL ) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1430
+ if (response == NULL )
1431
+ {
1432
+ free (command);
1433
+ return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1434
+ }
1365
1435
1366
1436
err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK, response, 10000 );
1367
1437
if (err == LTE_SHIELD_ERROR_SUCCESS)
@@ -1393,7 +1463,7 @@ LTE_Shield_error_t LTE_Shield::gpsGetSpeed(struct SpeedData * speed)
1393
1463
// AT+UGVTG?
1394
1464
}
1395
1465
1396
- LTE_Shield_error_t LTE_Shield::gpsRequest (unsigned int timeout, unsigned int accuracy,
1466
+ LTE_Shield_error_t LTE_Shield::gpsRequest (unsigned int timeout, uint32_t accuracy,
1397
1467
boolean detailed)
1398
1468
{
1399
1469
// AT+ULOC=2,<useCellLocate>,<detailed>,<timeout>,<accuracy>
@@ -1467,13 +1537,20 @@ LTE_Shield_error_t LTE_Shield::init(unsigned long baud,
1467
1537
1468
1538
void LTE_Shield::powerOn (void )
1469
1539
{
1470
- if (_powerPin == NULL ) return ;
1471
1540
pinMode (_powerPin, OUTPUT);
1472
1541
digitalWrite (_powerPin, LOW);
1473
1542
delay (LTE_SHIELD_POWER_PULSE_PERIOD);
1474
1543
pinMode (_powerPin, INPUT); // Return to high-impedance, rely on SARA module internal pull-up
1475
1544
}
1476
1545
1546
+ void LTE_Shield::hwReset (void )
1547
+ {
1548
+ pinMode (_resetPin, OUTPUT);
1549
+ digitalWrite (_resetPin, LOW);
1550
+ delay (LTE_RESET_PULSE_PERIOD);
1551
+ pinMode (_resetPin, INPUT); // Return to high-impedance, rely on SARA module internal pull-up
1552
+ }
1553
+
1477
1554
LTE_Shield_error_t LTE_Shield::functionality (LTE_Shield_functionality_t function)
1478
1555
{
1479
1556
LTE_Shield_error_t err;
@@ -1523,7 +1600,11 @@ LTE_Shield_error_t LTE_Shield::getMno(mobile_network_operator_t * mno)
1523
1600
sprintf (command, " %s?" , LTE_SHIELD_COMMAND_MNO);
1524
1601
1525
1602
response = lte_calloc_char (24 );
1526
- if (response == NULL ) return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1603
+ if (response == NULL )
1604
+ {
1605
+ free (command);
1606
+ return LTE_SHIELD_ERROR_OUT_OF_MEMORY;
1607
+ }
1527
1608
1528
1609
err = sendCommandWithResponse (command, LTE_SHIELD_RESPONSE_OK,
1529
1610
response, LTE_SHIELD_STANDARD_RESPONSE_TIMEOUT);
@@ -1535,7 +1616,7 @@ LTE_Shield_error_t LTE_Shield::getMno(mobile_network_operator_t * mno)
1535
1616
*mno = MNO_INVALID;
1536
1617
return LTE_SHIELD_ERROR_UNEXPECTED_RESPONSE;
1537
1618
}
1538
- *mno = (mobile_network_operator_t )(*( response + i) - 0x30 ); // Convert to integer
1619
+ *mno = (mobile_network_operator_t )(response[i] - 0x30 ); // Convert to integer
1539
1620
1540
1621
free (command);
1541
1622
free (response);
0 commit comments