Vodafone K3770/K3772-Z modems driver & networking library

Dependencies:   Socket USBHostWANDongle lwip-sys lwip

Dependents:   VodafoneUSBModemHTTPClientTest VodafoneUSBModemNTPClientTest VodafoneUSBModemSMSTest VodafoneUSBModemUSSDTest ... more

Fork of VodafoneUSBModem_bleedingedge by Donatien Garnier

This is the driver for the Vodafone K3700 & K3772-Z Dongles:

K3770

More details and instructions can be found here.

Committer:
ashleymills
Date:
Fri Sep 20 10:40:58 2013 +0000
Revision:
91:7b311719374d
Parent:
83:897a0de9d668
Added support for Ublox LISA U200 module. Fixed bug for modules that throw away blocked unsolicited messages.

Who changed what in which revision?

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