USB Host Library for Sprint Dongles
Dependencies: Socket USBHostWANDongleSprint lwip-sys lwip
Dependents: SprintUSBModemWebsocketTest SprintUSBModemHTTPClientTest SprintUSBModemNTPClientTest SprintUSBModemSMSTest ... more
Fork of SprintUSBModem_bleedingedge by
Diff: sms/SMSInterface.cpp
- Revision:
- 4:23100b0757d6
- Parent:
- 0:8f57713b2147
- Child:
- 6:56000fe39df9
--- a/sms/SMSInterface.cpp Thu Sep 27 09:00:34 2012 +0000 +++ b/sms/SMSInterface.cpp Wed Oct 10 08:20:51 2012 +0000 @@ -17,7 +17,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#define __DEBUG__ 0 +#define __DEBUG__ 2 #ifndef __MODULE__ #define __MODULE__ "SMSInterface.cpp" #endif @@ -30,14 +30,17 @@ #define DEFAULT_TIMEOUT 10000 -SMSInterface::SMSInterface(ATCommandsInterface* pIf) : m_pIf(pIf), m_msg(NULL), m_maxMsgLength(0), m_msisdn(NULL), /*m_msgCount(0),*/ -m_msgRefListCount(0), m_needsUpdate(true), m_state(SMS_IDLE) +SMSInterface::SMSInterface(ATCommandsInterface* pIf) : m_pIf(pIf), m_msg(NULL), m_maxMsgLength(0), m_msisdn(NULL) { m_pIf->registerEventsHandler(this); //Add us to the unsolicited result codes handlers } int SMSInterface::init() { + m_msgRefListCount = 0; + m_needsUpdate = true; + m_state = SMS_IDLE; + DBG("Set format"); //Set Text mode format int ret = m_pIf->executeSimple("AT+CMGF=1", NULL, DEFAULT_TIMEOUT); @@ -116,7 +119,9 @@ m_inboxMtx.lock(); if(m_msgRefListCount == 0 && m_needsUpdate) { + DBG("Message list count is 0 and needs updating. Running updateInbox."); ret = updateInbox(); + if (ret) { m_inboxMtx.unlock(); @@ -127,6 +132,7 @@ if(m_msgRefListCount == 0) { m_inboxMtx.unlock(); + DBG("Message list count is 0, I think it's empty and returning."); return NET_EMPTY; //No message to read } @@ -151,27 +157,29 @@ if (m_state != SMS_CMD_PROCESSED) { - m_state = SMS_IDLE; - m_inboxMtx.unlock(); - return NET_EMPTY; + WARN("State variable is not 'SMS_CMD_PROCESSED' - returning 'NET_EMPTY'"); } - m_state = SMS_IDLE; - - DBG("Deleting message"); + DBG("Deleting message from index number: %d", m_msgRefList[0] ); //Delete message from outbox std::sprintf(cmd, "AT+CMGD=%d", m_msgRefList[0]); ret = m_pIf->executeSimple(cmd, NULL, DEFAULT_TIMEOUT); if(ret != OK) { - m_inboxMtx.unlock(); - WARN("Could not delete message"); + ERR("Could not delete message"); } - //Remove message from list std::memmove(m_msgRefList, m_msgRefList+1, m_msgRefListCount-1); m_msgRefListCount--; - + + if (m_state != SMS_CMD_PROCESSED) + { + m_state = SMS_IDLE; + m_inboxMtx.unlock(); + return NET_EMPTY; + } + + m_state = SMS_IDLE; m_inboxMtx.unlock(); return OK; @@ -230,7 +238,7 @@ { DBG("Header: %s", line); int msgRef; - if( std::sscanf(line, "+CMGL: %d", &msgRef) == 1 ) + if( std::sscanf(line, "+CMGL: %d,\"REC", &msgRef) == 1 ) //Filter on REC READ and REC UNREAD messages { m_state = SMS_GET_COUNT_HDR_RECEIVED; //Add message to list @@ -334,30 +342,51 @@ if( std::sscanf(evt, "\"SM\",%d", &msgRef) == 1 ) { DBG("Adding message to list (ref %d)", msgRef); - m_inboxMtx.lock(); - //Add message to list - if(m_msgRefListCount < MAX_SM) + if(m_inboxMtx.trylock()) { - m_msgRefList[m_msgRefListCount] = msgRef; + //Add message to list + if(m_msgRefListCount < MAX_SM) + { + m_msgRefList[m_msgRefListCount] = msgRef; + } + else + { + m_needsUpdate = true; + } + m_msgRefListCount++; //Always count message + m_inboxMtx.unlock(); } else { + WARN("Could not get lock"); m_needsUpdate = true; } - m_msgRefListCount++; //Always count message - m_inboxMtx.unlock(); } } int SMSInterface::updateInbox() { //Get memory indexes of unread messages - m_state = SMS_GET_COUNT_CMD_SENT; DBG("Updating inbox"); m_msgRefListCount = 0; //Reset list + m_needsUpdate = false; //Assume we won't need update after this routine (can be set to true by an incoming SM event) - int ret = m_pIf->execute("AT+CMGL=\"REC UNREAD\"", this, NULL, DEFAULT_TIMEOUT); + //First list the "REC READ" messages that were not processed in the previous session + m_state = SMS_GET_COUNT_CMD_SENT; + int ret = m_pIf->execute("AT+CMGL=\"REC READ\"", this, NULL, DEFAULT_TIMEOUT); + if( ret != OK ) + { + WARN("AT+CMGL returned %d", ret); + m_state = SMS_IDLE; + m_msgRefListCount = 0; //List could be invalid + m_needsUpdate = true; + return NET_PROTOCOL; + } + + //Now list the "REC UNREAD" messages that were received by the modem since + m_state = SMS_GET_COUNT_CMD_SENT; + ret = m_pIf->execute("AT+CMGL=\"REC UNREAD\"", this, NULL, DEFAULT_TIMEOUT); if( ret != OK ) { WARN("AT+CMGL returned %d", ret); @@ -373,14 +402,9 @@ { m_needsUpdate = true; } - else - { - m_needsUpdate = false; - } m_state = SMS_IDLE; return OK; } -