Skip to content

Commit 3fd8423

Browse files
committed
Adding getPreferredMessageStorage and readSMSmessage
1 parent 9b5d38b commit 3fd8423

File tree

2 files changed

+172
-7
lines changed

2 files changed

+172
-7
lines changed

src/SparkFun_u-blox_SARA-R5_Arduino_Library.cpp

Lines changed: 167 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,6 +1527,165 @@ SARA_R5_error_t SARA_R5::sendSMS(String number, String message)
15271527
return err;
15281528
}
15291529

1530+
SARA_R5_error_t SARA_R5::getPreferredMessageStorage(int *used, int *total, String memory)
1531+
{
1532+
SARA_R5_error_t err;
1533+
char *command;
1534+
char *response;
1535+
int u;
1536+
int t;
1537+
1538+
command = sara_r5_calloc_char(strlen(SARA_R5_PREF_MESSAGE_STORE) + 6);
1539+
if (command == NULL)
1540+
return SARA_R5_ERROR_OUT_OF_MEMORY;
1541+
sprintf(command, "%s=\"%s\"", SARA_R5_PREF_MESSAGE_STORE, memory.c_str());
1542+
1543+
response = sara_r5_calloc_char(48);
1544+
if (response == NULL)
1545+
{
1546+
free(command);
1547+
return SARA_R5_ERROR_OUT_OF_MEMORY;
1548+
}
1549+
1550+
err = sendCommandWithResponse(command, SARA_R5_RESPONSE_OK, response,
1551+
SARA_R5_3_MIN_TIMEOUT);
1552+
1553+
if (err != SARA_R5_ERROR_SUCCESS)
1554+
{
1555+
free(command);
1556+
free(response);
1557+
return err;
1558+
}
1559+
1560+
int ret = sscanf(response, "\r\n+CPMS: %d,%d", &u, &t);
1561+
if (ret == 2)
1562+
{
1563+
if (_printDebug == true)
1564+
{
1565+
_debugPort->print("getPreferredMessageStorage: memory: ");
1566+
_debugPort->print(memory);
1567+
_debugPort->print(" used: ");
1568+
_debugPort->print(u);
1569+
_debugPort->print(" total: ");
1570+
_debugPort->println(t);
1571+
}
1572+
*used = u;
1573+
*total = t;
1574+
}
1575+
else
1576+
{
1577+
err = SARA_R5_ERROR_INVALID;
1578+
}
1579+
1580+
free(response);
1581+
free(command);
1582+
return err;
1583+
}
1584+
1585+
SARA_R5_error_t SARA_R5::readSMSmessage(int location, String *unread, String *from, String *dateTime, String *message)
1586+
{
1587+
SARA_R5_error_t err;
1588+
char *command;
1589+
char *response;
1590+
1591+
command = sara_r5_calloc_char(strlen(SARA_R5_READ_TEXT_MESSAGE) + 5);
1592+
if (command == NULL)
1593+
return SARA_R5_ERROR_OUT_OF_MEMORY;
1594+
sprintf(command, "%s=%d", SARA_R5_READ_TEXT_MESSAGE, location);
1595+
1596+
response = sara_r5_calloc_char(1024);
1597+
if (response == NULL)
1598+
{
1599+
free(command);
1600+
return SARA_R5_ERROR_OUT_OF_MEMORY;
1601+
}
1602+
1603+
err = sendCommandWithResponse(command, SARA_R5_RESPONSE_OK, response,
1604+
SARA_R5_10_SEC_TIMEOUT);
1605+
1606+
if (err == SARA_R5_ERROR_SUCCESS)
1607+
{
1608+
char *searchPtr = response;
1609+
1610+
// Find the first occurrence of +CGDCONT:
1611+
searchPtr = strstr(searchPtr, "+CMGR: ");
1612+
if (searchPtr != NULL)
1613+
{
1614+
searchPtr += strlen("+CMGR: "); // Point to the originator address
1615+
int pointer = 0;
1616+
while ((*(++searchPtr) != '\"') && (*searchPtr != '\0') && (pointer < 12))
1617+
{
1618+
unread->concat(*(searchPtr));
1619+
pointer++;
1620+
}
1621+
if ((*searchPtr == '\0') || (pointer == 12))
1622+
{
1623+
free(command);
1624+
free(response);
1625+
return SARA_R5_ERROR_UNEXPECTED_RESPONSE;
1626+
}
1627+
// Search to the next quote
1628+
searchPtr = strchr(++searchPtr, '\"');
1629+
pointer = 0;
1630+
while ((*(++searchPtr) != '\"') && (*searchPtr != '\0') && (pointer < 24))
1631+
{
1632+
from->concat(*(searchPtr));
1633+
pointer++;
1634+
}
1635+
if ((*searchPtr == '\0') || (pointer == 24))
1636+
{
1637+
free(command);
1638+
free(response);
1639+
return SARA_R5_ERROR_UNEXPECTED_RESPONSE;
1640+
}
1641+
// Skip two commas
1642+
searchPtr = strchr(++searchPtr, ',');
1643+
searchPtr = strchr(++searchPtr, ',');
1644+
// Search to the next quote
1645+
searchPtr = strchr(++searchPtr, '\"');
1646+
pointer = 0;
1647+
while ((*(++searchPtr) != '\"') && (*searchPtr != '\0') && (pointer < 24))
1648+
{
1649+
dateTime->concat(*(searchPtr));
1650+
pointer++;
1651+
}
1652+
if ((*searchPtr == '\0') || (pointer == 24))
1653+
{
1654+
free(command);
1655+
free(response);
1656+
return SARA_R5_ERROR_UNEXPECTED_RESPONSE;
1657+
}
1658+
// Search to the next new line
1659+
searchPtr = strchr(++searchPtr, '\n');
1660+
pointer = 0;
1661+
while ((*(++searchPtr) != '\r') && (*searchPtr != '\n') && (*searchPtr != '\0') && (pointer < 512))
1662+
{
1663+
message->concat(*(searchPtr));
1664+
pointer++;
1665+
}
1666+
if ((*searchPtr == '\0') || (pointer == 512))
1667+
{
1668+
free(command);
1669+
free(response);
1670+
return SARA_R5_ERROR_UNEXPECTED_RESPONSE;
1671+
}
1672+
}
1673+
else
1674+
{
1675+
err = SARA_R5_ERROR_UNEXPECTED_RESPONSE;
1676+
}
1677+
}
1678+
else
1679+
{
1680+
err = SARA_R5_ERROR_UNEXPECTED_RESPONSE;
1681+
}
1682+
1683+
free(command);
1684+
free(response);
1685+
1686+
return err;
1687+
}
1688+
15301689
SARA_R5_error_t SARA_R5::setBaud(unsigned long baud)
15311690
{
15321691
SARA_R5_error_t err;
@@ -2450,11 +2609,12 @@ SARA_R5_error_t SARA_R5::waitForResponse(const char *expectedResponse, const cha
24502609

24512610
timeIn = millis();
24522611

2453-
while ((!found) && (timeIn + timeout > millis()))
2612+
while ((!found) && ((timeIn + timeout) > millis()))
24542613
{
24552614
if (hwAvailable())
24562615
{
24572616
char c = readChar();
2617+
if (_printDebug == true) _debugPort->print((String)c);
24582618
if (c == expectedResponse[responseIndex])
24592619
{
24602620
if (++responseIndex == strlen(expectedResponse))
@@ -2515,7 +2675,7 @@ SARA_R5_error_t SARA_R5::sendCommandWithResponse(
25152675
int backlogIndex = sendCommand(command, at);//Sending command needs to dump data to backlog buffer as well.
25162676
unsigned long timeIn = millis();
25172677

2518-
while ((!found) && (timeIn + commandTimeout > millis()))
2678+
while ((!found) && ((timeIn + commandTimeout) > millis()))
25192679
{
25202680
if (hwAvailable())
25212681
{
@@ -2933,11 +3093,11 @@ boolean SARA_R5::parseGPRMCString(char *rmcString, PositionData *pos,
29333093
unsigned long tTemp;
29343094
char tempData[TEMP_NMEA_DATA_SIZE];
29353095

2936-
if (_printDebug == true)
2937-
{
2938-
_debugPort->println(F("parseGPRMCString: rmcString: "));
2939-
_debugPort->println(rmcString);
2940-
}
3096+
// if (_printDebug == true)
3097+
// {
3098+
// _debugPort->println(F("parseGPRMCString: rmcString: "));
3099+
// _debugPort->println(rmcString);
3100+
// }
29413101

29423102
// Fast-forward test to first value:
29433103
ptr = strchr(rmcString, ',');

src/SparkFun_u-blox_SARA-R5_Arduino_Library.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ const char SARA_R5_SIM_STATE[] = "+USIMSTAT";
9090
// ### SMS
9191
const char SARA_R5_MESSAGE_FORMAT[] = "+CMGF"; // Set SMS message format
9292
const char SARA_R5_SEND_TEXT[] = "+CMGS"; // Send SMS message
93+
const char SARA_R5_NEW_MESSAGE_IND[] = "+CNMI"; // New [SMS] message indication
94+
const char SARA_R5_PREF_MESSAGE_STORE[] = "+CPMS"; // Preferred message storage
95+
const char SARA_R5_READ_TEXT_MESSAGE[] = "+CMGR"; // Read message
9396
// V24 control and V25ter (UART interface)
9497
const char SARA_R5_COMMAND_BAUD[] = "+IPR"; // Baud rate
9598
// ### Packet switched data services
@@ -416,6 +419,8 @@ class SARA_R5 : public Print
416419
// SMS -- Short Messages Service
417420
SARA_R5_error_t setSMSMessageFormat(SARA_R5_message_format_t textMode = SARA_R5_MESSAGE_FORMAT_TEXT);
418421
SARA_R5_error_t sendSMS(String number, String message);
422+
SARA_R5_error_t getPreferredMessageStorage(int *used, int *total, String memory = "ME");
423+
SARA_R5_error_t readSMSmessage(int location, String *unread, String *from, String *dateTime, String *message);
419424

420425
// V24 Control and V25ter (UART interface) AT commands
421426
SARA_R5_error_t setBaud(unsigned long baud);

0 commit comments

Comments
 (0)