USB Host Library for Sprint Dongles

Dependencies:   Socket USBHostWANDongleSprint lwip-sys lwip

Dependents:   SprintUSBModemWebsocketTest SprintUSBModemHTTPClientTest SprintUSBModemNTPClientTest SprintUSBModemSMSTest ... more

Fork of SprintUSBModem_bleedingedge by Donatien Garnier

Committer:
donatien
Date:
Wed Oct 10 08:20:51 2012 +0000
Revision:
4:23100b0757d6
Parent:
0:8f57713b2147
Child:
6:56000fe39df9
Use one serial port only for now; hangup delay adjusted

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:8f57713b2147 1 /* SMSInterface.cpp */
donatien 0:8f57713b2147 2 /* Copyright (C) 2012 mbed.org, MIT License
donatien 0:8f57713b2147 3 *
donatien 0:8f57713b2147 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
donatien 0:8f57713b2147 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
donatien 0:8f57713b2147 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
donatien 0:8f57713b2147 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
donatien 0:8f57713b2147 8 * furnished to do so, subject to the following conditions:
donatien 0:8f57713b2147 9 *
donatien 0:8f57713b2147 10 * The above copyright notice and this permission notice shall be included in all copies or
donatien 0:8f57713b2147 11 * substantial portions of the Software.
donatien 0:8f57713b2147 12 *
donatien 0:8f57713b2147 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
donatien 0:8f57713b2147 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
donatien 0:8f57713b2147 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
donatien 0:8f57713b2147 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:8f57713b2147 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
donatien 0:8f57713b2147 18 */
donatien 0:8f57713b2147 19
donatien 4:23100b0757d6 20 #define __DEBUG__ 2
donatien 0:8f57713b2147 21 #ifndef __MODULE__
donatien 0:8f57713b2147 22 #define __MODULE__ "SMSInterface.cpp"
donatien 0:8f57713b2147 23 #endif
donatien 0:8f57713b2147 24
donatien 0:8f57713b2147 25 #include "core/fwk.h"
donatien 0:8f57713b2147 26
donatien 0:8f57713b2147 27 #include "SMSInterface.h"
donatien 0:8f57713b2147 28
donatien 0:8f57713b2147 29 #include <cstdio>
donatien 0:8f57713b2147 30
donatien 0:8f57713b2147 31 #define DEFAULT_TIMEOUT 10000
donatien 0:8f57713b2147 32
donatien 4:23100b0757d6 33 SMSInterface::SMSInterface(ATCommandsInterface* pIf) : m_pIf(pIf), m_msg(NULL), m_maxMsgLength(0), m_msisdn(NULL)
donatien 0:8f57713b2147 34 {
donatien 0:8f57713b2147 35 m_pIf->registerEventsHandler(this); //Add us to the unsolicited result codes handlers
donatien 0:8f57713b2147 36 }
donatien 0:8f57713b2147 37
donatien 0:8f57713b2147 38 int SMSInterface::init()
donatien 0:8f57713b2147 39 {
donatien 4:23100b0757d6 40 m_msgRefListCount = 0;
donatien 4:23100b0757d6 41 m_needsUpdate = true;
donatien 4:23100b0757d6 42 m_state = SMS_IDLE;
donatien 4:23100b0757d6 43
donatien 0:8f57713b2147 44 DBG("Set format");
donatien 0:8f57713b2147 45 //Set Text mode format
donatien 0:8f57713b2147 46 int ret = m_pIf->executeSimple("AT+CMGF=1", NULL, DEFAULT_TIMEOUT);
donatien 0:8f57713b2147 47 if(ret != OK)
donatien 0:8f57713b2147 48 {
donatien 0:8f57713b2147 49 return NET_PROTOCOL;
donatien 0:8f57713b2147 50 }
donatien 0:8f57713b2147 51
donatien 0:8f57713b2147 52 DBG("Setup new messages indication");
donatien 0:8f57713b2147 53 //Setup new messages indication
donatien 0:8f57713b2147 54 ret = m_pIf->executeSimple("AT+CNMI=2,1,0,0,0", NULL, DEFAULT_TIMEOUT);
donatien 0:8f57713b2147 55 if(ret != OK)
donatien 0:8f57713b2147 56 {
donatien 0:8f57713b2147 57 return NET_PROTOCOL;
donatien 0:8f57713b2147 58 }
donatien 0:8f57713b2147 59
donatien 0:8f57713b2147 60 DBG("Try to fetch inbox");
donatien 0:8f57713b2147 61 m_inboxMtx.lock();
donatien 0:8f57713b2147 62 if( m_needsUpdate )
donatien 0:8f57713b2147 63 {
donatien 0:8f57713b2147 64 ret = updateInbox(); //Fetch existing messages references
donatien 0:8f57713b2147 65 if(ret)
donatien 0:8f57713b2147 66 {
donatien 0:8f57713b2147 67 m_inboxMtx.unlock();
donatien 0:8f57713b2147 68 return NET_PROTOCOL;
donatien 0:8f57713b2147 69 }
donatien 0:8f57713b2147 70 }
donatien 0:8f57713b2147 71 m_inboxMtx.unlock();
donatien 0:8f57713b2147 72
donatien 0:8f57713b2147 73 DBG("Initialization done");
donatien 0:8f57713b2147 74 return OK;
donatien 0:8f57713b2147 75 }
donatien 0:8f57713b2147 76
donatien 0:8f57713b2147 77 int SMSInterface::send(const char* number, const char* message)
donatien 0:8f57713b2147 78 {
donatien 0:8f57713b2147 79 if( strlen(number) > 16 )
donatien 0:8f57713b2147 80 {
donatien 0:8f57713b2147 81 return NET_INVALID; //Number too long to match 3GPP spec
donatien 0:8f57713b2147 82 }
donatien 0:8f57713b2147 83
donatien 0:8f57713b2147 84 int ret;
donatien 0:8f57713b2147 85
donatien 0:8f57713b2147 86 //Prepare infos
donatien 0:8f57713b2147 87 m_state = SMS_SEND_CMD_SENT;
donatien 0:8f57713b2147 88 m_msg = (char*) message;
donatien 0:8f57713b2147 89
donatien 0:8f57713b2147 90 DBG("Send SM");
donatien 0:8f57713b2147 91 //Send command
donatien 0:8f57713b2147 92 char cmd[32];
donatien 0:8f57713b2147 93 std::sprintf(cmd, "AT+CMGS=\"%s\"", number);
donatien 0:8f57713b2147 94 ret = m_pIf->execute(cmd, this, NULL, DEFAULT_TIMEOUT);
donatien 0:8f57713b2147 95
donatien 0:8f57713b2147 96 if( (ret != OK) || (m_state != SMS_CMD_PROCESSED) )
donatien 0:8f57713b2147 97 {
donatien 0:8f57713b2147 98 WARN("ret %d, state %d", ret, m_state);
donatien 0:8f57713b2147 99 m_state = SMS_IDLE;
donatien 0:8f57713b2147 100 return NET_PROTOCOL;
donatien 0:8f57713b2147 101 }
donatien 0:8f57713b2147 102
donatien 0:8f57713b2147 103 DBG("SM sent");
donatien 0:8f57713b2147 104 m_state = SMS_IDLE;
donatien 0:8f57713b2147 105 return OK;
donatien 0:8f57713b2147 106 }
donatien 0:8f57713b2147 107
donatien 0:8f57713b2147 108
donatien 0:8f57713b2147 109 int SMSInterface::get(char* number, char* message, size_t maxLength)
donatien 0:8f57713b2147 110 {
donatien 0:8f57713b2147 111 if( maxLength < 1 )
donatien 0:8f57713b2147 112 {
donatien 0:8f57713b2147 113 return NET_INVALID; //Buffer too short
donatien 0:8f57713b2147 114 }
donatien 0:8f57713b2147 115
donatien 0:8f57713b2147 116 int ret;
donatien 0:8f57713b2147 117
donatien 0:8f57713b2147 118 DBG("Get next message");
donatien 0:8f57713b2147 119 m_inboxMtx.lock();
donatien 0:8f57713b2147 120 if(m_msgRefListCount == 0 && m_needsUpdate)
donatien 0:8f57713b2147 121 {
donatien 4:23100b0757d6 122 DBG("Message list count is 0 and needs updating. Running updateInbox.");
donatien 0:8f57713b2147 123 ret = updateInbox();
donatien 4:23100b0757d6 124
donatien 0:8f57713b2147 125 if (ret)
donatien 0:8f57713b2147 126 {
donatien 0:8f57713b2147 127 m_inboxMtx.unlock();
donatien 0:8f57713b2147 128 return ret;
donatien 0:8f57713b2147 129 }
donatien 0:8f57713b2147 130 }
donatien 0:8f57713b2147 131
donatien 0:8f57713b2147 132 if(m_msgRefListCount == 0)
donatien 0:8f57713b2147 133 {
donatien 0:8f57713b2147 134 m_inboxMtx.unlock();
donatien 4:23100b0757d6 135 DBG("Message list count is 0, I think it's empty and returning.");
donatien 0:8f57713b2147 136 return NET_EMPTY; //No message to read
donatien 0:8f57713b2147 137 }
donatien 0:8f57713b2147 138
donatien 0:8f57713b2147 139 //Prepare infos
donatien 0:8f57713b2147 140 m_state = SMS_GET_CMD_SENT;
donatien 0:8f57713b2147 141 m_msisdn = (char*) number;
donatien 0:8f57713b2147 142 m_msg = (char*) message;
donatien 0:8f57713b2147 143 m_maxMsgLength = maxLength;
donatien 0:8f57713b2147 144
donatien 0:8f57713b2147 145 DBG("Get SMS");
donatien 0:8f57713b2147 146 //List command
donatien 0:8f57713b2147 147 char cmd[32];
donatien 0:8f57713b2147 148 std::sprintf(cmd, "AT+CMGR=%d", m_msgRefList[0]);
donatien 0:8f57713b2147 149 ret = m_pIf->execute(cmd, this, NULL, DEFAULT_TIMEOUT);
donatien 0:8f57713b2147 150 if( ret != OK )
donatien 0:8f57713b2147 151 {
donatien 0:8f57713b2147 152 WARN("AT+CMGR returned %d", ret);
donatien 0:8f57713b2147 153 m_state = SMS_IDLE;
donatien 0:8f57713b2147 154 m_inboxMtx.unlock();
donatien 0:8f57713b2147 155 return NET_PROTOCOL;
donatien 0:8f57713b2147 156 }
donatien 0:8f57713b2147 157
donatien 0:8f57713b2147 158 if (m_state != SMS_CMD_PROCESSED)
donatien 0:8f57713b2147 159 {
donatien 4:23100b0757d6 160 WARN("State variable is not 'SMS_CMD_PROCESSED' - returning 'NET_EMPTY'");
donatien 0:8f57713b2147 161 }
donatien 0:8f57713b2147 162
donatien 4:23100b0757d6 163 DBG("Deleting message from index number: %d", m_msgRefList[0] );
donatien 0:8f57713b2147 164 //Delete message from outbox
donatien 0:8f57713b2147 165 std::sprintf(cmd, "AT+CMGD=%d", m_msgRefList[0]);
donatien 0:8f57713b2147 166 ret = m_pIf->executeSimple(cmd, NULL, DEFAULT_TIMEOUT);
donatien 0:8f57713b2147 167 if(ret != OK)
donatien 0:8f57713b2147 168 {
donatien 4:23100b0757d6 169 ERR("Could not delete message");
donatien 0:8f57713b2147 170 }
donatien 0:8f57713b2147 171 //Remove message from list
donatien 0:8f57713b2147 172 std::memmove(m_msgRefList, m_msgRefList+1, m_msgRefListCount-1);
donatien 0:8f57713b2147 173 m_msgRefListCount--;
donatien 4:23100b0757d6 174
donatien 4:23100b0757d6 175 if (m_state != SMS_CMD_PROCESSED)
donatien 4:23100b0757d6 176 {
donatien 4:23100b0757d6 177 m_state = SMS_IDLE;
donatien 4:23100b0757d6 178 m_inboxMtx.unlock();
donatien 4:23100b0757d6 179 return NET_EMPTY;
donatien 4:23100b0757d6 180 }
donatien 4:23100b0757d6 181
donatien 4:23100b0757d6 182 m_state = SMS_IDLE;
donatien 0:8f57713b2147 183 m_inboxMtx.unlock();
donatien 0:8f57713b2147 184
donatien 0:8f57713b2147 185 return OK;
donatien 0:8f57713b2147 186 }
donatien 0:8f57713b2147 187
donatien 0:8f57713b2147 188
donatien 0:8f57713b2147 189 int SMSInterface::getCount(size_t* pCount)
donatien 0:8f57713b2147 190 {
donatien 0:8f57713b2147 191 int ret;
donatien 0:8f57713b2147 192
donatien 0:8f57713b2147 193 m_inboxMtx.lock();
donatien 0:8f57713b2147 194 if( m_needsUpdate )
donatien 0:8f57713b2147 195 {
donatien 0:8f57713b2147 196 ret = updateInbox();
donatien 0:8f57713b2147 197 if(ret)
donatien 0:8f57713b2147 198 {
donatien 0:8f57713b2147 199 m_inboxMtx.unlock();
donatien 0:8f57713b2147 200 return NET_PROTOCOL;
donatien 0:8f57713b2147 201 }
donatien 0:8f57713b2147 202 }
donatien 0:8f57713b2147 203
donatien 0:8f57713b2147 204 *pCount = m_msgRefListCount;
donatien 0:8f57713b2147 205 m_inboxMtx.unlock();
donatien 0:8f57713b2147 206
donatien 0:8f57713b2147 207 return OK;
donatien 0:8f57713b2147 208 }
donatien 0:8f57713b2147 209
donatien 0:8f57713b2147 210
donatien 0:8f57713b2147 211 /*virtual*/ int SMSInterface::onNewATResponseLine(ATCommandsInterface* pInst, const char* line)
donatien 0:8f57713b2147 212 {
donatien 0:8f57713b2147 213 if(m_state == SMS_SEND_CMD_SENT)
donatien 0:8f57713b2147 214 {
donatien 0:8f57713b2147 215 if( std::sscanf(line, "+CMGS: %*d") == 0 )
donatien 0:8f57713b2147 216 {
donatien 0:8f57713b2147 217 DBG("SM sent");
donatien 0:8f57713b2147 218 m_state = SMS_CMD_PROCESSED;
donatien 0:8f57713b2147 219 }
donatien 0:8f57713b2147 220 }
donatien 0:8f57713b2147 221 else if(m_state == SMS_GET_CMD_SENT)
donatien 0:8f57713b2147 222 {
donatien 0:8f57713b2147 223 DBG("Header: %s", line);
donatien 0:8f57713b2147 224 if( std::sscanf(line, "+CMGR: %*[^,],\"%16[^\"]\"", m_msisdn) == 1 ) //Get message ref
donatien 0:8f57713b2147 225 {
donatien 0:8f57713b2147 226 m_state = SMS_GET_HDR_RECEIVED;
donatien 0:8f57713b2147 227 }
donatien 0:8f57713b2147 228 }
donatien 0:8f57713b2147 229 else if(m_state == SMS_GET_HDR_RECEIVED)
donatien 0:8f57713b2147 230 {
donatien 0:8f57713b2147 231 DBG("Message: %s", line);
donatien 0:8f57713b2147 232 size_t cpyLen = MIN( std::strlen(line), m_maxMsgLength - 1 );
donatien 0:8f57713b2147 233 std::memcpy( m_msg, line, cpyLen );
donatien 0:8f57713b2147 234 m_msg[cpyLen] = '\0';
donatien 0:8f57713b2147 235 m_state = SMS_CMD_PROCESSED;
donatien 0:8f57713b2147 236 }
donatien 0:8f57713b2147 237 else if(m_state == SMS_GET_COUNT_CMD_SENT)
donatien 0:8f57713b2147 238 {
donatien 0:8f57713b2147 239 DBG("Header: %s", line);
donatien 0:8f57713b2147 240 int msgRef;
donatien 4:23100b0757d6 241 if( std::sscanf(line, "+CMGL: %d,\"REC", &msgRef) == 1 ) //Filter on REC READ and REC UNREAD messages
donatien 0:8f57713b2147 242 {
donatien 0:8f57713b2147 243 m_state = SMS_GET_COUNT_HDR_RECEIVED;
donatien 0:8f57713b2147 244 //Add message to list
donatien 0:8f57713b2147 245 if(m_msgRefListCount < MAX_SM)
donatien 0:8f57713b2147 246 {
donatien 0:8f57713b2147 247 m_msgRefList[m_msgRefListCount] = msgRef;
donatien 0:8f57713b2147 248 }
donatien 0:8f57713b2147 249 m_msgRefListCount++; //Always count message
donatien 0:8f57713b2147 250 DBG("m_msgRefListCount=%d",m_msgRefListCount);
donatien 0:8f57713b2147 251 }
donatien 0:8f57713b2147 252 }
donatien 0:8f57713b2147 253 else if(m_state == SMS_GET_COUNT_HDR_RECEIVED)
donatien 0:8f57713b2147 254 {
donatien 0:8f57713b2147 255 DBG("Message (debug only): %s", line); //For debug only
donatien 0:8f57713b2147 256 m_state = SMS_GET_COUNT_CMD_SENT;
donatien 0:8f57713b2147 257 }
donatien 0:8f57713b2147 258 return OK;
donatien 0:8f57713b2147 259 }
donatien 0:8f57713b2147 260
donatien 0:8f57713b2147 261 /*virtual*/ int SMSInterface::onNewEntryPrompt(ATCommandsInterface* pInst)
donatien 0:8f57713b2147 262 {
donatien 0:8f57713b2147 263 if(m_state == SMS_SEND_CMD_SENT)
donatien 0:8f57713b2147 264 {
donatien 0:8f57713b2147 265 char* crPtr = strchr(m_msg, CR);
donatien 0:8f57713b2147 266 if(crPtr != NULL)
donatien 0:8f57713b2147 267 {
donatien 0:8f57713b2147 268 int crPos = crPtr - m_msg;
donatien 0:8f57713b2147 269 //Replace m_inputBuf[crPos] with null-terminating char
donatien 0:8f57713b2147 270 m_msg[crPos] = '\x0';
donatien 0:8f57713b2147 271
donatien 0:8f57713b2147 272 //If there is a CR char, split message there
donatien 0:8f57713b2147 273
donatien 0:8f57713b2147 274 //Do print the message
donatien 0:8f57713b2147 275 int ret = pInst->sendData(m_msg);
donatien 0:8f57713b2147 276 if(ret)
donatien 0:8f57713b2147 277 {
donatien 0:8f57713b2147 278 return ret;
donatien 0:8f57713b2147 279 }
donatien 0:8f57713b2147 280
donatien 0:8f57713b2147 281 char cr[2] = {CR, '\0'};
donatien 0:8f57713b2147 282 ret = pInst->sendData(cr);
donatien 0:8f57713b2147 283 if(ret)
donatien 0:8f57713b2147 284 {
donatien 0:8f57713b2147 285 return ret;
donatien 0:8f57713b2147 286 }
donatien 0:8f57713b2147 287
donatien 0:8f57713b2147 288 m_msg += crPos;
donatien 0:8f57713b2147 289
donatien 0:8f57713b2147 290 if(m_msg[0] == LF)
donatien 0:8f57713b2147 291 {
donatien 0:8f57713b2147 292 m_msg++; //Discard LF char as well
donatien 0:8f57713b2147 293 }
donatien 0:8f57713b2147 294
donatien 0:8f57713b2147 295 return NET_MOREINFO;
donatien 0:8f57713b2147 296 }
donatien 0:8f57713b2147 297 else
donatien 0:8f57713b2147 298 {
donatien 0:8f57713b2147 299 //Do print the message
donatien 0:8f57713b2147 300 pInst->sendData(m_msg);
donatien 0:8f57713b2147 301 return OK;
donatien 0:8f57713b2147 302 }
donatien 0:8f57713b2147 303 }
donatien 0:8f57713b2147 304
donatien 0:8f57713b2147 305 return OK;
donatien 0:8f57713b2147 306 }
donatien 0:8f57713b2147 307
donatien 0:8f57713b2147 308 /*virtual*/ bool SMSInterface::isATCodeHandled(const char* atCode) //Is this AT code handled
donatien 0:8f57713b2147 309 {
donatien 0:8f57713b2147 310 DBG("AT code is %s", atCode);
donatien 0:8f57713b2147 311 if( strcmp("+CMTI", atCode) == 0 )
donatien 0:8f57713b2147 312 {
donatien 0:8f57713b2147 313 return true;
donatien 0:8f57713b2147 314 }
donatien 0:8f57713b2147 315
donatien 0:8f57713b2147 316 DBG("Not handled");
donatien 0:8f57713b2147 317 return false;
donatien 0:8f57713b2147 318 }
donatien 0:8f57713b2147 319
donatien 0:8f57713b2147 320 /*virtual*/ void SMSInterface::onDispatchStart()
donatien 0:8f57713b2147 321 {
donatien 0:8f57713b2147 322
donatien 0:8f57713b2147 323
donatien 0:8f57713b2147 324 }
donatien 0:8f57713b2147 325
donatien 0:8f57713b2147 326 /*virtual*/ void SMSInterface::onDispatchStop()
donatien 0:8f57713b2147 327 {
donatien 0:8f57713b2147 328
donatien 0:8f57713b2147 329 }
donatien 0:8f57713b2147 330
donatien 0:8f57713b2147 331 /*virtual*/ void SMSInterface::onEvent(const char* atCode, const char* evt)
donatien 0:8f57713b2147 332 {
donatien 0:8f57713b2147 333 if( strcmp("+CMTI", atCode) != 0 )
donatien 0:8f57713b2147 334 {
donatien 0:8f57713b2147 335 return; //Not supported
donatien 0:8f57713b2147 336 }
donatien 0:8f57713b2147 337
donatien 0:8f57713b2147 338 DBG("Unsollicited result code: %s - %s", atCode, evt);
donatien 0:8f57713b2147 339
donatien 0:8f57713b2147 340 //Get index
donatien 0:8f57713b2147 341 int msgRef;
donatien 0:8f57713b2147 342 if( std::sscanf(evt, "\"SM\",%d", &msgRef) == 1 )
donatien 0:8f57713b2147 343 {
donatien 0:8f57713b2147 344 DBG("Adding message to list (ref %d)", msgRef);
donatien 4:23100b0757d6 345 if(m_inboxMtx.trylock())
donatien 0:8f57713b2147 346 {
donatien 4:23100b0757d6 347 //Add message to list
donatien 4:23100b0757d6 348 if(m_msgRefListCount < MAX_SM)
donatien 4:23100b0757d6 349 {
donatien 4:23100b0757d6 350 m_msgRefList[m_msgRefListCount] = msgRef;
donatien 4:23100b0757d6 351 }
donatien 4:23100b0757d6 352 else
donatien 4:23100b0757d6 353 {
donatien 4:23100b0757d6 354 m_needsUpdate = true;
donatien 4:23100b0757d6 355 }
donatien 4:23100b0757d6 356 m_msgRefListCount++; //Always count message
donatien 4:23100b0757d6 357 m_inboxMtx.unlock();
donatien 0:8f57713b2147 358 }
donatien 0:8f57713b2147 359 else
donatien 0:8f57713b2147 360 {
donatien 4:23100b0757d6 361 WARN("Could not get lock");
donatien 0:8f57713b2147 362 m_needsUpdate = true;
donatien 0:8f57713b2147 363 }
donatien 0:8f57713b2147 364 }
donatien 0:8f57713b2147 365 }
donatien 0:8f57713b2147 366
donatien 0:8f57713b2147 367 int SMSInterface::updateInbox()
donatien 0:8f57713b2147 368 {
donatien 0:8f57713b2147 369 //Get memory indexes of unread messages
donatien 0:8f57713b2147 370
donatien 0:8f57713b2147 371 DBG("Updating inbox");
donatien 0:8f57713b2147 372 m_msgRefListCount = 0; //Reset list
donatien 4:23100b0757d6 373 m_needsUpdate = false; //Assume we won't need update after this routine (can be set to true by an incoming SM event)
donatien 0:8f57713b2147 374
donatien 4:23100b0757d6 375 //First list the "REC READ" messages that were not processed in the previous session
donatien 4:23100b0757d6 376 m_state = SMS_GET_COUNT_CMD_SENT;
donatien 4:23100b0757d6 377 int ret = m_pIf->execute("AT+CMGL=\"REC READ\"", this, NULL, DEFAULT_TIMEOUT);
donatien 4:23100b0757d6 378 if( ret != OK )
donatien 4:23100b0757d6 379 {
donatien 4:23100b0757d6 380 WARN("AT+CMGL returned %d", ret);
donatien 4:23100b0757d6 381 m_state = SMS_IDLE;
donatien 4:23100b0757d6 382 m_msgRefListCount = 0; //List could be invalid
donatien 4:23100b0757d6 383 m_needsUpdate = true;
donatien 4:23100b0757d6 384 return NET_PROTOCOL;
donatien 4:23100b0757d6 385 }
donatien 4:23100b0757d6 386
donatien 4:23100b0757d6 387 //Now list the "REC UNREAD" messages that were received by the modem since
donatien 4:23100b0757d6 388 m_state = SMS_GET_COUNT_CMD_SENT;
donatien 4:23100b0757d6 389 ret = m_pIf->execute("AT+CMGL=\"REC UNREAD\"", this, NULL, DEFAULT_TIMEOUT);
donatien 0:8f57713b2147 390 if( ret != OK )
donatien 0:8f57713b2147 391 {
donatien 0:8f57713b2147 392 WARN("AT+CMGL returned %d", ret);
donatien 0:8f57713b2147 393 m_state = SMS_IDLE;
donatien 0:8f57713b2147 394 m_msgRefListCount = 0; //List could be invalid
donatien 0:8f57713b2147 395 m_needsUpdate = true;
donatien 0:8f57713b2147 396 return NET_PROTOCOL;
donatien 0:8f57713b2147 397 }
donatien 0:8f57713b2147 398
donatien 0:8f57713b2147 399 DBG("%d incoming messages in inbox", m_msgRefListCount);
donatien 0:8f57713b2147 400
donatien 0:8f57713b2147 401 if( m_msgRefListCount > MAX_SM )
donatien 0:8f57713b2147 402 {
donatien 0:8f57713b2147 403 m_needsUpdate = true;
donatien 0:8f57713b2147 404 }
donatien 0:8f57713b2147 405
donatien 0:8f57713b2147 406 m_state = SMS_IDLE;
donatien 0:8f57713b2147 407
donatien 0:8f57713b2147 408 return OK;
donatien 0:8f57713b2147 409 }
donatien 0:8f57713b2147 410