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@1:4a23efdf0da9, 2013-10-17 (annotated)
- Committer:
- bogdanm
- Date:
- Thu Oct 17 12:29:05 2013 +0300
- Revision:
- 1:4a23efdf0da9
- Child:
- 8:944cd194963e
Initial release of the CellularModem library
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 | |
bogdanm | 1:4a23efdf0da9 | 32 | #define DEFAULT_TIMEOUT 10000 |
bogdanm | 1:4a23efdf0da9 | 33 | |
bogdanm | 1:4a23efdf0da9 | 34 | CDMASMSInterface::CDMASMSInterface(ATCommandsInterface* pIf) : m_pIf(pIf), m_msg(NULL), m_maxMsgLength(0), m_msisdn(NULL) |
bogdanm | 1:4a23efdf0da9 | 35 | { |
bogdanm | 1:4a23efdf0da9 | 36 | } |
bogdanm | 1:4a23efdf0da9 | 37 | |
bogdanm | 1:4a23efdf0da9 | 38 | int CDMASMSInterface::init() |
bogdanm | 1:4a23efdf0da9 | 39 | { |
bogdanm | 1:4a23efdf0da9 | 40 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 41 | |
bogdanm | 1:4a23efdf0da9 | 42 | DBG("Get number of messages in the different inboxes"); |
bogdanm | 1:4a23efdf0da9 | 43 | int ret = updateInbox(); |
bogdanm | 1:4a23efdf0da9 | 44 | if(ret) |
bogdanm | 1:4a23efdf0da9 | 45 | { |
bogdanm | 1:4a23efdf0da9 | 46 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 47 | } |
bogdanm | 1:4a23efdf0da9 | 48 | |
bogdanm | 1:4a23efdf0da9 | 49 | DBG("Initialization done"); |
bogdanm | 1:4a23efdf0da9 | 50 | return OK; |
bogdanm | 1:4a23efdf0da9 | 51 | } |
bogdanm | 1:4a23efdf0da9 | 52 | |
bogdanm | 1:4a23efdf0da9 | 53 | int CDMASMSInterface::send(const char* number, const char* message) |
bogdanm | 1:4a23efdf0da9 | 54 | { |
bogdanm | 1:4a23efdf0da9 | 55 | if( strlen(number) > 16 ) |
bogdanm | 1:4a23efdf0da9 | 56 | { |
bogdanm | 1:4a23efdf0da9 | 57 | return NET_INVALID; //Number too long |
bogdanm | 1:4a23efdf0da9 | 58 | } |
bogdanm | 1:4a23efdf0da9 | 59 | |
bogdanm | 1:4a23efdf0da9 | 60 | int ret; |
bogdanm | 1:4a23efdf0da9 | 61 | |
bogdanm | 1:4a23efdf0da9 | 62 | //Prepare infos |
bogdanm | 1:4a23efdf0da9 | 63 | m_state = SMS_SEND_CMD_SENT; |
bogdanm | 1:4a23efdf0da9 | 64 | |
bogdanm | 1:4a23efdf0da9 | 65 | 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 | 66 | |
bogdanm | 1:4a23efdf0da9 | 67 | DBG("Send SM"); |
bogdanm | 1:4a23efdf0da9 | 68 | //Send command |
bogdanm | 1:4a23efdf0da9 | 69 | char cmd[32+strlen(message)]; |
bogdanm | 1:4a23efdf0da9 | 70 | std::sprintf(cmd, "AT!SSMS=0,%s%s,,\"%s\"",intlNumber?"011":"", intlNumber?(number+1):number, message); //Send with normal priority |
bogdanm | 1:4a23efdf0da9 | 71 | ret = m_pIf->execute(cmd, this, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 72 | |
bogdanm | 1:4a23efdf0da9 | 73 | if(ret != OK) |
bogdanm | 1:4a23efdf0da9 | 74 | { |
bogdanm | 1:4a23efdf0da9 | 75 | WARN("ret %d", ret); |
bogdanm | 1:4a23efdf0da9 | 76 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 77 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 78 | } |
bogdanm | 1:4a23efdf0da9 | 79 | |
bogdanm | 1:4a23efdf0da9 | 80 | DBG("Check status"); |
bogdanm | 1:4a23efdf0da9 | 81 | m_txState = SMS_PENDING; |
bogdanm | 1:4a23efdf0da9 | 82 | |
bogdanm | 1:4a23efdf0da9 | 83 | int tries = 10; |
bogdanm | 1:4a23efdf0da9 | 84 | while(tries--) |
bogdanm | 1:4a23efdf0da9 | 85 | { |
bogdanm | 1:4a23efdf0da9 | 86 | m_state = SMS_GET_TX_STATUS_CMD_SENT; |
bogdanm | 1:4a23efdf0da9 | 87 | ret = m_pIf->execute("AT!SSMS?", this, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 88 | if(ret) |
bogdanm | 1:4a23efdf0da9 | 89 | { |
bogdanm | 1:4a23efdf0da9 | 90 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 91 | return ret; |
bogdanm | 1:4a23efdf0da9 | 92 | } |
bogdanm | 1:4a23efdf0da9 | 93 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 94 | if(m_txState == SMS_PENDING) //Wait more |
bogdanm | 1:4a23efdf0da9 | 95 | { |
bogdanm | 1:4a23efdf0da9 | 96 | Thread::wait(1000); |
bogdanm | 1:4a23efdf0da9 | 97 | continue; |
bogdanm | 1:4a23efdf0da9 | 98 | } |
bogdanm | 1:4a23efdf0da9 | 99 | else if(m_txState == SMS_FAILED) |
bogdanm | 1:4a23efdf0da9 | 100 | { |
bogdanm | 1:4a23efdf0da9 | 101 | ERR("The modem could not send the SM"); |
bogdanm | 1:4a23efdf0da9 | 102 | return NET_CONN; //Probably a conenction issue, the user can retry |
bogdanm | 1:4a23efdf0da9 | 103 | } |
bogdanm | 1:4a23efdf0da9 | 104 | else |
bogdanm | 1:4a23efdf0da9 | 105 | { |
bogdanm | 1:4a23efdf0da9 | 106 | break; |
bogdanm | 1:4a23efdf0da9 | 107 | } |
bogdanm | 1:4a23efdf0da9 | 108 | } |
bogdanm | 1:4a23efdf0da9 | 109 | if(!tries) |
bogdanm | 1:4a23efdf0da9 | 110 | { |
bogdanm | 1:4a23efdf0da9 | 111 | ERR("The is still trying to send the SM"); |
bogdanm | 1:4a23efdf0da9 | 112 | return NET_TIMEOUT; |
bogdanm | 1:4a23efdf0da9 | 113 | } |
bogdanm | 1:4a23efdf0da9 | 114 | return OK; |
bogdanm | 1:4a23efdf0da9 | 115 | } |
bogdanm | 1:4a23efdf0da9 | 116 | |
bogdanm | 1:4a23efdf0da9 | 117 | |
bogdanm | 1:4a23efdf0da9 | 118 | int CDMASMSInterface::get(char* number, char* message, size_t maxLength) |
bogdanm | 1:4a23efdf0da9 | 119 | { |
bogdanm | 1:4a23efdf0da9 | 120 | if( maxLength < 1 ) |
bogdanm | 1:4a23efdf0da9 | 121 | { |
bogdanm | 1:4a23efdf0da9 | 122 | return NET_INVALID; //Buffer too short |
bogdanm | 1:4a23efdf0da9 | 123 | } |
bogdanm | 1:4a23efdf0da9 | 124 | |
bogdanm | 1:4a23efdf0da9 | 125 | int ret; |
bogdanm | 1:4a23efdf0da9 | 126 | |
bogdanm | 1:4a23efdf0da9 | 127 | DBG("Get next message"); |
bogdanm | 1:4a23efdf0da9 | 128 | if( (m_msgInListsCount[0] + m_msgInListsCount[1] + m_msgInListsCount[2]) == 0) |
bogdanm | 1:4a23efdf0da9 | 129 | { |
bogdanm | 1:4a23efdf0da9 | 130 | DBG("Message list count is 0 and needs updating. Running updateInbox."); |
bogdanm | 1:4a23efdf0da9 | 131 | ret = updateInbox(); |
bogdanm | 1:4a23efdf0da9 | 132 | if (ret) |
bogdanm | 1:4a23efdf0da9 | 133 | { |
bogdanm | 1:4a23efdf0da9 | 134 | return ret; |
bogdanm | 1:4a23efdf0da9 | 135 | } |
bogdanm | 1:4a23efdf0da9 | 136 | } |
bogdanm | 1:4a23efdf0da9 | 137 | |
bogdanm | 1:4a23efdf0da9 | 138 | if( (m_msgInListsCount[0] + m_msgInListsCount[1] + m_msgInListsCount[2]) == 0) |
bogdanm | 1:4a23efdf0da9 | 139 | { |
bogdanm | 1:4a23efdf0da9 | 140 | DBG("Message list count is 0"); |
bogdanm | 1:4a23efdf0da9 | 141 | return NET_EMPTY; //No message to read |
bogdanm | 1:4a23efdf0da9 | 142 | } |
bogdanm | 1:4a23efdf0da9 | 143 | |
bogdanm | 1:4a23efdf0da9 | 144 | //Determine which index to use : 3 (read), then 1 (urgent), then 2 (regular) |
bogdanm | 1:4a23efdf0da9 | 145 | int index; |
bogdanm | 1:4a23efdf0da9 | 146 | if(m_msgInListsCount[2]) |
bogdanm | 1:4a23efdf0da9 | 147 | { |
bogdanm | 1:4a23efdf0da9 | 148 | index = 3; |
bogdanm | 1:4a23efdf0da9 | 149 | } |
bogdanm | 1:4a23efdf0da9 | 150 | else if(m_msgInListsCount[0]) |
bogdanm | 1:4a23efdf0da9 | 151 | { |
bogdanm | 1:4a23efdf0da9 | 152 | index = 1; |
bogdanm | 1:4a23efdf0da9 | 153 | } |
bogdanm | 1:4a23efdf0da9 | 154 | else //if(m_msgInListsCount[1]) |
bogdanm | 1:4a23efdf0da9 | 155 | { |
bogdanm | 1:4a23efdf0da9 | 156 | index = 2; |
bogdanm | 1:4a23efdf0da9 | 157 | } |
bogdanm | 1:4a23efdf0da9 | 158 | |
bogdanm | 1:4a23efdf0da9 | 159 | //Prepare infos |
bogdanm | 1:4a23efdf0da9 | 160 | m_state = SMS_GET_CMD_SENT; |
bogdanm | 1:4a23efdf0da9 | 161 | m_msisdn = (char*) number; |
bogdanm | 1:4a23efdf0da9 | 162 | m_msg = (char*) message; |
bogdanm | 1:4a23efdf0da9 | 163 | m_maxMsgLength = maxLength; |
bogdanm | 1:4a23efdf0da9 | 164 | m_headersToRead = 3; |
bogdanm | 1:4a23efdf0da9 | 165 | |
bogdanm | 1:4a23efdf0da9 | 166 | m_msisdn[0] = '\0'; |
bogdanm | 1:4a23efdf0da9 | 167 | |
bogdanm | 1:4a23efdf0da9 | 168 | DBG("Get SMS"); |
bogdanm | 1:4a23efdf0da9 | 169 | //Read command |
bogdanm | 1:4a23efdf0da9 | 170 | char cmd[32]; |
bogdanm | 1:4a23efdf0da9 | 171 | std::sprintf(cmd, "AT!GSMS?%d,1", index); //1 is the oldest message |
bogdanm | 1:4a23efdf0da9 | 172 | ret = m_pIf->execute(cmd, this, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 173 | if( ret != OK ) |
bogdanm | 1:4a23efdf0da9 | 174 | { |
bogdanm | 1:4a23efdf0da9 | 175 | WARN("AT!GSMS returned %d", ret); |
bogdanm | 1:4a23efdf0da9 | 176 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 177 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 178 | } |
bogdanm | 1:4a23efdf0da9 | 179 | |
bogdanm | 1:4a23efdf0da9 | 180 | //If message is not read, it will be put at the end of the read list |
bogdanm | 1:4a23efdf0da9 | 181 | int item; |
bogdanm | 1:4a23efdf0da9 | 182 | if( index != 3 ) |
bogdanm | 1:4a23efdf0da9 | 183 | { |
bogdanm | 1:4a23efdf0da9 | 184 | //Decrement count in relevant list |
bogdanm | 1:4a23efdf0da9 | 185 | m_msgInListsCount[index-1]--; |
bogdanm | 1:4a23efdf0da9 | 186 | //Increment count in read list |
bogdanm | 1:4a23efdf0da9 | 187 | m_msgInListsCount[3-1]++; |
bogdanm | 1:4a23efdf0da9 | 188 | item = m_msgInListsCount[3-1]; |
bogdanm | 1:4a23efdf0da9 | 189 | //Normally item should be equal to 1 as we'd have read any older messages first |
bogdanm | 1:4a23efdf0da9 | 190 | if( item != 1 ) |
bogdanm | 1:4a23efdf0da9 | 191 | { |
bogdanm | 1:4a23efdf0da9 | 192 | WARN("Still some older messages pending in the read inbox"); |
bogdanm | 1:4a23efdf0da9 | 193 | } |
bogdanm | 1:4a23efdf0da9 | 194 | } |
bogdanm | 1:4a23efdf0da9 | 195 | else |
bogdanm | 1:4a23efdf0da9 | 196 | { |
bogdanm | 1:4a23efdf0da9 | 197 | //The item is still the oldest one |
bogdanm | 1:4a23efdf0da9 | 198 | item = 1; |
bogdanm | 1:4a23efdf0da9 | 199 | } |
bogdanm | 1:4a23efdf0da9 | 200 | |
bogdanm | 1:4a23efdf0da9 | 201 | DBG("Deleting message"); |
bogdanm | 1:4a23efdf0da9 | 202 | //Delete message from inbox |
bogdanm | 1:4a23efdf0da9 | 203 | std::sprintf(cmd, "AT!DSMS=3"/*,%d", item*/); //FIXME why doesn't that work when specifying the index?? |
bogdanm | 1:4a23efdf0da9 | 204 | ret = m_pIf->executeSimple(cmd, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 205 | if(ret != OK) |
bogdanm | 1:4a23efdf0da9 | 206 | { |
bogdanm | 1:4a23efdf0da9 | 207 | ERR("Could not delete message"); |
bogdanm | 1:4a23efdf0da9 | 208 | } |
bogdanm | 1:4a23efdf0da9 | 209 | else |
bogdanm | 1:4a23efdf0da9 | 210 | { |
bogdanm | 1:4a23efdf0da9 | 211 | //Now we can decrease the number of read messages |
bogdanm | 1:4a23efdf0da9 | 212 | m_msgInListsCount[3-1]--; |
bogdanm | 1:4a23efdf0da9 | 213 | } |
bogdanm | 1:4a23efdf0da9 | 214 | |
bogdanm | 1:4a23efdf0da9 | 215 | if (m_state != SMS_CMD_PROCESSED) |
bogdanm | 1:4a23efdf0da9 | 216 | { |
bogdanm | 1:4a23efdf0da9 | 217 | WARN("Message could not be retrieved properly"); |
bogdanm | 1:4a23efdf0da9 | 218 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 219 | return NET_EMPTY; |
bogdanm | 1:4a23efdf0da9 | 220 | } |
bogdanm | 1:4a23efdf0da9 | 221 | |
bogdanm | 1:4a23efdf0da9 | 222 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 223 | |
bogdanm | 1:4a23efdf0da9 | 224 | return OK; |
bogdanm | 1:4a23efdf0da9 | 225 | } |
bogdanm | 1:4a23efdf0da9 | 226 | |
bogdanm | 1:4a23efdf0da9 | 227 | |
bogdanm | 1:4a23efdf0da9 | 228 | int CDMASMSInterface::getCount(size_t* pCount) |
bogdanm | 1:4a23efdf0da9 | 229 | { |
bogdanm | 1:4a23efdf0da9 | 230 | int ret = updateInbox(); |
bogdanm | 1:4a23efdf0da9 | 231 | if(ret) |
bogdanm | 1:4a23efdf0da9 | 232 | { |
bogdanm | 1:4a23efdf0da9 | 233 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 234 | } |
bogdanm | 1:4a23efdf0da9 | 235 | |
bogdanm | 1:4a23efdf0da9 | 236 | *pCount = m_msgInListsCount[0] + m_msgInListsCount[1] + m_msgInListsCount[2]; //Urgent messages + regular messages + read messages |
bogdanm | 1:4a23efdf0da9 | 237 | |
bogdanm | 1:4a23efdf0da9 | 238 | return OK; |
bogdanm | 1:4a23efdf0da9 | 239 | } |
bogdanm | 1:4a23efdf0da9 | 240 | |
bogdanm | 1:4a23efdf0da9 | 241 | |
bogdanm | 1:4a23efdf0da9 | 242 | /*virtual*/ int CDMASMSInterface::onNewATResponseLine(ATCommandsInterface* pInst, const char* line) |
bogdanm | 1:4a23efdf0da9 | 243 | { |
bogdanm | 1:4a23efdf0da9 | 244 | if(m_state == SMS_SEND_CMD_SENT) |
bogdanm | 1:4a23efdf0da9 | 245 | { |
bogdanm | 1:4a23efdf0da9 | 246 | DBG("SMS Send: %s", line); |
bogdanm | 1:4a23efdf0da9 | 247 | } |
bogdanm | 1:4a23efdf0da9 | 248 | else if(m_state == SMS_GET_TX_STATUS_CMD_SENT) |
bogdanm | 1:4a23efdf0da9 | 249 | { |
bogdanm | 1:4a23efdf0da9 | 250 | if(!strcmp(line, "sent")) |
bogdanm | 1:4a23efdf0da9 | 251 | { |
bogdanm | 1:4a23efdf0da9 | 252 | m_txState = SMS_SENT; |
bogdanm | 1:4a23efdf0da9 | 253 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 254 | } |
bogdanm | 1:4a23efdf0da9 | 255 | else if(!strcmp(line, "failed")) |
bogdanm | 1:4a23efdf0da9 | 256 | { |
bogdanm | 1:4a23efdf0da9 | 257 | m_txState = SMS_FAILED; |
bogdanm | 1:4a23efdf0da9 | 258 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 259 | } |
bogdanm | 1:4a23efdf0da9 | 260 | else if(!strcmp(line, "none")) |
bogdanm | 1:4a23efdf0da9 | 261 | { |
bogdanm | 1:4a23efdf0da9 | 262 | m_txState = SMS_NONE; |
bogdanm | 1:4a23efdf0da9 | 263 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 264 | } |
bogdanm | 1:4a23efdf0da9 | 265 | else if(!strcmp(line, "pending")) |
bogdanm | 1:4a23efdf0da9 | 266 | { |
bogdanm | 1:4a23efdf0da9 | 267 | m_txState = SMS_PENDING; |
bogdanm | 1:4a23efdf0da9 | 268 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 269 | } |
bogdanm | 1:4a23efdf0da9 | 270 | } |
bogdanm | 1:4a23efdf0da9 | 271 | else if(m_state == SMS_GET_CMD_SENT) |
bogdanm | 1:4a23efdf0da9 | 272 | { |
bogdanm | 1:4a23efdf0da9 | 273 | DBG("Header: %s", line); |
bogdanm | 1:4a23efdf0da9 | 274 | |
bogdanm | 1:4a23efdf0da9 | 275 | if(m_msisdn[0]=='\0') |
bogdanm | 1:4a23efdf0da9 | 276 | { |
bogdanm | 1:4a23efdf0da9 | 277 | sscanf(line, "From: %16s", m_msisdn); |
bogdanm | 1:4a23efdf0da9 | 278 | } |
bogdanm | 1:4a23efdf0da9 | 279 | |
bogdanm | 1:4a23efdf0da9 | 280 | m_headersToRead--; |
bogdanm | 1:4a23efdf0da9 | 281 | |
bogdanm | 1:4a23efdf0da9 | 282 | if(m_headersToRead==0) //End of headers |
bogdanm | 1:4a23efdf0da9 | 283 | { |
bogdanm | 1:4a23efdf0da9 | 284 | if(m_msisdn[0]!='\0') //Checks that the incoming number has been retrieved |
bogdanm | 1:4a23efdf0da9 | 285 | { |
bogdanm | 1:4a23efdf0da9 | 286 | m_state = SMS_GET_HDR_RECEIVED; |
bogdanm | 1:4a23efdf0da9 | 287 | } |
bogdanm | 1:4a23efdf0da9 | 288 | else |
bogdanm | 1:4a23efdf0da9 | 289 | { |
bogdanm | 1:4a23efdf0da9 | 290 | m_state = SMS_IDLE; //Error, signal it |
bogdanm | 1:4a23efdf0da9 | 291 | } |
bogdanm | 1:4a23efdf0da9 | 292 | } |
bogdanm | 1:4a23efdf0da9 | 293 | } |
bogdanm | 1:4a23efdf0da9 | 294 | else if(m_state == SMS_GET_HDR_RECEIVED) |
bogdanm | 1:4a23efdf0da9 | 295 | { |
bogdanm | 1:4a23efdf0da9 | 296 | DBG("Message: %s", line); |
bogdanm | 1:4a23efdf0da9 | 297 | size_t cpyLen = MIN( std::strlen(line), m_maxMsgLength - 1 ); |
bogdanm | 1:4a23efdf0da9 | 298 | std::memcpy( m_msg, line, cpyLen ); |
bogdanm | 1:4a23efdf0da9 | 299 | m_msg[cpyLen] = '\0'; |
bogdanm | 1:4a23efdf0da9 | 300 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 301 | } |
bogdanm | 1:4a23efdf0da9 | 302 | else if(m_state == SMS_GET_COUNT_CMD_SENT) |
bogdanm | 1:4a23efdf0da9 | 303 | { |
bogdanm | 1:4a23efdf0da9 | 304 | DBG("Inbox: %s", line); |
bogdanm | 1:4a23efdf0da9 | 305 | int index; |
bogdanm | 1:4a23efdf0da9 | 306 | size_t count; |
bogdanm | 1:4a23efdf0da9 | 307 | if((strlen(line) > 16) && sscanf(line + 16, "{Index = %d}: %d", &index, &count) == 2) |
bogdanm | 1:4a23efdf0da9 | 308 | { |
bogdanm | 1:4a23efdf0da9 | 309 | if((index > 0) && (index <=4)) |
bogdanm | 1:4a23efdf0da9 | 310 | { |
bogdanm | 1:4a23efdf0da9 | 311 | m_msgInListsCount[index-1] = count; |
bogdanm | 1:4a23efdf0da9 | 312 | } |
bogdanm | 1:4a23efdf0da9 | 313 | if(index == 4) |
bogdanm | 1:4a23efdf0da9 | 314 | { |
bogdanm | 1:4a23efdf0da9 | 315 | m_state = SMS_CMD_PROCESSED; |
bogdanm | 1:4a23efdf0da9 | 316 | } |
bogdanm | 1:4a23efdf0da9 | 317 | } |
bogdanm | 1:4a23efdf0da9 | 318 | } |
bogdanm | 1:4a23efdf0da9 | 319 | return OK; |
bogdanm | 1:4a23efdf0da9 | 320 | } |
bogdanm | 1:4a23efdf0da9 | 321 | |
bogdanm | 1:4a23efdf0da9 | 322 | /*virtual*/ int CDMASMSInterface::onNewEntryPrompt(ATCommandsInterface* pInst) |
bogdanm | 1:4a23efdf0da9 | 323 | { |
bogdanm | 1:4a23efdf0da9 | 324 | return OK; |
bogdanm | 1:4a23efdf0da9 | 325 | } |
bogdanm | 1:4a23efdf0da9 | 326 | |
bogdanm | 1:4a23efdf0da9 | 327 | |
bogdanm | 1:4a23efdf0da9 | 328 | int CDMASMSInterface::updateInbox() |
bogdanm | 1:4a23efdf0da9 | 329 | { |
bogdanm | 1:4a23efdf0da9 | 330 | //Get number of unread/read messages |
bogdanm | 1:4a23efdf0da9 | 331 | |
bogdanm | 1:4a23efdf0da9 | 332 | DBG("Updating inbox"); |
bogdanm | 1:4a23efdf0da9 | 333 | m_msgInListsCount[0] = m_msgInListsCount[1] = m_msgInListsCount[2] = m_msgInListsCount[3] = 0; //Reset counts |
bogdanm | 1:4a23efdf0da9 | 334 | |
bogdanm | 1:4a23efdf0da9 | 335 | //Get counts |
bogdanm | 1:4a23efdf0da9 | 336 | m_state = SMS_GET_COUNT_CMD_SENT; |
bogdanm | 1:4a23efdf0da9 | 337 | int ret = m_pIf->execute("AT!CNTSMS", this, NULL, DEFAULT_TIMEOUT); |
bogdanm | 1:4a23efdf0da9 | 338 | if( ret != OK ) |
bogdanm | 1:4a23efdf0da9 | 339 | { |
bogdanm | 1:4a23efdf0da9 | 340 | WARN("AT!CNTSMS returned %d", ret); |
bogdanm | 1:4a23efdf0da9 | 341 | m_msgInListsCount[0] = m_msgInListsCount[1] = m_msgInListsCount[2] = m_msgInListsCount[3] = 0; //Invalidate counts |
bogdanm | 1:4a23efdf0da9 | 342 | m_state = SMS_IDLE; |
bogdanm | 1:4a23efdf0da9 | 343 | return NET_PROTOCOL; |
bogdanm | 1:4a23efdf0da9 | 344 | } |
bogdanm | 1:4a23efdf0da9 | 345 | |
bogdanm | 1:4a23efdf0da9 | 346 | return OK; |
bogdanm | 1:4a23efdf0da9 | 347 | } |
bogdanm | 1:4a23efdf0da9 | 348 |