Base library for cellular modem implementations
Dependencies: Socket lwip-sys lwip
Dependents: CellularUSBModem CellularUSBModem
Deprecated
This is an mbed 2 networking library. For mbed 5, the networking libraries have been revised to better support additional network stacks and thread safety here.
sms/CDMASMSInterface.cpp@8:944cd194963e, 2014-05-08 (annotated)
- Committer:
- mbed_official
- Date:
- Thu May 08 11:00:26 2014 +0100
- Revision:
- 8:944cd194963e
- Parent:
- 1:4a23efdf0da9
Synchronized with git revision df12bf01ac7dbb50751e2b16a351c894994e1dcf
Full URL: https://github.com/mbedmicro/mbed/commit/df12bf01ac7dbb50751e2b16a351c894994e1dcf/
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bogdanm | 1:4a23efdf0da9 | 1 | /* CDMASMSInterface.cpp */ |
bogdanm | 1:4a23efdf0da9 | 2 | /* Copyright (C) 2012 mbed.org, MIT License |
bogdanm | 1:4a23efdf0da9 | 3 | * |
bogdanm | 1:4a23efdf0da9 | 4 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software |
bogdanm | 1:4a23efdf0da9 | 5 | * and associated documentation files (the "Software"), to deal in the Software without restriction, |
bogdanm | 1:4a23efdf0da9 | 6 | * including without limitation the rights to use, copy, modify, merge, publish, distribute, |
bogdanm | 1:4a23efdf0da9 | 7 | * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is |
bogdanm | 1:4a23efdf0da9 | 8 | * furnished to do so, subject to the following conditions: |
bogdanm | 1:4a23efdf0da9 | 9 | * |
bogdanm | 1:4a23efdf0da9 | 10 | * The above copyright notice and this permission notice shall be included in all copies or |
bogdanm | 1:4a23efdf0da9 | 11 | * substantial portions of the Software. |
bogdanm | 1:4a23efdf0da9 | 12 | * |
bogdanm | 1:4a23efdf0da9 | 13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING |
bogdanm | 1:4a23efdf0da9 | 14 | * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
bogdanm | 1:4a23efdf0da9 | 15 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
bogdanm | 1:4a23efdf0da9 | 16 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
bogdanm | 1:4a23efdf0da9 | 17 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
bogdanm | 1:4a23efdf0da9 | 18 | */ |
bogdanm | 1:4a23efdf0da9 | 19 | |
bogdanm | 1:4a23efdf0da9 | 20 | #define __DEBUG__ 0 |
bogdanm | 1:4a23efdf0da9 | 21 | #ifndef __MODULE__ |
bogdanm | 1:4a23efdf0da9 | 22 | #define __MODULE__ "CDMASMSInterface.cpp" |
bogdanm | 1:4a23efdf0da9 | 23 | #endif |
bogdanm | 1:4a23efdf0da9 | 24 | |
bogdanm | 1:4a23efdf0da9 | 25 | #include "core/fwk.h" |
bogdanm | 1:4a23efdf0da9 | 26 | |
bogdanm | 1:4a23efdf0da9 | 27 | #include "CDMASMSInterface.h" |
bogdanm | 1:4a23efdf0da9 | 28 | |
bogdanm | 1:4a23efdf0da9 | 29 | #include <cstdio> |
bogdanm | 1:4a23efdf0da9 | 30 | #include <cstring> |
bogdanm | 1:4a23efdf0da9 | 31 | |
mbed_official | 8:944cd194963e | 32 | using std::sscanf; |
mbed_official | 8:944cd194963e | 33 | |
bogdanm | 1:4a23efdf0da9 | 34 | #define DEFAULT_TIMEOUT 10000 |
bogdanm | 1:4a23efdf0da9 | 35 | |
bogdanm | 1:4a23efdf0da9 | 36 | CDMASMSInterface::CDMASMSInterface(ATCommandsInterface* pIf) : m_pIf(pIf), m_msg(NULL), m_maxMsgLength(0), m_msisdn(NULL) |
bogdanm | 1:4a23efdf0da9 | 37 | { |
bogdanm | 1:4a23efdf0da9 | 38 | } |
bogdanm | 1:4a23efdf0da9 | 39 | |
bogdanm | 1:4a23efdf0da9 | 40 | int CDMASMSInterface::init() |
bogdanm | 1:4a23efdf0da9 | 41 | { |
bogdanm | 1:4a23efdf0da9 | 42 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 43 | |
bogdanm | 1:4a23efdf0da9 | 44 | DBG("Get number of messages in the different inboxes"); |
bogdanm | 1:4a23efdf0da9 | 45 | int ret = updateInbox(); |
bogdanm | 1:4a23efdf0da9 | 46 | if(ret) |
bogdanm | 1:4a23efdf0da9 | 47 | { |
bogdanm | 1:4a23efdf0da9 | 48 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 49 | } |
bogdanm | 1:4a23efdf0da9 | 50 | |
bogdanm | 1:4a23efdf0da9 | 51 | DBG("Initialization done"); |
bogdanm | 1:4a23efdf0da9 | 52 | return OK; |
bogdanm | 1:4a23efdf0da9 | 53 | } |
bogdanm | 1:4a23efdf0da9 | 54 | |
bogdanm | 1:4a23efdf0da9 | 55 | int CDMASMSInterface::send(const char* number, const char* message) |
bogdanm | 1:4a23efdf0da9 | 56 | { |
bogdanm | 1:4a23efdf0da9 | 57 | if( strlen(number) > 16 ) |
bogdanm | 1:4a23efdf0da9 | 58 | { |
bogdanm | 1:4a23efdf0da9 | 59 | return NET_INVALID; //Number too long |
bogdanm | 1:4a23efdf0da9 | 60 | } |
bogdanm | 1:4a23efdf0da9 | 61 | |
bogdanm | 1:4a23efdf0da9 | 62 | int ret; |
bogdanm | 1:4a23efdf0da9 | 63 | |
bogdanm | 1:4a23efdf0da9 | 64 | //Prepare infos |
bogdanm | 1:4a23efdf0da9 | 65 | m_state = SMS_SEND_CMD_SENT; |
bogdanm | 1:4a23efdf0da9 | 66 | |
bogdanm | 1:4a23efdf0da9 | 67 | bool intlNumber=(number[0]=='+'); //If the number starts with the + sign, replace it with 011 instead (int'l dialing code in the US) |
bogdanm | 1:4a23efdf0da9 | 68 | |
bogdanm | 1:4a23efdf0da9 | 69 | DBG("Send SM"); |
bogdanm | 1:4a23efdf0da9 | 70 | //Send command |
bogdanm | 1:4a23efdf0da9 | 71 | char cmd[32+strlen(message)]; |
bogdanm | 1:4a23efdf0da9 | 72 | std::sprintf(cmd, "AT!SSMS=0,%s%s,,\"%s\"",intlNumber?"011":"", intlNumber?(number+1):number, message); //Send with normal priority |
bogdanm | 1:4a23efdf0da9 | 73 | ret = m_pIf->execute(cmd, this, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 74 | |
bogdanm | 1:4a23efdf0da9 | 75 | if(ret != OK) |
bogdanm | 1:4a23efdf0da9 | 76 | { |
bogdanm | 1:4a23efdf0da9 | 77 | WARN("ret %d", ret); |
bogdanm | 1:4a23efdf0da9 | 78 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 79 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 80 | } |
bogdanm | 1:4a23efdf0da9 | 81 | |
bogdanm | 1:4a23efdf0da9 | 82 | DBG("Check status"); |
bogdanm | 1:4a23efdf0da9 | 83 | m_txState = SMS_PENDING; |
bogdanm | 1:4a23efdf0da9 | 84 | |
bogdanm | 1:4a23efdf0da9 | 85 | int tries = 10; |
bogdanm | 1:4a23efdf0da9 | 86 | while(tries--) |
bogdanm | 1:4a23efdf0da9 | 87 | { |
bogdanm | 1:4a23efdf0da9 | 88 | m_state = SMS_GET_TX_STATUS_CMD_SENT; |
bogdanm | 1:4a23efdf0da9 | 89 | ret = m_pIf->execute("AT!SSMS?", this, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 90 | if(ret) |
bogdanm | 1:4a23efdf0da9 | 91 | { |
bogdanm | 1:4a23efdf0da9 | 92 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 93 | return ret; |
bogdanm | 1:4a23efdf0da9 | 94 | } |
bogdanm | 1:4a23efdf0da9 | 95 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 96 | if(m_txState == SMS_PENDING) //Wait more |
bogdanm | 1:4a23efdf0da9 | 97 | { |
bogdanm | 1:4a23efdf0da9 | 98 | Thread::wait(1000); |
bogdanm | 1:4a23efdf0da9 | 99 | continue; |
bogdanm | 1:4a23efdf0da9 | 100 | } |
bogdanm | 1:4a23efdf0da9 | 101 | else if(m_txState == SMS_FAILED) |
bogdanm | 1:4a23efdf0da9 | 102 | { |
bogdanm | 1:4a23efdf0da9 | 103 | ERR("The modem could not send the SM"); |
bogdanm | 1:4a23efdf0da9 | 104 | return NET_CONN; //Probably a conenction issue, the user can retry |
bogdanm | 1:4a23efdf0da9 | 105 | } |
bogdanm | 1:4a23efdf0da9 | 106 | else |
bogdanm | 1:4a23efdf0da9 | 107 | { |
bogdanm | 1:4a23efdf0da9 | 108 | break; |
bogdanm | 1:4a23efdf0da9 | 109 | } |
bogdanm | 1:4a23efdf0da9 | 110 | } |
bogdanm | 1:4a23efdf0da9 | 111 | if(!tries) |
bogdanm | 1:4a23efdf0da9 | 112 | { |
bogdanm | 1:4a23efdf0da9 | 113 | ERR("The is still trying to send the SM"); |
bogdanm | 1:4a23efdf0da9 | 114 | return NET_TIMEOUT; |
bogdanm | 1:4a23efdf0da9 | 115 | } |
bogdanm | 1:4a23efdf0da9 | 116 | return OK; |
bogdanm | 1:4a23efdf0da9 | 117 | } |
bogdanm | 1:4a23efdf0da9 | 118 | |
bogdanm | 1:4a23efdf0da9 | 119 | |
bogdanm | 1:4a23efdf0da9 | 120 | int CDMASMSInterface::get(char* number, char* message, size_t maxLength) |
bogdanm | 1:4a23efdf0da9 | 121 | { |
bogdanm | 1:4a23efdf0da9 | 122 | if( maxLength < 1 ) |
bogdanm | 1:4a23efdf0da9 | 123 | { |
bogdanm | 1:4a23efdf0da9 | 124 | return NET_INVALID; //Buffer too short |
bogdanm | 1:4a23efdf0da9 | 125 | } |
bogdanm | 1:4a23efdf0da9 | 126 | |
bogdanm | 1:4a23efdf0da9 | 127 | int ret; |
bogdanm | 1:4a23efdf0da9 | 128 | |
bogdanm | 1:4a23efdf0da9 | 129 | DBG("Get next message"); |
bogdanm | 1:4a23efdf0da9 | 130 | if( (m_msgInListsCount[0] + m_msgInListsCount[1] + m_msgInListsCount[2]) == 0) |
bogdanm | 1:4a23efdf0da9 | 131 | { |
bogdanm | 1:4a23efdf0da9 | 132 | DBG("Message list count is 0 and needs updating. Running updateInbox."); |
bogdanm | 1:4a23efdf0da9 | 133 | ret = updateInbox(); |
bogdanm | 1:4a23efdf0da9 | 134 | if (ret) |
bogdanm | 1:4a23efdf0da9 | 135 | { |
bogdanm | 1:4a23efdf0da9 | 136 | return ret; |
bogdanm | 1:4a23efdf0da9 | 137 | } |
bogdanm | 1:4a23efdf0da9 | 138 | } |
bogdanm | 1:4a23efdf0da9 | 139 | |
bogdanm | 1:4a23efdf0da9 | 140 | if( (m_msgInListsCount[0] + m_msgInListsCount[1] + m_msgInListsCount[2]) == 0) |
bogdanm | 1:4a23efdf0da9 | 141 | { |
bogdanm | 1:4a23efdf0da9 | 142 | DBG("Message list count is 0"); |
bogdanm | 1:4a23efdf0da9 | 143 | return NET_EMPTY; //No message to read |
bogdanm | 1:4a23efdf0da9 | 144 | } |
bogdanm | 1:4a23efdf0da9 | 145 | |
bogdanm | 1:4a23efdf0da9 | 146 | //Determine which index to use : 3 (read), then 1 (urgent), then 2 (regular) |
bogdanm | 1:4a23efdf0da9 | 147 | int index; |
bogdanm | 1:4a23efdf0da9 | 148 | if(m_msgInListsCount[2]) |
bogdanm | 1:4a23efdf0da9 | 149 | { |
bogdanm | 1:4a23efdf0da9 | 150 | index = 3; |
bogdanm | 1:4a23efdf0da9 | 151 | } |
bogdanm | 1:4a23efdf0da9 | 152 | else if(m_msgInListsCount[0]) |
bogdanm | 1:4a23efdf0da9 | 153 | { |
bogdanm | 1:4a23efdf0da9 | 154 | index = 1; |
bogdanm | 1:4a23efdf0da9 | 155 | } |
bogdanm | 1:4a23efdf0da9 | 156 | else //if(m_msgInListsCount[1]) |
bogdanm | 1:4a23efdf0da9 | 157 | { |
bogdanm | 1:4a23efdf0da9 | 158 | index = 2; |
bogdanm | 1:4a23efdf0da9 | 159 | } |
bogdanm | 1:4a23efdf0da9 | 160 | |
bogdanm | 1:4a23efdf0da9 | 161 | //Prepare infos |
bogdanm | 1:4a23efdf0da9 | 162 | m_state = SMS_GET_CMD_SENT; |
bogdanm | 1:4a23efdf0da9 | 163 | m_msisdn = (char*) number; |
bogdanm | 1:4a23efdf0da9 | 164 | m_msg = (char*) message; |
bogdanm | 1:4a23efdf0da9 | 165 | m_maxMsgLength = maxLength; |
bogdanm | 1:4a23efdf0da9 | 166 | m_headersToRead = 3; |
bogdanm | 1:4a23efdf0da9 | 167 | |
bogdanm | 1:4a23efdf0da9 | 168 | m_msisdn[0] = '\0'; |
bogdanm | 1:4a23efdf0da9 | 169 | |
bogdanm | 1:4a23efdf0da9 | 170 | DBG("Get SMS"); |
bogdanm | 1:4a23efdf0da9 | 171 | //Read command |
bogdanm | 1:4a23efdf0da9 | 172 | char cmd[32]; |
bogdanm | 1:4a23efdf0da9 | 173 | std::sprintf(cmd, "AT!GSMS?%d,1", index); //1 is the oldest message |
bogdanm | 1:4a23efdf0da9 | 174 | ret = m_pIf->execute(cmd, this, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 175 | if( ret != OK ) |
bogdanm | 1:4a23efdf0da9 | 176 | { |
bogdanm | 1:4a23efdf0da9 | 177 | WARN("AT!GSMS returned %d", ret); |
bogdanm | 1:4a23efdf0da9 | 178 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 179 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 180 | } |
bogdanm | 1:4a23efdf0da9 | 181 | |
bogdanm | 1:4a23efdf0da9 | 182 | //If message is not read, it will be put at the end of the read list |
bogdanm | 1:4a23efdf0da9 | 183 | int item; |
bogdanm | 1:4a23efdf0da9 | 184 | if( index != 3 ) |
bogdanm | 1:4a23efdf0da9 | 185 | { |
bogdanm | 1:4a23efdf0da9 | 186 | //Decrement count in relevant list |
bogdanm | 1:4a23efdf0da9 | 187 | m_msgInListsCount[index-1]--; |
bogdanm | 1:4a23efdf0da9 | 188 | //Increment count in read list |
bogdanm | 1:4a23efdf0da9 | 189 | m_msgInListsCount[3-1]++; |
bogdanm | 1:4a23efdf0da9 | 190 | item = m_msgInListsCount[3-1]; |
bogdanm | 1:4a23efdf0da9 | 191 | //Normally item should be equal to 1 as we'd have read any older messages first |
bogdanm | 1:4a23efdf0da9 | 192 | if( item != 1 ) |
bogdanm | 1:4a23efdf0da9 | 193 | { |
bogdanm | 1:4a23efdf0da9 | 194 | WARN("Still some older messages pending in the read inbox"); |
bogdanm | 1:4a23efdf0da9 | 195 | } |
bogdanm | 1:4a23efdf0da9 | 196 | } |
bogdanm | 1:4a23efdf0da9 | 197 | else |
bogdanm | 1:4a23efdf0da9 | 198 | { |
bogdanm | 1:4a23efdf0da9 | 199 | //The item is still the oldest one |
bogdanm | 1:4a23efdf0da9 | 200 | item = 1; |
bogdanm | 1:4a23efdf0da9 | 201 | } |
bogdanm | 1:4a23efdf0da9 | 202 | |
bogdanm | 1:4a23efdf0da9 | 203 | DBG("Deleting message"); |
bogdanm | 1:4a23efdf0da9 | 204 | //Delete message from inbox |
bogdanm | 1:4a23efdf0da9 | 205 | std::sprintf(cmd, "AT!DSMS=3"/*,%d", item*/); //FIXME why doesn't that work when specifying the index?? |
bogdanm | 1:4a23efdf0da9 | 206 | ret = m_pIf->executeSimple(cmd, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 207 | if(ret != OK) |
bogdanm | 1:4a23efdf0da9 | 208 | { |
bogdanm | 1:4a23efdf0da9 | 209 | ERR("Could not delete message"); |
bogdanm | 1:4a23efdf0da9 | 210 | } |
bogdanm | 1:4a23efdf0da9 | 211 | else |
bogdanm | 1:4a23efdf0da9 | 212 | { |
bogdanm | 1:4a23efdf0da9 | 213 | //Now we can decrease the number of read messages |
bogdanm | 1:4a23efdf0da9 | 214 | m_msgInListsCount[3-1]--; |
bogdanm | 1:4a23efdf0da9 | 215 | } |
bogdanm | 1:4a23efdf0da9 | 216 | |
bogdanm | 1:4a23efdf0da9 | 217 | if (m_state != SMS_CMD_PROCESSED) |
bogdanm | 1:4a23efdf0da9 | 218 | { |
bogdanm | 1:4a23efdf0da9 | 219 | WARN("Message could not be retrieved properly"); |
bogdanm | 1:4a23efdf0da9 | 220 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 221 | return NET_EMPTY; |
bogdanm | 1:4a23efdf0da9 | 222 | } |
bogdanm | 1:4a23efdf0da9 | 223 | |
bogdanm | 1:4a23efdf0da9 | 224 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 225 | |
bogdanm | 1:4a23efdf0da9 | 226 | return OK; |
bogdanm | 1:4a23efdf0da9 | 227 | } |
bogdanm | 1:4a23efdf0da9 | 228 | |
bogdanm | 1:4a23efdf0da9 | 229 | |
bogdanm | 1:4a23efdf0da9 | 230 | int CDMASMSInterface::getCount(size_t* pCount) |
bogdanm | 1:4a23efdf0da9 | 231 | { |
bogdanm | 1:4a23efdf0da9 | 232 | int ret = updateInbox(); |
bogdanm | 1:4a23efdf0da9 | 233 | if(ret) |
bogdanm | 1:4a23efdf0da9 | 234 | { |
bogdanm | 1:4a23efdf0da9 | 235 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 236 | } |
bogdanm | 1:4a23efdf0da9 | 237 | |
bogdanm | 1:4a23efdf0da9 | 238 | *pCount = m_msgInListsCount[0] + m_msgInListsCount[1] + m_msgInListsCount[2]; //Urgent messages + regular messages + read messages |
bogdanm | 1:4a23efdf0da9 | 239 | |
bogdanm | 1:4a23efdf0da9 | 240 | return OK; |
bogdanm | 1:4a23efdf0da9 | 241 | } |
bogdanm | 1:4a23efdf0da9 | 242 | |
bogdanm | 1:4a23efdf0da9 | 243 | |
bogdanm | 1:4a23efdf0da9 | 244 | /*virtual*/ int CDMASMSInterface::onNewATResponseLine(ATCommandsInterface* pInst, const char* line) |
bogdanm | 1:4a23efdf0da9 | 245 | { |
bogdanm | 1:4a23efdf0da9 | 246 | if(m_state == SMS_SEND_CMD_SENT) |
bogdanm | 1:4a23efdf0da9 | 247 | { |
bogdanm | 1:4a23efdf0da9 | 248 | DBG("SMS Send: %s", line); |
bogdanm | 1:4a23efdf0da9 | 249 | } |
bogdanm | 1:4a23efdf0da9 | 250 | else if(m_state == SMS_GET_TX_STATUS_CMD_SENT) |
bogdanm | 1:4a23efdf0da9 | 251 | { |
bogdanm | 1:4a23efdf0da9 | 252 | if(!strcmp(line, "sent")) |
bogdanm | 1:4a23efdf0da9 | 253 | { |
bogdanm | 1:4a23efdf0da9 | 254 | m_txState = SMS_SENT; |
bogdanm | 1:4a23efdf0da9 | 255 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 256 | } |
bogdanm | 1:4a23efdf0da9 | 257 | else if(!strcmp(line, "failed")) |
bogdanm | 1:4a23efdf0da9 | 258 | { |
bogdanm | 1:4a23efdf0da9 | 259 | m_txState = SMS_FAILED; |
bogdanm | 1:4a23efdf0da9 | 260 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 261 | } |
bogdanm | 1:4a23efdf0da9 | 262 | else if(!strcmp(line, "none")) |
bogdanm | 1:4a23efdf0da9 | 263 | { |
bogdanm | 1:4a23efdf0da9 | 264 | m_txState = SMS_NONE; |
bogdanm | 1:4a23efdf0da9 | 265 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 266 | } |
bogdanm | 1:4a23efdf0da9 | 267 | else if(!strcmp(line, "pending")) |
bogdanm | 1:4a23efdf0da9 | 268 | { |
bogdanm | 1:4a23efdf0da9 | 269 | m_txState = SMS_PENDING; |
bogdanm | 1:4a23efdf0da9 | 270 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 271 | } |
bogdanm | 1:4a23efdf0da9 | 272 | } |
bogdanm | 1:4a23efdf0da9 | 273 | else if(m_state == SMS_GET_CMD_SENT) |
bogdanm | 1:4a23efdf0da9 | 274 | { |
bogdanm | 1:4a23efdf0da9 | 275 | DBG("Header: %s", line); |
bogdanm | 1:4a23efdf0da9 | 276 | |
bogdanm | 1:4a23efdf0da9 | 277 | if(m_msisdn[0]=='\0') |
bogdanm | 1:4a23efdf0da9 | 278 | { |
bogdanm | 1:4a23efdf0da9 | 279 | sscanf(line, "From: %16s", m_msisdn); |
bogdanm | 1:4a23efdf0da9 | 280 | } |
bogdanm | 1:4a23efdf0da9 | 281 | |
bogdanm | 1:4a23efdf0da9 | 282 | m_headersToRead--; |
bogdanm | 1:4a23efdf0da9 | 283 | |
bogdanm | 1:4a23efdf0da9 | 284 | if(m_headersToRead==0) //End of headers |
bogdanm | 1:4a23efdf0da9 | 285 | { |
bogdanm | 1:4a23efdf0da9 | 286 | if(m_msisdn[0]!='\0') //Checks that the incoming number has been retrieved |
bogdanm | 1:4a23efdf0da9 | 287 | { |
bogdanm | 1:4a23efdf0da9 | 288 | m_state = SMS_GET_HDR_RECEIVED; |
bogdanm | 1:4a23efdf0da9 | 289 | } |
bogdanm | 1:4a23efdf0da9 | 290 | else |
bogdanm | 1:4a23efdf0da9 | 291 | { |
bogdanm | 1:4a23efdf0da9 | 292 | m_state = SMS_IDLE; //Error, signal it |
bogdanm | 1:4a23efdf0da9 | 293 | } |
bogdanm | 1:4a23efdf0da9 | 294 | } |
bogdanm | 1:4a23efdf0da9 | 295 | } |
bogdanm | 1:4a23efdf0da9 | 296 | else if(m_state == SMS_GET_HDR_RECEIVED) |
bogdanm | 1:4a23efdf0da9 | 297 | { |
bogdanm | 1:4a23efdf0da9 | 298 | DBG("Message: %s", line); |
bogdanm | 1:4a23efdf0da9 | 299 | size_t cpyLen = MIN( std::strlen(line), m_maxMsgLength - 1 ); |
bogdanm | 1:4a23efdf0da9 | 300 | std::memcpy( m_msg, line, cpyLen ); |
bogdanm | 1:4a23efdf0da9 | 301 | m_msg[cpyLen] = '\0'; |
bogdanm | 1:4a23efdf0da9 | 302 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 303 | } |
bogdanm | 1:4a23efdf0da9 | 304 | else if(m_state == SMS_GET_COUNT_CMD_SENT) |
bogdanm | 1:4a23efdf0da9 | 305 | { |
bogdanm | 1:4a23efdf0da9 | 306 | DBG("Inbox: %s", line); |
bogdanm | 1:4a23efdf0da9 | 307 | int index; |
bogdanm | 1:4a23efdf0da9 | 308 | size_t count; |
bogdanm | 1:4a23efdf0da9 | 309 | if((strlen(line) > 16) && sscanf(line + 16, "{Index = %d}: %d", &index, &count) == 2) |
bogdanm | 1:4a23efdf0da9 | 310 | { |
bogdanm | 1:4a23efdf0da9 | 311 | if((index > 0) && (index <=4)) |
bogdanm | 1:4a23efdf0da9 | 312 | { |
bogdanm | 1:4a23efdf0da9 | 313 | m_msgInListsCount[index-1] = count; |
bogdanm | 1:4a23efdf0da9 | 314 | } |
bogdanm | 1:4a23efdf0da9 | 315 | if(index == 4) |
bogdanm | 1:4a23efdf0da9 | 316 | { |
bogdanm | 1:4a23efdf0da9 | 317 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 318 | } |
bogdanm | 1:4a23efdf0da9 | 319 | } |
bogdanm | 1:4a23efdf0da9 | 320 | } |
bogdanm | 1:4a23efdf0da9 | 321 | return OK; |
bogdanm | 1:4a23efdf0da9 | 322 | } |
bogdanm | 1:4a23efdf0da9 | 323 | |
bogdanm | 1:4a23efdf0da9 | 324 | /*virtual*/ int CDMASMSInterface::onNewEntryPrompt(ATCommandsInterface* pInst) |
bogdanm | 1:4a23efdf0da9 | 325 | { |
bogdanm | 1:4a23efdf0da9 | 326 | return OK; |
bogdanm | 1:4a23efdf0da9 | 327 | } |
bogdanm | 1:4a23efdf0da9 | 328 | |
bogdanm | 1:4a23efdf0da9 | 329 | |
bogdanm | 1:4a23efdf0da9 | 330 | int CDMASMSInterface::updateInbox() |
bogdanm | 1:4a23efdf0da9 | 331 | { |
bogdanm | 1:4a23efdf0da9 | 332 | //Get number of unread/read messages |
bogdanm | 1:4a23efdf0da9 | 333 | |
bogdanm | 1:4a23efdf0da9 | 334 | DBG("Updating inbox"); |
bogdanm | 1:4a23efdf0da9 | 335 | m_msgInListsCount[0] = m_msgInListsCount[1] = m_msgInListsCount[2] = m_msgInListsCount[3] = 0; //Reset counts |
bogdanm | 1:4a23efdf0da9 | 336 | |
bogdanm | 1:4a23efdf0da9 | 337 | //Get counts |
bogdanm | 1:4a23efdf0da9 | 338 | m_state = SMS_GET_COUNT_CMD_SENT; |
bogdanm | 1:4a23efdf0da9 | 339 | int ret = m_pIf->execute("AT!CNTSMS", this, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 340 | if( ret != OK ) |
bogdanm | 1:4a23efdf0da9 | 341 | { |
bogdanm | 1:4a23efdf0da9 | 342 | WARN("AT!CNTSMS returned %d", ret); |
bogdanm | 1:4a23efdf0da9 | 343 | m_msgInListsCount[0] = m_msgInListsCount[1] = m_msgInListsCount[2] = m_msgInListsCount[3] = 0; //Invalidate counts |
bogdanm | 1:4a23efdf0da9 | 344 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 345 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 346 | } |
bogdanm | 1:4a23efdf0da9 | 347 | |
bogdanm | 1:4a23efdf0da9 | 348 | return OK; |
bogdanm | 1:4a23efdf0da9 | 349 | } |
bogdanm | 1:4a23efdf0da9 | 350 |