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

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;
 }
 
-